我正在对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是国家/地区;
但是此查询仅返回15个欧洲国家。例如,即使瑞典似乎与https://www.wikidata.org/wiki/Q34
上的查询匹配,也不会返回瑞典因此,尽管该查询似乎是正确的,但它却遗漏了许多国家/地区。有关如何解决此问题的任何想法?
在比较两个条目时;一个出现在德国/瑞典(未出现)和出现在挪威的挪威,我可以发现的区别是,德国/瑞典在主权国家中享有较高的排名,而在国家/地区中仅排名较高。这可能是WHERE子句决定仅显示首选排名(如果存在)的原因;并跳过其余的语句。如果是这样,我怀疑是这样;我想知道是否有一种方法可以覆盖查询引擎的行为,以搜索具有优先等级或正常等级的所有语句。
答案 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
我仍然出现了一些其他国家;例如德意志帝国但是我认为这是一个不同的问题。
请注意,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