尝试从 Neo4j Cypher 查询中获取与唯一端点的关系

问题描述

我在图中存在这样的节点:

(A)-[relationship1]->(object)-[relationship2]->(B)

搜索内容会带来 1000 条匹配项。 当 UNIQUE B 的数量大于 25 时,我想要得到的是返回 (A)。

解决方法

要在 Cypher 中实现这一点,您可以使用“WITH”。这是帮助理解密码的非常有用的资源:cypher refcard

“WITH”的工作方式类似于“返回”并计算它前面的密码,然后您可以在密码的另一个步骤中处理其输出。这是您如何使用它来实现您的结果:

MATCH (A)-[:RELATIONSHIP1_TYPE]->(obj)-[:RELATIONSHIP2_TYPE]->(B) 
WITH A,count(distinct B) as unique_related_nodes
WHERE unique_related_nodes > 25 
RETURN A

假设您要遍历几跳,可以合理地假设您会发现您正在接触很多节点。有助于提高性能的几件事:

  1. 使用标签和关系类型,即 MATCH (A:LABEL_FOR_A)-[:RELATIONSHIP1_TYPE]->(obj:LABEL_FOR_MID)-[:RELATIONSHIP2_TYPE]->(B:LABEL_FOR_B)

中间节点的标签对优化您的查询特别有帮助,但可能无法立即知道此标签。在这种情况下,如果需要,我会调查“obj”具有的不同标签,然后从那里开始工作。

  1. 使用 EXPLAIN 帮助了解可以优化查询的位置:
EXPLAIN MATCH (A)-[:RELATIONSHIP1_TYPE]->(obj)-[:RELATIONSHIP2_TYPE]->(B) 
WITH A,count(distinct B) as unique_related_nodes
WHERE unique_related_nodes > 25 
RETURN A

享受吧!