查询以获取维基数据页面中的前 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]". }
}

See it working here

我正在更改 ?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 以获得单个结果并消除重复项

虽然可能有更聪明的方法来解决它。