Neo4j中特定Pull节点的LIKE关系计数优化方案问询
优化Neo4j中点赞关系的高效计数查询
我的数据模型为(:User)-[:LIKE]->(:Pull),需要统计特定Pull节点(id为"pull4")的LIKE关系数量。目前使用的查询如下:
PROFILE MATCH res=(:Pull {id:"pull4"})<-[:LIKE]-() return size(collect(relationships((res)))) as res
该查询会先展开所有LIKE关系再进行计数,当目标Pull节点拥有数百万个点赞时,查询开销极高。想请教有没有能利用Neo4j计数存储的更优查询方案?
已失效的旧版查询
以下两种写法在新版Neo4j中不再生效:
MATCH (p:Pull {id:"pull4"}) RETURN size( (p)<-[:LIKE]-() )
MATCH (p:Pull {id:"pull4"}) RETURN length( (p)<-[:LIKE]-() )
最优高效查询方案
在新版Neo4j中,推荐使用以下两种无需遍历所有关系的高效计数方式,直接利用Neo4j维护的统计存储:
- 计数模式(Count Pattern)
通过模式计数语法直接获取关系数量,性能优异:
MATCH (p:Pull {id:"pull4"}) RETURN count{(p)<-[:LIKE]-()} AS likeCount
- 原生入度函数
使用db.node.degree.in函数直接读取节点指定类型的入度统计,时间复杂度为O(1),是性能最优的方案:
MATCH (p:Pull {id:"pull4"}) RETURN db.node.degree.in(p, 'LIKE') AS likeCount
这两种方案都不会展开所有LIKE关系,避免了百万级数据下的高IO和内存开销,能大幅提升查询效率。
内容的提问来源于stack exchange,提问作者moneeb Shammout
相关产品推荐
相关产品推荐

