我正在尝试找到具有特定标签的最近节点到我拥有其id的节点。
MATCH (object{id:'1489751911095'}), (apiUser:ApiUser) ,
p = allShortestPaths((object) - [*] - (apiUser)) return p limit 1
出于某种原因,它不会在第一次遇到节点apiUser时停止:ApiUser,但是还在继续。
答案 0 :(得分:1)
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
的数量
答案 1 :(得分:0)
从单个节点进行匹配时,与LIMIT 1的可变长度匹配应该起作用:
MATCH (object{id:'1489751911095'})-[*]-(p:ApiUser)
RETURN p limit 1
建议在按属性查找节点时匹配标签,并在标签+属性上设置索引或唯一约束,以便快速匹配。
如果您不确定附近是否会有该类型的节点,您可能需要为可变长度匹配添加上限。