2016-05-15 25 views
0

我有一個關於在該收斂,然後再發散的多條路徑聚集的問題。一些聚合應該只考慮一部分路徑,而另一些則更多。暗號發散和收斂的路徑總

盡我可以用產品製造的一個例子,我會解釋這一點。 假設我有一家公司生產1種產品,由供應商提供的一些材料組成。 更具體地,本公司生產5個項目之一的產品類型的,由10克的材料製成。因此在製造過程中他們使用了50克的材料。但在生產中有材料的浪費,而實際上卻使用70克,並且浪費了20

我想什麼來計算每產品和供應商採取的浪費考慮材料的修正後的重量。在這種情況下,這很容易。 70克

simple production

會發生什麼事時,這變得更加複雜: complex production

現在每產品1和supplier1 material1的修正後的重量爲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分的結果,因爲這是產品,材料和供應商排列的數量。

的問題是,如何寫這樣的查詢。我試過減少功能,用的等重複的,但它似乎總是聚集在錯誤的節點集...

只是爲了完整性,這裏的生產圖的暗號:

創建:

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) 

回答

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 
+0

+1爲速效性! 幾乎正確,仍然只有一個問題,我從一開始就苦苦掙扎。 mComp總和也在供應商路徑上計算。所以,我們得到3500,而不是材料2的1750。 不知怎的,我需要能夠計算供應商的路徑之前得到的材料路徑。但匹配兩次會導致額外的路徑... – superkruger

+0

運行此以查看我的意思:MATCH(C:Company {id:'c1'}) < - [pb:PRODUCED_BY] - (P:Product) - [CO:CONSISTS_OF] - > (M:材料) - [PF:PURCHASED_FROM] - > (S:供應商) 具有m, SUM(pb.amount * co.amount)作爲MCOMP, 收集(產品:P.name,prod:pb.amount,comp:co.amount,購買:pf.amount,供應商:S.name })作爲tmps UNWIND tmps as tmp RETURN tmp ['product'] as產品,M.name作爲材料,tmp ['supplier']作爲供應商,mComp,1。0 * tmp ['prod'] * tmp ['comp'] * tmp ['購買']/mComp as cWeight – superkruger

+0

沒有SUM,它給出了基於產品的單個材料成分。但是,對於SUM,它還對供應商進行了總結: MATCH(C:Company {id:'c1'})< - [pb:PRODUCED_BY] - (P:Product) - [co:CONSISTS_OF] - > ) - [pf:PURCHASED_FROM] - >(S:Supplier)WITH M,(pb.amount * co.amount)as mComp,collect({product:P.name,prod:pb.amount,comp:co.amount,作爲產品,作爲物料的M.name,作爲供應商的tmp ['supplier'],作爲供應商的mComp,1.0 * tmp [作爲物料的M.name,作爲物料的M.name})作爲tmps UNWIND tmps作爲tmp返回tmp ['product' 'prod'] * tmp ['comp'] * tmp ['購買']/mComp as cWeight – superkruger