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

Posted

技术标签:

【中文标题】如何在 MarkLogic 中处理不区分大小写的 SPARQL 数据【英文标题】:How to handle case-insensitive SPARQL data in MarkLogic 【发布时间】:2015-01-31 01:19:58 【问题描述】:

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

SELECT *
WHERE  ?s ?p "Red"

SELECT *
WHERE  ?s ?p "red"

返回所有值,无论对象是“Red”、“RED”、“red”还是“rED”。

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

【问题讨论】:

How to write SPARQL query that efficiently matches string literals while ignoring case的可能重复 【参考方案1】:

您可以使用忽略大小写的过滤器。

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

Based on the answer to another question。

编辑:我向 MarkLogic 的产品经理 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 是一个 MarkLogic 8(现在可通过 Early Access 获得)函数,用于选择一组三元组。然后 SPARQL 查询在缩减集上运行,限制需要过滤的三元组的数量。

【讨论】:

您也可以使用cts:contains。字符串查询(第二个参数)被强制转换为 cts:word-query,它对小写字符串不区分大小写。 @joemfb 好建议,但应该指出的是,这些是不属于 SPARQL 标准的特定于产品的扩展,因此使用它们的查询将无法移植到其他 SPARQL 商店。 加一个,因为这是一个很好的解决方案。减去一个,因为如果它基于另一个答案,那么您很有可能应该将该问题标记为重复。重复的问题没有什么问题,最好有一个规范的答案,而不是一堆非常相似的问题。 这是针对不同平台提出的同一个问题,因此可能会有不同的答案。

以上是关于如何在 MarkLogic 中处理不区分大小写的 SPARQL 数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何去除大小写区分的设置?!

不区分大小写的操作

如何在 discord.py 库中设置多个前缀或使前缀不区分大小写?

如何使用 preg_replace 和 preg_quote 处理字符串(不区分大小写)?

Java UUID是不是区分大小写

Java UUID是不是区分大小写