#[実践]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
をダウンロードして解凍するところからどうぞ。
Azure PortalからCosmosDBを作成します。
クイックスタートで、Gremlin Consoleのタブからテーブルを作成します。(自分で作成する場合はこちら を参考にしてください。)
##3.データベースエクスプローラーからクエリを実行してみる
データベースエクスプローラーから作成したグラフを確認します。
グレムリンが実行できるテキストフィールドがあるので、これだけでも実行できます。
例に習って、44歳、トーマスさんを追加します。新しい頂点です。
g.addV('person').property('firstName', 'Thomas').property('lastName', 'Andersen').property('age', 44).property('userid', 1)
できました。
次にメアリーさん。同じ姓なので、奥様でしょうか。
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を介して情報のやりとりをするようなユースケースが考えられますね。