Sparql - Сортировать по, чтобы возвращать пустые значения последними

Я использую AllegroGraph и Sparql 1.1.

Мне нужно сделать сортировку по столбцу по возрастанию и сделать запрос Sparql, чтобы вернуть пустые значения в последнюю очередь.

Пример данных:

<http://mydomain.com/person1> <http://mydomain.com/name> "John"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>
<http://mydomain.com/person1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person>

<http://mydomain.com/person2> <http://mydomain.com/name> "Abraham"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral>
<http://mydomain.com/person2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person>

<http://mydomain.com/person3> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person>

Здесь мне нужно, чтобы Sparql возвратил Авраама, а затем Джона и person3, у которых нет атрибута имени.

Запрос я использую:

select ?name ?person {
  ?person <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person>.
  optional {?person  <http://mydomain.com/name> ?name.}
  } order by asc(?name )

Текущий результат - персона 3 (ноль), за ним следуют Авраам и Иоанн.введите описание изображения здесьПожалуйста, поделись своими мыслями.

1 ответ

Решение

У меня под рукой нет AllegroGraph, но AFAIK поддерживает несколько условий заказа:

select ?name ?person {
  ?person <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://mydomain.com/person> .
  optional {?person  <http://mydomain.com/name> ?name . }
} order by (!bound(?name)) asc(str(?name))

Первые условия сортировки в зависимости от того ?name связан или нет, и если это условие не находит разницы, используется второе условие. Обратите внимание на использование str() преобразовать rdf:XMLLiteral к типу данных, для которого поддерживается сравнение.

(Вы также можете добавить . в конце каждой строки в ваших данных ntriples.)

Другие вопросы по тегам