【问题标题】:How to save result of a sparql query on a .nt file如何将 sparql 查询的结果保存在 .nt 文件上
【发布时间】:2011-09-22 23:19:07
【问题描述】:

我想将dbpedia 电影的所有三元组保存在 N-Triple 文件(.nt 文件)中,我使用 java 应用程序在 dbpedia 端点上进行查询并将结果保存在文件中,但我无法读取这个文件并从中获取查询!你能帮帮我吗?

//我保存结果的代码在这里

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)
....

【问题讨论】:

  • 你确定这就是你的全部代码吗?该代码看起来您​​没有做任何可能导致该错误跟踪的事情,那么您是否省略了其他代码?错误跟踪似乎是指读取文件时出现问题,但您的代码与写入文件有关,这对我来说似乎很奇怪
  • 虽然你关闭了BufferedWriter,但你还没有关闭FileStream,所以我会确保它也被关闭,看看是否有什么不同
  • 不,这不是我的全部代码,而是其中的一部分!当我想从我的输出文件(这里它的名称是 dbpediafilmdataset)中获取查询时,这些错误是相关的!有没有办法将 sparql 查询保存在 rdf 文件中?

标签: java rdf sparql nt


【解决方案1】:

最好使用CONSTRUCT 查询来执行此操作。看看它,它是专门为此目的而设计的。使用 Jena 只需执行以下操作:

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

也解释了here

主要优点是您无需担心以 Turtle 或任何其他格式编写三元组,Jena 会为您完成。

您的 CONSTRUCT 查询最终可能如下所示:

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 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多