gpt4 book ai didi

recursion - 带有子图聚合的递归查询(任意深度)

转载 作者:行者123 更新时间:2023-12-04 14:43:59 26 4
gpt4 key购买 nike

我问了一个问题 earlier关于沿图聚合数量。提供的两个答案效果很好,但现在我试图将 Cypher 查询扩展到可变深度图。

总而言之,我们从一堆叶子商店开始,它们都与特定供应商相关联,这是 Store 上的一个属性。节点。然后将库存转移到其他商店,每个供应商的比例对应于他们对原始商店的贡献。

所以对于节点 B02 , S2投稿 750/1250 = 60%S3投稿 40% .然后我们移动 600 个单位的 B02其中60%属于S240%S3等等。

enter image description here

我们想知道最终 700 个单位的百分比是多少 D01属于每个供应商。其中同名供应商为同一供应商。所以对于上图我们期望:

S1, 38.09
S2, 27.61
S3, 34.28



我已经使用这个 Cypher 脚本准备了一个图表:
CREATE (A01:Store {Name: 'A01', Supplier: 'S1'})
CREATE (A02:Store {Name: 'A02', Supplier: 'S1'})
CREATE (A03:Store {Name: 'A03', Supplier: 'S2'})
CREATE (A04:Store {Name: 'A04', Supplier: 'S3'})
CREATE (A05:Store {Name: 'A05', Supplier: 'S1'})
CREATE (A06:Store {Name: 'A06', Supplier: 'S1'})
CREATE (A07:Store {Name: 'A07', Supplier: 'S2'})
CREATE (A08:Store {Name: 'A08', Supplier: 'S3'})

CREATE (B01:Store {Name: 'B01'})
CREATE (B02:Store {Name: 'B02'})
CREATE (B03:Store {Name: 'B03'})
CREATE (B04:Store {Name: 'B04'})

CREATE (C01:Store {Name: 'C01'})
CREATE (C02:Store {Name: 'C02'})

CREATE (D01:Store {Name: 'D01'})

CREATE (A01)-[:MOVE_TO {Quantity: 750}]->(B01)
CREATE (A02)-[:MOVE_TO {Quantity: 500}]->(B01)
CREATE (A03)-[:MOVE_TO {Quantity: 750}]->(B02)
CREATE (A04)-[:MOVE_TO {Quantity: 500}]->(B02)
CREATE (A05)-[:MOVE_TO {Quantity: 100}]->(B03)
CREATE (A06)-[:MOVE_TO {Quantity: 200}]->(B03)
CREATE (A07)-[:MOVE_TO {Quantity: 50}]->(B04)
CREATE (A08)-[:MOVE_TO {Quantity: 450}]->(B04)

CREATE (B01)-[:MOVE_TO {Quantity: 400}]->(C01)
CREATE (B02)-[:MOVE_TO {Quantity: 600}]->(C01)
CREATE (B03)-[:MOVE_TO {Quantity: 100}]->(C02)
CREATE (B04)-[:MOVE_TO {Quantity: 200}]->(C02)

CREATE (C01)-[:MOVE_TO {Quantity: 500}]->(D01)
CREATE (C02)-[:MOVE_TO {Quantity: 200}]->(D01)

当前查询是这样的:
MATCH (s:Store { Name:'D01' })
MATCH (s)<-[t:MOVE_TO]-()<-[r:MOVE_TO]-(supp)
WITH t.Quantity as total, collect(r) as movements
WITH total, movements, reduce(totalSupplier = 0, r IN movements | totalSupplier + r.Quantity) as supCount
UNWIND movements as movement
RETURN startNode(movement).Supplier as Supplier, round(100.0*movement.Quantity/supCount) as pct

我正在尝试使用递归关系,大致如下:
MATCH (s)<-[t:MOVE_TO]-()<-[r:MOVE_TO*]-(supp)

但是,这为终端节点提供了多条路径,我需要在我认为的每个节点上汇总库存。

最佳答案

正如我之前所说,我喜欢这个问题。我知道您已经接受了一个答案,但我决定发布我的最终回复,因为它也无需客户端努力即可返回百分位数(这意味着您还可以在节点上执行 SET 以在需要时更新数据库中的值)和当然,如果出于任何其他原因,我可以回来:)
这是 console example 的链接

它返回一行包含商店名称、从所有供应商转移到它的总和以及每个供应商的百分位数

MATCH p =s<-[:MOVE_TO*]-sup
WHERE HAS (sup.Supplier) AND NOT HAS (s.Supplier)
WITH s,sup,reduce(totalSupplier = 0, r IN relationships(p)| totalSupplier + r.Quantity) AS TotalAmountMoved
WITH sum(TotalAmountMoved) AS sumMoved, collect(DISTINCT ([sup.Supplier, TotalAmountMoved])) AS MyDataPart1,s
WITH reduce(b=[], c IN MyDataPart1| b +[{ Supplier: c[0], Quantity: c[1], Percentile: ((c[1]*1.00))/(sumMoved*1.00)*100.00 }]) AS MyData, s, sumMoved
RETURN s.Name, sumMoved, MyData

关于recursion - 带有子图聚合的递归查询(任意深度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com