问题描述
我正在尝试将数据从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编辑环境支持显示它,我建议您使用它。