跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

边模式

边模式是用于从属性图中匹配边的模式。边模式分为两种类型:完整边模式和简略边模式。完整边模式包含详细的匹配规则,而简略边模式仅包含边的方向。

完整边模式

完整边模式由一个边模式填充器和一个边方向组成。边模式填充器用于匹配图中边的详细信息,包括边的标签和属性,其功能与点模式填充器相同。

下文根据声明时的出场顺序,列出了支持的边模式填充器的组件:

  1. 边变量
  2. 标签表达式
  3. 边类型
  4. 边属性
  5. SAMPLE 子句
  6. WHERE 子句

声明包含多个组件的边模式填充器时,须满足以下条件:

  • 至多使用四个不同类型的组件,其中:
    • 一个可以是边变量。
    • 一个可以是标签表达式或边类型。
    • 一个可以是边属性或 WHERE 子句。
    • 一个可以是 SAMPLE 子句。
  • 多个组件的顺序必须遵循上文规定的顺序。

以下为声明边模式填充器的语法概览:

edge_pattern_filler_with_edge_variable
edge_variable
edge_pattern_filler_with_label_expression
: IS label_expression
edge_pattern_filler_with_edge_type_specification
@ edge_type_name [ edge_type_name , ]
edge_pattern_filler_with_edge_property_specification
{ property_name : value_expression , }
edge_pattern_filler_with_SAMPLE_clause
SAMPLE RIGHT sampling_method sample_size
edge_pattern_filler_with_WHERE_clause
WHERE search_condition

edge_pattern_filler_with_edge_variable ::=
    edge_variable 

edge_pattern_filler_with_label_expression ::= 
    ( ':' | 'IS' ) label_expression

edge_pattern_filler_with_edge_type_specification ::=
    '@' ( edge_type_name | '[' edge_type_name ( ',' edge_type_name ) * ']' )

edge_pattern_filler_with_edge_property_specification ::=
    '{' ( property_name ':' value_expression ) ( ',' ( property_name ':' value_expression ) ) * '}'

edge_pattern_filler_with_SAMPLE_clause ::=
    'SAMPLE' 'RIGHT'? sampling_method? sample_size     

edge_pattern_filler_with_WHERE_clause ::=
    'WHERE' search_condition      

声明边方向有 7 种变体:

方向 声明方式
指向左 <-[ 边模式填充器 ]-
无方向 ~[ 边模式填充器 ]~
指向右 -[ 边模式填充器 ]->
指向左或无方向 <~[ 边模式填充器 ]~
指向右或无方向 ~[ 边模式填充器 ]~>
指向左或右 <-[ 边模式填充器 ]->
任意方向 -[ 边模式填充器 ]-

Note

方括号([ ])是边方向声明的一部分,用于包围边模式填充器。为了清晰起见,以下语法示例中保留了方括号。

使用边变量的边模式

'[' edge_variable ']'
  • edge_variable:边变量。

边模式填充器可以通过声明一个边变量来定义,这个边变量是一个常规标识符,用于在查询中引用匹配到的边。例如,[e]中的e是一个边变量,这个边模式填充器将匹配图中的任何边,并在查询的其他部分可以通过e引用这些匹配到的边。

使用标签表达式的边模式

'[' ( ':' | 'IS' ) label_expression ']'
  • label_expression:标签表达式。

标签表达式可以用来声明匹配特定标签或无标签的边。标签表达式可以用冒号 (:) 或关键字IS作为前缀。例如,[:Follow]是一个匹配标签为Follow的边的边模式。标签表达式可以独立用来声明边模式,适用于仅需要匹配边但不需要引用匹配结果的情况。

更多信息,请参见标签表达式。

Note

在MATCH语句中,当边模式使用标签名时,标签可以通过字面标签名或字符串变量来指定。示例请参见 MATCH 语句。

示例:

  • 匹配带有单个标签的边:
    '''
    USE movie
    MATCH ()-[e:Act]->() RETURN e LIMIT 3
    '''
    
  • 使用“或者”运算符(|)匹配标签为Act或Direct的边:
    '''
    USE movie
    MATCH ()-[e:Act|Direct]->() RETURN e LIMIT 3
    '''
    
  • 使用取反运算符(!)排除标签为Act的边:
    '''
    USE movie
    MATCH ()-[e:!Act]->() RETURN e LIMIT 3
    '''
    

指定边类型的边模式

'[' '@' ( edge_type_name | '[' edge_type_name ( ',' edge_type_name ) * ']' ) ']'
  • edge_type_name:边类型名称。

边模式填充器可以通过指定边类型来声明。以@符号为前缀指定边类型的名称。例如,[@Watch]是一个匹配边类型为Watch的边的边模式填充器。您也可以指定多个边类型。例如,[@[Watch, Act]]是一个匹配边类型为Watch或Act的边的边模式填充器。

Note

在MATCH语句中,当边模式指定边类型时,边类型也可以通过字符串变量来提供。示例请参见 MATCH 语句。

示例:

  • 用单个边类型匹配边:
    '''
    USE movie
    MATCH ()-[e@Watch]->() RETURN e LIMIT 3
    '''
    
  • 用多个边类型匹配边:
    '''
    USE movie
    MATCH ()-[e@[Watch,Direct]]->() RETURN e LIMIT 3
    '''
    

