与 TitanDB 的 UPSERTing

UPSERTing with TitanDB

我正在迈出成为 TitanDB 用户的第一步。也就是说,我想知道如何在 TitanTransaction 中进行更新插入/有条件地插入顶点(以 "get or create" 的样式)。

我在 vertex/property 上有一个唯一索引,我想 create/lookup。

粗略地说,每个 Cassandra 插入都是 "upsert"。如果您在类似 Cassandra 的模型中查看顶点和边的 Titan representation,您会发现每个顶点和边都有自己的行。这意味着边缘的盲写将具有您正在寻找的给定行为:您所写的就是获胜的。 Titan 不直接支持对顶点执行此操作。

但我认为这不是您要找的。如果您希望强制执行唯一性,为什么不在 Titan 复合索引上使用 unique() 修饰符? (来自documentation):

mgmt.buildIndex('byNameUnique', Vertex.class).addKey(name).unique().buildCompositeIndex()

使用 Cassandra 存储后端,您需要启用 consistency locking。与任何数据库一样,管理唯一性的开销是有代价的,您在编写数据时需要考虑这一点。这样,如果您插入一个违反唯一性要求的顶点,交易将失败。

这是 Titan 1.0 和 TinkerPop 3 的单行 "getOrCreate":

getOrCreate = { id ->
  g.V().has('userId', id).tryNext().orElseGet{ g.addV('userId', id).next() }
}

取自新的 TinkerPop "Getting Started" Tutorial。这是翻译成 java:

的相同代码
public Vertex getOrCreate(Object id) {
  return g.V().has('userId', id).tryNext().orElseGet(() -> g.addV('userId', id).next());
}