1

我正在尝试将数据从 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);

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

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

4

1 回答 1

2

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

在 RDF4J 中,SPARQL SELECT 查询是元组查询,之所以如此命名,是因为每个结果都是一组绑定,它们是 (name, value) 形式的元组。相比之下,CONSTRUCT(和 DESCRIBE)查询是图查询,之所以这么称呼是因为它们的结果是一个图,即 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 查询结果 JSON 格式将查询结果(在本示例中为标准输出)写入。如果您考虑到非标准格式,您当然也可以创建自己的TupleQueryResultHandler实现。

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

于 2020-09-11T05:49:24.610 回答