我正在使用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
。
关于java - 使用Jena API编写Tbox模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61200004/