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"}] │