2013-05-14 113 views
1

我有一個看起來像這樣的圖形 -什麼是一個節點的密碼查詢,但不是另一個節點?

customer-hasOrder->order 
order-hasLineItem->orderLineItem 
orderLineItem-hasService->service 
orderLineItem-providedOn->providedOnDate 
orderLineItem-providedBy->vendor 

我需要確定一個特定的服務,說了一個名爲「A」的服務是沒有其他的服務提供給一些客戶對某些日期,說一個叫服務「B」也是同一個供應商在同一天提供的。無論客戶在某一天提交多少訂單,情況都是如此。換句話說,每當客戶訂購「A」時,應始終在同一天由同一供應商在服務「B」提供服務「A」。

這是我必須找到了在同一天「A」,而不是「B」客戶 -

START 
    s1 = node:service(id="A"), 
    s2 = node:service(id = "B"), 
MATCH 
    customer-[:hasOrder]->(o1)-[:hasLineItem]->li1-[:hasService]->s1, 
    customer-[:hasOrder]->(o2)-[:hasLineItem]->li2-[r?:hasService]->s2, 
    ol1-[:providedBy]->p1, 
    ol2-[:providedBy]->p2, 
    ol1-[:providedOn]->d1, 
    ol2-[:providedOn]->d2 
WHERE 
    d1 = d2 AND p1 = p2 AND r is null 
    RETURN customer 

我決定到這裏後我的鼻子開始流血,試圖找出Cypher支架爲此查詢。

回答

1

從不同的角度看它,彙總相關節點(客戶,供應商,日期)

START 
    service = node:service("id:(A B)"), 
MATCH 
    customer-[:hasOrder]->(order)-[:hasLineItem]->item-[:hasService]->service, 
    item-[:providedBy]->provider, 
    item-[:providedOn]->date 
WITH 
    customer,provider,date,count(distinct service) as service_count 
WHERE 
    service_count = 1 
RETURN customer,provider,date 

你也可以考慮路徑表達式來檢查如果其他訂單項存在相同的供應商和日期但不是服務B.

START 
    s1 = node:service(id="A"), 
    s2 = node:service(id="B"), 
MATCH 
    customer-[:hasOrder]->(o1)-[:hasLineItem]->li1-[:hasService]->s1, 
    customer-[:hasOrder]->(o2)-[:hasLineItem]->li2 
    li1-[:providedBy]->provider, 
    li2-[:providedBy]->provider, 
    li1-[:providedOn]->date, 
    li2-[:providedOn]->date 
WHERE 
    NOT (li2-[:hasService]->s2) 

RETURN customer 
相關問題