Neo4j 在以下重复查找查询中使用和收集的说明

Neo4j 在以下重复查找查询中使用和收集的说明,neo4j,cypher,Neo4j,Cypher,我最近在研究如何通过属性查找重复节点,发现以下结果提供了非常有效的解决方案: 因为我使用的是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 我很难理解这是怎么回事。我的职业生涯一直在使用关系数据库,只是没有得到分组机制,这显然是因为

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




因为我使用的是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
我很难理解这是怎么回事。我的职业生涯一直在使用关系数据库,只是没有得到分组机制,这显然是因为我有一个节点列表和它们各自的计数

有人能解释一下它是如何工作的,或者提供一个解释的参考吗?

重要的一点是:

聚合函数接受多个输入值并计算 它们的总价值。例如,avg计算 多个数值的平均值,或找到最小值的最小值 一组值中的数值

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

因此,如果return语句如下所示:

返回n,计数(*)

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

如果要使用聚合对结果集进行排序,则 要在订单中使用,退货中必须包含聚合 由

您的查询相当简单:

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

您只是在
块中进行聚合,而不是在
返回块中进行聚合。在本例中,
collect()
不是一个聚合函数(我知道,这个术语似乎有点奇怪),而是
count(*)
。因此,根据分组键,您的查询被划分为不同的存储桶;您的查询在这里有点奇怪,
prop
似乎是您的分组键。不确定您是否有意这样做,这取决于您的查询的语义。

这稍微澄清了一点。当使用分组函数返回表达式时,cypher中的分组是隐式的,如11.5文档的第一部分所示。我直接跳到了函数定义,但没有看到。