我正在使用Jena java API来读取/搜索本体,我正在尝试查找特定类本体的所有成员。
所以,我使用以下代码:
OntClass oc = model.getOntClass(NS + "ClassName");
for (ExtendedIterator<? extends OntResource> i = oc.listInstances(); i.hasNext();)
{
OntResource or = i.next();
System.out.println("Local name:" + or.getLocalName());
}
model
是OntModel
对象,其中读取了本体。
我从这段代码得到的结果是一个表格中的值列表:className1,className5等。
当我使用Protege打开本体时,同一类的成员具有正常的名称。 getInstances()
是否适合我的目的?如果是这样,我在Protet中看到的名称存储在本体中的哪个位置以及如何获取它们的值?
答案 0 :(得分:2)
循环本身很好。您对.localName()
的调用是拉出URI的一部分(通常)是prefix:name
qname对的名称部分。这通常是一个有意义的字符串,如myontology:Wheel
或myontology:Truck
,但它不是在RDF标准中正式定义的,严格来说,RDF将整个URI视为单个没有任何内部结构的代币。
当您在代码中处理本体时,资源(或类,属性,个人等)的URI是您需要引用该资源的URI。但是,在通过某种UI向人类展示资源时,您需要更具可读性的东西。在RDF中存在许多这样的约定(不幸的是,这个约定是复数)。通常,您将找到附加到资源的以下一个或多个属性:
rdfs:label
- 通常用于紧凑可读名称rdfs:comment
- 通常用于更长,更具描述性的术语skos:prefLabel
- &#39;首选&#39;标签skos:altLabel
- &#39;替代品&#39;标签大多数本体或数据集都将使用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 );
}