我将属性设置为整数数组:
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.
我在做什么错,应该怎么办?非常感谢。
答案 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()
,它会接收一个列表并输出列表中所有元素的总和。