1

我有一个看起来像这样的图表 -

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

我需要确定是否在某个日期向某个客户提供了一项特定服务,比如名为“A”的服务,而没有另一项服务,比如名为“B”的服务,同一供应商也在同一日期提供。无论客户在某一天提交了多少订单,这都应该是正确的。换句话说,只要客户订购“A”,服务“A”就应始终与服务“B”在同一天由同一供应商提供。

这是我必须找到在同一天有“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 查询后,我决定来这里。

4

1 回答 1

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
于 2013-05-14T06:16:58.323 回答