- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Tue, 04 Jun 2013 15:45:18 +0100
- To: public-sparql-dev@w3.org
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
Received on Tuesday, 4 June 2013 14:45:54 UTC