Java 为什么Titan要创建配置为唯一的重复顶点关键点? 小结
使用最新的Titan-0.5快照。我们的代码在并发线程中创建顶点。我们最终的状态是,我们有多个顶点具有相同的关键点。由于我们的限制,我们预计不会发生这种情况 使用以下配置密钥:Java 为什么Titan要创建配置为唯一的重复顶点关键点? 小结,java,cassandra,graph-databases,titan,berkeley-db-je,Java,Cassandra,Graph Databases,Titan,Berkeley Db Je,使用最新的Titan-0.5快照。我们的代码在并发线程中创建顶点。我们最终的状态是,我们有多个顶点具有相同的关键点。由于我们的限制,我们预计不会发生这种情况 使用以下配置密钥: PropertyKey name = management.makePropertyKey(keyName) .dataType(String.class) .cardinality(Cardinality
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。在并发线程中写入DB时,我们发现Titan使用同一个键持久化多个顶点
我将问题归结为一个测试文件:
这是针对最新版本的0.5分支构建的
代码生成三个线程,通过倒计时锁存器同步以并发启动(尽可能多)。
然后,线程:
使用键“key\u VALUE\u A”创建顶点
使用键“key\u VALUE\u B”创建顶点
在两者之间创建一个标签
如果线程按顺序运行,则会出现由于重复键而导致的异常。我已经能够强迫这个案子了
当线程并发运行时,我希望至少有一个线程成功,任何数量的线程都会失败。无论如何,我希望图的最终状态是两个顶点和两个顶点之间的一条边
不幸的是,当我运行此操作时,DB会反复处于一种有两个以上顶点和边的状态。存在具有重复关键点的顶点。
测试将图形转储为XML。例子:
中的测试代码是为berkeleydb配置的,但我也针对Cassandra重复了这个问题
问题
- 我是否正确配置了模式,使得顶点键应该是唯一的
- 我应该对交易做些不同的事情吗
- 我是否误解了泰坦的预期行为
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);
嘿,克里斯,你有没有想过?我使用的是基于titan的
Janusgraph
,有一个类似的问题,我在属性键uid
上定义并索引了顶点的唯一约束,但仍然能够使用相同的uid创建多个顶点。嗨,Amyth-抱歉,这是很久以前的事了-我想我没有解决这个问题。当然@Chris。谢谢回复:)