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);


但是,我发现合并的本体中仅包含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。那么,为什么我必须再次手动添加它们?这是owlapi的设计问题吗?还是我有更好更好的方法来解决这个问题?

附言:
我的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上添加了另一个三条声明,即takesCourse是对象属性,然后可以识别该对象属性。

但是,TBox中已经有一个声明,它声明takesCourse是一个对象属性,而不是其他任何属性。那么,既然我已经将TBox与我的ABox合并了,为什么还要再次将其添加到ABox中呢?

最佳答案

您的abox文件必须使用owl:imports包含tbox。没有属性声明,否则无法正确解析abox

08-05 17:55