1.1 语句
语句可分为三类。
l读语句:MATCH、OPTIONAL MATCH、WHERE、START、Aggregation和LOAD CSV
l写语句:CREATE、MERGE、SET、DELETE、REMOVE、FOREACH和CREATE UNIQUE
l通用语句:RETURN、ORDER BY、LIMIT、SKIP、WITH、UNWIND、UNION和CALL
1.1.1 MATCH
MATCH语句用指定的模式检索数据库。
查询所有节点
通过指定一个不带标签的节点的模式,图中的所有节点将返回。
MATCH (n) RETURN n |
返回数据库中的所有节点。
查询带有某个标签的所有节点
通过指定带有一个标签的节点的模式,可以获取满足该标签的所有节点。
查询
MATCH (movie:Movie) RETURN movie.title |
返回数据库中的所有电影。
查询关联节点
符号——意为相关的,这个关系不带有类型和方向。
MATCH ({ name: 'Lilly Wachowski' })--(movie) RETURN movie.title |
返回’Lilly Wachowski’相关的所有电影。
匹配标签
可以为查询的节点增加标签约束。如下
MATCH (:Person { name: 'Lilly Wachowski' })--(movie:Movie) RETURN movie.title |
返回与Person 'Oliver'相连的带有Movie标签的所有节点。
查找关系
外向关系
关系的方向通过-->或者<--来表示。如:
MATCH (:Person { name: 'Lilly Wachowski' })-->(movie) RETURN movie.title |
返回与Person 'Lilly Wachowski'外向连接的所有节点。
有向关系和变量
当需要过滤关系中的属性,或者返回关系的时候,变量就很有必要了。
MATCH (:Person { name: 'Lilly Wachowski' })-[r]->(movie) RETURNtype(r) |
返回'Oliver'的外向关系的类型。
匹配关系类型
当已知要匹配关系的类型时,可通过冒号后面紧跟关系类型。
MATCH (wallstreet:Movie { title: 'The Matrix' })<-[:ACTED_IN]-(actor) RETURN actor.name |
返回'The Matrix'中的所有演员。
匹配多种关系类型
当需要匹配多种关系中的一种时,可以通过竖线|将多个关系连接在一起。
MATCH (wallstreet { title: 'The Matrix' })<-[:ACTED_IN|:DIRECTED]-(person) RETURN person.name |
返回与'The Matrix'节点关系为ACTED_IN或者DIRECTED的所有节点。
匹配关系类型和使用关系变量
如果想通过变量来引用关系和指定关系类型,可以将它们放在一起。如:
MATCH (wallstreet { title: 'The Matrix' })<-[r:ACTED_IN]-(actor) RETURN r.role |
返回'The Matrix'中所有演员的角色。
多个关系
关系可以多语句以 ()--()的形式来表达,或者它们相互连接在一起。如:
MATCH (tom { name: 'Tom Hanks' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director) RETURN tom,movie, director |
返回' Tom Hanks '演的电影和该电影的导演。
可变长关系
可变长关系和节点的语法如下:
-[:TYPE*minHops..maxHops]->
minHops和maxHops都是可选的,默认值分别为1和无穷大。当没有边界值的时候,点也可以省略。当只设置了一个边界的时候,如果点省略了就意味着是一个固定长度的模式。
MATCH (martin { name: 'Tom Hanks' })-[:ACTED_IN*1..3]-(movie:Movie) RETURN movie.title |
返回与' Tom Hanks '关系为1跳(hop)到3跳的所有电影。
变长关系的关系变量
当连接两个节点之间的长度是变长的,那么关系变量返回的将可能是一个关系列表。
MATCH (actor { name: 'Tom Hanks' })-[r:ACTED_IN*2]-(co_actor) RETURN r |
返回一个关系列表。
匹配一簇关系
当模式包含一簇关系时,关系模式不会指定方向,Cypher将尝试匹配两个方向的关系。
MATCH (a)-[r]-(b) WHEREid(r)= 0 RETURN a,b |
返回两个相连的节点,一个为开始节点,一个为结束节点。
查询路径
如果想返回或者需要对路径进行过滤,可以将路径赋值给一个变量。
MATCH p =(tom { name: 'Tom Hanks' })-->() RETURN p |
返回从开始'Michael Douglas'的两条路径。
最短路径
单条最短路径
通过使用shortestPath函数很容易找到两个节点之间的最短路径。如下所示:
MATCH p =shortestPath((tom { name: 'Tom Hanks' })-[*..15]-( Steve {name:'Steve Zahn'})) RETURN p |
上面查询的含义为:找到两个节点之间的最短路径,路径最大长度为15。在搜索最短路径的时候,还可以使用关系类型、最大跳数和方向等约束条件。如果用到了WHERE语句,相关的断言会被包含到shortestPath中去。如果路径的关系元素中用到了none()或者all()断言,那么这些将用于在检索时提高性能。
通过id查询节点或关系
通过id查询节点
可以在断言中使用id()函数来根据id查询节点。
查询
MATCH (n) WHEREid(n)= 0 RETURN n |
节点id为0的节点将返回。
通过id查询关系
通过id查询关系与节点类似。但这在实践中不推荐这么做。如下:
查询
MATCH ()-[r]->() WHEREid(r)= 0 RETURN r |
关系id为0的节点将返回。
通过id查询多个节点
通过id查询多个节点的时候,可以将id放到IN语句中。
查询
MATCH (n) WHEREid(n) IN [0, 3, 5] RETURN n |
这个查询返回了IN语句中列出的所有节点。
1.1.2 OPTIONAL MATCH
OPTINAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项用null代替。
关系
如果某个关系是可选的,可使用OPTINAL MATCH。这很类似SQL中outer join的工作方式。如果关系存在就返回,否则在相应的地方返回null。
MATCH (a:Movie { title: 'The Matrix' }) OPTIONALMATCH (a)-->(x) RETURN x |
返回了null,因为这个节点没有外向关系。
可选元素的属性
如果可选的元素为null,那么该元素的属性也返回null。
MATCH (a:Movie { title: 'The Matrix' }) OPTIONALMATCH (a)-->(x) RETURN x, x.name |
返回了x元素(查询中为null),它的name属性也为null。
可选关系类型
可在查询中指定可选的关系类型。
MATCH (a:Movie { title: 'The Matrix' }) OPTIONALMATCH (a)<-[r:ACTED_IN]-() RETURN r |
1.1.3 WHERE
WHERE在MATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。
基本使用
布尔运算
可以在WHERE中使用布尔运算符,如AND和OR,以及布尔函数NOT。
查找1990年到2000年发行的电影的名称
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title
节点标签的过滤
可以在WHERE中类似使用WHERE n:foo写入标签断言来过滤节点。
MATCH (n) WHERE n:Movie RETURN n |
将返回’Movie节点。
节点属性的过滤
可以在WHERE语句中对节点的属性进行过滤。
MATCH (n) WHERE n.released > 1990 RETURN n |
返回了released > 1990的"Movie"节点。
关系属性的过滤
要对关系的属性进行过滤,可在WHERE中添加如下关键词:
MATCH(n)-[:ACTED_IN]->(m) WHERE m.released > 1990 RETURN n |
返回了参演过1990年后发布的电影的演员。
属性存在性检查
使用exists()只能检查节点或者关系的某个属性是否存在。
MATCH (n) WHEREexists(n.title) RETURN n |
返回了电影节点,因为只有他有title属性。
字符串匹配
匹配字符串的开始
STARTS WITH用于以大小写敏感的方式匹配字符串的开始。
MATCH (n) WHERE n.name STARTSWITH'Tom' RETURN n |
"Peter"返回了,因为他的名字以"Pet"开始。
匹配字符串的结尾
ENDS WITH用于以大小写敏感的方式匹配字符串的结尾。
MATCH (n) WHERE n.name ENDSWITH'Hanks' RETURN n |
返回了姓名以'Hanks'结尾的人。
字符串包含
CONTAINS用于检查字符串中是否包含某个字符串,它是大小写敏感的,且不关心匹配部分在字符串中的位置。
MATCH (n) WHERE n.name CONTAINS'bin' RETURN n |
字符串反向匹配
使用NOT关键词可以返回不满足给定字符串匹配要求的结果。如:
MATCH (n) WHERENOT n.name ENDSWITH's' RETURN n |
返回了姓名不以"s"结尾的人。
正则表达式
Cypher支持正则表达式过滤。正则表达式的语法继承来自Java正则表达式。
正则表达式
可以使用=~ 'regexp'来进行正则表达式的匹配。如下:
MATCH (n) WHERE n.name =~ 'Tom.*' RETURN n |
'
正则表达式中的转义字符
如果需要在正则表达式中插入斜杠,需使用转义字符。注意:字符串中的反斜杠也需要转义。
CREATE (sunrise:Movie {title:'sun/rise', released:2018, tagline:'自拍自导自演'})
MATCH (n) WHERE n.title =~ 'sun\\/rise' RETURN n |
'Tobias'返回了,因为他的地址在'Sweden/Malmo'。
正则表达式的非大小写敏感
在正则表达式前面加入(?i)之后,整个正则表达式将变成非大小写敏感。
MATCH (n) WHERE n.name =~ '(?i)TOM.*' RETURN n |
返回了姓名以TOM开头的人。
在WHERE中使用路径模式
模式过滤
MATCH (n { name:'Kevin Bacon'}),(m) WHERE (n)-[:ACTED_IN]-(m) RETURN n,m |
返回了Kevin Bacon参演过的电影。
模式中的NOT过滤
NOT功能可用于排除某个模式。
MATCH (n { name:'Kevin Bacon'}),(m:Movie) WHERENOT (n)-[:ACTED_IN]-(m) RETURN m |
返回了Kevin Bacon没有参演过的电影。
模式中的属性过滤
可以在模式中添加属性来过滤结果。
MATCH (n) WHERE (n)-[: ACTED_IN]-({ title: 'Apollo 13' }) RETURN n |
返回参演Apollo 13电影的所有演员。
关系类型过滤
可以在MATCH模式中添加关系类型,但有时候希望在类型过滤上具有丰富的功能。这时,可以将类型与其他进行比较。例如,下面的例子将关系类型与一个正在表达式进行比较。
MATCH (n)-[r]->() WHEREtype(r)=~ 'DIRE.*' RETURN n |
返回所有导演。
列表
IN运算符
检查列表中是否存在某个元素,可以使用IN运算符。
MATCH (a) WHERE a.name IN ['Keanu Reeves', 'Lana Wachowski','Hugo Weaving'] RETURN a |
返回三个人的节点。
不存在的属性和值
如果属性不存在,对它的判断默认返回false。对于不存在的属性值就当作null,在下面例子中,对于没有name属性的节点的比较将返回false。
MATCH (n) WHERE n.name = 'Keanu Reeves' RETURN n |
仅返回了人的节点。
属性不存在默认为true的情况
如果要比较的属性存在,则可以与期望的值进行比较。如果不存在(IS NULL),默认值为true。如:
MATCH (n) WHERE n.name = 'Keanu Reeves'OR n.name ISNULL RETURN n ORDERBY n.name |
返回Keanu Reeves节点和所有电影节点
空值过滤
有时候需要测试某个值或变量是否为null。在Cypher中与SQL类似,可以使用IS NULL。相反,“不为空”使用IS NOT NULL,尽管NOT (IS NULL x)也可以。
查询
MATCH (m) WHERE m.title ISNULL RETURN m |
返回人物节点。
使用范围
简单范围
检查某个元素是否在指定的范围,可以使用不等运算符<,>=和>。
MATCH (a) WHERE a.released >= 1990 RETURN a |
范围的组合
多个不等式可以组合构成一个范围。
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title




