1

简要总结

使用最新的 Titan-0.5 快照。我们的代码在并发线程中创建顶点。我们最终会处于一个状态,即我们有多个具有相同键的顶点。由于我们的限制,我们预计这不会发生。

使用以下配置键:

PropertyKey name = management.makePropertyKey(keyName)
                             .dataType(String.class)
                             .cardinality(Cardinality.SINGLE)
                             .make();

TitanGraphIndex nameIndex = management.buildIndex(keyName, Vertex.class)
                                      .indexKey(name)
                                      .unique()
                                      .buildCompositeIndex();

management.setConsistency(nameIndex, ConsistencyModifier.LOCK);

全文

我们有一个配置有唯一顶点属性键的 Titan DB。在并发线程中写入数据库时​​,我们发现 Titan 使用相同的键持久化多个顶点。

我已将问题提炼为一个测试文件: https ://gist.github.com/ubit-ee/8520304273cd2024af29 这是针对 0.5 分支的最新版本构建的。

该代码生成三个线程,它们通过倒计时锁存器同步以同时启动(尽可能多地)。然后线程: 使用键“KEY_VALUE_A”创建顶点 使用键“KEY_VALUE_B”创建顶点 在两者之间创建一个标签 如果线程要按顺序运行,则可能会因重复键而出现异常。我已经能够强迫这个案子了。

当线程并发运行时,我希望至少有一个线程成功并且任何数量都失败。无论如何,我希望图的最终状态是两个顶点和两者之间的一条边。

不幸的是,当我运行它时,数据库反复处于具有超过 2 个顶点和边的状态。存在具有重复键的顶点。测试将图形转储到 XML。示例: https ://gist.github.com/ubit-ee/d5530e4fa4b87c752294

为 berkeleydb 配置的测试代码,但我也针对 Cassandra 重复了这个问题。

问题

  • 我是否正确配置了模式,使得顶点键应该是唯一的?
  • 我应该对交易做任何不同的事情吗?
  • 我是否误解了泰坦的预期行为?
4

1 回答 1

1

我在基于 Titan 的 JanusGraph 0.2 中遇到了同样的问题。我通过以下代码解决了这个问题。

JanusGraphManagement management = graph.openManagement();
PropertyKey uniqueId =management.makePropertyKey("uniqueId").dataType(String.class).cardinality(Cardinality.SINGLE).make();     
JanusGraphManagement.IndexBuilder uniqueIdIndexBuilder = management.buildIndex("uniqueId", Vertex.class).addKey(uniqueId).unique();
JanusGraphIndex uniqueIdIndex = uniqueIdIndexBuilder.buildCompositeIndex();
management.setConsistency(uniqueIdIndex, ConsistencyModifier.LOCK);
于 2017-12-09T06:15:05.417 回答