3

次のようなグラフがあります。 グラフ

gremlin-scalaを使用して、 A からトラバースしてこれらのタプルを収集しようとしています。

(A, Some(A1)), (B, None), (C, Some(A2))

αしたがって、基本的にはエッジを繰り返し取り出し、必要に応じて に分岐してβ、それらのアウトを収集したいと考えています。エッジがない場合は空の「ステップ」を挿入する必要があるとβ思いますが、その方法を理解できませんでした。

また、不思議なことに削除されたトラバース後に巻き戻す方法についても少し混乱しβjumpいます(TP 3.1+)

これまでのところ、次のようなものがあります。

graph.V("A").untilWithTraverser(t => t.get.outE(α).notExists()
    ).repeat(_.out(α).as(foo).out(β).as(bar)).select((foo,bar)).toList

ただし、これはメインのトラバーサルに巻き戻さず、「トランク」上のノードにβアウト エッジがない場合は失敗します。

4

2 に答える 2

4

gremlin-scala ソリューションを提供することはできませんが、次の Groovy の例を簡単に変換できるはずです。

g.V("A").until(__.not(outE("alpha"))).
           repeat(out("alpha")).path().by(union(identity(), out("beta")).fold())

これは以下を返します:

[[A, A1], [B], [C, A2]]

IMOこれで十分です。ただし、一貫した 2 つのエントリのセットが必要な場合は、次のようにすることができます。

g.V("A").until(__.not(outE("alpha"))).repeat(out("alpha")).
  path().by(union(identity(), coalesce(out("beta"), constant("N/A"))).fold())

...次に返されます:

[[A, A1], [B, N/A], [C, A2]]

完全なセッション:

http://gremlinbin.com/bin/view/57133bdc8ee00

于 2016-04-16T20:39:10.057 に答える
1

これは、ダニエルの答えに基づいた私のgremlin-scalaソリューションです。

val unionTraversal = __[(String, Vertex)].union(
  __[Vertex].identity.map("blob" -> _),
  __.out(Beta).map("beta" -> _)
).traversal

def pathTuplesToScalaTuples(path: Path) =
  path.objects.asScala.map(_.asInstanceOf[java.util.ArrayList[(String, Vertex)]].asScala.toList).toList

val pathO = graph.V("A")
    .until(_.not(_.out(Alpha)))
    .repeat(_.out(Alpha))
    .path.by(unionTraversal.fold).headOption
val tuples = pathO.map(pathTuplesToScalaTuples)

残念ながら、これには、放出された頂点を実際に使用できるようにするためのいくつかの手間がかかります。

まず、匿名トラバーサルをユニオンに渡すとステップ ラベルが消去されるため、発行されたセットにラベルを付けることができません.as("blob")

第二に、gremlin-scala にはまだラッパーがありませんPath(パスは任意の構造を持つ可能性があるため、取得できない可能性があります)。

于 2016-04-19T15:58:31.080 に答える