从下到上的总和图

时间:2015-11-19 16:06:34

标签: graph neo4j cypher

给出了neo4j中建模的以下图表

enter image description here

目标:

计算所有节点的总和乘以自下而上的边缘百分比。

e.g。

(((30*.6)+(50*.1)+100)*.5)+10)=71,5

状态:

我找到REDUCE函数(http://neo4j.com/docs/stable/query-functions-collection.html#functions-reduce) 但在我看来,它从上到下总结,而不是起动。

这是一个众所周知的名字的commen问题,我不知道吗? 在neo4j或其他(图形)数据库/语言中是否有任何解决方案?

1 个答案:

答案 0 :(得分:2)

这是一个非常有趣的问题:

我假设了两件事,首先所有节点都有:A标签,其次是节点上的属性,关系有p

这是一个有效的查询:

MATCH p=(:A)-[r]->(pike)
WITH pike, collect(p) as paths
OPTIONAL MATCH (pike)-[r]->()
WITH 
CASE r WHEN null THEN 1 ELSE r.p END as multiplier, 
CASE r WHEN null THEN last(nodes(paths[0])).p 
ELSE reduce(x=0, path in paths | x + (head(nodes(path)).p * head(rels(path)).p)) + last(nodes(paths[0])).p END as total
RETURN sum(total*multiplier) as total

背后的逻辑:

  1. 找到一条深度路径,通过长矛(第一WITH
  2. 来聚集孩子们
  3. 如果未通过可选匹配,则乘数将为1而不是关系属性上可能的浮点值
  4. 第二种情况,做数学逻辑,如果这是pikes的顶部(因此这里是节点A),它只会添加顶部节点的值,否则它将采用子节点的值
  5. 然后将得分和乘法相加
  6. 您可以在此处进行测试:http://console.neo4j.org/r/ih8obf