Гремлин: добавление ребер к нескольким вершинам

#gremlin #tinkerpop3

#gremlin #tinkerpop3

Вопрос:

У меня есть вершины [song1, song2, song3, user] .

Я хочу добавить ребра listened из user к песням.

У меня есть следующее:

g.V().is(within(song1, song2, song3)).addE('listened').from(user)

Однако я получаю следующую ошибку:

Нет подписи метода: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.from() применим для типов аргументов: (org.janusgraph.graphdb.vertices.Значения CacheVertex: [v[4344]] Возможные решения: sort(), drop(int), sum(), find(), grep(), sort (groovy.lang.Закрытие)

Конечно, я могу перебирать их по одному за раз, но было бы неплохо выполнить один запрос:

 user.addEdge('listened', song1)
user.addEdge('listened', song2)
user.addEdge('listened', song3)
  

Ответ №1:

from() Модулятор принимает две вещи:

  1. метка шага или
  2. обход

Одну вершину или список вершин можно легко превратить в обход, обернув ее в V() . Также обратите внимание, что g.V().is(within(...)) скорее всего, в конечном итоге будет выполнено полное сканирование по всем вершинам; это в значительной степени зависит от реализации поставщика, но вы должны предпочесть использовать g.V(<list of vertices>) вместо этого. Таким образом, ваш обход должен больше походить на любой из этих:

 g.V().is(within(song1, song2, song3)).
  addE('listened').from(V(user)) // actually bad, as it's potentially a full scan

g.V(song1, song2, song3).
  addE('listened').from(V(user))

g.V(user).as('u').
  V(within(song1, song2, song3)).
  addE('listened').from('u')
  

Комментарии:

1. V() Это то же самое, что g.V() ? Если нет, то где я могу получить это из библиотеки tinkerpop, предполагая, что я использую java?

2. V() это глобальный поиск по вершинам; это может быть начало обхода ( g.V() ) или, как в приведенных выше примерах, глобальный поиск по вершинам в середине обхода ( __.V() ).

3. Нужна ли мне команда типа iterate() для запуска этого? Я вижу изменения в через gremlin, но не через java.

4. Да, .iterate() если вы хотите добавить только ребра или .toList() если вы также хотите, чтобы новые ребра возвращались при обходе.

5. Я понял это. для gremlin требуются объекты Java, поэтому сначала мне пришлось преобразовать Set в тип java.