2016-07-03 9 views
1

Привет, друзья. Я новый в семантической сети и испытываю некоторые трудности. Я задал вопрос DBPedia и получил пары свойств/стоимости для Парижа. Я хочу сделать, чтобы написать результаты запроса в файл rdf. Ниже приведен мой код:Написание результатов DBPedia SPARQL в файл RDF в java

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import org.apache.jena.query.ParameterizedSparqlString; 
import org.apache.jena.query.QueryExecution; 
import org.apache.jena.query.QueryExecutionFactory; 
import org.apache.jena.query.ResultSetFactory; 
import org.apache.jena.query.ResultSetFormatter; 
import org.apache.jena.query.ResultSetRewindable; 

public class ParisTest { 

    public static void main(String[] args) { 

     ParameterizedSparqlString qs = new ParameterizedSparqlString("" 
       + " SElECT ?property ?value where {{ <http://dbpedia.org/resource/Paris> ?property ?value } UNION " 
       + " {?property ?value <http://dbpedia.org/resource/Paris>}}"); 

     QueryExecution exec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", qs.asQuery()); 

     ResultSetRewindable result = ResultSetFactory.makeRewindable(exec.execSelect()); 


     try (BufferedWriter bw = new BufferedWriter(new FileWriter("QueryResults.rdf"))) { 

      while (result.hasNext()) { 

       System.out.println((result.next().get("property").toString())); 
       System.out.println((result.next().get("value").toString())); 
       System.out.println(ResultSetFormatter.asText(result)); 

       bw.write((result.next().get("property").toString())); 
       bw.write((result.next().get("value").toString())); 

      } 
      bw.flush(); 
      bw.close(); 

     } catch (Exception e) { 
     } 

    } 
} 

Он отлично печатает результаты в консоли, но не записывает его в файл. Также я понимаю, что BufferedWriter & FileWriter создаст файл .rdf? Если возможно, не могли бы вы мне помочь в этом вопросе, пожалуйста?

+1

Если вы хотите файл RDF, содержащий только те тройки, которые вы нашли в в запросе вы можете использовать ** конструкцию ** запроса. Это создаст ** Модель **, а затем вы можете просто написать модель на диск. –

+0

Непонятно, почему вы хотите печатать весь результат каждый раз в цикле. Даже если он не опустит результат после одной казни, совершенно очевидно, что это будет многословным и бесполезным. Правильный ответ дается ниже @Steve McKay – AKSW

ответ

2

System.out.println(ResultSetFormatter.asText(result)); съедает все ResultSet, поэтому ваша следующая строка выдает исключение. Пустой блок catch проглатывает исключение, поэтому похоже, что ничего не написано. Однако это не настоящая проблема. Вы вызываете result.next() несколько раз внутри цикла while. Каждый раз, когда вы звоните next(), он переходит к следующему результату. "property" и "value" исходят из разных результатов! Вы должны хранить QuerySolution вернулся из result.next() в переменной, например:

while (result.hasNext()) { 
    QuerySolution qs = result.next(); 
    System.out.println(qs.get("property").toString()); 
    System.out.println(qs.get("value").toString()); 

    bw.write(qs.get("property").toString()); 
    bw.write(qs.get("value").toString()); 
} 

Теперь вы можете итерацию над ResultSet один-на-времени и получить ваши значения записываются в файл. И, пожалуйста, пожалуйста, сделайте что-то с исключениями, даже если это всего лишь e.printStackTrace(). Тогда вы узнаете, что что-то пойдет не так, как будет, даже если нет никакого способа, чтобы все могло пойти не так, потому что компьютеры так скрыты.

+0

Большое спасибо @Steve McKay. Я понял это. Одна проблема с файлом .rdf. Результаты теперь находятся в файле, однако это не правильный формат RDF. Не могли бы вы показать, как я могу сохранить результаты в формате RDF/XML? –

+1

Файл содержит именно то, что вы пишете в нем ... посмотрите на свой код, вы просто напишите ему несколько строк. И вы можете знать, что это не может привести к RDF, который также известен как граф или. набор троек. Запрос SELECT не возвращает RDF, для этого вам нужен запрос CONSTRUCT. – AKSW

1

Было бы проще:

  1. Изменение вашего запроса в CONSTRUCT запроса вместо SELECT. Это даст вам ответ на график RDF, а не таблицу.
  2. Вы можете получить модель Jena при вызове
  3. И вы можете легко записать модель синтаксис RDF вы, как с помощью model.write(...)