lunes, 1 de febrero de 2010

C-SPARQL: Lenguaje de consulta a documentos RDF y RDFS

Dentro de la asignatura web semantica del master ISIA, en el trabajo realizado habia un apartado de consultas SPARQL. No había mucha informacion en la web, por lo que os expongo lo que he hecho para el trabajo por si os puede ser de utilidad.
Para el trabajo se proponía el Pyrrho, pero este no admite documentos RDF y había que introducirlo como tripletas, algo que me negaba a hacer porque no habia conversor que lo realizase, asi que para las consultas use el Virtuoso SPARQL que esta disponible en la web bajo esta direccion.
Tiene el problema que no te admite el RDF o RDFS en disco local y hay que colocarlo en alguna direccion web. Yo lo solvente con el Ironwall webserver poniendo un enlace a una carpeta local. Tiene problemas con el refresco de datos, asi que si modificais el archivo durante las consultas, debereis renombrarlo y hacer las consultas al renombrado.

Se hizo una primera versión usando varios RDFs. Se estuvieron aplicando consultas usando la sentencia GRAPH, pero se observó y considero que usar un RDF solamente era algo posible y aconsejable debido a la simplicidad del mismo. Una de las consultas que se usaron con GRAPH fue la siguiente:



prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix FEDERACION:<http://www.ejemplo.es/masterisia/FEDERACIONES#>

prefix CLUB:<http://www.ejemplo.es/masterisia/CLUBES#>

select ?NOMBRE ?DIRECCION ?TELEFONO ?FEDERACION

from <http://87.111.61.147:2508/rdf8.rdf>

where

  {

  GRAPH <http://87.111.61.147:2508/rdf8.rdf>

    {

    ?ID2 rdf:type FEDERACION:IDFEDERACION.

    ?ID2 FEDERACION:IDFEDERACION ?ID3.

    ?ID2 FEDERACION:NOMBRE ?FEDERACION.

    }

  GRAPH <http://87.111.61.147:2508/rdf9.rdf>

    {

    ?ID rdf:type CLUB:IDCLUB.

    ?ID CLUB:NOMBRE ?NOMBRE.

    ?ID CLUB:DIRECCION ?DIRECCION.

    ?ID CLUB:TELEFONO ?TELEFONO.

    ?ID CLUB:FEDERACION ?ID3.

    }

  }



Y estas son las consultas que use con uniones, filtros y composiciones.


-Seleccionar la lista de todas las Federaciones.

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix FEDERACIONES:<http://www.ejemplo.es/masterisia/FEDERACIONES#>

select ?IDFEDERACION ?NOMBRE ?DIRECCION ?TELEFONO

from <http://87.111.61.132:2508/trabajo1.rdf>

where

  {

  ?ID rdf:type FEDERACIONES:FEDERACION .

  ?ID FEDERACIONES:IDFEDERACION ?IDFEDERACION.

  ?ID FEDERACIONES:NOMBRE ?NOMBRE.

  ?ID FEDERACIONES:DIRECCION ?DIRECCION.

  ?ID FEDERACIONES:TELEFONO ?TELEFONO.

  }

order by asc(?NOMBRE)



-Seleccionar la lista de clubes, indicando el nombre de la Federacion a la que pertenecen.

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix FEDERACIONES:<http://www.ejemplo.es/masterisia/FEDERACIONES#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

select ?CLUB ?DIRECCION ?TELEFONO ?FEDERACION

from <http://87.111.61.132:2508/trabajo1.rdf>

where

  {

  ?ID rdf:type CLUBES:CLUB.

  ?ID CLUBES:NOMBRE ?CLUB.

  ?ID CLUBES:DIRECCION ?DIRECCION.

  ?ID CLUBES:TELEFONO ?TELEFONO.

  ?ID CLUBES:FEDERACION ?ID2.

  ?ID3 rdf:type FEDERACIONES:FEDERACION.

  ?ID3 FEDERACIONES:IDFEDERACION ?ID2.

  ?ID3 FEDERACIONES:NOMBRE ?FEDERACION.

  }

