Поиск всех путей с определенными типами ребер в Tinkerpop 3

Я хочу найти все доступные пути с ребром "друг":

g.v(1).out("friend").out("friend").....

поэтому результатом будут все пути из v (1), которые могут быть соединены этим типом ребер. было бы здорово, если бы я также мог ограничить длину поиска и использовать несколько типов ребер вместо "друга", например:

g.v(1).out("friend" or "enemy").out("friend" or "enemy). .....

каким будет путь гремлина, если у меня есть два узла и я хочу найти весь путь / кратчайший путь?


person Omid    schedule 22.12.2014    source источник


Ответы (2)


Используйте jump, чтобы рекурсивно пройти по пути, и шаг path, чтобы реализовать пройденный путь:

gremlin> g = TinkerFactory.createClassic()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V(1).as('x').out('knows').jump('x'){it.loops<3}{true}
==>v[2]
==>v[4]
gremlin> g.V(1).as('x').out().jump('x'){it.get().id() != 5 && it.loops < 6}.path()
==>[v[1], v[4], v[5]]

Подробнее см. В GremlinDocs:

person stephen mallette    schedule 22.12.2014
comment
спасибо за ответ, но мой вопрос был найден: g.v (1) .out (друг или враг) .out (друг или враг). ... так что рекурсивный поиск всех возможных путей сформирует g.v (1) .out ('знает'). out ('знает'). .... было бы здорово, если бы я мог поставить этому предел. В моем втором вопросе было дано два узла найти все возможные пути между ними. - person Omid; 23.12.2014
comment
обновил свой ответ, чтобы отразить ваше разъяснение по вопросу - person stephen mallette; 23.12.2014
comment
Это способ Tinkerpop3? (Я думал, в Tnkerpop3 больше нет петли?) - person Omid; 24.12.2014
comment
обновленный ответ на TP3 - извините, пропустил это в теме вашего вопроса. - person stephen mallette; 26.12.2014
comment
Я не могу понять .loops, я не знаю, сколько шагов я хочу сделать, я просто хочу сделать столько шагов, сколько я нахожу знает, когда я не использую циклы, это не сработает - person Omid; 29.12.2014
comment
Я не думаю, что это хорошая идея - не ограничивать количество циклов, так как ваш результат может никогда не вернуться. Используйте сколь угодно большое количество циклов, если вы не хотите быть слишком ограниченными и если знаете, что получите некоторый результат. В конце концов, это замыкание - всего лишь предикат, так что, возможно, вы могли бы найти какой-нибудь другой метод, позволяющий ему продолжить обработку. Я имею в виду, что по этой причине он не сработает, если вы удалите it.loops, потому что предикат немедленно вернет true, потому что _3 _... так что найдите другой способ, чтобы это закрытие возвращало false, которое вам больше нравится. - person stephen mallette; 29.12.2014

Я бы сделал так:

g.V(1).as('x').out('knows').loop('x'){it.loops<100}{true}

То есть перейти от вершины 1 к ребру «знает» и продолжать делать это, пока вы не сделаете это 100 раз. Иглы, чтобы сказать, что он вернет список вершин, которые связаны таким образом.

person BadChanneler    schedule 15.02.2016