🐕

ArangoDBのGraphをAQLで操作してみて理解する

2021/10/08に公開

https://www.arangodb.com/learn/graphs/graph-course/
で登録して落としてきた資料を参考にして作成しております

Graphデータ

こういうデータを用意しました
※TestVertexがDocument、TestEdgeがEdge
Graph図
S->A
S->B
A->D
B->D
B->C
C->S
D->E
っていう流れ

TestEdge

[{"_key":"61443928","_id":"TestEdge/61443928","_from":"TestVertex/S","_to":"TestVertex/A","_rev":"_dDzuzhy---"},{"_key":"61444105","_id":"TestEdge/61444105","_from":"TestVertex/S","_to":"TestVertex/B","_rev":"_dDzwTHm---"},{"_key":"61444120","_id":"TestEdge/61444120","_from":"TestVertex/A","_to":"TestVertex/D","_rev":"_dDzwaLq---"},{"_key":"61444137","_id":"TestEdge/61444137","_from":"TestVertex/B","_to":"TestVertex/D","_rev":"_dDzwmtq---"},{"_key":"61444152","_id":"TestEdge/61444152","_from":"TestVertex/D","_to":"TestVertex/E","_rev":"_dDzwvfO---"},{"_key":"61444167","_id":"TestEdge/61444167","_from":"TestVertex/B","_to":"TestVertex/C","_rev":"_dDzw5uq---"},{"_key":"61444178","_id":"TestEdge/61444178","_from":"TestVertex/C","_to":"TestVertex/S","_rev":"_dDzx-Yu---"}]

TestVertex

[{"_key":"S","_id":"TestVertex/S","_rev":"_dDzt0Be---"},{"_key":"A","_id":"TestVertex/A","_rev":"_dDzt7U2---"},{"_key":"B","_id":"TestVertex/B","_rev":"_dDzuEe2---"},{"_key":"C","_id":"TestVertex/C","_rev":"_dDzuI9W---"},{"_key":"D","_id":"TestVertex/D","_rev":"_dDzuMKW---"},{"_key":"E","_id":"TestVertex/E","_rev":"_dDzuQwW---"}]

AQL操作

その1

// TestVertex/Sを起点として辿れる範囲を1から5で探索
FOR v, e, p IN 1..5 OUTBOUND 'TestVertex/S' TestEdge
 // オプション指定
 OPTIONS {
 uniqueVertices: 'none', // uniqueVerticesはなし(頂点重複はしていい)
 uniqueEdges: 'path' // uniqueEdgesはpathで(Edge(いわゆる頂点と頂点の間の線)の重複はなし)
 }
 // 算出されたデータ(_key)において間に->を挟んで出す
 RETURN CONCAT_SEPARATOR('->', p.vertices[*]._key)

結果

[
  "S->A",
  "S->A->D",
  "S->A->D->E",
  "S->B",
  "S->B->D",
  "S->B->D->E",
  "S->B->C",
  "S->B->C->S",
  "S->B->C->S->A",
  "S->B->C->S->A->D"
]

その2

// TestVertex/Sを起点として辿れる範囲を0から5で探索
FOR v IN 0..5 OUTBOUND 'TestVertex/S' TestEdge
 // オプション指定
 OPTIONS {
 bfs: true, // 幅優先探索
 uniqueVertices: 'global' // 頂点において一度しか訪れないようにする
 }
 // 算出されたデータ(_key)を返す
 RETURN v._key

結果

[
  "S",
  "B",
  "A",
  "C",
  "D",
  "E"
]

幅優先なのでSのあとAとB、その後にCとD、最後にEとなる

OPTIONS指定その他

https://www.arangodb.com/docs/stable/aql/graphs-traversals.html
に載っております

Discussion