[英]Neo4j: Query for a path between two nodes in a specific order of relationships and knowing only label of the last node
例如,如果我有一个具有以下标签和关系的复杂图形:
N1-a-> N2-b-> N3-c-> N4
N2-d-N5-e-> N3
等等
现在,我想使用Cypher查找从(:N1 {id:'xyz'})到N4类型的任何节点的路径,但我希望关系的顺序相同,即a,b,c。
另外,如果没有N3类型的节点连接到N4类型的节点,我想返回路径直到N3
我想知道是否有办法做到这一点。 有人可以帮忙吗? 我是Neo4j的新手
如果您明确知道要遍历的关系,那么您应该可以使用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路径扩展程序。
对于使用APOC路径扩展器,如果您使用的是2018年冬季或更早版本的APOC版本,则可以利用新的序列功能,该功能可让您定义节点标签和关系类型的重复序列。 在这种情况下,我们将使用maxLevel
config参数限制重复。
MATCH (start:N1{id:'xyz'})
CALL apoc.path.expandConfig(start, {sequence:'N1, a>, N2, b>, N3, c>, N4', maxLevel:3}) YIELD path
RETURN path
ORDER BY length(path) DESC
LIMIT 1
如果您不关心(或不知道)路径中的标签(最后一个标签N4除外),则可以将*
用作标签,如下所示:
sequence:'*, a>, *, b>, *, c>, N4'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.