Neo4j Cypher聚合函数在WITH子句中发生变化

Neo4j Cypher聚合函数在WITH子句中发生变化,neo4j,cypher,aggregate-functions,Neo4j,Cypher,Aggregate Functions,我是Neo4j新手,对平均函数有问题 我有一个银行账户(节点)和它们之间的付款(关系)的测试数据库 我想计算每对账户之间(即A&B之间、A&C之间、B&C之间等)付款的平均值,然后找出高于平均值50美元的任何付款 我的代码如下所示: MATCH (a)-[r:Payment]-(b) WITH a, b, AVG(ToFloat(r.Amount)) AS Average, ToFloat(r.Amount) as Amount WHERE Amount-Average>50 RETURN

我是Neo4j新手,对平均函数有问题

我有一个银行账户(节点)和它们之间的付款(关系)的测试数据库

我想计算每对账户之间(即A&B之间、A&C之间、B&C之间等)付款的平均值,然后找出高于平均值50美元的任何付款

我的代码如下所示:

MATCH (a)-[r:Payment]-(b)
WITH a, b, AVG(ToFloat(r.Amount)) AS Average, ToFloat(r.Amount) as Amount
WHERE Amount-Average>50
RETURN a, b, Amount-Average AS Difference
如果我在WITH子句中只留下一个and Average,它似乎可以正确地计算平均值,但是如果我添加其他任何内容(r或r.Amount子句),那么平均值函数输出会发生变化,并且只返回与“Amount”相同的值(因此它会将每个关系的“差”计算为0)

是否我匹配节点和关系的方式没有正确地找到每对帐户之间的关系,然后对它们进行平均,这将导致错误


提前谢谢

这是Cypher在执行聚合时隐式分组的结果。分组键(分组发生的上下文)是隐式的,由WITH或RETURN子句上的非聚合变量构成

这就是为什么当您包括
r
r.amount
时,输出会发生变化,因为您将计算相同关系或相同金额的平均值(单个值的平均值就是该值)

由于您希望根据平均值计算和过滤节点之间的所有金额,因此在计算平均值时应收集金额,然后过滤/转换返回的内容

此外,您还需要对
a
b
进行一些过滤,以确保不返回镜像结果(除了
a
b
的节点被交换外,相同节点的结果相同),因此我们将对节点ID进行限制,以确保仅在单个方向上的顺序:

MATCH (a)-[r:Payment]-(b)
WHERE id(a) < id(b) // ensure we don't get mirrored results
WITH a, b, AVG(ToFloat(r.Amount)) AS Average, collect(ToFloat(r.Amount)) as Amounts
WITH a, b, [amt in Amounts WHERE amt-Average > 50 | amt - Average] as Differences
RETURN a, b, Differences
匹配(a)-[r:付款]-[b)
其中id(a)50的金额中的金额|平均金额]作为差异
返回a、b、差异

如果您希望每行都有单独的结果,那么您可以在返回之前解开
差异
列表。

我不能100%确定我是否理解您的第四行,但它非常有效,谢谢!在输出中,我发现了如何更改输出,我只需要修复我的列表索引(对不起,我还是个新手!)来澄清第4行中发生了什么,这是一种同时进行列表过滤和提取的方法。对于列表中的每个元素,我们应用WHERE子句仅保持元素满足谓词,然后
|
符号将其与值在列表中的投影分离(在本例中,对于通过过滤器的每个
amt
),使用
amt-Average
)。