Propuesta de actividades y ejemplos valiosos: 1. Consultas sobre Dbpedia: • Pruebe las siguientes consultas sobre Dbpedia. Preferentemente en http://dbpedia.org/sparql o bien en http://dbpedia.org/snorql . • Trate de comprender porqué se han obtenido esos resultados, a la vista de la sintaxis de las consultas • Ensaye o práctique con ligeras modificaciones. 2. Esta query muestra cómo manejar uniones (parciales), así como un filtro entre un rango de fechas: “Personas que murieron de alguna enfermedad en Estados Unidos y España en el siglo XX”: PREFIX dbpedia2: <http://dbpedia.org/property/> PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> PREFIX : <http://dbpedia.org/resource/> SELECT ?disease ?person ?deathDate WHERE { ?disease a dbpedia-owl:Disease . ?person a dbpedia-owl:Person ; dbpedia2:deathCause ?disease; dbpedia2:deathDate ?deathDate . { ?person dbpedia-owl:deathPlace :United_States . } UNION { ?person dbpedia-owl:deathPlace :Spain . } FILTER ( ?deathDate >= "1900-01-01"^^xsd:date && ?deathDate <= "2000-01-01"^^xsd:date ) . } ORDER BY DESC(?disease) Si se quiere, esta query se puede concretar más para mostrar, por ejemplo, a la gente que ha muerto de un accidente cerebro-vascular en el último siglo, de la siguiente manera: PREFIX dbpedia2: <http://dbpedia.org/property/> PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> PREFIX : <http://dbpedia.org/resource/> SELECT ?person ?deathDate WHERE { ?person a dbpedia-owl:Person ; dbpedia2:deathCause :Stroke; dbpedia2:deathDate ?deathDate . { ?person dbpedia-owl:deathPlace :United_States . } UNION { ?person dbpedia-owl:deathPlace :Spain . } FILTER ( ?deathDate >= "1900-01-01"^^xsd:date && ?deathDate <= "2000-01-01"^^xsd:date ) . } 3. La siguiente query muestra el manejo de la cláusula OPTIONAL, es decir, datos que podrían no estar presentes: “Lista de personas que consiguieron algún tipo de premio nobel, mostrando su nacionalidad y tipo de premio”. Al igual que la query anterior, se podría refinar aún más para sacar, por ejemplo, sólo los premios nobeles en física. PREFIX dbpedia2: <http://dbpedia.org/property/> PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> PREFIX : <http://dbpedia.org/resource/> SELECT ?persona ?nacionalidad ?nombrePremio WHERE { ?persona a dbpedia-owl:Person . ?persona dbpedia-owl:award ?premio . ?premio dcterms:subject <http://dbpedia.org/resource/Category:Nobel_Prize> ; dbpedia2:name ?nombrePremio . OPTIONAL { ?persona dbpedia2:nationality ?nacionalidad . } OPTIONAL { ?persona dbpedia-owl:nationality ?nacionalidad . } FILTER ( lang(?nombrePremio) = "en" ) FILTER (regex(?nombrePremio, "Nobel", "i")) } 3. Esta query muestra alguna de las funciones que se pueden emplear para el manejo de fechas, como es la función year(), que extrae el año de una fecha dada, o la función now() que devuelve la fecha actual del sistema: “Volcanes activos que han entrado en erupción en los últimos 10 años”. También podemos ver el uso de la función datatype(), muy útil para averiguar el tipo de dato de cierta propiedad. PREFIX dbpedia2: <http://dbpedia.org/property/> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT ?volcan ?lastEruptionYear WHERE { ?volcan dcterms:subject <http://dbpedia.org/resource/Category:Active_volcanoes> . ?volcan dbpedia2:lastEruption ?lastEruptionYear . FILTER ( datatype(?lastEruptionYear ) = xsd:int && ?lastEruptionYear >= (year(now())-10) && ?lastEruptionYear <= year(now()) ) } 4. La siguiente query nos muestra los sitios que contiene la wikipedia que están a un radio de 2km de la Puerta del Sol de Madrid: “Sitios cercanos a un lugar dado”. Es totalmente válida si, en vez de proporcionar el lugar, proporcionamos unas coordenadas gps. En la query se muestra comentada la primera opción, utilizándose, por tanto, la opción de poner las coordenadas gps directamente. También se podría cambiar el radio de búsqueda, quizá para restringir más la búsqueda, a sólo 1km cambiando su valor por 0.01. Además, se muestra el uso de la cláusula BIND(), muy útil para asignar valores a variables de sparql, así como el uso de LIMIT para limitar los resultados de la búsqueda a un número dado. En conjunción con la cláusla OFFSET se podría hacer una paginación de los resultados. PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> SELECT ?lugar ?lat ?long WHERE { ?lugar a dbpedia-owl:Place . ?lugar geo:lat ?lat . ?lugar geo:long ?long . #:Puerta_del_Sol geo:lat ?miLat . #:Puerta_del_Sol geo:long ?miLong . BIND(-3.703347 as ?miLong) . BIND(40.41713 as ?miLat) . BIND(0.02 as ?radio) . FILTER(xsd:double(?lat) - xsd:double(?miLat) <= ?radio && xsd:double(?miLat) - xsd:double(?lat) <= ?radio && xsd:double(?long) - xsd:double(?miLong) <= ?radio && xsd:double(?miLong) - xsd:double(?long) <= ?radio ) } LIMIT 20 5. Con la siguiente query se pretende enseñar el funcionamiento de otro tipo de consultas a dbpedia: “Pregunta a dbpedia sobre si el PIB en Estados Unidos es mayor que el de España”. Este tipo de consultas nos van a devolver sólo true o false, dependiendo de si se cumple o no la condición de búsqueda. PREFIX : <http://dbpedia.org/resource/> PREFIX dbpedia2: <http://dbpedia.org/property/> ASK WHERE { :United_States dbpedia2:gdpNominal ?gdpUS ; dbpedia2:gdpNominalYear ?gdpUSYear . :Spain dbpedia2:gdpNominal ?gdpS ; dbpedia2:gdpNominalYear ?gdpSYear . FILTER ( ?gdpUSYear = ?gdpSYear && xsd:float(?gdpUS) > xsd:float(?gdpS) ) } 6. Con esta query se pretende mostrar el uso de las funciones de agregado para poder agrupar por categorías, contar los resultados, etc.: “Clases de animales contenidas en la wikipedia ordenadas por número de familias diferentes”. PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> SELECT ?clase COUNT(?sujeto) as ?numero WHERE { ?sujeto a dbpedia-owl:Animal . ?sujeto dbpedia-owl:class ?clase . } GROUP BY ?clase HAVING COUNT(?sujeto) > 100 ORDER BY DESC(?numero)