Curso integración Web Semántica

Post on 13-Jun-2015

1.955 views 0 download

Transcript of Curso integración Web Semántica

Curso Integración Web Semántica

Jose María Álvarez RodríguezWESO-Universidad de Oviedo

E-mail: josem.alvarez@weso.esWWW: http://josemalvarez.es

Casos Prácticos24 Octubre 2011

Producción

Publicación

Consumo

Producción

SelecciónModelado

EnriquecimientoGeneración

Noménclator 2010 de entidades de población de Asturias

Formato: MSExcelFuente: www.sadei.es

Ejemplo: http://purl.org/weso/nomenclator/

¿Qué dataset vamos a generar?

¿Qué datasetsvamos a reutilizar?

http://datacatalogs.org/

http://sindice.com/

http://ckan.net

¿Qué vocabularios vamos a reutilizar?prefix.cc

namespace lookup for RDF developers

http://prefix.cc

Búsqueda de prefijos para vocabularios y

datasets

RDFSSKOSOWL

¿Qué definiciones necesitamos?

Enriquecimiento

“Linking Open Data cloud diagram, by Richard Cyganiak and Anja Jentzsch. http://lod-cloud.net/”

Servicios

“Linking Open Data cloud diagram, by Richard Cyganiak and Anja Jentzsch. http://lod-cloud.net/”

SPARQL EndpointServicios Web

Generación

ScriptsPrograma+API RDFHerramientas ETLMapeadores a RDF

Receta• Elegir el dataset a RDFizar• Analizar los datos a convertir• Buscar cómo modelar estos datos

• Reutilizar vocabularios + Nuevas definiciones

• Enriquecer• Con qué datasets tengo/debo/quiero

enlazar y qué operación• Servicios de acceso a esos datasets

• Herramientas de generación• Validen los datos generados• Datos estáticos o dinámicos• Provenance …• Descripción del dataset generado

En nuestro caso…

Mi Receta• Noménclator 2010 de Asturias• Formato MSExcel, Códigos, Descripciones

textuales, jerarquía de entidades y datos estadísticos

• SKOS, Dublin Core, SCOVO, Cube+SDMX, Organizations Ontology, FOAF, NUTS, etc.

• DBPedia-SPARQL-Reconciliar• Google Maps API-REST WS-Buscar

• Google Refine+ RDF extension• Valida RDF de salida• Datos estáticos • Provenance, licencia …• Descripción del dataset generado

Objetivo

Linked Data Noménclator Asturias

2010

Desempleo

Estadísticas

Noménclator

Noménclator

Fuente: http://www.sadei.es / ->

Aplicaciones de Consulta -> Noménclator

2010 -> Más datos -> Entidades

Ver fichero: recursos/nomen2010/entidades2010.xls

Análisis del dataset• Códigos

• Concejo+Parroquia+Entidad

• Jerarquía de entidades• Etiquetas para cada

entidad de población (es,ast)

• Datos estadísticos

Modelado de datos(ver más adelante en concreto)

• Códigos +Jerarquía de entidades (taxonomía)+ Etiquetas para cada entidades de población –>

SKOS-XL+DChttp://www.w3.org/TR/skos-reference/skos-xl.html

Estadísticas con The RDF Data Cube vocabulary(sesión 2)

http://publishing-statistical-data.googlecode.com/svn/trunk/specs/src/main/html/c ube.html

Enriquecimiento• DBPedia

• Entidades de población: http://dbpedia.org/page/Allande• Endpoint SPARQL

• Georeferenciación• Google Maps Api• Servicio REST• Basic Geo (WGS84 lat/long) Vocabulary:

http://www.w3.org/2003/01/geo/• NUTS…(a nivel de Comunidad Autónoma)

Herramientas• Google Refine

• http://code.google.com/p/google-refine/• Descomprimir en un directorio• Ver fichero: software/herremientas/google-refine-

2.1-r2136.zip

• RDF extension Google Refine

• http://lab.linkeddata.deri.ie/2010/grefine-rdf-exte nsion/• Ver fichero: software/herremientas/grefine-rdf-

