gpt4 book ai didi

java - 来自同一 TDB 数据集的不同命名模型上的 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 16:46:56 26 4
gpt4 key购买 nike

我目前正在改编一个在内存模型中与 JENA 一起使用的程序,但当我尝试使用 TDB 存储不同的命名模型时会中断。我认为由此产生的行为是 JENA 中的一个错误,但也许我对同一 TDB 中命名模型的假设是错误的。

为了展示该行为,假设我填充了一个模型,然后将其复制到另一个模型。

  private void init(Model aBox) {
aBox.setNsPrefix("foaf", FOAF.getURI());

aBox.createResource("http://kaiko.getalp.org/test_person__1", FOAF.Person);
aBox.createResource("http://kaiko.getalp.org/test_person__2", FOAF.Person);
aBox.createResource("http://kaiko.getalp.org/test_person__3", FOAF.Person);
}

private void copy(Model aBox, Model xBox) {
StmtIterator persons =
aBox.listStatements(null, RDF.type, FOAF.Person);
while (persons.hasNext()) {
Statement next = persons.next();
Resource p = xBox.createResource(next.getSubject().getURI());
xBox.add(xBox.createStatement(p, RDF.type, FOAF.Person));
}
}

我现在将此行为应用于默认模型,它似乎按预期工作。

  @Test
public void concurrentModifWhenNoModif() throws IOException {
Model aBox = ModelFactory.createDefaultModel();
Model xBox = ModelFactory.createDefaultModel();

init(aBox);
copy(aBox, xBox);
}

但是当我尝试使用由同一 TDB 支持的 2 个模型时,它会引发 ConcurrentModificationException:

  @Test
public void concurrentModifWhenNoModifOnTDB() throws IOException {
Path temp = Files.createTempDirectory("jenatest");
temp.toFile().deleteOnExit();
String tdbDir = temp.toAbsolutePath().toString();
Dataset dataset = TDBFactory.createDataset(tdbDir);
Model aBox = dataset.getNamedModel("MyNamedModel/");
Model xBox = dataset.getNamedModel("OtherNamedModel");

init(aBox);
copy(aBox, xBox);
}

我的理解是,我迭代了 aBox 模型,并且修改了 xBox 模型,我不明白为什么它们共享公共(public) TDB 后端这一事实使它们在模型级别上相互依赖。

最佳答案

dataset.getNamedModel 返回数据集中数据的 View ,并且不会将数据复制出来。 aBoxxBox 共享数据集。应用程序无法同时迭代和更新数据库。

事实上,耶拿的许多地方都是如此,因为模型可以由其他模型组合而成,因此可以共享数据(例如推理模型)。

有一个操作model1.add(model2)可以将一个模型复制到另一个模型中。

关于java - 来自同一 TDB 数据集的不同命名模型上的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61753326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com