我对SPARQL相当陌生,我正在尝试为查询模板返回的文字插入某种语言过滤器。 问题在于数据集没有提供结构良好的标记系统,因此我必须以某种条件方式限制结果,并使这些条件与以下模板一起使用:
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
// here i putted my filters
}
}
我要添加的过滤器应提供一种仅返回带有文字模式的“英语版本”的方法。如果未提供英文版本,则返回未加标签的版本-始终有未加标签的版本。
基于针对类似问题的解决方案,我尝试了以下方法:
filter(!isLiteral(?o) || (langMatches(lang(?o), 'en')) || lang(?o)='')
但是-当然-最终会同时返回:英文和未加标签的文字。
为某人解决问题的另一种方法是使用两个here之类的OPTIONAL
模式:
optional {
?country rdfs:label ?label
filter langMatches(lang(?label), "en")
}
optional {
?country rdfs:label ?label
}
但是我的模板中有?s ?p ?o
模式,该模式已经返回了与特定主题相关的所有三元组,因此可选模式在这里似乎没用。
我已经阅读了类似的其他问题,但似乎没有一个适合我的查询模板,因此,如果有人可以帮助我理解这一点,我将不胜感激。
答案 0 :(得分:1)
如果我对您的问题的解释正确,那么可以使用单个FILTER
并将其按优先顺序排序,例如喜欢:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select * where {
bind(skos:member as ?s)
?s ?p ?o .
filter (
!isLiteral(?o) ||
langmatches(lang(?o), "en")
|| (langmatches(lang(?o), "") && not exists {
?s ?p ?other.
filter(isLiteral(?other) && langmatches(lang(?other), "en"))
}))
}
?o
以外的任何非文字价值@en
匹配的语言标签的文字@en
标记的文字HTH
在上面的查询中使用skos:member
只是为了约束?s
,这是任意的...
答案 1 :(得分:0)
有点晚了,但是我刚刚找到的解决方案是
SELECT distinct ?s ?p ?o WHERE {
?this :is :something. // this pattern is passed as argument
// to the js func that manage the
// query
{
bind(?this as ?s)
?s ?p ?o.
FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
}
}
过滤器FILTER(IF(NOT EXISTS {SELECT ?r WHERE {?s ?p ?r FILTER(lang(?r) = 'en')}}, lang(?o) = '', lang(?o) = 'en'))
将给出带有“ en”标签的结果,否则将不带有语言标签。