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

时间:2016-12-16 14:00:54

标签: java gremlin

我的图表中的每个顶点至少都有一个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中只知道名称)?

目前,结构是树,但如果有循环,上面的代码是否会阻止无限循环?如果没有,怎么办呢?

1 个答案:

答案 0 :(得分:4)

你的方法是一个良好的开端。

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

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

使用store()在遍历图表时跟踪项目。 by("name")调制器将存储“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()