【Neo4j查询优化系列】如何快速统计节点的关系数

34 篇文章 3 订阅
34 篇文章 4 订阅

在图数据库中我们经常需要统计节点上的关系数目。一种常见的查询写法是这样的:

MATCH (n:Person {name:‘Keanu Reeves’})-[]-() RETURN count(*);

上面的查询会返回代表基诺-李维斯的节点(节点标签为Person)上所有关系的总数,包括进入的和流出的关系。如果用PROFILE来看一下查询的执行步骤和成本,结果如下:

relcount1.jpg

我们看到在统计节点拥有的关系数目时,产生8次dbhits,以及执行count()产生的EagerAggregation操作。查询结果告诉我们该节点有7个关系。

事实上,Neo4j数据库在保存关系时会同时更新相关节点的关系计数器,该计数器保存在数据库中并和节点相关联。我们其实不需要真正读出节点上的关系来统计它们的数量,而只要从关系计数器中读取当前的数值即可。参见下面的查询:

PROFILE MATCH (n:Person {name:‘Keanu Reeves’}) RETURN size((n)-[]-())

relcount2.jpg

从查询计划中可以看出,读取关系计数器的操作是通过调用GetDegree(node, relationshiptype, direction)完成的,而且只有1次dbhit,无论实际关系的数量有多少。这里,因为我们没有指定关系类型和方向,第二个参数是None,第三个参数是BOTH。可以试试下面的查询来帮助理解GetDegree的用法:

PROFILE MATCH (n:Person {name:‘Keanu Reeves’}) RETURN size((n)-[:ACTED_IN]->())

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值