Neo4j - 获取具有id的特定节点与具有标签的节点之间的最短路径

时间:2017-03-17 21:00:11

标签: neo4j cypher

我正在尝试找到具有特定标签的最近节点到我拥有其id的节点。

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

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

2 个答案:

答案 0 :(得分:1)

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的数量

答案 1 :(得分:0)

从单个节点进行匹配时,与LIMIT 1的可变长度匹配应该起作用:

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

建议在按属性查找节点时匹配标签,并在标签+属性上设置索引或唯一约束,以便快速匹配。

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