TFG Jose Elias Silva Manrriquez
TFG Jose Elias Silva Manrriquez
TFG Jose Elias Silva Manrriquez
de Madrid
Escuela Técnica Superior de
Ingenieros Informáticos
Tutor:
Oscar Corcho García
Departamento de Inteligencia Artificial
ETSI Informáticos
Universidad Politécnica de Madrid
Resumen
Durante los últimos años la generación de datos en la red se ha incrementado.
Esto ha traído consigo un gran aumento en el uso de grafos de conocimiento
tanto por organizaciones públicas y privadas para el desarrollo de aplicaciones.
Actualmente se puede distinguir, por un lado, los ingenieros ontológicos que
diseñan estos grafos de conocimientos y, por otro, los desarrolladores de
aplicaciones que consumen sus contenidos a través de Interfaces de
Programación de Aplicaciones (APIs).
1
Abstract
During the last years the generation of data in the network has increased. This
has brought about a great increase in the use of knowledge graphs by both
public and private organizations for the development of applications. Currently
we can distinguish, on the one hand, the ontological engineers who design these
knowledge graphs and, on the other, the application developers who consume
their content through Application Programming Interfaces (APIs).
According with my co-tutor Paola’s thesis [23], who has carried out research
on the current situation, it is determined that there is a gap between application
developers and ontological engineers. According to this study, there are a series
of limitations in the specifications based on the existing APIs, the technologies
for the consumption of the knowledge graphs, automatic generation of the APIs,
control of the current state and existing tests.
The objective of this project is to provide tools that mount these APIs through
Docker containers. These containers can be launched from any operating
system, which allows using the APIs in any environment.
It will detail each of the steps essential configuration using these tools as well
as the status of these. It will include functional examples that will test the API
in a simple way. The purpose is to create a bridge between developers and
ontological engineers, saving research time and problems with versions of the
environment.
2
Índice de contenido
1 Introducción ......................................................................................7
1.1 Motivación .......................................................................................... 7
1.2 Objetivos ............................................................................................ 7
1.3 Estructura de la Memoria ................................................................... 8
2 Estado del Arte ..................................................................................9
2.1 Introducción ....................................................................................... 9
2.1.1 Grafos de conocimiento ................................................................ 9
2.1.2 Web Semántica ............................................................................ 9
2.1.3 Linked Data y Datos abiertos ..................................................... 10
2.2 Tecnologías ...................................................................................... 10
2.2.1 Pubby ........................................................................................ 10
2.2.2 Puelia......................................................................................... 11
2.2.3 Basil .......................................................................................... 11
2.2.4 Trellis ......................................................................................... 11
2.2.4.1 LDP......................................................................................... 11
3 Desarrollo ........................................................................................13
3.1 Metodología ...................................................................................... 13
3.2 Herramientas utilizadas ................................................................... 14
3.2.1 Entorno Docker.......................................................................... 14
3.2.1.1 Introducción e instalación....................................................... 14
3.2.1.2 Comandos Docker ................................................................... 15
3.2.1.3 Comandos Dockerfile .............................................................. 16
3.2.2 Comando CURL ......................................................................... 17
3.2.2.1 Instalación .............................................................................. 17
3.2.2.2 Opciones ................................................................................. 17
3.3 Herramientas desarrolladas ............................................................. 18
3.3.1 Pubby ........................................................................................ 18
3.3.1.1 Configuración ......................................................................... 18
3.3.1.2 Pasos de ejecución .................................................................. 19
3.3.1.3 Ejemplos ................................................................................. 20
3.3.1.4 Análisis ................................................................................... 23
3.3.1.5 Complicaciones ....................................................................... 24
3.3.1.6 Propuesta de mejora ............................................................... 25
3.3.1.7 Conclusión.............................................................................. 25
3.3.2 Basil .......................................................................................... 26
3.3.2.1 Configuración ......................................................................... 26
3.3.2.2 Pasos de ejecución .................................................................. 29
3.3.2.3 Ejemplos ................................................................................. 31
3
3.3.2.4 Análisis ................................................................................... 34
3.3.2.5 Complicaciones ....................................................................... 34
3.3.2.6 Propuesta de mejora ............................................................... 39
3.3.2.7 Conclusión.............................................................................. 39
3.3.3 Puelia......................................................................................... 40
3.3.4 Trellis ......................................................................................... 44
3.3.4.1 Configuración ......................................................................... 44
3.3.4.2 Pasos de ejecución .................................................................. 45
3.3.4.3 Ejemplos ................................................................................. 47
3.3.4.4 Análisis ................................................................................... 50
3.3.4.5 Complicaciones ....................................................................... 51
3.3.4.6 Propuesta de mejora ............................................................... 51
3.3.4.7 Conclusión.............................................................................. 52
4 Conclusiones ...................................................................................53
4.1 Resultados ....................................................................................... 53
4.2 Conclusiones personales .................................................................. 53
4.3 Líneas futuras .................................................................................. 54
5 Análisis de Impacto .........................................................................55
6 Bibliografía ......................................................................................56
4
Índice de ilustraciones
Ilustración 1: Esquema funcionamiento Pubby[1] ......................................... 10
Ilustración 2: Tipos de LDPR.[34] .................................................................. 12
Ilustración 3: Aplicación Docker.................................................................... 14
Ilustración 4: Extensión Docker Visual Studio Code ..................................... 15
Ilustración 5: Visual Studio Code .................................................................. 15
Ilustración 6: Dockerfile Pubby ..................................................................... 19
Ilustración 7: Ejemplo 1. Endpoint dbpedia (Pubby) ...................................... 21
Ilustración 8: Ejemplo 1. Navegación por endpoint dbpedia (Pubby) .............. 22
Ilustración 9: Ejemplo 2. Carga RDF (Pubby) ................................................ 23
Ilustración 10: Error configuración obsoleta (Pubby) ..................................... 24
Ilustración 11: Error version JDK en Dockerfile (Pubby) ............................... 24
Ilustración 12: Creación de API (Basil) .......................................................... 26
Ilustración 13: Ejemplo de consulta parametrizada (Basil) ........................... 26
Ilustración 14: Puntos finales de API (Basil) .................................................. 27
Ilustración 15: Dockerfile Basil ..................................................................... 29
Ilustración 16: Fichero script.sh (Basil) ......................................................... 30
Ilustración 17: Fichero run.sh (Basil) ............................................................ 31
Ilustración 18: Ejecución servidor MySQL y aplicación (Basil) ....................... 31
Ilustración 19: Ejemplo 1. API películas (Basil) ............................................. 33
Ilustración 20: Ejemplo 2. API parametrizada con documentación (Basil)...... 34
Ilustración 21: Error creación proyecto con Maven I (Basil) ........................... 35
Ilustración 22: Error creación proyecto con Maven II (Basil) .......................... 35
Ilustración 23: Error creación proyecto con Maven III (Basil) ......................... 36
Ilustración 24: Error lanzamiento de aplicación Basil (MySQL) ..................... 36
Ilustración 25: Error lanzamiento de aplicación por Javax (Basil) ................. 36
Ilustración 26: Solución error Javax (Basil) ................................................... 37
Ilustración 27: Navegador lanzamiento Basil ................................................. 37
Ilustración 28: Error mysql-server (Basil) ...................................................... 38
Ilustración 29: Error conexión mysql-server desde Dockerfile (Basil) ............. 38
Ilustración 30: Test Java conexión mysql-server ........................................... 38
Ilustración 31: Error php 7 (Puelia) ............................................................... 41
Ilustración 32: Fichero simplegraph.class.php (Puelia) .................................. 41
Ilustración 33: Error configuración incompleta (Puelia) ................................. 41
Ilustración 34: Error php en lda-cache.class.php (Puelia) ............................ 42
Ilustración 35: Fichero lda-cache.class.php (Puelia) ...................................... 42
Ilustración 36: Error php en index.php (Puelia) ............................................. 42
Ilustración 37: index.php (Puelia) .................................................................. 43
Ilustración 38: Docker-compose.yml Trellis ................................................... 46
5
Ilustración 39: Ejecución exitosa Trellis ........................................................ 46
Ilustración 40: Contenedores trellisldp y postgres (Trellis) ............................. 47
Ilustración 41: Petición curl localhost (Trellis) ............................................... 47
Ilustración 42: Ejemplo 1. Resultados (Trellis) .............................................. 48
Ilustración 43. Ejemplo 2 Resultados (Trellis) ............................................... 50
Ilustración 44: Error curl Trellis.................................................................... 51
Ilustración 45: Error credenciales Trellis ....................................................... 51
6
1 Introducción
1.1 Motivación
Vivimos en una era digital donde nuestra sociedad genera y consume una gran
cantidad de datos. En la última década esto se ha incrementado
sustancialmente y ha permitido incrementar el uso de grafos de conocimiento
en el desarrollo de aplicaciones en diferentes áreas. Los grafos de conocimientos
no es más que un sencilla forma de representar relaciones entre entidades y
que permite establecer vínculos semánticos [45]. Su uso se ha extendido tanto
a organizaciones públicas y privadas. Empresas como Google o Microsoft
utilizan los grafos de conocimiento para mejorar sus motores de búsqueda [45].
También portales de países, como España o Reino unido lo utilizan para las
administraciones públicas [23].
1.2 Objetivos
7
cada uno de los pasos para poder lanzar las aplicaciones con éxito así como los
resultados esperados.
OB 3. – Implementación de ejemplos
Implementar un par de ejemplos para demostrar el funcionamiento de las
herramientas. Estos ejemplos tendrán los requerimientos mínimos para que las
personas sin conocimiento previo puedan entenderlos.
OB 4. - Elaboración de memoria
Documentar cada uno de los pasos dados, dificultades encontradas y realizar
un análisis de la documentación, mantenibilidad , interfaz y una serie de
propuestas de mejora para cada herramienta.
8
2 Estado del Arte
2.1 Introducción
Los grafos de conocimiento, Web Semántica, Linked Data y datos abiertos son
conceptos necesarios para comprender el funcionamiento de las APIs de las que
se habla en este proyecto.
2.1.1 Grafos de conocimiento
Los grafos de datos es una manera de representar la relación entre entidades
permitiendo establecer vínculos semánticos entre datos y metadatos (datos
acerca de los datos [48]). Se puede recorrer los distintos nodos que se han
formado a través de estos vínculos usando lógicas de razonamiento. Permite
gestionar la información de una manera ordenada pudiendo clasificar los datos,
describir sus propiedades o añadir descripciones semánticas. Con esto se
consigue que los grafos de datos se vuelven grafos de conocimiento [45].
2.1.2 Web Semántica
El Consorcio WWW [58], también conocido como World Wide Web Consortium
(W3C), genera recomendaciones y estándares que aseguran el crecimiento de la
World Wide Web a largo plazo [49]. W3C creó las primeras especificaciones para
la Web Semántica, tecnología que facilita la comunicación entre diversas
entidades usando modelos bien definidos, con la finalidad de evitar
ambigüedades en las comunicaciones. Esto facilita el desarrollo de aplicaciones
que utilicen diversas fuentes de datos [50]. Esta tecnología está constituida por
3 bloques: un modelo de datos estándar, un conjunto de vocabularios de
referencia y un protocolo estándar de consulta[50].
El modelo de datos o infraestructura para la descripción de recursos (RDF)
permite crear grafos de conocimientos globales usando protocolos y lenguajes
de la Web. Es posible describir cualquier objeto, ya sea real o abstracto (persona,
coche, sentimiento, color...) en múltiples idiomas a través de tripletas con la
siguiente estructura: <sujeto> <predicado> <objeto>. Los RDF se localizan a
través de identificadores web (URIs) del tipo: <http://… /recurso>. De esta se
consigue que los grafos de vuelvan universales ya que se pueden acceder desde
cualquier lugar de la red
La Web Semántica necesita un conjunto de vocabularios para facilitar la
comunicación de los metadatos [51]. Se utiliza lo que se conoce como ontologías
para especificar un concepto dentro de un determinado dominio de interés [54].
Cada vocabulario u ontología se identifica por una URI. Por ejemplo la ontología
FOAF que permite describir personas, se accede a través de la URI
“http://xmlns.com/foaf/0.1/”. Cada una de las clases y propiedades se pueden
acceder concatenando a la URI el nombre de la respectiva clase o propiedad.
9
2.1.3 Linked Data y Datos abiertos
Linked Data o datos enlazados describe un método de publicación de datos
estructurados para que puedan ser interconectados y más útiles. Permite
mostrar, intercambiar y conectar datos a través de URI desreferenciables[52] en
la Web ( a través de URL).
Apoyándose en la definición que ofrece Opendatahandbook [53], los datos
abiertos “son datos que pueden ser utilizados, reutilizados y redistribuidos
libremente por cualquier persona, y que se encuentran sujetos, cuando más, al
requerimiento de atribución y de compartirse de la misma manera en que
aparecen”
Existen varias plataformas de datos enlazados, como puede ser DBpedia [56]
(extracción de datos de Wikipedia) o Datos.bne (Biblioteca Nacional de España)
[57], que son muy utilizados para la extracción de datos siguiendo las reglas de
Web Semantic. No todas las plataformas de datos enlazados son abiertas, ni
todas las plataformas abiertas tienen datos enlazados.
2.2 Tecnologías
2.2.1 Pubby
Gran parte de los datos de la Web Semántica se encuentran dentro de
triplestores y solo se puede acceder a ellos enviando consultas SPARQL a un
punto final SPARQL. Es difícil conectar la información de estas almacenes de
RDF con otras fuentes de datos externas [5].
En RDF, los recursos se identifican mediante URI. Los URI utilizados en la
mayoría de los conjuntos de datos SPARQL no son desreferenciables , esto
significa que no se puede acceder a ellos en un navegador web semántico, ya
que devuelven errores 404 (Not Found), o utilizan esquemas URI no
desreferenciables, como en la etiqueta URI tag:dbpedia.org,2007:Berlin.[1]
Pubby es una aplicación web Java que permite navegar al usuario por el
contenido de un punto final de forma sencilla, desde el navegador, sin la
necesidad de realizar consultas SPARQL.
Al configurar un servidor Pubby para un punto final SPARQL, configurará un
mapeo que traduzca esos URI en URI desreferenciables manejados por Pubby.
Pubby manejará las solicitudes a los URI mapeados conectándose al punto final
SPARQL, solicitándole información sobre el URI original y devolviendo los
10
resultados al cliente. También maneja varios detalles de la interacción HTTP ,
como la redirección 303 requerida por la Arquitectura Web y la negociación de
contenido entre HTML, RDF / XML y descripciones de Turtle del mismo recurso.
Incluye una extensión de metadatos para agregar metadatos a los datos
proporcionados.
2.2.2 Puelia
Puelia es una implementación PHP de la especificación de la API Linked Data
[2]. Es una aplicación que maneja las solicitudes entrantes leyendo archivos de
configuración RDF o Turtle (en /api-config-files/) y convirtiendo esas solicitudes
en consultas SPARQL. Se utilizan para recuperar datos RDF de los puntos
finales SPARQL declarados en los archivos de configuración. Los datos RDF
obtenidos del punto final SPARQL se puede retornar al usuario en una serie de
opciones de formato, incluidos los formatos Turtle, RDF/XML y “simples”
JSON/XML.
2.2.3 Basil
Basil esta diseñado para montar APIs web sobre puntos finales SPARQL [3].
Realiza el papel de un sistema middleware que permite la comunicación entre
puntos finales y sentencias SPARQL almacenadas como recursos. También
permite incluir en la URI de la API parámetros para dar valor a las variables
dentro de las consultas SPARQL. Finalmente se genera todas las rutas de las
APIs para poder realizar operaciones CRUD (crear, recuperar, actualizar y
eliminar). Todo esto se realiza organizando los recursos por usuarios, pudiendo
tener varios usuarios dentro del servicio.
2.2.4 Trellis
Trellis es un servidor modular que hospeda plataforma de datos vinculados
(LDP) cumpliendo con los estándares web [38]. Ideal para proyectos donde hay
gran cantidad de datos y altas cargas en el servidor. Su arquitectura permite
ampliación horizontal del sistema, proporcionando escalabilidad [4].
Se puede acceder a la API a través de método HTTP siguiendo las
especificaciones de LDP [36]:
POST: crear recurso
PUT: actualizar recurso (no conjunto de cambios) y crear si no existe
PATCH: actualizar recurso(conjunto de cambios)
GET: obtener recurso
DELATE: eliminar recurso
OPTION: obtener opciones de comunicación existentes de un recurso
destino
2.2.4.1 LDP
Un servidor que hospeda recursos de plataforma de datos vinculados (LDPR)
puede administrar dos tipos de LDPR [35]: aquellos recursos cuyo estado se
representa mediante un RDF (LDP-RS) y aquellos que utilizan otros formatos
no RDF (LDP-NRS) como archivos HTML, imágenes, otros archivos binarios,
etc.
11
Ilustración 2: Tipos de LDPR.[34]
Los contenedores (LDPC) son recursos que almacenan otros recursos. Pueden
almacenar otros contenedores, RDF o datos binarios. Existen 3 diferentes
tipos de contendores, que presentan características muy similares pero con
pequeñas diferencias [36,37].
Contenedor Básico : Define un enlace simple a recursos de información
12
3 Desarrollo
3.1 Metodología
Para el desarrollo de cada una de las herramientas se ha decidido seguir los
siguientes pasos. La primera toma de contacto se realiza desde el sistema nativo,
en este caso Windows 10 Pro, en donde se instala cada una de las aplicaciones
externas que requiere cada API (Apache, Tomcat, MySQL...). Se asegura que en
el sistema nativo la herramienta funcione correctamente, probándolo con
configuraciones básicas. Se documenta las dificultades que se hayan podido
tener hasta este punto, como puede ser falta de documentación, errores de
configuración de las aplicaciones externas o de la misma API. Posteriormente se
procede a realizar los correspondientes ficheros Dockerfile (se detalla su
significado y uso en el siguiente apartado). Como imagen base para todos los
Dockerfile se ha decidido utilizar Ubuntu, versión 20.04, con la finalidad de
probar la API en un diferente entorno al nativo. En cada Dockerfile se ha
instalado los menores paquetes posibles para poder realizar versiones más
ligeras de cada una de las herramientas. Una vez finalizado el Dockerfile, que
permite desplegar la API, se ha vuelto a probar con las configuraciones que ha
funcionado en el entorno nativo. Se ha documentado cada uno de los errores
que haya podido suceder en el proceso de generación del Dockerfile.
Una vez que se ha tenido desarrollada la herramienta de forma completa se ha
decidido, con los datos disponibles y con la experiencia misma tras el desarrollo,
realizar un breve análisis. En este análisis, para cada una de las APIs, se ha
valorado la documentación, mantenibilidad e interfaz. En cuanto a la
documentación, se ha especificado los posibles errores o mejoras que presenta
la documentación proporcionada por los repositorios oficiales. Para el aspecto
de mantenibilidad se ha comprobado si las herramientas presentan
actualizaciones recientes, si se ha encontrado alguna versión que presenta error
de compatibilidad con las aplicaciones externas (versiones actuales), así como
el soporte que existe por parte de su comunidad. El último elemento que se ha
evaluado son las ventajas e inconvenientes de la interfaz de la APIs.
Además, se ha finalizado con una serie de propuestas y una conclusión de la
herramienta.
Todos los Dockerfile, ficheros de ejemplos, pasos de lanzamiento se ha decidido
subir al repositorio GitHub TFG-APIsREST-LinkedData [40]
13
3.2 Herramientas utilizadas
Se especifican las herramientas que se han utilizado durante el desarrollo del
proyecto. No se especifican las aplicaciones externas que se han tenido que
instalar para cada API (Apache, Tomcat, MySQL...)
3.2.1 Entorno Docker
3.2.1.1 Introducción e instalación
Docker es una herramienta software que nos permite crear, probar e
implementar aplicaciones asegurandonos, sea cual sea el entorno donde se
requiera usar la aplicación desarrollada, que siempre funcionará. Esto es
posible ya que Docker se basa en contenedores que poseen todo lo necesario
(nucleo sistema operativo, código, librerías…) para ser ejectuados en cualquier
entorno. Estos contenedores se crean apartir de “imagenes”, versiones ligeras
del cotenedor, que tienen el mismo contenido. A su vez estas imágenes se
generán a partir de ficheros que se conocen como Dockerfiles. Estos ficheros
contienen todas las instrucciones necesarias para montar la aplicación, desde
el sistema operativo a usar, instalacion de librerias, instalacion de aplicaciones,
conexiones externas….Los Dockerfiles pueden usar a su vez imágenes como
base para las aplicaciones. Para poder montar las APIs, mencionadas
anteriormente, es necesario realizar varios pasos de configuración e instalación
de aplicaciones. Usando Dockerfiles se ahorra todos estos pasos y se evita
problemas con las versiones de aplicaciones que se tenga instaladas.
Para obtener Docker se debe de acceder a la página oficial de Docker [6] y seguir
los pasos de instalación según el sistema operativo que se tenga. Para el
desarrollo práctico y prueba de herramientas se ha utilizado Docker para
Windows 10 Pro.
Una vez instalado la aplicación Docker se tendrá una interfaz similar a la
siguiente ilustración, donde se puede observar los contenedores e imágenes que
tiene el sistema. Se debe de crear una cuenta en Docker Hub [7] para acceder
al repositorio de imágenes, que se utilizan como base en los Dockerfiles.
Una vez creada la cuenta, se tiene que iniciar sesión para tener acceso de las
imágenes del repositorio Docker Hub. Desde un terminal CMD del equipo ya se
puede tener acceso a las funcionalidades de Docker para probar los Dockerfile.
Por mayor comodidad se recomienda instalar Visual Studio Code [8] o editares
similares para poder observar de forma más sencilla los Dockerfile, ficheros de
configuración y el terminal de ejecución. Además si se opta por Visual Studio
Code, hay la posibilidad instalar la extensión de Microsoft Docker (Ilustración
4) que permite, dentro del mismo entrono de desarrollo, gestionar cada una de
14
las imágenes y contenedores. Al igual que en la aplicación Docker, será
necesario iniciar sesión para tener acceso al repositorio de imágenes Docker.
1
2
3
Ilustración 5: Visual Studio Code
-v “$pwd/DirTrabajo:/rutaimagen ” nombreimagen
Permite añadir un volumen para tener cambios actualizables entre una carpeta
del directorio actual de trabajo y un directorio de la imagen.
docker-compose up
Inicia todos los servicios de un fichero docker-compose.yml. Este fichero
contiene las instrucciones para lanzar aplicaciones Docker de varios
contenedores.
FROM imagen
Permite coger como base una imagen del repositorio de Docker Hub.
RUN comando
Ejecuta los comandos que se lanzan dentro de nuestra imagen. Debe de ser
acorde al sistema operativo que use la imagen base.
EXPOSE puerto
Indica a Docker que el servicio del contenedor se puede conectar a través del
puerto que se pasa como argumento.
16
3.2.2 Comando CURL
Curl es una herramienta de línea de comandos que permite realizar solicitudes
HTTP. Permite probar las APIs sin la necesidad de tener una aplicación web
montada.
3.2.2.1 Instalación
Se ha utilizado el terminal de Git Bash durante el desarrollo del proyecto para
realizar las interacciones con las APIs. Se puede utilizar otros terminales
instalando los correspondientes paquetes de Curl. Para instalar Git Bash:
1. Visitar la página : https://git-scm.com/downloads
2. Elegir el sistema en la lista e instalar la configuración descargada
3. Registrar la ruta del directorio instalable en las variables de entorno.
4. Abrir Git Bash
3.2.2.2 Opciones
Las opciones [24,25] más destacadas para utilizar la herramienta curl con las
APIs son:
-X, --request: especificar el método de solicitud cuando se comunica
con el servidor HTTP (POST, PUT, GET, DELETE…).
-I, --head : recuperar solo los encabezados.
-i, --include: incluir los encabezados de respuesta HTTP en la salida.
-H: Especifica cualquier contenido de encabezado adicional para incluir
en la solicitud HTTP, generalmente incluyen el tipo de contenido de los
datos. Ejemplo: -H "Content-Type: application/json". También se puede
especificar el directorio donde se realiza la operación con “Slug:
directorio”.
-s, --silent : indica que no muestre información de progreso o error.
-v, --verbose: lo contrario de --silent .
-d: permite introducir datos.
--data-raw: publica datos de manera similar a -d, pero sin la
interpretación especial del carácter @.
17
3.3 Herramientas desarrolladas
3.3.1 Pubby
3.3.1.1 Configuración
En el archivo config.ttl se determina la configuración de la aplicación Pubby.
En primer lugar se debe de especificar los prefijos que se va a emplear. Los que
se utilizan comúnmente son:
@prefix conf: <http://richard.cyganiak.de/2007/pubby/config.rdf#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
Con los anteriores pasos ya se tendría una configuración sencilla lista para
utilizar. Las siguientes configuraciones que se describen se consideran de
bastante utilidad. Se puede encontrar todas las configuraciones disponibles en
la página oficial de Pubby [1]
Si se quiere establecer una página de inicio se debe de especificar una URI de
conjunto de datos y no una URI web mapeada en la configuración
“indexResource”:
conf:indexResource <dataset_uri>;
18
Si se quiere utilizar las declaraciones de prefijo de un documento RDF, en la
salida, se puede utilizar la configuración “usePrefixFrom” para vincularlo. Si por
el contrario se quiere utilizar los prefijos del fichero config.ttl lo se debe de dejar
vacío:
conf: usePrefixesFrom < archivo.rdf >;
Las siguientes configuración forman parte del conjunto de reglas que se podrían
poner dentro de cada dataset[]
Si los datos de interés no se encuentran en el gráfico predeterminado del
conjunto de datos SPARQL, sino dentro de un gráfico con nombre, entonces su
nombre debe especificarse en la configuración “sparqlDefaultGraph”:
conf: sparqlDefaultGraph < sparql_default_graph_name >;
19
actual de trabajo. Finalmente se indica que el contenedor se puede conectar a
través del puerto 8080.
3.3.1.2.2 Ejecución
Entendido el funcionamiento del Dockerfile, se procede a generar la imagen:
docker build -t pubby .
Se espera a que el proceso termine. Esto puede demorar unos minutos ya que
se debe de descargar e instalar los paquetes de datos. Una vez generada la
imagen se debe de ejecutar el comando:
docker run -it -p 8080:8080 -v "$(pwd)/Configuracion:/usr/tmp" pubby
3.3.1.3 Ejemplos
Tras lanzar la aplicación Pubby se puede realizar los siguientes ejemplos
cambiando el contenido del fichero config.ttl, que se tiene en el directorio actual
de trabajo, por las configuraciones “configEj1.ttl” o “configEj2” de la carpeta del
proyecto [40] correspondientes al ejemplo 1 y 2
20
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix dbpedia: <http://localhost:8080/resource/> .
@prefix p: <http://localhost:8080/property/> .
@prefix prvTypes: <http://purl.org/net/provenance/types#> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
<> a conf:Configuration;
conf:projectName "DBpedia.org";
conf:projectHomepage <http://dbpedia.org>;
conf:webBase <http://localhost:8080/>;
conf:usePrefixesFrom <>;
conf:defaultLanguage "es";
conf:indexResource <http://dbpedia.org/resource/Wikipedia>;
conf:dataset [
conf:sparqlEndpoint <https://dbpedia.org/sparql>;
conf:sparqlDefaultGraph <http://dbpedia.org>;
conf:datasetBase <http://dbpedia.org/resource/>;
];
.
21
Ilustración 8: Ejemplo 1. Navegación por endpoint dbpedia (Pubby)
22
Ilustración 9: Ejemplo 2. Carga RDF (Pubby)
3.3.1.4 Análisis
3.3.1.4.1 Documentación
La documentación proporcionada en la página oficial de Pubby [1] solo muestra
la nomenclatura que debe tener la configuración. No se encuentra ejemplos
funcionales, más allá del fichero de configuración secundario “conf-myfoaf.ttl”,
y documentación más detallada para poder construir el fichero de configuración
correctamente. Las instrucciones que se encuentran sobre la descarga e
instalación están bastante completas.
3.3.1.4.2 Mantenibilidad
Archivo de configuración por defecto tiene un punto endpoint obsoleto
“http://dbpedia.openlinksw.com:8890/sparql” lo que produce un error en su
despliegue.
La última versión de la aplicación es del 2011. La última participación de la
comunidad se remonta a 2016. Al no existir actualizaciones reciente y muy poca
interacción de la comunidad en la actualidad se puede determinar que no
cumple con el aspecto de mantenibilidad.
3.3.1.4.3 Interfaz
Se puede observar que esta herramienta presenta un interfaz bastante amigable
e intuitiva que permite interaccionar con los recursos clicando directamente
sobre el enlace. Además, permite recuperar imágenes de los recursos a los que
se accede lo que mejora la estética de la página.
23
3.3.1.5 Complicaciones
3.3.1.5.1 Maquina local
Una vez instalado las aplicaciones necesarias y sin cambiar la configuración
que venía por defecto, lanzando la aplicación, se obtuvo el siguiente error:
Para verificar que el error se debe por el fichero “config.ttl” se decidió reemplazar
el contenido por el de la configuración secundaria “config-myfoaf.ttl”. Después
de este cambio la aplicación se lanzó correctamente y se pudo comprobar de
esta forma que el error se hallaba en ese fichero. Con la ayuda de mi cotutora
se pudo identificar que el endpoint era incorrecto y cambiándolo por el de
“dbpedia/sparql” funciono correctamente.
3.3.1.5.2 Dockerfile
3.3.1.5.2.1 Version JDK
Replicando los pasos realizadas en la maquina local para el lanzamiento de
Pubby y corrigiendo el error anterior con el fichero de configuración se obtuvo
el siguiente error al lanzar el contenedor:
24
una versión JDK superior a la que se estaba probando en su momento. Con
una versión open-jdk-11 (para sistemas Ubuntu) la aplicación Pubby pudo
funcionar correctamente usando el Dockerfile.
3.3.1.7 Conclusión
Pubby es una herramienta que permite realizar modificaciones en la
configuración de una manera sencilla pudiendo visualizar los cambios de una
manera rápida. Esto permite mayor facilidad a los desarrolladores a probar sus
diferentes configuraciones y familiarizarse con ellas. Al utilizarse URI no
desreferenciables en la mayoría de los conjuntos de datos SPARQL, Pubby es la
solución para poder acceder a estos recursos ya que mapea estas URI y las hace
desreferenciables. Se puede navegar clicando por todos los recursos, tipos y
relaciones de una manera sencilla pudiendo visualizar las imágenes de los
recursos.
25
3.3.2 Basil
3.3.2.1 Configuración
Por si solo Basil no tiene incluido una interfaz gráfica. Para poder configurar y
ejecutar las APIs se debe de realizar mediante un terminal Shell Bash usando
el comando curl [9], explicado en los primeros apartados de esta memoria.
3.3.2.1.1 Creación de usuario
Se debe de tener un usuario para crear APIs. Lo primero que se debe de hacer
es crear un usuario. Se debe de utilizar un JSON similar al siguiente(ej:
user.json):
{
username:myuser,
password:mypassword,
password2:mypassword2,
email:[email protected]
}
26
?_nameparam_iri: La variable se sustituye por el valor del parámetro
como IRI.
Cada uno de los puntos finales se puede usar para acceder, crear o modificar
las características de la API usando métodos HTTP: POST (crear), PUT
(actualizar/crear), GET (obtener), DELETE (eliminar).
Endpoint /api
Para acceder al resultado de una API:
curl http://localhost:8080/basil/<code_api>/api
Endpoint /alias
Acceder a las APIs por el identificador puede ser algo tedioso. Asignarles un
Alias facilita su identificación. Se debe de tener un fichero .txt con el nombre
que con el que se quiera identificar a la API. Se realiza una petición PUT sobre
el endpoint /alias con el anterior fichero para crear el identificativo.
27
curl -u <username>:<password> -X PUT
http://localhost:8080/basil/<code_api>/alias -T <alias.txt>
Endpoint /spec
Se puede obtener el SPARQL de la API:
curl "http://localhost:8080/basil/s50nwb9679dd/spec"
Endpoint /views
Se puede definir una representación HTML de los resultados que genera las APIs.
Hace posible adaptar la salida para aplicaciones que, por ejemplo, quieran
incrustar dichos fragmentos en páginas web sin más procesamiento [10]
Endpoint /docs
Hay la posibilidad de subir documentación a la API. Se deberá de tener un
fichero “.txt” (ej: doc.txt) con toda la información relevante y subirlo a la ruta
/docs:
curl -u <username>:<password> -X PUT
http://localhost:8080/basil/<api_code>/docs -H "X-Basil-Name: Concepts of
entity" -T <doc.txt>
28
Endpoint /api-docs
Permite acceder a la especificación de la API Swagger. El resultado es una
especificación en JSON.
curl http://localhost:8080/basil/<code_api>/api-docs
Se copian del directorio /Ejemplos los ficheros que se utilizan en los ejemplos
que se describe en el siguiente apartado.
Se descarga del repositorio GitHub del autor [11] los ficheros de la aplicación
Basil. El fichero de configuración “basil.ini” se reemplaza por el que se dispone
en el directorio actual de trabajo para modificar los parámetros de conexión con
la base de datos. De la misma forma, se reemplaza el fichero /server/pom.xml
por el “pom.xml” ya que se necesita agregar las dependencias Javax (a partir de
java 8 es necesario). Se utiliza Maven para la construcción del proyecto java a
29
partir del fichero pom.xml de la raíz del proyecto. Esto genera “basil-server-
0.8.0.jar”
Ilustración 14: Fichero basil.ini (Basil) Ilustración 15: Fichero pom.xml (Basil)
3.3.2.2.2 Ejecución
Entendido el funcionamiento del Dockerfile, se procede a generar la imagen:
docker build -t basil .
Se espera a que el proceso termine. Esto puede demorar unos minutos ya que
se debe de descargar e instalar paquetes de datos. Una vez se tenga la imagen
se debe de ejecutar el comando:
docker run -it -p 8080:8080 basil
30
./run.sh &
Este script internamente indica que se desea utilizar el fichero “basil.ini” como
Configuración, la salida se especifica en el fichero “log4j2.xml” y que se utiliza
la aplicación java “basil-server-0.8.0.jar” expuesto por el puerto 8080.
Con esto ya se tendría la aplicación Basil funcionando y lista para usar. Esta
versión no dispone de una interfaz gráfica. Para crear y gestionar nuestras APIs
se deberá de realizar a través del comando “curl”[9]. Para crear ficheros dentro
del contendor se puede utilizar el comando “nano nombrefichero.extension”. En
el apartado “3.4.1. Pasos de configuración” se puede encontrar todos los
comandos necesarios para crear, consultar, actualizar y eliminar las APIs.
3.3.2.3 Ejemplos
Una vez lanzada la aplicación puede probar los siguientes ejemplos lanzando
los comandos, desde el terminal Shell Bash en la ruta raíz, en el orden
correspondiente.
Para comprobar que los datos se han ido guardado en la base datos, tras realizar
los ejemplos, se pueden seguir los siguientes pasos.
1. Identificarnos en el servidor mysql:
mysql --host=localhost --user=root --password=jose
Se abrirá un prompt “mysql>” en donde se puede ejecutar ejecutar
sentencias SQL.
2. Observar las bases de datos existentes:
mysql> show databases;
31
mysql> use basil;
{
username:jose,
password:contra123,
email:[email protected]
}
4. Ahora se puede lanzar una consulta GET a la API para obtener el resultado
curl http://localhost:8080/basil/peliculas/api
32
Ilustración 19: Ejemplo 1. API películas (Basil)
33
curl http://localhost:8080/basil/peliculas-filtro/docs
3.3.2.4 Análisis
3.3.2.4.1 Documentación
Existe documentación bastante completa en el Wiki del repositorio GitHub Basil
[9] para poder realizar todas las funciones CRUD (Create, Read, Update and
Delete) con nuestras APIs. En la zona de Code del repositorio nos especifican
los pasos a dar para ejecutar la API. Se puede encontrar un pequeño fallo con
el último paso ya que no se especifica en que carpeta situarse para lanzar el
comando. Después de lanzar la aplicación no se especifica que la herramienta
no tiene interfaz gráfica y que los procesos hay que realizarlos siguiendo el
tutorial “curl” (localizado en la sección Wiki) pudiendo causar confusión al
interesado en un primer momento.
3.3.2.4.2 Mantenibilidad
Se puede observar que los ficheros del repositorio están siendo actualizados por
uno de los contribuidores [13]. Basil está pensado para versiones inferiores a
Java 1.8 ya que no se incluyen las dependencias Javax. Conversando con el
desarrollador se ha comentado que se tendrá en cuenta esto para futuras
versiones. Además, se contesta a las dudas planteadas sobre la herramienta,
siendo las respuestas bastante rápidas por experiencia propia. Se puede
determinar que esta herramienta, al contar con un proyecto activo, satisface el
punto de mantenibilidad.
3.3.2.4.3 Interfaz
Esta herramienta no dispone de por sí sola una interfaz gráfica. Para los
usuarios que no cuenten con un sistema operativo Ubuntu les puede ser tedioso
ir creando y modificando los diferentes ficheros. Además, los resultados que se
presentan por la consola cuesta distinguirlos. Para realizar cambios sencillos
puede ser algo laborioso tener que ejecutar líneas largas “curl” pudiendo
cometer errores. Existe una versión con interfaz [12] con funciones muy
limitadas no desarrollada en esta memoria.
3.3.2.5 Complicaciones
3.3.2.5.1 Máquina local
3.3.2.5.1.1 Creación del proyecto con Maven
Descargados los ficheros del repositorio de Basil en GitHub [11] es necesario
construir el proyecto Java con Maven. Para ello hay que situarse en la raíz de
los ficheros descargados de GitHub donde se encuentra “pom.xml”. En las
instrucciones proporcionadas en este repositorio nos indica que se puede
34
generar el proyecto java ejecutando las pruebas ( mvn clean install) u
omitiéndolas (mvn install -DskipTests).
Intentando con la primera opción no se pudo generar el proyecto java
correctamente. Como se puede observar en la siguiente ilustración, el error fue
provocado porque no se pasó todos los test. Se pensó que podría haber algún
error internamente en los test y que eso ha generado el error. Por lo tanto se
intentó con la opción 2, generando el proyecto java omitiendo las pruebas.
35
Ilustración 23: Error creación proyecto con Maven III (Basil)
3.3.2.5.2 Dockerfile
3.3.2.5.2.1 Actualización del repositorio
Para ejecutar la aplicación se encontró , en el directorio /server, un fichero que
se llama “run.sh” que ejecuta el último comando, indicado en las instrucciones
del repositorio Basil [11], para lanzar la aplicación. Funcionaba correctamente
37
en la maquina local con la versión 0.8.0 SNAPSHOT. Cuando se estaba
realizando el Dockerfile se observó que se había actualizado a la versión 0.8.0 y
al ejecutar el script “run.sh”, del directorio /server, lanzaba un error ya que el
fichero “.jar” que se indicaba en el comando era distinto al que se generaba con
Maven. Para solucionar esto se dejó de usar el script “run.sh” que viene con el
repositorio y se creó otro con el ejecutor java puesto correctamente. La versión
que se probó en local ya no existía en el repositorio. Se comprendió que
SNAPSHOT es una versión que está en desarrollo y cuando está finalizado se
sube a los releases del repositorio. La versión que se utilizó finalmente fue el
reléase 0.8.0.
38
El problema se solucionó descargando Connector J (formato .deb) desde el
navegador con wget, instalando el fichero y añadiendo al CLASSHPATH.
3.3.2.7 Conclusión
Basil es una herramienta con mucho potencial que permite crear APIS y tener
todo el control sobre ellas. Almacenando el contenido en nuestra propia base de
datos permite tener un registro del contenido generado y poder acceder de una
manera sencilla a los datos. Poder controlar la vista de los datos resultantes nos
da la posibilidad de relacionar dichos datos con fragmentos HTML para
incrustar dichos fragmentos, por ejemplo en páginas web, sin más
procesamiento. Aunque realizar todas las operaciones desde el terminal pueda
resultar tedioso, si se apunta en un bloc de notas los comandos esenciales,
modificar los SPARQL o cambiar los endpoint no resulta complicado.
39
3.3.3 Puelia
Lamentablemente esta herramienta no ha podido ser probada con éxito por
errores php que aparecen en la salida de la interfaz. Se ha intentado contactar
con el usuario que se encargaba de realizar la mayoría de commits del
repositorio[16] para solventar el problema, pero no ha habido ninguna
respuesta.
En las indicaciones del repositorio Google Code [17] se especifica que se puede
utilizar php 5.2.12 o versiones superiores. Al principio se intentó con la versión
php 7.4.19 Thread Safe (TS) que, por sus características, es ideal para usarlo
en entorno Windows con Apache, además de incluir la librería
“php7apache2_4.dll” que permite las conexiones php con Apache. Se probó con
la versión Apache 2.4 ya que en las indicaciones no se especifica una versión
en concreto a utilizar.
Se tuvo que realizar una serie de cambios en el fichero de configuración
(httpd.conf) para que Apache pudiera trabajar con ficheros php.
Se añadieron las siguientes líneas a la configuración:
AddType application/x-httpd-php .php
LoadModule php5_module C:/php/php5apache2_4.dll
AddHandler application/x-httpd-php .php
PHPIniDir "C:/php"
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
Una vez completada toda la configuración que debe tener el servidor Apache se
continuó con la configuración php. Se debe de tener activadas las extensiones
curl, XML y Memcache. Para las dos primeras librerías solo era necesario
descomentar del fichero php.ini-development las correspondientes extensiones:
extension=curl
extension=xmlrpc
40
extension=memcache
Esto error fue debido a la versión del php. A partir de php 7 es redundante el
uso de unset$(this) para especificar que es ese el objeto a destruir, ya que
método sabe que cuando es invocado es para destruir ese objeto [21].
Eliminando esta línea se pudo solucionar el error aunque se cargó otra página
indicándonos que aún nos queda pasos de configuración:
41
Se comprobó con php -m que las librerías no estaban incluidas en php. No era
suficiente con descomentar las extensiones de php.ini-development. Era
necesario cambiar el nombre de este fichero por “php.ini” y ejecutar php --ini
para instalar las anteriores librerías. Ejecutando de nuevo la aplicación se
obtuvo el siguiente error:
Para intentar corregir el error se utilizó el fichero “logs”, del directorio /log, para
comprobar los valores que obtenían las variables que daban conflicto. Después
de un periodo de investigación y una serie de pruebas no se consiguió solventar
el problema. Con el objetivo de que el flujo continuara y ver si había más errores,
se simulo la variable $cachedObject a true. Al volver a ejecutar la aplicación se
obtuvo el siguiente error:
42
Ilustración 37: index.php (Puelia)
Antes de intentar solucionar este fichero se verificó que las configuraciones php
y Apache estaban correctamente. Se volvió a comprobar los valores de las
variables a través de logs. Tras varias búsquedas para solventar el problema no
se consiguió ninguna solución. Ante esta situación, pensando que era debido a
la versión php 7, se probó con una versión cercana al lanzamiento de los
releases( php 5.5.23 TS). Se volvió a instalar las librerías curl, XML y Memcache.
Desafortunadamente después de repetir todos los pasos anteriores volvió
aparecer exactamente el mismo error que se muestra en la Ilustración 36.
En conclusión, a pesar de que se ha seguido todos los pasos expuestos en la
documentación de la aplicación se ha producido un error php. La falta de
conocimiento manejando este lenguaje fue un gran hándicap. La exploración de
este lenguaje en el tiempo disponible para esta herramienta no fue suficiente.
Se probó diferentes versiones de php y Memcache sin ningún éxito. Ha
dificultado mucho el hecho de que esta herramienta no está siendo mantenida
y no hay soporte ante estos problemas. Además, se ha navegado por los asuntos
abiertos en la sección “Issues” del Google Code [22] para encontrar posibles
soluciones pero sin éxito. Se debería de especificar en la documentación cómo
realizar las configuraciones requeridas en php y Apache, incluyendo las
versiones exactas, para así solventar este tipo de problemas.
43
3.3.4 Trellis
3.3.4.1 Configuración
Como se comentó en la sección del estado del arte, los recursos de esta
herramienta se gestionan con métodos HTTP estándar: : POST (crear), PUT
(modificar/crear), GET (obtener), PATCH (conjunto de modificaciones) DELETE
(eliminar). Además, OPTIONS se utilizan para determinar las capacidades de
un recurso determinado.
44
Utilizando PUT:
También es posible crear recursos con PUT siguiendo la mismas indicaciones
que en POST. Pero es posible que al crear los recursos con PUT se produzcan
desconexiones en la asociación de los recursos ya que los contenedores
intermedios no se generan de forma automática[39] . Por ello, es recomendable
siempre usar POST
Utilizando PUT:
Para realizar las modificaciones es necesario que el nuevo tipo de recurso sea
subtipo del recurso que se esta modificando. En caso de que no sean del mismo
tipo, Trellis lanza un error.
45
Ilustración 38: Docker-compose.yml Trellis
3.3.4.2.2 Ejecución
Para ejecutar el docker-compose.yml se debe de ejecutar el siguiente comando
en el directorio donde se encuentre el fichero:
docker-compose up
46
Ilustración 40: Contenedores trellisldp y postgres (Trellis)
Ya se podría utilizar la API de Trellis a través del comando curl desde una
terminal. La instalación del terminal y uso del comando curl se especifica en el
apartado 3.2. Los comandos necesarios para interactuar con la API se explican
en el apartado 3.6.1.
3.3.4.3 Ejemplos
3.3.4.3.1 Creación de recursos LDP-RS y LDP-NRS (contenedor básico)
El objetivo es almacenar recursos del usuario Pablo. En este caso el usuario
tiene información sobre su persona y una foto de perfil. Es necesario utilizar
para cumplir estos campos un recurso RDF y una imagen (no RDF)
respectivamente.
1. Creación contenedor básico para el usuario Pablo:
curl -s http://localhost:8080 -XPOST -H"Slug: pablo" -H"Link:
<http://www.w3.org/ns/ldp#BasicContainer>; rel=\"type\"" -H"Content-Type:
text/turtle" --data-binary @recursos/pablo.ttl
47
Contenido del fichero informacion.ttl:
@prefix dc: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
<> a foaf:PersonalProfileDocument;
foaf:primaryTopic <#me> ;
dc:title 'Informacion Pablo' .
<#me> a foaf:Person;
foaf:name 'Pablo';
foaf:lastName 'Sanchez';
foaf:interest 'Le apasiona la ingeniería y el futbol' .
48
Contenido del fichero editorial.ttl:
PREFIX ldp: <http://www.w3.org/ns/ldp#>
PREFIX dc: <http://purl.org/dc/terms/>
<> a ldp:BasicContainer ;
dc:title "Contenedor Editorial" .
<#info> a bo:Book;
bo:description 'Narra las aventuras de unos Hobbits para destruir un
anillo'.
3.3.4.4 Análisis
3.3.4.4.1 Documentación
La información que se proporciona en el repositorio GitHub de Trellis [26] es
bastante completa. Se dispone en el repositorio de un Wiki [4], de un grupo de
discusión [29] y de un Java Docs [30] de la API. Además, en el directorio raíz del
repositorio [31] se puede encontrar otros repositorios relacionados con Trellis.
Por ejemplo, existe un repositorio que permite realizar pruebas [32] al servidor
Trellis creando diferentes tipos de contenedores y otro que permite crear
vocabularios [33].
3.3.4.4.2 Mantenibilidad
Se puede comprobar que la herramienta cuenta con actualizaciones constantes
y recientes. Hay varias versiones de contenedores Trellis disponibles en Docker
Hub [28]. El grupo de discusión tiene temas de conversación recientes y con
respuestas bastantes rápidas por parte de la comunidad, pudiendo comprobar
esto último por experiencia propia. Por todo ello se puede concluir que Trellis
satisface el criterio de mantenibilidad.
3.3.4.4.3 Interfaz
Trellis se gestiona exclusivamente desde el terminal de comandos a través de
solicitudes HTTP con el comando “curl”. Al igual que Basil, esto puede ser algo
tedioso ya que gestionar todo desde el terminal puede provocar errores por
pequeños fallos en las instrucciones. Esto se puede mejorar si se utiliza editores
de texto y solo se usa el terminal para ejecutar estos ficheros. Trellis presenta
una pequeña interfaz básica donde solo se puede observar las tripletas de los
contenedores creados y navegar por los enlaces.
50
3.3.4.5 Complicaciones
3.3.4.5.1 Máquina local
Al realizar pruebas de la API se observó que el mínimo error de sintaxis produce
errores en el comando curl. Se debe de distinguir bien comillas simples y dobles,
las barras “\” deben estar bien orientadas, los puntos finales situados
correctamente...Por experiencia, es mejor utilizar un fichero “.sh” con algún
editor de textos (Notepad o Visual Studio Code) para visualizar mejor los
comandos. Después ejecutarlo desde el terminal con ./nombrefichero.sh
3.3.4.5.2 Docker-compose
Utilizar el docker-compose.yml que viene en la documentación del Wiki de
Trellis [27] provocó un error de autenticación. Al no localizar las credenciales se
contactó con uno de los desarrolladores. Se me proporciono unas credencias
estándares para lanzar la aplicación. Poniendo los datos proporcionados en los
campos “database”, “username” y “password” la aplicación se lanzó
correctamente.
51
3.3.4.7 Conclusión
Trellis es una herramienta con mucho potencial ideal para almacenar una gran
cantidad de datos. La forma de organizar los recursos, al principio, es algo
complejo de entender, pero luego se comprende bastante bien su estructura. Es
muy útil para relacionar diferentes tipos de datos, de la realidad o abstractos, a
través de recursos RDF, binarios, imágenes, HTML....Otro punto positivo es su
flexibilidad de definir la formación de tripletas y la generación automática de
estas en los recursos definidos. La información que se posee para utilizar la
herramienta es muy amplia, sigue las especificaciones de plataforma de datos
enlazados [36] (LDP) y los estándares HTTP [39]. Se ha intentado resumir las
especificaciones más relevantes de esta herramienta para facilitar el
entendimiento de su uso, usando ejemplos básicos que representan recursos de
la vida real. Además, es una herramienta que cuenta con bastante soporte y
que presenta actualizaciones bastantes recientes lo que permite mejorar el uso
de la API y el potencial.
52
4 Conclusiones
4.1 Resultados
La creación de herramientas que permite generar el entorno necesario para el
lanzamiento de las APIs REST propuestas, a partir de ontologías y grafos de
conocimientos, han sido el resultado del desarrollo del proyecto. Estas
herramientas han sido desarrolladas utilizando contenedores Docker,
simplificando el lanzamiento de estas APIs y utilizando la menor cantidad de
recursos posibles para su funcionamiento. Se ha podido desarrollar
herramientas de lanzamiento para las APIs Pubby, Basil y Trellis. No se ha
logrado desarrollar la API Puelia debido a errores documentados en la sección
3.3.3.
Con el desarrollo de las herramientas se ha proporcionado la visión de un
desarrollador que está interesado en utilizar las APIs por primera vez, reflejando
los problemas que puede encontrarse una persona sin experiencia. Se ha
documentado las configuraciones necesarias para el funcionamiento de las APIs
de una forma sencilla y que permite una mejor comprensión inicial.
Además se ha obtenido un estudio de cada API desarrollada, realizando un
análisis, reflejando el estado de su documentación, mantenibilidad, interfaz e
incluyendo una serie de propuestas de mejora.
53
4.3 Líneas futuras
Creo que las APIs en el campo de Linked Data es una de las herramientas más
potentes y útiles para un futuro, que nos puede ayudar a desarrollar diversas
aplicaciones que pueden ser utilizadas en diferentes áreas (sanidad,
entretenimiento, información...). Siguiendo la dinámica del proyecto, creo que
es una buena idea Dockerizar el lanzamiento de APIs, ya que aún existe
muchas que necesitan una revisión de su estado al tener varios años desde su
creación. De esta forma se puede incentivar su uso por parte de nuevos
desarrolladores ya que permite probar y entender su funcionamiento de una
manera más sencilla.
54
5 Análisis de Impacto
Analizando los 17 objetivos [41] de desarrollo sostenible que se han
comprometido 193 países, incluyendo España, este proyecto se puede
relacionar con algunos de ellos. Este proyecto no tiene un gran valor
significativo en relación con los objetivos que se describen después. Existe una
pequeña, muy pequeña, relación que, a lo mejor con mayor desarrollo de este
proyecto y cogiendo la idea principal (ahorro de tiempo), puede causar un
impacto mayor al actual. Como ya se ha comentado anteriormente, uno de los
objetivos de este proyecto es realizar herramientas que desplieguen las APIs de
una manera conjunta, aportando las configuraciones más relevantes. Esto
permite que el usuario interesado pueda ahorrarse mucho tiempo de
investigación y preparación del entorno de lanzamiento de las APIs por primera
vez. Este ahorro de tiempo podría traducirse en ahorro de energía eléctrica al
reducir el uso del equipo informático, en comparación de si no contará con las
herramientas que proporciona este proyecto. Por ello se podría relacionar con el
objetivo 7 “Energía asequible y no contaminante” [42]. Más concretamente se
podría asociar a la meta 7.3 “Eficiencia energética”, que tiene como finalidad
“duplicar la tasa mundial de mejora de la eficiencia energética hasta 2030”.
Claramente esta meta es muy global y se habla de una gran cantidad de energía,
que no tiene ni punto de comparación con lo que consume un equipo
informático. Pero si se extrae la idea general, usar contenedores Docker usando
versiones lo más ligeras posibles, cuando se necesite entornos de trabajo que
requiera muchas aplicaciones externas, usando los contenedores, el consumo
de energía sería algo más eficiente. También puede relacionarse con el objetivo
8 “Trabajo decente y crecimiento económico” [43]. Observando todas las metas
que tiene este objetivo se podría asociar con la meta 8.2 “Diversificación,
tecnología e innovación”. Esta meta intenta incrementar la productividad
económica modernizando los medios tecnológicos y la innovación. Ocurre
exactamente lo mismo que lo explicado anteriormente, el proyecto actual no
tiene mucho peso con lo descrito pero la idea fundamental, uso de contenedores
Docker y aportación de documentación para ayudar a los desarrolladores,
puede surgir nuevas ideas tecnológicas que cause mayor productividad en la
economía.
55
6 Bibliografía
[1]: Web oficial Pubby:
http://wifo5-03.informatik.uni-mannheim.de/pubby/
[5]: Web datos.gob “Pubby y LODI, abriendo los datos enlazados a los
humanos”:
https://datos.gob.es/es/blog/pubby-y-lodi-abriendo-los-datos-enlazados-los-
humanos
56
[18]: Repositorio GitHub Memcache:
https://github.com/nono303/PHP-memcache dll/blob/master/vc15/x64/ts/php-
7.4.x_memcache.dll
[21]: Web Stackoverflow. Cuestión “fatal error cannot unset this php 7.1”:
https://es.stackoverflow.com/questions/115553/fatal-error-cannot-unset-this-php-
7-1
[23]: Paola Espinoza, 2021. Tesis “Crossing the Chasm Between Ontology
Engineering and Application Development: A Survey”.
57
[36]: Web oficial w3.org. Estándares de plataforma de datos enlazados:
https://www.w3.org/TR/ldp/
59
Este documento esta firmado por
Firmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,
C=ES
Fecha/Hora Thu Jun 03 15:14:55 CEST 2021
Emisor del [email protected], CN=CA Facultad de
Certificado Informatica, O=Facultad de Informatica - UPM, C=ES
Numero de Serie 630
Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (Adobe
Signature)