在 Neo4j 中排除 "symmetric" 结果

Excluding "symmetric" results in Neo4j

我想在 Neo4j 图形中查询包含两个可互换节点的结构,但我不希望每个 "symmetric" 响应都有两个唯一的响应。

如何在 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 的默认行为是 return 以下两个图表:

(即pqPurchase1Purchase2的赋值是相反的)

如何表达我查询中的元素pq是可以互换的,我只需要上述响应之一?

为防止出现此类结果,您通常会根据节点 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