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.)