来自同一 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.getNamedModelreturns查看数据集中的数据,并没有把数据复制出来。 aBoxxBox 共享数据集。应用程序不能同时迭代和更新数据库。

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

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