Azure
DB
CosmosDB
Gremlin
thinkerpop

GremlinをCosmosDBで使ってみる

More than 1 year has passed since last update.

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

前回記事 Gremlin?GraphDBになぜこのネーミングか。。
↑こちらでさらっとどんなものかをみてみました。

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

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

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

2.新規Graphの作成

クイック スタート - Microsoft Azure (3).png

クイックスタートで、Gremlin Consoleのタブからテーブルを作成します。(自分で作成する場合はこちら を参考にしてください。)

3.データベースエクスプローラーからクエリを実行してみる

Data Explorer - Microsoft Azure.png

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

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

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

Data Explorer - Microsoft Azure (1).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)

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

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.削除

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

まとめ

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