Sparql 如何从Wikidata中通过部分搜索获取所有体育项目,检索第一张图片和语言

Sparql 如何从Wikidata中通过部分搜索获取所有体育项目,检索第一张图片和语言,sparql,wikidata,Sparql,Wikidata,我已经用SPARQL和Wikidata尝试了两天,并浏览了所有示例。我需要帮助找出一个复杂的查询,我还没有找到一个例子接近我的需要 这样做的目的是搜索运动,获得第一张图片(如果找到的话)。并检索所有语言的标签。下面我实现了一小部分,但这里有一些问题 通过这个查询,我可以得到篮球,但不能得到足球,我不知道如何使用子类进行搜索,因为足球是一种运动类型的子类,我认为它工作正常,但它不返回足球 当我添加到fetch image(使用可选选项尝试)时,它会返回两行“bodybuilding”,因为有两个

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

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

  • 通过这个查询,我可以得到篮球,但不能得到足球,我不知道如何使用子类进行搜索,因为足球是一种运动类型的子类,我认为它工作正常,但它不返回足球

  • 当我添加到fetch image(使用可选选项尝试)时,它会返回两行“bodybuilding”,因为有两个图像用于装箱,是否有方法仅使用第一个图像获取第一行。我试过了,但没有成功

  • 在这种情况下,我用英语搜索,但想得到所有语言的标签

  • 这样做的完美结果是10行,每行是1个运动,以“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\u CONCAT
    连接标签。要将多个值绑定到一个变量,可以使用

    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
    

    您是在寻找运动类型还是特定项目?我这样问是因为您当前的查询正在查找任何类型运动的实例,例如,对于运动马拉松,它返回
    波士顿马拉松
    我正在查找运动类型(篮球、足球等)。基本上,用户需要让我们知道他最喜欢的运动,我们会从wikidata中寻找建议,直到我们的数据库完成。基本上是autocompleteThanks@evsheino,这比我开始的地方好多了。但是有两个问题,第一,拳击并没有出现在这个列表中。此外,虽然我希望获得所有语言的标签,但我仍然希望搜索其中一种语言。这可能吗?我更新了查询,只搜索英文标签,只获取体育类型。拳击在维基数据中似乎被称为“拳击”。这太棒了@evsheino。是否有可能使此查询以解决多个instanceOfs的方式运行。例如,我们可以说instanceOf sport(Q31629)或combat sport(Q7128792)或。。等等这将允许我列出主要实例,以便涵盖大多数实例。是的,您可以使用
    值来实现这一点-请参阅更新的查询。