Гремлин - как найти пути от А до Я, которые проходили только через Г - PullRequest
1 голос
/ 01 июля 2019

Нужна помощь с Gremlin: если я знаю начальную и конечную вершины и существует несколько путей между начальной и конечной, НО у меня есть пара вершин на этом пути.Как я могу найти правильный путь, основываясь на имеющихся у меня данных?

Например, здесь я должен найти пути от «колледжа» до «зяблика»

g.V().has('station','college').
       repeat(out().simplePath())
        .until(has('station','finch'))
        .path().by('station')

Результаты

==>[college, wellesley, bloor-yonge, rosedale, summerhill, st. clair, davisville, eglinton, lawrence, york mills, sheppard-yonge, north york centre, finch]
==>[college, dundas, queen, king, union, st. andrew, osgoode, st. patrick, queenspark, museum, st. george, bay, bloor-yonge, rosedale, summerhill, st. clair, davisville, eglinton, lawrence, york mills, sheppard-yonge, north york centre, finch]

Но как мне получить правильный путь, который прошел, например, через «dundas»?

Ответы [ 2 ]

4 голосов
/ 02 июля 2019

Вы можете использовать счетчик, связанный с путем, который вы увеличиваете, только если вы найдете определенный элемент вдоль пути:

g.withSack(0).V().has('station','college').
  repeat(out().simplePath().
         choose(has('station','dundas'),
                  sack(sum).by(constant(1)))).
    until(has('station','finch')).
  filter(sack().is(1)).
  path().
    by('station')

Добавление дополнительных необходимых точек (например, фильтрация путей, проходящих через G, H и P) легко с этим подходом.

Однако, если это только одна вершина, которая должна быть частью пути, тогда ответ sel-fish является еще одним допустимым вариантом (не знаю почемуэто было отвергнуто).

0 голосов
/ 02 июля 2019

Ответ Даниэля Куппица намного лучше моего.

g.V().has('station','college').
    repeat(out().simplePath()).
        until(has('station','finch')).
    path().
    where(unfold().has('station', 'dundas')).
    unfold().values('station').fold()
...