8

Lets say I have a predicate like 'age' where the values of all age triples are integer literals. What SPARQL query would return the subject with the highest age in the data?

Alb
  • 3,601
  • 6
  • 33
  • 38

2 Answers2

11

You just need to do order by desc with the age predicate and then limit to just get the first one.

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

See the semantics of order by in SPARQL here

With the next version of SPARQL , 1.1, that is already supported in some systems you can use function aggregates and do ..

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

This is not supported in all triple stores currently.

slartidan
  • 20,403
  • 15
  • 83
  • 131
Manuel Salvadores
  • 16,287
  • 5
  • 37
  • 56
  • thanks, I was hoping there was a better way than just limiting the results from a more general query but I guess I'll have to wait until 1.1. for that :) – Alb Jan 28 '11 at 22:34
5

In addition to Manuel's queries you may need to use xsd:integer to force values to be cast to integer if your data has some invalid/dodgy values:

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

Depending on your data you may need to add this into his second SPARQL 1.1 query as well.

RobV
  • 28,022
  • 11
  • 77
  • 119