SPARQL 为什么同时存在 DELETE 和 WHERE 条件?

SPARQL why are there both DELETE and WHERE conditions?

最近我根据匹配模式删除了一些数据 ?s a :answers 并且我注意到只有当我的两个条件块相同时我才能正确地进行删除:

PREFIX :      <http://localhost:2020/vocab/> 
DELETE {
    ?s a :answers
}
WHERE {
    ?s a :answers
}
# returns all the correct data

如果删除块更通用,则不会返回任何内容:

PREFIX :      <http://localhost:2020/vocab/>
DELETE {
    ?s ?p ?o
}
WHERE {
    ?s a :answers
}
# returns 0 rows

设置两组不同的条件(花括号之间的内容:{...})的目的是什么?哪一个实际选择要删除的数据?

因为你删除的可能不是你用WHERE匹配的。

第一种情况有特殊形式:

DELETE WHERE { ?s a :answers }

在第二个中,?p 和?o 没有绑定。尝试:

DELETE {
    ?s ?p ?o
}
WHERE {
    ?s a :answers .
    ?s ?p ?o .
}

如果您不需要 WHERE 子句,您可以使用 DELETE DATA。它没有 WHERE 子句,只是删除了第一个子句中的任何模式。您可能想要使用 DELETE ... WHERE ... 的原因是 WHERE 子句赋予您更多权力来指定仅删除某些三元组。例如,在您的示例中,您可能不想删除整个图形,而是可能希望删除所有以 :answers 为主题的实例的三元组。这就是该查询应该做的。如果您这样做:DELETE DATA {?s ?p ?o} 应该删除整个图表。