Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/ Documentation version: v5.3.2 # 边模式 边模式是用于从属性图中匹配边的模式。边模式分为两种类型:完整边模式和简略边模式。完整边模式包含详细的匹配规则,而简略边模式仅包含边的方向。 ## 完整边模式 完整边模式由一个边模式填充器和一个边方向组成。边模式填充器用于匹配图中边的详细信息,包括边的标签和属性,其功能与点模式填充器相同。 下文根据声明时的出场顺序,列出了支持的边模式填充器的组件: 1. 边变量 2. 标签表达式 3. 边类型 4. 边属性 5. SAMPLE 子句 6. 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`的边的边模式。标签表达式可以独立用来声明边模式,适用于仅需要匹配边但不需要引用匹配结果的情况。 更多信息,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)。 Note 在`MATCH`语句中,当边模式使用标签名时,标签可以通过字面标签名或字符串变量来指定。示例请参见 [MATCH 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/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 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/)。 示例: - 用单个边类型匹配边: ```` ''' USE movie MATCH ()-[e@Watch]->() RETURN e LIMIT 3 ''' ```` - 用多个边类型匹配边: ```` ''' USE movie MATCH ()-[e@[Watch,Direct]]->() RETURN e LIMIT 3 ''' ```` #### 边类型查询与标签查询的区别 边模式中,`@边类型名`和`:标签` / `IS LABELED`的通用区别,请参见[图模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/)。 在边模式里,最常见的区别是: - `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](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/sample/)。 ### 使用 WHERE 子句的边模式 ```` '[' 'WHERE' search_condition ']' ```` - `search_condition`:搜索条件。 边模式填充器可以包含`WHERE`子句以声明搜索条件。例如,`[WHERE true]`和`[WHERE false]`分别匹配所有边和不匹配任何边。`[e WHERE e.id = 1]`匹配属性`id`等于`1`的边。 更多信息,请参见 [WHERE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/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 * ````