当前位置: 首页 > 知识库问答 >
问题:

RDF4j和GraphDB存储库连接

薛钧
2023-03-14

rdf4j有一个问题:我想从GraphDB存储库“Feed”中删除所有以Feed:hashCode为谓词的三元组。

第一个查询验证是否存在一个三元组,url参数作为主语,feed:hashCode作为谓词,hash参数是否有object,并且是否有效。如果我的存储库中不存在此语句,则第二个查询开始,它应该删除所有三元组,将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参数:查询",服务器响应为:"400错误请求"

共有1个答案

卫逸春
2023-03-14

问题出在这一行:

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

您正在使用SPARQLRepository访问RDF4J/GraphDB三重存储,并且您仅为其提供SPARQL查询终结点。根据留档,这意味着它将使用该终结点进行查询和更新。但是,RDF4J Server(因此也是GraphDB)具有用于SPARQL更新的单独endpoint(请参阅REST API留档)。更新失败,因为SPARQLRepository尝试将其发送到查询终结点而不是更新终结点。

一种修复方法是显式设置更新endpoint:

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

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

 类似资料:
  • 我们使用RDF4J(以前的sesame)框架来运行sparql查询到远程GraphDB三重存储。 这可以通过rdf4j HTTPRepository接口成功地工作,该接口使用Graphdb服务器的URL和存储库ID,但在使用rdf4j SPARQLRepository接口时失败,该接口将Sparlqendpointurl作为参数。 在运行查询时,我们在查询验证中得到一个异常 “获取服务器协议失败;

  • 我注意到,与RDF4J相比,GraphDB不允许在存储库ID中使用点。我们有包含一些分类法的版本化存储库。版本号用于存储库ID,例如:。 虽然这在RDF4J中运行良好,但我必须在GraphDB中以不同的方式调用这样的存储库,例如。我希望能够在RDF4J和GraphDB上使用相同的查询集和联邦(调用引用分类库),以便根据用例在两者之间切换。在RDF4J中,我可以通过让一个无版本ID的联邦存储指向特定

  • 图B-Free/9.4。1,RDF4J/3.3。1. 我正在使用 /rest/data/import/server/{repo-id}终结点来启动RDF/XML文件的导入。 步骤: > 放入SysML。${graphdb.workbench.importDirectory}目录中的owl。chmodasysml。猫头鹰 创建仓库test1(在工作台-使用除RepositoryID:="test1"

  • 我使用GraphDB来存储我的三元组,需要将SpinSail组件堆叠在GraphDB上,以支持自旋规则以及GraphDB默认支持的所有其他功能。 到目前为止,我已经成功地在远程服务器上创建了一个支持Spin规则的存储库(详细信息如下),但它似乎只支持Spin,而不支持GraphDB支持的其他功能(例如查看图表、通过文件添加三元组、搜索等) 创建存储库后,配置文件如下所示: 虽然一个普通的配置文件(

  • 我试图以编程方式(通过SPARQL查询或restendpoint)重命名ontotext graphdb存储库。 我可以使用这里记录的以下SPARQL删除旧存储库并插入新存储库,但是这会删除旧存储库中的所有数据 我可以手动将索引文件复制到这个新的存储库位置,但是是否有内置的gradb功能来完成此操作。

  • 在Ontotext GraphDB或RDF4J SPARQL评估中,函数似乎有问题。后者不太可能,因为我无法用内存中的SAIL重现该错误。 版本:Graphdb Free 9.4.1(以及一些早期版本:在9.4.0中确认,在9.3.3中怀疑,可能也早于此)。 复制: 在Windows 10下安装新的9.4.1免费GraphDB 创建一个默认配置的存储库,除了:启用了SHACL验证,没有推断(没有系