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

时间:2018-04-26 18:07:18

标签: database graph neo4j cypher

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

N1-α-> N2-B-> N3-C-> N4

N2-d-N5-E-> N3

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

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

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

2 个答案:

答案 0 :(得分:0)

如果您明确知道要遍历的关系,那么您应该可以使用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路径扩展程序。

答案 1 :(得分:0)

对于使用APOC路径扩展器,如果您使用2018年冬季或更新版本的APOC版本之一,您可以利用新的序列功能,该功能允许您定义节点标签和关系类型的重复序列。在这种情况下,我们将使用maxLevel配置参数限制重复。

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'