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

标签 java gremlin tinkerpop

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

我可以让它在遇到某个顶点类型时停止,但我不能让它在给定的深度/距离处停止。我使用“simplePath”和“count”步骤的方式肯定有问题,但我不确定是什么。

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");

那么当从“开始”顶点到当前顶点的路径大小大于3时,我需要做些什么才能让这个遍历停止?

最佳答案

如果您使用的是最新版本,那么您可以这样做:

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]

关于java - Gremlin 3 在指定深度停止重复(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34796423/

相关文章:

Neptune 上的 Gremlin 并发修改异常

java - 如何使用多线程创建 gremlin 边

java - TitanDB 定义和使用索引

java - RabbitMQ 集群镜像队列行为

java - 我已经使用 java 创建了一个 portscanner,但是当我单击“执行”时,它就卡住了

gremlin - 通过 Gremlin 查询从节点返回属性子集

neo4j - Gremlin 中是否可以计算树形图之间的差异?

gremlin - 在 TinkerPop3 Gremlin 查询和 JanusGraph 中获取数组的第一项作为对象

java - 如何在动态 Web 项目中包含库

java - 使用数据源的 jndi 查找进行 JUnit Servlet 测试