0

我试图弄清楚如何在 Cypher 中实现 OLAP 操作汇总。我一直在寻找如何创建节点,然后将其分配给 Cypher 中表的列的总和。更具体地说,我正在尝试实现此结果: 代码结果 [EDITED] 使用此代码,我获得了如图所示的结果:

MATCH(p:Product)
WITH sum(p.unitsInStock) as SommeUnits, p.supplierID as Supplier, p.reorderLevel as ReordLevel
CREATE(reord:Product {productName : "TotalReord", unitsInStock : SommeUnits})
RETURN ReordLevel,Supplier, SommeUnits
ORDER BY ReordLevel

关系:Supplier-[:SUPPLIES]->(Product) 产品属性:unitsInStock、productName、productId、unitsInOrder、supplierID

问题是这段代码不能正常工作,因为它不仅生成一个节点,而且生成多个节点,而且我得到的结果只有在我播放两次查询时才能获得。

4

1 回答 1

1

聚合函数,如使用相同 ( or ) 子句SUM中的非聚合项作为“分组键”。因此,您的子句正在为每个不同的组合生成一个值。并且您的每个值都被调用。WITHRETURNWITHSommeUnitsSommeUnits/ReordLevelCREATESommeUnits

此查询应该可以正常工作(假设您希望每个返回的记录都具有相同的SommeUnits值):

MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS SommeUnits, COLLECT(p) AS ps
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = SommeUnits
WITH ps, SommeUnits
UNWIND ps AS p
RETURN p.reorderLevel AS ReordLevel, p.supplierID AS Supplier, SommeUnits
ORDER BY ReordLevel

此查询用于MERGE避免每次调用此查询时创建重复的“TotalReord”节点。并且该WHERE子句过滤掉“TotalReord”节点,以便unitsInStock在计算新总和时不会使用其现有值,从而对其进行膨胀。

如果您实际上希望每个返回的记录都具有该记录SommeUnits/ReordLevel组合的总和,您可以这样做:

MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS u, p.reorderLevel AS r, p.supplierID AS s
WITH COLLECT({u:u, r:r, s:s}) AS data, SUM(u) AS total
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = total
WITH data
UNWIND data AS d
RETURN d.r AS ReordLevel, d.s AS Supplier, d.u AS SommeUnits
ORDER BY ReordLevel

[更新]

最后,如果您想执行前面的查询,但还想得到总和,这个查询将显示总和作为每条返回记录中的第四个值:

MATCH(p:Product) WHERE p.productName <> "TotalReord"
WITH SUM(p.unitsInStock) AS u, p.reorderLevel AS r, p.supplierID AS s
WITH COLLECT({u:u, r:r, s:s}) AS data, SUM(u) AS total
MERGE(t:Product {productName: "TotalReord"})
SET t.unitsInStock = total
WITH data, total
UNWIND data AS d
RETURN d.r AS ReordLevel, d.s AS Supplier, d.u AS SommeUnits, total
ORDER BY ReordLevel
于 2019-02-06T20:26:51.717 回答