2011-06-26 138 views
1

我想將dbpedia影片的所有三部分保存在N-Triple文件(.nt文件)上,我使用java應用程序對dbpedia端點執行查詢並保存在一個文件上的結果,但我無法讀取此文件並從中獲取查詢!你能幫助我嗎?如何在.nt文件上保存sparql查詢的結果

//我對結果保存代碼是在這裏

try{ 
      FileWriter fostream = new FileWriter("C:\\Documents and Settings\\me\\Desktop\\DataSets\\dbpediafilmdataset.nt"); 
      BufferedWriter out = new BufferedWriter(fostream); 
      String service ="http://dbpedia.org/sparql"; 

      String query = 
      "SELECT ?s ?p ?o " + 
      "WHERE {" + 
      " ?s <http://dbpedia.org/property/wordnet_type> <http://www.w3.org/2006/03/wn/wn20/instances/synset-movie-noun-1> ; ?p ?o "+ 
      "  } "; 

      QueryExecution qexecctest = QueryExecutionFactory.sparqlService(service, query); 

      try { 
      ResultSet responseetest = qexecctest.execSelect(); 

      while(responseetest.hasNext()){ 
       QuerySolution solnntest = responseetest.nextSolution(); 
       RDFNode p = solnntest.get("?p"); 
       RDFNode o = solnntest.get("?o"); 
       RDFNode s = solnntest.get("?s"); 
       String object=""; 
       String triple=""; 
       if (o.isLiteral()==true) 
       { 
        object="\"" + o.toString() + "\""; 
       } 
       else 
       object="<" + o.toString() + ">"; 

       triple="<" + s + ">"+" " + "<" + p + ">" + " " + object + " " + "." ; 

       out.write(triple); 
       out.newLine(); 

       } 
      } finally { 
      qexecctest.close(); 
      out.close();} 

      }catch (Exception e){ 
       System.err.println("Error: " + e.getMessage());} 

當我想讀的結果文件,並從它採取查詢,它提供了一些錯誤,如這些:

com.hp.hpl.jena.rdf.model.impl.IStream.readChar(NTripleReader.java:485) 
com.hp.hpl.jena.rdf.model.impl.NTripleReader.unwrappedReadRDF(NTripleReader.java:140) 
com.hp.hpl.jena.rdf.model.impl.NTripleReader.readRDF(NTripleReader.java:120) 
com.hp.hpl.jena.rdf.model.impl.NTripleReader.read(NTripleReader.java:84) 
com.hp.hpl.jena.rdf.model.impl.NTripleReader.read(NTripleReader.java:72) 
com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:226) 
com.hp.hpl.jena.util.FileManager.readModelWorker(FileManager.java:395) 
com.hp.hpl.jena.util.FileManager.readModel(FileManager.java:335) 
com.hp.hpl.jena.util.FileManager.readModel(FileManager.java:319) 
.... 
+0

你確定這是你所有的代碼?代碼看起來不像是你做了任何可能導致錯誤跟蹤的事情,所以還有其他代碼被省略了嗎?錯誤跟蹤似乎是指讀取文件時出現問題,但是您的代碼關心的是寫入文件,這對我來說似乎很奇怪 – RobV

+0

同樣,雖然您關閉了「BufferedWriter」,但您還沒有關閉「FileStream」,所以我確保這也被關閉,看看是否有任何區別 – RobV

+0

不,這不是我所有的代碼,它是它的一部分!當我想從我的輸出文件(在這裏它的名字是dbpediafilmdataset)查詢時,這些錯誤是相關的! 有什麼辦法可以在rdf文件中保存sparql查詢嗎? – Sareh

回答

3

它最好用CONSTRUCT查詢來做到這一點。看看它,它是專門爲此設計的。隨着耶拿只是這樣做:

Model results = qexec.execConstruct(); 
results.write(out, "TURTLE"); 

它也解釋here

的主要優點是,你不需要擔心寫入龜或任何其他形式的三元組,耶拿將這樣做爲你。

您構造查詢最終可能會看起來像:

CONSTRUCT { ?s ?p ?o } 
WHERE { 
    ?s <http://dbpedia.org/property/wordnet_type>   
     <http://www.w3.org/2006/03/wn/wn20/instances/synset-movie-noun-1> ; 
     ?p ?o 
} 
相關問題