Я хочу следующее:
- Обход части графика
- Взять свойство с первого хода
- Поместить его в другой обход в качестве фильтра
- Получить отфильтрованное значение
При следующем запуске в консоли 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>
Итак, я вижу, что:
- Мой первый путь прохождения получает свойство 'b'
- Выбор путем непосредственного использования литерала 'b' работает
- Использование проекции для фильтрации по '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
без переменных в консоли, но для ссылки на это из запроса?