Gremlinはグラフを扱うのに便利なチューリング完全であるプログラミング言語だ。この言語はXPathを幅広く使って問い合わせや分析や操作ができるJava DSLだ。
Gremlinは多対多の関係のグラフを作成するのに使うことができる。グラフの要素や頂点やエッジには key-valueのペアの属性を持っているので、グラフは属性グラフと呼ばれている。例をあげると下記のようになる。
Gremlinには下記のような型がある。
- graph:graphはvertexとedgeの集合で構成されている。
- vertex:vertexは出て行くedgeと入ってくるedges、そして属性のmapで構成される。
- edge:edgeは出発点となるvertexと、終着点となるvertex、そして属性のmapで構成される。
- boolean:booleanはtrueまたはfalseになる。
- number:numberは自然数(integer)か実数(double)になる。
- string:stringは文字の配列である。
- list:listは順列があるコレクションであり、要素のオブジェクトが重複している場合もある。
- map:mapはキーオブジェクトの集合と値オブジェクトのコレクションを結びつける連想配列である。
XPathによる数学的操作– 加算、減算、乗算など - に加えて、Gremlinには多くの文がある。例えばIf/Else、While、Repeat、Foreach等だ。
Gremlinは一般グラフモデルを実行できるフレームワークであればどのようなフレームワークでも使うことができる。一般グラフモデルはたくさんのコンポーネントで構成されている。それらはグラフ、要素、頂点、エッジ、インデックスなどだ。さらにGremlinを使ってグラフを扱うために実装する必要のあるJavaのインターフェイスもある。
Gremlinのひとつの利用例としては、MongoDBドキュメントとして保存されているグラフを扱うことだ。また、OpenRDF, AllegroGraphやOpen Virtuoso、またはNeo4jのようなResource Description Frameworkを扱う使い方も考えられる。Gremlinチームは、将来はCouchDB と Terracotta もサポートさせようと考えているようだ。
例
JSON形式にエンコードされたグラフを扱うにはvertexとedgeに下記のスキーマを使う必要がある。
object {
string "_id";
array { string } inEdges;
array { string } outEdges;
object { }* properties;
};
object {
string "_id";
string label;
string inVertex;
string outVertex;
object { }* properties;
};
そうすると、上のグラフ図は、下記のようなJSON形式にエンコードされる。
//// VERTEX COLLECTION ////
{
_id: "1",
properties: {
name : "marko",
age : 29 },
outEdges : ["7","8","9"]
}
{
_id: "2",
properties: {
name : "vadas",
age : 27
},
inEdges : ["7"]
} ... [section skipped for brevity]
//// EDGE COLLECTION ////
{
_id: "12",
label: "created",
properties: { weight : 0.2 },
outVertex : "6",
inVertex : "3"
}
このデータはふたつのコレクションを作成するMongoDBに格納される。ひとつはvertexのためのコレクションで、もうひとつはedgeのためのコレクションだ。Gremlinは一般グラフモデルインターフェイスを通してこれらのコレクションを操作することができる。vertexやedgeの追加/削除、vertexやedgeのlistの取得、vertexやedgeの持つ属性の取得/設定、そしてvertexに関連するedgeやvertexをつなぐedgeをたどりグラフを操作することもできる。
“related_to”と呼ばれる操作はグラフにふたつのvertexを追加してedgeでそのふたつをつなぐ。この操作は下記のように記述できる。
gremlin> $v := g:add-v($g) ==>v[0]
gremlin> $u := g:add-v($g) ==>v[1]
gremlin> $e := g:add-e($g, $v, 'related_to', $u) ==>e[2][0-related_to->1]
グラフはコンピュータチップの設計や生物学、ネットワークなど幅広い分野に適用できる。最も単純な例をあげれば、vertexがウェブサイトのページを表し、edgeは他のページ間に存在するリンクを表す。Gremlinはこのようなページのグラフを操作し、関連づけられた属性を変更できる。
リソース: TinkerGraph –一般グラフモデルの参照実装、Gremlinのドキュメント, Gremlinユーザグループ。