收集任意深度节点和边属性的Cypher查询

4
我有一个看起来像下面图片的图表。然而,从“Person”到最上面的“Rollup”的深度和汇总次数因用户所构建的滚动条而异。从“Person”到“Metric”(HAS_METRIC)的边缘具有分数值,从度量到裂变(HAS_PARENT)的关系具有应用于将值滚动到顶端分数的加权。

graph

理想情况下,我想要一个查询生成一个包含汇总和加权分数的表像这样:
    node    |  value
 -------------------
   Metric A    23
   Metric B    55
   Metric C    29
   Metric D    78
   Rollup A    45.4
   Rollup B    58.4
   Rollup Tot  51.9

然而,我不明白如何收集具有 HAS_PARENTS 属性的边缘属性。

MATCH (p:Person)-[score:HAS_METRIC]->(m:Metric)-[weight:HAS_PARENT]->(ru:Rollup)
        -[par_rel:HAS_PARENT*..8]->(ru_par:Rollup)
WITH p, score, m, weight, par_rel, ru, ru_par
RETURN p.uid, score.score, m.uid, weight.weight, ru.uid par_rel.weight, ru_par.uid

这个查询出现了类型不匹配的错误,因为它不知道如何处理 par_rel.weight。如果有任何指针,请告知,谢谢。


请注意:您的图像和表格中“度量D”的值不相同。 - cybersam
谢谢,我已经更新了。 - Philip Brown
1个回答

0

我相信你在寻找的是 relationships(path) 函数。这是 Cypher 中的默认路径函数之一。它会返回在定义的 路径 中的所有关系,并且你可以将其与一个或多个 Cypher 列表表达式 结合使用,以获得你需要的关系的值。

一般来说,你可以做类似这样的操作:

MATCH p = (n)-[:HAS_PARENT*..8]->()
RETURN [x IN relationships(p) | x.weight] AS weights

你可能会发现reduce函数也很有用。例如:

...
RETURN reduce(s = 0, x IN relationships(p) | s + x.weight) AS sumWeight

但是你需要小心处理你的变长路径查询,并且可能需要对它们进行限制,以便只获取你感兴趣的路径。

一个好的建议可能是标记你的叶子节点和根节点,以便仅匹配从叶子到根的路径,而不是中间的路径。例如:

MATCH p = (n)-[:HAS_PARENT*..8]->(root)
WHERE NOT (root)-[:HAS_PARENT]->() AND NOT (n)<-[:HAS_PARENT]-()
...

当然,您可以将这些密码与其他密码组合在一起,以便在单个查询中返回所需的所有内容。
希望这可以帮助您。请让我们知道您何时成功。

这些技术的组合最终对我实现计算起到了作用。虽然我怀疑有更多知识的人可以在一个查询中完成,但我无法做到。我最终使用一次查询获取层次结构的结构(顶部和底部),并使用另一个查询基于该结构获取值。 - Philip Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接