繁体   English   中英

将DBPedia SPARQL结果写入java中的RDF文件

[英]Writing DBPedia SPARQL results to RDF file in java

嗨朋友我是语义网上的新朋友,有一些困难。我向DBPedia询问并获得了巴黎的房产/价值对。 我想要做的是将查询结果写入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文件吗? 如果可能的话,你能帮我解决这个问题吗?

System.out.println(ResultSetFormatter.asText(result)); 吃掉整个ResultSet这样你的下一行就会抛出异常。 空catch块吞下异常,因此看起来没有写入任何内容。 但是,这不是真正的问题。 你在while循环中多次调用result.next() 每次调用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() 然后你会知道是否会出现问题,即使没有任何可能出错的方法也会出现问题,因为计算机就像这样偷偷摸摸。

它会更容易:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM