问题描述
我正在尝试使用以下查询从 Wikidata 上的物种页面查询数据:
SELECT ?animal ?animalLabel ?iucncode ?photo WHERE {
VALUES ?iucncode { "714" }
?animal wdt:P627 ?iucncode
OPTIONAL {
?animal wdt:P18 ?photo.
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}
我正在更改 ?iucncode
的值以获取有关不同物种的数据。使用当前查询,对于单个页面,我会得到与图像一样多的结果。我希望每个页面都有一行响应,前 3 个图像有 3 列数据(如果有)。有没有办法用 SPARQL 做到这一点?
对于上面例子中的物种,这些列不是有 4 行:
动物 | animalLabel | iucncode | 照片 |
---|
我想要这样的一行:
动物 | animalLabel | iucncode | 照片_1 | 照片_2 | photo_3 |
---|
解决方法
这是一种方法:
SELECT
?animal ?animalLabel ?iucncode
(SAMPLE(?photo1) as ?photo1)
(SAMPLE(?photo2) as ?photo2)
(SAMPLE(?photo3) as ?photo3)
WHERE {
VALUES ?iucncode { "714" "6736" "550" "899" }
?animal wdt:P627 ?iucncode
OPTIONAL {
?animal wdt:P18 ?photo1.
}
BIND(IF( BOUND( ?photo1),?photo1,"NA1") AS ?photo1)
OPTIONAL {
?animal wdt:P18 ?photo2.
FILTER ( ?photo1 != ?photo2)
}
BIND(IF( BOUND( ?photo2),?photo2,"NA2") AS ?photo2)
OPTIONAL {
?animal wdt:P18 ?photo3.
FILTER ( ?photo1 != ?photo3)
FILTER ( ?photo2 != ?photo3)
}
BIND(IF( BOUND( ?photo3),?photo3,"NA3") AS ?photo3)
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". }
}
GROUP BY ?animal ?animalLabel ?iucncode
您也可以在 WDQS 上看到它:https://w.wiki/3WUi
快速说明:
- 模式
OPTIONAL + FILTER (?A != ?B)
用于在每个变量上获取不同的照片 - 模式
BIND(IF( BOUND( ?a),?a,"NA") AS ?a)
用于确保为每个变量返回一些结果,即使维基数据上没有匹配项 - 模式
?a (SAMPLE (?b) as ?b) (SAMPLE (?c) as ?c) + GROUP BY ?a
以获得单个结果并消除重复
不过,可能有更聪明的方法来解决它。