2014-12-02 17 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

相關問題