2013-01-07 19 views
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()); 
} 

哪里modelOntModel对象本体被读取。

结果我从这个代码得到的是价值形式的列表:className1,className5等

当我打开与门生本体虽然,同种类的每一成员都有正常的名称。我的目的是getInstances()正确的功能?如果是这样,我在存储在本体中的Protege中看到的名称在哪里?我如何获得它们的值?

+0

@Alexis鸽子 好,严重的是,什么是对努力是很好的问题? 我知道没有人有义务帮助我或什么,这就是为什么我想说,感谢任何人困扰....为什么你必须纠正? – missrg

回答

2

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

当您在代码中处理本体时,资源(或类,属性,个人等)的URI就是您需要引用该资源的内容。但是,通过某种用户界面将资源呈现给人类时,您需要更易读的东西。在RDF中有很多约定(不幸的是,这是约定的复数)。通常情况下,你会发现连接到资源的以下属性中的一个或多个:

  • rdfs:label - 通常用于紧凑可读的名字
  • rdfs:comment - 通常用于更长,更具描述性术语
  • skos:prefLabel - '优选' 标签
  • skos:altLabel - '替代' 标签

大多数本体或数据集将使用任一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 . 

那么门徒会做的是希望看到这些属性都在本体中使用被编辑,选择一个较好的,然后显示它。你可以做同样的,例如:

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); 
} 
+0

Thx为您的详细答案,它完全有助于:) – missrg