wikidata查询丢失了欧洲国家

时间:2019-03-20 03:42:50

标签: sparql wikipedia wikidata

我正在对Wikidata使用以下查询;

SELECT ?country ?countryLabel
      WHERE
      {
        ?country   wdt:P30 wd:Q46;
                   wdt:P31 wd:Q6256.
        SERVICE wikibase:label { bd:serviceParam wikibase:language
        "[AUTO_LANGUAGE],en". }
      }

其中P30是大陆; Q46是欧洲; P31是Instance Of,而Q6256是国家/地区;

https://query.wikidata.org/#SELECT%20%3Fcountry%20%3FcountryLabel%0A%20%20%20%20%20%20WHERE%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%3Fcountry%20%20%20wdt%3AP30%20wd%3AQ46%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wdt%3AP31%20wd%3AQ6256.%0A%20%20%20%20%20%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%0A%20%20%20%20%20%20%20%20%22%5BAUTO_LANGUAGE%5D%2Cen%22.%20%7D%0A%20%20%20%20%20%20%7D

但是此查询仅返回15个欧洲国家。例如,即使瑞典似乎与https://www.wikidata.org/wiki/Q34

上的查询匹配,也不会返回瑞典

因此,尽管该查询似乎是正确的,但它却遗漏了许多国家/地区。有关如何解决此问题的任何想法?

在比较两个条目时;一个出现在德国/瑞典(未出现)和出现在挪威的挪威,我可以发现的区别是,德国/瑞典在主权国家中享有较高的排名,而在国家/地区中仅排名较高。这可能是WHERE子句决定仅显示首选排名(如果存在)的原因;并跳过其余的语句。如果是这样,我怀疑是这样;我想知道是否有一种方法可以覆盖查询引擎的行为,以搜索具有优先等级或正常等级的所有语句。

1 个答案:

答案 0 :(得分:0)

在使用真相陈述时,我会更好地选择国家。这些语句甚至可以删除那些具有正常排名的语句。

SELECT DISTINCT ?country ?countryLabel
      WHERE
      {
        ?country   wdt:P30 wd:Q46.
        ?country p:P31 ?country_instance_of_statement .
        ?country_instance_of_statement ps:P31 wd:Q6256 .
        SERVICE wikibase:label { bd:serviceParam wikibase:language
        "[AUTO_LANGUAGE],en". 
        }
        filter not exists{?country p:P31/ps:P31 wd:Q3024240 }
      } 
      order by ?countryLabel

我仍然出现了一些其他国家;例如德意志帝国但是我认为这是一个不同的问题。

https://query.wikidata.org/#SELECT%20distinct%20%3Fcountry%20%3Fcountry_instance_of_statement%20%3FcountryLabel%0A%20%20%20%20%20%20WHERE%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%3Fcountry%20%20%20wdt%3AP30%20wd%3AQ46.%0A%20%20%20%20%20%20%20%20%3Fcountry%20p%3AP31%20%3Fcountry_instance_of_statement%20.%0A%20%20%20%20%20%20%20%20%3Fcountry_instance_of_statement%20ps%3AP31%20wd%3AQ6256%20.%0A%20%20%20%20%20%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%0A%20%20%20%20%20%20%20%20%22%5BAUTO_LANGUAGE%5D%2Cen%22.%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20filter%20not%20exists%7B%3Fcountry%20p%3AP31%2Fps%3AP31%20wd%3AQ3024240%20%7D%0A%20%20%20%20%20%20%7D%20%0A

请注意,country_instance_of_statement捕获所有语句,而与等级无关。然后,一旦有了这些对象,我就使用'ps:P31 wd:Q6256'提取那些以国家(“ wd:Q6256”)为对象的对象。

我在上面的@AKSW中添加了建议。

对于那些想要使用国家结束时间的其他方法的人来说,这就是sparql

SELECT distinct ?country ?countryLabel
      WHERE
      {
        ?country   wdt:P30 wd:Q46.
        ?country p:P31 ?country_instance_of_statement .
        ?country_instance_of_statement ps:P31 wd:Q6256 .
        filter not exists {?country_instance_of_statement pq:P582 ?endTime }
        SERVICE wikibase:label { bd:serviceParam wikibase:language
        "[AUTO_LANGUAGE],en". 
        }
      } 
      order by ?countryLabel

https://query.wikidata.org/#SELECT%20distinct%20%3Fcountry%20%3Fcountry_instance_of_statement%20%3FcountryLabel%0A%20%20%20%20%20%20WHERE%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%3Fcountry%20%20%20wdt%3AP30%20wd%3AQ46.%0A%20%20%20%20%20%20%20%20%3Fcountry%20p%3AP31%20%3Fcountry_instance_of_statement%20.%0A%20%20%20%20%20%20%20%20%3Fcountry_instance_of_statement%20ps%3AP31%20wd%3AQ6256%20.%0A%20%20%20%20%20%20%20%20filter%20not%20exists%20%7B%3Fcountry_instance_of_statement%20pq%3AP582%20%3FendTime%20%7D%0A%20%20%20%20%20%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%0A%20%20%20%20%20%20%20%20%22%5BAUTO_LANGUAGE%5D%2Cen%22.%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20%0A