BT

Your opinion matters! あなたのご意見でInfoQが変わる!

Gremlin:グラフを扱う言語

| 作者: Abel Avram フォローする 4 人のフォロワー , 翻訳者 徳武 聡 フォローする 0 人のフォロワー 投稿日 2010年1月19日. 推定読書時間: 4 分 |

原文(投稿日:2010/01/15)へのリンク

Gremlinはグラフを扱うのに便利なチューリング完全であるプログラミング言語だ。この言語はXPathを幅広く使って問い合わせや分析や操作ができるJava DSLだ。

Gremlinは多対多の関係のグラフを作成するのに使うことができる。グラフの要素や頂点やエッジには key-valueのペアの属性を持っているので、グラフは属性グラフと呼ばれている。例をあげると下記のようになる。

graph1

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, AllegroGraphOpen 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ユーザグループ

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT