简介
使用最新泰坦-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);
<标题>全部h1> 们有一个配置了唯一顶点属性键的泰坦数据库。当在并发线程中写入数据库时,我们发现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重复了这个问题。
- 我是否正确配置了模式,使得顶点键应该是唯一的?
- 我应该做一些不同的交易吗?
我是否误解了泰坦的预期行为?
标题>我在基于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);