概述
MATCH
语句通过图模式从图中检索数据,并将数据与变量绑定供后续使用,是图数据库查询的基础语句。
<match statement> ::=
[ "OPTIONAL" ] "MATCH" <graph pattern> [ <graph pattern yield clause> ]
<graph pattern yield clause> ::=
"YIELD" <graph pattern yield item> [ { "," <graph pattern yield item> }... ]
<graph pattern yield item> ::=
<node variable reference> | <edge variable reference> | <path variable reference>
详情
MATCH
语句支持在图模式中使用标签表达式、属性规范以及WHERE从句设定过滤条件。- 可将
MATCH
与关键词OPTIONAL
连用,详见OPTIONAL MATCH。 MATCH
语句支持使用YIELD
从句,详见MATCH YIELD。
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club ({since uint32}),
EDGE Follows ()-[{createdOn datetime}]->(),
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-1-5'}]->(brainy),
(mochaeach)-[:Follows {createdOn: '2024-2-10'}]->(brainy),
(brainy)-[:Follows {createdOn: '2024-2-1'}]->(purplechalk),
(purplechalk)-[:Follows {createdOn: '2024-5-3'}]->(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 00:00:00" } |
Sys-gen | U02 | U03 | UUID of U02 | UUID of U03 | Follows | {createdOn: "2024-02-01 00:00:00"} |
Sys-gen | U03 | U05 | UUID of U03 | UUID of U05 | Follows | {createdOn: "2024-05-03 00:00:00"} |
Sys-gen | U04 | U02 | UUID of U04 | UUID of U02 | Follows | {createdOn: "2024-02-10 00:00:00"} |
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-4-1']->()
RETURN p
结果:p

带括号路径模式WHERE从句
获取1步或2步路径,包含Follows
出边,且其createdOn
属性值小于指定日期:
MATCH p = (()-[e:Follows]->() WHERE e.createdOn < "2024-2-5"){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-1-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-2-1
之后曾关注其他用户的User
点:
MATCH (c:Club), (u:User)-[f:Follows WHERE f.createdOn > '2024-2-1']->()
RETURN c._id, u.name
结果:
c._id | u.name |
---|---|
C02 | mochaeach |
C02 | purplechalk |
C01 | mochaeach |
C01 | purplechalk |
OPTIONAL MATCH
MATCH
与OPTIONAL MATCH
的区别在于如何处理没有匹配结果的情况:
MATCH
:如果没有匹配结果,空返回OPTIONAL MATCH
:如果没有匹配结果,返回null
保留所有子查询记录
在以下两个查询中,变量u
首先在MATCH
语句中绑定与Brainy
相连的三个点(mocaheach
、rowlock
和purplechalk
),第二个MATCH
语句引用变量u
进行多次子查询,每次使用与u
绑定的一个点进行路径模式匹配,没有匹配结果的记录会被移除,除非使用OPTIONAL MATCH
返回null
值。
MATCH (:User {name: "Brainy"})-[]-(u:User)
MATCH (u)-[:Joins]-(c:Club)
RETURN u.name, c._id
结果:
u.name | c._id |
---|---|
mochaeach | C02 |
MATCH (:User {name: "Brainy"})-[:Follows]-(u:User)
OPTIONAL MATCH (u)-[:Joins]-(c:Club)
RETURN u.name, c._id
结果:
u.name | c._id |
---|---|
purplechalk | null |
mochaeach | C02 |
rowlock | null |
保持查询运行
当语句执行结果为空时,由于没有数据流入后续语句,查询会在此终止。
本查询中,第二个MATCH
语句无法找到purplechalk
加入俱乐部的匹配结果,生成空工作表,查询因此终止。后续MATCH
语句由于无法获取数据,未被执行。
MATCH (n:User {name: "purplechalk"})
MATCH (n)-[:Joins]-(c:Club)
MATCH (m:User {name: "lionbower"})
RETURN n.name, c._id, m.name
结果:无数据返回
为避免查询提前终止,可使用OPTIONAL MATCH
生成null
值,传递给下条语句:
MATCH (n:User {name: "purplechalk"})
OPTIONAL MATCH (n)-[:Joins]-(c:Club)
MATCH (m:User {name: "lionbower"})
RETURN n.name, c._id, m.name
结果:
n.name | c._id | m.name |
---|---|---|
purplechalk | null |
lionbower |
检查边是否存在
返回没有关注者的用户:
MATCH (n:User)
OPTIONAL MATCH p = (n)<-[:Follows]-() WHERE p IS NULL
RETURN COLLECT_LIST(n.name) AS Names
结果:
Names |
---|
["mochaeach", "rowlock", "Brainy", "purplechalk", "lionbower"] |
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