【问题标题】:Return node after aggregation in Cypher在 Cypher 中聚合后返回节点
【发布时间】:2020-02-21 17:39:15
【问题描述】:

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

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

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

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

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

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

由于WITH 语句,我无法返回n,也无法将其注入WITH,因为它会破坏species 聚合。

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

非常欢迎任何建议

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

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 方式吗?对我来说似乎有点冗长而且效率不高(所有节点都在这里获取),没有更直接的选择吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    由于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;
    

    【讨论】:

      【解决方案2】:

      这是我们的 max() 和 min() 聚合函数经常遇到的限制,因此我们添加了一个可以提供帮助的 APOC functionapoc.agg.maxItems()

      apoc.agg.maxItems(item, value, groupLimit: -1) - 返回一个映射 {items:[], value:n} 其中value 是存在的最大值,items 是所有具有相同的值。可以选择限制项目的数量。

      MATCH (n:Animal)
      WITH n.species as species, apoc.agg.maxItems(n.size, n) as sizeData
      RETURN species, sizeData.value as size, sizeData.items as animals
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多