neo4j match(匹配查询)

介绍

MATCH子句允许您指定 Neo4j 将在数据库中搜索的模式。这是将数据放入当前绑定集的主要方式。有关如何MATCH使用 查找模式(包括量化路径模式量化关系最短路径)的更多信息,请参阅模式部分。

MATCHWHERE通常与向模式添加限制或谓词的部分相结合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

返回数据库中的所有节点。

表 1. 结果
n

Rows: 7

(:Person {"name":"Charlie Sheen"})

(:Person {"name":"Martin Sheen"})

(:Person {"name":"Michael Douglas"})

(:Person {"name":"Oliver Stone"})

(:Person {"name":"Rob Reiner"})

(:Movie {"title":"Wall Street"})

(:Movie {"title":"The American President"})

获取所有带标签的节点

查找具有特定标签的所有节点:

询问
MATCH (movie:Movie)
RETURN movie.title

Movie返回数据库中具有标签的所有节点。

表 2. 结果
电影标题

Rows: 2

"Wall Street"

"The American President"

该符号--表示相关,无论关系的类型或方向

询问
MATCH (director {name: 'Oliver Stone'})--(movie)
RETURN movie.title

返回 执导的所有电影Oliver Stone

表 3. 结果
电影标题

Rows: 1

"Wall Street"

与标签匹配

要使用节点上的标签约束模式,请将标签添加到模式中的节点。

询问
MATCH (:Person {name: 'Oliver Stone'})--(movie:Movie)
RETURN movie.title

返回任何与Movie相连的标签的节点Oliver Stone

表 4. 结果
电影标题

Rows: 1

"Wall Street"

与节点标签的标签表达式匹配

与节点标签的表达式匹配OR将返回包含两个指定标签的节点。

询问
MATCH (n:Movie|Person)
RETURN n.name AS name, n.title AS title
表 5. 结果
姓名标题

Rows: 7

"Charlie Sheen"

<null>

"Martin Sheen"

<null>

"Michael Douglas"

<null>

"Oliver Stone"

<null>

"Rob Reiner"

<null>

<null>

"Wall Street"

<null>

"The American President"

关系基础

外向关系

当对关系的方向感兴趣时,可以使用-→或来显示←-。例如:

询问
MATCH (:Person {name: 'Oliver Stone'})-->(movie)
RETURN movie.title

返回通过传出关系连接到属性设置为 的Person节点的任何节点。nameOliver Stone

表 6. 结果
电影标题

Rows: 1

"Wall Street"

关系变量

可以将变量引入模式,用于过滤关系属性或返回关系。例如:

询问
MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)
RETURN type(r)

返回 中的每个传出关系的类型Oliver Stone

表 7. 结果
类型(r)

Rows: 1

"DIRECTED"

匹配无向关系

当模式包含绑定关系,并且该关系模式未指定方向时,Cypher 将尝试在两个方向上匹配该关系。

询问
MATCH (a)-[:ACTED_IN {role: 'Bud Fox'}]-(b)
RETURN a, b
表 8. 结果
Ab

Rows: 2

(:Movie {"title":"Wall Street"})

(:Person {"name":"Charlie Sheen"})

(:Person {"name":"Charlie Sheen"})

(:Movie {"title":"Wall Street"})

按关系类型匹配

当知道要匹配的关系类型时,可以:在关系类型前使用冒号 ( ) 来指定它。

询问
MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)
RETURN actor.name

ACTED_IN返回电影的所有演员Wall Street

表 9. 结果
演员姓名

Rows: 3

"Michael Douglas"

"Martin Sheen"

"Charlie Sheen"

阅读有关关系类型表达式的更多信息。

匹配多种关系类型

可以使用管道符号 ( |) 匹配多种关系类型。例如:

询问
MATCH (wallstreet {title: 'Wall Street'})<-[:ACTED_IN|DIRECTED]-(person)
RETURN person.name

返回与电影具有ACTED_IN或关系的节点。DIRECTEDWall Street

表 10. 结果
人名

Rows: 4

"Oliver Stone"

"Michael Douglas"

"Martin Sheen"

"Charlie Sheen"

匹配关系类型并使用变量

变量和特定关系类型可以包含在同一模式中。例如:

询问
MATCH (wallstreet {title: 'Wall Street'})<-[r:ACTED_IN]-(actor)
RETURN r.role

返回ACTED_IN电影中的角色Wall Street

表 11.结果
角色

Rows: 3

"Gordon Gekko"

"Carl Fox"

"Bud Fox"

深层次关系

具有不常见特征的关系类型

数据库偶尔会包含包含非字母数字字符或空格的关系类型。这些是使用反引号 ( `) 创建的。

例如,以下查询创建一个在和OLD FRIENDS之间包含空格 ( )的关系。Martin SheenRob 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)
表 12.结果
类型(r)

Rows: 1

"OLD FRIENDS"

多重关系

关系可以用 形式的多个语句来表达()--(),也可以将它们串在一起。例如:

询问
MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)
RETURN movie.title, director.name

返回主演的电影Charlie Sheen及其导演。

表 13.结果
电影标题导演姓名

Rows: 1

"Wall Street"

"Oliver Stone"

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京橙溪科技有限公司enwing.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值