Neo4j:为什么结果不同?
我有密码查询:Neo4j:为什么结果不同?,neo4j,cypher,Neo4j,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 a
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”):
我不明白为什么结果会有差异?因为您使用的是
sum()
聚合函数
Cypher没有GROUP BY
子句(与传统的SQL数据库类似),但当您使用聚合函数时,所有非聚合字段都隐式用作分组字段
因此,当您从返回中删除p.Size
时,第一行与第二行分组,因为隐式分组的所有值都相等(p.Color='Black'
和onstock=3
)。另外,saled
列的值用于sum()
函数(0+1=1
),生成以下行:
Black,3,1
这是有道理的。。。但是我还是有点困惑。。。假设我只想按颜色分组,得到库存(12)和售出(4)的总和。。。如果我将return语句更改为:
将p.Color、sum(onstock)作为stock、sum(s.Quantity)作为sall返回
。这将返回17个库存(而不是12个),因为XL有2个销售(每个销售1个数量,但有5个库存)。。。。。不明白:(。。。。。
Black,3,1