介绍
该MATCH
子句允许您指定 Neo4j 将在数据库中搜索的模式。这是将数据放入当前绑定集的主要方式。有关如何MATCH
使用 查找模式(包括量化路径模式、量化关系和最短路径)的更多信息,请参阅模式部分。
MATCH
WHERE
通常与向模式添加限制或谓词的部分相结合MATCH
,使其更加具体。谓词是模式描述的一部分,不应被视为仅在匹配完成后应用的过滤器。 这意味着应始终将其与它所属的子句WHERE
放在一起。MATCH
MATCH
可以出现在查询的开头或之后,可能在之后WITH
。如果它是第一个子句,则尚未绑定任何内容,Neo4j 将设计搜索以查找与子句和任何WHERE
部分中指定的任何相关谓词匹配的结果。这可能涉及数据库扫描、具有特定标签的节点搜索或索引搜索以查找模式匹配的起点。此搜索找到的节点和关系可用作绑定模式元素,可用于路径的模式匹配。它们还可以用于任何后续MATCH
子句中,其中 Neo4j 将使用已知元素,并从那里查找进一步的未知元素。
Cypher®是声明式的,因此查询本身通常不指定用于执行搜索的算法。Neo4j 将自动找出查找起始节点和匹配模式的最佳方法。WHERE
部分中的谓词可以在模式匹配之前、模式匹配期间或找到匹配项之后进行评估。但是,在某些情况下,您可以影响查询编译器做出的决定。在创建、显示和删除索引中了解有关索引的更多信息,在Planner 提示和 USING 关键字中了解有关指定提示以强制 Neo4j 以特定方式解决查询的更多信息。
示例图
下图用于以下示例:
要重新创建图表,请针对空的 Neo4j 数据库运行以下查询:
CREATE
(charlie:Person {name: 'Charlie Sheen'}),
(martin:Person {name: 'Martin Sheen'}),
(michael:Person {name: 'Michael Douglas'}),
(oliver:Person {name: 'Oliver Stone'}),
(rob:Person {name: 'Rob Reiner'}),
(wallStreet:Movie {title: 'Wall Street'}),
(charlie)-[:ACTED_IN {role: 'Bud Fox'}]->(wallStreet),
(martin)-[:ACTED_IN {role: 'Carl Fox'}]->(wallStreet),
(michael)-[:ACTED_IN {role: 'Gordon Gekko'}]->(wallStreet),
(oliver)-[:DIRECTED]->(wallStreet),
(thePresident:Movie {title: 'The American President'}),
(martin)-[:ACTED_IN {role: 'A.J. MacInerney'}]->(thePresident),
(michael)-[:ACTED_IN {role: 'President Andrew Shepherd'}]->(thePresident),
(rob)-[:DIRECTED]->(thePresident),
(martin)-[:FATHER_OF]->(charlie)
基本节点查找
获取所有节点
通过指定具有单个节点且没有标签的模式,将返回图中的所有节点。
MATCH (n)
RETURN n
返回数据库中的所有节点。
n |
---|
|
|
|
|
|
|
|
|
获取所有带标签的节点
查找具有特定标签的所有节点:
MATCH (movie:Movie)
RETURN movie.title
Movie
返回数据库中具有标签的所有节点。
电影标题 |
---|
|
|
|
相关节点
该符号--
表示相关,无论关系的类型或方向。
MATCH (director {name: 'Oliver Stone'})--(movie)
RETURN movie.title
返回 执导的所有电影Oliver Stone
。
电影标题 |
---|
|
|
与标签匹配
要使用节点上的标签约束模式,请将标签添加到模式中的节点。
MATCH (:Person {name: 'Oliver Stone'})--(movie:Movie)
RETURN movie.title
返回任何与Movie
相连的标签的节点Oliver Stone
。
电影标题 |
---|
|
|
与节点标签的标签表达式匹配
与节点标签的表达式匹配OR
将返回包含两个指定标签的节点。
MATCH (n:Movie|Person)
RETURN n.name AS name, n.title AS title
姓名 | 标题 |
---|---|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
关系基础
外向关系
当对关系的方向感兴趣时,可以使用-→
或来显示←-
。例如:
MATCH (:Person {name: 'Oliver Stone'})-->(movie)
RETURN movie.title
返回通过传出关系连接到属性设置为 的Person
节点的任何节点。name
Oliver Stone
电影标题 |
---|
|
|
关系变量
可以将变量引入模式,用于过滤关系属性或返回关系。例如:
MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)
返回 中的每个传出关系的类型Oliver Stone
。
类型(r) |
---|
|
|
匹配无向关系
当模式包含绑定关系,并且该关系模式未指定方向时,Cypher 将尝试在两个方向上匹配该关系。
MATCH (a)-[:ACTED_IN {role: 'Bud Fox'}]-(b)
RETURN a, b
A | b |
---|---|
| |
|
|
|
|
按关系类型匹配
当知道要匹配的关系类型时,可以:
在关系类型前使用冒号 ( ) 来指定它。
MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.name
ACTED_IN
返回电影的所有演员Wall Street
。
演员姓名 |
---|
|
|
|
|
阅读有关关系类型表达式的更多信息。
匹配多种关系类型
可以使用管道符号 ( |
) 匹配多种关系类型。例如:
MATCH (wallstreet {title: 'Wall Street'})<-[:ACTED_IN|DIRECTED]-(person)
RETURN person.name
返回与电影具有ACTED_IN
或关系的节点。DIRECTED
Wall Street
人名 |
---|
|
|
|
|
|
匹配关系类型并使用变量
变量和特定关系类型可以包含在同一模式中。例如:
MATCH (wallstreet {title: 'Wall Street'})<-[r:ACTED_IN]-(actor)
RETURN r.role
返回ACTED_IN
电影中的角色Wall Street
。
角色 |
---|
|
|
|
|
深层次关系
具有不常见特征的关系类型
数据库偶尔会包含包含非字母数字字符或空格的关系类型。这些是使用反引号 ( `
) 创建的。
例如,以下查询创建一个在和OLD FRIENDS
之间包含空格 ( )的关系。Martin Sheen
Rob Reiner
MATCH
(martin:Person {name: 'Martin Sheen'}),
(rob:Person {name: 'Rob Reiner'})
CREATE (rob)-[:`OLD FRIENDS`]->(martin)
由此得出以下图表:
MATCH (n {name: 'Rob Reiner'})-[r:`OLD FRIENDS`]->()
RETURN type(r)
类型(r) |
---|
|
|
多重关系
关系可以用 形式的多个语句来表达()--()
,也可以将它们串在一起。例如:
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name
返回主演的电影Charlie Sheen
及其导演。
电影标题 | 导演姓名 |
---|---|
| |
|
|