循环本身很好。您的调用.localName()
是提取 URI 的一部分(通常)是prefix:name
qname 对的名称部分。这通常是一个有意义的字符串,如myontology:Wheel
or myontology:Truck
,但它没有在 RDF 标准中正式定义,严格来说,RDF 将整个 URI 视为没有任何内部结构的单个标记。
当您在代码中处理本体时,资源(或类、属性、个体等)的 URI 是您需要引用该资源的内容。但是,在通过某种 UI 向人类展示资源时,您需要一些更具可读性的东西。在 RDF 中对此有许多约定(不幸的是,这是复数约定)。通常,您会发现以下一个或多个附加到资源的属性:
rdfs:label
- 通常用于紧凑可读的名称
rdfs:comment
- 通常用于更长、更具描述性的术语
skos:prefLabel
- “首选”标签
skos:altLabel
- “替代”标签
大多数本体或数据集将使用rdfs:comment
andrdfs: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 );
}