GraphDB 入門
TinkerPop の使い方

Shoshi Tamaki
Nobuyasu Oshiro
08 Sep 2012

もくじ


  • ストライクウィッチーズで,GraphDB/TinkerPop入門
    • GraphDBとは
    • PropertyGraphについて
    • TinkerPopとは
    • TinkerPopを使ってストライクウィッチーズの相関図を解析
  • TinkerPop による PageRank の実装

GraphDB とは?

Graph構造を保存するためのデータベース.

Graph構造とは,たとえばこんなもの


GraphDB とは?

このような構造をしたGraphはPropertyGraphと呼ばれる.

PropertyGraphとは,


PropertyGraph

関係・人物・名前・特徴Vertex・Edge・Label・Propertyと呼ばれる.

  • Edge(関係)が方向を持つ
  • Vertex(人物)とEdge(関係)はLabel(名前)を持つ
  • VertexとEdgeはKey/Valueのマップ(Property)を持っている.

GraphDBとは?

GraphDBは,保存されたGraphのVertex,Edgeを渡り歩き,目的のデータを取得するようなデータベースである.

渡り歩くことをTraverseという.


TinkerPop

TinkerPopはGraphDBを利用するためのツール群である.



Blueprints

Blueprintsは,PropertyGraphのJavaのinterfaceを提供する.

GraphDBの世界のJDBCの立場を目指している.


Blueprints を実装している GraphDB の一例
  • Neo4j
  • OrientDB
  • MongoDB
  • etc...

Gremlin

GraphをTraverseするための言語.Groovyがベースである.GraphDBに対してQueryを発行することが出来る.コンソールも利用できる.

gremlin> graph.v(1).out.name
==>vadas
==>lop
==>josh

GremlinはPipesを利用して,GraphをTraverseする..out.nameがPipeである..

Pipes

PipesはGraphを処理するためのフレームワークである.Pipeという処理の単位を複数連結し,複雑なTraverseを実現する.

graph.v(1)はGraphからIDか1のVertexを取得する,.out .name がぞれぞれPipeに値する.

Pipes

この例題の動作は・・・




gremlin> g.v(1).out.name
==>vadas
==>lop
==>josh

outはVertexから外向きのEdgeで繋がっているVertex一覧を取得する,nameはProperty名でPipeではVertexのnameを取得している.

ストライクウィッチーズの相関図を解析するには?


  1. BlueprintsでTinkerGraphにストライクウィッチーズの相関図を入力する.
  2. 作成したTinkerGraphを,
    • Gremlinのコンソールから解析してみる.
    • JavaからGremlinを使って解析してみる.

まずは,TinkerGraphにストライクウィッチーズの相関図を入力する.

この発表のサンプルコードについて


hg clone https://bitbucket.org/suikwasha/graphdb_javakuche


Mavenというプロジェクト管理ツールを利用したプロジェクトになってます.

ビルド方法・解凍したディレクトリに移動して
$ mvn compile

ストライクウィッチーズの相関図を解析するには?

Blueprintsは,GraphDBへのインターフェイスを提供する.TinkerGraphはBlueprintsを用いて利用できる.

相関図のGraphを作るためには,Graphを作成し人物(Vertex)関係(Edge)特徴(Property)を作る必要がある.

// 相関図(Graph)の作成,データを保存するディレクトリを引数に取る
Graph g = new TinkerGraph();
// 人物(Vertex)の作成,設定したいIDを引数に取る
Vertex character = g.addVertex(ID);
// 関係(Edge)の作成,設定したいIDを引数に取る
Edge relation = g.addEdge(ID,From,To,Label);
// 特徴(Property)の作成 , Vertex・Edgeともに同様のメソッド
character.setProperty(PropertyName,PropertyValue);

ストライクウィッチーズの相関図を解析するには?

これを入力します.

ストライクウィッチーズの相関図を解析するには?

