2017-07-18 114 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,不管是否可選。 –

相關問題