Database for AI - Grakn.aiことはじめ part 2 - AzureにGrakn.aiをインストールしてグラフを愛でる

##はじめに
前回の[Database for AI - Grakn.aiことはじめ part 1 - 前置きと概要](https://qiita.com/ShinHashitani/items/3e6b9365d070f561931f)でGrakn.aiの概要について触れたので、今回は実際に動かすところまでやりたいと思う。

Grakn.aiはMac OSとLinuxサポートとなっておりWindowsでは動かない。Mac使っている方であれば「ありがとう」という感じなんだろうが、一般的なにっぽん企業戦士の大半はWindows端末をあてがわれているので意外とこのハードルは高い。そこで今回はAzureにLinuxのVMを作って、クラウドで動かす手順を説明したい。
#### **訂正　(2017/11/17)
Windowsでは動かないと書いてしまったが、実はVirtual Boxで動くパッケージが提供されていた。詳細は[Database for AI - Grakn.aiことはじめ part 2 .1 - Oracle Virtual Boxで学ぶGrakn Academy](https://qiita.com/ShinHashitani/items/e5e162c5958f819d1a40)まで。
##今回の構成
- Grakn: 0.17.1
- Azure VM: DS1_V2 Standard
- OS: Ubuntu (Canonical 17.0)
- Java: Open JDK 8

##前提条件
まずAzureのアカウントが無いといけない。まだお持ちでない方はVisual Studio Dev Essentialsを利用する事をお勧めしたい。（[【開発者向け無償プログラム】Visual Studio Dev Essentialに登録して無料のツール、クラウドサービス、トレーニングでスキルアップを！](https://blogs.msdn.microsoft.com/ayatokura/2016/12/20/vsdevessential/)等をご参考に）一年間、毎月25ドルずつフリークレジットが付いてくるので、上手くやりくりすれば無料で色々試せる。Pluralsightの3ヶ月サブスクリプションなんかも付いてくる。
##VM廻りの準備
####Grakn.aiのダウンロード
まずはGrakn.aiを取って来ないと始まらないので、[本家](https://grakn.ai/download/latest)からダウンロードする。zip形式で配布されており今回はzipのままVMに送るが、ローカルでも展開して保持しておいた方が良い。（サンプル等が入っているからであって、今回のように動かすことが目的であれば設定をローカルで施す必要はない。）
####VMの設定
![3_size.png](https://qiita-image-store.s3.amazonaws.com/0/213933/eb58caca-94d0-872e-7a27-722eb31ec15e.png)
Grakn.aiはCassandraとRedisが最低限必要なのでそれなりにリソースを必要とするが、今回はお勧めのDS1_V2 Standardを選択。OSはUbuntuの最新(Canonical 17.0)を選択。VM設定にて関連リソースに関してはデフォルトのあままにしておくと、必要なものは一通り揃って準備される。便利。以下の様なリソースが合わせて生成される。
![5_resources.png](https://qiita-image-store.s3.amazonaws.com/0/213933/163a6637-fd04-ef0b-5cb0-5087d96472cc.png)
####** 追加で必要な設定
まず、IPはDynamicからStaticに変更しておく事をお勧めする。結構な頻度でVMを停止/起動することになると思うが（PoCでは）、その度にIPが変わると面倒なので。

次に大事なのはポートを外に向かって開ける事。デフォルトではSSH(22)しか開いていない。Grakn.aiのデフォルトポートは(4567)なので、最低限このポートは開けておく必要がある。VM生成時に合わせて作成したNetwork security groupのInbound security rulesから追加する。以下の様になるとOK：
![7_inboud_security.png](https://qiita-image-store.s3.amazonaws.com/0/213933/9183bf5c-18d1-efc3-c416-9be9a7e165cb.png)
####Grakn.aiのパッケージをVMに転送（Azure Cloud Shellでやってみる）
Azureを触るまでは「VMって出来たはいいけど、ファイル転送はどうするんだろう？」って思っていたが、結構直感的に扱える。今回のようなケースはVM上から直接curlで取るのが普通だとは思うが、気になったのでAzure CLIでやって合わせて試してみる。

流れは以下の様になる：
1. Azureのコンソールから、Cloud Driveというストレージにファイル転送
2. Azure Cloud Shellを立ち上げ、Cloud DriveからSCPでVMに転送

AzureではストレージもStorage accountとして管理され、先ほどのVM構築の際にも（デフォルトのままだと）作ったVMの所属するResource groupに作成されている。また、Azure CLI用にもデフォルトでストレージが準備されている。今回はここにファイルを置く。
![8_storage.png](https://qiita-image-store.s3.amazonaws.com/0/213933/5c0b70d9-9e98-64af-1d42-96857a4f6018.png)
Resource groupがcloud-shell-storage-...となっているものがそれ。これを選択し、Fileのセクションに移動。ファイルアップローダーが出てくるので、ダウンロードしたGrakn.aiのパッケージを選択肢アップロードすれば完了。

今度はAzure Cloud Shellにログイン。Azure Cloud Shellはブラウザ上で動くコマンドライン環境で、
![azure_cli_1.png](https://qiita-image-store.s3.amazonaws.com/0/213933/5824df26-e57b-d3ce-d68c-9951cf0be2bf.png)
ここをクリックすると
![azure_cli_2.png](https://qiita-image-store.s3.amazonaws.com/0/213933/71a7a5a6-b758-ea59-0e9d-3e4ade11772c.png)
こんな感じで下にコマンドプロンプトが出てくる。Azure Cloud Shellは使ってみると、わずかにタイプのタイムラグがあるのとウィンドウを切り替えた際にフォーカスを当てるのにひと手間かかる。フリーズする事も多い。ただ、Azure Cloud Shellを使うとブラウザ上で全て完結出来る。新たなソフトウェアインストール申請やポートの心配をしなくて良いのでお手軽だと思う。（面倒な企業さんも多いはず。）

Azure Cloud Shellはコンソールから開いた状態で既にログイン出来ている。先ほど転送したファイルはclouddriveという直下のシンボリックリンク先に格納されているので、後はVMに転送すれば完了。

```bash:
scp ./clouddrive/grakn-dist-0.17.1.zip grakn@xx.xxx.xxx.xxx:resources
```

ここではVMに作っておいたresourcesというフォルダに向けて転送してみた。
##VM側の設定
さて、これで準備が整ったのでsshでVMに入ってみる。引き続きの作業は以下の手順となる:

1. unzipのインストール
2. Java 8のインストール
3. $JAVA_HOMEの設定
4. Grakn.aiパッケージの展開
5. 起動シェルの実行

まず、zipを展開しようにも何も入っていないので、unzipのインストールから

```bash:
sudo apt install unzip
```

続いてJava 8

```bash:
sudo apt-get install openjdk-8-jdk
java -version
```

unzipして、適当な場所にパッケージを移動

```bash:
unzip grakn-dist-0.17.1.zip
mv grakn-dist-0.17.1 ../grakn
```

最後に.profileを開き、以下の一文を追加（javaは/usr/bin/java）

```bash:.profile
export JAVA_HOME=/usr
```

これで完了。
##Grakn.aiの起動
早速起動してみる：

```bash:
./grakn server start
```

すると
![12_grakn_success.png](https://qiita-image-store.s3.amazonaws.com/0/213933/d62a10e5-9cae-cd36-cb33-0110ce337789.png)
おや動いた。簡単。

お察しの通り、停止する時は上記のstartをstopにすれば良。
##テストデータのロードと、Visualizerでの確認
####テストデータ（pokemon example）のロード
Grakn.aiのパッケージにはサンプルも同梱されており、まずはこれをロードしてグラフを見てみたいと思う。今回はpokemonサンプルをロード。

```bash:
./graql console -f examples/pokemon.gql -k pokemon
```

Grakn.aiではcsvファイル等もインポート出来る（migrationという機能）が、このpokemonサンプルはオントロジーの定義からデータの投入まで全てGrakn.ai標準のgraqlで書かれているの。この為、consoleに-fでファイル指定する事によって一気に環境が出来上がる。

`-k pokemon`はKeyspaceと呼ばれるGrakn.aiのネームスペースを定義する為のパラメータ。無いとデフォルトのKeyspaceにロードされる。
#### Visualizerで確認
Grakn Visualizerはブラウザからアクセス出来る。VMのパブリックIPにポート4567を指定。
http://xx.xxx.xxx.xxx:4567
![14_query.png](https://qiita-image-store.s3.amazonaws.com/0/213933/2111dae1-5546-d27f-e99a-cec0c26fa7f4.png)
コマンドを実際に打てる（Visualizerなのでread onlyのコマンドのみサポートされている）が、エンティティやリレーションをバンと読み込む事も出来る。上部TypesというメニューあらRelationshipsにあるhas-typeをクリックしてみると...
![15_success.png](https://qiita-image-store.s3.amazonaws.com/0/213933/f1d42a8f-5475-b135-2e24-b4405b633e69.png)
おぉ、グラフだ！それっぽい！
##次回
このpokemonグラフに対して、Visualizerを使ってクエリを色々投げてみたいと思う。
##おまけ
Grakn.aiはデータストアにCassandraを使用している事は[前回](https://qiita.com/ShinHashitani/items/3e6b9365d070f561931f)少し触れたが、CassandraがまだJava 9対応していないので9だとストレージの初期化で落ちてしまう。
![11_grakn_fail.png](https://qiita-image-store.s3.amazonaws.com/0/213933/994d54b8-0ccb-3ca3-bfb2-3538f8f1d8e7.png)
上の様な状態になったら、まず$JAVA_HOMEがちゃんとJava 8に向いているかを確認してほしい。