2016-12-16 3 views
2

グラフの各頂点には、少なくともnameプロパティがあります。私は名前の値のラベルLを設定しました。今度は、集合Sの名前を持つ頂点から、エッジラベルELを持つ特定の発信エッジを経由して(再帰的に)到達できるすべての頂点のnameプロパティの値を収集します。Javaでgremlinを使用してグラフをトラバースしているときに、どのようにプロパティ値を収集できますか?

私の現在の単一ソリューション名前S1を持つノードは、次のようになります開始:

  g.traversal().V().hasLabel(L) 
      .has("name", S1) 
      .repeat(__.optional(__.out(EL))) 
      .until(__.out(EL).count().is(0)) 
      .path() 
      .forEachRemaining(path -> { 
      path.forEach(e -> System.out.println(((Vertex)e).property("name").value()));}); 

printlnこれだけ期待される結果を生成し、通常私は設定に名前を収集することを確認することです。

ラベルELで出力エッジで到達可能なすべての頂点のnameプロパティの値を収集するより良い方法はありますか?

複数の頂点で始まる最善の方法は何でしょうか(名前だけが集合Sからわかる)。

現在、構造はツリーですが、サイクルによって変化する場合は、上記のコードは無限ループを防ぎますか?そうでない場合、どうすればこのことができますか?

答えて

2

あなたのアプローチは良いスタートです。

複数の頂点のセットから開始するには、P.within()述語を使用します。 TinkerPopはいくつかother predicatesを提供します。

simplePath()を使用すると、ループスルーの繰り返しを防ぐことができます。

store()を使用すると、グラフを横断して項目を追跡できます。 by("name")モジュレータは、頂点ではなく「名前」プロパティを格納します。

結果を取得するには、cap()を使用して、トラバーサル時に格納した項目を出力します。この時点での結果は、おそらく重複を含むSetです。 unfold()を使用してSetを反復子に変換してください。dedup()toSet()で終了します。

graph.traversal().V().hasLabel(L).has("name", P.within(S)). 
    repeat(__.out(EL).simplePath().store("x").by("name")). 
    until(__.outE(EL).count().is(0)). 
    cap("x").unfold().dedup().toSet() 
関連する問題