簡體   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