そもそもわかってなかったよgremlin
Practical Gremlin
基礎を順番に学ぶために実用的なサイト
Traversalは基本的にはイテレータです。
x = g.V()
のようなコードがある場合、xにはg.V()クエリの結果が含まれるのではありません。
代わりに、その文はxにイテレータの値を割り当てます。
結果を取得するには、xをイテレートする必要があります。
コンソールのコンテキストでは、g.V()を入力すると即座に結果が返されます。
コンソールは、g.V()がイテレータを返すことに気づいて、結果を自動的にイテレートするという魔法のようなことをしています。
初めてみる
コンソールに組み込まれたグラフでGremlinを試すことです。
そのグラフはTinkerGraphです。
TinkerGraphはメモリ内のグラフデータベースであり、使用が容易で構成オプションも多くありません。
空のTinkerGraphを次のように作成できます。
graph = TinkerGraph.open() //// (1)
g = traversal().withEmbedded(graph) //2
-
グラフの構造へのAPIであるGraphインスタンスを作成します。
-
そのグラフを処理またはトラバースするためのAPIであるTraversalSourceを作成します。
これで空のTinkerGraphインスタンスができましたので、データのサンプルをロードしてトラバースを始めることができます。
もちろん、TinkerPopがコンソールにパッケージ化している「toy」グラフ(つまり、サンプルデータを持つグラフ)のいずれかを試すこともできます。TinkerFactoryを介して提供されるいくつかの静的メソッドを呼び出すことで、これらの標準的なTinkerGraphインスタンスを作成できます。
これらは通常、TinkerPopの例やテストケースに使用される「標準」なグラフです。
-
createClassic() - TinkerPop 2.xのオリジナルのtoyグラフ(図)。
-
createModern() - TinkerPop 3.xの「classic」グラフの表現であり、主な違いは、頂点のラベルが定義され、"weight"エッジプロパティがfloatではなくdoubleであることです(図)。
-
createTheCrew() - TinkerPop 3.xの新しい構造的な機能(頂点のメタプロパティやマルチプロパティなど)の使用例を示すグラフです(図)。
createModernを初めてみる
"Modern" graph, which looks like this:
gがそのグラフを参照するGraphインスタンスから生成されたTraversalSourceを指します
graph = TinkerFactory.createModern()
g = traversal().withEmbedded(graph)
グラフ内のすべての頂点を取得する:
gremlin> g.V()
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]
ユニークな識別子が "1" の頂点を取得する:
gremlin> g.V("1")
==>v[1]
ユニークな識別子が "1" の頂点の名前の値を取得する:
g.V("1").values("name")
==>marko
ユニークな識別子が "1" の頂点のラベルが "knows" のエッジを取得する:
g.V("1").outE("knows")
==>e[7][1-knows->2]
==>e[8][1-knows->4]
ユニークな識別子が "1" の頂点が "knows" という関係でつながっている人物の名前を取得する:
g.V("1").out("knows").values("name")
==>vadas
==>josh
ユニークな識別子が "1" の頂点が "knows" という関係でつながっているかつ年齢が30以上の人物の名前を取得する:
g.V("1").out("knows").has("age", gt(30)).values("name")
==>josh
頂点1からのすべての出エッジをチェック
gremlin> g.V(1).outE().toList()
==>e[9][1-created->3]
==>e[7][1-knows->2]
==>e[8][1-knows->4]
頂点1から頂点4へのエッジが存在するかチェック
> g.V(1).out('knows').hasId(4).toList()
==>v[4]
createModernでのデバッグ
"Modern" graph, which looks like this:
graph = TinkerFactory.createModern()
g = traversal().withEmbedded(graph)
返さない
gremlin> g.V(1).outE().
group().
by(label).
by(inV()).next()
==>created=v[3]
==>knows=v[4]
コンソールはスクリプト内のすべてのTraversalを自動的に反復するわけではありません。
行の実行結果のみが反復されます。
そのため、内部Traversalインスタンスはその恩恵を受けず、したがってinV()にはnext()のみが呼び出され、"knows"エッジから単一の頂点が取得されます。
これを修正するために、inV()にfold()を追加します。以下のようになります:
gremlin> g.V(1).outE().
group().
by(label).
by(inV().fold()).next()
==>created=[v[3]]
==>knows=[v[2], v[4]]