1

我在我的模式约束中定义了基于一个或多个属性的给定顶点的唯一性。例如:
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 加载日志文件,因此预计数据会重复,并且我不想要同一个 Vertex 的多个实例,因此存在约束。

TinkerPop 或 JanusGraph 有没有办法更新 Vertex 以防它已经存在而不是抛出这个异常?或者这是 OGM 应该处理的事情,或者可能是通过在任何事务之前查询图表来处理代码本身?

4

1 回答 1

2

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 是否能够处理这个问题,或者它是否将这个责任转嫁给了应用程序开发人员,但是在设置属性之前检查是否存在仍然是处理这种情况的合适方法.

于 2018-04-22T13:54:19.977 回答