Neo4j 3.0.1 Cypher查询返回单元素集合的集合

时间:2016-10-17 16:35:12

标签: neo4j cypher

如果我发出查询

match (x)
where x.property in [40,44]
with collect(distinct x.property) as xproperty
return xproperty

我得到了一组值(例如[40,44])

但是,如果我添加" x"到with子句:

match (x)
where x.property in [40,44]
with x, collect(distinct x.property) as xproperty
return xproperty

我得到了一个单元素集合的集合(例如[[40],[44]]

with子句中x的位置并不重要,也没有在with子句中给x一个别名。

这是Neo4j中的一个问题,还是我对事情如何运作的问题?

1 个答案:

答案 0 :(得分:2)

您对COLLECT()聚合的理解存在问题。当您指定WITH x, COLLECT(DISTINCT x.property)时,您要求它为每个 x创建值x.property 的值列表。当然,这个列表在每种情况下都是一个元素。您的第一个查询不提供像x这样的聚合键(非聚合值),因此它只将x.property的每个可能唯一值放入单个集合中,并将此集合作为单行返回。 / p>

每次在RETURNWITH期间聚合时,请记住您正在转换结果行列表,并且所有前进的对象或表达式都将包含在生成的行中。因此,如果您有两行x值,那么您将在包含WITH的{​​{1}}子句后获得两行。聚合在此基本框架内运行,取每个未聚合字段,查找这些字段的每个唯一组合值(称为“聚合键”),并为每个组合返回一行,以及计算的聚合来自原始行中的其他字段。