gpt4 book ai didi

neo4j - 在 Cypher 中聚合后返回节点

转载 作者:行者123 更新时间:2023-12-05 02:56:35 25 4
gpt4 key购买 nike

我很难理解如何在 Cypher 中正确使用聚合函数。

假设我有标记为 Animal 的节点,具有属性 sizespecies。对于每个物种,我想获得最大的。

到目前为止,我知道我可以通过以下方式做到这一点:

MATCH (n:Animal)
WITH n.species as species, max(n.size) as size
RETURN species, size

我将有效地获得相应物种的最大尺寸。

但是我怎样才能得到节点而不是物种呢?

由于 WITH 语句,我无法返回 n,而且我无法将其注入(inject) WITH,因为它会中断物种聚合。

我知道这个问题已经被问过几次了,但我遇到的不同解决方案都是针对特定案例和使用的关系

非常欢迎任何建议

编辑:我终于让它工作了:

MATCH (n:Animal)
WITH n.species as species, max(n.size) as size, collect(n) as ns
UNWIND ns as n
WITH n
WHERE n.size = size
RETURN n

这是解决问题的 Cypher 方式吗?对我来说似乎有点冗长且效率不高(所有节点都在此处获取),难道没有更直接的选择吗?

最佳答案

由于 MAX 聚合函数不返回具有最大值的节点,因此您不应该使用它。否则,您必须测试每只动物的大小 两次 以获得最大值和感兴趣的节点(正如您发现的那样)。

您可以改为使用 REDUCE 函数来测试每只动物的大小一次:

MATCH (n:Animal)
WITH n.species AS species, COLLECT(n) as ns
RETURN species, REDUCE(s = {size: -1}, a IN ns |
CASE WHEN a.size > s.size THEN {size: a.size, a: a} ELSE s END
) AS result;

关于neo4j - 在 Cypher 中聚合后返回节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343771/

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