我作为TitanDB用户迈出了第一步。就是这样,我想知道如何在TitanTransaction
内部进行upsert /有条件地插入一个顶点(以“get或create”的方式)。
我想要创建/查找的顶点/属性有一个唯一索引。
答案 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。与任何数据库一样,管理唯一性的开销是在编写数据时需要考虑的成本。这样,如果插入违反唯一性要求的顶点,事务将失败。