【发布时间】:2016-09-07 15:02:43
【问题描述】:
我有一个在 Protege 4.3.0 中创建并存储在 OWL 文件中的本体。该本体的一些数据属性的范围定义如下:
({"absent"} or {"value1" , "value2" , "value3"})
我会搜索可能在其范围内具有指定值的数据属性,因此我编写了以下代码示例,但我不知道如何查询OWLDataRange 对象以查看它是否包含指定值(例如字符串"value1")。
final OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
final OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);
final OWLReasonerFactory rf = new StructuralReasonerFactory();
final OWLReasoner reasoner = rf.createReasoner(ontology);
// ...
// iterate over all data properties
for (OWLDataProperty topDataProperty : reasoner.getTopDataPropertyNode()) {
for(OWLDataProperty property: reasoner.getSubDataProperties(topDataProperty, false).getFlattened()) {
// iterate over all data ranges for the current data property
for (OWLDataRange dataRange : property.getRanges(ontology)) {
// I would check if the current data property contains a specified value in their ranges.
// ...
}
}
}
【问题讨论】:
-
从文档 (owlapi.sourceforge.net/javadoc/org/semanticweb/owlapi/model/…) 中可以看出,数据范围有多种类型 - 在您的情况下,它是一个包含两个
DATA_ONE_OF的DATA_UNION_OF。因此,您必须通过一些 IF-ELSE (resp. SWITCH-CASE) 分支或实现相应的访问者 (owlapi.sourceforge.net/javadoc/org/semanticweb/owlapi/model/…) 来处理这些情况 -
我在哪里可以阅读实现
OWLDataRangeVisitor接口的示例? -
这很容易实现接口。对于您的情况,我想实现布尔方法就足够了,即用于交集、联合、补码,然后最后用于包含值的构造的一部分。
标签: java rdf owl protege owl-api