Gremlin > рекурсивно находить узлы, связанные типом ребра

Просто работа с TinkerGraph и попытка рекурсивно найти узлы, связанные определенной меткой ребра (в этом случае created).

  1. Есть ли способ, которым я могу рекурсивно (/ цикл) пересечь узлы? В приведенном ниже примере я хочу выполнить цикл, пока не останется больше совпадающих ребер (вместо жестко закодированных 3 значение).
  2. Есть ли способ найти и сгруппировать связанные вершины по заданному графу?

Дополнительные похвалы для дедупликации узлов и обработки циклов узлов.

зависимости

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]]
Другие вопросы по тегам