创建一个节点,并在Cypher Neo4j中为其分配表中一列的总和

创建一个节点,并在Cypher Neo4j中为其分配表中一列的总和,neo4j,cypher,cypher-3.1,Neo4j,Cypher,Cypher 3.1,我正试图找出如何在Cypher中实现OLAP操作汇总。 我一直在寻找如何创建一个节点,然后在Cypher中为其分配一列的总和。更具体地说,我正在努力实现这一结果: 使用此代码,我获得的结果如图所示: MATCH(p:Product) WITH sum(p.unitsInStock) as SommeUnits, p.supplierID as Supplier, p.reorderLevel as ReordLevel CREATE(reord:Product {productName : "T

我正试图找出如何在Cypher中实现OLAP操作汇总。 我一直在寻找如何创建一个节点,然后在Cypher中为其分配一列的总和。更具体地说,我正在努力实现这一结果: 使用此代码,我获得的结果如图所示:

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
关系:供应商-[:供应]->(产品) 产品属性:unitsInStock、产品名称、产品ID、unitsInOrder、供应商ID

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

SUM
使用同一(
WITH
RETURN
)子句中的非聚合项作为“分组键”。因此,您的
WITH
子句正在为每个不同的
SommeUnits/ReordLevel
组合生成一个
SommeUnits
值。并且将为每个
SommeUnits
值调用您的
CREATE

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

[更新]

最后,如果您希望执行上一个查询,但同时也要获取总体合计,则此查询将在每个返回的记录中将总体合计显示为第四个值:

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
匹配(p:Product),其中p.productName“TotalReord”
总和(p.unitsInStock)为u,p.reorderLevel为r,p.supplierID为s
以COLLECT({u:u,r:r,s:s})作为数据,SUM(u)作为总计
合并(t:Product{productName:“TotalReord”})
设置t.unitsInStock=总计
有数据,总计
将数据展开为d
返回d.r作为ReordLevel,d.s作为供应商,d.u作为SommeUnits,总计
按ReordLevel订购

谢谢你的回答,@cybersam。事实上,我刚刚意识到我分享的照片不是很好,所以我把它放在了原来的帖子里。第一列为ReordLevel,第二列为Suppliers,第三列为SommeUnits。事实上,我真正想做的是显示所有ReordLevel的SommeUnits(正如你在最后一行的照片中所看到的),以及每个ReordLevel的SommeUnits(例如:ReordLevel的所有单位之和为25,然后为30,等等)。我还尝试了你的第二个查询,但它不起作用。请求设置和展开之间的WITH时出错。我现在在
展开之前添加了一个
WITH
。我还添加了另一个查询,以获得总的总数(除了每个级别/供应商的SommeUnits组合)。
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