来自同一 TDB 数据集的不同命名模型的 ConcurrentModificationException
ConcurrentModificationException on different named Models from the same TDB dataset
我目前正在调整一个程序,该程序在内存模型中使用 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 模型,我不明白为什么它们共享一个公共 TDB 后端这一事实使它们在模型级别相互依赖。
dataset.getNamedModel
returns查看数据集中的数据,并没有把数据复制出来。 aBox
和 xBox
共享数据集。应用程序不能同时迭代和更新数据库。
事实上,在耶拿的许多地方都是如此,因为模型可以是其他模型的组合,因此可以共享数据(例如推理模型)。
有一个操作model1.add(model2)
将一个模型复制到另一个模型。
我目前正在调整一个程序,该程序在内存模型中使用 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 模型,我不明白为什么它们共享一个公共 TDB 后端这一事实使它们在模型级别相互依赖。
dataset.getNamedModel
returns查看数据集中的数据,并没有把数据复制出来。 aBox
和 xBox
共享数据集。应用程序不能同时迭代和更新数据库。
事实上,在耶拿的许多地方都是如此,因为模型可以是其他模型的组合,因此可以共享数据(例如推理模型)。
有一个操作model1.add(model2)
将一个模型复制到另一个模型。