我试图了解如何最好地处理Marklogic SPARQL数据中的文字,这在任何情况下都是如此。我希望能够进行不区分大小写的搜索,但我相信语义查询是不可能的。我想要一个简单的例子:
SELECT *
WHERE { ?s ?p "Red"}
和
SELECT *
WHERE { ?s ?p "red"}
返回所有值,无论对象是"红色"," RED","红色"或者" rED"。
我的数据来自另一个具有可变大写规则的来源。目前我唯一能想到的是添加一个额外的三元组,它总是包含小写的文本,所以我总是可以搜索该值。或者,使用不区分大小写的排序规则在MarkLogic中创建一些新的范围查询是否有意义(如果三重数据可能的话)?
答案 0 :(得分:7)
您可以使用忽略大小写的过滤器。
select * where {
?s ?p ?o
FILTER (lcase(str(?o)) = "red")
}
Based on the answer to another question。
编辑:我问过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查询在简化集上运行,限制需要过滤的三元组数。