Сторнирование строки в SPARQL - PullRequest
0 голосов
/ 12 июня 2019

Можно ли перевернуть строку в SPARQL, например, "abc" становится "cba".Кроме того, можно ли сортировать на основе строк в обратном порядке.

Меня особенно интересует решение, которое будет работать на Сервис запросов Wikidata .

Ответы [ 4 ]

6 голосов
/ 13 июня 2019

Ну, вы спросили, возможно ли это возможно , а не практично ли ...

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

Прямая ссылка

Подход похож на ответ в ответе Финна, но он работает для строк длиной до 1000 символов.Это будет использоваться как подзапрос в большем запросе.Агрегаты, такие как group_concat, не гарантируют определенный порядок, поэтому этот запрос основывается на порядке, зависящем от реализации, используемом Blazegraph, и может смешивать строку в другой реализации.

Если в прецеденте используется сортировка по последним символам строки в обратном порядке, то это можно изменить, чтобы гарантировать включение последних n символов строки.

2 голосов
/ 14 июня 2019

Вот запрос, нацеленный на 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) 
     }

Страница результатов Live Query .

2 голосов
/ 13 июня 2019

Эта патологическая реализация , очевидно, работает (до определенной длины строки, здесь 12) в Blazegraph / Wikidata Query Service:

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)
}
2 голосов
/ 12 июня 2019

В SPARQL 1.1 .

нет функции "обратная строка". Не существует модификатора ORDER BY , который доставляет искомый заказ.

Многие, если не большинство языков программирования и сценариев, имеют методы "обратной строки" и "сортировки", поэтому я бы посоветовал выяснить, есть ли в вашей (неназванной) среде разработки такой.

...