Recursion 具有子图聚合的递归查询

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

我正在尝试使用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 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票。只是你把一些部分复杂化了。但顺便说一句,我问了一个单独的问题,这里的任意深度查询是有效的,谢谢你的回答。您知道我需要添加哪些索引以最大限度地提高性能吗?对于此查询,需要存储名称索引。如果存储名称是唯一的,那么这应该是一个唯一的约束。是否可以为任意深度的图形重写此查询?我在这里为有效的任意深度查询问了一个单独的问题,谢谢您的回答。您知道我需要添加哪些索引以最大限度地提高性能吗?对于此查询,需要存储名称索引。如果存储名称是唯一的,那么这应该是一个唯一的约束。是否可以为任意深度图重写此查询?我在这里为任意深度查询问了一个单独的问题