Neo4j:为什么结果有差异?

时间:2017-09-06 12:06:33

标签: neo4j cypher

我有Cypher查询:

match(p:Product {StyleNumber : "Z94882A", Color: "Black"})--(stock:Stock {Retailer: "11"}) 
with  sum(stock.Stockcount) as onstock, p
optional match(p)-->(s:Sale {Retailer : "11"}) 
where s.Date = 20170801 
return p.Color,p.Size, onstock as stock, sum(s.Quantity) as sold

这正确地给出了:

Color,Size,Stock,Sold
Black,M,3,0
Black,S,3,1
Black,L,1,1
Black,XL,5,2

但是如果我在return语句中省略了Size属性,只返回:

return p.Color, onstock as stock, sum(s.Quantity) as sold

这只返回3行(大小" M"缺失):

Black,3,1
Black,1,1
Black,5,2

我无法弄清楚为什么结果会有差异?

1 个答案:

答案 0 :(得分:2)

因为您使用的是sum()聚合函数。

Cypher没有GROUP BY子句(与传统的SQL数据库一样),但是当您使用聚合函数时,所有非聚合字段都会隐式用作分组字段。

因此,当您从return中删除p.Size时,第一行将与第二行分组,因为隐式分组的所有值都是等于(p.Color = 'Black'onstock = 3)。此外,Sold列的值在sum()函数(0 + 1 = 1)中使用,生成行:

Black,3,1