解析 .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)
,但在这种情况下,这样做几乎没有优势。
我是 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)
,但在这种情况下,这样做几乎没有优势。