Neo4j - 获得具有标识的特定节点到具有标签的节点之间的最短路径

问题描述:

我试图找到具有特定标签的最近节点到我有他的id的节点。Neo4j - 获得具有标识的特定节点到具有标签的节点之间的最短路径

MATCH (object{id:'1489751911095'}), (apiUser:ApiUser) , 
p = allShortestPaths((object) - [*] - (apiUser)) return p limit 1 

出于某种原因,它不停止在第一次遇到节点apiUser:ApiUser,但是会继续进行。

allShortestPaths功能枚举两个节点之间的所有最短路径。因此,对于您的查询,它需要所有可能的objectapiUser节点对,并枚举每对之间的所有最短路径。那么我们如何阻止这种情况发生?

首先,你可能要简化你这样的原始查询:

MATCH p=allShortestPaths((object {id:'1489751911095'})-[*]-(apiUser:ApiUser)) 
RETURN p 
LIMIT 1 

其次,如果你只需要一个路径,为什么不使用shortestPath功能?

MATCH p=shortestPath((object {id:'1489751911095'})-[*]-(apiUser:ApiUser)) 
RETURN p 
LIMIT 1 

这仍然将计算的最短路径为每个apiUser,所以你要根据路径的长度责令结果:

MATCH p=shortestPath((object {id:'1489751911095'})-[*]-(apiUser:ApiUser)) 
RETURN p 
ORDER BY length(p) DESC 
LIMIT 1 

这是不是最有效的解决方案,因为Neo4j仍将计算每个apiUser的最短路径 - 解决方案是否适用于您的用例取决于数据库中的apiUser的数量。

当从单个节点匹配,可变长度匹配LIMIT 1应该工作:

MATCH (object{id:'1489751911095'})-[*]-(p:ApiUser) 
RETURN p limit 1 

我们建议寻找增长性的节点时,在你的对手一个标签,索引或对标签+属性的唯一约束,所以它是一个快速匹配。

如果您不确定附近是否有该类型的节点,则可能需要为可变长度匹配添加上限。