如何解决查询以获取维基数据页面中的前 3 张图片
我正在尝试使用以下查询从 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
以获得单个结果并消除重复
不过,可能有更聪明的方法来解决它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。