画像を見ながらコードに書き起こすと・・・

Graph g = new TinkerGraph("./strikewitches"); // 保存ディレクトリ
Vertex strikeWitches = g.addVertex("StrikeWitches");
Vertex yoshika = g.addVertex("yoshika");
yoshika.setProperty(propName,"宮藤芳佳");
yoshika.setProperty(propRank,"軍曹");
yoshika.setProperty(propAge,14);
yoshika.setProperty(propCV,"福圓美里");
yoshika.setProperty(propUnit,"扶桑皇国海軍遣欧艦隊");
yoshika.setProperty(propPersonality,"明るく前向きで一生懸命");
Vertex lynett = g.addVertex("lynett");
lynett.setProperty(propName,"リネット・ビショップ");
lynett.setProperty(propRank,"軍曹");
lynett.setProperty(propAge, 15);
lynett.setProperty(propCV,"名塚佳織");
lynett.setProperty(propUnit,"ブリタニア空軍");
lynett.setProperty(propPersonality,"家庭的で戦闘は苦手");
g.addEdge(null,yoshika,lynett,"仲良し新人コンビ");
g.addEdge(null,lynett,yoshika,"仲良し新人コンビ");

CreateStrikeWitchesGraph

実際にコードを動作させてTinkerGraphに入力する.


mvn exec:java -Dexec.mainClass=suikwasha.javakuche.CreateStrikeWitchesGraph


プロジェクトのディレクトリにstrikwitchesが作成される.

ストライクウィッチーズの相関図を解析するには?

Blueprintsを用いてTinkerGraphに相関図を書き込むことが出来た.

今回は,Graph探索のサンプルのため"StrikeWitches"というキャラクター全員が所属する頂点を追加してある.


  1. BlueprintsでTinkerGraphにストライクウィッチーズの相関図を入力する.
  2. Gremlinを使って,TinkerGraphを読み込み,
    • Gremlinのコンソールから解析してみる.
    • JavaからGremlinを使って解析してみる.

では,Gremlinを利用して相関図を解析してみる.

ストライクウィッチーズの相関図を解析するには?

Gremlinのセットアップ

% ./gremlin.sh                                                                                                              [~/Downloads/gremlin-groovy-2.1.0/bin]
         \,,,/
         (o o)
-----oOOo-(_)-oOOo-----
gremlin>

こんなの表示される.

ストライクウィッチーズの相関図を解析するには?

Gremlin に相関図を食べさせて,解析開始.

gremlin> g = new TinkerGraph("path_to_graph");
==>tinkergraph[vertices:12 edges:32 directory:path_to_graph]
gremlin> 

Vertexの一覧を取得してみる.

gremlin> g.V // GraphのVertex一覧
==>v[mio]
...
==>v[minna]
==>v[lynett]
...
==>v[gertrud]
==>v[francesca]

ストライクウィッチーズの相関図を解析するには?

宮藤芳佳年齢を取得.

gremlin> g.v("yoshika").age
==>14

宮藤芳佳指導しているのは誰?

gremlin> g.v("yoshika").in("指導").name
==>坂本美緒

宮藤芳佳のことをきっー!なんなんですのアナタは!?と思っている人が勤務態度に不満を持っている人たち

gremlin> g.v("yoshika").in("きっー!なんなんですのアナタは!?")
      .out("勤務態度に不満").name
==>シャーロット・E・イエーガー
==>フランチェスカ・ルッキーニ

ストライクウィッチーズの相関図を解析するには?

宮藤芳佳のことをきっー!なんなんですのアナタは!?と思っている人が勤務態度に不満を持っている人たち

gremlin> g.v("yoshika").in("きっー!なんなんですのアナタは!?")
      .out("勤務態度に不満").name
==>シャーロット・E・イエーガー
==>フランチェスカ・ルッキーニ

ストライクウィッチーズの相関図を解析するには?

16歳以下ウィッチ一覧

