DB
Gremlin
GraphDatabase
thinkerpop

Gremlin?GraphDBになぜこのネーミングか。。

Do you know about Gremlin ?

どこかで聞いたことのある、グレムリン。Qiitaで話題とするのはグラフデータベース操作言語のグレムリンです。

gremlin-logo.png

なんじゃ、こいつは。

ウチにもいます。こんなのが。甘やかすとデビル化します。Image-1.jpg

TinkerPop

apache-tinkerpop-logo.png

Apache財団さまの「グラフデータベースフレームワーク」プロジェクト。
現在は3世代目となっているらしい。

まずは、
http://tinkerpop.apache.org/docs/current/tutorials/getting-started/
こちらのGetting Startからどんなものか、みてみましょう。

グラフデータベースでの点と辺

グレムリンの友達の友達は?というクエリはこうなる。

g.V().has("name","gremlin").
  out("knows").out("knows").values("name")

g : Graph インスタンス
V : 頂点 (vertex)
has : Traversal Step 関数 

矢印の方向に注目して下の図を見てみよう。

modern-edge-1-to-3-1.png

起点となる1はout vertex(頂点),edge(辺) がつながり、in が対象の点。

V().has("name","gremlin").out("knows")
グレムリンという名前の頂点から、knowsの辺でつながっている点(友達)

.out("knows").values("name")
の友達の名前。

グラフデータベースでは、点と点のつながりを辿っていく。この経路のことをTravesalと呼ぶ。traverseとは横切る、とか走査するとかの意味がある。これまでのSQLであれば、カーソル、といったインスタンスがイテレータになっていたが、グラフデータベースではTraverser になる。

  • vertex 頂点
  • edge 辺
  • Traversal Step 経路走査の手順

この用語を押さえておくとよいかなと思います。

具体的にこんな感じ:

 gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> v1 = graph.addVertex(T.id, 1, T.label, "person", "name", "marko", "age", 29)
==>v[1]
gremlin> v2 = graph.addVertex(T.id, 3, T.label, "software", "name", "lop", "lang", "java")
==>v[3]
gremlin> v1.addEdge("created", v2, id, 9, "weight", 0.4)
==>e[9][1-created->3]

modern-edge-1-to-3-1-gremlin.png

グラフデータベースフレームワーク

ThinkerPopは、上記のグレムリンを含む、いくつかのレイヤーからなるグラフデータベースフレームワーク。ある特定のデータベースやプロセッサにとらわれず、同じコードを使って、異なったグラフデータベース間で自分たちの環境に最適かどうかをテストしたり、並列化へのスケールアップもシームレスに行えます。ThinkPopAPIの下にあるproviderの切り替えで、別のグラフデータベースに入れ替えも可能なAPI形式なので、Gremlinで書いた部分からAPIを経由して、他のOLTPやOLAPを利用することができるようになっています。つまり、上層のGremlin ServerとGremlin言語でのロジックと、データのストラクチャの部分は分離されているので、その時に最適な別のグラフデータベースやプロセッサに置き換えることが可能です。

provider-integration.png

Gremlin Serverは、RESTや WebSocketといったエンドポイントから、リモートのグレムリンスクリプトのリクエストを受けつけて、自身のグラフデータベースから応答を返すサーバーです。thinkpopのjavaドライバからサードパーティの他の言語でもWebSocketで通信することができます。(MySQLやpostgresのドライバー接続のように)

では、次回は実際に使ってみます。