在Neo4j中排除“对称”结果

时间:2019-02-07 16:56:15

标签: neo4j cypher graph-databases

我想查询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

the query

对于Neo4j,默认行为是返回以下两个图形:

A symmetric graph Another symmetric graph

(即pqPurchase1Purchase2的分配是相反的)

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

1 个答案:

答案 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