【入門】TigerGraphを触ってみた ~導入編~

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217344/39b70318-49ed-9a1f-c228-dfc1efdb8347.png)
引用：https://info.tigergraph.com/gsql

# はじめに
GraphDBのTigerGraphをざっくり理解するためのエントリーです。
[公式ドキュメント](https://doc.tigergraph.com/index.html)と触った感じを基に、TigerGraphの概要や基礎部分、個人的に特徴的と思った部分をまとめました。

# TigerGraphとは
TigerGraphとは、高速でスケーラブルなGraphDBです。
Native Parallel Graphと呼ばれる技術によって、リアルタイムに完全な分散型の並列グラフコンピューティングを提供します。

# GraphDBとは
そもそも、GraphDB自体聞き慣れないという方も多いと思うので、簡単に説明します。

まず、**「Graph」**とは、頂点と辺で構成されます。頂点のことを**Vertex**または**Node**、辺のことを**Edge**と呼び、頂点と辺で何かしらの関係を表現します。
例えば、「AさんとBさんは友達」という関係をグラフで表現すると、以下となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217344/9d292c16-d328-3853-dc75-734ec8c8d50d.png)


そして、ある頂点に隣接している頂点の探索が高速な仕組みを持つデータベースが**「GraphDB」**です。
※RDBでも他のDBでもGraph構造を表現することは可能です。

GraphDBは、「あるユーザの友達の友達が知りたい」や「スタート地点からゴール地点までの最短経路が知りたい」といったときに活躍してくれます。

参考：https://www.slideshare.net/doryokujin/graphdbgraphdb

# TigerGraphのインストール
インストールは、ドキュメントに記載の方法でサクッと完了しました。
私が触ったときは、AWSにインスタンスを作成し、Ubuntu上にインストールしました。

```
$ wget http://dl.tigergraph.com/tigergraph-developer-latest.tar.gz
$ tar xzf <your_tigergraph_package>.tar.gz
$ cd tigergraph-*/
$ sudo ./install.sh
# y -> N -> N -> N
```

インストール時に指定しない場合、`tigergraph`というユーザが作成され、以後そのユーザで操作します。
この場合、次回操作時は、`su - tigergraph`してから操作します。

# GSQL
GSQLは、TigerGraphのSQLライクなクエリです。
コンソール上から`gsql`と入力すると、GSQLで操作できるようになります。
下記のサンプルは、公式ドキュメントから抜粋しています。

### Vertexの定義
Vertexは、`CREATE VERTEX`コマンドで定義します。`PRIMARY_ID`が必須項目です。

```
GSQL > CREATE VERTEX person (PRIMARY_ID name STRING, name STRING, age INT, gender STRING, state STRING)
```

### Edgeの定義
Edgeは、`CREATE ... EDGE`コマンドで定義します。`UNDIRECTED`は、双方向のEdgeであることを示します。また、単一方向のEdgeは、`DIRECTED`を指定します。
`FROM`と`TO`にEdgeが接続するVertexを指定します。個々のEdgeは、Vertexの`PRIMARY_ID`を`FROM`、`TO`に与えることで関係を指定します。

```
GSQL > CREATE UNDIRECTED EDGE friendship (FROM person, TO person, connect_day DATETIME)
```

### Graphの作成
`CREATE GRAPH`コマンドで、定義されたVertexとEdgeで構成されるグラフを作成します。

```
GSQL > CREATE GRAPH social (person, friendship)
```

ちなみに、グラフに関連する定義を全て消す場合は、GSQLで`drop all`です。

### データのロード
ロードするデータをCSVで以下のように用意しておきます。

```person.csv
name,gender,age,state
Tom,male,40,ca
Dan,male,34,ny
Jenny,female,25,tx
```

```friendship.csv
person1,person2,date
Tom,Dan,2017-06-03
Tom,Jenny,2015-01-01
Dan,Jenny,2016-08-03
```

まずは、`USE GRAPH`コマンドで、どのグラフを利用するか宣言します。

```
GSQL > USE GRAPH social
```

`CREATE LOADING JOB`でジョブを定義することで、複数ファイルから複数のオブジェクトへマッピングすることができます。
`BEGIN ... END`は複数行モードの宣言です。
この場合、Vertexのnameは、`PRIMARY_ID`と`name`にマッピングされます。
`CREATE LOADING JOB`を実行すると構文エラーチェック、ジョブのコンパイルが実行され、ジョブが保存されます。

