В порядке возрастания результатов в sparql с использованием неотрицательных целых чисел, которые приходят в виде строк - PullRequest
2 голосов
/ 28 марта 2019

У меня есть более 2000 ресурсов в моем тройном хранилище (GraphDB), которые я хотел бы отсортировать в порядке возрастания на основе их IRI, тогда как IRI выглядит следующим образом:

http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#3
...
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2345

На моем графике все вышеупомянутые IRI связаны с одним ресурсом с помощью "DE6: complex_Data_Type_has_Member". Чтобы получить все вышеупомянутые IRI, я делаю следующее:

PREFIX DE6: <http://DE6/DINEN61360#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?IRIs_to_Sort WHERE{
         ?Array a DE6:Data_Element;
         DE6:complex_Data_Type_has_Member ?IRIs_to_Sort .


} ORDER BY ?IRIs_to_Sort 

Если я просто использую модификатор последовательности решения "ORDER BY? IRIs_to_Sort", где, как показано в https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#modOrderBy

тогда я получаю следующий результат (показаны только первые десять результатов):

http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#10
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#100
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1000
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1001
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1002
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1003
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1004
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1005
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1006
...
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1999
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#20
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#200
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2000
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2001
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2002
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2003
...

Вместо этого я бы ожидал что-то вроде:

http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#1
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#3
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#4
...
http://TABLE/240b9f63-66b9-47f1-9e02-bfd03794bbd9#2099

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 28 марта 2019

IRI обрабатываются как лексические значения для ORDER BY, что означает, что числа в ваших фрагментах идентифицируются как текст, и они не рассматриваются отдельно.

Полный ORDER BY, который, я думаю, будет работать для вас, независимо от того, включает ли ваш результирующий набор один или несколько IRI с одним или несколькими фраг-идентификаторами каждый, но , только если все фраг-идентификаторы являются числовыми , будет -

ORDER BY ( xsd:string ( STRBEFORE ( STR ( ?IRIs_to_Sort ), "#" ) ) )
         ( xsd:long ( STRAFTER ( STR ( ?IRIs_to_Sort ), "#" ) ) ) 

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

...