如何通过维基数据的部分搜索获取所有体育项目,检索第一张图片和语言

How to fetch all sports by partial search from Wikidata, retrieve first image and languages

我已经使用 SPARQL 和 Wikidata 尝试了 2 天,并浏览了所有示例。我需要帮助来找出一个复杂的查询,但我还没有找到接近我需要的示例。

想法是搜索运动,获取第一张图片(如果找到的话)。并检索所有语言的标签。下面我实现了一小部分,但是这里有问题。

  1. 通过这个查询,我可以找到篮球但不能找到足球,我不知道如何使用子类进行搜索,因为足球是运动类型的一个子类,我以为我有它工作正常,但没有 return 足球。

  2. 当我添加到获取图像时(尝试使用可选的),它 return 是 2 行的“健美”,因为有 2 个图像用于拳击,有没有办法得到第一行只有第一张图片。我尝试了 distinct 并没有深入了解它。

  3. 在这种情况下,我正在使用英语进行搜索,但希望返回所有语言的标签。

完美的结果是 10 行,其中每行是一项以“bo”开头的运动,第一张图片和所有语言的标签,我知道这可能是一项艰巨的任务,所以也许语言会有在另一个查询中被请求,如果是,如何?

#NOT WORKING AS EXPECTED/Need Help 
SELECT DISTINCT ?item ?label WHERE {         
   ?item wdt:P31/wdt:P279* wd:Q31629.       
   ?item rdfs:label ?label.          
FILTER((LANG(?label)) = "en")        
FILTER(STRSTARTS(lcase(?label), lcase("bo")))       
}        
LIMIT 10

您可以使用 SAMPLE 为每项运动拍摄一张照片。如果你需要所有的标签,但不想分别定义每一种语言,并且要求每项运动只有一行,你可以使用 GROUP_CONCAT 来连接标签。要将多个值绑定到一个变量,您可以使用 VALUES.

SELECT DISTINCT ?item (SAMPLE(?img) AS ?image) (GROUP_CONCAT(DISTINCT ?lbl; separator=', ') AS ?label) WHERE {
  # Bind variable ?type to the types you want
  VALUES ?type { wd:Q31629 wd:Q7128792 }
  ?item wdt:P31 ?type .
  # Search only English labels
  ?item rdfs:label ?search_label .
  FILTER(LANG(?search_label) = "en")
  FILTER(STRSTARTS(lcase(?search_label), lcase("bo")))
  # Get all labels
  ?item rdfs:label ?l .
  # Produces strings like "bodybuilding (en)"
  BIND(CONCAT(STR(?l), ' (', LANG(?l), ')') AS ?lbl)
  # Get the images
  OPTIONAL {
      ?item wdt:P18 ?img .
  }
}
GROUP BY ?item
LIMIT 10

Link to the above query in the Wikidata Query Service