Использовать свойство одной части обхода графа в качестве фильтра для другой - PullRequest
2 голосов
/ 22 апреля 2020

Я хочу следующее:

  1. Обход части графика
  2. Взять свойство с первого хода
  3. Поместить его в другой обход в качестве фильтра
  4. Получить отфильтрованное значение

При следующем запуске в консоли Gremlin:

g = TinkerGraph.open().traversal()
g.addV('a').property(id, 1).property('b',2)
g.addV('a').property(id, 2).property('b',2).property('c',3)
g.V(2).properties().key().limit(1).as('q').select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))

Я получаю:

gremlin>     g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin>     g.addV('a').property(id, 1).property('b',2)
==>v[1]
gremlin>     g.addV('a').property(id, 2).property('b',2).property('c',3)
==>v[2]
gremlin>     g.V(2).properties().key().limit(1).as('q').select('q')
==>b
gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key()
==>b
gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().select('q')
==>b
gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is('b'))
==>b
gremlin>     g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(__.is(select('q')))
gremlin>

Итак, я вижу, что:

  1. Мой первый путь прохождения получает свойство 'b'
  2. Выбор путем непосредственного использования литерала 'b' работает
  3. Использование проекции для фильтрации по 'b' не работает.

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

Мой вариант использования состоит в том, что я иметь prototype вершины. Я хочу захватить все его свойства (и, возможно, значения) и найти все вершины, подобные prototype.

Другой вариант - сохранить запрос внутри свойства prototype, прочитать его и оценить чтобы получить вершины, которые отфильтрованы по нему.

Я знаю, что могу выполнить соединение строк на стороне приложения, но я хочу остаться только в коде меньше части Gremlin, чтобы иметь надлежащую переносимость провайдера.

ОБНОВЛЕНИЕ:

Пример из официальной документации:

gremlin> firstYear = g.V().hasLabel('person').
                           local(properties('location').values('startTime').min()).
                           max().next()
==>2004
gremlin> l = g.V().hasLabel('person').as('person').
                   properties('location').or(has('endTime',gt(firstYear)),hasNot('endTime')).as('location').
                   valueMap().as('times').
                   select('person','location','times').by('name').by(value).by().toList()

Как я могу использовать firstYear без переменных в консоли, но для ссылки на это из запроса?

1 Ответ

2 голосов
/ 23 апреля 2020

Я вижу, что на ваш вопрос ответили в списке пользователей Gremlin. [1] Копирование ответа здесь для других, которые могут искать тот же вопрос.

Что вы ищете:

g.V(2).properties().key().limit(1).as('q').V(1).properties().key().where(eq('q'))

См. Документацию для Где Шаг, чтобы узнать о различных шаблонах использования where.

[1] https://groups.google.com/forum/#! Topic / gremlin-users / f1NfwUw9ZVI

...