我用SPARQL和wikidata尝试了2天,并完成了所有示例。我需要帮助找出一个复杂的查询,我没有找到一个接近我需要的例子。
想法是搜索体育,获得第一张图片(如果找到的话)。并检索所有语言的标签。下面我实现了一小部分,但问题就在这里。
通过这个查询,我能够得到篮球而不是足球,我无法弄清楚如何用子类进行搜索,因为足球是体育类型的子类,我以为我让它正常运作但是它不回足球。
当我添加到获取图像(尝试使用可选项)时,它返回2行中的“健美”,因为有2个图像用于装箱,是否有办法仅使用第一个图像获得第一行。我尝试了不同的东西并没有与之相提并论。
在这种情况下,我正在搜索英语,但希望找回所有语言的标签。
完美的结果将是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
答案 0 :(得分:3)
您可以使用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
JSFiddle (The library wouldn't load in SO for some reason, so i had to make a fiddle)