グラフデータベースのDGraphを試してみる

Dgraphとは

Dgraphは水平方向の拡張性に優れた分散グラフデータベース。ACIDトランザクション、Raftベースの一貫性のあるレプリケーション、高い可用性などを特徴とし、ディスク上でのデータの配列を制御することでクエリの性能やスループットを最適化する。FacebookのGraphQLライクなクエリシンタックスをサポートし、GRPCとHTTPを介してJSONとProtocol Buffersでレスポンスする。

引用元: mag.osdn.jp

・・・いろいろと分からない単語が並んでますが、とりあえず試してみます。

環境

Conoha(VPS)でお試し。

  • OS:CentOS 7.4
  • CPU:2コア
  • メモリ:1GB
  • ディスク:50GB (SSD)

実行環境の準備

公式のDockerイメージがあるので、それをpullして実行。
・・・の前に、Dockerデーモンをインストールする。

# yum install docker
# docker version
Docker version 1.12.6, build ec8512b/1.12.6

実行

公式のTutorialに従ってコマンドを実行していく。

# mkdir -p ~/dgraph

( DGraph Zeroの実行 )
# docker run -it -p 8081:8081 -p 8080:8080 -p 9080:9080 -v ~/dgraph:/dgraph --name dgraph dgraph/dgraph dgraph zero --port_offset=-2000

( DGraphの実行 ※上を実行したのと別のターミナルから実行する必要あり)
# docker exec -it dgraph dgraph server --bindall=true --memory_mb 2048 --zero localhost:5080

( ratel (DGraph UI) の実行 )
# docker exec -it dgraph dgraph-ratel

ここまで実行すると、8080ポートでDGraphに接続、8081ポートでGUIに接続できるようになる。

サンプルデータの流し込み

GUIに接続すると入力欄が現れるので、これも公式のTutorialのコードをコピペして実行していく。
ハマった点としては、チュートリアル中に「ENDPOINT:/ALTER」と記述があるので、それに合わせたラジオボタンGUI上で選択しておく必要がある。

f:id:gumfum:20180103004206p:plain

( データ定義 : ALTER で実行 [https://tour.dgraph.io/intro/3/] )
name: string @index(exact, term) .
age: int @index(int) .
friend: uid @count .

( データ作成 : MUTATE で実行 [https://tour.dgraph.io/intro/4/] )
{
  set {
    _:michael <name> "Michael" .
    _:michael <age> "39" .
    _:michael <friend> _:amit .
    _:michael <friend> _:sarah .
    _:michael <friend> _:sang .
    _:michael <friend> _:catalina .
    _:michael <friend> _:artyom .
    _:michael <owns_pet> _:rammy .

    _:amit <name> "अमित"@hi .
    _:amit <name> "অমিত"@bn .
    _:amit <name> "Amit"@en .
    _:amit <age> "35" .
    _:amit <friend> _:michael .
    _:amit <friend> _:sang .
    _:amit <friend> _:artyom .

    _:luke <name> "Luke"@en .
    _:luke <name> "Łukasz"@pl .
    _:luke <age> "77" .

    _:artyom <name> "Артём"@ru .
    _:artyom <name> "Artyom"@en .
    _:artyom <age> "35" .

    _:sarah <name> "Sarah" .
    _:sarah <age> "55" .

    _:sang <name> "상현"@ko .
    _:sang <name> "Sang Hyun"@en .
    _:sang <age> "24" .
    _:sang <friend> _:amit .
    _:sang <friend> _:catalina .
    _:sang <friend> _:hyung .
    _:sang <owns_pet> _:goldie .

    _:hyung <name> "형신"@ko .
    _:hyung <name> "Hyung Sin"@en .
    _:hyung <friend> _:sang .

    _:catalina <name> "Catalina" .
    _:catalina <age> "19" .
    _:catalina <friend> _:sang .
    _:catalina <owns_pet> _:perro .

    _:rammy <name> "Rammy the sheep" .

    _:goldie <name> "Goldie" .

    _:perro <name> "Perro" .
  }
}

描画

流し込んだデータからグラフを描画してみる。

( データ取得 : QUERY で実行 [https://tour.dgraph.io/intro/5/] )
{
  everyone(func: anyofterms(name, "Michael Amit")) {
    name
    friend {
      name@ru:ko:en
      friend { expand(_all_) { expand(_all_) } }
    }
  }
}

こんな感じで描画された。描画はツリー形式にもできる他、帰り値をjson形式で受け取ることも可能。

f:id:gumfum:20180103004104p:plain

感想

Dockerイメージが配布されていたので、想定していたよりすんなりインストールして使い始めるまでたどり着けた印象。 「分散型」という部分は全く触れていないので、機会があればもう少し試してみたい。

おまけ

グラフへのデータ定義やデータ取得はGraphQLというので行っていたらしい。SQLとは勝手が違うので少し勉強する必要がありそう。

graphql.org