属性数组之和

时间:2018-07-21 20:25:09

标签: arrays neo4j sum cypher

我将属性设置为整数数组:

MATCH (n:Node) where id(n) = 1 set n.prop = [1,2,3,4]

,然后尝试调用该属性的总和:

MATCH (n:Node) where id(n) = 1 return sum(n.prop)

而不是10,我只收到错误声明:

SUM(n.prop) can only handle numerical values, or null.

我在做什么错,应该怎么办?非常感谢。

2 个答案:

答案 0 :(得分:0)

出现此错误的原因是,您正在传递sum列表,并且期望输入数字。您无法汇总列表。 ["Hello", "Goodbye"]的总和是多少?总和旨在用于执行总和整数属性之类的事情。

您可以使用reduce函数对列表中的项目求和,如下所示:

create (f:Foo { myList: [1,2,3,4,5] });

match (f:Foo) with f return reduce(total=0, number in f.myList | total + number);
+------------------------------------------------------+
| reduce(total=0, number in f.myList | total + number) |
+------------------------------------------------------+
| 15                                                   |
+------------------------------------------------------+

Reduce是list functions in cypher之一。 reduce真正要做的是获取一个列表并将其“缩减”为单个值。它如何知道如何减少?通过最后一个表达式。我们从零开始,添加数组中的任何项,然后继续执行直到数组减小为单个整数为止。

答案 1 :(得分:0)

Cypher中的聚合函数旨在跨行操作,而不是基于每行列表的内容。

您可以将列表取消缠绕回行,然后在各行中获取sum(),或者使用FrobberOfBits建议的reduce()函数方法。

作为补充,如果使用APOC Procedures,则收集帮助器函数之一是apoc.coll.sum(),它会接收一个列表并输出列表中所有元素的总和。