概述
路径模式用于匹配图中的路径,由三部分组成:
- 路径模式表达式:指定构成路径的点、边序列;路径模式表达式可以是一个路径项或路径项并集或多集交替。
- 路径变量声明(可选)
- 路径模式前缀(可选)
<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
路径变量声明
在路径模式的开头使用运算符=
声明路径变量。路径变量绑定一组边。
路径变量p
绑定由Follows
出边连接任意两个点的路径:
MATCH p = ()-[:Follows]->()
RETURN p
路径模式前缀
路径模式前缀有两种:
示例图

CREATE GRAPH myGraph
INSERT (c1:default {_id: 'C1'}),
(c2:default {_id: 'C2'}),
(c3:default {_id: 'C3'}),
(c4:default {_id: 'C4'}),
(c1)-[:default]->(c2),
(c2)-[:default]->(c1),
(c2)-[:default]->(c3),
(c3)-[:default]->(c4)
路径约束
路径约束控制路径的遍历方式以及是否可以重复访问点或边。路径约束写在路径模式表达式或带括号路径模式的开头。
路径约束 |
描述 |
---|---|
TRAIL |
默认项,路径可能有重复点,但没有重复边 |
ACYCLIC |
路径没有重复点 |
SIMPLE |
路径没有重复点,除非重复点为路径起点和终点,即形成一个环 |
WALK |
没有限制 |
暂不支持
ACYCLIC
,SIMPLE
和WALK
。
使用不同的路径约束寻找从C1
出发的1~3步出边路径:
MATCH p = WALK ({_id: 'C1'})->{1,3}()
RETURN p
MATCH p = ({_id: 'C1'})->{1,3}()
RETURN p
MATCH p = ACYCLIC ({_id: 'C1'})->{1,3}()
RETURN p
MATCH p = SIMPLE ({_id: 'C1'})->{1,3}()
RETURN p
结果:p

路径选择
路径选择前缀用于从匹配结果的每个分区选择部分路径。当匹配的路径包含多个起点和终点时,系统会根据不同的起、终点对将结果进行概念上的分区。路径选择在每个分区中分别进行,最终的结果是从所有分区选择的路径的并集。
路径选择 | 描述 |
---|---|
ALL |
默认项,选择全部 |
ANY |
从每个分区选择任意一条路径 |
ANY k |
从每个分区选择任意k (非负整数)条路径;若一个分区的路径数量少于k ,则保留全部路径 |
ALL SHORTEST |
详见最短路径 |
ANY SHORTEST |
|
SHORTEST k |
|
SHORTEST k GROUP |
寻找C1
和目标点C3
、C4
间的1~3步路径,分别选择ALL
(默认)和ANY
:
MATCH p = ({_id: 'C1'})-{1,3}(target WHERE target._id IN ['C3', 'C4'])
RETURN p
MATCH p = ANY ({_id: 'C1'})-{1,3}(target WHERE target._id IN ['C3', 'C4'])
RETURN p
结果:p

组合使用
同时使用路径约束和路径选择时,路径选择写在路径约束前面。
(从每个分区)返回任意一条从C1
出发的1~3步出边WALK
路径:
MATCH p = ANY WALK ({_id: 'C1'})->{1,3}()
RETURN p

特殊说明
边模式并置
两个并置的边模式之间隐式存在一个空点模式。例如,
(:User)-[]--[]-(u)
此路径项隐式扩展为:
(:User)-[]-()-[]-(u)
在路径项中,不可将右侧带有减号的标记(
]-
,<-
,-
)与左侧带有减号的标记(-[
,->
,-
)并置,因为这种组合会引入注释符号--
。详情参考注释。
点模式并置
点模式并置仅支持带量词路径。