🥑

AzureのMarketPlaceでArangoDBを触る

に公開

ArangoDBとは

ArangoDBは“マルチモデルデータベース”と呼ばれ、1つのエンジンで「ドキュメント」「グラフ」「KV」「全文検索(ArangoSearch)」を扱えるデータベースです。

なぜ、マルチモデルDBが良いかというと、リソースがArangoDBだけで済む、データ同期・ETL・複数DB運用が不要となります。

データ 一般に使うDB ArangoDBの場合
構造化データ(JSON) MongoDB 同じDB内
グラフ(KG) Neo4j / Nebula 同じDB内
検索/ベクトル Elasticsearch / Weaviate ArangoSearchで同じDB内
KVキャッシュ Redis 同じDB内

技術アーキテクチャ

ArangoDBは単一のサーバーコアで以下を統合:

  • Document Store(Mongo系)
  • Graph Engine(Edgeコレクション)
  • AQL(SQL + JSON + Graph)
  • ArangoSearch(全文検索 + スコアリング + ベクトル検索)
  • SmartGraph / Enterprise Graph Sharding

これによりJOIN + Graph Traversal + Full-text search + Vector search を1クエリで実行できる。

AQL(ArangoDB Query Language)でクエリ実行

SQL + Gremlin/Neo4j Cypher + JSON操作のハイブリッド

-- グラフ探索しながら全文検索するクエリ
FOR v, e, p IN 1..3 OUTBOUND "users/123" GRAPH "UserGraph"
  SEARCH ANALYZER(v.description IN TOKENS("自動車 ECU ログ", "text_ja"), "text_ja")
  SORT BM25(v) DESC
  LIMIT 10
RETURN { path: p, score: BM25(v) }

ArangoSearchによるRetrieval5つ

ArangoSearchは以下を統合検索できる。

  • Full-Text Search(形態素解析 / BM25)
  • Vector Search
  • Metadata検索(AQLの普通のWHERE)
  • Graph Traversal中の検索
  • Rankingの合成(BM25 + VectorScore)

ArangoDB vs Neo4j vs Kùzu比較表

項目 ArangoDB Neo4j Kùzu
モデル マルチモデル グラフ特化 OLAP向けGraph
検索 ArangoSearch 別途Elasticsearchなど 検索弱い
Vector Search △(Graph + Vectorは弱い)
分散/HA
クエリ AQL(Graph+SQL) Cypher Cypher-like
VersionRAG適性 ○〜△
1DBで完結性

AzureでArangoDBの環境を作る

本題です。

Azure Portalのmarket placeでarangodbを検索

リソースを作成します。

次にネットワーク設定で、受信ポートルールを追加します。

ポイントはポートの8529を許可することです。

あとは、下記からWebUIにアクセスできます。

http://[PublicIP]:8529/

ただ、初期アカウントとパスワードがわからないので、
sshでサーバーにアクセスします。

ssh -i ダウンロードした秘密鍵.pem azureuser@PublicIp

sudo systemctl stop arangodb3
sudo arango-secure-installation

Please enter password for root user:

という感じで、rootユーザーの初期パスワードを設定できます。

これで、先ほどのWebUIからログインすると、ROOTユーザーでログインできます。

ArangoDBのグラフビューで可視化してみる

このような電源のネットワークを作成してみます。

Battery12V → Fuse_F1 → MainRelay → ECU_Engine
→ ECU_Body

コレクション作成

WebUIでコレクションを作成します。

コレクションにはDocumentとEdgeが選べるのですが、
PowerNodesをDocumentで、PowerEdgesをEdgeで作成します。

電源ノードのダミーデータ登録

FOR node IN [
  { _key: "Battery12V",   name: "Battery 12V",      node_type: "Battery", voltage: 12 },
  { _key: "Fuse_F1",      name: "Fuse F1",         node_type: "Fuse",    ratingA: 30 },
  { _key: "MainRelay",    name: "Main Relay",      node_type: "Relay" },
  { _key: "IGN_SW",       name: "Ignition Switch", node_type: "Switch",  mode: "IGN_ON" },
  { _key: "ECU_Engine",   name: "Engine ECU",      node_type: "ECU",     domain: "Powertrain" },
  { _key: "ECU_Body",     name: "Body ECU",        node_type: "ECU",     domain: "Body" }
]
INSERT node INTO PowerNodes

電源ライン(Edge)を登録

FOR e IN [
  {
    _from: "PowerNodes/Battery12V",
    _to:   "PowerNodes/Fuse_F1",
    relation: "feeds"        // バッテリ → ヒューズ
  },
  {
    _from: "PowerNodes/Fuse_F1",
    _to:   "PowerNodes/MainRelay",
    relation: "feeds"        // ヒューズ → メインリレー
  },
  {
    _from: "PowerNodes/MainRelay",
    _to:   "PowerNodes/IGN_SW",
    relation: "feeds"        // リレー → IGNスイッチ
  },
  {
    _from: "PowerNodes/IGN_SW",
    _to:   "PowerNodes/ECU_Engine",
    relation: "feeds"        // IGN ONで Engine ECU へ給電
  },
  {
    _from: "PowerNodes/IGN_SW",
    _to:   "PowerNodes/ECU_Body",
    relation: "feeds"        // IGN ONで Body ECU へ給電
  }
]
INSERT e INTO PowerEdges

Graphを追加

WebUIで、下記のように選択します。

グラフを開くと、下記のようなグラフが確認できます。

-- AQLでBatteryから下流のノードをたどる
FOR v, e, p IN 1..5 OUTBOUND "PowerNodes/Battery12V" PowerEdges
  RETURN {
    pathVertices: p.vertices[*].name,
    pathEdges: p.edges[*].relation
  }

まとめ

AzureでArangoDBのリソースを用意することは容易い。

マルチモデルデータベースの良さはリソース管理のしやすさはありますが、AQLは複雑だと思ったので、
LLMでいかにデータ構造を理解して、クエリを作成できるかの検証が必要そうです。

ヘッドウォータース

Discussion