[英]Reversing a string in SPARQL
是否可以在SPARQL中反轉字符串,例如,“ abc”變為“ cba”。 可替代地,可以基於相反的字符串排序。
我對在Wikidata Query Service上可以使用的解決方案特別感興趣。
好吧,您問是否有可能 ,而不是是否可行 ...
SELECT ?s (group_concat(?letter; separator='') AS ?r) {
BIND ("abcdefghijkl" AS ?s)
VALUES ?d1 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?d2 { 0 1 2 3 4 5 6 7 8 9 }
VALUES ?d3 { 0 1 2 3 4 5 6 7 8 9 }
BIND (100 * ?d3 + 10 * ?d2 + ?d1 + 1 AS ?i)
BIND (SUBSTR(?s, ?i, 1) AS ?letter)
}
GROUP BY ?s
該方法與Finn的響應中的方法類似,但適用於長度不超過1000個字符的字符串。 這將用作較大查詢中的子查詢。 諸如group_concat
聚合不保證特定順序,因此此查詢依賴於Blazegraph使用的與實現相關的順序,並且可能使字符串在其他實現上混亂。
如果用例按相反的順序按字符串的最后一個字符排序,則可以對其進行調整,以確保包括字符串的最后n個字符。
SPARQL 1.1中沒有“反向字符串”功能。
沒有提供要查找的ORDER BY
修飾符 。
許多(如果不是大多數的話)編程和腳本語言確實具有“反向字符串”和“排序”方法,因此我建議調查您(未命名)的開發環境是否具有這種方法。
這種病理實現顯然在Blazegraph / Wikidata查詢服務中有效(最多達到特定的字符串長度,此處為12):
SELECT ?s ?r {
BIND("abcdefghijkl" AS ?s)
BIND(CONCAT(SUBSTR(?s, 12, 1), SUBSTR(?s, 11, 1), SUBSTR(?s, 10, 1),
SUBSTR(?s, 9, 1), SUBSTR(?s, 8, 1), SUBSTR(?s, 7, 1),
SUBSTR(?s, 6, 1), SUBSTR(?s, 5, 1), SUBSTR(?s, 4, 1),
SUBSTR(?s, 3, 1), SUBSTR(?s, 2, 1), SUBSTR(?s, 1, 1)) AS ?r)
}
這是一個針對Virtuoso的查詢,通過子查詢提供了所需的解決方案。
SELECT ?str (GROUP_CONCAT(?letter; separator="") AS ?reverse)
WHERE {
{
SELECT ?str ?charAt
WHERE {
VALUES ?str { "abcdefghijk" }
VALUES ?d1 { 0 1 2 3 4 5 6 7 8 9 10 }
BIND(STRLEN(?str) - ?d1 AS ?charAt)
FILTER(?charAt > 0)
}
}
BIND(SUBSTR(?str,?charAt,1) AS ?letter)
}
實時查詢結果頁面 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.