查询以获取维基数据页面中的前 3 个图像
Query to get first 3 images in Wikidata page
我正在尝试使用以下查询从维基数据上的物种页面查询数据:
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 行:
动物
动物标签
iucncode
照片
我想有这样一行:
动物
动物标签
iucncode
photo_1
photo_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)
用于确保每个变量都返回一些结果,即使在 Wikidata 上没有匹配项
- 模式
?a (SAMPLE (?b) as ?b) (SAMPLE (?c) as ?c) + GROUP BY ?a
以获得单个结果并消除重复项
虽然可能有更聪明的方法来解决它。
我正在尝试使用以下查询从维基数据上的物种页面查询数据:
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 行:
动物 | 动物标签 | iucncode | 照片 |
---|
我想有这样一行:
动物 | 动物标签 | iucncode | photo_1 | photo_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
快速解释:
- 用于在每个变量上获取不同照片的模式
OPTIONAL + FILTER (?A != ?B)
- 模式
BIND(IF( BOUND( ?a), ?a,"NA") AS ?a)
用于确保每个变量都返回一些结果,即使在 Wikidata 上没有匹配项 - 模式
?a (SAMPLE (?b) as ?b) (SAMPLE (?c) as ?c) + GROUP BY ?a
以获得单个结果并消除重复项
虽然可能有更聪明的方法来解决它。