Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/path-patterns/ Documentation version: v5.3.2 # 路径模式 路径模式用于从图中匹配路径。一个路径模式由以下部分组成: ```` path_variable_declaration? ( path_mode_prefix | path_search_prefix )? path_pattern_expression ```` - 一个可选的路径变量声明(`path_variable_declaration`)。路径变量是用于匹配路径的常规变量。 - 一个可选的路径模式前缀。路径模式前缀可以是路径类型前缀(`path_mode_prefix`)或用于指示路径匹配是要查找所有符合条件的路径、任意符合条件的路径还是最短路径的路径搜索前缀(`path_search_prefix`)。 - 一个路径模式表达式(`path_pattern_expression`)。 ## 路径类型前缀 路径类型前缀由路径类型和一个可选的后缀(`PATH`或`PATHS`)组成。下表介绍了不同的路径类型: | 路径类型 | 描述义 | `WALK` | 默认模式,匹配任何类型的路径,无论是否有重复的边或点。 | `TRAIL` | 匹配不包含重复边的路径。 | `ACYCLIC` | 匹配不包含重复点的路径。 | `SIMPLE` | 匹配除起始点外,不包含重复点的路径。 ## 路径搜索前缀 路径搜索前缀用于指定要返回的路径数量,一个路径搜索前缀由以下部分组成:关键字之一(`ALL`、`ANY`、`ALL SHORTEST`、`ANY SHORTEST`、或`SHORTEST`),一个可选的指定返回路径的数量(`number_of_paths`)和一个可选的路径类型(`path_mode`)。下表介绍不同的路径搜索前缀: | 路径搜索前缀 | 描述 | `ALL` `path_mode?` | 返回满足可选路径模式要求的所有路径。 | `ANY` `number_of_paths?` `path_mode?` | 返回指定数量的满足可选路径模式要求的最多路径。当不指定数量时,默认数量为 1。 | `ALL SHORTEST` `path_mode?` | 返回满足可选路径模式要求的所有最短路径。 | `ANY SHORTEST` `path_mode?` | 根据可选的路径模式的要求,匹配所有的起点和终点,并对每对起点和终点,返回一条最短路径。 | `SHORTEST` `number_of_paths?` `path_mode?` | 根据可选的路径模式的要求,匹配所有的起点和终点,并对每对起点和终点,返回指定数量的最短路径。当不指定数量时,默认数量为 1。 ## 路径模式表达式 路径模式表达式用于指定从图中匹配路径的模式。 ### 定长路径模式表达式 在当前实现中,定长路径模式表达式为以下形式之一: - 至少一个[点模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/)。例如,`(v)`。 - 以点模式开始和结束。例如,`(v1)->(v2)`。 - 点模式和[边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/)交替出现。例如,`()-[e1]->()-[e2]->(v1)<-[]-(v2)`。 ### 变长路径模式表达式 通过在边模式或者在带括号的路径模式后面添加图模式量词作为后缀,可以指定该模式在路径中允许出现的次数,从而形成变长路径模式表达式。变长路径模式表达式为以下形式之一: - 以点模式开始和结束,并且包含一个量化边模式,即跟着图模式量词的边模式。例如:`(v1)-[e]->{1,3}(v2)`,其中`-[e]->{1,3}`为量化边模式。 - 以点模式开始和结束,并且包含一个量化路径模式,即跟着图模式量词的带括号的路径模式。例如,在`(a) ((n)-[e1]->()-[e2]->(m)){1,3} (b)`中: - `((n)-[e1]->()-[e2]->(m)){1,3}`为量化路径模式。 - `n`代表至少包含路径起始点`a`的点列表。 - `m`代表至少包含路径目标点`b`的点列表。 Note 量化路径模式中必需包含至少一个边模式。当量化路径模式只有一个边模式时,可以将其简写为量化边模式。例如,`(()-[e]->()){1,3}`可以简写为`-[e]->{1,3}`。 带括号的路径模式用于将路径模式分组,以便在路径模式中使用图模式量词。`(()-[e]->()){1,3}`表示括号内的路径模式`()-[e]->()`至少出现`1`次,最多出现`3`次。 图模式量词用于指定路径模式中的重复次数。以下表格介绍了不同图模式量词的含义: | 图模式量词 | 含义 | `*` | 0 次或多次 | `+` | 1 次或多次 | `{ fixed_number }` | 固定次数,取值必须大于 0。 | `{ lower_bound, upper_bound }` | 指定一个范围来限制路径模式的重复次数。上下界都是可选的。如果未指定,则默认下界为`0`,上界为正无穷。 ### 表达式 以下表格展示了一些路径模式表达式示例及其含义: | 示例 | 含义 | `(v)` | 包含单个点模式的路径 | `(v1)-[e]->(v2)` | 包含两个点模式并由一个边模式连接的路径模式 | `()-[e]->()` | 类似于上面的路径模式,但只有一个边变量 | `()-[e1]->()-[e2]->(v1)<-[]-(v2)` | 包含`4`个点模式和`3`个连接点模式的边模式的路径模式 | `(v1)<-[e]->*(v2)` | 在`v1`和`v2`之间有`0`或多条边的路径 | `(v1)<-[e]->+(v2)` | 在`v1`和`v2`之间有`1`或多条边的路径 | `(v1)<-[e]->{1,10}(v2)` | 在`v1`和`v2`之间有`[1, 10]`范围内条边的路径 | `(v1) (()-[e1]->()-[e2]->()){1,3} (v2)` | 在`v1`和`v2`之间有`2`、`4`、或`6`条边的路径,其中`()-[e1]->()-[e2]->()`至少出现`1`次,最多出现`3`次 ## 示例 以下示例查找满足两个点模式和一个边模式的路径模式的`1`条最短路径。所需的路径模式是`WALK`,这意味着相同的点和边可以多次出现。 ```` MATCH p=SHORTEST 1 WALK PATH (person1:Person{id:1})<-[e:FOLLOWS]->*(person2:Person{id:3}) \ RETURN collect(e) AS l GROUP BY () ```` 在这个示例中: - `p=`为路径变量声明,用于引用匹配的路径。 - `MATCH SHORTEST 1 WALK PATH`指定了查询的路径搜索前缀,表示查找一条最短路径,并且路径类型为`WALK`。 - `(person1:Person{id:1})<-[e:FOLLOWS]->*(person2:Person{id:3})`指定了路径模式,表示从`person1`到`person2`之间通过`FOLLOWS`关系的路径,其中`*`表示`FOLLOWS`关系可以出现 0 次或多次。 更多信息,请参见 [MATCH 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/)。