extension-0.5.3• Descomprimir e introducir dentro de “…google-refine-

2.1-r2136\webapp\extensions ”

Extensión Grefine -RDF

Trabajando con Google Refine

Consola de Google Refine

URL Navegador: http://localhost:3333

Crear un proyecto

Nombre de proyecto+

Fichero de Datos

Comprobamos que tenemos la extensión RDF

Preparación de los datos

Cambiamos los nombres de las columnas para referenciarlas

Borramos las primeras filas (no son datos)

Borramos las últimas filas (son datos de la entidad)

Borramos las 3 últimas columnas (repetidas)

Marcamos con Flag las filas a borrar

Seleccionamos Facet

Ordenamos por Flag (true)

Remove All matching rows !!!

Last->Previous ->Flag->Borrar…

Datos “Limpios”

Modelado de datos

• Definir la taxonomía de tipo de entidades con SKOS

• Generar esqueleto RDF para aplicar a cada entidad

… veamos un ejemplo!

…Recordando (principios Linked Data)…

1. Usar URIs para identificar las cosas

2. Usar URIs HTTP

3. Ofrecer información sobre los recursos usando RDF

4. Incluir enlaces a otros URIshttp://www.w3c.es/divulgacion/guiasbreves/LinkedData

…Recordando (referencias)…

1. http://linkeddatabook.com/editions/1.0/

2. http ://www.w3.org/DesignIssues/LinkedData.html

3. http://www.w3.org/TR/swbp -vocab -pub /

4. http://www.w3.org/2009/08/skos-reference/skos.html

Taxonomía de tipo de Entidad de Población

Concejo Parroquia

AldeaLugar

CaseríaVilla

BarrioCiudadPuebloVenta

PobladoUrbanización

Taxonomía de tipo de Entidad de Población en

SKOS<Concejo> rdf:type skos:Concept .

<Parroquia> rdf:type skos:Concept ;skos:broaderTransitive <Concejo>;

<Lugar> rdf:type skos:Concept ;skos:broaderTransitive <Parroquia>;

…Cada entidad tendrá un tipo que

será un skos:Concept y un <base uri definitions >

Esqueleto de una entidad de poblaciónTipo Valor

Código Concejo 53 (QUIRÓS)

Parroquia 08 (LLANUCES)

Entidad 02

Nombre (es) Llanuces

Nombre (ast) Chanuces

Tipo Entidad Lugar

Superficie (sólo parroquias y concejos)

Distancia 7,00

Altitud 870

Total población 28

Hombres 17

Mujeres 11

Total Viviendas 59

Viviendas Principales 15

Viviendas No Principales 44

…en RDF…Propiedad Valor

rdf:about <base_uri>/53/08/02

<base_uri> http://localhost/nomenclator/asturias/2010

skosxl:prefLabel, rdfs:label “Llanuces”@es

skosxl:prefLabel, rdfs:label “Chanuces”@ast

rdf:type <base_uri_definitions>/Lugar

<base_uri_definitions> http://localhost/nomenclator/definitions

dc:identifier “53_08_02”

skos:broaderTransitive <base_uri>/53/08/00

…definimos este esqueleto con Google Refine+RDF …

…y las estadísticas en RDF?

Estrategia…Paso 1-Modelar, generar… las entidades de población ->RDF

Paso 2-Enriquecer las entidades de población ->RDF

Paso 3-Modelar, generar…las estadísticas por separado ->RDF

…a preparar un poco más los datos…

• Quitar un “carácter extraño” de los códigos de Concejo, Parroquia y Entidad (mirar el código con unicode(value) si es 32 entonc es trim sino

substring )• Cambiar los nombres como “ Castro, El ” a

“ El Castro ” tanto en su versión normal como tradicional

• Preparar los nombres del tipo de “Entidad”

toTitlecase(value.split(",").reverse().join(" "))

Cambiamos la Base URI…

Añadimos prefijos: skos,skos -xl y dc

Borramos los mapeos que no interesan

Buscamos las propiedades que decidimos al modelar…

Salida previa…

"2010/"+value+"/"+cells["Cod_Parroquia"].value+"/"+cells["Cod_Entidad"].value

