我正在尝试针对定义的四边形生成DELETE
查询:
// Example of dataset used for generation of SPARQL
const quads = [
['<1>','<2>','<3>'], // Graph: DEFAULT
['<a>','<b>','<c>','<d>'], // Graph: <d>
['<w>','<x>','<y>','<z>'] // Graph: <z>
]
我能够生成SELECT
查询来确定是否存在指定的四边形:
# SUCCESS: TRUE
# Returns all specified quads that exist
SELECT ?s ?p ?o ?g
FROM DEFAULT
FROM NAMED <d>
FROM NAMED <z>
{
{
?s ?p ?o.
VALUES (?s ?p ?o) {
( <1> <2> <3> )
}
}
UNION
{
GRAPH ?g {?s ?p ?o.}
VALUES (?s ?p ?o ?g) {
( <a> <b> <c> <d> )
( <w> <x> <y> <z> )
}
}
}
尝试在同一DEFAULT
查询中同时指定DELETE
图和任何命名图都会导致错误:
# SUCCESS: FALSE
# Executing query failed: Found FROM. Was expecting one of: DATA, WHERE or punctuation '{'.
DELETE
FROM DEFAULT
FROM NAMED <d>
FROM NAMED <z>
{
{
?s ?p ?o.
VALUES (?s ?p ?o) {
( <1> <2> <3> )
}
}
UNION
{
GRAPH ?g {?s ?p ?o.}
VALUES (?s ?p ?o ?g) {
( <a> <b> <c> <d> )
( <w> <x> <y> <z> )
}
}
}
还有其他方法可以完成此操作吗?
答案不必类似于成功的SELECT
查询。
首先:FROM DEFAULT
表示默认图不是标准的SPARQL功能,因此其行为将取决于您使用的三元组(并且许多SPARQL引擎只会给出语法错误)。其次:在DELETE / INSERT操作中,使用USING
关键字而不是FROM
指定命名图。最后:DELETE WHERE
(没有指定作为DELETE子句的一部分的模式的简短格式)不允许您在GRAPH
部分中使用WHERE
。我将展示一种在没有它的情况下制定DELETE的方法,但是或者,您必须选择执行DELETE { ?s ?p ?o } WHERE ....
等的长格式。
要从两个命名的图形中删除,您可以执行此操作(注意,我已经删除了NAMED
位,并且删除了graph参数):
DELETE
USING <d>
USING <z>
{
?s ?p ?o.
VALUES (?s ?p ?o) {
( <a> <b> <c> )
( <w> <x> <y> )
}
}
[就像我说的那样,DEFAULT
关键字不是标准的SPARQL功能。如果您这样做,也许您的SPARQL引擎会理解它:
DELETE
USING DEFAULT
USING <d>
USING <z>
{
?s ?p ?o.
VALUES (?s ?p ?o) {
( <1> <2> <3> )
( <a> <b> <c> )
( <w> <x> <y> )
}
}
否则,您最好的选择可能是使用一系列更新,而不是尝试在一个大的删除中完成所有操作。