使用在 neo4j 中建模的层次结构计算节点下的节点数
Counting the number of nodes under a node using hierarchies modelled in neo4j
我有一个邻接列表(parent/child 关系)建模到 neo4j 但计算父节点下的节点数给出了错误的计数。
这是正在使用的密码查询
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN count(child)
要做到这一点,最好的办法就是进行图遍历。
感谢 APOC
(https://neo4j-contrib.github.io/neo4j-apoc-procedure),这在密码中是直接可能的。
这个查询应该会给你预期的结果:
MATCH (me:Members { membershipID:$membershipID}) WITH me
CALL apoc.path.subgraphAll(me, {relationshipFilter:'IS_PARENT_OF>', uniqueness: 'NODE_GLOBAL'}) YIELD nodes
RETURN size(nodes)
Logisima 的答案是一个很好的答案,也是一种遍历子图的有效方法。你得到我认为是结果中节点太多的原因是你可能会重复计算结果中的一些 children return。
如果您添加 DISTINCT
我想您会 return 您期望的数字。
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN count(DISTINCT child)
您可以通过这样做来识别 children 个被重复计算的对象
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN child, count(*)
您在相关子图中是否有任何无关的 IS_PARENT_OF
关系?
我有一个邻接列表(parent/child 关系)建模到 neo4j 但计算父节点下的节点数给出了错误的计数。
这是正在使用的密码查询
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN count(child)
要做到这一点,最好的办法就是进行图遍历。
感谢 APOC
(https://neo4j-contrib.github.io/neo4j-apoc-procedure),这在密码中是直接可能的。
这个查询应该会给你预期的结果:
MATCH (me:Members { membershipID:$membershipID}) WITH me
CALL apoc.path.subgraphAll(me, {relationshipFilter:'IS_PARENT_OF>', uniqueness: 'NODE_GLOBAL'}) YIELD nodes
RETURN size(nodes)
Logisima 的答案是一个很好的答案,也是一种遍历子图的有效方法。你得到我认为是结果中节点太多的原因是你可能会重复计算结果中的一些 children return。
如果您添加 DISTINCT
我想您会 return 您期望的数字。
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN count(DISTINCT child)
您可以通过这样做来识别 children 个被重复计算的对象
MATCH (me:Members)-[:IS_PARENT_OF*]->(child)
WHERE me.membershipID = {membershipID}
RETURN child, count(*)
您在相关子图中是否有任何无关的 IS_PARENT_OF
关系?