Как я могу добавить новую вершину, только если есть возможность добавить Edge тоже? - PullRequest
0 голосов
/ 02 октября 2019

Мне нужно добавить новую вершину с ребром. Мой код выглядит примерно так:

g.V().addV("Vertex").addE("MyEdge").to(V().has("OtherVertex", "name", "test"))

Если V().has("OtherVertex", "name", "test") вернуть вершины, все работает нормально. Моя проблема в том, что если OtherVertex не существует, Gremlin добавляет новую вершину без ребер. Я хотел бы добавить новый Vertex, только если я могу создать Edge. Я использую Gremlin-сервер для разработки. Я думаю, я мог бы попытаться использовать Transactions, но я не уверен, поддерживает ли его сейчас AWS Neptune.

Есть предложения? Спасибо.


Я думаю, что, избегая транзакций, я понимаю, что сначала могу выбрать OtherVertex. Если он не существует, запрос не создаст новую вершину:

g.V().has("OtherVertex", "name", "test").as('t').addV("Vertex").as('v').addE("MyEdge").from('v').to('t')

1 Ответ

1 голос
/ 04 октября 2019

Как вы написали, это правильный подход:

g.V().has("OtherVertex", "name", "test").as('t').
  addV("Vertex").as('v').addE("MyEdge").from('v').to('t')

Я бы просто добавил кое-что относительно вашей первоначальной попытки, которая показала:

g.V().addV("Vertex")

Я думаю, вы просто имели в видудля начала:

g.addV("Vertex")

Если вы пойдете с первым, вы создадите несколько непреднамеренных проблем:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.V().addV('person')
gremlin> g.V().addV('person')
gremlin> g
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]

Обратите внимание, что для пустого графа ничего не добавляется. Это связано с тем, что V() не возвращает вершин и, следовательно, в конвейере нет ничего для запуска addV(). Давайте предположим, что у вас есть некоторые данные:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().addV('person')
==>v[13]
==>v[14]
==>v[15]
==>v[16]
==>v[17]
==>v[18]
gremlin> g.V().addV('person')
==>v[19]
==>v[20]
==>v[21]
==>v[22]
==>v[23]
==>v[24]
==>v[25]
==>v[26]
==>v[27]
==>v[28]
==>v[29]
==>v[30]

Теперь, есть еще худшая проблема в том, что мы добавляем одну вершину для каждой существующей вершины, так как V() теперь возвращает все вершины в графе на каждойвыполнение.

В качестве заключительного замечания, пожалуйста, смотрите этот Рецепт Gremlin о способах выполнения операций типа get-or-create, поскольку это связано с этим условным видом мутации, который вы делаете сейчас.

...