为什么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);
<标题>全部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);

相关内容

  • 没有找到相关文章

最新更新