我想查询Neo4j图的结构,该结构包括两个可互换的节点,但是我不希望每个“对称”响应都有两个唯一的响应。
我如何在Cypher中表示两个节点可以互换?
我想通过以下查询在图形中查找以下结构:
MATCH (c:Customer)-[]->(p:Purchase)
MATCH (c:Customer)-[]->(q:Purchase)
MATCH (p)-[]->(m:Company)
MATCH (q)-[]->(m:Company)
RETURN DISTINCT c, p, q, m
对于Neo4j,默认行为是返回以下两个图形:
(即p
和q
到Purchase1
和Purchase2
的分配是相反的)
如何表达查询中的元素p
和q
是可互换的,而我只需要上述响应之一?
答案 0 :(得分:1)
为防止发生此类结果,通常会基于节点ID产生不等式:
WHERE id(p) < id(q)
也就是说,您可以像这样更简洁地构成此查询(前提是您希望在客户和公司之间进行所有购买,并且从该客户到公司之间至少要进行两次购买):
MATCH (c:Customer)-->(p:Purchase)-->(m:Company)
WITH c, m, collect(p) as purchases, count(p) as purchaseCount
WHERE purchaseCount >= 2
RETURN c, m, purchases