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

[See it working here.]1

我正在更改 ?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  

Result on WDQS 您也可以在 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 以获得单个结果并消除重复

不过,可能有更聪明的方法来解决它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...