owlapi 为我们提供了一个类合并,它允许我们从多个文件/源加载本体,然后将它们合并在一起。现在我将我的本体分成两个不相交的部分,即一个用于 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);
但是我发现合并后的本体o中只包含了ABox中的类断言,也就是说没有包含所有的角色断言。我做了很多尝试,最后我通过将属性的类型断言添加到我的 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 合并到了merge。那么为什么我必须再次手动添加它们呢?这是owlapi的设计问题吗?或者我有没有更好和更常见的方法来解决这个问题?
PS:
我的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> .
第二个三元组不能被识别为对象属性断言。通过向 test.nt 添加另一个三元组声明 takeCourse 是一个对象属性,然后可以识别该对象属性。
但是,TBox 中已经有一个声明,声明 takeCourse 是一个对象属性,而不是其他任何东西。那么既然我已经将 TBox 与我的 ABox 合并了,为什么还要将它再次添加到 ABox 中呢?