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').

Другие вопросы по тегам