2017-04-04 17 views
0

我對圖概念和arangodb很新。我打算在一個與通信分析相關的項目中使用它們兩個。我已經設置了數據以適應一個文檔集合命名爲object,在我object數據結構命名爲object_routingarangodb aql有效地從startvertex穿過endvertex並找到它們之間的連接tarversing

一個邊緣收集在arangodb需要如下

{ 
    "img": "assets/img/default_message.png", 
    "label": "some label", 
    "obj_id": "45a92a7344ee4f758841b5466c010ed9", 
    "type": "message" 
} 
... 
{ 
    "img": "assets/img/default_person.png", 
    "label": "some label", 
    "obj_id": "45a92a7344ee4f758841b5466c01111", 
    "type": "user" 
} 
object_routing數據結構

是如下

{ 
    "message_id": "no_data", 
    "source": "45a92a7344ee4f758841b5466c010ed9", 
    "target": "45a92a7344ee4f758841b5466c01111", 
    "type": "has_contacted" 
} 

_from : object/45a92a7344ee4f758841b5466c010ed9_to : object/45a92a7344ee4f758841b5466c01111

object的數據總和爲23k,而object_routing爲127k。我的問題是,我怎樣纔能有效地遍歷從起始頂點到結束頂點,這樣我就可以獲得所有連接的頂點和它的邊緣以及它們的子節點等,直到它們之間沒有什麼可以再遍歷的東西?

恐怕我的問題是不夠清楚,我圖概念的理解是不正確的方向,請多多包涵

注:BFS算法不是一種選擇,因爲這不是我所需要的。如果可能的話,我想獲得最長的路徑。我的arangodb當前版本是3.1.7在1個協調器和3個數據庫服務器的集羣上運行

+0

你想從查詢遍歷中得到什麼結果?你是否想要找到兩個頂點之間的所有可能的邊或所有可能的頂點?查看ArangoDB網站上的[遍歷頁面](https://docs.arangodb.com/devel/AQL/Graphs/Traversals.html),看看是否有幫助。該命令將爲您提供頂點文檔數組和邊數組。您仍然可以使用類似於'FILTER LAST(頂點).obj_id =='something''的東西過濾結果,其中頂點數組的LAST'值將成爲INBOUND'遍歷路徑的始發頂點。你需要什麼? –

+0

hi @DavidThomas對於遲到的回覆感到抱歉,我認爲它是「找到兩個頂點之間的所有可能的邊」,因爲我可以在給定的兩個頂點之間具有所有可能的連接頂點,不是嗎?我想要的輸出是兩個給定節點之間的所有連接頂點和邊,以便我可以繪製結果圖並希望告訴最終用戶,如果兩個給定頂點以某種方式有點連接 –

+0

但我不確定如何完成此操作這是否可以通過實現一些算法來實現?或者僅僅使用圖遍歷在arangodb中就足夠了?再一次,任何指針會非常有幫助 –

回答

0

值得嘗試幾個查詢以瞭解AQL遍歷的工作方式,但可能從AQL遍歷文檔頁面:

FOR v, e, p IN 1..10 OUTBOUND 'object/45a92a7344ee4f758841b5466c010ed9' GRAPH 'insert_my_graph_name' 
    LET last_vertex_in_path = LAST(p.vertices) 
    FILTER last_vertex_in_path.obj_id == '45a92a7344ee4f758841b5466c01111' 
    RETURN p 

此示例查詢將着眼於所有出站邊在圖形中稱爲insert_my_graph_name從頂點與object/45a92a7344ee4f758841b5466c010ed9_id開始。

該查詢然後設置返回三個變量中找到的每個路徑:

  • v包含頂點的出站通道的集合發現
  • e包含找到出站路徑邊的集合
  • p包含發現

的路徑是由頂點共同路徑通過邊緣互相連接。

如果你想探索的變量,試試這個版本的查詢:

FOR v, e, p IN 1..10 OUTBOUND 'object/45a92a7344ee4f758841b5466c010ed9' GRAPH 'insert_my_graph_name' 
    RETURN { 
    vertices: v, 
    edges: e, 
    paths: p 
    } 

什麼是好的是,AQL以JSON格式返回該信息,數組和這樣的。

當返回路徑,則它被存儲爲一個文件具有兩個屬性,edgesvertices,其中edges屬性是邊緣的陣列記錄了路徑落下去,並且vertices屬性是頂點文件的陣列。

有關vertices數組的有趣之處在於數組元素的順序很重要。 vertices數組中的第一個文檔是起始頂點,最後一個文檔是結束頂點。

所以上面的示例查詢,因爲你的查詢被設置爲一個OUTBOUND查詢,這意味着您的起始頂點將總是存儲在該陣列的p.vertices' and the end of the path will always be the LAST`元件陣列的FIRST元件。

無論您的路徑中遍歷了多少頂點,該規則仍然有效。

如果查詢是一個INBOUND規則,則該邏輯保持不變,在這種情況下FIRST(p.vertices)將是該路徑的開始頂點,而LAST(p.vertices)將終止頂點,這將是相同的_id你指定什麼作爲在你的查詢中。

所以回到你的用例..如果你想過濾掉從你的起始頂點到特定頂點的所有OUTBOUND路徑,那麼你可以添加LET last_vertex_in_path = LAST(p.vertices)聲明來設置對提供的路徑中最後一個頂點的引用。

然後,您可以輕鬆提供引用此變量的FILTER,然後過濾該終止頂點的任何屬性。您可以過濾last_vertex_in_path._idlast_vertex_in_path.obj_id或該最終頂點文檔的任何其他參數。

與它玩和練習一些,但一旦你看到一個圖的遍歷查詢只提供了這三個關鍵變量,vep,而這些都沒有什麼特別的東西,他們只是頂點數組和邊緣,那麼你可以做一些非常強大的過濾。

您可以將過濾器放在任何頂點,邊或路徑位置的屬性上,以對其發送的結果進行相當靈活的過濾和聚合。

也看看遍歷選項,它們可以是有用的。

要開始使用,只需確保已加載文檔和邊緣,並且已經創建了包含文檔和邊緣集合的圖形。

而且,如果適合您的使用案例,您可以在單個圖形中包含多個文檔和邊緣集合,甚至可以在多個圖形上共享文檔/邊緣集合。

玩得開心!

+0

嗨@David,感謝您跟上我!我試過你的查詢,但它一直執行並沒有給出任何結果,爲什麼需要很長時間?任何建議使其更快?它差不多半個小時,查詢仍然沒有給出任何結果 –

+0

請確保您在任何列上進行相等性測試時至少有一個哈希索引,因此如果您對'.obj_id'進行了測試,請確保您有該屬性的索引。這可以產生巨大的差異,請使用UI中的解釋功能來確保您的索引正在被使用。 –

相關問題