暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Cypher语句

Java Through 2021-03-21
933


1.1     语句

语句可分为三类。

l读语句:MATCHOPTIONAL MATCHWHERESTARTAggregationLOAD CSV

l写语句:CREATEMERGESETDELETEREMOVEFOREACHCREATE UNIQUE

l通用语句:RETURNORDER BYLIMITSKIPWITHUNWINDUNIONCALL

 

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]->

minHopsmaxHops都是可选的,默认值分别为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

节点id0的节点将返回。

 

通过id查询关系

通过id查询关系与节点类似。但这在实践中不推荐这么做。如下:

查询

MATCH ()-[r]->()

WHEREid(r)= 0

RETURN r

关系id0的节点将返回。

 

通过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。这很类似SQLouter 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

WHEREMATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。

 

基本使用

布尔运算

可以在WHERE中使用布尔运算符,如ANDOR,以及布尔函数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


 

文章转载自Java Through,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论