```
GSQL > BEGIN
GSQL > CREATE LOADING JOB load_social FOR GRAPH social {
GSQL >    DEFINE FILENAME file1="/home/tigergraph/person.csv";
GSQL >    DEFINE FILENAME file2="/home/tigergraph/friendship.csv";
GSQL >    LOAD file1 TO VERTEX person VALUES ($"name", $"name", $"age", $"gender", $"state") USING header="true", separator=",";
GSQL >    LOAD file2 TO EDGE friendship VALUES ($"person1", $"person2", $"date") USING header="true", separator=",";
GSQL > }
GSQL > END
```

`RUN LOADING JOB`コマンドで定義したジョブを実行し、グラフにデータをロードします。

```
GSQL > RUN LOADING JOB load_social
```

### Vertexの取得
`WHERE`句で条件を指定してVertexを取得できます。
結果は、JSONで返ってきます。

```
GSQL > SELECT * FROM person WHERE primary_id=="Tom"
```

### Edgeの取得
`from_id`を指定することで、指定したVertexから伸びるEdgeを取得できます。
こちらも結果は、JSONで返ってきます。

```
SELECT * FROM person-(friendship)->person WHERE from_id =="Tom"
```

### より複雑なGSQL
GSQLコマンドを`.gsql`ファイル形式で作成し、インストールさせた上でクエリを発行できます。
これにより、パラメータを指定して発行するクエリ等、より複雑なクエリを実行でき、JSONで結果が返されます。
**また、インストールしたクエリをRESTエンドポイントとしても実行可能です。**

# gadmin
TigerGraphを管理するためのツールとして、**gadmin**が提供されています。
下記はコマンドの一例です。`gadmin -h`でコマンドの一覧が確認できます。

```text:サービスの再起動
$ gadmin restart all
```

```text:ログファイルの場所確認
$ gadmin log
```

```text:タイムアウト時間の設定変更
$ gadmin --configure timeout_seconds
$ gadmin config-apply
```

# GraphStudio UI
GUIでグラフをブラウザから操作できるツールも用意されています。
個人的には、コマンドベースで動かしましたが、GUIの方がいいという人にも優しいTigerGraphです。
[GraphStudioのドキュメント](https://doc.tigergraph.com/2.1/TigerGraph-GraphStudio-UI-Guide.html)を見ていると、想像より色々機能が充実しているようで、ざっくり以下などができます。画像は、GSQLの操作画面です。

* ユーザ管理
* グラフスキーマの定義
* データのロード、グラフへのマッピング
* グラフへの読み書き
* GSQLの作成、インストール、実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217344/742e2034-0fbd-29d6-3de8-cec025d635cd.png)

引用：https://doc.tigergraph.com/2.1/TigerGraph-GraphStudio-UI-Guide.html

# その他ドキュメントの要点
### トランザクション
* TigerGraphは、オートミットの順次処理です。ロールバックはできず、自動ロックです。
* ACID特性の詳細は[こちら](https://doc.tigergraph.com/2.1/TigerGraph-Transaction-Processing-and-ACID-Properties-Support.html)のExample Scenariosを読めば理解が早いです。

### インデックス
* VertexのPKにハッシュインデックスが自動で作成されます。

※セカンダリインデックスをVertexとEdgeで構築可能とドキュメント内に記載がありますが、具体的にどうするかは調査中です。

### MultiGraph
* TigerGraphのMultiGraphサービスを利用することで、1つのインスタンス内で複数のグラフを管理できます。下図のように、ユーザの権限に応じて、参照や更新可能な範囲を設定や複数グラフで共有する箇所を設定することが可能です。
* TigerGraphのエンタープライズエディションで利用できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217344/3144bcea-b98e-c332-7795-24c57835777c.png)

引用：https://www.tigergraph.com/2018/02/27/introducing-tigergraph-2-0/

### High Availability Cluster
* TigerGraphのクラスタ構成では、グラフを分割して複数インスタンスに分散できます。Kafkaでメッセージングし、インスタンス間の同期が実現されています。
* こちらもTigerGraphのエンタープライズエディションで利用可能です。

# おわりに
SQLライクにクエリが記述でき、グラフの作成もすんなり完了したので、お試しだけならとっつきやすいです。
ただ、現時点で関数等の便利機能は、ほとんど提供されていません。
なので、複雑なクエリが必要な場合は、自分でGSQLを書いていく必要があるため、玄人向けといった印象です。
また、今回触ったのは、エンタープライズエディションではなかったので、グラフの分散をどう構築するかや、実用的かは気になるポイントです。

参考：https://doc.tigergraph.com/report/WP_NativeParallelGraphs_Sep17_web.pdf

簡単に速度の検証もしてみました。こちらもどうぞ。
[【入門】TigerGraphを触ってみた ~検証編~](https://qiita.com/silva0215/items/3ac6b365c1b157800062)