我需要将数据从OWLOntology对象(OWL api的一部分)转换为Model对象(Jena Api的一部分)。我的Java程序应该能够加载owl文件并将其内容发送到fuseki服务器。根据我的读物,只有Jena Api才可以通过Java程序使用fuseki服务器,这就是我使用它的原因。
因此,我找到了一些使用Jena api向本体服务器发送本体的示例,并将其修改为该功能:
private static void sendOntologyToFuseki(DatasetAccessor accessor, OWLOntology owlModel){
Model model;
/*
..
conversion from OWLOntology to Model
..
*/
if(accessor != null){
accessor.add(model);
}
}
此功能应将新的本体添加到融合服务器。任何想法如何填补缺失的转化?或任何其他想法,如何使用OWL API将本体发送到Fusionki服务器?
我阅读了以下解决方案:Sparql query doesn't upadate when insert some data through java code
但是我的Java程序的目的是递增地发送这些本体,因为它是相当大的数据,如果我将它们加载到本地内存中,则我的计算机将无法对其进行管理。
想法是写入Java OutputStream
并将其通过管道传递到InputStream
。一个可能的实现可能看起来像这样:
/**
* Converts an OWL API ontology into a JENA API model.
* @param ontology the OWL API ontology
* @return the JENA API model
*/
public static Model getModel(final OWLOntology ontology) {
Model model = ModelFactory.createDefaultModel();
try (PipedInputStream is = new PipedInputStream(); PipedOutputStream os = new PipedOutputStream(is)) {
new Thread(new Runnable() {
@Override
public void run() {
try {
ontology.getOWLOntologyManager().saveOntology(ontology, new TurtleDocumentFormat(), os);
os.close();
} catch (OWLOntologyStorageException | IOException e) {
e.printStackTrace();
}
}
}).start();
model.read(is, null, "TURTLE");
return model;
} catch (Exception e) {
throw new RuntimeException("Could not convert OWL API ontology to JENA API model.", e);
}
}
或者,您可以简单地使用ByteArrayOutputStream
和ByteArrayInputStream
代替管道流。
为了避免通过I / O流进行这种可怕的转换,您可以使用ONT-API:它实现了直接从图中读取猫头鹰轴心的方式,而无需任何转换