我是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的后来者。
再次感谢。
答案 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)
,但在这种情况下,这样做的好处不大。