Создать, если не существует, Vertex и Edge в 1 запросе gremlin - PullRequest
0 голосов
/ 19 января 2019

Я нашел следующий код для создания ребра, если его еще не было.

g.V().hasLabel("V1")
.has("userId", userId).as("a")
.V().hasLabel("V1").has("userId", userId2)
.coalesce(
        bothE("link").where(outV().as("a")),
        addE("link").from("a")
)

Работает нормально, но я хочу создать как вершины, так и ребро, если их не было в 1 запросе.

Я пробую следующий код с новым графом, он просто создает новые вершины, но между ними нет связи.

g.V().hasLabel("V1")
.has("userId", userId).fold()
.coalesce(
        unfold(),
        addV("V1").property("userId", userId1)
).as("a")
.V().hasLabel("V1").has("userId", userId2).fold()
.coalesce(
        unfold(),
        addV("V1").property("userId", userId2)
)
.coalesce(
        bothE("link").where(outV().as("a")),
        addE("link").from("a")
)

1 Ответ

0 голосов
/ 21 января 2019

Благодаря Дэниелу Куппицу в JanusGraph google group .Я нашел решение.Я публикую его здесь для всех, кому это нужно.

В вашем запросе есть две проблемы.Первая причина, почему она не работает должным образом: шаг fold ().Использование fold () уничтожит историю пути, но вы можете легко обойти ее, выполнив эту часть в обходе потомка:

g.V().has("V1","userId", userId1).fold().
  coalesce(unfold(),
           addV("V1").property("userId", userId1)).as("a").
  map(V().has("V1","userId", userId2).fold()).
  coalesce(unfold(),
           addV("V1").property("userId", userId2))
  coalesce(inE("link").where(outV().as("a")),
           addE("link").from("a"))

Вторая проблема - это сочетание E и outV.Вам лучше использовать bothE/otherV, outE/inV или inE/outV.

...