使用TitanDB进行UPSERTing

时间:2015-11-26 23:09:00

标签: titan

我作为TitanDB用户迈出了第一步。就是这样,我想知道如何在TitanTransaction内部进行upsert /有条件地插入一个顶点(以“get或create”的方式)。

我想要创建/查找的顶点/属性有一个唯一索引。

2 个答案:

答案 0 :(得分:5)

这是一个单行" getOrCreate"对于Titan 1.0和TinkerPop 3:

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

答案 1 :(得分:1)

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

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

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

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