为什么我的查询不能在wikidata.dbpedia.org/sparql上运行?
此查询适用于http://dbpedia.org/snorql/。为什么我的查询不能在wikidata.dbpedia.org/sparql上运行?
但它不适用于http://wikidata.dbpedia.org/sparql。
我该如何解决这个问题才能在http://wikidata.dbpedia.org/sparql中工作?
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/resource>
PREFIX dbpprop: <http://dbpedia.org/property>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT DISTINCT *
WHERE{
?city rdf:type dbo:PopulatedPlace.
OPTIONAL {?city rdfs:label ?labelEN. FILTER (lang(?labelEN) = 'en').}
OPTIONAL {?city rdfs:label ?labelES. FILTER (lang(?labelES) = 'es').}
OPTIONAL {?city dbo:populationTotal ?pop.}
OPTIONAL {?city dbo:country ?country.
OPTIONAL {?country rdfs:label ?countryEN . FILTER (lang(?countryEN) = 'en').}
OPTIONAL {?country rdfs:label ?countryES . FILTER (lang(?countryES) = 'es').}
}
OPTIONAL {?city geo:long ?long.}
OPTIONAL {?city geo:lat ?lat.}
FILTER (?pop>1000000).
}
LIMIT 100
人口过滤器似乎是在http://wikidata.dbpedia.org/sparql
您的查询出于某些原因未能在您的具体问题我改成了:
FILTER (?pop>1).
和它的工作。
我还做您的查询的这个变体的作品(一些城市有多个值dbo:populationTotal
所以我选择了MAX
值):
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbpedia: <http://dbpedia.org/resource>
PREFIX dbpprop: <http://dbpedia.org/property>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT ?city ?labelEN ?labelES MAX(?pop) ?countryEN ?countryES
WHERE{
?city rdf:type dbo:PopulatedPlace.
?city dbo:city ?country.
{?city rdfs:label ?labelEN. FILTER (lang(?labelEN) = 'en').}
{?city rdfs:label ?labelES. FILTER (lang(?labelES) = 'es').}
{?city dbo:populationTotal ?pop.}
OPTIONAL {?country rdfs:label ?countryEN . FILTER (lang(?countryEN) = 'en').}
OPTIONAL {?country rdfs:label ?countryES . FILTER (lang(?countryES) = 'es').}
FILTER(?pop > 1000000)
}
GROUP by ?city ?labelEN ?labelES ?countryEN ?countryES
由于AKSW指出,炫技有时只是冲在给定发现一切时间。您的查询太昂贵,无法在给定时间内完全执行。
您应该:
- 增加超时(虽然甚至300秒不够),或
- 优化您的查询。
正如AKSW指出的那样,OPTIONAL
本身很贵。但过滤OPTIONAL
值也是(甚至可能更昂贵)。刚刚与?pop
变量删除OPTIONAL
:
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT DISTINCT *
WHERE {
?city rdf:type dbo:PopulatedPlace.
OPTIONAL {?city rdfs:label ?labelEN. FILTER (lang(?labelEN) = 'en').}
OPTIONAL {?city rdfs:label ?labelES. FILTER (lang(?labelES) = 'es').}
?city dbo:populationTotal ?pop. #-- Not optional, will be filtered!
OPTIONAL {?city dbo:country ?country.
OPTIONAL {?country rdfs:label ?countryEN . FILTER (lang(?countryEN) = 'en').}
OPTIONAL {?country rdfs:label ?countryES . FILTER (lang(?countryES) = 'es').}
}
OPTIONAL {?city geo:long ?long.}
OPTIONAL {?city geo:lat ?lat.}
FILTER (?pop>1000000).
}
请注意,现在不需要FILTER
。
如果你愿意,你可以比较 “大” 居住的地方,这些查询返回的数字:
在这两种情况下结果应该是227。
我希望你真的是你的问题wikidata.dbpedia.org,并不意味着既不wikidata.org,也不是联合查询。
谢谢,但在您的版本中,如果其中的一个变量可选块返回空白,整个块将为空。这就是OPTIONAL在每个可选变量之前的原因。 – HumanFromEarth
@HumanFromEarth,好的,我已经解决了这个问题。但是,在这种特殊情况下,结果应该是227,不管是否可选。 –
用''city dbo:populationTotal?pop.'替换'OPTIONAL {?city dbo:populationTotal?pop。}'' –
@StanislavKralin这不是必要的,但确实更有用。 – AKSW
@HumanFromEarth你的查询很有效,但是由于一堆OPTIONAL(这是一堆左连接),查询非常昂贵并且导致超时 - 在这种情况下,Virtuoso有一些随时功能,它返回在给定的时间。 WebUI中的默认值是30秒,您可以增加它。 – AKSW