我有以下查询:
这个返回预期的结果:
MATCH (u:User)-[pw_rel:PAYED_WITH]->(ext_acc:ExtAccount)
WHERE pw_rel.processed_at > 0
WITH u, COUNT(DISTINCT ext_acc) as accs
WHERE accs > 2
RETURN u
虽然这个没有返回任何东西:
MATCH (u:User)-[pw_rel:PAYED_WITH]->(ext_acc:ExtAccount)
WITH u, pw_rel, ext_acc, COUNT(DISTINCT ext_acc) as accs
WHERE pw_rel.processed_at > 0 AND accs > 2
RETURN u
为什么?我错过了什么?
答案 0 :(得分:1)
这与聚合有关,在其他列的上下文中意味着什么。也就是说,存在的其他非聚合列充当分组密钥。
在您的第一个查询中,您唯一的分组键是u。这意味着您的输出是每个用户的所有分机帐户的计数。
在第二个查询中,您的分组键包括u,pw_rel,ext_acc。因此,它返回每个用户/ pw-rel / ext_acc组合(或行)的所有分机帐户的计数。这不是很有帮助,因为您可能会在每一行中获得一个计数,因此没有行会通过计数的WHERE子句> 2.即使您删除了WITH中的ext_acc列,pw-rel列仍然会将您限制为1(因为每个用户只有一个ext_acc / pw_rel)。
应该很容易看到其他列修改了聚合函数的分组内容以及您将返回的列。
count(ext_acc) - 所有分机账户的总数
u,count(ext_acc) - 用户,以及每个用户的分机帐户数
u,pw_rel,count(ext_acc) - 用户,付费关系,每个用户的所有外部帐户的计数以及来自该用户的付费关系
u,pw_rel,ext_acc,count(ext_acc) - 用户,付费关系,分机帐户以及每个用户的所有外部帐户的计数以及从该用户到特定分机帐户的付款关系。