order by ASC(?CLUB)



-Seleccionar los trofeos que tienen cada club:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix TROFEOS:<http://www.ejemplo.es/masterisia/TROFEOS#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

select ?CLUB ?TROFEO ?FECHA

from <http://87.111.61.143:2508/trabajo1.rdf>

where

  {

  ?ID rdf:type CLUBES:CLUB.

  ?ID CLUBES:NOMBRE ?CLUB.

  ?ID CLUBES:IDCLUB ?ID2.

  ?ID3 rdf:type TROFEOS:TROFEO.

  ?ID3 TROFEOS:CLUB ?ID2.

  ?ID3 TROFEOS:NOMBRE ?TROFEO.

  ?ID3 TROFEOS:FECHA ?FECHA.

  }

Order by asc(?CLUB)



-Seleccionar la lista de atletas, indicando cuales son los datos personales (nombre y apellidos) de sus respectivos entrenadores:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix ATLETAS:<http://www.ejemplo.es/masterisia/ATLETAS#>

prefix ENTRENADORES:<http://www.ejemplo.es/masterisia/ENTRENADORES#>

select ?IDATLETA ?MIEMBRO ?NOMBRE ?APELLIDOS ?ALTURA ?PESO ?ENTRENADOR ?NOMENT ?APEENT

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type ATLETAS:ATLETA.

  ?ID ATLETAS:IDATLETA ?IDATLETA.

  ?ID ATLETAS:MIEMBRO ?MIEMBRO.

  ?ID ATLETAS:ALTURA ?ALTURA.

  ?ID ATLETAS:PESO ?PESO.

  ?ID ATLETAS:ENTRENADOR ?ENTRENADOR.

  ?ID2 rdf:type MIEMBROS:MIEMBRO.

  ?ID2 MIEMBROS:IDMIEMBRO ?MIEMBRO.

  ?ID2 MIEMBROS:NOMBRE ?NOMBRE.

  ?ID2 MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID3 rdf:type ENTRENADORES:ENTRENADOR.

  ?ID3 ENTRENADORES:IDENTRENADOR ?ENTRENADOR.

  ?ID3 ENTRENADORES:MIEMBRO ?M2.

  ?ID4 rdf:type MIEMBROS:MIEMBRO.

  ?ID4 MIEMBROS:IDMIEMBRO ?M2.

  ?ID4 MIEMBROS:NOMBRE ?NOMENT.

  ?ID4 MIEMBROS:APELLIDOS ?APEENT.

  }

ORDER BY ASC(?APELLIDOS)



-Seleccionar y ordenar las marcas de los atletas en 800 m.l.

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix ATLETAS:<http://www.ejemplo.es/masterisia/ATLETAS#>

prefix COMPETICIONES:<http://www.ejemplo.es/masterisia/COMPETICIONES#>

select ?NOMBRE ?APELLIDOS ?FECHA ?PRUEBA ?MARCA

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type ATLETAS:ATLETA.

  ?ID ATLETAS:MIEMBRO ?MIEMBRO.

  ?ID ATLETAS:IDATLETA ?ATL.

  ?ID2 rdf:type MIEMBROS:MIEMBRO.

  ?ID2 MIEMBROS:IDMIEMBRO ?MIEMBRO.

  ?ID2 MIEMBROS:NOMBRE ?NOMBRE.

  ?ID2 MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID3 rdf:type COMPETICIONES:COMPETICION.

  ?ID3 COMPETICIONES:ATLETA ?ATL.

  ?ID3 COMPETICIONES:PRUEBA ?PRUEBA.

  ?ID3 COMPETICIONES:FECHA ?FECHA.

  ?ID3 COMPETICIONES:MARCA ?MARCA.

  FILTER (?PRUEBA="800 M.L.")

  }

