JanusGraphとは
グラフデータベースで一番使われているのはNeo4jで環境が充実しているのですが、デフォルトのクエリ言語はCypherです。これは別に悪くないのですが、汎用的という意味ではApache Tinkerpopフレームワークを使ったGremlinが使いたいなと思うことがあります。OSSのグラフデータベースでは、Titanが有名かなと思っていたのですが、開発が止まっているようで、ForkされたJanusGraphを使うのが筋がよさそうです。
JanusGraphでは、バックエンドのデータベースとしてcassandra, HBASE, Berkeley DBが使えるようです。今回はJunusGraphをサーバ(Gremlin Server)として公開するための手順を試してみます。ちなみに、Berkeley DBをバックエンドで指定したコンテナはDocker HUBで公開されています。
準備
ここから最新版をダウンロードします。動作にはJVM1.8が必要です。展開したら、デフォルト設定(cassandra)であればすぐに起動できます。以下の例は、その後にすぐに停止をしています。
$ cd janusgraph-0.4.0-hadoop2
$ ./bin/janusgraph.sh start
Forking Cassandra...
Running `nodetool statusthrift`... OK (returned exit status 0 and printed string "running").
Forking Elasticsearch...
Connecting to Elasticsearch (127.0.0.1:9200).. OK (connected to 127.0.0.1:9200).
Forking Gremlin-Server...
Connecting to Gremlin-Server (127.0.0.1:8182)..... OK (connected to 127.0.0.1:8182).
Run gremlin.sh to connect.
$ ./bin/janusgraph.sh stop
Killing Gremlin-Server (pid 926)...
Killing Elasticsearch (pid 709)...
Killing Cassandra (pid 273)...
$ ./bin/janusgraph.sh clean
Are you sure you want to delete all stored data and logs? [y/N] y
Deleted data in /mnt/e/Works/Tinkerpop/janusgraph-0.4.0-hadoop2/db
設定ファイル
バックエンドの変更や、エンドポイント(Websocket、HTTP)、認証などの設定は、コンフィグファイルを変更して、gremlin-server.sh
への引数で指定します。上記のjanusgraphはデフォルトのコンフィグファイルを自動的に読み込むものです。
conf
フォルダにはサンプルの設定がすでに設定されています。ここではバックエンドの変更をしたいので、インメモリのデータベースを使う設定を作ってみます。これは、主としてテスト用に使うものです。/conf/gremlin-server
内のgremlin-server.yaml
をコピーして、以下の部分を書き換えます。参照するバックエンドのプロパティファイルを指定しています。
graphs: {
graph: conf/gremlin-server/janusgraph-inmemory.properties
}
参照先のプロパティファイルは以下のようにします。
gremlin.graph=org.janusgraph.core.JanusGraphFactory
storage.backend=inmemory
起動
準備が終えたら、スクリプトで起動するだけです。以下のコマンドで起動できます。SLF4Jをきちんと設定していないせいか、ログがたくさん出ます。
./bin/gremlin-server.sh conf/gremlin-server/gremlin-server-inmemory.yaml
接続
付属のGremlin Consoleで接続してみます。まず、:remoteで接続先を指定しています。
接続先にコマンドを送るためには、:>という記号が必要となります。
./bin/gremlin.sh
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.spark
plugin activated: tinkerpop.utilities
plugin activated: janusgraph.imports
gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured localhost/127.0.0.1:8182
gremlin> :> graph.addVertex("name", "stephen")
==>v[4288]
gremlin> :> graph.addVertex("name", "stephen")
==>v[4200]
終わりに
Berkeley DBなどについても、同様にコンフィグ、プロパティファイルを記述すれば大丈夫ですが、接続先のElasticsearch(Indexを管理)やBerkeley DBの情報を追記しないとダメっぽいです。ここは先に紹介したDockerで起動するのが楽そうです。