首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RDF4J对JSON的SPARQL查询

RDF4J对JSON的SPARQL查询
EN

Stack Overflow用户
提问于 2020-09-11 04:58:18
回答 1查看 456关注 0票数 1

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

RDF4J文档没有直接解决这个问题(一些关于使用端点的信息,更少关于转换为JSON的信息,在这两种情况下没有遇到任何问题)。

我有:

代码语言:javascript
复制
        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+json”

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

如果我交换

代码语言:javascript
复制
try (RepositoryConnection conn = repo.getConnection())

使用

代码语言:javascript
复制
try (SPARQLConnection conn = (SPARQLConnection)repo.getConnection())

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

代码语言:javascript
复制
SPARQLGraphQuery query = (SPARQLGraphQuery)conn.prepareQuery(QueryLanguage.SPARQL, queryString);

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

我不知道怎么从这里开始。任何帮助或建议都很感激。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-11 05:49:24

这是因为“服务器响应了不受支持的文件格式:application/sparql+json”

在RDF4J中,SPARQL SELECT查询是元组查询,因为每个结果都是一组绑定,这些绑定是表单的元组(名称、值)。相反,构造(和描述)查询是图查询,因为它们的结果是一个图,即RDF语句的集合。

此外,没有必要像您在这里所做的那样为响应格式设置额外的头(在罕见的情况下除外),RDF4J客户端将根据已注册的解析器集自动为您处理这一问题。

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

代码语言:javascript
复制
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 ),如下所示:

代码语言:javascript
复制
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查询结果JSON格式编写查询结果(在本例中为标准输出)。如果考虑到非标准格式,当然也可以创建自己的TupleQueryResultHandler实现。

有关处理结果的各种方法(包括迭代、流、添加到列表或直接发送到结果处理程序)的更多细节,请参见查询存储库的文档。顺便说一下,Java上的javadoc也相当广泛,所以如果您的RDF4J编辑环境支持显示它,我建议您使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63841000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档