Neo4j笔记(二)Cypher(4)特殊查询

如题,本片主要介绍一些cypher的细节语法。

1、省略关系

match(n)-->(m)      两个 - 表示省略任意关系

2、匹配多种关系类型

match(n)->[:A|:B]->(m)    匹配A或者B类型的关系

3、带有空格的关系

match(n)-[`A B`]->(m)      使用反引号

4、变长关系

match(n)-[r:SHIP*1..3]-(m)     查找n的1~3跳关系,包括1和3,默认值是1和无穷大,可以省略其中一个值。如果省略 .. ,且只有一个值则表示固定跳数(长度)关系。

5、最短路径

match(n),(m),p=shortestPath((n)-[*..10]-(m)  return p     查找n,m之间的最短路径,路径最大长度为10

6、所有最短路径

match(n),(m),p=allShortestPaths((n)-[*]-(m))     查找n,m之间所有最短路径

7、id查询

match(n) where id(n)=1 return n

8、OPTIONAL MATCH

OPTIONAL MATCH顾名思义:可选匹配,找到了返回,找不到返回null,类似于SQL中的outer join,或者逻辑OR。
看一个简单查询:
match(n:Person{name:"p1"}),(m:Person{name:"p2"})   return n,m
查找两个name分别为p1、p2的Peroon,如果p1、p2都存在,自然没问题。如果其中一个存在,另一个不存在,结果呢?返回空。为什么呢?因为这两个查询是AND关系,一个不存在,即返回空。这个时候就可以使用OPTIONAL。

改写上面语句为:
match(n:Person{name:"p1"})
optional match(m:Person{name:"p2"})   
return n,m
如果p1存在,p2不存在,则也会返回p1。
如果p2存在,p1存在呢?上面语句返回什么呢?还是空。
总结就是match必须存在才返回,optional存不存在都可以。

9、逻辑判断

cypyer支持 AND、OR、NOT、XOR等逻辑运算。

10、where标签过滤

标签过滤常常放在match中,where也支持标签过滤。下面三句效果是一样的:
match(n:Person) return n
match(n) where labels(n)=["Person"] return n
match(n) where n:Person return n
注意该语法只支持节点标签判断,不支持关系标签判断,where关系判断参考16。

11、属性存在检查

exists函数支持属性检查判断属性是否存在。
match(n) where exists (n.name) return n

12、字符串匹配

STARTS WITH、ENDS WITH、CONTAINS支持字符串匹配(注意是大小写敏感),注意这三个不是函数,不要加():
STARTS WITH匹配字符串开始:match(n) where n.name STARTS WITH 'Jac' return n
ENDS WITH匹配字符串结尾:match(n) where n.name ENDS WITH 'li' return n
CONTAINS匹配字符串,不关心位置:match(n) where n.name CONTAINS 'ac' return n
使用NOT可以判断上述三个语句的反向条件

13、where路径模式

一般只会在match中使用路径模式,比如下面:
match(n)-->(m:Person{name:"p1"}) return n   返回所有指向p1的节点
如果反过来,查找所有不指向p1的节点,应该怎么写呢?可以使用OPTIONAL加WHERE判断,也可以试试下面这种:
match(n),(m:Person{name:"p1"}) where not (n)-->(m) return n   需要注意的时,该语句也会返回p1自身

14、比较运算

cypher比较运算符包括:=、<>、<、>、<=、>=、IS NULL、IS NOT NULL(NOT IS NULL也可以,但是这两种的解释不一样),注意不支持 !=

15、skip和limit

这两个应该比较熟悉,跳过和限制返回:
match(n) return n limit 1
match(n) return n skip 1

16、type匹配关系类型

常用的关系类型匹配是在路径模式中,比如下面这种:
match(n)-[r:F1]->(m) return n   查找F1类型的关系,也可以在where中通过type函数判断类型,如下面这种:
match(n)-[r]->(m) where type(r)="F1"  return n
注意type函数支持关系类型判断,不支持节点标签判断,关于节点where标签判断,参考10。

猜你喜欢

转载自blog.csdn.net/haveanybody/article/details/89383653