2015-12-02 22 views
5

これは何度か尋ねられましたが、Tinkerpop(3.1)の最新バージョンに関する参考文献は見つかりませんでした。私たちのトラバーサル。Tinkerpop 3.1の2つのノード間の最短経路を見つける最良の方法

ここで、ノード3と4の間の最短経路を見つけなければならないとしましょう。 このトラバーサルサウンドですか?ここ

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().limit(1) 

私はBFS検索をループしていたときと仮定していit seems that this was the case with the loop() functionように(従って、最初の結果が最短経路である)を実行します。

さらに、untilのステップで以前にバインドされた変数を(asステップを使用して)含める方法はありますか? 、それがはっきりしていない以前のトラバーサルから分かるように より正確には、私は、最後に、例えば、それらの間の最短経路を発見、その後

g.V().match(
__as('e0').out('Feedbacks').as('e1'), 
__as('e0').repeat(out('Meets')).until(<I reach e1>).path().<get_length>.as('len') 
).select('e0', 'e1', 'len') 

を横断中に2つのノードを選択しようとしている、としています私はどのように最短経路の長さを得ることができます。

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().by(__size()) 

はエラーを返しながら

g.V(3).repeat(out()).until(id().is(4).and().simplePath()).path().size() 

ようなものを使用して、(行の数が返される)結果のサイズを返します。誰もが少しプレイしたいはずです。ここ

は、私が使って実験していたグラフです。

graph = TinkerGraph.open() 
e0 = graph.addVertex(T.id, 0, label, "User", "name", "e0") 
e1 = graph.addVertex(T.id, 1, label, "User", "name", "e1") 
e2 = graph.addVertex(T.id, 2, label, "User", "name", "e2") 
e3 = graph.addVertex(T.id, 3, label, "User", "name", "e3") 
e4 = graph.addVertex(T.id, 4, label, "User", "name", "e4") 
e0.addEdge("Feedbacks", e2) 
e0.addEdge("Meets", e1) 
e2.addEdge("Feedbacks", e4) 
e2.addEdge("Meets", e4) 
e3.addEdge("Feedbacks", e0) 
e3.addEdge("Meets", e2) 
e4.addEdge("Feedbacks", e0) 
g = graph.traversal() 

答えて

8

あなたの最短経路のクエリのためのわずかに短いバリアントあります:

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().limit(1) 

あなたの仮定は、最初のパスは、常に最短経路であること、正確です。 路長を取得するには、あなたがcount(local)使用することができます。

g.V().as("e0").out("Feedbacks").as("e1").select("e0"). 
     repeat(out("Meets")).until(where(eq("e1"))).path(). 
     map(union(count(local), constant(-2)).sum()).as("len"). 
     select("e0","e1","len") 

Iから2を引く:

g.V(3).repeat(out().simplePath()).until(hasId(4)).path().count(local) 

UPDATE

は、あなたの更新クエリについては、これは問題を解決する必要があります全体的なパスの長さは、最初に repeat()ブロックと out().select()ブロックが通過するパスの長さにのみ関心があると思うからです含まれています。そうでない場合は、3行目を count(local).as("len").に置き換えるだけです。

+0

おかげ@Daniel Kuppitz。あなたがあなたの答えを書いている間、私はその質問を修正しました。新しいリクエストを確認する時間が少しありますか?つまり、 'until()'ステップで以前にエイリアス化されたノードをどのように参照していますか? – Alberto

+0

ダニエル – Alberto

+0

もう一度迷惑をかけて申し訳ありませんが、私は今、 'Meets' * undirected *( 'both( 'Meets')')最短経路の長さを計算することによって2つの質問の結果をマージしようとしていますFeedbacksエッジで接続された2つの頂点を接続します。'as( 'e0')' -'select( 'e0')パターンのために 'repeat()'の中で 'simplePath()'を使うことができないので、それほど簡単なことではありません。そうでなければ私は緩やかな解決策であるので 'until()'の後に 'limit(1)'を返します。あなたはこれにどのように取り組むべきか考えていますか? – Alberto

関連する問題