问题描述
我在图中存在这样的节点:
(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
假设您要遍历几跳,可以合理地假设您会发现您正在接触很多节点。有助于提高性能的几件事:
- 使用标签和关系类型,即
MATCH (A:LABEL_FOR_A)-[:RELATIONSHIP1_TYPE]->(obj:LABEL_FOR_MID)-[:RELATIONSHIP2_TYPE]->(B:LABEL_FOR_B)
中间节点的标签对优化您的查询特别有帮助,但可能无法立即知道此标签。在这种情况下,如果需要,我会调查“obj”具有的不同标签,然后从那里开始工作。
- 使用
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
享受吧!