Обход графа Гремлина, который использует предыдущее значение свойства ребра для фильтрации последующих ребер

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

Я нашел http://tinkerpop.apache.org/docs/current/recipes/#traversal-induced-values, но, похоже, это работает только для одного объекта, в моем случае мне нужно, чтобы значение изменялось при перемещении. Например, начиная с V1, у которого есть исходящие ребра (E1, E2, E3 ...), я хочу пройти от E1 до V2, а затем пройти вдоль любого ребра от V2, где edge.property (x) == E1.property (x ), и проделаем то же самое для всех ребер из V1 (E2, E3, ...)

Я не могу найти никакой документации, которая поддерживает способ сделать это в Gremlin, возможно ли это?


person Chris Reeves    schedule 20.10.2016    source источник


Ответы (1)


Мы можем использовать современный игрушечный граф, который поставляется с TinkerPop:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]

Этот граф уже содержит 6 ребер, два из которых имеют weight из 1.0:

gremlin> g.E().valueMap()
==>[weight:0.5]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:1.0]
==>[weight:0.4]
==>[weight:0.2]

Мы используем одно из этих двух ребер с weight равным 1.0, чтобы получить другое ребро с тем же weight. Обходя первое из этих двух ребер, мы попадаем в вершину, у которой есть два исходящих ребра:

gremlin> g.V(1).outE().has('weight',1.0).inV().outE()
==>e[10][4-created->5]
==>e[11][4-created->3]
gremlin> g.V(1).outE().has('weight',1.0).inV().outE().valueMap()
==>[weight:1.0]
==>[weight:0.4]

Одно из этих ребер - другое с весом 1.0. Итак, нам нужно только отфильтровать эти ребра в зависимости от веса первого ребра:

gremlin> g.V(1).outE().has('weight',1.0).
                as('firstEdge'). // save the first edge
                inV().outE().
                where(eq('firstEdge')). // compare with the first edge
                by('weight') // use only the 'weight' property for the equality check
==>e[10][4-created->5]
person Florian Hockmann    schedule 21.10.2016
comment
Есть ли способ сделать это без шага match ()? CosmosDB Microsoft Azure поддерживает язык запросов gremlin, ожидайте, что он еще не может обрабатывать шаг match () :( - person SnoopDougg; 14.11.2018
comment
Благодарим за вопрос о шаге match(). Читая свой ответ еще раз, я заметил, что здесь нет необходимости использовать match(). Я отредактировал свой ответ, чтобы решить проблему, не используя match(), что, на мой взгляд, делает его более читаемым. - person Florian Hockmann; 21.11.2018