在Java中使用gremlin遍历图形时,如何收集属性值?

在Java中使用gremlin遍历图形时,如何收集属性值?,java,gremlin,Java,Gremlin,图中的每个顶点至少有一个name属性。我有一个标签,一组名称值。现在,我想收集所有顶点的name属性值,这些顶点可以(递归地)通过带有边标签EL的特定输出边从集合S中具有名称的顶点到达 我目前针对名为S1的单个启动节点的解决方案如下所示: g.traversal().V().hasLabel(L) .has("name", S1) .repeat(__.optional(__.out(EL))) .u

图中的每个顶点至少有一个name属性。我有一个标签,一组名称值。现在,我想收集所有顶点的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的
println
只是看到它产生了预期的结果,通常我会将名称收集在一个集合中

是否有更好的方法来收集通过标签EL的输出边可到达的所有顶点的name属性值

从多个顶点开始(从集合S中只知道名称)的最佳方式是什么


目前,结构是一棵树,但如果可能存在循环,上面的代码是否可以防止无休止的循环?如果没有,如何做到这一点?

您的方法是一个良好的开端

要从一组多个顶点开始,请使用谓词。TinkerPop提供了几个功能

用于防止循环重复

用于在项目遍历图形时跟踪项目。调制器将存储“名称”属性,而不是顶点

要获得结果,请使用输出遍历期间存储的项。此时的结果是一个
集合
,其中可能包含重复项。用于将
转换为迭代器,然后我们可以使用该迭代器完成

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()