Gremlin 3在指定深度停止重复(java)

时间:2016-01-14 17:52:54

标签: java gremlin tinkerpop

我想要一个在某个边缘类型上向下遍历的查询,直到它到达具有给定属性的顶点或者它到达起始顶点的给定距离。

当它到达某个顶点类型时,我可以让这个遍历停止,但是我不能让它在给定的深度/距离处停止。我使用" simplePath"的方式肯定有问题。和"计数"步骤,但我不确定它是什么。

这是Java代码:

GraphTraversal<Vertex, TinkerGraph> traversal = g.V(start)
    .repeat(__.outE("type").subgraph("subGraph").inV())
    .until(
            __.or(
                //this line works just fine
                __.has("type", "one"),   
                //this line doesn't seem to do what I expect,
                //stop when the size of the path from "start" gets too long
                __.simplePath().count().is(P.gt(3))
            )
    )
    .cap("subGraph");

那么当来自&#34;开始&#34;的路径大小时,我需要做什么来使这个遍历停止?顶点到当前顶点是否大于3?

1 个答案:

答案 0 :(得分:6)

如果您使用的是最新版本,则可以执行以下操作:

g.V(start).repeat(...)
          .until(has("type", "one").or().loops().is(gt(3)))
          .cap("subGraph")

<强>示例:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(1)).path().by("name")
==>[marko, lop]
==>[marko, vadas]
==>[marko, josh]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(2)).path().by("name")
==>[marko, lop, josh]
==>[marko, lop, peter]
==>[marko, josh, ripple]
==>[marko, josh, lop]
gremlin> g.V(1).repeat(both().simplePath()).until(has("name","peter").or().loops().is(3)).path().by("name")
==>[marko, lop, peter]
==>[marko, lop, josh, ripple]
==>[marko, josh, lop, peter]