概述
MATCH
语句使用一个图模式从图中检索数据,并将数据与变量绑定供后续使用,是图数据库查询的基础语句。
<match statement> ::=
"MATCH" <graph pattern> [ <graph pattern yield clause> ]
<graph pattern yield clause> ::=
"YIELD" <graph pattern yield item> [ { "," <graph pattern yield item> }... ]
详情
MATCH
可与关键词OPTIONAL
连用,详见OPTIONAL MATCH。MATCH
语句支持YIELD
从句,详见MATCH YIELD。
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club ({since uint32}),
EDGE Follows ()-[{createdOn date}]->(),
EDGE Joins ()-[{memberNo uint32}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (rowlock:User {_id: 'U01', name: 'rowlock'}),
(brainy:User {_id: 'U02', name: 'Brainy'}),
(purplechalk:User {_id: 'U03', name: 'purplechalk'}),
(mochaeach:User {_id: 'U04', name: 'mochaeach'}),
(lionbower:User {_id: 'U05', name: 'lionbower'}),
(c01:Club {_id: 'C01', since: 2005}),
(c02:Club {_id: 'C02', since: 2005}),
(rowlock)-[:Follows {createdOn: '2024-01-05'}]->(brainy),
(mochaeach)-[:Follows {createdOn: '2024-02-10'}]->(brainy),
(brainy)-[:Follows {createdOn: '2024-02-01'}]->(purplechalk),
(purplechalk)-[:Follows {createdOn: '2024-05-03'}]->(lionbower),
(brainy)-[:Joins {memberNo: 1}]->(c01),
(lionbower)-[:Joins {memberNo: 2}]->(c01),
(mochaeach)-[:Joins {memberNo: 9}]->(c02)
匹配所有点
使用不含标签或属性过滤的点模式匹配所有点。
MATCH (n)
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U05 | Sys-gen | User | {name: "lionbower"} |
U04 | Sys-gen | User | {name: "mochaeach"} |
U03 | Sys-gen | User | {name: "purplechalk"} |
U02 | Sys-gen | User | {name: "Brainy"} |
U01 | Sys-gen | User | {name: "rowlock"} |
C02 | Sys-gen | Club | {since: 2005} |
C01 | Sys-gen | Club | {since: 2005} |
匹配所有边
使用不含标签或属性过滤的边模式匹配所有边。
MATCH ()-[e]->()
RETURN e
结果:e
_uuid |
_from |
_to |
_from_uuid |
_to_uuid |
schema |
values |
---|---|---|---|---|---|---|
Sys-gen | U01 | U02 | UUID of U01 | UUID of U02 | Follows | {createdOn: "2024-01-05" } |
Sys-gen | U02 | U03 | UUID of U02 | UUID of U03 | Follows | {createdOn: "2024-02-01"} |
Sys-gen | U03 | U05 | UUID of U03 | UUID of U05 | Follows | {createdOn: "2024-05-03"} |
Sys-gen | U04 | U02 | UUID of U04 | UUID of U02 | Follows | {createdOn: "2024-02-10"} |
Sys-gen | U02 | C01 | UUID of U02 | UUID of C01 | Joins | {memberNo: 1} |
Sys-gen | U05 | C01 | UUID of U05 | UUID of C01 | Joins | {memberNo: 2} |
Sys-gen | U04 | C02 | UUID of U04 | UUID of C02 | Joins | {memberNo: 9} |
请留意,如果不指定边方向(出方向>
或入方向<
),图中每条边都会返回两次。因为如果两条路径的元素序列不同,它们就被视为不同的路径,即(n1)-[e]->(n2)
和(n2)<-[e]-(n1)
是不同的路径。
MATCH ()-[e]-()
RETURN e
使用标签匹配
点模式和边模式支持使用标签表达式指定一个或多个标签。
获取所有Club
点:
MATCH (n:Club)
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
C02 | Sys-gen | Club | {since: 2005} |
C01 | Sys-gen | Club | {since: 2005} |
获取所有通过Follows
或Joins
出边与Brainy
相连的点:
MATCH (:User {name: 'Brainy'})-[:Follows|Joins]->(n)
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U03 | Sys-gen | User | {name: "purplechalk"} |
C01 | Sys-gen | Club | {since: 2005} |
使用属性规范匹配
可将属性规范置于点模式和边模式中,使用键值对应用联合相等条件筛选属性。
获取属性_id
和since
等于特定值的Club
点:
MATCH (n:Club {_id: 'C01', since: 2005})
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
C01 | Sys-gen | Club | {since: 2005} |
获取C01
俱乐部里memberNo
等于1的会员信息:
MATCH (:Club {_id: 'C01'})<-[:Joins {memberNo: 1}]-(n)
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U02 | Sys-gen | User | {name: "Brainy"} |
使用简写边匹配
当查询不涉及边标签和属性,后续查询也无需使用边变量时,可使用简写边模式。如有需要,仍可指定边方向。
获取通过出边与mochaeach
相连的点:
MATCH (:User {name: 'mochaeach'})->(n)
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U02 | Sys-gen | User | {name: "Brainy"} |
C02 | Sys-gen | Club | {since: 2005} |
匹配路径
获取mochaeach
关注的用户以及这些用户加入的俱乐部:
MATCH p = (:User {name: 'mochaeach'})-[:Follows]->(:User)-[:Joins]->(:Club)
RETURN p
结果:p

使用WHERE从句匹配
在MATCH
语句中,WHERE
从句可用于元素模式(点、边模式)和带括号路径模式,或紧跟图模式之后使用,用来指定各种查询条件。
元素模式WHERE从句
获取1步路径,其中包含Follows
出边,且其createdOn
属性值大于指定日期:
MATCH p = ()-[e:Follows WHERE e.createdOn > '2024-04-01']->()
RETURN p
结果:p

带括号路径模式WHERE从句
获取1步或2步路径,包含Follows
出边,且其createdOn
属性值小于指定日期:
MATCH p = (()-[e:Follows]->() WHERE e.createdOn < "2024-02-05"){1,2}
RETURN p
结果:p

图模式WHERE从句
获取C01
俱乐部中memberNo
大于1的会员信息:
MATCH (c:Club)<-[e:Joins]->(n)
WHERE c._id = 'C01' AND e.memberNo > 1
RETURN n
结果:n
_id | _uuid | schema | values |
---|---|---|---|
U05 | Sys-gen | User | {name: "lionbower"} |
匹配带量词路径
带量词路径是变长路径,其中路径整体或部分重复多次出现。
获取去重后lionbower
的1到3步邻居:
MATCH (:User {name: 'lionbower'})-[]-{1,3}(n)
RETURN collect_list(DISTINCT n._id) AS IDs
结果:
IDs |
---|
["C01","U01","U02","U03","U04"] |
获取以1或2步子路径开头、同时与点C01
相连的路径,其中开头的子路径包括Follows
边且其createdOn
属性大于指定值:
MATCH p = (()-[e:Follows]->() WHERE e.createdOn > "2024-01-31"){1,2}()-({_id:"C01"})
RETURN p
结果:p

匹配最短路径
两点间的最短路径是它们之间边数量最少的路径。
获取lionbower
和purplechalk
两点间5步内的最短路径:
MATCH p = ALL SHORTEST (n1:User)-[]-{,5}(n2:User)
WHERE n1.name = 'lionbower' AND n2.name = 'purplechalk'
RETURN p
结果:p

匹配相交路径
当MATCH
语句包含两条或以上有共同元素的路径模式时,最终结果是各个路径模式结果集基于共同元素变量进行Equi-Join(等值连接)后的结果。
获取Club
点(y
),保证与其相连的点(x
)同时也与rowlock
和purplechalk
相连:
MATCH ({name: 'rowlock'})-(x)-({name: 'purplechalk'}), (x)-[]-(y:Club)
RETURN y
结果:y
_id | _uuid | schema | values |
---|---|---|---|
C01 | Sys-gen | Club | {since: 2005} |
匹配不相交路径
当MATCH
语句包含两条或以上没有共同元素的路径模式时,最终结果是对各个路径模式结果集执行笛卡尔积后的结果。
获取Club
点,以及在2024-02-01
之后曾关注其他用户的User
点:
MATCH (c:Club), (u:User)-[f:Follows WHERE f.createdOn > '2024-02-01']->()
RETURN c._id, u.name
结果:
c._id | u.name |
---|---|
C02 | mochaeach |
C02 | purplechalk |
C01 | mochaeach |
C01 | purplechalk |
MATCH YIELD
YIELD
从句在MATCH
语句中选择点、边或路径变量,允许后续查询继续使用它们;未被选择的变量将不再可用。MATCH
语句的YIELD
从句不支持使用AS
为变量重命名。忽略YIELD
从句时,默认所有变量继续传递到后续查询。
本查询只返回c
,因为n
没有包含在YIEID
中:
MATCH (n:User)-[:Joins]->(c:Club)
YIELD c
RETURN *
结果:c
_id | _uuid | schema | values |
---|---|---|---|
C01 | Sys-gen | Club | {since: 2005} |
C02 | Sys-gen | Club | {since: 2005} |
C01 | Sys-gen | Club | {since: 2005} |
本查询返回n1
和e
,不包括n2
:
MATCH (n1:Club)
MATCH (n2:Club)<-[e:Joins WHERE e.memberNo < 3]-() YIELD e
RETURN *
n1
_id | _uuid | schema | values |
---|---|---|---|
C01 | Sys-gen | Club | {since: 2005} |
C01 | Sys-gen | Club | {since: 2005} |
C02 | Sys-gen | Club | {since: 2005} |
C02 | Sys-gen | Club | {since: 2005} |
e
_uuid |
_from |
_to |
_from_uuid |
_to_uuid |
schema |
values |
---|---|---|---|---|---|---|
Sys-gen | U02 | C01 | UUID of U02 | UUID of C01 | Joins | {memberNo: 1} |
Sys-gen | U02 | C01 | UUID of U02 | UUID of C01 | Joins | {memberNo: 1} |
Sys-gen | U05 | C01 | UUID of U05 | UUID of C01 | Joins | {memberNo: 2} |
Sys-gen | U05 | C01 | UUID of U05 | UUID of C01 | Joins | {memberNo: 2} |
本查询有语法错误,因为YIELD
从句没有选择n2
,RETURN
语法无法获取它:
MATCH (n1:User), (n2:Club)
YIELD n1
RETURN n1, n2