在 Java 中从 OWLOntology 转换为 Jena 模型

Conversion from OWLOntology to Jena Model in Java

我需要将数据从 OWLOntology 对象(OWL api 的一部分)转换为模型对象(Jena Api 的一部分)。我的 Java 程序应该能够加载 owl 文件并将其内容发送到 fuseki 服务器。根据我的阅读,只有 Jena Api 才能通过 Java 程序使用 fuseki 服务器,这就是我使用它的原因。

所以我找到了一些使用 Jena api 将本体发送到 fuseki 服务器的示例,并将其修改为这个函数:

private static void sendOntologyToFuseki(DatasetAccessor accessor, OWLOntology owlModel){
        Model model;

        /*
        ..
        conversion from OWLOntology to Model
        ..
        */

        if(accessor != null){
            accessor.add(model);
        }
    }

这个函数应该向 fuseki 服务器添加新的本体。任何想法如何填补缺失的转换?或者任何其他想法,如何使用 OWL api 将本体发送到 fuseki 服务器?

我阅读了这个解决方案: 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);
    }
}

或者,您可以简单地使用 ByteArrayOutputStreamByteArrayInputStream 而不是管道流。

为了避免通过 i/o 流进行这种可怕的转换,您可以使用 ONT-API:它实现了直接从图中读取 owl-公理,无需任何转换