Как выполнить запрос SPARQL, чтобы найти максимальное значение свойства?

Допустим, у меня есть предикат типа «возраст», где значения всех троек возрастов являются целочисленными литералами. Какой запрос SPARQL вернет субъект с наибольшим возрастом в данных?


person Alb    schedule 28.01.2011    source источник


Ответы (2)


Вам просто нужно сделать order by desc с предикатом возраста, а затем limit, чтобы просто получить первый.

PREFIX ns:    <http://namespace.org/ontology/>
SELECT ?s ?age
WHERE { ?s ns:age ?age }
ORDER BY DESC(?age) LIMIT 1

См. семантику order by в SPARQL здесь

В следующей версии SPARQL, 1.1, которая уже поддерживается в некоторых системах, вы можете использовать агрегаты функций и делать ..

SELECT (max(?age) as ?maxage)
WHERE { ?s ns:age ?age }

В настоящее время это поддерживается не во всех тройных магазинах.

person Manuel Salvadores    schedule 28.01.2011
comment
спасибо, я надеялся, что есть лучший способ, чем просто ограничение результатов более общего запроса, но, думаю, мне придется подождать до 1.1. для этого :) - person Alb; 29.01.2011

В дополнение к запросам Мануэля вам может понадобиться использовать xsd:integer, чтобы принудительно привести значения к целому числу, если ваши данные имеют некоторые недопустимые/хитрые значения:

PREFIX ns:    <http://namespace.org/ontology/>
PREFIX xsd:   <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?age
WHERE { ?s ns:age ?age }
ORDER BY DESC(xsd:integer(?age)) LIMIT 1

В зависимости от ваших данных вам может понадобиться добавить это и во второй запрос SPARQL 1.1.

person RobV    schedule 30.01.2011