Gremlin — добавить вершину только в том случае, если она не существует

У меня есть массив имен пользователей (например, ['abc','def','ghi']), которые нужно добавить под меткой «пользователь» на графике.

Теперь я сначала хочу проверить, существует ли уже имя пользователя (g.V().hasLabel('user').has('username','def')), а затем добавить только те, для которых свойство имени пользователя не соответствует метке «пользователь».

Кроме того, можно ли это сделать в одном запросе гремлина или скрипте groovy?

Я использую базу данных Titan Graph, tinkerpop3 и сервер REST Gremlin.


person Vipul Sharma    schedule 03.09.2017    source источник


Ответы (2)


С помощью «скриптов» вы всегда можете передать многострочный/командный сценарий на сервер для обработки, чтобы получить то, что вы хотите сделать. Затем на этот вопрос отвечают с помощью обычных методов программирования с использованием переменных, операторов if/then и т. д.:

t = g.V().has('person','name','bill')
t.hasNext() ? t.next() : g.addV('person').property('name','bill').next()

или возможно:

g.V().has('person','name','bill').tryNext().orElseGet{
    g.addV('person').property('name','bill').next()}

Но это отличные сценарии, и в конечном итоге TinkerPop рекомендует избегать сценариев и замыканий в пользу чистого обхода. Общий способ обработки «получить или создать» за один проход — сделать что-то вроде этого:

gremlin> g.V().has('person','name','bill').fold().
......1>   coalesce(unfold(), 
......2>            addV('person').property('name','bill'))
==>v[18]

Также см. этот вопрос StackOverflow для получения дополнительной информации о шаблонах upsert/"get or create".

person stephen mallette    schedule 05.09.2017
comment
Я делаю REST-вызов гремлину с моего сервера nodejs. Итак, если мне нужно добавить 200 пользователей, должен ли я вызывать указанную выше команду 200 раз? И если я получаю исключение или ошибку в нескольких, как с этим справиться и должен ли я откатиться? Пожалуйста, дайте мне знать правильный подход для таких сценариев. - person Vipul Sharma; 07.09.2017
comment
Если вы привержены REST и используете сценарии, просто превратите мой последний оператор в сценарий, который обрабатывает пакет из 200 пользователей. users.each{ g.V().has(..... } где users — это параметр со списком из 200 пользователей. С REST и пакетным подходом либо вся партия завершается успешно, либо все не удается. Если вы хотите что-то еще, измените сценарий, чтобы включить в цикл try/catch, чтобы действовать по-другому. Со сценариями у вас в основном есть все, что вам нужно. - person stephen mallette; 07.09.2017

Вы можете сделать это напрямую, используя:

g.V().has('user','username','def').fold().coalesce(unfold(),addV('user').property('username','def'))
person Hossam Kandil    schedule 14.05.2021