Representación del Conocimiento y Web Semántica

SI 2014/15


Índice General

1 Descripción de la práctica

1.1 Objetivo

El objetivo de la práctica es realizar un pequeño ejemplo que explote las posibilidades de la web semántica en prolog.

1.2 Requisitos previos

En el ejemplo propuesto se hará uso del API de acceso a recursos RDF de SWI-Prolog.

Esta biblioteca requiere una versión de SWI-Prolog 6.4.x o superior.

1.3 Recursos

2 Uso básico del API RDF_DB de swi-Prolog

/* (1.1) Carga de la librería */

use_module(library(semweb/rdf_db)).

/* (1.2) Carga de tuplas RDF */
rdf_load('/home/si2014/Descargas/jamendo-rdf/jamendo.rdf'). 

/* ó */

rdf_load('/home/si2014/Descargas/jamendo-rdf/jamendo_mini.rdf'). 

/* (1.3) Acceso/consulta básico */
rdf(A,B,C).


/* (2.1) Habilitar uso de prefijos en URIs */
use_module(library(semweb/rdf_portray)).

/* (2.2) Definir los prefijos de las tuplas del ejemplo de Jamendo*/
rdf_register_prefix(dc,'http://purl.org/dc/elements/1.1/').
rdf_register_prefix(event,'http://purl.org/NET/c4dm/event.owl#').
rdf_register_prefix(foaf,'http://xmlns.com/foaf/0.1/').
rdf_register_prefix(mo, 'http://purl.org/ontology/mo/').
rdf_register_prefix(tags, 'http://www.holygoat.co.uk/owl/redwood/0.1/tags/').
rdf_register_prefix(time, 'http://www.w3.org/2006/time#').
rdf_register_prefix(tl, 'http://purl.org/NET/c4dm/timeline.owl#').


/* (2.3) Consultas usando prefijos */
rdf(A,rdf:type,mo:'MusicArtist').
rdf('http://dbtune.org/jamendo/artist/336835', B,C).

rdf(A,rdf:type,mo:'Record').
rdf('http://dbtune.org/jamendo/record/13086', B,C).

rdf(A,rdf:type,mo:'MusicArtist'), rdf(A,foaf:made,C), rdf(C,rdf:type,mo:'Record').
rdf(A,rdf:type,mo:'Lyrics'), rdf(A,mo:text,literal(type(_,C))).
rdf(A,tags:taggedWithTag,B), rdf(B,rdf:type,tags:'Tag'), rdf(B,tags:tagName,literal(type(xsd:string,rock))).


/* (3.1) Carga de RDF externo */

use_module(library(semweb/rdf_http_plugin)).

rdf_load('http://sws.geonames.org/2759794/about.rdf').

rdf_register_prefix(gn, 'http://www.geonames.org/ontology#').

rdf('http://sws.geonames.org/2759794/', B, C).


/* (4.1) Consultas SPARQL: más info. en: http://www.swi-prolog.org/pldoc/doc_for?object=section('sec:sparqlclient')  */
use_module(library(semweb/sparql_client)).

sparql_query('PREFIX dcterms: <http://purl.org/dc/terms/> \c
              PREFIX  dbpedia-owl:<http://dbpedia.org/ontology/> \c
              SELECT  ?torero ?cantante \c 
              WHERE {  \c 
                ?torero rdf:type dbpedia-owl:BullFighter . \c 
                ?torero dbpedia-owl:spouse ?cantante . \c 
                ?cantante dcterms:subject <http://es.dbpedia.org/resource/Categoría:Cantantes_de_coplas> \c 
              }', 
              Row,
              [ host('es.dbpedia.org'), path('/sparql/')]).
              
/* (4.2) Creación de tuplas RDF desde consultas SPARQL */

sparql_query('PREFIX dcterms: <http://purl.org/dc/terms/> \c
              PREFIX  dbpedia-owl:<http://dbpedia.org/ontology/> \c
              CONSTRUCT  { ?torero dcterms:subject ?cantante } \c 
              WHERE {  \c 
                ?torero rdf:type dbpedia-owl:BullFighter . \c 
                ?torero dbpedia-owl:spouse ?cantante . \c 
                ?cantante dcterms:subject <http://es.dbpedia.org/resource/Categoría:Cantantes_de_coplas> \c 
              }', 
              RDF,
              [ host('es.dbpedia.org'), path('/sparql/')]).


/* (5.1) Predicados de utilidad
         Construcción de listas a partir de predicados Prolog, ver
         http://www.swi-prolog.org/pldoc/man?section=allsolutions */

findall(G, rdf('http://dbtune.org/jamendo/artist/336835', foaf:made, G), Lista).


/* (5.2) Predicados de utilidad
         Procesamiento "iterativo", ver http://www.swi-prolog.org/pldoc/man?section=forall2 */
         
forall(rdf('http://dbtune.org/jamendo/record/8431',B,C), rdf_assert('http://dbtune.org/jamendo/record/8431',B,C,pepe)).
             /* Extrae todos las tuplas relativas a la URI indicada y las añade a un nuevo grafo ''pepe'' */

rdf(A,B,C,pepe).   /* Acceso a las tuplas del grafo 'pepe'*/

rdf_save('file:///tmp/pepe.rdf', pepe). /* Guarda en disco las tuplas del grafo 'pepe'*/

3 Tareas a realizar

Se trata de construir un recomendador de artistas que explote las etiquetas de las grabaciones (Record) de los artistas:

  1. Un posible punto de partida es construir un conjunto de predicados/funciones de conveniencia que encapsulen las clases principales del volcado RDF de los datos de Jamendo (mo:MusicArtist, mo:Record, mo:Track, ....) para evitar trabajar directamente cpon con los predicados de acceso rdf(S,P,V).

  2. Definir un predicado artista_similar(Artista1,Artista2,Coeficiente,Similitud) que calcule la similitud entre dos artistas (Artista1 y Artista2) empleando el coeficiente de Dice o Jaccard en base a las etiquetas asignadas a sus grabaciones ( mo:Record) [ver ejemplo en similitud paises]

  3. En base al predicado anterior, definir un predicado recomendar(Artista,Coeficiente,Umbral,ListaArtistas) que vincule a un artista Artista una lista de otros artistas (ListaArtistas) con un grado de similitud igual o superior a Umbral.

  4. Opcional: crear un predicado adicional recomendar_pais(Artista,Coeficiente,Umbral,ListaArtistas) que restrinja los artistas similares de ListaArtistas a aquellos que sean del mismo pais, o países vecinos, que Artista.

4 Entrega



Notas al pie

... centro1
No se acepta "no me ha dado tiempo a hacer la práctica antes" como causa de fuerza mayor.


Victor Darriba 2015-02-12