Windows10上のUbuntuにGremlin実行環境の構築

# ターゲット
- グラフDBの勉強のためにWindowsPC上に環境を構築したい人
- その中でも問い合わせ言語にGremlinを使いたい人

# What is グラフDB？
- NoSQLのひとつ
- つながりを表現するグラフをRDBのような正規化した形ではなく、そのままの形で保存/問い合わせができる
- 数学のグラフ理論を理解してると、とっつきやすい(かも)

# What is Gremlin？
- Gremlin(グレムリン)はグラフDBの問い合わせ言語のひとつ→[公式ドキュメント](http://tinkerpop.apache.org/docs/current/reference/)
- グラフDBの問い合わせ言語は他にもあり、SQLに近いSPARQL(スパークル)というものもある
- 特徴的なのはノードや経路の探索をメソッドチェーンの形で問い合わせる点

例えばこんな相関図を考える。Aliceが知っている人をたどれば、Aliceの全く知らないBobにたどり着けるかどうかをGremlinで順に調べている。  
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207700/bbad3f34-c346-2bbe-466c-929317fd37a1.png)

```example
// ノード(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
```
グラフが作成できることを確認したので、これで構築は終わり。