1

我知道默认情况下 fuseki 为查询和更新提供不同的 url ,允许一些优雅的管理。

现在,我想获得一个用于更新和查询的 URL。这种需求背后的基本原理是避免在代码库中传播两个 url。我知道更新和查询代码应该分开,但我的要求并没有混合。这只是为了避免传播两个对象而不是一个。

我当前的配置如下所示:

<#service1> rdf:type fuseki:Service ;
    fuseki:name          "dataset"  ;   # http://host:port/dataset
    fuseki:serviceQuery  "endpoint" ;   # SPARQL query service
    fuseki:serviceUpdate "endpoint" ;   # SPARQL update service
    fuseki:dataset       <#dataset> ;
    .

理论上,接口存在于/endpoint,但只接受更新。查询时:

prefix sfm: <sfm/>
SELECT DISTINCT ?value
WHERE {
    sfm:config sfm:component ?value.
}

服务器报告许多行,如下所示:

INFO  [4] POST http://localhost:9876/sfm/endpoint
INFO  [4] POST /sfm :: 'endpoint' :: [application/x-www-form-urlencoded] ? 
INFO  [4] 400 SPARQL Update: No 'update=' parameter (0 ms)

我在文档中找不到任何指定查询和更新服务不能的内容在同一个地方的东西,所以我认为这是可能的,我只是错过了一些东西。然而,日志的最后一行是明确的:fuseki 等待更新。


另一种解决方案可能是将 url 定义为localhost/dataset/,并根据我是查询还是更新,在末尾添加相关部分,分别给出localhost/dataset/querylocalhost/dataset/update

但是(1)这导致数据库需要有一个特定的 url 命名,并且(2)它看起来对三重存储有一个强烈的要求:当我使用另一个时,它必须提供相同的接口,这可能是不可能。(不知道这个功能在其他三联店有没有实现)

编辑:修复 POST/GET 错误

4

2 回答 2

4
405 HTTP method not allowed: SPARQL Update : use POST

看起来您正在使用 GET 进行 SPARQL 更新。

它已正确地将操作路由到更新处理器(您可以使用相同的端点 - 包括删除服务部分并仅使用数据集 URL)。

但是,在 HTTP 中,GET 是可缓存的操作,不应在它们可能导致更改时使用。GET 可能实际上并没有到达终端服务器,但一些中间人从 Web 缓存中对其进行响应。

使用 POST。

如果您将服务分开进行查询和更新,情况也是如此。

原始上下文

原始问题已被编辑。最初的报告是这样问的:

INFO  [1] 405 HTTP method not allowed: SPARQL Update : use POST (2 ms)
于 2016-09-09T11:28:06.670 回答
2

回答修改后的不同问题:

共享服务的端点是数据集 URL:

http://localhost:9876/sfm

更新、查询或服务是否可用由配置文件控制。

设置 fuseki:serviceQuery 和 fuseki:serviceUpdate 是不必要的,不鼓励这样做。

于 2016-09-13T12:04:07.873 回答