微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RDF4J SPARQL查询到JSON

如何解决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编辑环境支持显示它,我建议您使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?