sparql 期待 "where"、"using" 之一
sparql expecting one of "where", "using"
我正在尝试在 Fuseki 服务器的 Web 界面中执行一个简单的插入查询。我已将端点设置为 /update
(而不是默认的 /sparql
)。
我有来自 https://www.w3.org/Submission/SPARQL-Update/ 的以下查询:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT { <http://example/egbook3> dc:title "This is an example title" }
此查询被翻译成:
http://localhost:3033/dataset.html#query=PREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%0AINSERT+%7B+%3Chttp%3A%2F%2Fexample%2Fegbook3%3E+dc%3Atitle++%22This+is+an+example+title%22+%7D%0A
要么
curl http://localhost:3033/infUpdate/update -X POST --data 'update=PREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%0AINSERT+%7B+%3Chttp%3A%2F%2Fexample%2Fegbook3%3E+dc%3Atitle++%22This+is+an+example+title%22+%7D%0A' -H 'Accept: text/plain,*/*;q=0.9'
使用 Share your query
按钮可见。
查询returns出现如下错误:
Error 400: Encountered "<EOF>" at line 2, column 73.
Was expecting one of:
"where" ...
"using" ...
Fuseki - version 2.4.0 (Build date: 2016-05-10T11:59:39+0000)
Web 界面和 curl
都会出现错误。这里可能是什么问题? SELECT
查询工作没有问题。通过 Web 界面上传表单从文件加载三元组也可以。附加问题:正常的post请求使用query=
而curl
版本使用update=
,为什么不一样?
您引用的文档是 2008 SPARQL Update submission, not the actual 2013 SPARQL 1.1 recommendation。推荐是实际标准,投稿不是。
更新(插入或删除)不是查询(select、询问、构造),两种查询的语法不一定相同。您注意到(正确地)WHERE 在 select 查询中是可选的,但这并不意味着它在插入中是可选的。插入有两种形式。 INSERT DATA 的语法为:
INSERT DATA QuadData
还有 DELETE/INSERT 其语法为:
( WITH IRIref )?
( ( DeleteClause InsertClause? ) | InsertClause )
( USING ( NAMED )? IRIref )*
WHERE GroupGraphPattern
DeleteClause ::= DELETE QuadPattern
InsertClause ::= INSERT QuadPattern
因此,如果您使用的是 INSERT { … },那么这是 DELETE/INSERT 形式的 InsertClause,您需要在它后面加上 WHERE …。由于您使用的是静态数据,因此您应该只使用 INSERT DATA 形式:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA { <http://example/egbook3> dc:title "This is an example title" }
我正在尝试在 Fuseki 服务器的 Web 界面中执行一个简单的插入查询。我已将端点设置为 /update
(而不是默认的 /sparql
)。
我有来自 https://www.w3.org/Submission/SPARQL-Update/ 的以下查询:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT { <http://example/egbook3> dc:title "This is an example title" }
此查询被翻译成:
http://localhost:3033/dataset.html#query=PREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%0AINSERT+%7B+%3Chttp%3A%2F%2Fexample%2Fegbook3%3E+dc%3Atitle++%22This+is+an+example+title%22+%7D%0A
要么
curl http://localhost:3033/infUpdate/update -X POST --data 'update=PREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%0AINSERT+%7B+%3Chttp%3A%2F%2Fexample%2Fegbook3%3E+dc%3Atitle++%22This+is+an+example+title%22+%7D%0A' -H 'Accept: text/plain,*/*;q=0.9'
使用 Share your query
按钮可见。
查询returns出现如下错误:
Error 400: Encountered "<EOF>" at line 2, column 73.
Was expecting one of:
"where" ...
"using" ...
Fuseki - version 2.4.0 (Build date: 2016-05-10T11:59:39+0000)
Web 界面和 curl
都会出现错误。这里可能是什么问题? SELECT
查询工作没有问题。通过 Web 界面上传表单从文件加载三元组也可以。附加问题:正常的post请求使用query=
而curl
版本使用update=
,为什么不一样?
您引用的文档是 2008 SPARQL Update submission, not the actual 2013 SPARQL 1.1 recommendation。推荐是实际标准,投稿不是。
更新(插入或删除)不是查询(select、询问、构造),两种查询的语法不一定相同。您注意到(正确地)WHERE 在 select 查询中是可选的,但这并不意味着它在插入中是可选的。插入有两种形式。 INSERT DATA 的语法为:
INSERT DATA QuadData
还有 DELETE/INSERT 其语法为:
( WITH IRIref )?
( ( DeleteClause InsertClause? ) | InsertClause )
( USING ( NAMED )? IRIref )*
WHERE GroupGraphPattern
DeleteClause ::= DELETE QuadPattern
InsertClause ::= INSERT QuadPattern
因此,如果您使用的是 INSERT { … },那么这是 DELETE/INSERT 形式的 InsertClause,您需要在它后面加上 WHERE …。由于您使用的是静态数据,因此您应该只使用 INSERT DATA 形式:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA { <http://example/egbook3> dc:title "This is an example title" }