RDF4J SPARQL查询到JSON

问题描述

我正在尝试将数据从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没有相关的prepare语句。

如果我交换

try (RepositoryConnection conn = repo.getConnection())

使用

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

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

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

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

我不知道如何从这里继续。任何帮助或建议,不胜感激。谢谢

解决方法

此操作失败,因为“服务器响应了不受支持的文件格式: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编辑环境支持显示它,我建议您使用它。