Neo似乎从大量关系的合计中返回了不正确的值。 注意:我正在使用Neo浏览器进行所有查询。
我首先创建一些简单的示例数据:

CREATE (p:PERSON)
CREATE (e:EVENT)
WITH range(0, 100000) AS list, p, e
UNWIND list AS val
CREATE (p)-[:ATTENDED {val: val}]->(e)
然后运行我的聚合:
MATCH (:PERSON)-[a:ATTENDED]->(:EVENT)
RETURN avg(a.val)
我得到的值是7050.7 ...而不是预期的50000。我也运行了countminmax聚合,它们都符合预期(分别为100001、0、100000)。
我的代码有问题吗?还是Neo浏览器有某种限制?或者是其他东西...?
注意:
如果我运行相同的查询,但仅创建范围为10000:
...
WITH range(0, 10000) AS list, p, e
...
我从合计中获得期望值。

最佳答案

这似乎是32位无符号integer overflow的结果。

如果您更改查询以返回总和,那么您还会看到错误的结果:

MATCH (:PERSON)-[a:ATTENDED]->(:EVENT)
RETURN SUM(a.val);

代替5000050000(50000*100001的结果),返回的总和将近似为705082704(实际的总和取决于导致溢出发生的值)。

最大的无符号32位整数值为4294967295(或2 ^ 32-1)。如果将其加到705082704或任何金额上,您的总数将接近预期的5000050000。通常不会完全是期望值,因为溢出通常发生在“加一个数字的中间”而不是“开始”。

如果您的查询将值转换为浮点数,您将看到预期的结果:
MATCH (:PERSON)-[a:ATTENDED]->(:EVENT)
RETURN AVG(TOFLOAT(a.val))

或者,如果您存储了浮点属性值,则原始查询可以运行:
CREATE (p:PERSON)
CREATE (e:EVENT)
WITH RANGE(0, 100000) AS list, p, e
UNWIND list AS val
CREATE (p)-[:ATTENDED {val: TOFLOAT(val)}]->(e);

10-06 14:59