概述
图模式用于匹配图中的路径模式列表,由三个连续部分组成:
- 匹配模式(可选)
- 路径模式列表
- 图模式的WHERE从句(可选)
<graph pattern> ::=
[ <match mode> ] <path pattern list> [ <graph pattern where clause> ]
<path pattern list> ::= <path pattern> [ { "," <path pattern> }... ]
路径模式列表包含单个或多个路径模式,允许构建单个路径模式无法表达的复杂路径模式。
每条路径模式会在图中进行独立匹配,生成路径集合。若这些集合存在共同变量,则在共同变量上进行等值连接;若无,则通过笛卡尔积进行组合。
示例图集
以下示例根据该图集运行:
在空图集中运行以下语句创建示例图集:
INSERT (brainy:User {_id: "U01", name: "Brainy"}),
(rowlock:User {_id: "U02", name: "rowlock"}),
(purplechalk:User {_id: "U03", name: "purplechalk"}),
(quickfox:User {_id: "U04", name: "QuickFox"}),
(quasar92:User {_id: "U05", name: "Quasar92"}),
(mochaeach:User {_id: "U06", name: "mochaeach"}),
(london:City {_id: "C01", name: "London"}),
(newyork:City {_id: "C02", name: "New York"}),
(rowlock)-[:Follows]->(brainy),
(purplechalk)-[:Follows]->(brainy),
(quickfox)-[:Follows]->(brainy),
(rowlock)-[:Follows]->(mochaeach),
(purplechalk)-[:Follows]->(mochaeach),
(quickfox)-[:Follows]->(mochaeach),
(quasar92)-[:Follows]->(mochaeach),
(quickfox)-[:LivesIn]->(london),
(rowlock)-[:LivesIn]->(newyork),
(purplechalk)-[:LivesIn]->(newyork)
连通路径
本例获取同时关注Brany
和mochaeach
且住在New York
的用户:
MATCH (:User {name: 'Brainy'})<-[:Follows]-(u:User)-[:Follows]->(:User {name: 'mochaeach'}),
(u)-[:LivesIn]->(:City {name: 'New York'})
RETURN u.name
两条路径模式拥有共同变量u
,所以使用了等值连接:
结果:
u.name |
---|
rowlock |
purplechalk |
不连通路径
本例图模式获取关注Brainy
的用户和住在New York
的用户:
MATCH (u1:User)-[:Follows]->(:User {name: 'Brainy'}),
(u2:User)-[:LivesIn]->(:City {name: 'New York'})
RETURN u1.name, u2.name
两条路径模式没有共同变量,所以使用笛卡尔积进行组合。
结果:
u1.name | u2.name |
---|---|
rowlock | rowlock |
rowlock | purplechalk |
purplechalk | rowlock |
purplechalk | purplechalk |
QuickFox | rowlock |
QuickFox | purplechalk |
匹配模式
图模式可以为图模式中的所有路径模式选择性指定匹配模式。
匹配模式有两种:
DIFFERENT EDGES
:每个匹配结果里,所有路径中不允许出现重复边,匹配的点无限制。若未指定匹配模式,默认使用该模式。REPEATABLE ELEMENTS
:对匹配的边或点均不作限制。
<match mode> ::=
<repeatable elements match mode> | <different edges match mode>
<repeatable elements match mode> ::= "REPEATABLE ELEMENTS"
<different edges match mode> ::= "DIFFERENT EDGES"
本条查询获取与U01
相连的点,这些点同时与另一个点相连:
MATCH DIFFERENT EDGES (:User {name: "QuickFox"})-[e1]-(n), (n)-[e2]-(m)
RETURN DISTINCT n
记录中,与不同变量绑定且唯一的边得到保留。因此,结果仅返回点U03
和C01
。
如果匹配模式是DIFFERENT EDGES
,并且边变量在图模式中多次声明,则无结果返回。请参考以下两则例子:
MATCH DIFFERENT EDGES ()-[e]->(), ()-[e]->()
RETURN e
MATCH DIFFERENT EDGES ()-[e]->()-[e]->()
RETURN e