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

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

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

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

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

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

【问题讨论】:

标签: rdf sparql marklogic


【解决方案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 商店。
  • 加一个,因为这是一个很好的解决方案。减去一个,因为如果它基于另一个答案,那么您很有可能应该将该问题标记为重复。重复的问题没有什么问题,最好有一个规范的答案,而不是一堆非常相似的问题。
  • 这是针对不同平台提出的同一个问题,因此可能会有不同的答案。
猜你喜欢
  • 2017-12-16
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多