1

嗨朋友们,我是语义网的新手,遇到了一些困难。我已经向 DBPedia 查询并获得了 Paris 的属性/值对。我想要做的是将查询结果写入 rdf 文件。下面是我的代码:

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 文件的理解是否正确?如果可能的话,你能帮我解决这个问题吗?

4

2 回答 2

2

System.out.println(ResultSetFormatter.asText(result));吃掉整个ResultSet,所以你的下一行抛出一个异常。空的 catch 块吞下了异常,所以看起来什么都没有写。然而,这不是真正的问题。您在result.next()while 循环中多次调用。每次调用next()它都会前进到下一个结果。"property"并且"value"来自不同的结果!您需要将QuerySolution返回的 from存储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()。然后你会知道是否出了问题,它会,即使没有任何可能出问题的方法,因为计算机就是这样偷偷摸摸的。

于 2016-07-03T04:59:30.227 回答
1

这样做会更容易:

  1. 将您的请求更改为 CONSTRUCT 查询而不是 SELECT。这将为您提供 RDF 图表而不是表格作为答案。
  2. 然后,您可以在调用时获得 Jena 模型exec.execConstruct()
  3. 并且您可以轻松地将模型编写为您喜欢使用的 RDF 语法model.write(...)
于 2016-08-22T10:12:21.667 回答