概述
路径模式用于匹配图中的路径,由三个连续部分组成:
<path pattern> ::=
[ <path variable declaration> ] [ <path pattern prefix> ] <path pattern expression>
路径模式表达式
路径模式表达式是路径模式的核心,用来指定构成路径的点和边的实际序列,该路径(1)以点开始和结束(2)点、边交替出现。路径可由单个点组成。
路径模式表达式可以是单个路径项,路径模式并集,或路径多重集合交替;后面两项组合了多个路径项。
<path pattern expression> ::=
<path term> | <path pattern union> | <path multiset alternation>
路径项
路径项包含单个元素模式、元素模式连接、带括号的路径模式和带量词的路径模式,并遵循路径的拓扑规则。
<path term> ::= <path factor> [ <path factor>... ]
<path factor> ::=
<element pattern> | <parenthesized path pattern> | <quantified path pattern>
1. 元素模式
元素模式可通过递归方式连接以构建路径。
以下路径模式从Brainy
出发,通过标签为Joins
的出边,连接到标签为Club
的点,并使用p
作为路径变量:
p = (:User {name: 'Brainy'})-[:Joins]->(:Club)
通过不断连接点模式和边模式,可以创建更为复杂的路径模式。这条较长的路径模式描述了Brainy
和mochaeach
均加入了一些俱乐部,这些代表俱乐部的点与变量c
绑定:
(:User {name: 'Brainy'})-[:Joins]->(c:Club)<-[:Joins]-(:User {name: 'mochaeach'})
这条路径模式再次使用了变量a
,用来组成起始点相同的环形结构:
(a:Account)-[:Owns]->(:Card)-[:Transfers]->(:Card)-[:Transfers]->(:Card)<-[:Owns]-(a)
当两个点模式前后出现时,它们会绑定到同一个点,并共用所有过滤条件。在本例中,u1
和u2
自动合并为(u1|u2:User {name: "Claire"})
(此处的联合运算符|
仅用于说明):
(u1:User)(u2 {name: "claire"})-[:Follows]-(u3)
点模式的并列目前仅支持带量词的路径模式。
从理论上说,两个连续的边模式间存在一个空的点模式。在本例中,边模式自动扩展为(:User)-[]-()-[]-(u)
:
(:User)-[]--[]-(u)
在路径表达式里,不可将右侧带有减号的标记(
]-
,<-
,-
)与左侧带有减号的标记(-[
,->
,-
)并列放置,因为这种组合会引入注释符号--
。详情请参考注释.
2. 带括号的路径模式
将子路径或完整路径置于一对匹配的括号()
里,即可形成一个带括号的路径模式:
<parenthesized path pattern> ::=
"(" [ <path mode prefix> ]
<path pattern expression>
[ <parenthesized path pattern where clause> ] ")"
带括号的路径模式目前仅可与量词一起使用,形成带量词的路径模式。
3. 带量词的路径模式
量词可以附加在边模式或带括号的路径模式上,形成带量词的路径模式,从而构建长度可变的路径。
路径模式并集&路径多重集合交替
<path pattern union> ::=
<path term> "|" <path term> [ { "|" <path term> }... ]
<path multiset alternation> ::=
<path term> "|+|" <path term> [ { "|+|" <path term> }... ]
路径模式并集使用竖线|
合并路径项,绑定到同一变量的记录会合并,重复项会删除。
MATCH (:Club {code: "C01"})<-[:Joins]-(u:User) | (:Club {code: "C02"})<-[:Joins]-(u:User)
RETURN COLLECT_LIST(u.name) AS names
结果:
names |
---|
["rowlock", "lionbower", "mochaeach"] |
路径多重集合交替使用多重集合交替运算符|+|
合并路径项,绑定到同一变量的记录会合并,重复项会保留。
MATCH (:Club {code: "C01"})<-[:Joins]-(u:User) |+| (:Club {code: "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 prefix> | <path search prefix>
<path mode prefix> ::= "TRAIL" | "SIMPLE" | "ACYCLIC" | "WALK"
<path search prefix> ::= <all path> | <any path> | <shortest path>
<all path> ::= "ALL" [ <path mode> ]
<any path> ::= "ANY" [ <non negative integer> ] [ <path mode> ]
<shortest path> ::=
"ALL SHORTEST" [ <path mode prefix> ]
| "ANY SHORTEST" [ <path mode prefix> ]
| "SHORTEST" <non negative integer> [ <path mode prefix> ]
| "SHORTEST" [ <non negative integer> ] [ <path mode prefix> ] < "GROUP" | "GROUPS" >
路径模式类型前缀
路径模式类型前缀(或限制符)控制路径的遍历方式,以及是否可以重复访问点或边。限制符可放在路径模式表达式的开头,或者带括号的路径模式的开头。
限制符 |
描述 |
---|---|
TRAIL |
默认路径模式类型。包含重复边的路径不会被返回 |
ACYCLIC |
包含重复点的路径不会被返回 |
SIMPLE |
包含重复点的路径不会被返回,除非重复点为起点和终点 |
WALK |
没有限制 |
暂不支持限制符
ACYCLIC
,SIMPLE
和WALK
。
路径搜索前缀
路径搜索前缀(或选择器)从每个分区[1]中选择一个有限的匹配集。选择器只能放在路径模式表达式的开头。
选择器 |
描述 |
---|---|
ALL |
默认搜索设置;没有筛选条件 |
ANY |
从每个分区中选择一条路径;非确定性选择 |
ANY k |
从每个分区中选择k [2]条路径;非确定性选择 |
ALL SHORTEST |
从每个分区中选择所有最短路径 |
SHORTEST k |
从每个分区中选择k 条最短路径;非确定性选择 |
SHORTEST k GROUP |
根据路径长度对路径分组,升序排列结果,再从每个分区中选择前k 个组中的所有路径;确定性选择 |
[1] 使用不同的起始点组合对路径模式匹配到的路径进行概念上的分区。
[2] k
为非负整数。若路径数少于k
,将保留全部路径。若未设定k
,取其默认值1。
了解更多有关最短选择器的信息,请参阅最短路径。使用最短选择器时,路径模式类型将被强制设定为TRAIL
。
暂不支持选择器
ANY
和ANY k
。暂不支持显式使用ALL
。
组合使用
在路径模式中可以使用限制符或选择器,也可以同时使用两者。限制符在模式匹配中生效,而选择器在匹配之后生效。
本条查询返回任意一条以card点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
路径变量仅可在图模型里声明一次。以下查询会引发语法错误:
MATCH p = ()-[:Follows]->(), p = ()-[:Purchases]->()
RETURN p