什么是一个节点的密码查询,但不是另一个节点?
问题描述:
我有一个看起来像这样的图形 -什么是一个节点的密码查询,但不是另一个节点?
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