使用最新的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的问题。
答案 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);