JanusgraphのグラフをGephiで可視化する

# 概要
現在関わっているプロダクトがJanusgraphを用いている。開発を進める中で、グラフ構造を可視化したいというニーズがあったため、Gephiを用いてグラフの可視化をしました。本記事内では、チュートリアル用のグラフデータを用いて試しているので、実際のユースケースに合わせて、その辺はうまくやって下さい。:pray:

# やったこと

- Janusgraphをdocker-composeで立ち上げる
- Janusgraphサーバー(gremlin-server)とGephiを接続して、グラフを可視化する

# 説明しないこと

- 今回の記事では、gremlinコマンドについての説明ができていません。:pray:
gremlinについて学習したい方は、[参考資料](https://qiita.com/shoyaokayama/items/40a32cd92d201db4dfde#%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99)に記載している[PRACTICAL GREMLIN](http://www.kelvinlawrence.net/book/PracticalGremlin.html)を参考にしてください。
# 動作環境

- maacOS Catalina ver.10.15.3
- Gephi 0.9.2
- Janusgraph 0.5.2

# Janusgraphとは
- オープンソースのグラフDBです。
- [Apache TinkerPop](https://tinkerpop.apache.org/)というグラフDB(OLTP)とグラフ分析(OLAP)のためのグラフコンピューティングフレームワークの、グラフDB部分としても使うことができます。
![スクリーンショット 2020-11-25 21.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/2ae40942-57e3-2da5-e3b7-e7cb7314d8b1.png)

- グラフトラバーサル言語にはGremlinを用います。グラフトラバーサル言語とは、RDBでいうSQLです。
- データの永続化に用いるバックエンドのデータベースとしては、以下のデータベースを使うことができます。(2020/11/25)
  - [Apache Cassandra](https://cassandra.apache.org/)
  - [Apache HBase](https://hbase.apache.org/)
  - [Google Cloud Bigtable](https://cloud.google.com/bigtable)
  - [Oracle BerkeleyDB](https://www.oracle.com/technetwork/database/berkeleydb/overview/index-093405.html)
  - [ScyllaDB](https://scylladb.com/)

[公式ホームページ](https://janusgraph.org/)


# Gephiとは

正確な表現は、公式にお願いするとして、ざっくりGephiとは、**グラフやネットワークを可視化するオープンソースのソフトウェアです。**



公式サイトの引用はこちら。
>Gephi is the leading visualization and exploration software for all kinds of graphs and networks. Gephi is open-source and free.
https://gephi.org/

# 手順
1. Gephiをインストール
2. Gephiに必要なPluginをインストール
3. Gephiでの設定
4. Janusgraphサーバーを起動
5. 4の中でgremlinコンソールを起動する
6. gremlinコンソールとGephiを接続する
7. トラバーサルを流して可視化する
8. Gephiで可視化結果を確認する

## 1. Gephiをインストール

以下ダウンロードページからGephiのインストーラーをダウンロードする。
https://gephi.org/users/download/

## 2. Gephiに必要なPluginをインストール

この項では、`Graph Streaming API`というプラグインをインストールします。これは、Gephiで作成したワークスペースにHTTPで接続するためのプラグインです。

1.Gephiを起動したら`New Project`を選択する
2. その後、メニューバーの`Tools > Plugins`を選択する
3. 下記画像のように`Graph Streaming`というプラグインを検索し、インストールする

![スクリーンショット 2020-11-25 22.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/973aa0a0-617a-90ee-0433-170d3ef9057e.png)
4. インストールできたらGephiの再起動を促されるので、従順に再起動してください。

## 3. Gephiでの設定

この項では、ポートを開いて、外部からのリクエストを待つための設定をします。

1. メニューバーの`Workspace > rename`を選択し、`workspace1`とかに設定してください。ここで設定したワークスペースの名前が、Janusgraphから接続する際のパスになります。
2. Gephi上のどこかに下記画像のようなStreamingウィンドウが表示されているはずなので見つけてください。(なければ、メニューバーの`Window > Streaming`を選択して表示させる。)
![スクリーンショット 2020-11-26 8.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/824d5c80-7516-fbf2-8111-c4bc9736008d.png)
3. 次に、Streamingウィンドウの`Settings...`をクリックします。すると、接続する際に用いる設定情報の確認・変更ができます。初期設定は以下のようになっています。
![スクリーンショット 2020-11-26 8.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/552f79b3-d90e-2f60-b954-41812319291f.png)
4. 設定を終えたら、StreamingウィンドウのMasterを選択し、`Master Server`を右クリックします。すると、`Start`が表示されるため、それも選択します。
5. その後、`Master Server`左側のランプが:red_circle:から:large_blue_circle:に変われば、Gephi側の設定は終了です。

## 4. Janusgraphサーバーを起動
この項では、docker-composeを用いて、Janusgraphサーバーを立ち上げます。立ち上げ方は、各々のユースケースに沿った方法で立ち上げてください。

1.下記githubレポジトリを手元にcloneしてきて、使ってみるのも良いと思います。
https://github.com/JanusGraph/janusgraph-docker

## 5. 4の中でgremlinコンソールを起動する
この項では、[gremlinコンソール](http://tinkerpop.apache.org/docs/3.4.6/tutorials/the-gremlin-console/)を起動します。gremlinコンソールとは、gremlinコマンドを実行するための対話型シェルです。

1. 4で立ち上げたJanusgraphサーバー上で、`bin/gremlin.sh`を実行する
2. すると、下記のグレムリンみたいなやつが標準出力に現れ、gremlinコンソールを立ち上げてくれます。

```
         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
```
3. `gremlin> `と表示され、コマンドを入力できる状態になっていればOKです。

## 6. gremlinコンソールとGephiを接続する
ようやく、この項でこの記事の主目的であるGephiとの接続設定をします。ここからの操作は全てgremlinコンソール上で実行します。

参考資料は[こちら](https://tinkerpop.apache.org/docs/current/reference/#gephi-plugin)です。

Gephiのプラグインをインストールします。

```
gremlin> :plugin use tinkerpop.gephi
```

Gephiに接続します。

```
gremlin> :remote connect tinkerpop.gephi
==>Connection to Gephi - http://localhost:8080/workspace1 with stepDelay:1000, startRGBColor:[0.0, 1.0, 0.5], colorToFade:g, colorFadeRate:0.7, startSize:10.0,sizeDecrementRate:0.33
```

dockerでJanusgraphを立ち上げた場合、ホストPCのlocalhostを指定する場合は、`host.docker.internal`になるため、接続情報を更新します。

```
gremlin> :remote config host host.docker.internal
==>Connection to Gephi - http://host.docker.internal:8080/workspace1 with stepDelay:1000, startRGBColor:[0.0, 1.0, 0.5], colorToFade:g, colorFadeRate:0.7, startSize:10.0,sizeDecrementRate:0.33
```

今回は、TinkerPopで用意されているチュートリアル用のグラフデータを用います。([その他のチュートリアル用グラフデータ](https://qiita.com/chromia/items/b93ef0b3a14eb875e7cc#tinkerfactory))

```
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
```

```
gremlin> :> graph
==>tinkergraph[vertices:6 edges:6]
==>false
```

## 7. トラバーサルを流して可視化する

Gephiで可視化したいグラフ構造を作るためのトラバーサルを作成します。

Gephiでトラバーサルが実行されていくのを可視化するために、以下の設定を追加します。`graph`部分は、`Graph`インスタンスじゃないとダメです。

```
:remote config visualTraversal graph
```

上記コマンドにより、`vg`という可視化用の`TraversalSource`が生成されますので、それを使用してトラバーサルを定義していきます。
`;[]`を行末につけることで、トラバーサルの繰り返しを防止します。

```
gremlin> traversal = vg.V().in().out("knows").has("age",gt(30)).outE("created").has("weight", gt(0.5d)).inV();[]
```
Gephiにトラバーサルを流します。

```
gremlin> :> traversal
```
## 8. Gephiで可視化結果を確認する

この段階では、まだ下記の画像のような状態かと思います。(おそらく。)
![スクリーンショット 2020-11-26 9.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/ea3588c0-e8bc-642b-8d9a-d3c459acaf43.png)

この状態だと、何が何だかわからないため、見た目を整えます。以下画像を参考に色々いじってみてください。
![スクリーンショット 2020-11-26 9.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234523/53de9b38-5141-35ac-14fb-34b33574fbd0.png)

# その他
#### お役立ちgremlinコマンド

- gremlinコンソールを抜ける

```
gremlin> :exit
```

- Gephiで可視化しているグラフを消去する

```
gremlin> :> clear
```

# 参考資料

- [Janusgraph](https://janusgraph.org/)
- [Gephi](https://gephi.org/)
- [PRACTICAL GREMLIN](http://www.kelvinlawrence.net/book/PracticalGremlin.html)
- [TinlerPop Documentation](https://tinkerpop.apache.org/docs/current/reference/)
- [GremlinコンソールのTips](https://qiita.com/chromia/items/b93ef0b3a14eb875e7cc#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)