【问题标题】:RDF4J SPARQL query to JSONRDF4J SPARQL 查询到 JSON
【发布时间】:2020-09-11 14:05:13
【问题描述】:

我正在尝试将数据从 SPARQL 端点移动到 JSONObject。使用 RDF4J。

RDF4J 文档没有直接解决这个问题(一些关于使用端点的信息,更少关于转换为 JSON 的信息,以及这两种情况相遇的地方)。

到目前为止我有:

        SPARQLRepository repo = new SPARQLRepository(<My Endpoint>);
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Accept", "SPARQL/JSON");
        repo.setAdditionalHttpHeaders(headers);
        try (RepositoryConnection conn = repo.getConnection())
        {
            String queryString = "SELECT * WHERE {GRAPH <urn:x-evn-master:mwadata> {?s ?p ?o}}";
            GraphQuery query = conn.prepareGraphQuery(queryString);
            debug("Mark 2");
            try (GraphQueryResult result = query.evaluate())

此操作失败,因为“服务器以不受支持的文件格式响应:application/sparql-results+json”

我认为 SPARQLGraphQuery 应该代替 GraphQuery,但 RepositoryConnection 没有相关的准备语句。

如果我交换

try (RepositoryConnection conn = repo.getConnection())

try (SPARQLConnection conn = (SPARQLConnection)repo.getConnection())

我遇到了 SPARQLConnection 不生成 SPARQLGraphQuery 的问题。我能得到的最接近的是:

SPARQLGraphQuery query = (SPARQLGraphQuery)conn.prepareQuery(QueryLanguage.SPARQL, queryString);

这会导致运行时错误,因为这些类型不能相互转换。

我不知道如何从这里开始。非常感谢任何帮助或建议。谢谢

【问题讨论】:

标签: json sparql rdf4j


【解决方案1】:

此操作失败,因为“服务器以不受支持的文件格式响应:application/sparql-results+json”

在 RDF4J 中,SPARQL SELECT 查询是tuple queries,之所以这样命名,是因为每个结果都是一组绑定,它们是(名称、值)形式的元组。相比之下,CONSTRUCT(和 DESCRIBE)查询是 graph queries,之所以这么称呼是因为它们的结果是一个图,即 RDF 语句的集合。

此外,没有必要像您在此处所做的那样为响应格式设置额外的标头(除非在极少数情况下),RDF4J 客户端会根据已注册的解析器集自动为您处理。

因此,简而言之,将您的代码简化如下:

SPARQLRepository repo = new SPARQLRepository(<My Endpoint>);
try (RepositoryConnection conn = repo.getConnection()) {
        String queryString = "SELECT * WHERE {GRAPH <urn:x-evn-master:mwadata> {?s ?p ?o}}";
        TupleQuery query = conn.prepareTupleQuery(queryString);
        debug("Mark 2");
        try (TupleQueryResult result = query.evaluate()) {
                ... 
        }
 }

如果您想将查询结果写成 JSON 格式,可以使用TupleQueryResultHandler,例如SPARQLResultsJSONWriter,如下:

SPARQLRepository repo = new SPARQLRepository(<My Endpoint>);
try (RepositoryConnection conn = repo.getConnection()) {
        String queryString = "SELECT * WHERE {GRAPH <urn:x-evn-master:mwadata> {?s ?p ?o}}";
        TupleQuery query = conn.prepareTupleQuery(queryString);
        query.evaluate(new SPARQLResultsJSONWriter(System.out));
 }

这将使用SPARQL Query Results JSON format 将查询结果(在本例中为标准输出)写入。如果您有非标准格式,当然也可以创建自己的 TupleQueryResultHandler 实现。

有关处理结果的各种方式(包括迭代、流式传输、添加到列表或直接发送到结果处理程序)的更多详细信息,请参阅the documentation on querying a repository。顺便说一句,RDF4J API 上的javadoc 也相当广泛,所以如果您的 Java 编辑环境支持显示它,我建议您使用它。

【讨论】:

  • 有效!非常感谢您提供这个和 lotico youtube 视频。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多