2017-07-18 163 views
1

此查询适用于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 
+0

用''city dbo:populationTotal?pop.'替换'OPTIONAL {?city dbo:populationTotal?pop。}'' –

+0

@StanislavKralin这不是必要的,但确实更有用。 – AKSW

+1

@HumanFromEarth你的查询很有效,但是由于一堆OPTIONAL(这是一堆左连接),查询非常昂贵并且导致超时 - 在这种情况下,Virtuoso有一些随时功能,它返回在给定的时间。 WebUI中的默认值是30秒,您可以增加它。 – AKSW

回答

1

人口过滤器似乎是在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 
+0

该过滤器不**失败!这只是Virtuoso的超时(默认30秒),它会返回在给定时间内找回的所有内容。增加超时时间,你会得到结果。 – AKSW

+0

实际上它没有超时(http://wikidata.dbpedia.org/sparql) - 由于原始查询的结构而没有返回任何结果。给它一个去... –

+0

我不能跟着你。原始的SPARQL查询不会在Web界面中返回结果 - 这是因为Virtuoso返回在给定时间内找到的任何内容。如果您a)增加超时值或b)删除除具有人口属性的所有可选子句之外,您可以看到FILTER的工作原理。 – AKSW

1

由于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). 
} 

Run it!

请注意,现在不需要FILTER


如果你愿意,你可以比较 “大” 居住的地方,这些查询返回的数字:

  1. simple counting
  2. counting with optional conditions

在这两种情况下结果应该是227。


我希望你真的是你的问题wikidata.dbpedia.org,并不意味着既不wikidata.org,也不是联合查询。

+1

谢谢,但在您的版本中,如果其中的一个变量可选块返回空白,整个块将为空。这就是OPTIONAL在每个可选变量之前的原因。 – HumanFromEarth

+0

@HumanFromEarth,好的,我已经解决了这个问题。但是,在这种特殊情况下,结果应该是227,不管是否可选。 –

相关问题