これは何度か尋ねられましたが、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()
おかげ@Daniel Kuppitz。あなたがあなたの答えを書いている間、私はその質問を修正しました。新しいリクエストを確認する時間が少しありますか?つまり、 'until()'ステップで以前にエイリアス化されたノードをどのように参照していますか? – Alberto
ダニエル – Alberto
もう一度迷惑をかけて申し訳ありませんが、私は今、 'Meets' * undirected *( 'both( 'Meets')')最短経路の長さを計算することによって2つの質問の結果をマージしようとしていますFeedbacksエッジで接続された2つの頂点を接続します。'as( 'e0')' -'select( 'e0')パターンのために 'repeat()'の中で 'simplePath()'を使うことができないので、それほど簡単なことではありません。そうでなければ私は緩やかな解決策であるので 'until()'の後に 'limit(1)'を返します。あなたはこれにどのように取り組むべきか考えていますか? – Alberto