微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

奇怪的 Neo4j Cypher Aggregator 行为与 WITH 子句

如何解决奇怪的 Neo4j Cypher Aggregator 行为与 WITH 子句

下面的查询工作正常:

Match (x1:A) with x1 
optional Match (x1)-[:A_B]-(x2:B) 
with x1,count(x2) as x3 
where x1.foo= 'bar' and (x3 = 1) 
return disTINCT x1 as A 
SKIP 0 
LIMIT 10

但是这个查询给出了错误输出

Match (x1:A) with x1 
optional Match (x1)-[:A_B]-(x2:B) 
with x1,x2,count(x2) as x3 
where x1.foo= 'bar' and (x3 = 1) 
return disTINCT x1 as A 
SKIP 0 
LIMIT 10

解决方法

这没有错,这只是对在 Cypher 中聚合时隐式分组键的工作方式的一种误解。

聚合时,非聚合术语成为分组键,这是聚合内容的上下文。

主要区别在于聚合时的 WITH 子句。在第一个查询中,您有:

with x1,count(x2) as x3 

您对 count(x2) 的汇总是每个 x1。因此,每个不同的 x1 节点,关联的 x2 节点的数量。

在您的第二个查询中,变量不同,因此分组键不同:

with x1,x2,count(x2) as x3 

对于 x1 和 x2,该特定 x2 的计数是多少?如果有多行具有相同的 x1x2 节点,那么您可能有一些计数 > 1。但如果该特定 x1 和 {{1} 只有一行} 节点,则计数为 1。

编辑

如果您想获得每个 x1 的 x2 计数,然后继续使用 x2 节点,那么您需要在计算 (x2) 的同时收集 (x2)(因为它是一个聚合项,它不是分组键的一部分)。然后您可以将列表展开回行。

您的查询实际上并未使用 x2 节点,因此我们实际上不必对它们做任何事情,但无论如何我都会展示该技术:

x2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。