neo4j使用详解(四、cypher查询语法——最全参考)

请添加图片描述


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

    带约束的最短路径: 需要使用none()5,all()6

    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 n7

  • 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)



  1. ->为出度,–>为出度相关 ↩︎

  2. <-为入度,<–为入度相关 ↩︎

  3. --表示相关,不论方向 ↩︎

  4. type函数用于引用关系的类型 ↩︎

  5. none()没有某种关系 ↩︎

  6. all()全是某种关系 ↩︎

  7. =~ 正则匹配符号 ↩︎

  • 20
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值