带有语言过滤器的 SPARQL 查询模板

SPARQL query template with language filters

我是 SPARQL 的新手,我正在尝试为由我的查询模板 return 编辑的文字插入某种语言过滤器。 问题是数据集没有提供结构良好的标记系统,所以我必须以某种条件方式限制结果,并使这些条件适用于以下模板:

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
  }
}

我想添加的过滤器应该提供一种方法 return 只有 "english version" 用于带有文字的模式。如果未提供英文版本,则 return 未标记的版本 - 始终存在未标记的版本。

根据类似问题的解决方案,我尝试了这个:

filter(!isLiteral(?o) || (langMatches(lang(?o), 'en')) || lang(?o)='')

但是 - 当然 - 最终 return 两者兼而有之:英语和未标记的文字。

另一种为某人解决问题的方法是使用两个 OPTIONAL 模式,例如 :

optional { 
  ?country rdfs:label ?label
  filter langMatches(lang(?label), "en")
}
optional { 
  ?country rdfs:label ?label
}

但我的模板中有 ?s ?p ?o 模式,它已经 return 包含与特定主题关联的所有三元组,因此可选模式在这里似乎没用。

我读过其他类似的问题,但似乎没有一个适合我的查询模板,所以如果有人能帮助我理解这一点,我将不胜感激。

如果我对你的问题的解释是正确的,那么使用一个 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")) 
                }))

} 
  • 它将通过任何 non-literal 价值赏金或 ?o
  • 然后对于语言标签匹配 @en
  • 的文字
  • 最后,没有语言标签的文字,没有相同主语和谓语的语句,有一个带有 @en 标签的文字

HTH

在上面的查询中使用 skos:member 只是为了将某些东西绑定到 ?s 并且它是任意的...

有点晚了,但我刚刚找到的解决方案是

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' 标记的结果,否则,它将给出没有语言标记的结果。