首页 > 编程笔记 > MySQL笔记 阅读:1

Cypher MATCH语句的用法(非常详细)

MATCH 语句的作用是查询数据。MATCH 语句可以完成节点查询、关系查询、路径查询、根据ID获得节点或关系等操作,经常与 CREATE、RETURN 或 UPDATA 等配合使用。

下面以电影和演员为例,创建一些节点和关系,并进行相关操作。初始化图如下图所示:


图 1 电影和演员初始图

在图 1 中,最上面的 5 个节点是演员节点 Person,最下面的 2 个节点为电影节点 Movie。Person 节点有 name 属性,Movie 节点有 title 属性。Person 节点和 Movie 节点之间有 DIRECTED(执导)和 ACTED_IN(饰演)两种关系。

要创建图 1 所示内容,需要先创建 Person 和 Movie 这两种节点,代码如下:
CREATE (‘Wall Street‘: Movie{title:'Wall Street'})
CREATE (‘The American President‘: Movie{title:'The American President'})
CREATE (Oliver:Person{name:'Oliver Stone'})
CREATE (‘Michael Douglas‘:Person{name:'Michael Douglas'})
CREATE (‘Charlie Sheen‘:Person{name:'Charlie Sheen'})
CREATE (‘Martin Sheen‘:Person{name:'Martin Sheen'})
CREATE (‘Rob Reiner‘:Person{name:'Rob Reiner'})

使用 MATCH 语句查询所有节点,并创建关系,代码如下:
MATCH (a:Movie { title: 'Wall Street' }),(Oliver:Person{name:'Oliver Stone'}), (‘Michael Douglas‘:Person{name:'Michael Douglas'}),(‘Charlie Sheen‘:Person{name:'Charlie Sheen'}),(‘Martin Sheen‘:Person{name:'Martin Sheen'}),(‘Rob Reiner‘:Person{name:'Rob Reiner'}),(b:Movie { title: 'The American President' })
# 匹配查询对应的电影和人物节点
CREATE (Oliver)-[r:DIRECTED] -> (a) # 创建Oliver和电影之间的关系
CREATE (‘Michael Douglas‘) - [:ACTED_IN{role:'Gordon Gekko'}] -> (a)
CREATE (‘Charlie Sheen‘) - [:ACTED_IN{role:'Bud Fox'}] -> (a) # 创建关系
CREATE (‘Martin Sheen‘) - [:ACTED_IN{role:'Carl Fox'}] -> (a)
CREATE (‘Michael Douglas‘) - [:ACTED_IN{role:'President Andrew Shepherd'}] -> (b)
# 查询Michael Douglas演过的角色
CREATE (‘Martin Sheen‘) - [:ACTED_IN{role:'A.J.MacInerney'}] -> (b)
CREATE (‘Rob Reiner‘) - [:DIRECTED] -> (b) # 查询Rob Reiner执导的电影

MATCH节点查询

MATCH语句在查询过程中可以按照标签、属性对节点进行查询。当没有指定节点的标签或属性时,MATCH 语句默认选择节点的全部标签和属性。

1) 查询所有节点

查询所有节点的代码如下:
MATCH (n)
RETURN n
返回值为:
│"n"                                │
│{"title":"Wall Street"}            │
│{"title":"The American President"} │
│{"name":"Oliver Stone"}            │
│{"name":"Michael Douglas"}         │
│{"name":"Charlie Sheen"}           │
│{"name":"Martin Sheen"}            │
│{"name":"Rob Reiner"}              │

2) 查询带有标签的节点

通过单个节点模式获取带有标签的所有节点。在模式中指定标签表示只查询带有特定标签的节。哪怕节点有多个标签,只要含有指定的标签,就可成功被匹配。

查询并返回节点标签为 Movie 的所有节点的 title 属性,代码如下:
MATCH (movie:Movie)
RETURN movie.title
返回值为:
│"movie.title"            │
│"Wall Street"            │
│"The American President" │

3) 查询存在关系的节点

设置 Person 节点的 name 属性为 'Oliver Stone',匹配与 director 节点存在任意关系的 movie 标签,并返回 Movie 节点的 title 属性。

上述语句并未指定关系,即表示任意关系;没有指定节点类型,即表示任意节点,唯一的匹配条件是第一个节点的 name 属性值为'Oliver Stone'。代码如下:
MATCH (director { name: 'Oliver Stone' })--(movie)
RETURN movie.title
返回值为:
│"movie.title" │
│"Wall Street" │

4) 查询存在关系的特定节点

指定一个节点的标签和属性,查询与该节点有关系且标签为 movie 节点,返回相关节点的 title 属性值。
MATCH (:Person { name: 'Oliver Stone' })--(movie: Movie)
RETURN movie.title
返回值为:
│"movie.title" │
│"Wall Street" │

MATCH关系查询

1) 指定关系的方向

关系的方向可以通过 --> 和 <-- 指定。

查询一个标签为 Person、name 属性为 'Oliver Stone' 的起始节点,该起始节点与结束节点 Movie 有关系,返回 Movie 节点的 title 值,代码如下:
MATCH (:Person { name: 'Oliver Stone' })-->(movie)
RETURN movie.title
返回值为:
│"movie.title" │
│"Wall Street" │

2) 查询关系的类型

