ターゲット
- グラフDBの勉強のためにWindowsPC上に環境を構築したい人
- その中でも問い合わせ言語にGremlinを使いたい人
What is グラフDB?
- NoSQLのひとつ
- つながりを表現するグラフをRDBのような正規化した形ではなく、そのままの形で保存/問い合わせができる
- 数学のグラフ理論を理解してると、とっつきやすい(かも)
What is Gremlin?
- Gremlin(グレムリン)はグラフDBの問い合わせ言語のひとつ→公式ドキュメント
- グラフDBの問い合わせ言語は他にもあり、SQLに近いSPARQL(スパークル)というものもある
- 特徴的なのはノードや経路の探索をメソッドチェーンの形で問い合わせる点
例えばこんな相関図を考える。Aliceが知っている人をたどれば、Aliceの全く知らないBobにたどり着けるかどうかをGremlinで順に調べている。
// ノード(vertex)の一覧をとってきて要素を表示
gremlin> g.V().elementMap()
==>[id:1,label:person,name:Alice]
==>[id:2,label:person,name:Bob]
==>[id:3,label:person,name:Chris]
==>[id:4,label:person,name:Daisy]
==>[id:5,label:person,name:Emily]
==>[id:6,label:person,name:Finn]
==>[id:7,label:person,name:George]
// エッジ(edge)の一覧をとってきて要素を表示
gremlin> g.E().elementMap()
==>[id:7,label:knows,IN:[id:4,label:person],OUT:[id:1,label:person]]
==>[id:8,label:knows,IN:[id:5,label:person],OUT:[id:4,label:person]]
==>[id:9,label:knows,IN:[id:6,label:person],OUT:[id:5,label:person]]
==>[id:10,label:knows,IN:[id:7,label:person],OUT:[id:5,label:person]]
==>[id:11,label:knows,IN:[id:2,label:person],OUT:[id:6,label:person]]
==>[id:12,label:knows,IN:[id:3,label:person],OUT:[id:6,label:person]]
==>[id:13,label:knows,IN:[id:5,label:person],OUT:[id:3,label:person]]
==>[id:14,label:knows,IN:[id:4,label:person],OUT:[id:7,label:person]]
// AliceはBobを知らないけど、知人をたどっていけば知ってる人がいるかもしれない
gremlin> g.V().has('person','name','Alice').out('knows').path().by(valueMap())
==>[[name:[Alice]],[name:[Daisy]]]
gremlin> g.V().has('person','name','Alice').out('knows').out('knows').path().by(valueMap())
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]]]
gremlin> g.V().has('person','name','Alice').out('knows').out('knows').out('knows').path().by(valueMap())
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]],[name:[Finn]]]
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]],[name:[George]]]
gremlin> g.V().has('person','name','Alice').out('knows').out('knows').out('knows').out('knows').path().by(valueMap())
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]],[name:[Finn]],[name:[Bob]]] ←!Aliceの知人の知人の知人の知人にBobがいた!
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]],[name:[Finn]],[name:[Chris]]]
==>[[name:[Alice]],[name:[Daisy]],[name:[Emily]],[name:[George]],[name:[Daisy]]]
Windows10にUbuntuを入れて、Ubuntu上にGremlinをインストールする
Ubuntuはインストール済みと仮定。
- 作業時の環境はUbuntu 18.04 LTS
Java 8が必要なので、入ってない場合は入れる。
$ sudo apt install openjdk-8-jre
$ sudo apt install openjdk-8-jdk
入れたら公式からGremlinをダウンロードして解凍。
$ wget https://archive.apache.org/dist/tinkerpop/3.4.4/apache-tinkerpop-gremlin-console-3.4.4-bin.zip
$ unzip apache-tinkerpop-gremlin-console-3.4.4-bin.zip
解凍後にできたディレクトリ下に移動し、起動チェック。
$ cd apache-tinkerpop-gremlin-console-3.4.4
$ bin/gremlin.sh
Dec 06, 2019 12:04:40 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin>
試しにグラフを作って挙動を確認。
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().valueMap()
==>[name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[name:[peter],age:[35]]
gremlin> :exit
グラフが作成できることを確認したので、これで構築は終わり。