ORDER BY ASC(?MARCA)



-Seleccionar los ingresos que tiene cada club (donación de patrocinadores y cuotas de socios):

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

prefix PATROCINADORES:<http://www.ejemplo.es/masterisia/PATROCINADORES#>

prefix SOCIOS:<http://www.ejemplo.es/masterisia/SOCIOS#>

select ?NOMBRE ?APELLIDOS ?CLUB ?INGRESO

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

    {

    ?ID rdf:type MIEMBROS:MIEMBRO.

    ?ID MIEMBROS:IDMIEMBRO ?MIEMBRO.

    ?ID MIEMBROS:NOMBRE ?NOMBRE.

    ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

    ?ID MIEMBROS:CLUB ?IDCLUB.

    ?ID2 rdf:type CLUBES:CLUB.

    ?ID2 CLUBES:IDCLUB ?IDCLUB.

    ?ID2 CLUBES:NOMBRE ?CLUB.

    ?ID3 rdf:type SOCIOS:SOCIO.

    ?ID3 SOCIOS:MIEMBRO ?MIEMBRO.

    ?ID3 SOCIOS:CUOTA ?INGRESO.

    }

  UNION

    {

    ?ID rdf:type MIEMBROS:MIEMBRO.

    ?ID MIEMBROS:IDMIEMBRO ?MIEMBRO.

    ?ID MIEMBROS:NOMBRE ?NOMBRE.

    ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

    ?ID MIEMBROS:CLUB ?IDCLUB.

    ?ID2 rdf:type CLUBES:CLUB.

    ?ID2 CLUBES:IDCLUB ?IDCLUB.

    ?ID2 CLUBES:NOMBRE ?CLUB.

    ?ID3 rdf:type PATROCINADORES:PATROCINADOR.

    ?ID3 PATROCINADORES:MIEMBRO ?MIEMBRO.

    ?ID3 PATROCINADORES:DONACION ?INGRESO.

    }

  }

ORDER BY ASC(?APELLIDOS)



-Seleccionar los miembros extranjeros de cada club

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

select ?NOMBRE ?APELLIDOS ?CLUB ?NACIONALIDAD

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type MIEMBROS:MIEMBRO.

  ?ID MIEMBROS:IDMIEMBRO ?MIEMBRO.

  ?ID MIEMBROS:NOMBRE ?NOMBRE.

  ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID MIEMBROS:CLUB ?IDCLUB.

  ?ID MIEMBROS:NACIONALIDAD ?NACIONALIDAD.

  ?ID2 rdf:type CLUBES:CLUB.

  ?ID2 CLUBES:IDCLUB ?IDCLUB.

  ?ID2 CLUBES:NOMBRE ?CLUB.

  FILTER (?NACIONALIDAD!="ESPANOL")

  }

ORDER BY ASC(?CLUB)



-Seleccionar los jueces que tiene cada Federación en la especialidad de Marcha:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

prefix JUECES:<http://www.ejemplo.es/masterisia/JUECES#>

prefix FEDERACIONES:<http://www.ejemplo.es/masterisia/FEDERACIONES#>

select ?ESPECIALIDAD ?NOMBRE ?APELLIDOS ?FEDERACION

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type MIEMBROS:MIEMBRO.

  ?ID MIEMBROS:IDMIEMBRO ?IDM.

  ?ID MIEMBROS:NOMBRE ?NOMBRE.

  ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID MIEMBROS:CLUB ?IDC.

  ?ID2 rdf:type CLUBES:CLUB.

  ?ID2 CLUBES:IDCLUB ?IDC.

  ?ID2 CLUBES:FEDERACION ?IDF.

  ?ID3 rdf:type FEDERACIONES:FEDERACION.

  ?ID3 FEDERACIONES:IDFEDERACION ?IDF.

  ?ID3 FEDERACIONES:NOMBRE ?FEDERACION.

  ?ID4 rdf:type JUECES:JUEZ.

  ?ID4 JUECES:MIEMBRO ?IDM.

  ?ID4 JUECES:ESPECIALIDAD ?ESPECIALIDAD.

  FILTER (?ESPECIALIDAD="MARCHA")

  }



