Janusgraph/TinkerPop - Нарушение ограничения - Как добавить или обновить существующую вершину
Я определил в своей схеме ограничения, чтобы обеспечить уникальность заданных вершин на основе одного или нескольких свойств. Например:mgmt.buildIndex('byTenandIdUnique',Vertex.class).addKey(tenantId).unique().buildCompositeIndex()
Как и ожидалось, теперь, когда я пытаюсь добавить уже существующую вершину, я получаю сообщение об ошибке, как показано ниже:
aiogremlin.exception.GremlinServerError: 500: Adding this property for key [tenantId] and value [ACME2_AX2] violates a uniqueness constraint [byTenandIdUnique]
Я пишу приложение Python для загрузки файлов журналов с помощью Goblin OGM, поэтому ожидается, что данные будут повторяться, и я не хочу нескольких экземпляров одной вершины, отсюда и ограничение.
Есть ли способ в TinkerPop или JanusGraph обновить Vertex в случае, если она уже существует, вместо того, чтобы выдавать это исключение? Или это то, что OGM должен обрабатывать, или, может быть, сам код, запрашивая график перед любой транзакцией?
1 ответ
TinkerPop ничего не делает для принудительного применения схемы, поэтому ограничение схемы здесь специфично для JanusGraph. Поведение такое же, как вы описали: если у вас определен уникальный индекс, а затем вы пытаетесь добавить другой элемент, который конфликтует с существующим элементом, выдается исключение.
С точки зрения JanusGraph ваша логика должна учитывать это должным образом. Код ниже основан на общем рецепте с использованием coalesce()
шаг, который вы можете прочитать больше о здесь.
// check for existence of a vertex with the tenantId property
// if the vertex exists, return that vertex
// else create a new vertex with the tenantId
v = g.V().property("tenantId", "ACME2_AX2").fold(). \
coalesce( __.unfold(), __.addV().property("tenantId", "ACME2_AX2") ). \
next();
Я не использую Goblin, поэтому я не знаю, способен ли Goblin справиться с этим или передает эту ответственность разработчику приложения, но проверка существования перед установкой свойства все еще является подходящим способом справиться с ситуацией.,