Гремлин: Что делать, если мой запрос не может начинаться с V() или E()?

Первый запрос, выполненный в моем проекте, выполняется в потенциально пустой базе данных и создает несколько вершин, если они еще не созданы, поэтому мой запрос не может начинаться с V() или E() поскольку база данных может быть пустой, также не может начинаться с addE() потому что сначала мне нужно проверить, не создано ли ребро, я нашел следующее решение, используя inject() но похоже на взлом:

g.inject("").union(
    coalesce(V().has("question", "questionId", 0), addV("question").property("questionId", 0)),
    coalesce(V().has("question", "questionId", 1), addV("question").property("questionId", 1)),
    coalesce(V().has("question", "questionId", 2), addV("question").property("questionId", 2))
)

Есть ли способ написать это элегантно без чего-либо, что выглядит взломанным?

1 ответ

Этот сценарий может быть обработан с помощью шаблона upsert через fold()/unfold()шаблон описан здесь. Это будет выглядеть как код ниже:

g.V().
  has("question", "questionId", 0).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 0)).
  V().
  has("question", "questionId", 1).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 1)).
  V().
  has("question", "questionId", 2).
  fold().
  coalesce(unfold(), addV("question").property("questionId", 2))
Другие вопросы по тегам