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

时间:2017-07-05 12:18:08

标签: java owl owl-api

我是OWL 2的新手,我想解析一个" .ttl"使用OWL API的文件,但我发现OWL API与我之前使用的API不同。我似乎应该写一个"访客"如果我想获取OWLAxiom或OWLEntity中的内容,等等。我已经阅读了一些教程,但我没有找到正确的方法。此外,我发现搜索的教程使用旧版本的owl api。所以我想要一个详细的例子来解析一个实例,并将内容存储到Java类。

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

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();

}

例如,实例如下。特别是,我想存储&#34; @ en&#34;在&#34; ecrm:P3_has_note&#34;。

的对象中
<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和doc。我只是想知道如何在java类中获取我需要的内容。

如果有一些教程描述了这样做的方法,请告诉我。

非常感谢。

更新:我知道怎么做,当我完成它时,我会写一个答案,我希望它可以帮助OWLAPI的后来者。

再次感谢。

1 个答案:

答案 0 :(得分:1)

一旦掌握了个人,你需要的是检索数据属性断言公理并收集为每个属性声明的文字。

所以,在代码的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),但在这种情况下,这样做的好处不大。