我正在使用Jena API将TBox模型添加到ABox模型中。 TBox文件包含类,对象属性,数据类型属性。 ABox有个人。我用了aBoxModel.add(tBoxModel)
,然后aBoxModel.write(out)
,当我使用Protégé打开新文件时,它总是混乱。来自TBox的所有班级都显示在Protégé的“个人”列表中。然后我发现问题出在TBox,而不是Abox。我尝试了不同的方式将其写出,这给了我不同的结果。代码如下:
import java.io.FileWriter;
import java.io.IOException;
import org.apache.jena.ontology.OntClass;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.RDFDataMgr;
public class TestWriteOwl {
public static void main(String[] args) {
OntModel oldModel = ModelFactory.createOntologyModel();
RDFDataMgr.read(oldModel, "TBox.owl");
FileWriter out;
try {
out = new FileWriter("myModel.owl");
oldModel.write(out,"RDF/XML");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[上面的代码在Protégé中没有问题,但是有一点点:注释是用德语编写的,而ö,ä,ü,ß之类的德语字母仅显示为问号“?”。在新文件中显示,而在旧文件中正确显示它们。而且我不能使用上面的代码,因为当我尝试将tBox模型添加到另一个模型中时,它没有帮助。所以我尝试了下面的代码。
OntModel newModel = ModelFactory.createOntologyModel();
newModel.add(oldModel);
FileWriter out;
try {
out = new FileWriter("myModel.owl");
newModel.write(out,"RDF/XML");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
第二个代码是在Protégé中不断混乱的代码。 Protégé中的“个人”列表和“班级”列表中都显示了所有班级,这些列表应该只在“班级”中显示。而且德语字母问题仍然存在。然后,我尝试了一些在Internet上找到的代码。
Reasoner reasoner = ReasonerRegistry.getOWLReasoner().bindSchema( oldModel );
OntModelSpec spec = new OntModelSpec( OntModelSpec.OWL_MEM_RULE_INF );
spec.setReasoner( reasoner );
OntModel m = ModelFactory.createOntologyModel( spec, newModel );
FileWriter out;
try {
out = new FileWriter("myModel.owl");
m.write(out,"RDF/XML");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
第三个有与第二个相同的问题。
我该如何解决,或者还有其他方法可以尝试?
我知道了。只是在方法model1.add(model2)
中,model2
必须是Model
,不能是OntModel
。