Как сохранить результат запроса sparql в файле .nt

Я хочу сохранить все тройки фильмов dbpedia в файле N-Triple (файл .nt), я выполняю запрос на конечной точке dbpedia с помощью приложения java и сохраняю результат в файле, но я не могу прочитать этот файл и выполнить запрос от него! не могли бы вы мне помочь?

//мой код для сохранения результата здесь

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

person Sareh    schedule 26.06.2011    source источник
comment
Вы уверены, что это весь ваш код? Код не выглядит так, как будто вы сделали что-то, что могло бы вызвать эту трассировку ошибки, так что есть ли другой код, который вы пропустили? Трассировка ошибки, похоже, относится к проблемам с чтением файла, но ваш код связан с записью в файл, что мне кажется странным.   -  person RobV    schedule 26.06.2011
comment
Кроме того, несмотря на то, что вы закрыли BufferedWriter, вы не закрыли FileStream, поэтому я бы удостоверился, что он тоже закрыт, и посмотрю, имеет ли это какое-то значение.   -  person RobV    schedule 26.06.2011
comment
Нет, это не весь мой код, это его часть! Эти ошибки связаны, когда я хочу получить запрос из моего выходного файла (здесь его имя dbpediafilmdataset)! Есть ли способ сохранить запрос sparql в файле rdf?   -  person Sareh    schedule 26.06.2011


Ответы (1)


Лучше сделать это с помощью запроса CONSTRUCT. Взгляните на него, он специально разработан для этой цели. С Jena просто сделайте что-то вроде:

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

Это также объясняется здесь

Основное преимущество заключается в том, что вам не нужно беспокоиться о написании троек в 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 
}
person Manuel Salvadores    schedule 27.06.2011