LoginSignup
11
11

More than 5 years have passed since last update.

GremlinをCosmosDBで使ってみる

Last updated at Posted at 2017-08-14

[実践]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を介して情報のやりとりをするようなユースケースが考えられますね。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11