Условное создание вершины в Титане

У меня есть ситуация, когда мне нужно проверить, существует ли в графе вершина с тремя удовлетворяющими свойствами property1='a',property2='b',property3='c', и если она не существует, мне нужно ее создать . По сути, в графе должна быть уникальная вершина с комбинацией этих трех свойств. Я попробовал этот фрагмент кода гремлина для проверки на основе одного свойства "id"

getOrCreate = { id ->
  def p = g.V('userId', id)
  if (p.hasNext()) ? p.next() : g.addVertex([userId:id])

Не очень понятно, как лучше всего изменить это, чтобы добиться того, что мне нужно с гремлином, так как я новичок. Все, о чем я могу думать, это вложить больше if и else в последний оператор. Любая помощь приветствуется, спасибо.


person DaTaBomB    schedule 12.07.2014    source источник


Ответы (2)


Есть несколько подходов. Одним из способов было бы немного расширить ваш обход:

getOrCreate = { one, two, three ->
  def p = g.V('prop1', one).has('prop2',two).has('prop3',three)
  p.hasNext() ? p.next() : g.addVertex([prop1:one,prop2:two,prop3:three])

В приведенном выше коде prop1 представляет индексированное свойство, тогда вы просто фильтруете остальные. Это prop должно быть наиболее избирательным свойством, поскольку оно должно отфильтровывать большинство результатов.

Если по какой-то причине prop недостаточно избирательна, это решение может оказаться недостаточно быстрым. Другими словами, если у вас есть 1 миллиард вершин, а g.V('prop1', one) возвращает 100000, то вы будете фильтровать их в памяти, что будет довольно медленно. Если это ваш случай, я бы рассмотрел возможность создания составного индекса «бедняка», добавив в индекс четвертое свойство, которое объединяет все три свойства в одно. Тогда просто сделайте поиск по этому поводу.

person stephen mallette    schedule 13.07.2014
comment
Можете ли вы подтвердить, что это будет работать для нескольких одновременно работающих клиентов? Например. Если бы вы вызывали это через 2 клиентов Gremlin одновременно, что бы произошло? Есть сценарии, которые приходят на ум, если это не атомарная операция, которая приведет к созданию 2 вершин с одинаковыми свойствами. (Можно использовать уникальные индексы, но я думаю, что это позволяет избежать условного запроса на создание). - person John Stephenson; 04.02.2017
comment
С точки зрения Титана, предполагая, что вы используете один из в конечном счете согласованных бэкендов, таких как Cassandra, вам потребуется некоторая форма блокировка для предотвращения дублирования. - person stephen mallette; 06.02.2017

Ты почти там.

getOrCreate = { p1, p2, p3 ->
  def p = g.V().has('property1', p1).has('property2', p2).has('property3', p3)
  p.hasNext() ? p.next() : g.addVertex(['property1':p1,'property2':p2,'property3':p3])
}

Привет, Даниэль

person Daniel Kuppitz    schedule 13.07.2014