我的图表中的每个顶点至少都有一个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中只知道名称)?
目前,结构是树,但如果有循环,上面的代码是否会阻止无限循环?如果没有,怎么办呢?
答案 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()