Gremlin > рекурсивно находить узлы, связанные типом ребра
Просто работа с 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]]
Спасибо!
2 ответа
Решение
Вам не нужен 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]
Вот мое текущее решение. Это незавершенная работа, поэтому я более чем рад за улучшения и предложения. (Конечно, это может быть оптимизировано с использованием синтаксиса 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
## Я не уверен, почему это условие работает / не находит ранее пройденные ребра. Кто-нибудь может объяснить?
Дает мне:
[v[4], v[5], v[3], v[1], v[6]]