以下重复查找查询中WITH和COLLECT的说明

时间:2015-07-25 14:50:26

标签: neo4j cypher

我最近在研究如何通过属性查找重复节点,并发现以下结果提供了一个非常有效的解决方案:

neo4j find all nodes with matching properties
An effective way to lookup duplicate nodes in Neo4j 1.8?

由于我使用的是Neo4j v2.2.3社区,我使用了以下风格:

match (n:Label) with n.prop as prop, collect(n) as nodelist, count(*) as count where count > 1 return prop, nodelist, count

我无法理解其工作原理。我的职业生涯一直使用关系数据库而且没有获得分组机制,这显然存在,因为我得到了节点列表及其各自的计数。

有人可以解释一下这是如何运作的,也可以提供解释参考?

1 个答案:

答案 0 :(得分:0)

Here's the relevant documentation on aggregation in cypher

重要的一点是:

  

聚合函数采用多个输入值并计算   来自他们的汇总价值。例子是计算的平均值   多个数值的平均值,或找到最小值的min   一组值中的数值。

     

聚合可以在所有匹配的子图上完成,也可以   通过引入关键值进一步划分。这些是非聚合的   表达式,用于对进入的值进行分组   聚合函数。

     

所以,如果return语句看起来像这样:

     

RETURN n,count(*)

     

我们有两个返回表达式:n和count()。第一个,n,是   聚合函数,因此它将成为分组键。后者,   count()是一个聚合表达式。所以匹配的子图将是   根据分组键分为不同的桶。该   然后聚合函数将在这些桶上运行,计算出   总价值。

     

如果您想使用聚合来对结果集进行排序,那么   聚合必须包含在RETURN中才能在ORDER中使用   BY

您的查询相当简单:

match (n:Label) 
with n.prop as prop, 
     collect(n) as nodelist, 
     count(*) as count 
where count > 1 
return prop, nodelist, count

您只是在with块而不是return块中进行聚合。在这种情况下,collect()不是一个聚合函数(我知道,这个术语看起来有点奇怪),但count(*)是。prop。因此,根据分组键,您的查询将分为不同的桶;您的查询有点奇怪,Database似乎是您的分组键。不确定您是否打算这样做,这取决于查询的语义。