WikiData SPARQL 查询失败,需要 CONTAINS 才能工作
WikiData SPARQL Query Fails, requires CONTAINS to work
当我包含使用 CONTAINS 作为过滤器的行时,下面的查询有效,但如果我只是检查值 (LCASE) 是否等于 "donald trump"(它是)。
使用这一行,它有效:
过滤器(包含(LCASE(?idLabel),"donald trump"))。
使用这一行,失败了:
FILTER(LCASE(?idLabel) = "donald trump") .
WORKS 具有 idLabel = "Donald Trump"
的查询的输出
SPARQL 查询:
SELECT DISTINCT ?id ?idLabel ?PV WHERE {
?id wdt:P106 ?V0. VALUES ?V0 { wd:Q39631 } .
OPTIONAL {
?id rdfs:label ?idLabel .
FILTER(LANG(?idLabel) = 'en') .
} .
# Filter on Label
# WORKS:
FILTER(CONTAINS(LCASE(?idLabel), "donald trump") ).
# DOES NOT WORK
#FILTER(LCASE(?idLabel) = "donald trump") .
# subselect on instance type
{
SELECT ?id WHERE {
?id wdt:P31/wdt:P279* ?PV . VALUES(?PV) {(wd:Q5) } .
}
} .
}
我的问题是为什么第二个选项不起作用?
(是的,我正在寻找外科医生唐纳德·特朗普,而不是其他人)
维基数据中的标签有语言标签,因此标签字面量为
"Donald Trump"@zh
并且 LCASE
之后的字符串将是
"donald trump"@zh
确实CONTAINS
在这里工作。
你必须使用 STR
函数来获取词法形式,即
"Donald Trump"
解决方案:
FILTER(LCASE(STR(?idLabel)) = "donald trump") .
当我包含使用 CONTAINS 作为过滤器的行时,下面的查询有效,但如果我只是检查值 (LCASE) 是否等于 "donald trump"(它是)。
使用这一行,它有效:
过滤器(包含(LCASE(?idLabel),"donald trump"))。
使用这一行,失败了:
FILTER(LCASE(?idLabel) = "donald trump") .
WORKS 具有 idLabel = "Donald Trump"
的查询的输出SPARQL 查询:
SELECT DISTINCT ?id ?idLabel ?PV WHERE {
?id wdt:P106 ?V0. VALUES ?V0 { wd:Q39631 } .
OPTIONAL {
?id rdfs:label ?idLabel .
FILTER(LANG(?idLabel) = 'en') .
} .
# Filter on Label
# WORKS:
FILTER(CONTAINS(LCASE(?idLabel), "donald trump") ).
# DOES NOT WORK
#FILTER(LCASE(?idLabel) = "donald trump") .
# subselect on instance type
{
SELECT ?id WHERE {
?id wdt:P31/wdt:P279* ?PV . VALUES(?PV) {(wd:Q5) } .
}
} .
}
我的问题是为什么第二个选项不起作用?
(是的,我正在寻找外科医生唐纳德·特朗普,而不是其他人)
维基数据中的标签有语言标签,因此标签字面量为
"Donald Trump"@zh
并且 LCASE
之后的字符串将是
"donald trump"@zh
确实CONTAINS
在这里工作。
你必须使用 STR
函数来获取词法形式,即
"Donald Trump"
解决方案:
FILTER(LCASE(STR(?idLabel)) = "donald trump") .