[英]In ArangoDB AQL, how to return both vertices and edges from a graph traversal?
[英]ArangoDB AQL: can I traverse a graph from multiple start vertices, but ensure uniqueVertices across all traversals?
我有一個包含大量相對較小的不相交圖的圖形數據集。 我需要從一組匹配特定搜索條件的頂點中找到所有可到達的頂點。 我使用以下查詢:
FOR startnode IN nodes
FILTER startnode._key IN [...set of values...]
FOR node IN 0..100000 OUTBOUND startnode edges
COLLECT k = node._key
RETURN k
查詢很慢,即使它返回正確的結果。 這是因為 Arango 實際上最終會多次遍歷相同的子圖。 例如,假設有以下子圖:
a -> b -> c -> d -> e
當過濾條件選擇頂點 a 和 c 時,Arango 最終會從 a 和 c 開始進行兩次獨立遍歷。 它在這兩個遍歷過程中訪問頂點 d 和 e,這會浪費時間。 添加 uniqueVertices 選項沒有幫助,因為在不同的遍歷中不會檢查頂點的唯一性。
為了確認對性能的影響,我創建了一個額外的根文檔,並將其中的鏈接添加到我的過濾器找到的所有文檔:
FOR startnode IN nodes
FILTER startnode._key IN [...set of values...]
INSERT { _from: 'fakeVertices/0', _to: startnode._id } IN fakeEdges
現在,以下查詢的運行速度比我的原始查詢快 4 倍,同時產生相同的結果:
FOR node IN 1..1000000 OUTBOUND 'fakeVertices/0' edges, fakeEdges
OPTIONS { uniqueVertices: 'global', bfs: true }
COLLECT k = node._key
RETURN k
不幸的是,我無法為所有查詢創建假頂點/邊,因為創建它需要更多時間。
我的問題是:Arango 是否提供了一種方法來確保在給定查詢中的所有遍歷中訪問的頂點的唯一性? 如果沒有,有沒有更好的方法來解決上述問題?
據我了解,這就是uniqueVertices
選項的用途,但是對於FOR...
語句的每次迭代,它認為頂點對於從該起始節點進行的遍歷是唯一的。 它不知道FOR...
語句中其他節點上發生的其他遍歷。 看來您每次都會遍歷很多頂點,這發生在每個新的起始節點上。
只是把它扔到牆上看看它是否粘住了,但是將兩個查詢組合起來,將OPTIONS
添加到原始查詢呢?
FOR startnode IN nodes
FILTER startnode._key IN [...set of values...]
FOR node IN 0..100000 OUTBOUND startnode edges
OPTIONS { uniqueVertices: 'global', bfs: true }
COLLECT k = node._key
RETURN k
另外,我強烈推薦使用 命名圖而不是指定邊 collections。 它不僅更加靈活,還允許您使用最短路徑計算,這可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.