Curso Integración Web Semántica
Jose María Álvarez RodríguezWESO-Universidad de Oviedo
E-mail: [email protected]: 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: [email protected]: http://josemalvarez.es
…Estadísticas, Consumo, Introducción OWL+Ejemplo ,
Debate+Conclusiones …
Top Related