【问题标题】:Writing DBPedia SPARQL results to RDF file in java在 Java 中将 DBPedia SPARQL 结果写入 RDF 文件
【发布时间】:2016-07-03 03:12:35
【问题描述】:

嗨朋友们,我是语义网的新手,遇到了一些困难。我已经向 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 文件的理解是否正确?如果可能的话,你能帮我解决这个问题吗?

【问题讨论】:

  • 如果您想要一个仅包含您在查询中找到的三元组的 RDF 文件,您可以使用 construct 查询。这将产生一个 Model,然后您可以简单地将模型写入磁盘。
  • 不清楚为什么要在循环中每次都打印整个结果。即使它不会在一次执行后清空结果,很明显这将是冗长且无用的。正确答案由@Steve McKay 在下面给出

标签: java sparql rdf semantic-web apache-jena


【解决方案1】:

System.out.println(ResultSetFormatter.asText(result)); 吃掉了整个ResultSet 所以你的下一行会抛出一个异常。空的 catch 块吞下了异常,所以看起来什么都没有写。然而,这不是真正的问题。您在 while 循环中多次调用 result.next()。每次调用 next() 时,它都会前进到下一个结果。 "property""value" 来自不同的结果!您需要将从result.next() 返回的QuerySolution 存储在一个变量中,如下所示:

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()。然后你就会知道是否出了问题,它会的,即使没有任何可能出问题的方法,因为计算机就是这样偷偷摸摸的。

【讨论】:

  • 非常感谢@Steve McKay。我明白。 .rdf 文件存在一个问题。结果现在在文件中,但它不是正确的 RDF 格式。你能告诉我如何将结果保存为 RDF/XML 文件格式吗?
  • 该文件包含您正在写入的内容...查看您的代码,您只需向其中写入一些字符串。您可能知道这不会导致 RDF,也称为图形响应。三元组。 SELECT 查询不返回 RDF,因为您需要一个 CONSTRUCT 查询。
【解决方案2】:

这样会更容易:

  1. 将您的请求更改为 CONSTRUCT 查询而不是 SELECT。这将为您提供 RDF 图表而不是表格作为答案。
  2. 然后您可以在致电exec.execConstruct() 时获得 Jena 模型
  3. 您可以使用model.write(...)轻松编写模型是您喜欢的RDF语法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多