带有 SERVICE 语句的 SPARQL DELETE/INSERT
SPARQL DELETE/INSERT with SERVICE statement
我正在为来自维基数据的一些数据创建一个本地缓存,以确保我可以快速自动完成标签。我想每周更新一次数据,但前提是 SERVICE 子句有效。
基本上我是这样的:
INSERT { GRAPH <http://my.data/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}}
现在我想我可以做一个 DELETE/INSERT 我先删除所有数据:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
WITH <http://my.data/graph/wikidata>
DELETE { ?s ?p ?o }
INSERT {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
?s ?p ?o
}
但是这样看来我从维基数据中得到了 400。我在没有 SERVICE 的情况下做了类似的 DELETE/INSERTs,但我不明白为什么这不能像这样工作,因为我没有在现有图形和 SERVICE 查询之间绑定任何变量。
有人看到这里出了什么问题吗?基本上我想擦除现有图表,但不会以空图表结束,以防维基数据关闭。
感谢用户 AKSW 对 UNION 的提示,这是有效的查询:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
DELETE { GRAPH <http://data.alod.ch/graph/wikidata> { ?s ?p ?o }}
INSERT { GRAPH <http://data.alod.ch/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
{
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
}
UNION
{
GRAPH <http://data.alod.ch/graph/wikidata> {
?s ?p ?o
}
}
}
我正在为来自维基数据的一些数据创建一个本地缓存,以确保我可以快速自动完成标签。我想每周更新一次数据,但前提是 SERVICE 子句有效。
基本上我是这样的:
INSERT { GRAPH <http://my.data/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}}
现在我想我可以做一个 DELETE/INSERT 我先删除所有数据:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
WITH <http://my.data/graph/wikidata>
DELETE { ?s ?p ?o }
INSERT {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
?s ?p ?o
}
但是这样看来我从维基数据中得到了 400。我在没有 SERVICE 的情况下做了类似的 DELETE/INSERTs,但我不明白为什么这不能像这样工作,因为我没有在现有图形和 SERVICE 查询之间绑定任何变量。
有人看到这里出了什么问题吗?基本上我想擦除现有图表,但不会以空图表结束,以防维基数据关闭。
感谢用户 AKSW 对 UNION 的提示,这是有效的查询:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
DELETE { GRAPH <http://data.alod.ch/graph/wikidata> { ?s ?p ?o }}
INSERT { GRAPH <http://data.alod.ch/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
{
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
}
UNION
{
GRAPH <http://data.alod.ch/graph/wikidata> {
?s ?p ?o
}
}
}