Как вернуться к корневой вершине в gremlin за один запрос

Я использую Гремлин в амазонке-нептуне. У меня есть вершина пользователь, страна, заказ
У меня есть край "живет_in" от пользователя к стране, край "приобретен" от пользователя к заказу, край "доставлен" от заказа к стране
< br> Цель: найти страну с наибольшим количеством заказов в зарубежную страну, а не в страну live_in в порядке убывания.

gremlin> g.V().hasLabel("user").outE('purchased').inV().hasLabel("order"). 
......1> outE("delivered").inV().hasLabel("country").
......2> has('name').neq(outE('lives_in').inV().hasLabel("country").values()).
......3> groupCount().by(values)

Я не могу вернуться к корневой вершине с шага neq (outE ("жизни_in"))
Я получаю те же результаты после удаления последнего шага has

gremlin> g.V().hasLabel("user").outE('purchased').inV().hasLabel("order").
......1> outE("delivered").inV().hasLabel("country")

Это означает, что мой последний шаг не выполняется.
Пример результатов - {v [country_GB] = 38, v [country_NZ] = 6, v [country_AU] = 3} »


person Viral    schedule 13.02.2018    source источник


Ответы (1)


Всегда полезно включить в свой вопрос небольшой примерный график, подобный этому:

g.addV('user').as('u1').
  addV('user').as('u2').
  addV('order').as('o1').
  addV('order').as('o2').
  addV('order').as('o3').
  addV('order').as('o4').
  addV('order').as('o5').
  addV('order').as('o6').
  addV('country').property('name','usa').as('usa').
  addV('country').property('name','candada').as('can').
  addV('country').property('name','mexico').as('mex').
  addE('lives_in').from('u1').to('usa').
  addE('lives_in').from('u2').to('mex').
  addE('purchased').from('u1').to('o1'). 
  addE('purchased').from('u1').to('o2').
  addE('purchased').from('u1').to('o3').
  addE('purchased').from('u1').to('o4').
  addE('purchased').from('u2').to('o5').
  addE('purchased').from('u2').to('o6').
  addE('delivered').from('o1').to('usa').
  addE('delivered').from('o2').to('mex').
  addE('delivered').from('o3').to('mex').
  addE('delivered').from('o4').to('can').
  addE('delivered').from('o5').to('mex').
  addE('delivered').from('o6').to('can').iterate()

Исходя из этого, вот один из способов сделать это:

gremlin> g.V().hasLabel("user").as('u').
......1>   out('lives_in').hasLabel("country").as('c'). 
......2>   select('u').
......3>   out('purchased').hasLabel("order").
......4>   out("delivered").hasLabel("country").
......5>   where(neq('c')).
......6>   groupCount().
......7>     by('name')
==>[mexico:2,candada:2]

Несколько замечаний:

  1. Упростите inE().outV() и outE().inV() до in() и out() соответственно, если вы ничего не делаете с краем.
  2. В строке, отмеченной 1, вершина страны "жизнях_в" помечена для последующего сравнения со странами "доставленных" в строке 5.
  3. Результат исключает заказ с пометкой «o1» и заказ с пометкой «o5», поскольку оба этих заказа происходят из страны, в которую они были отправлены.
person stephen mallette    schedule 14.02.2018
comment
Это очень полезно, но когда я следую пункту 1 из заметок, я получаю исключение, обрабатывающее скрипт по запросу. Этот запрос сработал для меня - gV (). HasLabel (пользователь) .as ('u'). Out ('life_in'). HasLabel (country) .as ('c'). Select ('u'). OutE ('куплено'). inV (). outE ('доставлено'). inV (). hasLabel (страна) .where (neq ('c')). groupCount (). by ('name'). Вопрос 1. Потребляет ли он больше памяти, если я использую синтаксис типа inE (). OutV (). Вопрос 2 - Что я могу добавить для сортировки результата в порядке убывания, как sort () dint wort для меня. Спасибо - person Viral; 16.02.2018
comment
Я не могу представить, почему это изменение имеет значение ... может быть, что-то с Нептуном? Не думаю, что это займет больше памяти, но в этом нет необходимости. На самом деле, я думаю, что есть TraversalStrategy, который все равно переписывает его в сокращенную форму, если вы решите написать длинную форму - я думаю, выполнение стратегии будет вам чего-то стоить, но я сомневаюсь, что это измеримо. Для сортировки просто добавьте order().by(values)) - person stephen mallette; 16.02.2018
comment
После выполнения нескольких запросов я заметил, что проблема с neptune, если вы не используете outE () вместо out (). Я хочу отсортировать результат groupCount, поэтому добавление order (). By (values)) в конце для меня не работает. - person Viral; 16.02.2018
comment
разит. Интересно, почему Нептун это делает. Кроме того, я предположил, что вы пытаетесь отсортировать счетчики из groupCount (). разве это не то, что вы хотели? Шаг order () должен легко сортировать карты (результат groupCount ()) - см. примеры здесь: tinkerpop.apache.org/docs/current/reference/#order-step - person stephen mallette; 16.02.2018
comment
Я использовал groupCount (). Order (), groupCount (). Order (). By (incr), но снова и снова получал один и тот же результат. Я ищу такой результат [Мексика: 3, Кандада: 2, США: 1]. Большое спасибо :-) - person Viral; 20.02.2018
comment
должно быть groupCount().order().by(values, decr) - person stephen mallette; 20.02.2018
comment
Я пробовал groupCount (). Order (). By (values, decr), groupCount (). Order (). By (keys, decr), groupCount (). Order (). By (count (), decr). Более того, я нашел groupCount (). Cap (). OrderMap (T.decr) .map (). ToList () на форуме google gremlin, но ничего из этого не работает. - person Viral; 20.02.2018
comment
извините - должно быть order(local).by(values,decr) - local означает, что вы хотите, чтобы порядок выполнялся для текущего объекта в потоке (который является вашей единственной картой), а не для самого потока. - person stephen mallette; 20.02.2018