繁体   English   中英

Neo4j:以特定的关系顺序查询两个节点之间的路径,并且仅知道最后一个节点的标签

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM