如何在 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 数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 discord.py 库中设置多个前缀或使前缀不区分大小写?