概述
图模式用于匹配图中的路径模式列表,由三部分依次组成:
- 匹配模式(可选)
- 路径模式列表
WHERE
从句(可选)
<graph pattern> ::=
[ <match mode> ] <path pattern list> [ <where clause> ]
<path pattern list> ::=
<path pattern> [ { "," <path pattern> }... ]
路径模式列表包含一个或多个路径模式。每个路径模式在图中进行独立匹配,获得一个结果集。最终结果是各结果集基于共同元素变量(如果有)进行Equi-Join(等值连接)或笛卡尔积后的结果。
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE City ({name string}),
EDGE Follows ()-[{}]->(),
EDGE LivesIn ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
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 ({name: 'Brainy'})<-[:Follows]-(u:User)-[:Follows]->({name: 'mochaeach'}),
(u)-[:LivesIn]->({name: 'New York'})
RETURN u.name
两个路径模式拥有共同变量u
,所以进行Equi-join(等值连接):

结果:
u.name |
---|
rowlock |
purplechalk |
不相交路径
获取关注Brainy
的用户和住在New York
的用户:
MATCH (u1:User)-[:Follows]->({name: 'Brainy'}),
(u2:User)-[:LivesIn]->({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 |
没有限制 |
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE City ({name string}),
EDGE Follows ()-[{}]->(),
EDGE LivesIn ()-[{}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (quickfox:User {_id: "U01", name: "QuickFox"}),
(brainy:User {_id: "U02", name: "Brainy"}),
(rowlock:User {_id: "U03", name: "rowlock"}),
(london:City {_id: "C01", name: "London"}),
(newyork:City {_id: "C02", name: "New York"}),
(quickfox)-[:Follows]->(brainy),
(quickfox)-[:Follows]->(rowlock),
(rowlock)-[:LivesIn]->(newyork),
(quickfox)-[:LivesIn]->(london),
(rowlock)-[:LivesIn]->(london)
DIFFERENT EDGES
本查询获取与QuickFox
相连的点,这些点同时与其他点相连:
MATCH DIFFERENT EDGES ({name: "QuickFox"})-[e1]-(n), (n)-[e2]-(m)
RETURN collect_list(n._id)
结果:
n._id |
---|
["U03","U03","C01"] |

REPEATABLE ELEMENTS
比较下面使用REPEATABLE ELEMENTS
匹配模式查询的结果:
MATCH REPEATABLE ELEMENTS ({name: "QuickFox"})-[e1]-(n), (n)-[e2]-(m)
RETURN collect_list(n._id)
结果:
n._id |
---|
["U02","U03","U03","U03","C01","C01"] |
使用DIFFERENT EDGES时确保边的唯一绑定
使用DIFFERENT EDGES
时,只有确保一条边不与多个变量绑定的记录能够保留。因此,如果在图模式中重复使用一个边变量,不会有结果返回。参考以下例子:
MATCH DIFFERENT EDGES ()-[e]->(), ()-[e]->()
RETURN e
MATCH DIFFERENT EDGES ()-[e]->()-[e]->()
RETURN e