在查询关系时,如果需要筛选关系的属性或返回关系,就需要指定关系变量,后续子句可以引用该变量。

起始节点为 Person,name 属性为 'Oliver Stone',匹配与 Person 节点有关系且标签为 movie 的节点,并返回关系类型。

关系的类型可通过 type() 函数查看,代码如下:
MATCH (:Person { name: 'Oliver Stone' }) - [r] -> (movie)
RETURN type(r)
返回值为:
│"type(r)"            │
│"DIRECTED"           │

3) 匹配关系类型

指定节点 wallstreet 为 Movie 节点、title 属性为 'Wall Street',匹配与 wallstreet 节点的关系类型为 ACTED_IN 的节点,并返回相关节点的 name 属性值,代码如下:
MATCH (wallstreet:Movie { title: 'Wall Street' }) <- [:ACTED_IN]-(actor)
RETURN actor.name
返回值为:
│"actor.name"         │
│"Martin Sheen"       │
│"Charlie Sheen"      │
│"Michael Douglas"    │

4) 匹配多种关系类型

匹配关系时可以指定多种关系的类型。要匹配多种类型中的一种,则可以通过使用管道符号(|)将关系类型连接起来。

匹配关系类型为 ACTED_IN 或 DIRECTED 的节点,并返回相关节点的 name 属性值,代码如下:
MATCH (wallstreet { title: 'Wall Street' }) <- [:ACTED_IN|:DIRECTED]-(person)
RETURN person.name
返回值为:
│"actor.name"         │
│"Martin Sheen"       │
│"Charlie Sheen"      │
│"Michael Douglas"    │
│"Oliver Stone"       │

5) 匹配关系类型,并指定关系变量

匹配符合条件的关系,并返回该关系的 role 属性值,代码如下:
MATCH (wallstreet { title: 'Wall Street' }) <- [r:ACTED_IN]-(actor)
RETURN r.role
返回值为:
│"r.role"             │
│"Carl Fox"           │
│"Bud Fox"            │
│"Gordon Gekko"       │

6) 匹配多个关系

起始节点 charlie 的 name 属性为 Charlie Sheen,匹配与起始节点的关系为 ACTED_IN  的相关节点 Movie,同时相关节点 Movie 也与其他节点 director 具有 DIRECTED 关系。返回相关节点 Movie 的 title 属性和节点 director 的 name 属性值,代码如下:
MATCH (charlie { name: 'Charlie Sheen' }) - [:ACTED_IN]->(movie) <- [:DIRECTED]
(director)
RETURN movie.title, director.name
返回值为:
│"movie.title"      │"director.name"             │
│"Wall Street"      │"Oliver Stone"              │

MATCH匹配路径

路径是由节点和关系交替出现所构成的序列。图中必须满足路径指定的模式,才能返回路径中的元素。

1) 查询匹配关系数量在 1~3 之间的模式,并返回 Movie 节点的 title。代码如下:
MATCH (martin { name: 'Charlie Sheen' }) - [:ACTED_IN*1..3]-(movie: Movie)
RETURN movie.title
返回值为:
│"movie.title"                                   │
│"Wall Street"                                   │
│"The American President"                        │
│"The American President"                        │

2) 查询符合条件的模式,并返回路径中的关系代码如下:
MATCH p = (actor { name: 'Charlie Sheen' }) - [:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
返回值为:
│"relationships(p)"                              │
│[{"role":"Bud Fox"},{"role":"Gordon Gekko"}]    │
│[{"role":"Bud Fox"},{"role":"Carl Fox"}]        │

3) 匹配可变长度路径上的属性。首先,通过以下语句添加关系来改变原始图:
MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Martin Sheen' })
CREATE (charlie) - [:X { blocked: FALSE }] -> (:UNBLOCKED) <- [:X { blocked: FALSE }] - (martin)
CREATE (charlie)-[:X { blocked: TRUE }] -> (:BLOCKED) <- [:X { blocked: FALSE }] - (martin)
在这个查询中,“Charlie Sheen”和他的父亲“Martin Sheen”之间有两条路径,其中,一条路径的 blocked 属性值为 FALSE,另一条路径的 blocked 属性值为 TRUE。修改后的图如下图所示:


图 2 修改后的图

在匹配变长路径时,需要指定属性信息,返回相关路径,代码如下:
MATCH p = (charlie:Person) - [* { blocked:FALSE }] - (martin:Person)
WHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen'
RETURN p
返回值为:
│"p"                                                                                            │
│[{"name":"Charlie Sheen"},{"blocked":FALSE},{},{},{"blocked":FALSE},{"name": "Martin Sheen"}]  │
上述代码返回了“Charlie Sheen”和“Martin Sheen”之间 blocked 属性为 FALSE 的路径。

4) 匹配命名路径。如果希望返回模式图中的路径,可以引入命名路径,代码如下:
MATCH p = (michael { name: 'Michael Douglas' })-->()
RETURN p
返回从“Michael Douglas”开始的两条路径,返回值为:
│"p"                                                                                                       │
│[{"name":"Michael Douglas"},{"role":"President Andrew Shepherd"},{"title":"The American President"}]      │
│[{"name":"Michael Douglas"},{"role":"Gordon Gekko"},{"title":"Wall Street"}]                              │

相关文章