Gremlin Janusgraph/TinkerPop-约束冲突-如何添加或更新现有顶点

Gremlin Janusgraph/TinkerPop-约束冲突-如何添加或更新现有顶点,gremlin,tinkerpop3,janusgraph,gremlin-server,goblin,Gremlin,Tinkerpop3,Janusgraph,Gremlin Server,Goblin,我在模式中定义了约束,以确保基于一个或多个属性的给定顶点的唯一性。例如: 管理buildIndex'byTenandIdUnique',Vertex.class.addKeytenantId.unique.buildCompositeIndex 正如现在所料,当我尝试添加一个已经存在的顶点时,我会得到如下错误: aiogremlin.exception.GremlinServerError:500:为键[tenantId]和值[ACME2\u AX2]添加此属性违反唯一性约束[ByTenandI

我在模式中定义了约束,以确保基于一个或多个属性的给定顶点的唯一性。例如: 管理buildIndex'byTenandIdUnique',Vertex.class.addKeytenantId.unique.buildCompositeIndex

正如现在所料,当我尝试添加一个已经存在的顶点时,我会得到如下错误:

aiogremlin.exception.GremlinServerError:500:为键[tenantId]和值[ACME2\u AX2]添加此属性违反唯一性约束[ByTenandInUnique]

我正在使用Goblin OGM编写一个Python应用程序来加载日志文件,因此预期数据将重复,并且我不希望同一顶点有多个实例,因此存在约束


TinkerPop或JanusGraph中是否有方法在顶点已经存在的情况下更新顶点,而不是引发此异常?或者这是OGM应该处理的事情,或者可能是在任何事务之前通过查询图形来处理代码本身

TinkerPop不执行任何强制模式的操作,因此这里的模式限制特定于JanusGraph。行为如您所述:如果定义了唯一索引,然后尝试添加与现有元素冲突的另一个元素,则会引发异常

从JanusGraph的角度来看,您的逻辑需要正确地解释这一点。下面的代码基于使用合并步骤的常见配方,您可以阅读更多有关该步骤的信息

我不使用Goblin,所以我不知道Goblin是否有能力处理这个问题,也不知道它是否将责任转移给了应用程序开发人员,但在设置属性之前检查是否存在仍然是处理这种情况的适当方法

// 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();