匹配
MATCH
子句使您能够定义数据库将在其图形结构中搜索的特定模式。MATCH
子句可以指定模式中的节点、关系和属性,从而允许进行遍历图形以检索相关数据的查询。
示例图
以下图形用于下面的示例
要重新创建图形,请对空的 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)
查找节点
MATCH
子句允许您指定不同复杂度的节点模式以从图形中检索。有关查找节点模式的更多信息,请参阅 模式 → 节点模式.
查找所有节点
通过指定包含单个节点且没有标签的模式,将返回图形中的所有节点。
MATCH (n)
RETURN n
n |
---|
|
|
|
|
|
|
|
行:7 |
查找具有特定标签的节点
Movie
标签的所有节点MATCH (movie:Movie)
RETURN movie.title
movie.title |
---|
|
|
行:2 |
使用节点标签表达式匹配
OR
(|
) 标签表达式的节点模式MATCH (n:Movie|Person)
RETURN n.name AS name, n.title AS title
姓名 | 标题 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
行:7 |
!
) 标签表达式的节点模式MATCH (n:!Movie)
RETURN labels(n) AS label, count(n) AS labelCount
标签 | labelCount |
---|---|
|
|
行:1 |
有关 Cypher® 支持的所有标签表达式的列表,请参阅 模式 → 标签表达式.
查找关系
MATCH
子句允许您指定不同复杂度的关系模式以从图形中检索。与节点模式不同,关系模式不能在没有两端节点模式的情况下用于 MATCH
子句中。有关关系模式的更多信息,请参阅 模式 → 关系模式.
关系将仅在单个模式内匹配一次。有关此行为的更多信息,请参阅有关 关系唯一性 的部分。 |
空关系模式
通过应用 --
,将为具有任何方向且没有对关系类型或属性进行任何过滤的关系匹配模式。
MATCH (:Person {name: 'Oliver Stone'})--(n)
RETURN n AS connectedNodes
connectedNodes |
---|
|
行:1 |
有向关系模式
模式中关系的方向由箭头指示:-->
或 <--
。
Oliver Stone
的所有节点。MATCH (:Person {name: 'Oliver Stone'})-->(movie:Movie)
RETURN movie.title AS movieTitle
movieTitle |
---|
|
行:1 |
关系变量
可以为模式引入变量,用于过滤关系属性或返回关系。
MATCH (:Person {name: 'Oliver Stone'})-[r]->()
RETURN type(r) AS relType
上面的查询使用 type() 函数. |
relType |
---|
|
行:1 |
在无向关系上匹配
当模式包含一个绑定关系,并且该关系模式没有指定方向时,Cypher 将在两个方向上匹配该关系。
MATCH (a)-[:ACTED_IN {role: 'Bud Fox'}]-(b)
RETURN a, b
a | b |
---|---|
|
|
|
|
行:2 |
在关系类型上过滤
可以通过在关系类型之前使用冒号 (:
) 来指定关系模式中的关系类型。
ACTED_IN
关系类型上过滤的关系模式MATCH (:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor:Person)
RETURN actor.name AS actor
演员 |
---|
|
|
|
行:3 |
使用关系类型表达式匹配
可以使用 OR
符号 |
来匹配包含多种关系类型之一的模式。
ACTED_IN
或 DIRECTED
关系类型的关系模式MATCH (:Movie {title: 'Wall Street'})<-[:ACTED_IN|DIRECTED]-(person:Person)
RETURN person.name AS person
人 |
---|
|
|
|
|
行:4 |
由于关系只能分别具有一个类型,因此 ()-[:A&B]→()
永远不会匹配关系。
有关 Cypher 支持的所有关系类型表达式的列表,请参阅 模式 → 标签表达式.
带有 WHERE 谓词的 MATCH
MATCH
子句通常与 WHERE
子句配对,WHERE
子句添加谓词以细化模式,使其更具体。这些谓词是模式本身的一部分,而不仅仅是在匹配后应用的过滤器。因此,始终将 WHERE
子句与其相应的 MATCH
子句放在一起。
WHERE
谓词MATCH (charlie:Person)-[:ACTED_IN]->(movie:Movie)
WHERE charlie.name = 'Charlie Sheen'
RETURN movie.title AS movieTitle
movieTitle |
---|
|
行:1 |
WHERE
谓词MATCH (martin:Person)-[:ACTED_IN]->(movie:Movie)
WHERE martin.name = 'Martin Sheen' AND NOT EXISTS {
MATCH (movie)<-[:DIRECTED]-(director:Person {name: 'Oliver Stone'})
}
RETURN movie.title AS movieTitle
以上查询使用了 EXISTS 子查询。 |
movieTitle |
---|
|
行:1 |
有关更多信息,请参阅 WHERE
页面。
带有参数的 MATCH
MATCH
子句可以与参数一起使用。
{
"movieTitle": "Wall Street",
"actorRole": "Fox"
}
MATCH (:Movie {title: $movieTitle})<-[r:ACTED_IN]-(p:Person)
WHERE r.role CONTAINS $actorRole
RETURN p.name AS actor, r.role AS role
以上查询使用了 CONTAINS 运算符。 |
演员 | role |
---|---|
|
|
|
|
行:2 |
有关如何设置参数的更多信息,请参阅 语法 → 参数。
查找路径
MATCH
子句还可以用于将整个路径绑定到变量。
MATCH path = ()-[:ACTED_IN]->(movie:Movie)
RETURN path
path |
---|
|
|
|
|
|
行数: 5 |
WHERE
谓词的模式的路径MATCH path = (:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(:Person)
WHERE movie.title = 'Wall Street'
RETURN path
path |
---|
|
|
|
行:3 |
多个 MATCH 子句、WITH 子句和子句组合
在 Cypher 中,查询的行为由其子句定义。每个子句都采用当前图状态和中间结果表,对其进行处理,并将更新的图状态和结果传递给下一个子句。第一个子句从图的初始状态和空表开始,而最后一个子句生成查询结果。
MATCH
子句MATCH (:Person {name: 'Martin Sheen'})-[:ACTED_IN]->(movie:Movie) (1)
MATCH (director:Person)-[:DIRECTED]->(movie) (2)
RETURN director.name AS director, movie.title AS movieTitle
1 | 第一个 MATCH 子句的结果是变量 movie ,它保存 Martin Sheen ACTED_IN 的所有 Movies 。 |
2 | 第二个 MATCH 子句使用 movie 变量查找与 Martin Sheen ACTED_IN 的 Movie 节点有 DIRECTED 关系的任何 Person 节点。 |
director | movieTitle |
---|---|
|
|
|
|
行:2 |
一个变量可以通过在另一个操作中被引用而隐式地传递到下一个子句。一个变量也可以使用 WITH
子句显式地传递到下一个子句。如果一个变量既没有隐式地也没有显式地传递到下一个子句,它将被丢弃,并且在查询中的后续部分不可用。
WITH
和多个 MATCH
子句MATCH (actors:Person)-[:ACTED_IN]->(movies:Movie) (1)
WITH actors, count(movies) AS movieCount (2)
ORDER BY movieCount DESC
LIMIT 1 (3)
MATCH (actors)-[:ACTED_IN]->(movies) (4)
RETURN actors.name AS actor, movieCount, collect(movies.title) AS movies
1 | 此步骤中匹配的 Person 和 Movie 节点存储在变量中,这些变量随后被传递到查询的第二行。 |
2 | movies 变量通过它在 count() 函数中的出现被隐式导入。WITH 子句显式导入 actors 变量。 |
3 | ORDER BY 子句按降序对结果进行排序,确保电影数量最多的 Person 出现在顶部,而 LIMIT 1 确保所有其他 Person 节点都被丢弃。 |
4 | 第二个 MATCH 子句查找与当前绑定到 actors 变量的 Person 节点关联的所有 Movie 节点。 |
以上查询使用了 collect() 函数。 |
演员 | movieCount | movies |
---|---|---|
|
|
|
行:1 |
有关 Cypher 查询工作方式的更多信息,请参阅 子句组合。