RDF4J SPARQL 查询 JSON

RDF4J SPARQL query to JSON

我正在尝试将数据从 SPARQL 端点移动到 JSON对象。使用 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);

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

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

this fails because "Server responded with an unsupported file format: application/sparql-results+json"

在 RDF4J 中,SPARQL SELECT 查询是 tuple queries, so named because each result is a set of bindings, which are tuples of the form (name, value). In contrast, CONSTRUCT (and DESCRIBE) queries are graph queries,之所以这样称呼是因为它们的结果是一个图,即 collection 个 RDF 语句。

此外,不需要像您在此处所做的那样为响应格式设置额外的 headers(极少数情况除外),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 写入查询结果(在此示例中为标准输出)。如果您有一个 non-standard 格式,您当然也可以创建自己的 TupleQueryResultHandler 实现。

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