Neo4j系列导航:
neo4j及简单实践
cypher语法基础
cypher插入语法
cypher插入语法
cypher查询语法
cypher通用语法
cypher函数语法
neo4j索引及调优
2.查询语法
match、optional match、where、start和aggregation(聚合)
2.1.match语法
查询已有数据
-
简单查询
查询所有节点:
match (n) return n
查询指定标签的节点:
match (n:Person) return n
查询指定标签和属性的节点:
match (n:Person {name:"zhangsan"}) return n
-
关系查询
查询出度1节点:
match (n:Person{name:"zhangsan"})-[r]->(m) return m
match (n:Person{name:"zhangsan"})-->(m) return m
查询入度2节点:
match (n:Person{name:"zhangsan"})<-[r]-(m) return m
match (n:Person{name:"zhangsan"})<--(m) return m
查询关联3节点:
match (n:Person{name:"zhangsan"})-[r]-(m) return m
match (n:Person{name:"zhangsan"})--(m) return m
查询关联节点(带标签):
match (n:Person{name:"zhangsan"})-[r]-(m:Person) return m
match (n:Person{name:"zhangsan"})--(m:Person) return m
通过关系类型查询:
match (n:Person{name:"zhangsan"})-[r:Friend]->(m) return r
多个关系类型查询:
match (n:Person{name:"zhangsan"})-[r:Friend|:Schoolmatet]->(m) return r
多重关系查询:
match (n{name:"zhangsan"})-[:Friend]->(m)<-[:Schoolmatet]-(d) return m,d
-
层级查询-直接拼接关系多层查询:
match (n:Person{name:"zhangsan"})-[r]->(m)-[k]->(v) return n,r,m,k,v
-
层级查询-深度运算符:[:TYPE*min…max]4
- min和max,默认值分别为1和无穷大,为0时表示节点本身
- 当没有边界值的时候,点也可以省略
- 当只设置了一个边界的时候,如果点省略了就意味着是一个固定长度的模式.
固定深度查询: 查询当前节点关系2度的出度节点
match (n:Person{name:"zhangsan"})-[*2]->(m) return m
查询当前节点1度到三度的所有出度节点:
match (n:Person{name:"zhangsan"})-[r*1..3]->(result)
查询包括n节点的所有出度节点:
match (n:Person{name:"zhangsan"})-[r*0..]->(result)
查询不包括n节点的所有出度节点:
match (n:Person{name:"zhangsan"})-[r*1..]->(result)
查询不包括n节点,关系为Friend且出度节点为Person的所有节点:
match (n:Person{name:"zhangsan"})-[r:Friedn*1..]->(m:Person) return m
-
路径查询:
命名路径:
match p=(n:Person{name:"zhangsan"})-->() return p
匹配一簇关系: 当模式包含一簇关系时,关系模式不会指定方向,Cypher将尝试匹配两个方向的关系
查询返回两个相连的节点,一个为开始节点,一个为结束节点match (a)-[r]-(b) where id(r)=30 return a,b
查询具有一定深度的节点:
match p=()-[*2..4]-()return p
最短路径: shortestPath函数,获取节点之间的最短路径
match (n:Person{name:"zhangsan"}),(m:Person{name:"zhaoliu"}), p=shortestPath((n)-[*..15]-(m)) return p
match (n:Person{name:"zhangsan"}),(m:Person{name:"zhaoliu"}), p=shortestPath((n)-[*]-(m)) where none (r in relationships(p) where type(r)= "Friend") return p
所有最短路径: allShortestPaths函数,获取所有最短路径
match (n:Person{name:"zhangsan"}),(m:Person{name:"zhaoliu"}), p=allShortestPaths((n)-[*]-(m)) return p
2.2.optional match语法
与match类似,只是如果没有匹配上,则将使用null作为没有匹配上的模式。类似于SQL中的外连接。
-
匹配,如果没有返回null:
match (a:Person{name:"zhangsan") optional match (a)-->(x) return x
2.3.where语法
条件过滤语句,与关系型数据库中的where用法类似。一般与match、option match和with等关键字结合使用用于给模式添加约束或者过滤传递给WITH的中间结果。
-
标签过滤:
match(n) where n:Person return n
-
过滤属性:
match(n) where n.name="zhangsan" and n.age<30 return n
-
过滤存在某属性的节点:
match(n) where exists(n.age) return n
-
正则匹配:
match(n) where n.name=~"zhang.*" return n
7 -
where中使用模式:
where中带模式:
match (n{name:"zhangsan"}),(m) where m.name in ['wangwu', 'zhaoliu'] and (n)-->(m) return m
过滤关系带属性:
match (n) where (n)-[:Friend]-({name:'lisi'}) return n
过滤关系类型:
match (n)-[r]->(m) where n.name='zhangsan' and type(r)=~"F.*" return r
使用not:
match (n),(m{name:"lisi"}) where not (n)-->(m) return n
寻找出度节点name不是lisi的节点使用in
match (n) where n.name in ["zhangsan", "lisi"] return n
过滤null:
match (n) where n.name="zhangsan" and n.address is not null RETURN person
2.4.start语句
start语句仅用于访问neo4j遗留的索引(节点或者关系的索引)
-
访问节点:
start n=node(1) return n
-
**通过索引获取节点:语法
node:index-name("query")
start n=node:nodes("name:A") return n
’ -
通过索引获取关系: 语法
relationship:index-name(key="value")
start=relationship:rels(name = "zhangsan") return
rels为关系索引的名称
2.5.aggregation(聚合)函数
-
count: 统计次数
match (n:Person{name:"zhangsan"})-->(x) return n, count(x)
-
sum: 统计求和(只适用数值类型)
match (n:Person) return sum(n.age)
-
avg: 求平均数(只适用数值类型)
match (n:Person) return avg(n.age)
-
min: 统计求最小值(只适用数值类型)
match (n:Person) return min(n.age)
-
max: 统计求最大值(只适用数值类型)
match (n:Person) return max(n.age)
-
collect: 所有的值收集起来放入一个列表,空值null将被忽略
match (n:Person) return collect(n.age)
-
distinct: 去重,所有聚合函数都可以使用的聚合修饰符
match (n:Person{name:"zhangsan"})-->(m) return count(distinct m.age)
-
percentileDisc: 计算百分位
match (n:Person) return percentileDisc(n.age, 0.5)
-
percentileCont: 计算加权平均数
match (n:Person) return percentileCont(n.age ,0.6)
-
stdev: 计算标准偏差(部分样本)
match (n:Person) return stdev(n.age)
-
stdep: 计算标准差(整个样本)
match (n:Person) return stdevp(n.age)