什么是一个节点的密码查询,但不是另一个节点?

问题描述:

我有一个看起来像这样的图形 -什么是一个节点的密码查询,但不是另一个节点?

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支架为此查询。

从不同的角度看它,汇总相关节点(客户,供应商,日期)

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