gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:48:16 25 4
gpt4 key购买 nike

我有一个类似于下图的图表。但是,从 Person 到最顶层 Rollup 的 rollup 的深度和数量是可变的,具体取决于用户如何构建 rollup。从 Person 到 Metric (HAS_METRIC) 的边具有得分值,从指标到 Rollup (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。任何指针表示赞赏。

最佳答案

我相信您正在寻找的是 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]-()
...

当然,您可以将这些密码与其他密码结合起来,以便在一个查询中返回您需要的所有内容。

我希望这有帮助。当您成功时,请告诉我们。

关于neo4j - 用于收集任意深度节点和边属性的 Cypher 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59851583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com