-Seleccionar los entrenadores con especialidad en Lanzamientos:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix ENTRENADORES:<http://www.ejemplo.es/masterisia/ENTRENADORES#>

select ?ESPECIALIDAD ?NOMBRE ?APELLIDOS

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type MIEMBROS:MIEMBRO.

  ?ID MIEMBROS:IDMIEMBRO ?IDM.

  ?ID MIEMBROS:NOMBRE ?NOMBRE.

  ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID2 rdf:type ENTRENADORES:ENTRENADOR.

  ?ID2 ENTRENADORES:MIEMBRO ?IDM.

  ?ID2 ENTRENADORES:ESPECIALIDAD ?ESPECIALIDAD.

  FILTER (?ESPECIALIDAD="LANZAMIENTOS")

  }



-Seleccionar el nombre y teléfono de los gestores del club Bahía de Málaga:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix MIEMBROS:<http://www.ejemplo.es/masterisia/MIEMBROS#>

prefix GESTORES:<http://www.ejemplo.es/masterisia/GESTORES#>

prefix CLUBES:<http://www.ejemplo.es/masterisia/CLUBES#>

select ?NOMBRE ?APELLIDOS ?TELEFONO

from <http://87.111.61.143:2508/rdf12.rdf>

where

  {

  ?ID rdf:type MIEMBROS:MIEMBRO.

  ?ID MIEMBROS:IDMIEMBRO ?IDM.

  ?ID MIEMBROS:NOMBRE ?NOMBRE.

  ?ID MIEMBROS:APELLIDOS ?APELLIDOS.

  ?ID MIEMBROS:TELEFONO ?TELEFONO.

  ?ID2 rdf:type CLUBES:CLUB.

  ?ID2 CLUBES:NOMBRE ?CLUB.

  ?ID3 rdf:type GESTORES:GESTOR.

  ?ID3 GESTORES:MIEMBRO ?IDM.

  FILTER (?CLUB="BAHIA DE MALAGA")

  }




Para consultar un RDFS (RDF Schema), tambien hay posibilidades. A nosotros nos pidieron que encontraramos la estructura del esquema RDF de un compañero y las consultas que hice para ver las clases, subclases y propiedades fueron las siguientes:

Al no conocer estructura alguna del documento, la consulta inicial fue:


prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix dioses:<http://87.111.61.131:2508/DIOSES.rdfs>

select ?a ?b ?c

from <http://87.111.61.131:2508/DIOSES.rdfs>

where

  {?a ?b ?c  }






Para comprobar las clases se hizo la consulta:

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#>

prefix dioses:<http://87.111.61.131:2508/DIOSES.rdfs>

select ?Clases  

from <http://87.111.61.131:2508/DIOSES.rdfs>

where

  {?Clases rdf:type rdfs:Class   }





Dichas clases se agrupan por subclases, con lo cual hubo que hacer la consulta para poder determinar que relación hay entre ellas.

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#>

prefix dioses:<http://87.111.61.131:2508/DIOSES.rdfs>

select ?Subclase ?Clase  

from <http://87.111.61.131:2508/DIOSES.rdfs>

where

  {?Subclase rdfs:subClassOf ?Clase}

order by ?Clase



Y por último determinar que propiedades pertenecen a cada clase.

prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#>

prefix dioses:<http://87.111.61.131:2508/DIOSES.rdfs>

select ?Propiedad ?Clase  

from <http://87.111.61.131:2508/DIOSES.rdfs>

where

  {?Propiedad rdf:type rdf:Property;

rdfs:domain ?Clase

  }

order by ?Clase





Espero que os sirva para vuestros trabajos

No hay comentarios:

Publicar un comentario