URIs para cada recurso

Lang en los labels …

Crear URI para tipo de entidad…

"http://localhost/nomenclator/definitions/"+replaceChars(value,"áéíóú","aeiou")

value+"_"+cells["Cod_Parroquia"].value+"_"+cells["Cod_Entidad"].value)

Crear dc:identifier …

Generando skos:broader…partimos de la columna “Cod_Concejo ”

if(cells["Cod_Entidad"].value == "00", if(cells["Cod_Parroquia"].value == "00","http://nuts.psi.enakting.org/id/ES12","http://localhost/nomenclator/asturias/2010/"+cells["Cod_Concejo"].value+"/00/00"

), "http://localhost/nomenclator/asturias/2010/"+cells["Cod_Concejo"].value+"/"+cells["Cod_Parroquia"].value+"/00"

))

Versión del RDF Skeleton

<http://localhost/nomenclator/asturias/2010/53/08/02>

skosxl:prefLabel “Llanuces"@es , "Chanuces"@ast ;

rdfs:label “Llanuces"@es , "Chanuces"@ast ;

a http://localhost/nomenclator/definitions/Lugar> ;

dc:identifier “53_08_02" ;

skos:broaderTransitive<http://localhost/nomenclator/asturias/2010/53/08/00> .

Nuestro ejemplo en Turtle …

Añadir lat /longconsultando

Google Maps..

Partimos de la columna “Nombre_clean ”

“Add column by fetching URLs”

Parámetros• Throttle delay: 100ms+ 0,5 seg. Por petición * 7878

(20-30 mins)• URL:

"http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=" + escape(value+","+value+", Asturias, Spain","url")

Respuesta en JSON (extraer lat y long ) y creamos nuevas columnas:

“ Add column based on this column ”

Partimos de la columna “Google Maps ”

with (value.parseJson (). results [0]. geometry.location , pair , pair.lat )

Columna “ Lat ”

with (value.parseJson (). results [0]. geometry.location , pair , pair.lng )

Columna “Long”

Editamos el RDF skeleton ..

Añadimos las propiedades…

Generar RDF final de las Entidades de Población

¿Es necesario publicar datos para

consultar en SPARQL?

-Cargar RDF por programa ( ej: JENA)

-Utilizar un procesador SPARQL local

ARQ• Descargar y descomprimir: • http://sourceforge.net/projects/jena/files/ARQ /• Ver Fichero:

curso/software/herramientas/arq-2.8.8.zip• Fijar variable ARQROOT

• SET arqroot="c:\Users\Curso\Desktop\curso\software\herramientas\ARQ-2.8.8“

• Ejecutar en cmd: • %ARQROOT%\bat\arq.bat --query

“file_query” --data “file_data”

ARQ• Ver fichero: curso/recursos/queries/1.qr• Ejecutar:

