Neo4j - 获得具有标识的特定节点到具有标签的节点之间的最短路径
问题描述:
我试图找到具有特定标签的最近节点到我有他的id的节点。Neo4j - 获得具有标识的特定节点到具有标签的节点之间的最短路径
MATCH (object{id:'1489751911095'}), (apiUser:ApiUser) ,
p = allShortestPaths((object) - [*] - (apiUser)) return p limit 1
出于某种原因,它不停止在第一次遇到节点apiUser:ApiUser,但是会继续进行。
答
allShortestPaths
功能枚举两个节点之间的所有最短路径。因此,对于您的查询,它需要所有可能的object
和apiUser
节点对,并枚举每对之间的所有最短路径。那么我们如何阻止这种情况发生?
首先,你可能要简化你这样的原始查询:
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
我们建议寻找增长性的节点时,在你的对手一个标签,索引或对标签+属性的唯一约束,所以它是一个快速匹配。
如果您不确定附近是否有该类型的节点,则可能需要为可变长度匹配添加上限。