[英]arangodb aql effectively tarversing from startvertex through the endvertex and find connection between them
我是圖形概念和arangodb的新手。 我計划在與通訊分析有關的項目中同時使用它們。 我已將數據設置為適合arangodb的需求,其中一個名為object
文檔集合和一個名為object_routing
邊緣集合
在我的object
,數據結構如下
{
"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個數據庫服務器的群集上運行
值得嘗試一些查詢來了解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
此示例查詢將查看從頂點開始的,具有_id
為object/45a92a7344ee4f758841b5466c010ed9
圖形中名為insert_my_graph_name
所有出站邊。
然后將查詢設置為為找到的每個路徑返回三個變量:
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格式(以數組等)返回此信息。
當返回路徑時,它被存儲為具有兩個屬性edges
和vertices
的文檔,其中edges
屬性是路徑下降的邊緣文檔的數組,而vertices
屬性是頂點文檔的數組。
關於vertices
數組的有趣之處在於數組元素的順序很重要。 vertices
數組中的第一個文檔是起始頂點,最后一個文檔是終止頂點。
所以上面的示例查詢,因為您的查詢被設置為OUTBOUND
查詢,這意味着您的起始頂點將始終是存儲在p.vertices' and the end of the path will always be the
處的數組的FIRST
元素p.vertices' and the end of the path will always be the
LAST`元素該數組。
路徑中遍歷的頂點數量無關緊要,該規則仍然有效。
如果您的查詢是INBOUND
規則,則邏輯保持不變,在這種情況下, FIRST(p.vertices)
將是路徑的起始頂點,而LAST(p.vertices)
將是終止頂點,即與您在查詢中指定的_id
相同。
所以回到你的使用情況..如果你希望將所有過濾OUTBOUND
從起始頂點的路徑到一個特定的頂點,那么你可以添加LET last_vertex_in_path = LAST(p.vertices)
申報設置到最后一個頂點的參考提供的路徑。
然后,您可以輕松地提供一個引用此變量的FILTER
,然后對該終止頂點的任何屬性進行過濾。 您可以過濾last_vertex_in_path._id
或last_vertex_in_path.obj_id
或該最終頂點文檔的任何其他參數。
進行一些練習,但是一旦您發現圖形遍歷查詢只為您提供了這三個關鍵變量v
, e
和p
,它們並不是什么特別的東西,它們只是頂點和邊的數組,然后您可以進行一些非常強大的過濾。
您可以在任何頂點,邊或路徑位置的屬性上放置過濾器,以對發送的結果進行非常靈活的過濾和聚合。
還可以查看遍歷選項,它們可能很有用。
首先,請確保已加載了文檔和邊,並創建了一個包含這些文檔和邊集合的圖形。
是的..您可以在一個圖形中包含許多文檔和邊集合,如果適合您的用例,甚至可以在多個圖形上共享文檔/邊集合。
玩得開心!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.