维基数据查询具有一个维基百科页面的项目
Wikidata query for items with one Wikipedia page not in English
我想查找 Wikidata 项目,每个项目都指向一个不是 en 的 Wikipedia 页面。维基百科页面。
我想到了这个查询:
SELECT ?item WHERE {
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 9, 2) != "en") .
{
SELECT ?item (COUNT(DISTINCT ?lang) AS ?count) WHERE {
?item wdt:P1367 ?yp_id . # BBC 'Your paintings' artist identifier
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 11, 15) = ".wikipedia.org/") .
?article schema:inLanguage ?lang .
} GROUP BY ?item
HAVING (?count=1)
ORDER BY DESC (?count)
}
}
执行。但是,我总是超时。
是否有更好的查询来实现我正在寻找的内容?
这里有一些提示:
- 因为您只拿
?count=1
,所以没有理由在 ?count
前订购。
- 由于每篇文章只能有一篇
?lang
,可以按?article
算,不用考虑冗余变量。
- 无需处理(子)字符串,只需使用
schema:isPartOf
属性 选择您要排除的特定域。
- 使用
FILTER NOT EXISTS
代替FILTER (... != ...)
第四个优化是最重要的,本身就足够了。
SELECT ?item WHERE {
FILTER NOT EXISTS {
?article schema:about ?item ;
schema:isPartOf <https://en.wikipedia.org/> .
}
{
SELECT ?item (COUNT(DISTINCT ?article) AS ?count) WHERE {
?item wdt:P1367 ?yp_id . # BBC 'Your paintings' artist identifier
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 11, 15) = ".wikipedia.org/") .
}
GROUP BY ?item
HAVING (?count=1)
}
}
我想查找 Wikidata 项目,每个项目都指向一个不是 en 的 Wikipedia 页面。维基百科页面。
我想到了这个查询:
SELECT ?item WHERE {
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 9, 2) != "en") .
{
SELECT ?item (COUNT(DISTINCT ?lang) AS ?count) WHERE {
?item wdt:P1367 ?yp_id . # BBC 'Your paintings' artist identifier
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 11, 15) = ".wikipedia.org/") .
?article schema:inLanguage ?lang .
} GROUP BY ?item
HAVING (?count=1)
ORDER BY DESC (?count)
}
}
执行。但是,我总是超时。
是否有更好的查询来实现我正在寻找的内容?
这里有一些提示:
- 因为您只拿
?count=1
,所以没有理由在?count
前订购。 - 由于每篇文章只能有一篇
?lang
,可以按?article
算,不用考虑冗余变量。 - 无需处理(子)字符串,只需使用
schema:isPartOf
属性 选择您要排除的特定域。 - 使用
FILTER NOT EXISTS
代替FILTER (... != ...)
第四个优化是最重要的,本身就足够了。
SELECT ?item WHERE {
FILTER NOT EXISTS {
?article schema:about ?item ;
schema:isPartOf <https://en.wikipedia.org/> .
}
{
SELECT ?item (COUNT(DISTINCT ?article) AS ?count) WHERE {
?item wdt:P1367 ?yp_id . # BBC 'Your paintings' artist identifier
?article schema:about ?item .
FILTER (SUBSTR(str(?article), 11, 15) = ".wikipedia.org/") .
}
GROUP BY ?item
HAVING (?count=1)
}
}