【问题标题】:How can I collect property values while traversing a graph with gremlin in Java?如何在 Java 中使用 gremlin 遍历图形时收集属性值?
【发布时间】:2016-12-16 14:00:53
【问题描述】:

我图中的每个顶点都至少有一个 name 属性。我有一个标签 L 集合 S 的名称值。现在我想收集所有顶点的 name 属性的值,这些顶点可以通过带有边标签 EL 的特定传出边从集合 S 中的名称的顶点到达(递归)。

我当前对名为 S1 的单个起始节点的解决方案如下所示:

            g.traversal().V().hasLabel(L)
            .has("name", S1)
            .repeat(__.optional(__.out(EL)))
            .until(__.out(EL).count().is(0))
            .path()
            .forEachRemaining(path -> {
             path.forEach(e -> System.out.println(((Vertex)e).property("name").value()));});

println 只是为了看到这会产生预期的结果,通常我会将名称收集在一个集合中。

有没有更好的方法来收集通过带有标签 EL 的出边可达的所有顶点的 name 属性的值?

从多个顶点开始的最佳方法是什么(从 Set S 中只知道名称)?

目前,结构是一棵树,但如果可能有循环,上面的代码是否可以防止无限循环?如果没有,怎么办?

【问题讨论】:

    标签: java gremlin


    【解决方案1】:

    你的方法是一个好的开始。

    要从一组多个顶点开始,请使用P.within() 谓词。 TinkerPop 提供了几个other predicates

    使用simplePath() 防止重复循环。

    使用store() 跟踪遍历图表的项目。 by("name") 调制器将存储“名称”属性而不是顶点。

    要得到结果,使用cap() 输出它在遍历过程中存储的项目。此时的结果是Set,其中可能包含重复项。使用unfold()Set 变成一个迭代器,我们可以dedup() 然后以toSet() 结束。

    graph.traversal().V().hasLabel(L).has("name", P.within(S)).
      repeat( __.out(EL).simplePath().store("x").by("name") ).
      until( __.outE(EL).count().is(0) ).
      cap("x").unfold().dedup().toSet()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多