2

タグは私の問題を非常によく説明していると思います:)

この投稿の最後に記載されている単純なグラフの連結成分を計算するために、Gremlin トラバーサルを作成しようとしています。

で試しました

g.V().repeat(both('e')).until(cyclicPath()).dedup().tree().by('name').next()

入手

==>a={b={a={}, c={b={}}, d={c={d={}}}}, c={d={c={}}}}
==>e={f={e={}, g={f={}}}, h={f={h={}}}}
==>g={f={g={}}}

フィルターがに到達する前にcyclicPathから始まるトラバーサルを終了したため、これは悪いことです。明らかに、句を削除すると、無限ループが発生します。しかも、トラバースを使うと1歩で終わります。ノードを深さ優先順に探索するように指示する方法はありますか?eguntilsimplePath

乾杯!

a = graph.addVertex(T.id, 1, "name", "a")
b = graph.addVertex(T.id, 2, "name", "b")
c = graph.addVertex(T.id, 3, "name", "c")
d = graph.addVertex(T.id, 4, "name", "d")
e = graph.addVertex(T.id, 5, "name", "e")
f = graph.addVertex(T.id, 6, "name", "f")
g = graph.addVertex(T.id, 7, "name", "g")
h = graph.addVertex(T.id, 8, "name", "h")

a.addEdge("e", b)
a.addEdge("e", c)
b.addEdge("e", c)
b.addEdge("e", d)
c.addEdge("e", d)

e.addEdge("e", f)
e.addEdge("e", h)
f.addEdge("e", h)
f.addEdge("e", g)
4

2 に答える 2

1

このクエリは、Gremlin-users グループでも議論されました。これが私が思いついた解決策です。@Daniel Kuppitzにも、言及されたスレッドで見つけることができる興味深い解決策がありました。

無向グラフで、接続されたコンポーネントのトラバーサルの「最後の」ノードが以前に訪問したノード ( cyclicPath()) につながるか、次数 <=1 であることが常に true である場合、このクエリは機能するはずです。

g.V().repeat(both('e')).until( cyclicPath().or().both('e').count().is(lte(1)) ).dedup().tree().by('name').next()

私の例では、次の出力が得られます

gremlin>  g.V().repeat(both('e')).until(cyclicPath().or().both('e').count().is(lte(1))).dedup().tree().by('name').next()
==>a={b={a={}, c={b={}}, d={c={d={}}}}, c={d={c={}}}}
==>e={f={e={}, g={}, h={f={}}}, h={f={h={}}}}
于 2015-11-30T10:35:26.143 に答える