• Interesante porque tiene extensiones (algunas presentes ya en SPARQL 1.1

Algunas consultas en

SPARQL

Ver ficheros: curso/recursos/ queries /*. qr

A. «Obtener el código y el nombre de los concejos en castellano»

B. «Obtener el código y el nombre de todas las entidades de población de un concejo»

C. «Obtener el código y nombre todas las ciudades de un concejo»

D. «Obtener el código y nombre de todas las ciudades y lugares de un concejo ordenadas por nombre y tipo»

Consultas sencillas

SELECT DISTINCT * WHERE {?concejo rdf:type <http://localhost/nomenclator/definitions/Concejo>.?concejo dc:identifier ?id.?concejo rdfs:label?label.FILTER (lang(?label)="es").}

A

SELECT DISTINCT * WHERE {?concejo rdf:type <http://localhost/nomenclator/definitions/Concejo>.FILTER (?concejo = <http://localhost/nomenclator/asturias/2010/53/00/00>).?entidad skos:broaderTransitive ?concejo.?entidad rdfs:label ?label.FILTER (lang(?label)="es").}

B

SELECT DISTINCT * WHERE {?concejo rdf:type <http://localhost/nomenclator/definitions/Concejo>.FILTER (?concejo = <http://localhost/nomenclator/asturias/2010/53/00/00>).?entidad dc:identifier ?id.?entidad rdfs:label ?label.FILTER (lang(?label)="es").FILTER regex(str(?id), "^53")}

B1

SELECT DISTINCT * WHERE {?concejo rdf:type <http://localhost/nomenclator/definitions/Concejo>.FILTER (?concejo = <http://localhost/nomenclator/asturias/2010/44/00/00>).?entidad dc:identifier ?id.FILTER regex(str(?id), "^44")?entidad rdf:type <http://localhost/nomenclator/definitions/Ciudad>.?entidad rdfs:label ?label.FILTER (lang(?label)="es").}

C

SELECT DISTINCT ?id ?label ?tipo WHERE {?concejo rdf:type <http://localhost/nomenclator/definitions/Concejo>.FILTER (?concejo = <http://localhost/nomenclator/asturias/2010/44/00/00>).?entidad dc:identifier ?id.FILTER regex(str(?id), "^44")?entidad rdf:type ?tipo.FILTER (?tipo=<http://localhost/nomenclator/definitions/Ciudad> or?tipo=<http://localhost/nomenclator/definitions/Lugar>).?entidad rdfs:label ?label.FILTER (lang(?label)="es").}ORDER BY (?label) (?tipo)

D

Y ahora…a publicar los

datos

Apache

Virtuoso

Conductor SPARQL FCT

Apache Tomcat

Apps

Infraestructura

Instalación Apache

• Descarga: http://httpd.apache.org/

• Instalación típica como servicio

• Ver fichero: curso/software/servidores/httpd-2.2.21-win32-x86-openssl-0.9.8r.exe

Instalación Apache Tomcat

• Descarga: http://tomcat.apache.org/download-60.cgi

• Versión 6.x• Descomprimir fichero .zip• Configurar mod_jk y Apache

HTTP• Ver fichero :

curso/software/servidores/apache-tomcat-6.0.33-windows-x86.zip

Prueba…

Instalación Virtuoso• Descarga:

http://download.openlinksw.com/virtwiz/• Ver fichero :

curso/software/servidores/ntvpz2zz.exe

• Necesidad de registro para evaluación• Versión: ·Multi-Threaded Universal

Server (Commercial Edition) for OpenLink Virtuoso 6.2

• Instalación Completa y sin registro• Instalación Connectivity Suite

Arrancando…

http://localhost:8890/

User : dba password : dba

Subiendo ficheros

Graphs

SELECT * WHERE {

?x ?y ?z

} LIMIT 100

Prueba “ query ” SPARQL

SPARQL endpoint: http://localhost:8890/sparql

Otros paquetes: fct e isparql

Text Search en fct …” Llanuces ” (utiliza rdfs:label )

URI lookup en fct …

Algunas estadísticas hasta ahora…

Configuración “ cool uris ”

• Eliminar el nº de puerto de las URIs y que se puedan referenciar

• Crear proxy inverso con Apache HTTP• http://docs.openlinksw.com/virtuoso/webserver.

html

• Mod_jk (Conexión con Tomcat)

• Para desplegar un linked data front-end

Configuración Apache HTTP

• Paramos el servidor• Editamos el Archivo: C:\Program Files\Apache Software

Foundation\Apache2.2\conf \httpd.conf (verarchivo)

• Habilitamos los módulos de proxy (quitar #)• Habilitamos la carga de configuración de los Vhosts :

Include conf/extra/httpd-vhosts.conf• Editamos el fichero de vhosts: C:\Program Files\Apache

Software Foundation\Apache2.2\conf\extra (verarchivo)

• Arrancamos el servidor• Copiar ficheros de configuración de: curso/conf/apache

Configuración Apache HTTP -mod_jk

• Documentación oficial: http://tomcat.apache.org/connectors-doc/generic_howto/quick.html

• Descarga:• http://apache.rediris.es//tomcat/tomcat-

connectors/jk/binaries/windows/tomcat-connectors-1. 2.32-windows-i386-httpd-2.2.x.zip

• Ver fichero : curso/software/servidores/tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x.zip

• Copiar “mod_jk” a “ C:\Program Files\Apache Software Foundation\Apache2.2\modules ”

• Crear fichero “ worker.properties ”• Configurar módulo según documentación• Añadir punto de montaje a aplicación en TOMCAT

worker.properties# Define 1 real worker using ajp13worker.list=worker1# Set properties for worker1 (ajp13)worker.worker1.type=ajp13worker.worker1.host=localhostworker.worker1.port=8009

Ubicación: C: \Program Files \Apache Software Foundation \Apache2.2 \conf

Configurar módulo en httpd.conf

# Load mod_jk module# Update this path to match your modules locationLoadModule jk_module modules/mod_jk.so# Where to find workers.properties# Update this path to match your conf directory location (p utworkers.properties next to httpd.conf)JkWorkersFile "c:/Temp/workers.properties"# Where to put jk shared memory# Update this path to match your local state directory or l ogsdirectoryJkShmFile "C:/Temp/mod_jk.shm"# Where to put jk logs# Update this path to match your logs directory location (p utmod_jk.log next to access_log)JkLogFile "C:/Temp/mod_jk.log"# Set the jk log level [debug/error/info]JkLogLevel info# Select the timestamp log formatJkLogStampFormat "[%a %b %d %H:%M:%S %Y] ""

Configurar módulo en httpd -vhosts.conf

JkMount /nomenclator /* worker1

Nuestra aplicación de Pubbyse llamará nomenclator y

estará en TOMCAT

Linked Data Front -end• Pubby

• http://www4.wiwiss.fu-berlin.de/pubby/• http://www4.wiwiss.fu-

berlin.de/pubby/download/pubby-0.3.3.zip• Ver fichero:

curso/software/herramientas/pubby-0.3.3.zip

• ELDA• http://elda.googlecode.com/hg/deliver-

elda/src/main/docs/index.html• WESO-DESH

• http://code.google.com/p/weso-desh/

Pubby• Servlet con negociación de

contenido y queries DESCRIBE de SPARQL

• ANT para construir nuestra propia webapp

• Configuración del dataset• Despliegue en TOMCAT• Mapeo con APACHE

¿Cómo funciona Pubby ?

Apache ANT• Descargar y descomprimir:

http://apache.rediris.es//ant/binaries/apache-ant-1.8.2-bin.zip

• Ver Fichero: curso/software/desarrollo/apache -ant -1.8.2 -bin.zip

• Ir a Equipo ->Propiedades…• Crear variable ANT_HOME• Configurar PATH de Windows• Comprobar en consola comando: ant

Construir nomenclator.war

• Editar el fichero config.ttl en \pubby -0.3.3 \webapp \WEB-INF

• Editar el fichero build.xml en pubby -0.3.3, cambiar el nombre generado:

<property name="myapp" value="nomenclator"/>

<property name="war" value="${basedir}/${ myapp}.war" />

• Empaquetar y Desplegar: ant war

config.ttl

conf:dataset [conf:sparqlEndpoint <http://localhost/sparql>;conf:sparqlDefaultGraph

<http://localhost/nomenclator/asturias/2010>;conf:datasetBase <http://localhost/nomenclator/>;conf:datasetURIPattern "asturias/2010/.*";conf:webResourcePrefix "";conf:fixUnescapedCharacters "(),'!$&*+;=@";#conf:metadataTemplate "metadata.ttl";meta:pubbyUser <http://purl.org/weso>;meta:pubbyOperator <http://purl.org/weso>;meta:endpointUser <http://purl.org/weso>;meta:endpointOperator <http://purl.org/weso>;

];

…Personalizar “ metadata.ttl”

Acceso mediante Pubby• http://localhost/nomenclator/

…hasta ahora tenemos..

Apache

Virtuoso

Conductor SPARQL FCT

Apache Tomcat

Apps

nomenclator

…más linked data ..

Enlace con DBPediaReconciliación de

entidades Estadísticas

Modelado Desempleo

Nuevo proyecto con Google RefineFuente:

http ://www.sepe.es/contenido/estadisticas/datos_estadisticos/municipios/index.ht

ml

Ver fichero: recursos/sepe/Desempleo-Sept-2011-Asturias.xls

Reconciliar con DBPedia

Seleccionar dbo:Place

Algunos “ matching ” a mano…

1. http://dbpedia.org/page/El_Franco2. http://dbpedia.org/page/Lena,_Asturias3. http://dbpedia.org/page/Muros_de_Nal%C3%B3n4. http://dbpedia.org/page/On%C3%ADs5. http://dbpedia.org/page/Quir%C3%B3s6. http://dbpedia.org/page/Las_Regueras7. http://dbpedia.org/page/San_Mart%C3%ADn_del_Re

y_Aurelio8. http://dbpedia.org/page/San_Mart%C3%ADn_de_Os

cos9. http://dbpedia.org/page/Villaviciosa,_Asturias10. http://dbpedia.org/page/Soto_del_Barco

Otros editando RDF…

Ver fichero: recursos/rdf/mapeo-concejos-dbpedia.ttl

Enlazamos con la DBPedia

Propiedad: owl:sameAsValor: cell.recon.match.id

Reconciliar con nuestro Noménclator

• Preparar los nombres de los concejos

• Crear consulta SPARQL• Añadir nueva columna

“Fetching web Service ”

Consulta en SPARQL

SELECT * where{?concejo rdf:type

<http://localhost/nomenclator/definitions/Concejo>.?concejo rdfs:label ?label.

FILTER (lang(?label)="es" and str(?label)="Allande")

}

value.split("< td>")[1].split("</td >")[0]

Y por qué a mano?…

Problemas en la codificación de las consultas en SPARQL

Algoritmos de Reconcialición

Con la DBPedia fallaron 18 con nuestro servicio 20: Quirós, Las Regueras, etc.

• http://events.linkeddata.org/ldow2011/papers/ldow2011-paper11-maali.pdf

• https://github.com/samuraraujo/SERIMI-RDF-Interlinking

• http://disi.unitn.it/~p2p/OM-011/oaei11_paper15.pdf

Lo están intentando resolver…

Les vamos a dar un buen caso de prueba…

RDF Skeleton

Generar RDF del Enlace con la DBPedia

• 1º Dataset con las entidades de población ya publicado en Virtuoso

• 2º Dataset con los enlaces a la DBPedia• 3º Dataset con los enlaces manuales a la DBPedia

Mezclamos los ficheros RDF

(sólo tripletas)

Nomen -full.ttl

Publicamos en Virtuoso

Finalmente publicamos las definiciones

Ver fichero : curso/recursos/ rdf /nomenclato

r-definitions.ttl

…Y todo este despliegue siempre a

mano?

TALIS Platformhttp://www.talis.com/platform /

LOD2 STACKhttp://lod2.eu/BlogPost/677-first-release-of-the-lo d2-

stack.html

BCN Chilehttp://www.slideshare.net/jelabra

(Presentación I-Semantics 2011)

Checklist• Producción de Linked Data• Enriquecimiento• Reconciliación de entidades• Publicación de datos• Infraestructura para

repositorio de RDF• …

¿Nuestro dataset puede ser una nueva

burbuja?

• There must be resolvable http:// (or https://) URIs.

• They must resolve, with or without content negotiation, to RDF datain one of the popular RDF formats (RDFa, RDF/XML, Turtle, N-Triples).

• The dataset must contain at least 1000 triples. (Hence, your FOAF file most likely does not qualify.)

• The dataset must be connected via RDF links to a dataset that is already in the diagram. This means, either your dataset must use URIs from the other dataset, or vice versam. We arbitrarily require at least 50 links.

• Access of the entire dataset must be possible via RDF crawling, via an RDF dump, or via a SPARQL endpoint.

http://richard.cyganiak.de/2007/10/lod/

Curso Integración Web Semántica

Jose María Alvarez RodríguezWESO-Universidad de Oviedo

E-mail: josem.alvarez@weso.esWWW: http://josemalvarez.es

…Estadísticas, Consumo, Introducción OWL+Ejemplo ,

Debate+Conclusiones …