Что такое шифрованный запрос для одного узла, но не для другого?

У меня есть график, который выглядит так -

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

Мне нужно определить, была ли конкретная услуга, скажем, услуга с именем «А», предоставлена ​​какому-либо клиенту в какую-то дату без другой услуги, скажем, услуги с именем «Б», которая также предоставляется в тот же день тем же поставщиком. Это должно быть верно независимо от того, сколько заказов было отправлено клиентом в данный день. Другими словами, услуга «А» всегда должна предоставляться в тот же день, что и услуга «Б», одним и тем же поставщиком каждый раз, когда клиент заказывает «А».

Вот что мне нужно, чтобы найти клиентов, у которых в один и тот же день было "А", но не "Б" -

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 для этого.


person user2379723    schedule 14.05.2013    source источник


Ответы (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
person Michael Hunger    schedule 14.05.2013