El objetivo de la práctica es realizar un pequeño ejemplo que explote las posibilidades de la web semántica en prolog.
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.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'*/
Se trata de construir un recomendador de artistas que explote las etiquetas de las grabaciones (Record) de los artistas:
mo:MusicArtist
, mo:Record
, mo:Track
, ....)
para evitar trabajar directamente cpon con los predicados de acceso
rdf(S,P,V)
.
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]
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
.
jamendo_mini.rdf
).
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
.
gn:parentCountry
.
http://sws.geonames.org/2759794/
una URL
donde obtener un RDF con la descripción completa del recurso
con URI http://sws.geonames.org/2759794/about.rdf
.
rdf_load
y extraer el código de país de la
propiedad gn:countryCode
(requiere habilitar
previamente el módulo de acceso on-line a fuentes RDF
use_module(library(semweb/rdf_http_plugin))
.)
FROM
que se use
como fuente de tupla la URI del RDF vinculado al
recurso.
gn:neighbouringFeatures
o en una
URL del tipo http://sws.geonames.org/3017382/neighbours.rdf
.
artista_similar(Artista1,Artista2,Coeficiente,Similitud)
y
recomendar(Artista,Coeficiente,Umbral,ListaArtistas)
: hasta 75%
recomendar_pais(Artista,Coeficiente,Umbral,ListaArtistas)
: hasta 25%