【问题标题】:UPSERTing with TitanDB使用 TitanDB 进行 UPSERTing
【发布时间】:2015-11-26 23:09:00
【问题描述】:

作为 TitanDB 用户,我迈出了第一步。也就是说,我想知道如何在 TitanTransaction 中进行 upsert / 有条件地插入一个顶点(以“获取或创建”的风格)。

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

【问题讨论】:

  • 事务性保证由您在 Titan 中的存储后端管理。你用的是哪个?
  • 我正在使用 Cassandra。

标签: titan


【解决方案1】:

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

【讨论】:

  • 谢谢斯蒂芬,但这看起来像 Groovy 之类的。如何在 Java 中使用它?
  • 添加了对 java 的翻译——差别不大
  • 那么,你需要先调用一个get,然后再添加Vertex?没有自动的方法吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢塞巴斯蒂安。我已经在复合索引上使用unique(),这导致我出现您描述的行为:“如果您插入违反唯一性要求的顶点,则事务将失败。”这正是我想通过 upsert 避免的。您对我如何实现这一点有任何想法(“更新此顶点,如果它不存在则创建它”)。
  • 为什么不让内置的锁定行为为您工作呢?使用他们的锁定协议在幕后完成的工作可能与您可以放在一起的任何东西一样高效。您可以随时查询顶点,如果找到,请更新它。
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2014-10-01
  • 2020-01-21
  • 1970-01-01
  • 2015-02-27
  • 2017-08-29
相关资源
最近更新 更多