Recursion 具有子图聚合的递归查询
我正在尝试使用Neo4j编写一个查询,该查询沿着特定的子图聚合数量 我们有两个商店Recursion 具有子图聚合的递归查询,recursion,neo4j,cypher,Recursion,Neo4j,Cypher,我正在尝试使用Neo4j编写一个查询,该查询沿着特定的子图聚合数量 我们有两个商店Store1和Store2一个是供应商S1另一个是供应商S2。我们将100个单位从Store1移至Store3,将200个单位从Store2移至Store3 然后我们将100个单元从Store3移动到Store4。因此,现在Store4有100台,其中大约33台来自供应商S1,66台来自供应商S2 我需要查询来有效地返回此信息,例如 S1,33 S2,66 我有一个递归查询来聚合每条路径上的所有移动 MATCH
Store1
和Store2
一个是供应商S1
另一个是供应商S2
。我们将100个单位从Store1
移至Store3
,将200个单位从Store2
移至Store3
然后我们将100个单元从Store3
移动到Store4
。因此,现在Store4
有100台,其中大约33台来自供应商S1
,66台来自供应商S2
我需要查询来有效地返回此信息,例如
S1,33S2,66 我有一个递归查询来聚合每条路径上的所有移动
MATCH p=(store1:Store)-[m:MOVE_TO*]->(store2:Store { Name: 'Store4'})
RETURN store1.Supplier, reduce(amount = 0, n IN relationships(p) | amount + n.Quantity) AS reduction
返回:
|店面1.供应商|减少||--------------------|------------|
|S1 | 200 |
|S2 | 300 |
|空| 100 | 所需: |店面1.供应商|减少|
|---------------------|-------------|
|S1 | 33.33 |
|S2 | 66.67 |所以下面的内容很难看,但它适用于您给出的示例
MATCH (s4:Store { Name:'Store4' })<-[r1:MOVE_TO]-(s3:Store)<-[r2:MOVE_TO*]-(s:Store)
WITH s3, r1.Quantity as Factor, SUM(REDUCE(amount = 0, r IN r2 | amount + r.Quantity)) AS Total
MATCH (s3)<-[r1:MOVE_TO*]-(s:Store)
WITH s.Supplier as Supplier, REDUCE(amount = 0, r IN r1 | amount + r.Quantity) AS Quantity, Factor, Total
RETURN Supplier, Quantity, Total, toFloat(Quantity) / toFloat(Total) * Factor as Proportion
MATCH(s4:Store{Name:'Store4'})所以下面的代码非常难看,但它适用于您给出的示例
MATCH (s4:Store { Name:'Store4' })<-[r1:MOVE_TO]-(s3:Store)<-[r2:MOVE_TO*]-(s:Store)
WITH s3, r1.Quantity as Factor, SUM(REDUCE(amount = 0, r IN r2 | amount + r.Quantity)) AS Total
MATCH (s3)<-[r1:MOVE_TO*]-(s:Store)
WITH s.Supplier as Supplier, REDUCE(amount = 0, r IN r1 | amount + r.Quantity) AS Quantity, Factor, Total
RETURN Supplier, Quantity, Total, toFloat(Quantity) / toFloat(Total) * Factor as Proportion
MATCH(s4:Store{Name:'Store4'})这个怎么样:
MATCH (s:Store) WHERE s.name = 'Store4'
MATCH (s)<-[t:MOVE_TO]-()<-[r:MOVE_TO]-(supp)
WITH t.qty as total, collect(r) as movements
WITH total, movements, reduce(totalSupplier = 0, r IN movements | totalSupplier + r.qty) as supCount
UNWIND movements as movement
RETURN startNode(movement).name as supplier, round(100.0*movement.qty/supCount) as pct
这个怎么样:
MATCH (s:Store) WHERE s.name = 'Store4'
MATCH (s)<-[t:MOVE_TO]-()<-[r:MOVE_TO]-(supp)
WITH t.qty as total, collect(r) as movements
WITH total, movements, reduce(totalSupplier = 0, r IN movements | totalSupplier + r.qty) as supCount
UNWIND movements as movement
RETURN startNode(movement).name as supplier, round(100.0*movement.qty/supCount) as pct
您是否在每次移动库存时都在门店之间添加关系?如果是这样,那么您需要查询关系属性的聚合?每次移动库存时,我们都会向
关系添加一个MOVE\u。我可以查询关系属性的聚合,但需要对每个级别的属性进行求和,我认为可能我遗漏了一些东西,但您的图表中没有任何内容实际指示移动到存储4的100个单元中有多少是最初从存储1或存储2移动的。您是否假设它始终与移动到存储3的百分比成比例?如果是这样的话,我认为您需要通过计算从store 4开始的每个分支的“权重”并按照相反的关系来反转问题。@Pat假设是正确的,从每个门店移动到门店的金额4与他们对门店3的贡献成比例。您是否在每次移动库存时在门店之间添加关系?如果是这样,那么您需要查询关系属性的聚合?每次移动库存时,我们都会向
关系添加一个MOVE\u。我可以查询关系属性的聚合,但需要对每个级别的属性进行求和,我认为可能我遗漏了一些东西,但您的图表中没有任何内容实际指示移动到存储4的100个单元中有多少是最初从存储1或存储2移动的。您是否假设它始终与移动到存储3的百分比成比例?如果是这样的话,我认为您需要通过计算从store 4开始的每个分支的“权重”并按照相反的关系来扭转问题。@Pat假设是正确的,从每个store移动到store4的金额与它们对Store3的贡献成正比。我对您的尝试投了+1票。只是你把一些部分复杂化了。但是顺便说一句,我问了一个关于任意深度查询的单独问题,我对你的尝试投了+1票。只是你把一些部分复杂化了。但顺便说一句,我问了一个单独的问题,这里的任意深度查询是有效的,谢谢你的回答。您知道我需要添加哪些索引以最大限度地提高性能吗?对于此查询,需要存储名称索引。如果存储名称是唯一的,那么这应该是一个唯一的约束。是否可以为任意深度的图形重写此查询?我在这里为有效的任意深度查询问了一个单独的问题,谢谢您的回答。您知道我需要添加哪些索引以最大限度地提高性能吗?对于此查询,需要存储名称索引。如果存储名称是唯一的,那么这应该是一个唯一的约束。是否可以为任意深度图重写此查询?我在这里为任意深度查询问了一个单独的问题