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。

17、cypher正则表达式

cypher正则表达式来源于java,含义和java正则也是大同小异。cypher正则标识是 =~ 。例如:

MATCH (n)
WHERE n.name =~ 'Tim.*'    //查找以Tim开头的名字
RETURN n.name, n.age

对于 . * 等特殊符号需要转义,例如:

MATCH (n)
WHERE n.email =~ '.*\\.com'       //查找以.com结尾的字符串
RETURN n.name, n.age, n.email

(?i)表示不区分大小写,例如:

MATCH (n)
WHERE n.name =~ '(?i)AND.*'
RETURN n.name, n.age

(?s)表示全文检索,例如:

return 'w1w2\nt3w3w4' =~ '.*w3.*'        //返回false
return 'w1w2\nt3w3w4' =~ '(?s).*w3.*'    //返回true

18、索引

添加索引:CREATE INDEX ON :label_name(property)
删除索引:DROP INDEX ON :label_name(property)
查看索引和约束:   :schema  (注意前面有一个冒号)

19、删除所有数据

match(n) detach delete n
或者
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
当然,如果可以停机的话,直接删除db文件最方便

20、模糊属性查询

查询属性包含 "test" 子串的属性
unwind keys(node) as key
where key contains 'test'
但是一般情况下不推荐这么做,因为这种查询无法利用属性索引

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值