概述
路径模式用于匹配图中的路径,由三部分依次组成:
<path pattern> ::=
[ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression>
<path pattern expression> ::=
<path term> | <path term union> | <path term multiset alteration>
路径项
一个路径项由单个或多个元素模式、带括号路径模式和带量词路径模式连接组成,并遵循路径的拓扑规则,即以点开始、以点结束,点、边交替出现。
<path term> ::=
<path factor> [ <path factor>... ]
<path factor> ::=
<element pattern> | <parenthesized path pattern> | <quantified path pattern>
元素模式
一个路径项可通过点模板和边模板交替连接构建。例如,以下路径项从Brainy
出发,通过Joins
出边,连接到Club
点:

(:User {name: 'Brainy'})-[:Joins]->(:Club)
通过继续连接点模式和边模式,可创建更为复杂的路径模式。以下路径项描述Brainy
和mochaeach
加入同一俱乐部,这些Club
点与变量c
绑定:

(:User {name: 'Brainy'})-[:Joins]->(c:Club)<-[:Joins]-(:User {name: 'mochaeach'})
以下路径项通过重复利用变量a
,构建起始点相同的环形结构:

(a:Account)-[:Owns]->(:Card)-[:Transfers]->(:Card)-[:Transfers]->(:Card)<-[:Owns]-(a)
带括号路径模式
将子路径或完整路径置于一对括号()
里即形成一个带括号路径模式:
<parenthesized path pattern> ::=
"(" [ <path mode prefix> ] <path pattern expression> [ <where clause> ] ")"
带括号路径模式目前仅可与量词一起使用,构成带量词路径模式。
带量词路径模式
量词附加在边模式或带括号路径模式上即形成带量词路径模式,可匹配变长路径。
路径项并集和多集交替
路径项并集和多集交替功能尚未完全支持。
<path pattern union> ::=
<path term> "|" <path term> [ { "|" <path term> }... ]
<path multiset alternation> ::=
<path term> "|+|" <path term> [ { "|+|" <path term> }... ]
示意图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club (),
EDGE Joins ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (rowlock:User {_id: 'U01', name: 'rowlock'}),
(lionbower:User {_id: 'U02', name: 'lionbower'}),
(mochaeach:User {_id: 'U03', name: 'mochaeach'}),
(c01:Club {_id: 'C01'}),
(c02:Club {_id: 'C02'}),
(rowlock)-[:Joins]->(c01),
(lionbower)-[:Joins]->(c01),
(lionbower)-[:Joins]->(c02),
(mochaeach)-[:Joins]->(c02)
路径模式并集使用竖线|
合并路径项,绑定到同一变量的记录会合并,重复项会被舍弃。
MATCH ({_id: "C01"})<-[:Joins]-(u:User) | ({_id: "C02"})<-[:Joins]-(u:User)
RETURN COLLECT_LIST(u.name) AS names
结果:
names |
---|
["rowlock", "lionbower", "mochaeach"] |
路径多集交替使用多集交替运算符|+|
合并路径项,绑定到同一变量的记录会合并,重复项会保留。
MATCH ({_id: "C01"})<-[:Joins]-(u:User) |+| ({_id: "C02"})<-[:Joins]-(u:User)
RETURN COLLECT_LIST(u.name) AS names
结果:
names |
---|
["rowlock", "lionbower", "lionbower", "mochaeach"] |
请留意,路径模式并集和路径多集交替中的路径项只能引用在该路径项中声明的元素变量。例如,以下查询存在语法错误:
MATCH (:Club {code: "C01"})<-[]-(a) |
(:Club {code: "C02"})<-[]-(b WHERE a.name = b.name)
RETURN a, b
路径模式前缀
路径模式前缀有两种:
<path pattern prefix> ::=
<path mode> | <path search>
<path mode> ::=
"TRAIL" | "SIMPLE" | "ACYCLIC" | "WALK"
<path search> ::=
"ALL" [ <path mode> ]
| "ANY" [ <non negative integer> ] [ <path mode> ]
| "ALL SHORTEST" [ <path mode> ]
| "ANY SHORTEST" [ <path mode> ]
| "SHORTEST" <non negative integer> [ <path mode> ]
| "SHORTEST" [ <non negative integer> ] [ <path mode> ] < "GROUP" | "GROUPS" >
示例图

CREATE GRAPH myGraph {
NODE Card (),
EDGE Transfers ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (c01:Card {_id: 'C01'}),
(c02:Card {_id: 'C02'}),
(c03:Card {_id: 'C03'}),
(c04:Card {_id: 'C04'}),
(c01)-[:Transfers]->(c02),
(c01)-[:Transfers]->(c04),
(c02)-[:Transfers]->(c03),
(c03)-[:Transfers]->(c02),
(c03)-[:Transfers]->(c04)
路径约束
路径约束前缀控制路径的遍历方式以及是否可以重复访问点或边。路径约束可放在路径模式表达式或带括号路径模式的开头。
路径约束 |
描述 |
---|---|
TRAIL |
默认项,有重复边的路径不会被返回 |
ACYCLIC |
有重复点的路径不会被返回 |
SIMPLE |
有重复点的路径不会被返回,除非重复点为起点和终点 |
WALK |
没有限制 |
暂不支持
ACYCLIC
,SIMPLE
和WALK
。
以下两条查询寻找C01
到C02
的1~3步路径,其中所有边为出边,分别使用TRAIL
(默认)和ACYCLIC
路径约束:
MATCH p = ({_id: 'C01'})->{1,3}({_id: 'C02'})
RETURN p
MATCH p = ACYCLIC ({_id: 'C01'})-[:Transfers]->{1,3}({_id: 'C02'})
RETURN p
结果:p

路径选择
路径选择前缀从每个分区[1]选择一个有限的结果子集。路径选择前缀只能放在路径模式表达式开头。
路径选择 |
描述 |
---|---|
ALL |
默认项,不做选择 |
ANY |
从每个分区选择一条路径;非确定性选择 |
ANY k |
从每个分区选择k [2]条路径;非确定性选择 |
ALL SHORTEST |
从每个分区选择所有最短路径 |
ANY SHORTEST |
从每个分区选择一条最短路径;非确定性选择 |
SHORTEST k |
从每个分区选择k 条最短路径;非确定性选择 |
SHORTEST k GROUP |
根据路径长度对路径进行分组并按长度升序排列,再从每个分区选择前k 组的所有路径;确定性选择 |
[1]分区:理论上根据不同的起、终点点对,对路径模式匹配的结果进行分区。
[2]k
:为非负整数。若路径数量少于k
,则保留全部路径。
关于选择最短路径,详见最短路径。
以下两条查询寻找C01
和C03
间的两步路径,分别选择ALL
(默认)和ANY
:
MATCH p = ({_id: 'C01'})-()-({_id: 'C03'})
RETURN p
MATCH p = ANY ({_id: 'C01'})-()-({_id: 'C03'})
RETURN p
结果:p

组合使用
路径模式支持单独或同时使用路径约束和路径选择。
本查询返回任意一条以C01
为起点且没有环路的路径,经过1~3条出向Transfers
边到达任意Card
点:
MATCH p = ANY ACYCLIC (c:Card {_id: 'C01'})-[:Transfers]->{1,3}(:Card)
RETURN p

该路径项本身可匹配5条路径。首先,包含重复点C02
的路径被路径约束ACYCLIC
舍弃;随后,路径选择ANY
从每个分区随机选择一条路径;最终返回三条路径。
路径变量
在路径模式表达式开头使用运算符=
声明路径变量。路径变量绑定一组边。
路径变量p
绑定由Follows
出边连接任意两个点的路径:
MATCH p = ()-[:Follows]->()
RETURN p
特殊说明
点模式并置
当两个点模式并置时,它们绑定到同一个点,并合并过滤条件。
本例中,u1
和u2
隐式合并为(u1|u2:User {name: "Claire"})
(此处的运算符|
仅用于说明):
(u1:User)(u2 {name: "claire"})-[:Follows]-(u3)
点模式并置仅支持带量词路径模式。
边模式并置
理论上两个并置的边模式间存在一个空点模式。例如,
(:User)-[]--[]-(u)
此路径项隐式扩展为:
(:User)-[]-()-[]-(u)
在路径项中,不可将右侧带有减号的标记(
]-
,<-
,-
)与左侧带有减号的标记(-[
,->
,-
)并置,因为这种组合会引入注释符号--
。详情参考注释。