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 这两种节点,代码如下:
使用 MATCH 语句查询所有节点,并创建关系,代码如下:
查询并返回节点标签为 Movie 的所有节点的 title 属性,代码如下:
上述语句并未指定关系,即表示任意关系;没有指定节点类型,即表示任意节点,唯一的匹配条件是第一个节点的 name 属性值为'Oliver Stone'。代码如下:
查询一个标签为 Person、name 属性为 'Oliver Stone' 的起始节点,该起始节点与结束节点 Movie 有关系,返回 Movie 节点的 title 值,代码如下:
起始节点为 Person,name 属性为 'Oliver Stone',匹配与 Person 节点有关系且标签为 movie 的节点,并返回关系类型。
关系的类型可通过 type() 函数查看,代码如下:
匹配关系类型为 ACTED_IN 或 DIRECTED 的节点,并返回相关节点的 name 属性值,代码如下:
1) 查询匹配关系数量在 1~3 之间的模式,并返回 Movie 节点的 title。代码如下:
2) 查询符合条件的模式,并返回路径中的关系代码如下:
3) 匹配可变长度路径上的属性。首先,通过以下语句添加关系来改变原始图:

图 2 修改后的图
在匹配变长路径时,需要指定属性信息,返回相关路径,代码如下:
4) 匹配命名路径。如果希望返回模式图中的路径,可以引入命名路径,代码如下:
下面以电影和演员为例,创建一些节点和关系,并进行相关操作。初始化图如下图所示:

图 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"}] │
ICP备案:
公安联网备案: