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

时间:2019-06-19 19:36:20

标签: sparql rdf

我对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模式,该模式已经返回了与特定主题相关的所有三元组,因此可选模式在这里似乎没用。

我已经阅读了类似的其他问题,但似乎没有一个适合我的查询模板,因此,如果有人可以帮助我理解这一点,我将不胜感激。

2 个答案:

答案 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”标签的结果,否则将不带有语言标签。