如题,本片主要介绍一些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'
但是一般情况下不推荐这么做,因为这种查询无法利用属性索引