[英]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繼承listPropertyValues
從OntResource
,我們可以與每個標簽的申報程序是這樣工作的:
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.