Форматирование целочисленных значений в SPARQL

У меня есть несколько целочисленных значений в объектной части троек RDF, например:

subject predicate object
  :a1    :d1       2017
  :a2    :d1     201601
  :a3    :d1     20170510

Мне нужно выяснить, больше ли значение объекта субъекта :a1, чем значение объекта :a2, а значение объекта :a2 больше, чем значение объекта :a3, или нет, через SPARQL. Однако перед написанием этого запроса мне нужно сделать все значения объекта восьмизначными, добавив дополнительные нули в правую часть значения, как показано ниже:

subject predicate  object
  :a1    :d1      20170000
  :a2    :d1      20160100
  :a3    :d1      20170510

Не могли бы вы сообщить мне, как преобразовать значения объектов в восьмизначное целое число в SPARQL? Спасибо.


person Beautiful Mind    schedule 06.12.2017    source источник
comment
Хакерская комбинация функций, касающихся длины строки и конкатенации строк, должна работать.   -  person UninformedUser    schedule 06.12.2017
comment
Мне нужно целое число в качестве вывода, а не строка.   -  person Beautiful Mind    schedule 06.12.2017
comment
Я понимаю это, но вам нужно количество цифр n, которое можно сделать, используя длину строки литерала. После этого вы можете либо умножить на 10^n, либо добавить n умноженное на 0.   -  person UninformedUser    schedule 06.12.2017
comment
И, кстати, вы можете создать целое число из строки с помощью конструктора XPath.   -  person UninformedUser    schedule 06.12.2017
comment
Не могли бы вы предоставить мне пример кода? Спасибо большое за вашу помощь.   -  person Beautiful Mind    schedule 06.12.2017
comment
Я все еще не уверен, возможно, отсутствуют некоторые математические операции. Почему бы вам не провести сравнение по лексической форме целочисленного значения? order by desc(str(?value)) закажет правильно   -  person UninformedUser    schedule 06.12.2017
comment
И, возможно, afn:sprintf.   -  person Stanislav Kralin    schedule 06.12.2017
comment
Если вы используете Jena, начните с BIND(STRLEN(STR(?value)) as ?numDigits), а затем используйте некоторые встроенные математические функции.   -  person UninformedUser    schedule 06.12.2017
comment
Поехали: prefix : <http://ex.org/> prefix math: <http://www.w3.org/2005/xpath-functions/math#> select * { ?s :d ?v . BIND(STRLEN(STR(?v)) as ?n) BIND((?v * math:pow(10, 8 - ?n)) AS ?vext ) } order by desc(str(?v))   -  person UninformedUser    schedule 06.12.2017
comment
Спасибо. Я использую тройной магазин Virtuoso. Это дает мне следующую ошибку: Virtuoso 42001 Error SR185: Undefined procedure DB.DBA.http://www.w3.org/2005/xpath-functions/math#pow.   -  person Beautiful Mind    schedule 06.12.2017
comment
Вместо вашего второго BIND я добавил следующий код: BIND (IF(?n=6, ?v*100, IF(?n=4, ?v*10000, ?v) ) AS ?vext). Он работает для большинства целочисленных значений. Однако для некоторых восьмизначных значений он добавляет дополнительные нули, например: 2016040100. Вы знаете, почему это так?   -  person Beautiful Mind    schedule 07.12.2017
comment
Они очень похожи на строки даты. Интересно, почему вы их так не сравниваете? Кроме того, вы говорите, что ваши данные находятся в Virtuoso, но ваш вопрос помечен тегами sparqlwrapper и jena. Что из этого правильное? Более высокая точность с вашей стороны значительно увеличит ваши шансы на получение полезных ответов.   -  person TallTed    schedule 07.12.2017
comment
Кроме того, часто бывает полезно указать вашу фактическую цель, а также то, что вы считаете лучшим путем и почему ... как хорошо, что вы пробовали, и насколько хорошо (или плохо) это сработало.   -  person TallTed    schedule 07.12.2017
comment
@SMShamimulHasan, вы также можете попробовать этот запрос.   -  person Stanislav Kralin    schedule 07.12.2017
comment
Если число слишком короткое, добавьте 0000000, а затем обрежьте до нужной длины. Остерегайтесь слишком длинных чисел.   -  person AndyS    schedule 07.12.2017


Ответы (1)


Вы можете использовать следующее, я не знаю, есть ли в SPARQL функция PAD

SELECT xsd:integer(substr(concat(str(?o),"00000000"),1,8))
person Abdelmonem Mahmoud Amer    schedule 14.04.2018