对查询和更新使用相同的 URL

Use same URL for both query and update

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

现在,我想为更新和查询获取一个 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) 它看起来像是对三重存储的强烈要求:当我使用另一个时,它会有提供相同的界面,这是不可能的。 (不知道其他triplestores有没有实现这个功能)

编辑:修复POST/GET错误

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)

修改后的不同问题的答案:

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

http://localhost:9876/sfm

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

设置 fuseki:serviceQuery 和 fuseki:serviceUpdate 相同是没有必要的,也是不鼓励的。