概述
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> ::= <element variable> | <path variable>
详情
- 可以将
MATCH
与关键词OPTIONAL
连用。MATCH
与OPTIONAL MATCH
的主要区别在于对不匹配模式的处理:MATCH
:如果模式不匹配,无记录返回。OPTIONAL MATCH
:如果模式不匹配,返回null
。
MATCH
语句支持在图模式中使用WHERE从句设定搜索条件。MATCH
语句支持图模式YIELD从句以选择变量用于后续查询。
示例图集
以下示例根据该图集运行:
在空图集中运行以下语句创建示例图集:
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 | 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 | 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 | 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 | 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 | 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} |
Sys-gen | U04 | C02 | UUID of U04 | UUID of C02 | Joins | {memberNo: 9} |
Sys-gen | U04 | C02 | UUID of U04 | UUID of C02 | Joins | {memberNo: 9} |
上述查询并未指定边方向,因此,图中的每条边都返回了两次。当路径的元素序列不同时,我们认为这两条路径是不同的。
若想返回图中所有去重边,可以使用出边符号(>
)或入边符号(<
)指定边的方向。
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} |
通过标签匹配
点模式和边模式均支持使用标签表达式指定点或边的一个或多个标签。
本条查询获取所有标签为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} |
通过键值属性规范匹配
可将元素属性规范置于点模式和边模式中,使用联合等式筛选具有特定键值对的点和边。
本条查询获取标签为Club
且code
和since
具有特定属性值的点:
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 {code: '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
所关注用户的name
,以及这些用户加入的俱乐部的code
:
MATCH p = (:User {name: 'mochaeach'})-[:Follows]->(:User)-[:Joins]->(:Club)
RETURN p
结果:
p |
---|
(:User {_id: "U04", name: "mochaeach"})-[:Follows {createdOn: "2024-2-10"}]->(:User {_id: "U02", name: "Brainy"})-[:Joins {memberNo: 1}]->(:Club {_id: "C01", since: 2005}) |
通过WHERE从句匹配
WHERE
从句可以选择性地用于元素模式、带括号的路径表达式,或紧跟MATCH
语句的图模式之后,用来指定各种查询条件。
元素模式中的WHERE从句
本条查询获取1步路径,该路径包含标签为Follows
的出边,且边的createdOn
属性值大于指定日期:
MATCH p = ()-[e:Follows WHERE e.createdOn > '2024-4-1']->()
RETURN p
结果:
p |
---|
(:User {_id: "U03", name: "purplechalk"})-[:Follows {createdOn: "2024-5-3"}]->(:User {_id: "U05", name: "lionbower"}) |
带括号的路径模式中的WHERE从句
本条查询获取1步或2步路径,该路径包含标签为Follows
的边,且边的createdOn
属性值小于指定日期:
MATCH p = (()-[e:Follows]->() WHERE e.createdOn < "2024-2-5"){1,2}
RETURN p
结果:
p |
---|
(:User {_id: "U01", name: "rowlock"})-[:Follows {createdOn: "2024-1-5"}]->(:User {_id: "U02", name: "Brainy"}) |
(:User {_id: "U01", name: "rowlock"})-[:Follows {createdOn: "2024-1-5"}]->(:User {_id: "U02", name: "Brainy"})-[:Follows {createdOn: "2024-2-1"}]->(:User {_id: "U03", name: "purplechalk"}) |
(:User {_id: "U02", name: "Brainy"})-[:Follows {createdOn: "2024-2-1"}]->(:User {_id: "U03", name: "purplechalk"}) |
图模式中的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 DISTINCT n._id AS IDs
结果:
IDs |
---|
U03 |
U02 |
U01 |
U04 |
C01 |
使用带量词的路径
本条查询获取的目标路径以1或2步子路径开头,其中包括标签为Follows
的边且createdOn
属性值大于指定值,此外,这些子路径必须与点C01
相连:
MATCH p = (()-[e:Follows]->() WHERE e.createdOn > "2024-1-31"){1,2}()-({_id:"C01"})
RETURN p
结果:
p |
---|
(:User {_id: "U02", name: "Brainy"})-[:Follows {createdOn: "2024-02-01"}]->(:User {_id: "U03", name: "purplechalk"})-[:Follows {createdOn: "2024-05-03"}]->(:User {_id: "U05", name: "lionbower"})-[:Joins {memberNo: 2}]->(:Club {_id: "C01",since: 2005}) |
(:User {_id: "U03", name: "purplechalk"})-[:Follows {createdOn: "2024-05-03"}]->(:User {_id: "U05", name: "lionbower"})-[:Joins {memberNo: 2}]->(:Club {_id: "C01",since: 2005}) |
(:User {_id: "U04", name: "mochaeach"})-[:Follows {createdOn: "2024-02-10"}]->(:User {_id: "U02", name: "Brainy"})-[:Joins {memberNo: 1}]->(:Club {_id: "C01",since: 2005}) |
匹配最短路径
两点间的最短路径是两点间边数最少的路径。
本条查询获取lionbower
和purplechalk
两点间5步以内的最短路径:
MATCH p = ALL SHORTEST (n1:User)-[]-{,5}(n2:User)
WHERE n1.name = 'lionbower' AND n2.name = 'purplechalk'
RETURN p
结果:
p |
---|
(:User {_id: "U05", name: "lionbower"})-[:Follows {createdOn: "2024-5-3"}]->(:User {_id: "U03", name: "purplechalk"}) |
匹配多条连通路径
当MATCH
语句包含与共同变量相连的两条及以上路径模式时,则对不同路径模式结果集的共同变量使用等值连接,生成最终结果。
本条查询获取标签为Club
的点,其中,与该点相连的点同时与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
保留所有子查询的记录
在以下的两条查询中,变量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"] |
图模式YIELD从句
可以通过图模式YIELD
从句选择在后续查询中使用哪些变量。
MATCH (n:User)-[:Joins]->(c:Club)
YIELD c
RETURN *
结果:n
_id | _uuid | schema | values |
---|---|---|---|
C01 | Sys-gen | Club | {since: 2005} |
C02 | Sys-gen | Club | {since: 2005} |
C01 | Sys-gen | Club | {since: 2005} |