概述
MATCH语句使用一个图模式从图中检索数据,并将数据与变量绑定供后续使用,是图数据库查询的基础语句。
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club ({since uint32}),
EDGE Follows ()-[{createdOn date}]->(),
EDGE Joins ()-[{memberNo uint32}]->()
}
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
使用标签/Schema匹配
点模式和边模式支持使用标签/Schema表达式指定Schema(类型图中)或标签(开放图中)。
获取所有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.name
结果:n
| n.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(等值连接)的结果。
获取既加入了C02俱乐部又关注Brainy的用户:
MATCH (u)-[:Joins]->(:Club {_id: 'C02'}), (u)-[:Follows]->(:User {name: 'Brainy'})
RETURN u
结果:u
| _id | _uuid | schema | values |
|---|---|---|---|
| U04 | Sys-gen | User | {name: "mochaeach"} |
上面的查询相当于使用两个MATCH:
MATCH (u)-[:Joins]->(:Club {_id: 'C02'})
MATCH (u)-[:Follows]->(:User {name: 'Brainy'})
RETURN u
如果多个路径模式没有共同变量,最后的结果是各结果集的笛卡尔乘积,这通常不是用户希望得到的。例如,
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语句中选择点、边或路径变量,允许后续查询继续使用它们;未被选择的变量将不再可用。忽略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