XQuery/DBpedia with SPARQL - Stadium locations

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.

ExamplesEdit

Football Venues in EnglandEdit

Football Venues in ScotlandEdit


ScriptEdit

(: 
     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&amp;default-graph-uri=http://dbpedia.org&amp;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>
Last modified on 29 July 2009, at 15:18