为什么Titan会创建配置唯一的重复顶点键?

时间:2014-07-17 07:03:49

标签: java cassandra graph-databases titan berkeley-db-je

摘要

使用最新的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" 在两者之间创建一个标签 如果线程按顺序运行,则会由于重复键而导致异常。我已经能够强迫这个案子。

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

不幸的是,当我运行它时,DB会重复地处于具有多于2个顶点和边缘的状态。有重复键的顶点。 测试将图形转储为XML。例: https://gist.github.com/ubit-ee/d5530e4fa4b87c752294

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

问题

  • 我是否正确配置了架构,以使顶点键应该是唯一的?
  • 我应该做些与交易不同的事吗?
  • 我是否误解了泰坦的预期行为?

1 个答案:

答案 0 :(得分: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);