Neo4j 在Cypher中聚合后返回节点
我很难理解如何在Cypher中正确使用聚合函数 假设我有标记为动物的节点,具有属性、大小和种类。 对于每个物种,我想得到最大的 到目前为止,我了解我可以通过以下方式实现:Neo4j 在Cypher中聚合后返回节点,neo4j,cypher,Neo4j,Cypher,我很难理解如何在Cypher中正确使用聚合函数 假设我有标记为动物的节点,具有属性、大小和种类。 对于每个物种,我想得到最大的 到目前为止,我了解我可以通过以下方式实现: MATCH (n:Animal) WITH n.species as species, max(n.size) as size RETURN species, size 我将有效地获得相应种类的最大尺寸 但是我怎样才能得到节点而不是物种呢 由于WITH语句,我无法返回n,也无法将其注入WITH,因为它将破坏物种聚合 我知道这
MATCH (n:Animal)
WITH n.species as species, max(n.size) as size
RETURN species, size
我将有效地获得相应种类的最大尺寸
但是我怎样才能得到节点而不是物种呢
由于WITH语句,我无法返回n,也无法将其注入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
这是解决问题的办法吗?对我来说,所有节点都是在这里获取的,这似乎有点冗长且效率不高,难道没有更简单的选项吗?因为MAX aggregation函数不会返回具有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;
这是我们的max和min聚合函数经常遇到的限制,因此我们添加了一个有帮助的:apoc.agg.maxItems: apoc.agg.maxItemsitem,value,groupLimit:-1-返回一个映射{items:[],value:n},其中value是存在的最大值,并且项都是具有相同值的项。可以选择限制项目的数量
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