Neo4j笔记(二)Cypher(4)特殊查询 |
您所在的位置:网站首页 › neo4j查询一个节点的所有关系 › 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.*' //返回true18、索引 添加索引: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' 但是一般情况下不推荐这么做,因为这种查询无法利用属性索引
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |