繁体   English   中英

Jena - 从任何语言的本体类中获取标签

[英]Jena - getting a label from an ontology class in any language

出于用户界面的目的,我想在Jena中找到给定本体类的标签。 如果可能,标签应该是用户首选的语言,但如果没有用户语言的标签,我想显示任何标签,并希望用户设法理解。 要做到这一点,我想循环所有可用的标签,然后选择一个(可能只是第一次尝试的第一个)。

到目前为止代码看起来像:

import com.hp.hpl.jena.ontology.OntClass;
public class LabelUtils {
    public static String getLabel(OntClass ontClass, String preferredLanguage) {
        String label = ontClass.getLabel(preferredLanguage);
        if (label == null) {
            // here find another label, in any language, whatever
        }
        return label;
    }
}

无论语言是什么,我如何列出所有标签? 我只找到了一个方法ontClass.listLabels(String language) ,当然 - 它只返回该语言的标签。

我可以假设一个英文标签总是存在,或者循环遍历检查标签的硬连线语言环境列表,但这看起来真的很蹩脚。

Rob Hall的答案很有效,但是如果你想使用OntResource接口方法,你可以使用更接近原始方法的东西。 注意什么是OntResource的Javadoc #listLabels (强调添加)后面的内容。

listLabels

com.hp.hpl.jena.util.iterator.ExtendedIterator listLabels(String lang)

在此资源的所有标签文字上回答迭代器。

参数:

  • lang - 限制列出的注释的语言标记, 或null以选择所有[标签]

标签通过rdfs:label属性与OWL中的元素相关。

为了验证这一点,我们可以从通过以下方式创建的简约模型开始:

final OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
final OntClass clazz = model.createClass("urn:ex:class");
clazz.addLabel("className1", "en");
clazz.addLabel("className2", "fr");

将模型写为N3,我们得到以下内容:

<urn:ex:class>
      a       owl:Class ;
      rdfs:label "className1"@en , "className2"@fr .

现在,因为OntClass继承listPropertyValuesOntResource ,我们可以与每个标签的申报程序是这样工作的:

final NodeIterator labels = clazz.listPropertyValues(RDFS.label);
while( labels.hasNext() ) {
    final RDFNode labelNode = labels.next();
    final Literal label = labelNode.asLiteral();
    System.out.println( label.getLanguage() );
}

对于示例应用程序,以下输出应该有希望证明您可以明确地反映语言标记。

fr
en

我今天发现了这个问题,我认为Rob Hall的解决方案很有意思,因为使用listLabels方法,你只能列出rdfs:标签。 使用该方法,您可以列出,例如,使用词汇表SKOS定义的标签(skos:altLabel和skos:prefLabel)。

将此作为答案发布,因为我没有评论的声誉......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM