XQuery/DBpedia with SPARQL - Stadium locations
< XQuery
At the risk of being repetitious, here is another script which mashes up data from DBpedia with GoogleMaps, this time to show the location of all venues in a supplied Wikipedia Category of venues.
Examples
editFootball Venues in England
editFootball Venues in Scotland
edit
Script
edit(:
This accepts a category of stadiums and generates a kml map of all stadiums
:)
declare namespace r = "http://www.w3.org/2005/sparql-results#";
declare variable $query := "
PREFIX p: <http://dbpedia.org/property/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE
{?ground skos:subject <http://dbpedia.org/resource/Category:Football_venues_in_England>.
?ground geo:long ?long.
?ground geo:lat ?lat.
?ground rdfs:label ?groundname.
OPTIONAL {?ground foaf:depiction ?image .}.
OPTIONAL {?club p:ground ?ground. ?club rdfs:label ?clubname . FILTER (lang(?clubname) = 'en')}.
OPTIONAL {?ground foaf:page ?wiki.}.
FILTER (lang(?groundname) ='en').
}
";
declare function local:execute-sparql($query as xs:string) {
let $sparql := concat("http://dbpedia.org/sparql?format=xml&default-graph-uri=http://dbpedia.org&query=",
encode-for-uri($query)
)
return doc($sparql)
};
declare function local:sparql-to-tuples($rdfxml) {
for $result in $rdfxml//r:result
return
<tuple>
{ for $binding in $result/r:binding
return
if ($binding/r:uri)
then element {$binding/@name} {
attribute type {"uri"} ,
string($binding/r:uri)
}
else element {$binding/@name} {
attribute type {$binding/@datatype},
string($binding/r:literal)
}
}
</tuple>
};
declare option exist:serialize "method=xhtml media-type=application/vnd.google-earth.kml+xml highlight-matches=none";
let $category := request:get-parameter("category","Football_venues_in_England")
let $queryx := replace($query,"Football_venues_in_England",$category)
let $result:= local:execute-sparql($queryx)
let $tuples := local:sparql-to-tuples($result)
let $x := response:set-header('Content-disposition','Content-disposition: inline;filename=stadiums.kml;')
return
<Document>
<name>{replace($category,"_"," ")}</name>
<Style id="stadium">
<IconStyle>
<Icon><href>http://maps.google.com/mapfiles/kml/shapes/ranger_station.png</href>
</Icon>
</IconStyle>
</Style>
{
for $groundid in distinct-values($tuples/ground)
let $groundTuples := $tuples[ground=$groundid]
let $ground := $groundTuples [1]
let $name := string($ground/groundname)
let $lat := xs:decimal($ground/lat)
let $long := xs:decimal($ground/long)
let $clubs := string-join($groundTuples/clubname,", ")
let $wiki := string($ground/wiki)
let $description :=
<div>
Ground of {$clubs}
{if ($ground/image) then (<br/>,<img src="{$ground/image}"/>) else () }
<br/>
<a href='{$groundid}'>DBpedia</a>
<a href='{$wiki}'>Wikipedia</a>
<a href="http://images.google.co.uk/images?q=stadium+{$name}">Google Images</a>
</div>
return
<Placemark>
<name>{$name}</name>
<description>
{util:serialize($description,"method=xhtml")}
</description>
<Point>
<coordinates>{concat($long, ",",$lat,",0")}</coordinates>
</Point>
<styleUrl>#stadium</styleUrl>
</Placemark>
}
</Document>