2014-12-02 20 views
5

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

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

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

返回所有值的对象是否是“红”,“红”,“红”或“红色”。

我的数据来自于具有可变大写规则的另一个来源。目前我唯一能想到的是添加一个总是包含小写字母的额外三元组,因此我总是可以搜索该值。另外,如果在MarkLogic中创建一个新的范围查询并且不区分大小写的排序规则(如果在三元数据上可能的话)是否有意义?

+0

可能的重复[如何编写SPARQL查询,高效地匹配字符串文字,而忽略大小写](http://stackoverflow.com/questions/10660030/how-to-write-sparql-query-that-efficiently-matches-字符串文字,同时忽略) – 2014-12-02 22:21:35

回答

5

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

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

Based on the answer to another question

编辑:我问史蒂夫巴克斯顿,MarkLogic的PM的语义特点,他建议这样的:

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:存储是一个MarkLogic 8(现已通过Early Access)函数,选择一组三元组。然后SPARQL查询运行在缩减集上,限制需要过滤的三元组的数量。

+3

您也可以使用[cts:contains](http://docs.marklogic.com/cts:contains)。字符串查询(第二参数)被强制为[cts:word-query](http://docs.marklogic.com/cts:word-query),对于小写字符串不区分大小写。 – joemfb 2014-12-02 19:49:19

+1

@joemfb好的建议,尽管应该指出那些是不属于SPARQL标准的产品特定的扩展,因此使用它们的查询将不能移植到其他SPARQL存储。 – 2014-12-02 21:56:36

+0

加上一个,因为这是一个很好的解决方案。减去一个,因为如果它基于另一个答案,那么很可能你应该把这个问题标记为重复。关于重复问题没有任何问题,最好有一个规范的答案,而不是围绕着很多非常类似的问题。 – 2014-12-02 22:23:45

相关问题