2014-07-03 44 views
1
public static void main(String[] args) { 
    OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
    String fileName = "C:/Users/Felipe/Desktop/workspace/JenaTutorial/ontrdf.rdf"; 

    try { 
     InputStream inputStream = new FileInputStream(fileName); 
     model.read(inputStream, "RDF/XML"); 
     inputStream.close(); 
    } catch (Exception e) { 
     System.out.println(e.getClass()); 
     System.out.println(e.getMessage()); 
    } 

    ExtendedIterator<OntClass> it = model.listClasses(); 

    while (itI.hasNext()) { 
     OntClass ontclass = it.next(); 
     System.out.println(ontclass.getLocalName()); 
    } 
} 

我只想列出我在本體(年,發佈者,語言,國家,書和作者)上插入的真實六個類。我不知道在前六種方法之後的所有內容。有人知道我可以如何過濾輸出嗎?Jena API - 使用listClasses()返回的篩選類

控制檯顯示:

Year 
Publisher 
Language 
Country 
Book 
Author 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
null 
Exception in thread "main" java.util.NoSuchElementException 
    at com.hp.hpl.jena.util.iterator.FilterIterator.next(FilterIterator.java:92) 
    at tutorial.HelloRDFWorld.main(HelloRDFWorld.java:35) 
+0

如果您可以提供'ontrdf.rdf'(上傳到保管箱或把它放在引擎收錄)將是不錯的。 –

+0

@OscarJara它是:http://pastebin.com/MaeEbaux –

回答

4

如果您更新代碼打印類,而不是它的本地名字,你會得到稍微有用的結果:

http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Year 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Publisher 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Language 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Country 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Book 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Author 
560855f:146ffa04e87:-7fe2 
560855f:146ffa04e87:-7ff9 
560855f:146ffa04e87:-7ff7 
… 

在這些值結尾(被截斷)是空白節點標識符。本體有很多匿名限制類。例如,

<Class rdf:about="http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Author"> 
     <rdfs:subClassOf> 
      <Restriction> 
       <onProperty rdf:resource="http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#authorHasAuthorshipOfBook"/> 
       <someValuesFrom rdf:resource="http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Book"/> 
      </Restriction> 
     </rdfs:subClassOf> 
     … 

這是公理

作者subClassOf(authorHasAuthorshipOfBook一些書)

認識到的重要一點是,(authorHasAuthorshipOfBook some Book)是一類。這是一類具有書籍作者身份的事物。它可以像其他任何類一樣擁有實例,超類,子類等。因此,它出現在listClasses中。你可以得到你想要如果你只打印那些URI資源的結果:

while (it.hasNext()) { 
    OntClass klass = it.next(); 
    if (klass.isURIResource()) {  
    System.out.println(klass); 
    } 
} 

當然,耶拿的擴展迭代器讓你過濾,所以你其實可以保持相同的重複代碼,但使用略有不同迭代器:因爲你的代碼工作以及使用其他`rdf`文件

import com.hp.hpl.jena.ontology.OntClass; 
import com.hp.hpl.jena.ontology.OntModel; 
import com.hp.hpl.jena.ontology.OntModelSpec; 
import com.hp.hpl.jena.rdf.model.ModelFactory; 
import com.hp.hpl.jena.util.iterator.ExtendedIterator; 
import com.hp.hpl.jena.util.iterator.Filter; 

public class ListOntClassesExample { 
    public static void main(String[] args) { 
     OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 
     model.read("http://pastebin.com/raw.php?i=MaeEbaux"); 
     ExtendedIterator<OntClass> it = model.listClasses().filterKeep(new Filter<OntClass>() { 
      @Override 
      public boolean accept(OntClass o) { 
       return o.isURIResource(); 
      } 
     }); 
     while (it.hasNext()) { 
      OntClass klass = it.next(); 
      System.out.println(klass); 
     } 
    } 
} 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Year 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Publisher 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Language 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Country 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Book 
http://www.semanticweb.org/ikop/ontologies/untitled-ontology-46#Author