gremlin> g.v("StrikeWitches").out.filter{it.age < 16}.name
==>宮藤芳佳
==>エイラ・イルマタル・ユーティライネン
==>サーニャ・V・リトヴャク
==>リネット・ビショップ
==>ペリーヌ・クロステルマン
==>フランチェスカ・ルッキーニ

{it.age < 16}はクロージャである.outで出力されたキャラクターのVertexが,それぞれitに格納される.Groovyでitは暗黙に定義されるクロージャの変数であり,第一引数が自動的に割り当てられる.

ストライクウィッチーズの相関図を解析するには?

GremlinをJavaから使うためには,Mavenを利用するのが簡単である.

Mavenはプロジェクト管理ツールであり,他のプロジェクトのライブラリを簡単に取り込むことができる.

pom.xmlにGremlinを取り込むように記述する.

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.1.0</version>
</dependency>

"Using Gremlin through Java" よりtinkerpop/gremlin wiki

ストライクウィッチーズの相関図を解析するには?

TinkerGraphで作った,相関図を読み込む

Graph g = new TinkerGraph("path_to_graph");

GremlinPipeline の作成

GremlinPipeline<Vertex,String> pipe
 = new GremlinPipeline<Vertex,String>();
pipe.start(g.getVertex("yoshika"))....

GremlinはGraphに対して処理をするPipeをつなげて,複雑な探索を可能にする.Gremlin コンソールでは見えないが,JavaではPipesを利用しているのが確認できる.

ストライクウィッチーズの相関図を解析するには?

宮藤芳佳指導しているのは誰?

pipe.start(g.getVertex("yoshika")).in("指導").property("name");
for(String name : pipe){
 System.out.println("name")
}

宮藤芳佳のことをきっー!なんなんですのアナタは!?と思っている人が勤務態度に不満を持っている人たちの年齢

pipe.start(g.getVertex("yoshika")).in("きっー!なんなんですのアナタは!?")
 .out("勤務態度に不満").property("age");
for(Integer age : pipe){
 System.out.println(age);
}

ストライクウィッチーズの相関図を解析するには?

15歳以上ウィッチーズの名前

pipe.start(g.getVertex("StrikeWitches")).out("member")
 .filter(new PipeFunction<Vertex,Boolean>(){
  public Boolean compute(Vertex _argument){
   return (Integer)_argument.getProperty("age") >= 15;
  }
 }).name;
for(String name : pipe){
 System.out.println(name);
}

書き方としては,Gremlin コンソールでのほうが簡潔.

gremlin> g.v("StrikeWitches").out.filter{it.age > 15}.name

ストライクウィッチーズの相関図を解析するには?

Gremlin コンソールでの書き方を Java で利用することができる.

Pipe pipe = Gremlin.compile("_().out.filter{it.age > 15}.name");
pipe.setStarts(
 new SingleIterator<Vertex>(g.getVertex("StrikeWitches"));
for(Object name : pipe){
 System.out.println(name);
}

_()はGremlinePipelineに定義されている何もしないPipe

JavaでPipeを直接構築するより,こっちのほうが簡単である.

まとめ

これまでに,ストライクウィッチーズの相関図を利用してGraphDBの概要とTinkerPopの簡単な使い方を見てきた.

この発表で大体のイメージが掴めてもらえれば幸いです.


次に,具体的な利用例としてPageRankのGraphDBでの表現について発表する.

Google の PageRank アルゴリズム

Page と PageRank の GraphDB による表現

TinkerPop による PageRank の計算

PageRank アルゴリズム

PageRank の取得

Pipes による走査

Pipes による走査

TinkerPop による PageRank の計算

TinkerPop による PageRank の計算

PageRank の計算にかかる時間

PageRank の計算にかかる時間

PageRank の計算にかかる時間

今日理解してほしいこと

参考文献・サイト

なぜ PageRank なのか