首页 > 解决方案 > Neo4j:以特定的关系顺序查询两个节点之间的路径,并且只知道最后一个节点的标签

问题描述

例如,如果我有一个具有以下标签和关系的复杂图表:

N1-a->N2-b->N3-c->N4

N2-d-N5-e->N3

等等

现在,我想使用 Cypher 找到从 (:N1{id:'xyz'}) 到任何 N4 类型节点的路径,但我希望这些关系的顺序相同,即 a、b、c。

另外,如果没有 N3 类型的节点连接到 N4 类型的节点,我想返回 N3 之前的路径

我想知道是否有办法做到这一点。有人可以帮忙吗?我是 Neo4j 的新手

标签: databasegraphneo4jcypher

解决方案


如果您明确知道要遍历的关系,那么您应该能够使用 Cypher 执行此操作,但如果没有 N4 则返回 N3 的条件可能很棘手。

N3 的标签是否已知,或者您只是想要尽可能多的路径?此外,如果沿路径而不是在末端遇到标签 N4 的节点,您是否也想要这些节点,或者您只对关系链末端的 N4 感兴趣?

此外,您是否对找到的所有可能路径感兴趣,或者您只需要一条路径(如果存在)?

如果您明确知道(并且可以在查询中定义)要遍历的关系,并且如果您只需要一条路径(如果存在)并且您只对末尾标签 N4 的节点感兴趣,则此查询应该可以工作(或之前的节点,如果最后没有 N4):

MATCH p=(:N1{id:'xyz'})-[:a]->()-[:b]->()-[:c*0..1]->(last)
WHERE length(p) = 3 and last:N4 OR length(p) = 2
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN p

如果条件更复杂,您可能需要为此使用 APOC 路径扩展程序。


推荐阅读