java - 为什么 Titan 会创建配置唯一的重复顶点键?

标签 java cassandra graph-databases titan berkeley-db-je

简要概述

使用最新的 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/

相关文章:

java - zk中页面之间传递变量

java - 字符串输入到整数字段的 InputMismatchException

java - 在 Ant 上为 Django 设置 Cassandra 失败 : Unable to find a javac compiler;

database - 是否可以使用 Cassandra 作为 LRU 缓存

hadoop - Cassandra 与 Hadoop 的结合使用

graph-databases - 小 Sprite .match()

java - 为什么在 android 4.0+ 上支持 v7 操作栏转到屏幕底部

java - Firebase 获取条目的当前值

neo4j - 如何使用 APOC 反转关系

apache-spark - TigerGraph - 通过 Spark 将数据加载到用户定义的元组