cypher - 图中所有子节点的总和

时间:2018-03-20 16:42:32

标签: neo4j cypher

我有一个像enter image description here这样的图表 我需要的是为连接到HPKP-X节点的每个节点获取属性X的总和。

给我路径上的所有内容的查询结果如下: enter image description here

MATCH (p:Project{key:"HPKP"})-[*]-(i:Issue) 
RETURN i.key, i.worklog

但是我希望它按HPKP-X节点分组并排除关联关系(见图1)。

到目前为止我到了这个

MATCH c = (p:Project{key:"HPKP"})-[r:CONTAINS]->(i:Issue)-[x*]-(s:Issue) 
WHERE NONE(x in relationships(c) where type(x) = "RELATES") 
RETURN distinct i.key, sum(i.worklog)

但这是重复我的总和结果。所以我需要的是查询,它会给我带来这样的结果:

HPKP-3 worklog = HPKP-3.worklog + MIKA-3.worklog = 100 + 100 = 200
HPKP-2 worklog = HPKP-2.worklog + MIKA-2.worklog = 200 + 200 = 400
HPKP-1 worklog ......

1 个答案:

答案 0 :(得分:0)

如果您知道要列入白名单的所有关系类型(例如,CAUSESSPLITS),则可以使用APOC函数apoc.path.subgraphNodes来获取子图节点(包括只有Issue个节点可以通过感兴趣的Issue从每个CONTAINED节点Project到达:

MATCH c = (p:Project{key:"HPKP"})-[:CONTAINS]->(i:Issue)
CALL apoc.path.subgraphNodes(i, {
  relationshipFilter: 'CAUSES|SPLIT',
  labelFilter: '+Issue',
  maxLevel: 10,
  filterStartNode: false}) YIELD node
RETURN i.key AS key, SUM(node.worklog) AS total_worklog;

注意:上面的示例使用10作为必需的maxLevel,以限制搜索节点的深度。 maxLevel太高会导致查询内存不足或耗时太长(如果DB中确实存在长路径)。