我有一些看起来像这样的三元组:
test:thing rdfs:label "Non-Language Label"
test:thing rdfs:label "English Label"@en
test:thing rdfs:label "French Label"@fr
我想形成一个sparql查询,它给我“非语言标签”和“法国标签”,如果有的话。
我尝试了这个并且它无效:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label ?preferredLabel
WHERE {
test:thing rdfs:label ?label
OPTIONAL {
test:thing rdfs:label ?preferredLabel .
FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i'))
}
}
提前致谢!
答案 0 :(得分:24)
我不明白为什么你在这里需要OPTIONAL
。 Jan的查询失败,因为外部模式和可选项之间没有共享变量,因此您尝试计算test:thing
的每个标签的叉积,每个非法/法语标记为test:thing
,这可能是巨大的以及查询处理器失败的原因。
除非我误解了你的问题,否则你只需要以下内容
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label
WHERE
{
test:thing rdfs:label ?label
FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr"))
}
如果您想分开这两个标签,那么您可以执行以下操作:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label ?preferredLabel
WHERE
{
{
test:thing rdfs:label ?label . FILTER(LANG(?label) = "")
}
UNION
{
test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr"))
}
}
答案 1 :(得分:6)
检查文字语言的最简单方法是使用lang()函数。使用它,您的查询可以写成:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX test: <http://test#>
SELECT ?label ?preferredLabel
WHERE {
test:thing rdfs:label ?label
OPTIONAL {
test:thing rdfs:label ?preferredLabel .
FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr")
}
}
答案 2 :(得分:2)
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?uri ?label ?preferredLabel
WHERE
{
{
?uri rdfs:label ?label . FILTER(LANG(?label) = "" && regex(str(?label), '(^|\\\\W)fr', 'i'))
}
UNION
{
?uri rdfs:label ?preferredLabel . FILTER(LANG(?preferredLabel) = "fr" && regex(str(?preferredLabel), '(^|\\\\W)fr', 'i'))
}
}