解析 .ttl 文件并将其映射到 Java class

Parse a .ttl file and map it to a Java class

我是 OWL 2 的新手,我想用 OWL API 解析一个“.ttl”文件,但我发现 OWL API 和我之前用的 API 不一样。好像要获取OWLAxiom或者OWLEntity里面的内容,应该写一个"visitor"等等。我已经阅读了一些教程,但我没有得到正确的方法来做到这一点。另外,我发现搜索到的教程使用的是旧版本的 owl api。所以我想要一个详细的例子来解析一个实例,并将内容存储到一个Java class.


我做了一些尝试,我的代码如下,但我不知道继续下去。


OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

File file = new File("./source.ttl");

OWLOntology localAcademic = manager.loadOntologyFromOntologyDocument(file);

Stream<OWLNamedIndividual> namedIndividualStream = localAcademic.individualsInSignature();

Iterator<OWLNamedIndividual> iterator = namedIndividualStream.iterator();

while (iterator.hasNext()) {

     OWLNamedIndividual namedIndividual = iterator.next();

}

举例如下。特别是,我想将“@en”存储在 "ecrm:P3_has_note".

的对象中
<http://data.doremus.org/performance/4db95574-8497-3f30-ad1e-f6f65ed6c896>
    a                      mus:M42_Performed_Expression_Creation ;
    ecrm:P3_has_note       "Créée par Teodoro Anzellotti, son commanditaire, en novembre 1995 à Rotterdam"@en ;
    ecrm:P4_has_time-span  <http://data.doremus.org/performance/4db95574-8497-3f30-ad1e-f6f65ed6c896/time> ;
    ecrm:P9_consists_of    [ a                        mus:M28_Individual_Performance ;
                             ecrm:P14_carried_out_by  "Teodoro Anzellotti"
                           ] ;
    ecrm:P9_consists_of    [ a                        mus:M28_Individual_Performance ;
                             ecrm:P14_carried_out_by  "à Rotterdam"
                           ] ;
    efrbroo:R17_created    <http://data.doremus.org/expression/2fdd40f3-f67c-30a0-bb03-f27e69b9f07f> ;
    efrbroo:R19_created_a_realisation_of
            <http://data.doremus.org/work/907de583-5247-346a-9c19-e184823c9fd6> ;
    efrbroo:R25_performed  <http://data.doremus.org/expression/b4bb1588-dd83-3915-ab55-b8b70b0131b5> .

我要的内容如下:


class Instance{
    String subject;
    Map<String, Set<Object>> predicateToObject = new HashMap<String,Set<Object>>();
}

class Object{
    String value;
    String type;
    String language = null;
}

我使用的owlapi版本是5.1.0。我从 there 下载 jar 和文档。我只想知道如何在javaclass.

中获取我需要的内容

如果有一些教程介绍了方法,请告诉我。

非常感谢。


更新:我已经知道怎么做了,等我做完了,我会写一个答案,希望对OWLAPI的后来者有所帮助。


再次感谢。

一旦有了个体,您需要的是检索数据 属性 断言公理并收集每个 属性.

断言的文字

因此,在代码的 for 循环中:

// Let's rename your Object class to Literal so we don't get confused with java.lang.Object
Instance instance = new Instance();
localAcademic.dataPropertyAssertionAxioms()
    .forEach(ax -> instance.predicateToObject.put(
        ax.getProperty().getIRI().toString(),
        Collections.singleton(new Literal(ax.getObject))));

此代码假设属性只出现一次 - 如果您的属性出现多次,您将必须检查 属性 的集合是否已经存在并添加到它而不是替换中的值地图。我将其省略以简化示例。

此场景不需要访问者,因为您已经知道您感兴趣的公理类型以及调用它的方法。它本可以写成 OWLAxiomVisitor 仅实现 visit(OWLDataPropertyAssertionAxiom),但在这种情况下,这样做几乎没有优势。