如何在.nt文件上保存sparql查询的结果

问题描述:

我想将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

它最好用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 
}