边模式¶
边模式是用于从属性图中匹配边的模式。边模式分为两种类型:完整边模式和简略边模式。完整边模式包含详细的匹配规则,而简略边模式仅包含边的方向。
完整边模式¶
完整边模式由一个边模式填充器和一个边方向组成。边模式填充器用于匹配图中边的详细信息,包括边的标签和属性,其功能与点模式填充器相同。
下文根据声明时的出场顺序,列出了支持的边模式填充器的组件:
- 边变量
- 标签表达式
- 边类型
- 边属性
- SAMPLE 子句
- WHERE 子句
声明包含多个组件的边模式填充器时,须满足以下条件:
- 至多使用四个不同类型的组件,其中:
- 一个可以是边变量。
- 一个可以是标签表达式或边类型。
- 一个可以是边属性或 WHERE 子句。
- 一个可以是 SAMPLE 子句。
- 多个组件的顺序必须遵循上文规定的顺序。
以下为声明边模式填充器的语法概览:
- edge_pattern_filler_with_edge_variable
- edge_pattern_filler_with_label_expression
- edge_pattern_filler_with_edge_type_specification
- edge_pattern_filler_with_edge_property_specification
- edge_pattern_filler_with_SAMPLE_clause
- edge_pattern_filler_with_WHERE_clause
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 *