Gremlin > 递归查找由边缘类型连接的节点
Gremlin > recursively find nodes connected by an edge type
仅使用 TinkerGraph,并尝试递归查找由特定边标签连接的节点(在本例中为 created
)。
- 有没有办法递归(/循环)遍历节点?在下面的示例中,我想循环直到没有更多匹配的边(而不是硬编码的
3
值)。
- 给定一个图,是否可以找到并分组连接的顶点?
消除重复节点和处理节点循环的额外荣誉。
依赖关系
compile("com.thinkaurelius.titan:titan-berkeleyje:0.5.4")
compile('com.tinkerpop:gremlin-groovy:2.6.0')
代码(手动递归3次:( )
Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
println g.v(5).as('x')
.both('created')
.dedup
.loop(2){it.loops <= 3}
.path
.toList().flatten() as Set // groovy code to flatten & dedup
给我:(正确)
[v[5], v[4], v[3], v[1], v[6]]
谢谢!
这是我目前的解决方案。这是一项正在进行的工作,所以我很高兴收到改进和建议。 (确定可以使用 Gremlin 语法对其进行优化吗?)
假设:我们有一个起始节点
Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
def startV = g.v(5)
def seen = [startV] // a list of 'seen' vertices
startV.as('x')
.both('created')
.filter { // only traverse 'unseen' vertices
def unseen = !seen.contains(it)
if (unseen){
seen << it
}
unseen
}
.loop('x'){
// continue looping while there are still more 'created' edges...
it.object.both('created').hasNext() // ##
}
.toList() // otherwise won't process above pipeline
println seen
## 我不确定为什么这种情况 works/doesn 找不到以前遍历的边。谁能解释一下?
给我:
[v[4], v[5], v[3], v[1], v[6]]
您不需要任何 Groovy 代码,只需使用 Gremlin 即可完成:
gremlin> g.v(5).as('x').both('created').dedup()
gremlin> .loop('x') {true} {true}.dedup()
==>v[4]
==>v[3]
==>v[5]
==>v[6]
==>v[1]
仅使用 TinkerGraph,并尝试递归查找由特定边标签连接的节点(在本例中为 created
)。
- 有没有办法递归(/循环)遍历节点?在下面的示例中,我想循环直到没有更多匹配的边(而不是硬编码的
3
值)。 - 给定一个图,是否可以找到并分组连接的顶点?
消除重复节点和处理节点循环的额外荣誉。
依赖关系
compile("com.thinkaurelius.titan:titan-berkeleyje:0.5.4")
compile('com.tinkerpop:gremlin-groovy:2.6.0')
代码(手动递归3次:( )
Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
println g.v(5).as('x')
.both('created')
.dedup
.loop(2){it.loops <= 3}
.path
.toList().flatten() as Set // groovy code to flatten & dedup
给我:(正确)
[v[5], v[4], v[3], v[1], v[6]]
谢谢!
这是我目前的解决方案。这是一项正在进行的工作,所以我很高兴收到改进和建议。 (确定可以使用 Gremlin 语法对其进行优化吗?)
假设:我们有一个起始节点
Gremlin.load()
def g = TinkerGraphFactory.createTinkerGraph()
def startV = g.v(5)
def seen = [startV] // a list of 'seen' vertices
startV.as('x')
.both('created')
.filter { // only traverse 'unseen' vertices
def unseen = !seen.contains(it)
if (unseen){
seen << it
}
unseen
}
.loop('x'){
// continue looping while there are still more 'created' edges...
it.object.both('created').hasNext() // ##
}
.toList() // otherwise won't process above pipeline
println seen
## 我不确定为什么这种情况 works/doesn 找不到以前遍历的边。谁能解释一下?
给我:
[v[4], v[5], v[3], v[1], v[6]]
您不需要任何 Groovy 代码,只需使用 Gremlin 即可完成:
gremlin> g.v(5).as('x').both('created').dedup()
gremlin> .loop('x') {true} {true}.dedup()
==>v[4]
==>v[3]
==>v[5]
==>v[6]
==>v[1]