Как обеспечить добавление только одного элемента в janusgraph - PullRequest
0 голосов
/ 14 декабря 2018

Есть ли способ, которым я могу гарантировать, что любое создание вершины в janusgraph с заданным набором свойств приведет только к созданию одной такой вершины?

Прямо сейчас я пересекаю граф и проверяю, чтобы число вершин, которые я нахожу с определенными свойствами, было только одним.Например:

val g = graph.traversal
val vertices = g.V().has("type", givenType).has("name", givenName).toList
if (vertices.size > 1) { 
  // the vertex is not unique, cannot add vertex
}

1 Ответ

0 голосов
/ 16 декабря 2018

Это можно сделать с помощью так называемого get или create обхода, который описан в рецепте существования элемента TinkerPop и в разделе Использование объединения для добавления вершины, только если

для вашего примера этот обход не выглядит так:

g.V().has("type", givenType).has("name", givenName).
  fold().
  coalesce(unfold(),
           addV("yourVertexLabel").
              property("type", givenType).
              property("name", givenName))

Обратите внимание, что от поставщика графов зависит,это атомная операция или нет.В вашем случае JanusGraph проверка существования и условное добавление вершин выполняются с двумя различными операциями, которые могут привести к состоянию гонки, когда два потока выполняют этот обход одновременно, и в этом случае вы все равно можете получить две вершины с этимисвойства.Итак, в настоящее время вам нужно убедиться, что два потока не могут выполнять этот обход параллельно для одних и тех же свойств, например, с блокировками в вашем приложении.

Я только что опубликовал пост в блоге именно на эту тему: Как избежать двойников в графической базе данных , если вы хотите получить больше информации по этой теме в целом.В нем также описывается распределенная блокировка как способ реализации блокировок для распределенных систем и обсуждаются возможные улучшения для лучшей поддержки upserts в JanusGraph в будущем.

...