Rdf 如何在MarkLogic中处理不区分大小写的SPARQL数据

Rdf 如何在MarkLogic中处理不区分大小写的SPARQL数据,rdf,sparql,marklogic,Rdf,Sparql,Marklogic,我试图理解如何最好地处理Marklogic SPARQL数据中的文字,在任何情况下都可能如此。我希望能够进行不区分大小写的搜索,但我认为这在语义查询中是不可能的。对于一个简单的例子,我想要: SELECT * WHERE { ?s ?p "Red"} 及 返回所有值,无论对象是“红色”、“红色”、“红色”还是“红色” 我的数据来自另一个具有可变资本化规则的来源。目前,我唯一能想到的是添加一个额外的三元组,它总是包含小写文本,这样我就可以始终搜索该值。或者,使用不区分大小写的排序规则在MarkL

我试图理解如何最好地处理Marklogic SPARQL数据中的文字,在任何情况下都可能如此。我希望能够进行不区分大小写的搜索,但我认为这在语义查询中是不可能的。对于一个简单的例子,我想要:

SELECT *
WHERE { ?s ?p "Red"}

返回所有值,无论对象是“红色”、“红色”、“红色”还是“红色”


我的数据来自另一个具有可变资本化规则的来源。目前,我唯一能想到的是添加一个额外的三元组,它总是包含小写文本,这样我就可以始终搜索该值。或者,使用不区分大小写的排序规则在MarkLogic中创建一些新的范围查询是否有意义(如果在三元组数据上可能的话)?

您可以使用忽略大小写的筛选器

select * where {
  ?s ?p ?o
  FILTER (lcase(str(?o)) = "red")
}

编辑:我向MarkLogic的PM Steve Buxton询问语义功能,他建议:

let $store := sem:store( (), cts:element-value-query(xs:QName("sem:object"), "red", "case-insensitive") )
return
  sem:sparql('
    SELECT ?o
    WHERE {
      ?s ?p ?o
      FILTER (lcase(str(?o)) = "red")
    }', (), (), $store
 )

sem:store是一个marklogic8(现在可以通过)函数,它选择一组三元组。SPARQL查询然后在缩减集上运行,限制需要过滤的三元组的数量

您也可以使用。字符串查询(第2个参数)被强制为A,它对小写字符串不区分大小写。@joemfb这是一个很好的建议,但应该指出,这些是特定于产品的扩展,不属于SPARQL标准的一部分,因此使用它们的查询将无法移植到其他SPARQL存储。加上一个,因为这是一个很好的解决方案。减去1,因为如果它是基于另一个答案,那么很有可能你应该把这个问题标记为一个重复的问题。重复的问题没有什么问题,最好有一个规范的答案,而不是到处都是非常相似的问题。对于不同的平台,同样的问题被问到,这就允许有可能不同的答案。可能重复
let $store := sem:store( (), cts:element-value-query(xs:QName("sem:object"), "red", "case-insensitive") )
return
  sem:sparql('
    SELECT ?o
    WHERE {
      ?s ?p ?o
      FILTER (lcase(str(?o)) = "red")
    }', (), (), $store
 )