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