Neo4J Cypher - 匹配节点的计数关系

时间:2016-09-23 04:22:21

标签: neo4j count cypher relationship

我正在开发一个小项目,我必须在twitter等用户之间进行维护。我试图做一个返回某个节点的追随者的查询,让我们称之为“X”节点。因此,查询返回“X”的跟随者和“X”的跟随者的跟随者的数量以及“X”的跟随者跟随的节点的数量,包括该计数中的“X”。抱歉,这个文字游戏。让我们看一下图片的例子:

我有以下节点:

Nodes

我想知道节点2的所有关注者以及我之前提及的关注者的计数。我创建了下一个查询:

MATCH (:User{id:2})<-[:Follows]-(followers)
OPTIONAL MATCH (followers)-[r1:Follows]->(:User)
OPTIONAL MATCH (:User)-[r2:Follows]->(followers)
RETURN followers.id, count(r1) AS Follows, count(r2) AS Following;

但它失败了两个值:节点1遵循的节点数和节点6之后的节点数: enter image description here

在这里你可以看到所有的关系: enter image description here

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

我认为连续两次进行可选匹配会导致一些重复的结果(考虑每个阶段的输出都涉及到变量......每个跟随者跟随一个交叉产品跟随所有人的多行匹配谁跟随每个追随者的行匹配。)

虽然您可以通过在每个OPTIONAL MATCH之后组合数据(得到计数)来解决这个问题,但更好的方法是从使用OPTIONAL MATCH切换,而是直接获得与SIZE函数关系的数量:

MATCH (:User{id:2})<-[:Follows]-(followers)
RETURN followers.id, SIZE((followers)-[:Follows]->()) AS Follows, SIZE(()-[:Follows]->(followers)) AS Following