试图在本体中获取特定类的成员

时间:2013-01-07 11:16:37

标签: java instance jena ontology

我正在使用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()); 
}

modelOntModel对象,其中读取了本体。

我从这段代码得到的结果是一个表格中的值列表:className1,className5等。

当我使用Protege打开本体时,同一类的成员具有正常的名称。 getInstances()是否适合我的目的?如果是这样,我在Protet中看到的名称存储在本体中的哪个位置以及如何获取它们的值?

1 个答案:

答案 0 :(得分:2)

循环本身很好。您对.localName()的调用是拉出URI的一部分(通常)是prefix:name qname对的名称部分。这通常是一个有意义的字符串,如myontology:Wheelmyontology:Truck,但它不是在RDF标准中正式定义的,严格来说,RDF将整个URI视为单个没有任何内部结构的代币。

当您在代码中处理本体时,资源(或类,属性,个人等)的URI是您需要引用该资源的URI。但是,在通过某种UI向人类展示资源时,您需要更具可读性的东西。在RDF中存在许多这样的约定(不幸的是,这个约定是复数)。通常,您将找到附加到资源的以下一个或多个属性:

  • rdfs:label - 通常用于紧凑可读名称
  • rdfs:comment - 通常用于更长,更具描述性的术语
  • skos:prefLabel - &#39;首选&#39;标签
  • skos:altLabel - &#39;替代品&#39;标签

大多数本体或数据集都将使用rdfs:commentrdfs: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 ); 
}