我最近在研究如何通过属性查找重复节点,并发现以下结果提供了一个非常有效的解决方案:
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
我无法理解其工作原理。我的职业生涯一直使用关系数据库而且没有获得分组机制,这显然存在,因为我得到了节点列表及其各自的计数。
有人可以解释一下这是如何运作的,也可以提供解释参考?
答案 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
似乎是您的分组键。不确定您是否打算这样做,这取决于查询的语义。