Скорее всего, вы использовали бы некоторое изменение repeat()
step , чтобы выполнить то, что вы хотите (т.е. пройти произвольное количество шагов от начальной вершины).Задавая вопросы о Gremlin, приятно иметь диаграммы asciiart для графика, но еще лучше иметь простой скрипт Gremlin, который создает сам график следующим образом:
g.addV('movie').property('name','movie-1').as('m').
addV('user').property('name','user-1').as('u1').
addV('user').property('name','user-2').as('u2').
addV('person').property('name','chris nolan').as('d').
addE('watched').from('u1').to('m').
addE('watched').from('u2').to('m').
addE('directed').from('d').to('m').iterate()
Затем, чтобы начать с "movie-1""и перейдите к произвольной глубине, просто выполните:
gremlin> g.V().has('movie','name','movie-1').
......1> repeat(__.in()).
......2> emit().
......3> valueMap(true)
==>[id:2,label:user,name:[user-1]]
==>[id:4,label:user,name:[user-2]]
==>[id:6,label:person,name:[chris nolan]]
Это будет продолжаться по входящим ребрам, пока не достигнет вершин без каких-либо, испуская все вершины, найденные на пути.Очевидно, что если вы не проходите все ребра, вам нужно изменить шаблон в пределах repeat()
, чтобы пересечь both()
, но вы захотите попытаться избежать циклов в процессе или repeat()
будет проходить бесконечно.Здесь можно использовать simplePath()
, но в конечном итоге ваш подход к завершению цикла будет определяться структурой вашего графа.
Обратите внимание, что это может быть дорогостоящим запросом в зависимости от глубины обхода.