从 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。
但是,重新启动程序后,它永远不会返回已删除的顶点。如何解决这种不一致的行为?