简要概述
使用最新的 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 重复了该问题。
问题
- 我是否正确配置了架构,以便顶点键应该是唯一的?
- 我应该对交易采取不同的做法吗?
- 我是否误解了 Titan 的预期行为?
最佳答案
我在基于 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);
关于java - 为什么 Titan 会创建配置唯一的重复顶点键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24796907/