2016-01-11 148 views
3

在OrientDB中,每個頂點都連接了相連的邊。這意味着可以使用嵌套的「select」語句顯式地從集合中走過節點。ArangoDB通過節點屬性高效遍歷

舉一個例子:給定一個節點屬性的路徑,找到匹配的末端節點。 路徑由節點屬性列表組成(例如,kind在路徑中的節點中是唯一的)。

現在,假設我有一棵樹:

kind=site, name=site1 
    -- kind=project, name=project1 
    -- kind=library, name=library1 
kind=site, name=site2 
    -- kind=project, name=project2 
    -- kind=library, name=library1 

用戶想從一個名爲LIBRARY1與路徑庫中的信息:由於沒有每個節點的遍歷完全合格

[{kind=site},{kind=project,name=project1},{kind=library,name=library1}] 

是好的只要結果是單個節點即可。

在OrientDB,該過程將是:

  • 開始與種類的所有節點=網站
  • 穿行的「孩子」的邊緣,並收集那些 KIND =項目和名稱的所有對象= PROJECT1
  • 穿行孩子邊和收集是 樣=庫和名稱= LIBRARY1

這可以在東北進行的所有對象sted select語句。種類字段被編入索引,以便從大量對象中快速收集起始節點。爲了進一步提高性能,我知道哪些表在哪些表(集合)中,以便可以限定要從中選擇的對象數(從<表中選擇where type = site)。

在ArrangoDB中,只有邊具有節點綁定信息,所以具有節點的節點不能直接穿過連接的邊。在GRAPH_TRAVERSAL函數中,我可以通過示例指定起始集合。所以這個例子就是{kind = site}。這是否意味着必須通過掃描所有圖邊來收集節點的起始列表,基本上查看連接到整個圖中每個邊的輸入的每個節點?

這樣的查詢將如何制定(在AQL和/或arangojs),所以它不必開始全面掃描連接到邊緣的對象?

我也看不到如何發送示例頂點到arangojs遍歷函數。它似乎總是需要一個明確的起始頂點。

回答

1

考慮到這樣的工作,我們設計了新的AQL graph traversal這是要與ArangoDB 2.8(在後期測試版目前)

關於你提到的最後一點被釋放,我們確定使用named graphs有關藏品哪知道收藏以及它們在圖中的關係。我假設你將會使用named graphs

允許使用one of the ArangoDB 2.8 Example graphs與arangosh:

var examples = require("org/arangodb/graph-examples/example-graph.js"); 
var graph = examples.loadGraph("traversalGraph"); 

它有它的ventices的circles收集,及其edges集合中連接頂點的邊:

db.circles.toArray(); 
db.edges.toArray(); 

我們現在可以使用FILTER語句結合travesal深度來在執行的早期刪除圖分支的遍歷。

在這裏,我們篩選了頂點的屬性在遍歷的第一層中找到:

db._query("FOR v, e, p IN 1..3 " + 
       "OUTBOUND 'circles/A' " + 
       "GRAPH 'traversalGraph' " + 
       "FILTER p.vertices[1]._key != 'G' RETURN v._key"); 

我們也可以以類似的方式篩選邊緣的屬性:

db._query("FOR v, e, p IN 1..3 " 
      "OUTBOUND 'circles/A' " + 
      "GRAPH 'traversalGraph' " + 
      "FILTER p.edges[0].label != 'right_foo' RETURN v._key"); 

AQL graph traversal chapter也有一個深入的解釋,以這種方式遍歷器遍歷圖。

+0

這正是我所期待的。我將在我的代碼中註釋查詢將受益於此功能的地方。我們仍處於可行性階段,所以我有一段時間。 – ggendel