使用gremlin-scala,我试图从A遍历并收集这些元组:
(A, Some(A1)), (B, None), (C, Some(A2))
所以基本上我想反复取出α
边缘,并可选择转移到β
,收集那些出局。我猜我需要注入一个空的"步骤"如果没有β
边缘,但我还没有弄清楚如何做到这一点。
我现在因为β
被神秘地删除了jump
后仍然有点混淆了如何在graph.V("A").untilWithTraverser(t => t.get.outE(α).notExists()
).repeat(_.out(α).as(foo).out(β).as(bar)).select((foo,bar)).toList
之后倒带(TP 3.1 +)
到目前为止,我有类似的内容:
β
但是,如果" trunk"上的任何节点都没有倒回到主遍历并且失败。缺少{{1}}边缘
答案 0 :(得分:3)
我无法提供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]]
完成会话:
答案 1 :(得分:1)
这是我的gremlin-scala解决方案,基于Daniel的回答。
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
的包装器(并且可能永远不会得到它,因为路径可以有任意结构)所以我们必须做一个丑陋丑陋的演员。