Open5

そもそもわかってなかったよgremlin

bohebohebohebohe

Traversalは基本的にはイテレータです。

x = g.V()

のようなコードがある場合、xにはg.V()クエリの結果が含まれるのではありません。
代わりに、その文はxにイテレータの値を割り当てます。

結果を取得するには、xをイテレートする必要があります。

コンソールのコンテキストでは、g.V()を入力すると即座に結果が返されます。
コンソールは、g.V()がイテレータを返すことに気づいて、結果を自動的にイテレートするという魔法のようなことをしています。

bohebohebohebohe

初めてみる

コンソールに組み込まれたグラフでGremlinを試すことです。
そのグラフはTinkerGraphです。
TinkerGraphはメモリ内のグラフデータベースであり、使用が容易で構成オプションも多くありません。

空のTinkerGraphを次のように作成できます。

graph = TinkerGraph.open() //// (1)
g = traversal().withEmbedded(graph)        //2
  1. グラフの構造へのAPIであるGraphインスタンスを作成します。

  2. そのグラフを処理またはトラバースするための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の新しい構造的な機能(頂点のメタプロパティやマルチプロパティなど)の使用例を示すグラフです(図)。

bohebohebohebohe

createModernを初めてみる

"Modern" graph, which looks like this:

 "Modern"

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]
bohebohebohebohe

createModernでのデバッグ

"Modern" graph, which looks like this:

 "Modern"

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]]