我正在寻找从owl文件中提取类和子类。我正在使用OwlApi,并提供了dlquery教程示例的一些指导。它除了处理具有保留字符的实体外,效果很好。我被建议使用标签注释而不是从IRI中提取实体,特别是使用AnnotationValueShortFormProvider而不是SimpleShortFormProvider。这是我检索所有子类的代码片段。我们以“美国”为例。
private Set<OWLClass> getSubClasses(String cls, boolean direct) {
if (cls.trim().length() == 0) {
return Collections.emptySet();
}
OWLClassExpression classExpression = this.parser.parseClassExpression(cls);
NodeSet<OWLClass> subClasses = this.reasoner.getSubClasses(classExpression, direct);
return subClasses.getFlattened();
}
private Set<OWLClass> getSubClasses(String cls, boolean direct) {
if (cls.trim().length() == 0) {
return Collections.emptySet();
}
OWLClassExpression classExpression = this.parser.parseClassExpression(cls);
NodeSet<OWLClass> subClasses = this.reasoner.getSubClasses(classExpression, direct);
return subClasses.getFlattened();
}
我的解析器设置如下:
其中shortFormProvider是AnnotationValueShortFormProvider的实例this.parser = new DLQueryParser(rootOntology, shortFormProvider);
我的问题是,如何在不解析字符串'United States'的情况下实例化classExpression,因为解析字符串会提取前缀/标记'United'?或者是否有另一个示例代码块我们可以使用标签注释而不是IRI来检索子类?
答案 0 :(得分:2)
如果您有像“美国”这样的标签,那么Java字符串应该看起来像“'美国'”。 单引号用于多字文字值。
如果您有标签值,您也可以直接在本体中查找,而无需使用曼彻斯特语法分析器。在您可以找到DL查询示例的同一文档页面中,还有关于如何执行此操作的示例。
for(OWLClass owlClass: o.getClassesInSignature()){
// Get the annotations on the class that use the label property
for (OWLAnnotation annotation : owlClass.getAnnotations(o, dataFactoryf.getRDFSLabel())) {
if (annotation.getValue() instanceof OWLLiteral) {
OWLLiteral val = (OWLLiteral) annotation.getValue();
if (val.getLiteral().equals(inputLabel)) {
// at this point, the owlClass variable is the OWLClass you were looking for
NodeSet<OWLClass> subClasses = this.reasoner.getSubClasses(owlClass, direct);
return subClasses.getFlattened();
}
}
}
}