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