GremlinをCosmosDBで使ってみる


#[実践]Graphデータベースフレームワーク ThinkerPopとGremlin

[前回記事 Gremlin？GraphDBになぜこのネーミングか。。](http://qiita.com/wan-liner/items/737741805f4c5cfb0cb9)
↑こちらでさらっとどんなものかをみてみました。

###さて、実際に使ってみましょう。

Microsoftのクラウドサービス、Azure のCosmosDBがサポートしてますので、サクッと作って、サクッと消して、オンプレミスで学習します。

詳しくはこちらのページから。
https://docs.microsoft.com/ja-jp/azure/cosmos-db/create-graph-gremlin-console

Azureのアカウントはございますか？なければ、ローカルにもダウンロードしてきてGremlinコンソールから "bin/gremlin.sh" 　or "bin/gremlin.bat" とするところからは同じですので、
https://www.apache.org/dyn/closer.lua/tinkerpop/3.2.5/apache-tinkerpop-gremlin-console-3.2.5-bin.zip　
をダウンロードして解凍するところからどうぞ。

##1.CosmosDBの作成
![create-nosql-db-databases-json-tutorial-1.png](https://qiita-image-store.s3.amazonaws.com/0/89791/3f559a3e-ab23-d2e0-f1ae-8159e2a85075.png)

Azure PortalからCosmosDBを作成します。

##2.新規Graphの作成
![クイック スタート - Microsoft Azure (3).png](https://qiita-image-store.s3.amazonaws.com/0/89791/e015dd51-5118-2f2e-c468-0c61b07b53a6.png)

クイックスタートで、Gremlin Consoleのタブからテーブルを作成します。（自分で作成する場合は[こちら](https://docs.microsoft.com/ja-jp/azure/cosmos-db/create-graph-gremlin-console) を参考にしてください。)

##3.データベースエクスプローラーからクエリを実行してみる
![Data Explorer - Microsoft Azure.png](https://qiita-image-store.s3.amazonaws.com/0/89791/8a2fe0ef-7dd4-7ea5-8fab-9b24006fae10.png)

データベースエクスプローラーから作成したグラフを確認します。
グレムリンが実行できるテキストフィールドがあるので、これだけでも実行できます。

例に習って、４４歳、トーマスさんを追加します。新しい頂点です。

    g.addV('person').property('firstName', 'Thomas').property('lastName', 'Andersen').property('age', 44).property('userid', 1)

![Data Explorer - Microsoft Azure (1).png](https://qiita-image-store.s3.amazonaws.com/0/89791/2b919f9f-10ba-0df9-04c3-a3ae44ce7a15.png)

できました。
次にメアリーさん。同じ姓なので、奥様でしょうか。

    g.addV('person').property('firstName', 'Mary Kay').property('lastName', 'Andersen').property('age', 39).property('userid', 2)

ロビンとベン。これで四人入りました。

    g.addV('person').property('firstName', 'Robin').property('lastName', 'Wakefield').property('userid', 3)
    g.addV('person').property('firstName', 'Ben').property('lastName', 'Miller').property('userid', 4)

４０歳以上の人を探してみます。

    g.V().hasLabel('person').has('age', gt(40))

トーマスだけですね。has　または　haslabel　はもちろん、ラベルがないと検索できませんが、全てにラベルがなくてもエラーにはなりません。

    g.V().hasLabel('person').values('firstName')

valuesで結果の特定のプロパティを投影できます。これをプロジェクションと呼ぶらしいです。大げさな感じですが。。名前がなんとかさん、とか、そういう風に探すのもSQLでは当たり前でしたね。

次は頂点同士の辺を入力します。トーマスとメアリーは知り合い程度だったようです。

    g.V().hasLabel('person').has('firstName', 'Thomas').addE('knows').to(g.V().hasLabel('person').has('firstName', 'Mary Kay'))

これはコンソールからしないとダメなようです。データベースエクスプローラーのベータ版では動きませんでした。ベータ版なので今のところ。といった感じです。

友達の友達を探したり、orやand　先ほどのプロジェクションで、どんどん複雑なクエリができます。

||Gremlin のステップ|
|:----|:---|
|addE|2 つの頂点の間に辺を追加します。|
|addV|グラフに頂点を追加します。|
|and|すべてのトラバーサルが値を返すようにします。|
|as|ステップの出力に変数を割り当てるステップ モジュレーター。|
|by|group および order と共に使用するステップ モジュレーター。|
|coalesce|結果を返す最初のトラバーサルを返します。|
|constant|定数値を返します。 coalesce と共に使用します。|
|count|トラバーサルからカウントを返します。|
|dedup|重複を削除して値を返します。　|
|drop|値 (頂点/辺) を破棄します。|
|fold|結果の集計を計算するバリアとして機能します。|
|group|指定されたラベルに基づいて値をグループ化します。|
|has|プロパティ、頂点、辺をフィルター処理するときに使用します。 hasLabel、hasId、hasNot、has の各バリアントをサポートします。|
|inject|値をストリームに挿入します。|
|is|ブール式を使用してフィルターを実行するときに使用します。|
|limit|トラバーサルで項目の数を制限するときに使用します。|
|local|サブクエリと同様に、トラバーサルのセクションをローカルでラップします。|
|not|フィルターの否定を生成するときに使用します。|
|optional|指定されたトラバーサルの結果が生成された場合は、その結果を返します。それ以外の場合は、呼び出し元の要素を返します。|
|or|少なくとも 1 つのトラバーサルで値が返されるようにします。|
|order|指定された並べ替え順序で結果を返します。|
|path|トラバーサルの完全なパスを返します。|
|project|プロパティをマップとして投影します。|
|properties|指定されたラベルのプロパティを返します。|
|range|値の指定された範囲にフィルターを適用します。|
|repeat|ステップを指定された回数繰り返します。 ループに使用します。|
|sample|トラバーサルの結果をサンプリングするときに使用します。|
|select|トラバーサルの結果を予想するときに使用します。|
|store|トラバーサルの非ブロッキング集計に使用します。|
|tree|頂点からのパスを集計してツリーを形成します。|
|unfold|反復子をステップとしてアンロールします。|
|union|複数のトラバーサルの結果をマージします。|
|V|頂点および辺の間でのトラバーサルに必要なステップ (V、E、out、in、both、outE、inE、bothE、outV、inV、bothV、otherV) が含まれています。|
|where|トラバーサルの結果をフィルター処理するときに使用します。 eq、neq、lt、lte、gt、gte、between の各演算子をサポートします。





##4.削除

チュートリアルですので、満足したらすぐに作ったデータベースは消しておきましょうね。



##まとめ
初期の値が１０Gというやる気を見せているので当然、相当数を高速にこなす分散データベースですので、この後はインポートや、エクスポートで他のデータベースやスキーマに移動したりをスキルアップしていきましょう！
Cosmos+GraphDBの適している使い方として、ソーシャルや、ゲームなどリアルタイムな関係性をAPIを介して情報のやりとりをするようなユースケースが考えられますね。