1

我对 rdf4j 有疑问:我想从我的 GraphDB 存储库“Feed”中删除所有feed:hashCode作为谓词的三元组。

第一个查询验证是否存在以url参数作为主语、feed:hashCode作为谓词且hash参数具有宾语的三元组,并且它有效。如果我的存储库中不存在此语句,则第二个查询开始,它应该删除所有feed:hashCode作为谓词和url作为主语的三元组,但它不起作用,有什么问题?

这是代码:

public static boolean updateFeedQuery(String url, String hash) throws RDFParseException, RepositoryException, IOException{
    Boolean result=false;
    Repository repository = new SPARQLRepository("http://localhost:7200/repositories/Feed");
    repository.initialize();

    try {
        try (RepositoryConnection conn = repository.getConnection()) {
            BooleanQuery feedUrlQuery = conn.prepareBooleanQuery(
                    // @formatter:off
                    "PREFIX : <http://purl.org/rss/1.0/>\n" +
                    "PREFIX feed: <http://feed.org/>\n" +
                    "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
                    "PREFIX dc: <http://purl.org/dc/elements/1.1/>\n" +
                    "ASK{\n" +
                    "<"+url+"> feed:hashCode \""+hash+"\";\n"+
                    "rdf:type :channel.\n" +
                    "}"
                    // @formatter:on
            );

            result = feedUrlQuery.evaluate();

            //the feed is new or updated
            if(result == false) {

                Update removeOldHash = conn.prepareUpdate(
                        // @formatter:off
                        "PREFIX feed: <http://feed.org/>\n" +
                        "DELETE WHERE{\n"+
                        "<"+url+"> feed:hashCode ?s.\n" +
                        "}"
                        // @formatter:on
                        );
                removeOldHash.execute();
            }

        }
    }
    finally {
                 repository.shutDown();
                 return result;
    }

}

错误代码为:“Missing parameter: query”,服务器响应为:“400 Bad Request”

4

1 回答 1

5

问题出在这一行:

Repository repository = new SPARQLRepository("http://localhost:7200/repositories/Feed");

您正在使用SPARQLRepository访问您的 RDF4J/GraphDB 三元存储,并且您只为它提供了一个 SPARQL查询端点。根据文档,这意味着它将使用该端点进行查询和更新。但是,RDF4J Server(以及因此 GraphDB)有一个单独的 SPARQL 更新端点(请参阅REST API 文档)。您的更新失败,因为SPARQLRepository尝试将其发送到查询端点,而不是更新端点。

一种解决方法是显式设置更新端点:

Repository repository = new SPARQLRepository("http://localhost:7200/repositories/Feed", "http://localhost:7200/repositories/Feed/statements");

但是,SPARQLRepository它实际上是用作访问(非 RDF4J)SPARQL 端点(例如 DBPedia,或您自己控制之外的某些端点或运行不同的三元存储实现)的代理类。由于 GraphDB 完全兼容 RDF4J,因此您应该真正使用HTTPRepository来访问它。HTTPRepository实现了完整的 RDF4J REST API,它扩展了基本的 SPARQL 协议,这将使您的客户端-服务器通信更加高效。有关如何有效访问远程 RDF4J/GraphDB 存储的更多详细信息,请参阅Repository API 上的 RDF4J 编程一章。

于 2018-01-17T01:13:35.587 回答