为什么我不能直接在owlapi中使用merge来合并ABox和TBox?
Why can't I directly use merger in owlapi to merge ABox and TBox?
owlapi 为我们提供了一个 class 合并,它允许我们从多个 files/sources 加载 ontology,然后将它们合并在一起。现在我将 ontology 分成两个不相交的部分,即,一部分用于 TBox 公理,另一部分用于 ABox 断言。所以我只是使用合并如下代码,
OWLOntology TBox= m.loadOntologyFromOntologyDocument(new File(("XXXXXXXX/UOBM.owl")));
OWLOntology ABox = m.loadOntologyFromOntologyDocument(new File("XXXX/test.nt"));
OWLOntologyMerger merger = new OWLOntologyMerger(m);
OWLOntology o = merger.createMergedOntology(m, null);
但是我发现合并后的ontologyo中只包含了ABox中的class个断言,也就是说没有包含所有的角色断言。我做了很多尝试,最后我通过将属性的类型断言添加到我的 ABox 文件中解决了这个问题,例如 <http://semantics.crl.ibm.com/univ-bench-dl.owl#takesCourse> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
真奇怪,TBox文件中已经包含了这样的断言,我把TBox和ABox合并了。那么为什么我必须再次手动添加它们呢?那是owlapi的设计问题吗?或者我有更好更通用的方法来解决这个问题吗?
P.S:
我的 ABox 文件,即 test.nt 相当简单,它只包含几个三元组,没有任何其他内容。我也没有在我的 ABox 中导入 TBox,因为它只包含三元组。
比如原test.nt的内容可以是:
<http://semantics.crl.ibm.com/univ-bench-dl.owl#a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://semantics.crl.ibm.com/univ-bench-dl.owl#LeisureStudent> .
<http://semantics.crl.ibm.com/univ-bench-dl.owl#a> <http://semantics.crl.ibm.com/univ-bench-dl.owl#takesCourse> <http://semantics.crl.ibm.com/univ-bench-dl.owl#c0> .
无法将第二个三元组识别为对象 属性 断言。
通过添加另一个三元组声明 takesCourse 是对象 属性 到 test.nt,然后可以识别对象 属性。
但是,TBox 中已经有一个声明,声明 takeCourse 是一个对象属性,而不是其他任何东西。那么为什么我已经将 TBox 与我的 ABox 合并,为什么还要再次将它添加到 ABox?
您的 abox
文件必须使用 owl:imports
来包含 tbox
。如果没有 属性 声明,则 abox
无法正确解析。
owlapi 为我们提供了一个 class 合并,它允许我们从多个 files/sources 加载 ontology,然后将它们合并在一起。现在我将 ontology 分成两个不相交的部分,即,一部分用于 TBox 公理,另一部分用于 ABox 断言。所以我只是使用合并如下代码,
OWLOntology TBox= m.loadOntologyFromOntologyDocument(new File(("XXXXXXXX/UOBM.owl")));
OWLOntology ABox = m.loadOntologyFromOntologyDocument(new File("XXXX/test.nt"));
OWLOntologyMerger merger = new OWLOntologyMerger(m);
OWLOntology o = merger.createMergedOntology(m, null);
但是我发现合并后的ontologyo中只包含了ABox中的class个断言,也就是说没有包含所有的角色断言。我做了很多尝试,最后我通过将属性的类型断言添加到我的 ABox 文件中解决了这个问题,例如 <http://semantics.crl.ibm.com/univ-bench-dl.owl#takesCourse> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
真奇怪,TBox文件中已经包含了这样的断言,我把TBox和ABox合并了。那么为什么我必须再次手动添加它们呢?那是owlapi的设计问题吗?或者我有更好更通用的方法来解决这个问题吗?
P.S:
我的 ABox 文件,即 test.nt 相当简单,它只包含几个三元组,没有任何其他内容。我也没有在我的 ABox 中导入 TBox,因为它只包含三元组。
比如原test.nt的内容可以是:
<http://semantics.crl.ibm.com/univ-bench-dl.owl#a> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://semantics.crl.ibm.com/univ-bench-dl.owl#LeisureStudent> .
<http://semantics.crl.ibm.com/univ-bench-dl.owl#a> <http://semantics.crl.ibm.com/univ-bench-dl.owl#takesCourse> <http://semantics.crl.ibm.com/univ-bench-dl.owl#c0> .
无法将第二个三元组识别为对象 属性 断言。
通过添加另一个三元组声明 takesCourse 是对象 属性 到 test.nt,然后可以识别对象 属性。
但是,TBox 中已经有一个声明,声明 takeCourse 是一个对象属性,而不是其他任何东西。那么为什么我已经将 TBox 与我的 ABox 合并,为什么还要再次将它添加到 ABox?
您的 abox
文件必须使用 owl:imports
来包含 tbox
。如果没有 属性 声明,则 abox
无法正确解析。