如何通过维基数据的部分搜索获取所有体育项目,检索第一张图片和语言
How to fetch all sports by partial search from Wikidata, retrieve first image and languages
我已经使用 SPARQL 和 Wikidata 尝试了 2 天,并浏览了所有示例。我需要帮助来找出一个复杂的查询,但我还没有找到接近我需要的示例。
想法是搜索运动,获取第一张图片(如果找到的话)。并检索所有语言的标签。下面我实现了一小部分,但是这里有问题。
通过这个查询,我可以找到篮球但不能找到足球,我不知道如何使用子类进行搜索,因为足球是运动类型的一个子类,我以为我有它工作正常,但没有 return 足球。
当我添加到获取图像时(尝试使用可选的),它 return 是 2 行的“健美”,因为有 2 个图像用于拳击,有没有办法得到第一行只有第一张图片。我尝试了 distinct 并没有深入了解它。
在这种情况下,我正在使用英语进行搜索,但希望返回所有语言的标签。
完美的结果是 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
我已经使用 SPARQL 和 Wikidata 尝试了 2 天,并浏览了所有示例。我需要帮助来找出一个复杂的查询,但我还没有找到接近我需要的示例。
想法是搜索运动,获取第一张图片(如果找到的话)。并检索所有语言的标签。下面我实现了一小部分,但是这里有问题。
通过这个查询,我可以找到篮球但不能找到足球,我不知道如何使用子类进行搜索,因为足球是运动类型的一个子类,我以为我有它工作正常,但没有 return 足球。
当我添加到获取图像时(尝试使用可选的),它 return 是 2 行的“健美”,因为有 2 个图像用于拳击,有没有办法得到第一行只有第一张图片。我尝试了 distinct 并没有深入了解它。
在这种情况下,我正在使用英语进行搜索,但希望返回所有语言的标签。
完美的结果是 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