Gremlin Python: как использовать coalesce для получения вершины, если существует, иначе вставить
Можно ли использовать Гремлин coalesce
шаг для выбора вершины по идентификатору (или свойствам), если такая вершина существует, иначе вставить вершину? Я попытался сделать это следующим образом, но получил'list' object has no attribute 'coalesce'
ошибка, которую я вижу, вызвана .fold().next()
возврат объекта списка Python:
my_vertex = g.V(1).fold().next().coalesce(__.unfold(), g.addV(
'my_label'
).property(
T.id,
1
).property(
'test', 'foo'
).property(
'name', 'my_vertex_name'
).property(
'created_timestamp', 1575480467
).next()
)
Есть ли какое-то преимущество в производительности, если это так, или мне просто нужно разбить это на if/else в hasNext() исходного запроса вершины?
2 ответа
Мне удалось выполнить команду "получить, если существует, еще вставить", переместив конечный шаг next() в конец обхода, как показано ниже:
my_vertex = g.V(1).fold().next().coalesce(__.unfold(), g.addV(
'my_label'
).property(
T.id,
1
).property(
'test', 'foo'
).property(
'name', 'my_vertex_name'
).property(
'created_timestamp', 1575480467
)
).next() //notice that .next was simply moved to the close of the .coalesce step
Вам нужно удалить next
из запроса. Далее следует завершающий этап. Безnext
запрос должен работать так, как вы ожидаете, если V(1) существует, он не будет его создавать, иначе он будет. Помимо этого, это хороший способ выполнить запрос на добавление.
Если вы используете Neptune, помните, что идентификаторы - это строки, поэтому это будет V('1').