ループ自体は問題ありません。への呼び出しは、(通常) qname ペア.localName()
の名前部分である URI の部分を引き出しています。これは多くの場合、や などprefix:name
の意味のある文字列ですが、RDF 標準では正式に定義されておらず、厳密に言えば、RDF は URI 全体を内部構造のない単一のトークンとして扱います。myontology:Wheel
myontology:Truck
コードでオントロジーを処理している場合、リソース (またはクラス、プロパティ、個体など) の URI は、そのリソースを参照するために必要なものです。ただし、何らかの UI を介して人間にリソースを提示するには、より読みやすいものが必要です。RDF には、これに関する多くの規則があります (残念ながら、それは複数形の規則です)。通常、次のプロパティの 1 つ以上がリソースに添付されています。
rdfs:label
- 通常、コンパクトで読みやすい名前に使用されます
rdfs:comment
- 通常、より長く、より説明的な用語に使用されます
skos:prefLabel
- 「優先」ラベル
skos:altLabel
- 「代替」ラベル
ほとんどのオントロジーまたはデータセットは、rdfs:comment
とrdfs:label
、または SKOS 用語のいずれかを使用します。両方を使用する人もいます。ラベルには、言語タグ付きのバリアントも含まれている可能性があることに注意してください。
<http://example.org/terms#Cat>
a owl:Class ;
rdfs:label "cat"@en ;
rdfs:label "chat"@fr ;
rdfs:comment "denotes the set of all cats"@en ;
rdfs:comment "désigne l'ensemble de tous les chats"@fr .
したがって、Protege が行うことは、これらのプロパティのどれが編集中のオントロジーで使用されているかを確認し、優先するものを選択して表示することです。たとえば、次のように同じことができます。
OntClass oc = model.getOntClass(NS + "ClassName");
for (ExtendedIterator<? extends OntResource> i = oc.listInstances(); i.hasNext();)
{
OntResource or = i.next();
Property labelProp = null;
if (or.hasProperty( RDFS.label )) {
labelProp = RDFS.label;
}
else if (or.hasProperty( SKOS.prefLabel )) {
labelProp = SKOS.prefLabel;
}
// note: does not deal with lang tags
String label = (labelProp != null) ? or.getProperty( labelProp ).getString() : "unknown";
System.out.println("Resource " + or.getURI() + " is labelled: " + label );
}