我試圖找到具有特定標籤的最近節點到我有他的id的節點。Neo4j - 獲得具有標識的特定節點到具有標籤的節點之間的最短路徑
MATCH (object{id:'1489751911095'}), (apiUser:ApiUser) ,
p = allShortestPaths((object) - [*] - (apiUser)) return p limit 1
出於某種原因,它不停止在第一次遇到節點apiUser:ApiUser,但是會繼續進行。
我試圖找到具有特定標籤的最近節點到我有他的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
我們建議尋找增長性的節點時,在你的對手一個標籤,索引或對標籤+屬性的唯一約束,所以它是一個快速匹配。
如果您不確定附近是否有該類型的節點,則可能需要爲可變長度匹配添加上限。