比较 Jena 中的两个 OntModels

Comparing two OntModels in Jena

我正在尝试使用 java 比较 ontology 的两个不同版本。 OntModels 填充为 "RDF/XML-ABBREV"。但是我的结果和预期的不一样。我正在检查两个模型是否同构,结果是否为真。但是当我遍历模型时,它给我的结果是它们是不同的。即使我在两个模型中加载相同的版本,它仍然会给我相同的结果。我想检查新版本中是否删除或添加了 class。如何检查更改?

        StmtIterator iter = model.listStatements();
        if (model.isIsomorphicWith(model2))
            System.out.println("Both are isomorphic");
        while (iter.hasNext()) {
            Statement stmt = iter.nextStatement();
            Resource toSearch = iter.nextStatement().getSubject();
            if (!model2.containsResource(toSearch)) 
                System.out.println("statement not found"+ toSearch);
        }

在比较 RDF 模型时,"isomorphic" 意味着这两个模型可以相互映射 1:1。此映射使用相等性来比较任何 IRI 或文字值,但使用空白节点之间的对应映射。这是必要的原因是 根据定义 ,空白节点对于出现它的模型是唯一的,因此简单地比较空白节点是否相等总是会失败。

就所有意图和目的而言,两个同构模型是相同的。您的单独比较 (model2.containsResource) 失败的原因是模型中的某些资源是空白节点,因此您试图比较模型之间的空白节点相等性,这将失败。

I want to check if any class is deleted or added in the new version. How it is possible check for the changes?

isIsomorphic 检查会告诉您是否需要查找任何更改。如果两个模型 同构,您应该能够在一个模型或另一个模型中找到缺失的主题 忽略空白节点

      Resource toSearch = iter.nextStatement().getSubject();
      if (!toSearch.isAnon() && !model2.containsResource(toSearch)) { 
              ...
      }

请注意,顺便说一句,此检查不是 full-proof,因为您只是检查主题的 addition/deletion。很可能是您的更改添加了一个带有 already-existing 主题的三元组 - 而此检查不会发现该更改。但我假设您 想测试新的 added/removed 类,在这种情况下,这应该可行。一个更稳健的测试可能是遍历所有 rdf:type 关系并检查两个模型中是否存在不涉及空白节点的关系。