Mercurial > hg > Papers > 2012 > JavaKuche
changeset 5:975d3790ca03 draft
fix
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 08 Sep 2012 08:00:08 +0900 |
parents | 125ab02ad634 |
children | 18b157820214 |
files | index.html |
diffstat | 1 files changed, 175 insertions(+), 556 deletions(-) [+] |
line wrap: on
line diff
--- a/index.html Sat Sep 08 07:56:38 2012 +0900 +++ b/index.html Sat Sep 08 08:00:08 2012 +0900 @@ -17,93 +17,89 @@ <section class='slides layout-regular template-default'> <article> <h1>GraphDB 入門<br>TinkerPop の使い方</h1> - <p>Shoshi Tamaki<br>Nobuyasu Oshiro<br>8 Sep 2012</p> + <p>Shoshi Tamaki<br>Nobuyasu Oshiro<br>08 Sep 2012</p> </article> - <!-- - <article> - <h3>TinkerPop</h3> - <br/> - <br/> - <br/> - <br/> - <img class="centered" height="300px" src="./images/tinkerpop_with_name.png"/> - </article> - --> - + <article> <h3>もくじ</h3> + <br/> + <small> <ul> - <li>ストライクウィッチーズで,GraphDB / TinkerPop 入門</li> - <li>TinkerPop を利用した GraphDB 上の PageRank の計算</li> + <li>ストライクウィッチーズで,GraphDB/TinkerPop入門</li> + <ul> + <li>GraphDBとは</li> + <li>PropertyGraphについて</li> + <li>TinkerPopとは</li> + <li>TinkerPopを使ってストライクウィッチーズの相関図を解析</li> + </ul> + <li>TinkerPop による PageRank の実装</li> + <ul> + <li></li> + <li></li> + </ul> </ul> + </small> </article> <article> <h3>GraphDB とは?</h3> - <p>グラフ構造を保存するためのデータベース.</p> - <p>グラフ構造とは,たとえばこんなもの</p> + <p>Graph構造を保存するためのデータベース.</p> + <p>Graph構造とは,たとえばこんなもの</p> <br/> <img src="./images/de2bf86e.jpeg" class="centered" height="470px"/> </article> <article> <h3>GraphDB とは?</h3> - <p>このような構造をしたグラフは<span style="color: red">Property Graph</span>と呼ばれる.</p> - <p>Property Graph はこんな特徴がある.</p> + <p>このような構造をしたGraphは<span style="color: red">PropertyGraph</span>と呼ばれる.</p> + <p>PropertyGraphとは,</p> <br/> <img src="./images/propertygraph_sw.png" height="470px" class="centered"/> </article> <article> - <h3>Property Graph</h3> + <h3>PropertyGraph</h3> + <p><span color="red">関係・人物・名前・特徴</span>は<span color="red">Vertex・Edge・Label・Property</span>と呼ばれる.</p> <small> - <p><span color="red">関係・人物・名前・特徴</span>は<span color="red">辺・頂点・ラベル・プロパティ</span>と呼ばれる.</p> <ul> - <li>辺 ( 関係 ) が方向を持つ</li> - <li>頂点 ( 人物 ) と辺 ( 関係 ) はラベル ( 名前 ) を持つ</li> - <li><span style="color: red">頂点と辺は Key / Value のマップ ( 特徴 ) を持っている.</span></li> + <li>Edge(関係)が方向を持つ</li> + <li>Vertex(人物)とEdge(関係)はLabel(名前)を持つ</li> + <li><span style="color: red">VertexとEdgeはKey/Valueのマップ(Property)を持っている.</span></li> </ul> </small> <img src="./images/propertygraph_sw2.png" height="400px" class="centered"/> </article> <article> - <h3>GraphDB とは?</h3> - <p>複数存在する GraphDB は,主に<span color="red"> Property Graph </span>を格納する.</p> - <p>GraphDB は,保存された Graph の辺を渡り歩き,目的のデータを取得するようなデータベースである.</p> + <h3>GraphDBとは?</h3> + <p>GraphDBは,保存されたGraphのVertex,Edgeを渡り歩き,目的のデータを取得するようなデータベースである.</p> + <p>渡り歩くことをTraverseという.</p> + <br/> <img src="./images/traverse_sw.png" class="centered"/> </article> + <!-- <article> - <h3>GraphDB 入門</h3> + <h3>GraphDB入門</h3> <p>ここまでに,GraphDB とそのデータ構造である,Property Graph とは何か説明してきた.</p> <p>今日は,この<span style="color: red">ストライクウィッチーズの相関図</span>を GraphDB に叩きこみ <span style="color:red">TinkerPop</span> を使って解析する.</p> <br/> <img src="./images/today-demo.png" class="centered"/> </article> + --> <article> <h3>TinkerPop</h3> - <p>TinkerPop は複数存在する GraphDB を統一した手法で利用出来るようにする,ことを目的としたプロジェクトの集合である.</p> - <p>GraphDB を操作する様々なツールも開発している.</p> + <p>TinkerPopはGraphDBを利用するためのツール群である.</p> <br/> <br/> <img height="300px" src="./images/tinkerpop_with_name.png" class="centered"/> </article> <article> - <h3>TinkerPop</h3> - <p>本日は,Blueprints , Pipes , Gremlin , Rexster を利用する.</p> - <p><span style="color:red">Frames</span> と <span style="color:red">Furnace</span> に関しては利用しないので触れない.</p> - <br/> - <br/> - <img height="300px" src="./images/today-used.png" class="centered"/> - </article> - - <article> <h3>Blueprints</h3> - <p>Blueprints は,Property Graph Model のための interface , implementation , outplementations(造語?) を提供する.</p> - <p>GraphDB の世界の JDBC の立場を目指している.</p><br/> + <p>Blueprintsは,PropertyGraphのJavaのinterfaceを提供する.</p> + <p>GraphDBの世界のJDBCの立場を目指している.</p><br/> <small> Blueprints を実装している GraphDB の一例 <ul> @@ -117,104 +113,104 @@ </article> <article> - <h3>Pipes</h3> - <p>Pipes は,Graph を処理するためのフレームワーク.複数の処理を Pipe として定義する.その Pipe をつなげることにより,Graph を走査し目的のデータを取得する.</p> - <p>Gremlin は Pipe を利用して Graph を Traverse する.</p> - <small> - <pre>Graph g = ... -GremlinPipeline pipe = new GremlinPipeline(); -pipe.start(g.getVertex(1)).out("knows").property("name"); -pipe.setStarts(new SingleIterator>Vertex<(graph.getVertex(1))); -for(Object name : pipe){ - System.out.println((String)name); -}</pre> - </small> - <img src="./images/pipes-logo.png" /> - </article> - - <article> <h3>Gremlin</h3> - <p>Graph を走査するための言語.GraphDB に対して Query を発行することが出来る.Shell の様なプロンプトも利用することが可能である.</p> - <pre>gremlin> // lets traverse to marko's 30+ year old friends' created projects -gremlin> v.out('knows').filter{it.age > 30}.out('created').name -==>ripple -==>lop</pre> - <br/> + <p>GraphをTraverseするための言語.Groovyがベースである.GraphDBに対してQueryを発行することが出来る.コンソールも利用できる.</p> + <pre>gremlin> graph.v(1).out.name +==>vadas +==>lop +==>josh</pre> + <p>GremlinはPipesを利用して,GraphをTraverseする..out.nameがPipeである..</p> <img src="./images/gremlin-logo.png"/> - </article> - - <!-- - <article> - <h3>Rexster</h3> - <p>Rextster は,Blueprints を対応した GraphDB に対して HTTP による API を提供するサーバーである.</p> - <p>HTTP 経由でデータの取得を行うことが出来るほか.Graph の編集を付属の WebApplication で行うことが出来る</p> - <small> - <pre>http://localhost:8182/graphs/tinkergraph/vertices/1 -{ - "version":"*.*", - "results": { "_type":"vertex", "_id":"1", - "name":"marko", "age":29 - },"queryTime":0.12351 -}</pre> - </small> - <img src="./images/rexster-logo.png"/> - </article> - --> - + </article> + + <article> + <h3>Pipes</h3> + <p>PipesはGraphを処理するためのフレームワークである.Pipeという処理の単位を複数連結し,複雑なTraverseを実現する.</p> + <img src="./images/pipes.png" height="150px" class="center"/> + <p>graph.v(1)はGraphからIDか1のVertexを取得する,.out .name がぞれぞれPipeに値する.</p> + <img src="./images/pipes-logo.png" height="200px"/> + </article> + + <article> + <h3>Pipes</h3> + <p>この例題の動作は・・・</p> + <br/> + <br/> + <img style="float: left; margin-right:10px" src="./images/pipes-mario-2.png" height="300px"/> + <br/> + <img src="./images/pipes-mario-4.png" height="75px"/> + <pre>gremlin> g.v(1).out.name +==>vadas +==>lop +==>josh</pre> + <br style="clear: both;"/> + <small> + <p>outはVertexから外向きのEdgeで繋がっているVertex一覧を取得する,nameはProperty名でPipeではVertexのnameを取得している.</p> + </small> + </article> + <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> <br/> <ol> - <li>Blueprints で TinkerGraph にストライクウィッチーズの相関図を入力する.</li> - <li>Gremlin を使って,TinkerGraph を読み込み,</li> + <li>BlueprintsでTinkerGraphにストライクウィッチーズの相関図を入力する.</li> + <li>作成したTinkerGraphを,</li> <ul> - <li>Java から Gremlin を使って解析してみる.</li> - <li>Gremlin のコンソールから解析してみる.</li> + <li>Gremlinのコンソールから解析してみる.</li> + <li>JavaからGremlinを使って解析してみる.</li> </ul> </ol> <br/> - <p>まずは,TinkerGraph にストライクウィッチーズの相関図を入力する.</p> + <p>まずは,TinkerGraphにストライクウィッチーズの相関図を入力する.</p> </article> - <!-- <article> - <h3>Rexster + TinkerGraph で GraphDB を用意する.</h3> - <p>Rexster の downloads より <span style="color:red">rexster-server-2.1.0.zip</span> をダウンロードし解凍.</p> - <p><a href="https://github.com/tinkerpop/rexster/downloads">https://github.com/tinkerpop/rexster/downloads</a></p> - <pre>$ cd rexster-server-2.1.0/bin - $ ./rexster.sh --start</pre> - <p>Rexster はデフォルトで TinkerGraph が有効になるのでそのまま起動するだけで良い.</p> - <p>これで,HTTP経由で TinkerGraph にアクセスできるようになり,GraphDB を用意できた.</p> + <h3>この発表のサンプルコードについて</h3> + <br/> + <p><span style="color:red">hg clone https://bitbucket.org/suikwasha/graphdb_javakuche</span></p> + <br/> + <small> + <p>Mavenというプロジェクト管理ツールを利用したプロジェクトになってます.</p> + </small> + <pre>ビルド方法・解凍したディレクトリに移動して +$ mvn compile</pre> </article> - --> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> - <p>Blueprints は,GraphDB へのインターフェイスを提供する.TinkerGraph は Blueprints を用いて利用できる.</p> - <p>相関図の Graph を作るためには,<span style="color:red">Graph</span> を作成し<span style="color:red">人物(頂点)</span>と<span style="color:red">関係(辺)</span>,<span style="color:red">特徴</span>を作る必要がある.</p> + <p>Blueprintsは,GraphDBへのインターフェイスを提供する.TinkerGraphはBlueprintsを用いて利用できる.</p> <small> - <pre>// 相関図(Graph) の作成 + <p>相関図のGraphを作るためには,<span style="color:red">Graph</span>を作成し<span style="color:red">人物(Vertex)</span>と<span style="color:red">関係(Edge)</span>,<span style="color:red">特徴(Property)</span>を作る必要がある.</p> + </small> + <small> + <pre>// 相関図(Graph)の作成,データを保存するディレクトリを引数に取る Graph g = new TinkerGraph();</pre> - <pre>// 人物(頂点)の作成 + <pre>// 人物(Vertex)の作成,設定したいIDを引数に取る Vertex character = g.addVertex(ID);</pre> - <pre>// 関係(辺)の作成 + <pre>// 関係(Edge)の作成,設定したいIDを引数に取る Edge relation = g.addEdge(ID,From,To,Label);</pre> - <pre>// 特徴(プロパティ)の作成 , 頂点・辺ともに同様のメソッド + <pre>// 特徴(Property)の作成 , Vertex・Edgeともに同様のメソッド character.setProperty(PropertyName,PropertyValue);</pre> </small> </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> + <p>これを入力します.</p> + <img src="./images/de2bf86e.jpeg" height="550px" class="centered"/> + </article> + + <article> + <h3>ストライクウィッチーズの相関図を解析するには?</h3> <p>画像を見ながらコードに書き起こすと・・・</p> <small> - <pre>Graph g = new TinkerGraph("./strikewitches"); // データの保存先 + <pre>Graph g = new TinkerGraph("./strikewitches"); // 保存ディレクトリ Vertex strikeWitches = g.addVertex("StrikeWitches"); Vertex yoshika = g.addVertex("yoshika"); -yoshika.setProperty(propName,"Yoshika Miyafuji"); -yoshika.setProperty(propRank,"Sergeant"); +yoshika.setProperty(propName,"宮藤芳佳"); +yoshika.setProperty(propRank,"軍曹"); yoshika.setProperty(propAge,14); -yoshika.setProperty(propCV,"Misato Fukuen"); +yoshika.setProperty(propCV,"福圓美里"); yoshika.setProperty(propUnit,"扶桑皇国海軍遣欧艦隊"); yoshika.setProperty(propPersonality,"明るく前向きで一生懸命"); Vertex lynett = g.addVertex("lynett"); @@ -228,36 +224,46 @@ g.addEdge(null,lynett,yoshika,"仲良し新人コンビ");</pre> </small> </article> + + <article> + <h3>CreateStrikeWitchesGraph</h3> + <p>実際にコードを動作させてTinkerGraphに入力する.</p> + <br/> + <small> + <p>mvn exec:java -Dexec.mainClass=suikwasha.javakuche.CreateStrikeWitchesGraph</p> + </small> + <br/> + <p>プロジェクトのディレクトリにstrikwitchesが作成される.</p> + </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> - <p>Blueprints を用いて TinkerGraph に相関図を書き込むことが出来た.</p> - <p>今回は,Graph 探索のサンプルのため"StrikeWitches"というキャラクター全員が所属する頂点を追加してある.</p> + <p>Blueprintsを用いてTinkerGraphに相関図を書き込むことが出来た.</p> + <p>今回は,Graph探索のサンプルのため"StrikeWitches"というキャラクター全員が所属する頂点を追加してある.</p> <br/> <ol> - <li>Blueprints で TinkerGraph にストライクウィッチーズの相関図を入力する.</li> + <li>BlueprintsでTinkerGraphにストライクウィッチーズの相関図を入力する.</li> <span style="color:red"> - <li>Gremlin を使って,TinkerGraph を読み込み,</li> + <li>Gremlinを使って,TinkerGraphを読み込み,</li> <ul> - <li>Java から Gremlin を使って解析してみる.</li> - <li>Gremlin のコンソールから解析してみる.</li> + <li>Gremlinのコンソールから解析してみる.</li> + <li>JavaからGremlinを使って解析してみる.</li> </ul> </span> </ol> <br/> - <p>では,Gremlin を利用して相関図を解析してみる.</p> + <p>では,Gremlinを利用して相関図を解析してみる.</p> </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> - <p>Gremlin のセットアップ</p> + <p>Gremlinのセットアップ</p> <ul> - <li>github tinkerpop / gremlin > Wiki の downloads から <span style="color:red">gremlin-groovy-2.1.0.zip</span>を利用する.</span></li> + <li>github tinkerpop/gremlin > Wiki のdownloadsから<span style="color:red">gremlin-groovy-2.1.0.zip</span>を利用する.</span></li> <li>解凍して展開する.</li> - <li>bin/gremlin.sh を実行</li> + <li>bin/gremlin.shを実行</li> </ul> - <pre>shoshi@collett% ./gremlin.sh [~/Downloads/gremlin-groovy-2.1.0/bin] -Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 + <pre>% ./gremlin.sh [~/Downloads/gremlin-groovy-2.1.0/bin] \,,,/ (o o) -----oOOo-(_)-oOOo----- @@ -271,8 +277,8 @@ <pre>gremlin> g = new TinkerGraph("path_to_graph"); ==>tinkergraph[vertices:12 edges:32 directory:path_to_graph] gremlin> </pre> - <p>頂点の一覧を取得してみる.</p> - <pre>gremlin> g.V + <p>Vertexの一覧を取得してみる.</p> + <pre>gremlin> g.V // GraphのVertex一覧 ==>v[mio] ... ==>v[minna] @@ -299,6 +305,16 @@ <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> + <p><small><span style="color:red">宮藤芳佳</span>のことを<span style="color:red">きっー!なんなんですのアナタは!?</span>と思っている人が<span style="color:red">勤務態度に不満</span>を持っている人たち</small></p> + <pre>gremlin> g.v("yoshika").in("きっー!なんなんですのアナタは!?") + .out("勤務態度に不満").name +==>シャーロット・E・イエーガー +==>フランチェスカ・ルッキーニ</pre> + <img src="./images/traverse_demo.png" height="250px" class="centered"/> + </article> + + <article> + <h3>ストライクウィッチーズの相関図を解析するには?</h3> <p><span style="color:red">16歳以下</span>の<span style="color:red">ウィッチ一覧</span></p> <pre>gremlin> g.v("StrikeWitches").out.filter{it.age < 16}.name ==>宮藤芳佳 @@ -307,44 +323,47 @@ ==>リネット・ビショップ ==>ペリーヌ・クロステルマン ==>フランチェスカ・ルッキーニ</pre> - <p>これを Java のプログラムからもやってみる.</p> + <small> + <p>{it.age < 16}はクロージャである.outで出力されたキャラクターのVertexが,それぞれitに格納される.Groovyでitは暗黙に定義されるクロージャの変数であり,第一引数が自動的に割り当てられる.</p> + </small> </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> - <p>Gremlin を Java から使うためには,Maven を利用するのが簡単である.</p> - <p>Maven はプロジェクト管理ツールであり,他のプロジェクトのライブラリを簡単に取り込むことができる.</p> - <p>pom.xml に Gremlin を取り込むように記述する.</p> + <p>GremlinをJavaから使うためには,Mavenを利用するのが簡単である.</p> + <p>Mavenはプロジェクト管理ツールであり,他のプロジェクトのライブラリを簡単に取り込むことができる.</p> + <p>pom.xmlにGremlinを取り込むように記述する.</p> <pre><dependency> <groupId>com.tinkerpop.gremlin</groupId> <artifactId>gremlin-java</artifactId> <version>2.1.0</version> </dependency></pre> - <p>"Using Gremlin through Java" より tinkerpop / gremlin wiki</p> + <p>"Using Gremlin through Java" よりtinkerpop/gremlin wiki</p> </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> - <p>TinkerGraph で作った,相関図を読み込む</p> + <p>TinkerGraphで作った,相関図を読み込む</p> <pre>Graph g = new TinkerGraph("path_to_graph");</pre> <p>GremlinPipeline の作成</p> - <pre>GremlinPipeline pipe = new GremlinPipeline(); + <pre>GremlinPipeline<Vertex,String> pipe + = new GremlinPipeline<Vertex,String>(); pipe.start(g.getVertex("yoshika"))....</pre> - <p>Gremlin は Graph に対して、ある処理をする Pipe をつなげることにより,複雑な探索を可能にする.Gremlin コンソールではあまり見えないが,Java では Pipes を利用しているのが確認できる.</p> + <p>GremlinはGraphに対して処理をするPipeをつなげて,複雑な探索を可能にする.Gremlin コンソールでは見えないが,JavaではPipesを利用しているのが確認できる.</p> </article> <article> <h3>ストライクウィッチーズの相関図を解析するには?</h3> <p><span style="color:red">宮藤芳佳</span>を<span style="color:red">指導</span>しているのは誰?</p> <pre>pipe.start(g.getVertex("yoshika")).in("指導").property("name"); -for(Object name : pipe){ +for(String name : pipe){ System.out.println("name") }</pre> <p><small><span style="color:red">宮藤芳佳</span>のことを<span style="color:red">きっー!なんなんですのアナタは!?</span>と思っている人が<span style="color:red">勤務態度に不満</span>を持っている人たちの年齢</small></p> <pre>pipe.start(g.getVertex("yoshika")).in("きっー!なんなんですのアナタは!?") .out("勤務態度に不満").property("age"); -for(Object age : pipe){ - System.out.println("age"); +for(Integer age : pipe){ + System.out.println(age); }</pre> </article> @@ -352,12 +371,12 @@ <h3>ストライクウィッチーズの相関図を解析するには?</h3> <p><span style="color:red">15歳以上</span>の<span style="color:red">ウィッチーズの名前</span></p> <pre>pipe.start(g.getVertex("StrikeWitches")).out("member") - .filter(new PipeFunction<Integer,Boolean>(){ - public Boolean compute(Integer _argument){ - return _argument >= 15; + .filter(new PipeFunction<Vertex,Boolean>(){ + public Boolean compute(Vertex _argument){ + return (Integer)_argument.getProperty("age") >= 15; } }).name; -for(Object name : pipe){ +for(String name : pipe){ System.out.println(name); }</pre> <p>書き方としては,Gremlin コンソールでのほうが簡潔.</p> @@ -373,41 +392,26 @@ for(Object name : pipe){ System.out.println(name); }</pre> - <p>こっちのほうが簡単である.</p> - <p>このようにして,TinkerPop を使って,ストライクウィッチーズの相関図を解析してみることができた.</p> + <p>_()はGremlinePipelineに定義されている何もしないPipe</p> + <p>JavaでPipeを直接構築するより,こっちのほうが簡単である.</p> </article> <article> <h3>まとめ</h3> + <p>これまでに,ストライクウィッチーズの相関図を利用してGraphDBの概要とTinkerPopの簡単な使い方を見てきた.</p> + <p>この発表で大体のイメージが掴めてもらえれば幸いです.</p> <ul> - <li>GraphDB は,保存された Graph の辺を渡り歩き,目的のデータを取得するようなデータベースである</li> - <li>TinkerPop は複数存在する GraphDB を統一した手法で利用出来るようにする,ことを目的としたプロジェクトの集合である.</li> - <li>Blueprints は,Property Graph Model のための interface を提供する.</li> - <li>Pipes は,Graph を処理するためのフレームワーク.複数の処理を Pipe として定義する.</li> - <li>Gremlin は,Graph を走査するための言語.GraphDB に対して Query を発行することが出来る.</li> + <li>GraphDBは,GraphのEdgeをTraverseして,目的のデータを取得するデータベース</li> + <li>GraphDBは,PropertyGraphを格納する.</p> + <li>TinkerPopは,GraphDBを利用するためのツールの集合</li> </ul> + <br/> + <p>次に,具体的な利用例としてPageRankのGraphDBでの表現について発表する.</p> </article> - - <article> - <h3>まとめ</h3> - <p>次は,GraphDB の例題として GraphDB を利用した PageRank の計算を TinkerPop を利用して行なって見る.</p> - - </article> - + -<!-- - <article> - <h1><font size=10em> - TinkerPop による PageRank の実装 - </font> - </h1> - <p> - 琉球大学 大城信康 - <br> - Sep. 08, 2012 - </p> - </article> ---> + + <article> @@ -423,21 +427,6 @@ <article> - <h3>なぜ PageRank なのか</h3> - <ul> - <li>PageRank は Page と Page のリンクの有無を利用して計算できる。</li> - <li>GraphDB は Vertex と Vertex を結ぶ Edge を走査(Traverse)することで、 - 目的のデータを得るようなデータベースである。</li> - <li>また、GraphDB は局所性のあるデータを高速に計算することができる。 </li> - <li>PageRank の Page の関係は GraphDB の Vertex と Edge で表すことが出来る。 </li> - <li>また、Page の数が増えても局所的な計算ができるため GraphDB は PageRank - を求める DB に向いている。</li> - </ul> - </article> - - - - <article> <h3>Page と PageRank の GraphDB による表現</h3> <ul> <li>アンサイクロペディアの各ページを GraphDB で表す。</li> @@ -495,32 +484,6 @@ </ul> </article> -<!-- - <article> - <h3>PageRank </h3> - <ul> - <li>TinkerPop 上での表現</li> - <p class="center"> - <img src="./pic/graph2.png" style="height:70%;"> - </p> - <small><p>PageRankは小数点第三位で四捨五入</p></small> - </ul> - </article> ---> -<!-- - <article> - <h3>アンサイクロペディのページを TinkerGraph で表現</h3> - <ol> - <li>XML のデータからページとリンクの関係を取り出す。</li> - <li>Blueprints を用いて TinkerGraph にページの情報を書き込む。</li> - <li></li> - </ol> - <ul> - <li>PageRank の計算に必要な処理を Pipes を使って行う。</li> - </ul> - </article> ---> - <article> <h3>Pipes による走査</h3> <ul> @@ -692,10 +655,6 @@ </ul> </article> - - - - <article> <h3>今日理解してほしいこと</h3> <ul> @@ -728,359 +687,19 @@ <article> - <h3>RDB (SQL文)との比較</h3> + <h3>なぜ PageRank なのか</h3> <ul> - <li>RDB 上で PageRank を計算するとどうなるのか。</li> - <li>次のグラフを RDB で表し、 PageRank を求める SQL文を考えてみる。</li> + <li>PageRank は Page と Page のリンクの有無を利用して計算できる。</li> + <li>GraphDB は Vertex と Vertex を結ぶ Edge を走査(Traverse)することで、 + 目的のデータを得るようなデータベースである。</li> + <li>また、GraphDB は局所性のあるデータを高速に計算することができる。 </li> + <li>PageRank の Page の関係は GraphDB の Vertex と Edge で表すことが出来る。 </li> + <li>また、Page の数が増えても局所的な計算ができるため GraphDB は PageRank + を求める DB に向いている。</li> </ul> - </article> + </article> - <article> - <h3>RDB (SQL文)との比較</h3> - <ul> - <p class="center"> - <img src="./pic/rdbGraph.png" style="height:70%;"> - </p> - <small><li>全てのエッジの関係は"HasLink"とする。</li></small> - </ul> - </article> - - <article> - <h3>RDB (SQL文)との比較</h3> - <ul> - <li>Table は、Vertex と Edge のプロパティの情報を持つものと、 - Edge が伸びている方向を表すものができる。</li> - <table style="width:50%;"> - <tr> - <td>vid</td> - <td>pageTitle</td> - <td>pageRank</td> - </tr> - <tr> - <td>1</td> - <td></td> - <td></td> - </tr> - <tr> - <td>2</td> - <td></td> - <td></td> - </tr> - <tr> - <td>3</td> - <td></td> - <td></td> - </tr> - <caption>vid</caption> - </table> - </ul> - </article> - - <article> - <h3>RDB (SQL文)との比較</h3> - <ul> - <table> - <td> - <table> - <tr> - <td>eid</td> - <td>relationship</td> - </tr> - <tr> - <td>1</td> - <td>HasLink</td> - </tr> - <tr> - <td>2</td> - <td>HasLink</td> - </tr> - <tr> - <td>3</td> - <td>HasLink</td> - </tr> - <tr> - <td>4</td> - <td>HasLink</td> - </tr> - <tr> - <td>5</td> - <td>HasLink</td> - </tr> - <tr> - <td>6</td> - <td>HasLink</td> - </tr> - <tr> - <td>7</td> - <td>HasLink</td> - </tr> - <tr> - <td>8</td> - <td>HasLink</td> - </tr> - <tr> - <td>9</td> - <td>HasLink</td> - </tr> - <caption>eid</caption> - </table> - </td> - <td> - <table> - <tr> - <td>eid</td> - <td>fromVer</td> - <td>toVer</td> - </tr> - <tr> - <td>1</td> - <td>8</td> - <td>5</td> - </tr> - <tr> - <td>2</td> - <td>7</td> - <td>5</td> - </tr> - <tr> - <td>3</td> - <td>6</td> - <td>5</td> - </tr> - <tr> - <td>4</td> - <td>1</td> - <td>5</td> - </tr> - <tr> - <td>5</td> - <td>1</td> - <td>4</td> - </tr> - <tr> - <td>6</td> - <td>1</td> - <td>3</td> - </tr> - <tr> - <td>7</td> - <td>1</td> - <td>2</td> - </tr> - <tr> - <td>8</td> - <td>2</td> - <td>2</td> - </tr> - <tr> - <td>9</td> - <td>4</td> - <td>3</td> - </tr> - <caption>graph</caption> - </table> - </td> - </table> - - </ul> - </article> - - <article> - <h3>RDB (SQL文)との比較</h3> - <ul> -<!-- <li>SQL 文で PageRank を求める。</li> --> - <li>Vertex 5 に対してリンクを張っている Vertex(SQL) </li> - <pre> -select vid from vid,eid,graph -where eid.relationship='HasLink' and eid.eid=graph.eid -and graph.fromVer=vid.vid and graph.toVer=5; </pre> - </ul> - </article> - - <article> - <h3>RDB (SQL文)との比較</h3> - <ul> - <li>RDB(SQL文)では GraphDB の走査(Traverse) がしにくい。</li> - <li></li> - </ul> - </article> - - - - - - - - <!-- - - <article> - <h3>GraphDB の定義</h3> - <p><span style="color:red">Property Graph</span> を実装して,その API を提供すれば GraphDB となるわけではない.</p> - <p>GraphDB は</p> - <br/> - <p><span style="color:red">index-free adjacency</span></p> - <br/> - <p>でなければいけない.</p> - <p>これは,GraphDB の実装において,頂点に隣接する頂点を参照する際に,再度 Graph 全体のインデックスを参照してはいけないということである.</p> - <p>頂点は隣接する頂点への参照を自身で保持している.</p> - </article> - - <article> - <h3>GraphDB の定義</h3> - <p>内部の実装がこんな感じだとダメ</p> - <p>内部で,頂点に接続されている頂点のデータを取得する際に再度Index-Treeを参照している.</p> - <br/> - <img class="centered" src="./images/index-dependent-adjacency.png"/> - </article> - - <article> - <h3>GraphDB の定義</h3> - <p>これはOK</p> - <p>頂点が他の頂点への参照を保持する,Index-Tree を参照しない ( index-free )</p> - <br/> - <img class="centered" src="./images/index-free-adjacency.png"/> - </article> - - <article> - <h3>GraphDB の実装</h3> - <p>GraphDB の実装にはどんなものがあるの?</p> - <table> - <tbody> - <tr> - <th>名前</th> - <th>言語</th> - <th>特徴</th> - </tr> - <tr> - <td>Neo4j</td> - <td>Java</td> - <td>ライブラリ・ツールがたくさんある</td> - </tr> - <tr> - <td>OrientDB</td> - <td>Java</td> - <td>SQL ライクな構文が使える</td> - </tr> - <tr> - <td>sones</td> - <td>C#</td> - <td>Property Hyper Graph , GQL</td> - </tr> - <tr> - <td>InfiniteGraph</td> - <td>C++</td> - <td>Distributed Graph Database</td> - </tr> - </tbody> - </table> - <br/> - <p>沢山の GraphDB 実装がある.それぞれの GraphDB でインターフェイスが異なり,ベンダーロックインな実装になることが多いと言われている.</p> - </article> - - - <article> - <h3>Frames</h3> - <p>Graph をオブジェクトとして気軽に扱えるようにするためのフレームワーク,アノテーションにより,オブジェクトと Graph の関係を定義する.</p> - <small> - <pre>public interface Person { - @Property("name") public String getName(); -} -public class Frames { - public Frames() { - FramedGraph<Neo4jGraph> graph = new FramedGraph<Neo4jGraph>(new Neo4jGraph("/tmp/neo4j")); - Person person = graph.getVertex(1, Person.class); - person.getName(); // equals "marko" - } -}</pre> - </small> - <img src="./images/frames-logo.png" height="100px"/> - </article> - - <article> - <h3>Furnace</h3> - <p>グラフ解析のためのアルゴリズムパッケージ</p> - <p>世の中には沢山のグラフ理論に基づくアルゴリズムが考案されているが,しかし多くは Property Graph のものではない,</p> - <p>Furnace は Property Graph をそれらのアルゴリズムで利用できるようにする.</p> - <p>まだあんまり進んでいないようで・・・</p> - <br/> - <br/> - <img src="./images/furnace-logo.png"/> - </article> - - <article> - <h3>TinkerPop を使ってみよう</h3> - <p>今日は実際に以下のプロジェクトを利用してみます.</p> - <br/> - <ul> - <li>Blueprints</li> - <li>Pipes</li> - <li>Gremlin</li> - <li>Rexster</li> - <li>TinkerGraph</li> - </ul> - <br/> - <p>TinkerGraph は TinkerPop に付属しているインメモリグラフデータベース</p> - </article> - - <article> - <h3>TinkerPop を使ってみよう</h3> - <br/> - <small> - <ul> - <li>TinkerGraph (In-Memory GraphDB) を Rexster で使ってみる.</li> - <li>Rexster の RESTAPI を Blueprints を使ってアクセスしてみよう.</li> - <li>作った Graph を Rexster の GodHouse から見てみよう.</li> - <li>Gremlin で Rexster に書き込んだ Graph を Traverse してみよう.</li> - </ul> - <br/> - </small> - <img height="300px" src="./images/today-demo.png"/> - </article> - - <article> - <h3>TinkerPop を使ってみよう</h3> - <small> - <br/> - <p>TinkerGraph (In-Memory GraphDB) を Rexster で使ってみる.</p> - <br/> - <Ul> - <li>Rexster を tinkerpop/rexster wiki からダウンロードして展開する</li> - <li>今回利用した Rexster は 2.1.0 を利用.</li> - <li>bin/rexster.sh --start</li> - <li>これで,localhost:8182 でサーバーが起動する.</li> - <li>管理画面 : http://localhost:8182/doghouse/main/graph/tinkergraph</li> - </ul> - </small> - </article> - - <article> - <h3>TinkerPop を使ってみよう</h3> - <small> - <br/> - <p>Rexster の RESTAPI を Blueprints を使ってアクセスしよう</li> - <br/> - <ul> - <li>Blueprints を使ってグラフを書き込んでみる.</li> - <li>利用した Blueprints は 2.1.0 を利用</li> - <li>Eclipse + m2eclipse を使う.</li> - <li>どっかにソースコードをあげます.</li> - </ul> - </small> - </article> - - <article> - <h3>TinkerPop を使ってみよう</h3> - <small> - <br/> - <p>Rexster の RESTAPI を Blueprints を使ってアクセスしよう</li> - <br/> - <ul> - </ul> - </small> - </article> - - --> </section> </body> </html>