#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()
Модулятор принимает две вещи:
- метка шага или
- обход
Одну вершину или список вершин можно легко превратить в обход, обернув ее в 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.