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

12

我正在尝试了解如何在Marklogic SPARQL数据中处理任何情况的文本。我希望能够进行大小写不敏感的搜索,但我相信这在语义查询中是不可能的。举个简单的例子,我想要:

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

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

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


1个回答

12

你可以使用一个忽略大小写的过滤器。

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是MarkLogic 8(现在可以通过Early Access)的函数,用于选择一组三元组。然后,在减少的集合上运行SPARQL查询,限制需要过滤的三元组的数量。


3
你还可以使用cts:contains函数。一个字符串查询(第二个参数)会被强制转换成cts:word-query,对于小写字符串是不区分大小写的。 - joemfb
3
@joemfb 的建议很好,不过应该指出这些是特定于产品的扩展,不属于 SPARQL 标准的一部分,因此使用它们的查询不能在其他 SPARQL 存储中移植。 - Jeen Broekstra
加一,因为这是一个好的解决方案。减一,因为如果它基于另一个答案,很有可能你应该将问题标记为重复。重复的问题没有什么问题,最好有一个规范的答案,而不是许多非常相似的问题四处漂浮。 - Joshua Taylor
这是关于不同平台的相同问题,可能会有不同的答案。 - Dave Cassel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接