使用OwlApi从带有标签的owl文件中提取子类

时间:2014-09-02 16:26:26

标签: java owl

我正在寻找从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(); }

我的解析器设置如下:

this.parser = new DLQueryParser(rootOntology, shortFormProvider);
其中shortFormProvider是AnnotationValueShortFormProvider的实例

我的问题是,如何在不解析字符串'United States'的情况下实例化classExpression,因为解析字符串会提取前缀/标记'United'?或者是否有另一个示例代码块我们可以使用标签注释而不是IRI来检索子类?

1 个答案:

答案 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();
        }
    }
}
}

https://github.com/owlcs/owlapi/wiki/Documentation