简体   繁体   English

密码分叉和收敛路径聚合

[英]Cypher diverging and converging path aggregate

I have a question regarding aggregates over multiple paths that converges and then diverges again. 我有一个问题,关于聚合在多个路径上会聚然后又发散的问题。 Some of the aggregates should then take only a subset of the paths into account, while others more. 然后,某些聚合应仅考虑路径的一部分,而其他聚合则应考虑更多。

I'll explain this as best I could using an example of product manufacturing. 我将使用产品制造示例来尽力解释这一点。 Let's say I've got a company producing 1 product, consisting of some material, supplied by a supplier. 假设我有一家公司生产1种产品,其中某种材料由供应商提供。 To be more specific, this company produces 5 items of one product type, consisting of 10 grams of a material. 更具体地说,该公司生产5种产品的一种产品,由10克材料组成。 Therefore during the manufacturing process they've used 50 grams of the material. 因此,在制造过程中,他们使用了50克这种材料。 But in production there's material waste, and they've actually used 70 grams, and wasted 20. 但是在生产过程中存在材料浪费,实际上他们消耗了70克,浪费了20克。

What I'd like to calculate is the corrected weight of material per product and supplier taking wastage into account. 我要计算的是考虑到浪费的每种产品和供应商的物料校正重量。 In this case, it's easy. 在这种情况下,这很容易。 70g 70克

生产简单

What happens when this becomes more complex: 当事情变得更加复杂时会发生什么: 复杂的生产

Now the corrected weight for material1 per product1 and supplier1 is 58.82 grams. 现在,每个产品1和供应商1的物料1的更正重量为58.82克。 This is the formula: 这是公式:

material composition = sum(production amount * product composition)
corrected weight = (production amount * product composition * 
                     (purchased / (material composition)))

ie

material composition = (5 * 10) + (20 * 40) = 850
corrected weight = (5 * 10 * (1000 / (850))) = 58.82

So, running a cypher query over this example should give me 6 results, as that is the number of permutations of products, materials and suppliers. 因此,在此示例上运行密码查询应该给我6个结果,因为这是产品,材料和供应商的排列数量。

Question is, how to write such a query. 问题是,如何编写这样的查询。 I've tried reduce functions, repeated with's, etc, but it always seems to aggregate over the wrong set of nodes... 我已经尝试过减少函数,用-重复等,但是它似乎总是在错误的节点集上聚合。

Just for completeness, here's the cypher to produce the graph: 为了完整起见,下面是生成图的密码:

Create: 创造:

create (c:Company {name:'test', id:'c1'}),  
       (p1:Product {name:'product1', id:'p1'}),  
       (p2:Product {name:'product2', id:'p2'}), 
       (m1:Material {name:'material1', id:'m1'}), 
       (m2:Material {name:'material2', id:'m2'}), 
       (s1:Supplier {name:'supplier1', id:'s1'}), 
       (s2:Supplier {name:'supplier2', id:'s2'}), 
       (s3:Supplier {name:'supplier3', id:'s3'})

Rels: 角色:

match (c:Company {id:'c1'}), 
    (p1:Product {id:'p1'}), 
    (m1:Material {id:'m1'})
    merge (c)<-[pb_r1:PRODUCED_BY {amount:5}]-(p1)-[co_r11:CONSISTS_OF {amount:10}]->(m1)
    with c, p1, m1
    match (p2:Product {id:'p2'})
    merge (c)<-[pb_r2:PRODUCED_BY {amount:20}]-(p2)-[co_r12:CONSISTS_OF {amount:40}]->(m1)
    with p1, p2, m1
    match (s1:Supplier {id:'s1'})
    merge (m1)-[pf_r1:PURCHASED_FROM {amount: 1000}]->(s1)
    with p1, p2
    match (m2:Material {id:'m2'})
    merge (p1)-[co_r21:CONSISTS_OF {amount:30}]->(m2)
    with p2, m2
    merge (p2)-[co_r22:CONSISTS_OF {amount:80}]->(m2)
    with m2
    match (s2:Supplier {id:'s2'})
    merge (m2)-[pf_r2:PURCHASED_FROM {amount: 1000}]->(s2)
    with m2
    match (s3:Supplier {id:'s3'})
    merge (m2)-[pf_r3:PURCHASED_FROM {amount: 1000}]->(s3)
// Selection of the supply chain and production by Company 
//
MATCH (C:Company {id:'c1'})
        <-[pb:PRODUCED_BY]-
      (P:Product)
        -[co:CONSISTS_OF]->
      (M:Material)
        -[pf:PURCHASED_FROM]->
      (S:Supplier)

// Grouping by materials, calculation material composition,
// and the preservation of the chain to the supplier
// 
WITH M,
     S, // group by supplier 
     SUM(pb.amount*co.amount) as mComp, 
     collect({
       product:P,
       prod: pb.amount, 
       comp: co.amount, 
       purchased: pf.amount
     }) as tmps

// Calculating the correct weight by material and supplier
// 
UNWIND tmps as tmp
RETURN M as material, 
       tmp['product'] as product, 
       S as supplier,
       1.0 * tmp['prod'] * tmp['comp'] * tmp['purchased'] / mComp as cWeight

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM