1

我正在使用 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()的功能是否适合我的目的?如果是这样,我在 Protege 中看到的存储在本体中的名称在哪里,我如何获得它们的值?

4

1 回答 1

2

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

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

  • rdfs:label- 通常用于紧凑可读的名称
  • rdfs:comment- 通常用于更长、更具描述性的术语
  • skos:prefLabel- “首选”标签
  • skos:altLabel- “替代”标签

大多数本体或数据集将使用rdfs:commentandrdfs: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 ); 
}
于 2013-01-08T12:10:58.527 回答