0

从 Titan 中删除顶点会导致读取行为不一致。我在一台运行 Cassandra 的机器上测试这个,这是我的 conf.properties:

storage.backend=cassandra
storage.hostname=localhost
storage.cassandra.keyspace=test

以下方法删除相应的顶点:

public void deleteProfile(String uuid, String puuid) {
    for(Person person : this.graph.getVertices("uuid", uuid, Person.class)) {
        if (person != null) {
            for (Profile profile : this.graph.getVertices("uuid", puuid, Profile.class)) {
                person.removeProfile(profile);
                graph.removeVertex(profile.asVertex());
            }
        }
    }
    this.graph.getBaseGraph().commit();
}

当调用以下方法时,它会返回两组不同的结果:

public Iterable<ProfileImpl> getProfiles(String uuid) {
    List<ProfileImpl> profiles = new ArrayList<>();
    for(Person person : this.graph.getVertices("uuid", uuid, Person.class)) {
        if (person != null) {
            for (Profile profile : person.getProfiles()) {
                profiles.add(profile.toImpl());
            }
        }
    }
    return profiles;
}

一个结果将符合预期 - 它不包含已删除的配置文件。但是,当我运行它足够多次时——它有时会包含一个额外的配置文件——被删除的那个。

再次尝试删除相同的顶点表明不存在具有该 'uuid' 的顶点,迭代器的 hasNext() 返回 false。

但是,重新启动程序后,它永远不会返回已删除的顶点。如何解决这种不一致的行为?

4

2 回答 2

1

问题是在某些线程上,已经为图打开了事务。从图表中读取会打开一个事务,即使没有任何更改。这些事务需要关闭以确保行为一致。

于 2015-09-01T23:54:00.880 回答
0

根据http://s3.thinkaurelius.com/docs/titan/0.9.0-M2/tx.html#tx-config你应该设置checkInternalVertexExistence

于 2015-09-01T04:36:15.843 回答