【问题标题】:Cypher diverging and converging path aggregateCypher 发散和收敛路径聚合
【发布时间】:2016-05-15 13:49:15
【问题描述】:

我有一个关于多条路径聚合然后再次发散的问题。然后,一些聚合应该只考虑路径的一个子集,而其他聚合应该更多。

我将尽可能使用产品制造示例来解释这一点。 假设我有一家公司生产一种由供应商提供的由某种材料组成的产品。 更具体地说,这家公司生产一种产品类型的 5 件产品,由 10 克一种材料组成。因此,在制造过程中,他们使用了 50 克的材料。但是在生产中存在材料浪费,他们实际上使用了 70 克,浪费了 20 克。

我想计算的是每件产品和供应商考虑到浪费的材料的校正重量。在这种情况下,这很容易。 70克

当这变得更复杂时会发生什么:

现在每个产品 1 和供应商 1 的材料 1 的校正重量为 58.82 克。 这是公式:

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

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

因此,对这个示例运行密码查询应该会给我 6 个结果,因为这是产品、材料和供应商的排列数量。

问题是,如何编写这样的查询。我尝试过 reduce 函数,重复 with's 等,但它似乎总是聚集在错误的节点集上......

为了完整起见,这里是生成图表的密码:

创建:

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'})

相对:

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)

【问题讨论】:

    标签: neo4j cypher aggregates


    【解决方案1】:
    // 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
    

    【讨论】:

    • +1 以获得快速结果!几乎正确,仍然只有一个问题,我从一开始就在努力解决。 mComp 总和也在供应商路径上计算。所以,我们得到 3500,而不是 material2 的 1750。不知何故,我需要能够在计算供应商路径之前获得材料路径。但是匹配两次无论如何都会导致额外的路径......
    • 运行这个看看我的意思:MATCH (C:Company {id:'c1'}) (M:Material) -[pf:PURCHASED_FROM]-> (S:Supplier) WITH M, SUM(pb.amount*co.amount) as mComp, collect({ product:P.name, prod: pb.amount, comp : co.amount, 购买: pf.amount, 供应商: S.name }) as tmps UNWIND tmps as tmp RETURN tmp['product'] as product, M.name as material, tmp['supplier'] as supplier, mComp ,1.0 * tmp['prod'] * tmp['comp'] * tmp['purchased'] / mComp as cWeight
    • 如果没有 SUM,它会根据产品给出单独的材料成分。但是使用 SUM,它也对供应商求和: MATCH (C:Company {id:'c1'}) (M:Material) -[pf:PURCHASED_FROM]-> (S:Supplier) WITH M, (pb.amount*co.amount) as mComp, collect({ product:P.name, prod: pb.amount, comp: co.amount, 购买: pf.amount, supplier: S.name }) as tmps UNWIND tmps as tmp RETURN tmp['product'] as product, M.name as material, tmp['supplier'] as supplier, mComp,1.0 * tmp[' prod'] * tmp['comp'] * tmp['purchased'] / mComp as cWeight
    • @superkruger - 我已更新查询(按供应商添加分组) - 现在金额必须正确。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2017-05-21
    • 2013-08-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多