0

是否可以在 SPARQL 中反转字符串,例如,“abc”变成“cba”。或者,是否可以根据字符串反向排序。

我对适用于Wikidata Query Service的解决方案特别感兴趣。

4

4 回答 4

7

好吧,你问的是它是否可能,而不是它是否实用......

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 个字符。

于 2019-06-13T08:27:25.167 回答
3

这种病态的实现显然在 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)
}
于 2019-06-12T21:23:22.663 回答
2

SPARQL 1.1中没有“反向字符串”功能。

没有ORDER BY修饰符可以提供您正在寻找的顺序。

许多(如果不是大多数)编程和脚本语言确实具有“反向字符串”和“排序”方法,因此我建议调查您的(未命名的)开发环境是否具有这种方法。

于 2019-06-12T20:21:56.293 回答
2

这是一个针对 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) 
     }

实时查询结果页面

于 2019-06-14T13:07:43.277 回答