图中的每个顶点至少都有一个name属性。我有一个标签L集合S的名称值。现在,我想从具有集合S中名称的顶点中,通过具有边标签EL的特定出局边,收集(递归)可以到达的所有顶点的name属性值。
我当前对名称为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()));});
Run Code Online (Sandbox Code Playgroud)
该println是只看到这产生了预期的结果,通常我会收集姓名的设置。
有没有更好的方法来收集通过标签EL通过出线边可到达的所有顶点的name属性值?
从多个顶点开始的最佳方法是什么(从Set S仅知道名称)?
当前,该结构是一棵树,但是如果按周期排列,上面的代码是否可以防止无限循环?如果没有,该怎么办?
您的方法是一个好的开始。
要从一组多个顶点开始,请使用P.within()谓词。TinkerPop还提供其他一些谓词。
使用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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |