Tutorial - Interaccionando con la Web Semántica

Guión del Ejercicio

Paso 1. Pasar CSV libros a RDF

Servicio Web para pasar CSV a RDF:

http://rhizomik-gae.appspot.com/rdf123

Hoja de cálculo con libros en formato CSV:

http://spreadsheets.google.com/pub?key=0AgG7pjGeDor0cGpteXU4aklnR3RGY1UyUktZSWVkRmc&output=csv

Reglas mapeo CSV a RDF:

@prefix tut:  <http://rhizomik.net/tutorialWebSem#>.
<Ex:tut+$1>    a    tut:Libro;
      tut:isbn     'Ex:$1';
      tut:titulo   'Ex:$2';
      tut:valoracion    'Ex:$3'. 

Crear objeto URL que llama al servicio (java.net.URL). Cuidado con caracteres especiales, utilizar URL.encode().

Invocar servicio leyendo URL y guardando en Modelo RDF:

modelo.read(url.toExternalForm())

Paso 2. Enriquecer las descripciones de libros

Consulta para listar ISBNs de los libros cargados:

prefix tut:  <http://rhizomik.net/tutorialWebSem#>
SELECT ?isbn WHERE { ?b tut:isbn ?isbn }

Lanzar consulta:

Query consulta = QueryFactory.create(sparql);
QueryExecution qexec = QueryExecutionFactory.create(consulta, modelo);
ResultSet resultados = qexec.execSelect();

Recorrer resultados y obtener la variable "isbn":

while (resultados.hasNext())
{
    String isbn = resultados.next().get("isbn").toString();
    ... //Cargar metadatos para ISBN desde RDF Amazon
}

Servicio RDF desde Amazon para libro por ISBN:

 

Paso 3. Definir equivalencias entre descripciones de libros

Dos descripciones se refieren al mismo si tienen el mismo ISBN:

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix tut:  <http://rhizomik.net/tutorialWebSem#>
prefix dc: <http://purl.org/dc/elements/1.1/>
CONSTRUCT { ?b1 owl:sameAs ?b2 }
WHERE {
    ?b1 tut:isbn ?isbn1.
    ?b2 dc:identifier ?isbn2.
    FILTER(?isbn1 = ?isbn2)  }

Ejecutar CONSTRUCT y guardar resultado:

...
Model modeloEquivalencias = qexec.execConstruct();
modelo.add(modeloEquivalencias);

Paso 4. Mezclar la descripciones de mismos libros

Razonador lógico interpreta equivalencia entre descripciones de libros:

Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
InfModel modeloInferencia = ModelFactory.createInfModel(reasoner, modelo);

Una vez que el razonador a interpretado equivalencias, preguntar por la descripción de cada libro:

... //Consulta SELECT de las cosas de tipo libro en el modelo, ejecutarla

... //Para cada libro
            Query describe = QueryFactory.create("DESCRIBE <"+libro+">");
            qexec = QueryExecutionFactory.create(describe, modeloInferencia);
            Model descripcionLibro = qexec.execDescribe();
            smooshed.add(descripcionLibro);