边类型查询与标签查询的区别

边模式中,@边类型名和:标签 / IS LABELED的通用区别,请参见图模式。

在边模式里,最常见的区别是:

  • MATCH ()-[e@Watch]->()只匹配某一个明确的边类型。
  • MATCH ()-[e:Watch]->()可以跨多个边类型匹配共享同一标签的边。

如果标签写在边模式中,使用的是边模式语法,例如[e:Watch]或[e IS Watch];如果标签写在WHERE子句中,使用的是标签谓词语法,例如WHERE e IS LABELED Watch,也可以简写为WHERE e:Watch。

如果图模型中边类型和标签名称恰好相同,这两种写法的结果可能相同;但如果多个边类型复用了同一个标签,两者的返回范围就会不同。

指定边属性的边模式

'[' '{' ( property_name ':' value_expression ) ( ',' ( property_name ':' value_expression ) ) * '}' ']'
  • property_name:属性名称。
  • value_expression:值表达式。

边模式填充器可以通过指定属性声明。每个属性由一个属性名和一个值表达式组成,两者间用冒号 (:) 分隔。多个属性之间用逗号(,)分隔,并用花括号({})包围形成列表。例如,[{id:1,name:"Bob"}]声明了一个边模式填充器,用于匹配属性id等于1且属性name等于Bob的边。而[e{id:1}]等同于[e WHERE e.id = 1]。

使用 SAMPLE 子句的边模式

'[' 'SAMPLE' 'RIGHT'? sampling_method? sample_size ']'
  • sampling_method:采样方法。
  • sample_size:采样大小。

边模式填充器可以包含SAMPLE子句以对边进行采样。例如,[SAMPLE RIGHT 2]表示基于每个采样上下文采样前 2 条边。

更多信息,请参见 SAMPLE。

使用 WHERE 子句的边模式

'[' 'WHERE' search_condition ']'
  • search_condition:搜索条件。

边模式填充器可以包含WHERE子句以声明搜索条件。例如,[WHERE true]和[WHERE false]分别匹配所有边和不匹配任何边。[e WHERE e.id = 1]匹配属性id等于1的边。

更多信息,请参见 WHERE。

示例

以下示例展示了如何在 GQL 查询的路径模式中声明具有不同边方向的边模式:

MATCH 
    (v1)<-[e]-(v2),  # v1 和 v2 通过指向 v1 的边 e 连接
    (v1)~[e]~(v2),   # v1 和 v2 通过无向边 e 连接
    (v1)-[e]->(v2),  # v1 和 v2 通过指向 v2 的边 e 连接
    (v1)<~[e]~(v2),  # v1 和 v2 通过指向 v1 或无向的边 e 连接
    (v1)~[e]~>(v2),  # v1 和 v2 通过指向 v2 或无向的边 e 连接
    (v1)<-[e]->(v2), # v1 和 v2 通过指向 v1 或 v2 的边 e 连接
    (v1)-[e]-(v2)    # v1 和 v2 通过任意方向的边 e 连接
RETURN *

以下示例展示了如何声明具有不同边模式填充器的边模式:

MATCH
    (v1)<-[e:Watch]-(v2),                  # v1 和 v2 通过标签为 Watch 的边 e 连接
    (v1)<-[e IS Watch]-(v2),               # v1 和 v2 通过标签为 Watch 的边 e 连接
    (v1)<-[e:Watch{rate:3}]-(v2),          # v1 和 v2 通过标签为 Watch 且属性 rate 的值为 3 的边 e 连接
    (v1)<-[e:Watch WHERE e.rate = 3]-(v2), # v1 和 v2 通过标签为 Watch 且属性 rate 的值为 3 的边 e 连接(使用 WHERE 子句)
    (v1)<-[e@Watch]-(v2),                  # v1 和 v2 通过边类型为 Watch 的边 e 连接
    (v1)<-[e:Watch SAMPLE RIGHT 2]-(v2)   # v1 和 v2 通过标签为 Watch 的边 e 连接,并采样前 2 条边
RETURN e

简略边模式

简略边模式声明边的方向,但不包含任何边模式填充器。

符号 含义
<- 指向左边的边
~ 无向边
-> 指向右边的边
<~ 指向左边或无向的边
~> 指向右边或无向的边
<-> 指向左边或右边的边
- 任意方向的边

示例

以下示例展示了如何在 GQL 查询的路径模式中使用简略边模式:

MATCH 
    (v1)<-(v2),     -- v1 和 v2 通过指向 v1 的边连接
    (v1)~(v2),      -- v1 和 v2 通过无向边连接
    (v1)->(v2),     -- v1 和 v2 通过指向 v2 的边连接
    (v1)<~(v2),     -- v1 和 v2 通过指向 v1 或无向的边连接
    (v1)~>(v2),     -- v1 和 v2 通过指向 v2 或无向的边连接
    (v1)<->(v2),    -- v1 和 v2 通过指向 v1 或 v2 的边连接
    (v1)-(v2)       -- v1 和 v2 通过任意方向的边连接
RETURN *