Это можно сделать с помощью так называемого 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 в будущем.