On 03/06/13 21:51, Remo Liechti wrote:
Hi guys,
I want to query the number of runways per airport. So ZRH should have 3
runways, Basel 1 of them.
I use this query:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fh: <http://swt.ffhs.ch <http://swt.ffhs.ch/>>
SELECT ?name (COUNT(?r) as ?runways)
WHERE {
?a rdf:type fh:airport.
?a fh:name ?name.
?r rdf:type fh:runway.
}
group by ?name
Which results in 4 runways per airport, which is apparently not what I
was looking for. How can I make a relation between airport and runways?
I thought the collection takes care of that?
?r rdf:type fh:runway.
isn't connected (by variables of the same name) to anything else in your
query. You need to connect airport to runway. fh:Runways does this ...
to a list of runways.
The idiom for getting at the members of a list is:
?list rdf:rest*/rdf:first ?member .
It's worth dumping your data in N-Triples to see the triples structure -
lists are encoded as triples.
Combining all this:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fh: <http://swt.ffhs.ch>
SELECT ?name (COUNT(?rw) as ?runways)
WHERE {
?a rdf:type fh:airport.
?a fh:name ?name.
?a fh:Runways ?listRW .
?listRW rdf:rest*/rdf:first ?rw .
}
GROUP BY ?name
which gives me:
--------------------------------
| name | runways |
================================
| "Flughafen Basel" | 1 |
| "Flughafen Zürich" | 3 |
--------------------------------
(using Apache Jena)
Andy