Breve introducción a la programación de la Web Semántica, Material: El ejemplo es del libro John Hebeler, Matthew Fisher, Rayn Blace and Andrew Perez-Lopez. “Semantic Web Programming” 2009 Wiley Publishing, Inc
2. Contenido del Curso
Unidad 1. Introducción a la programación
de la Web Semántica
Unidad 2. Modelado Información
Unidad 3. Construyendo Aplicaciones
para la Web Semántica
2
4. Bibliografía
Parte del material de este curso está basado en el siguiente
libro,
John Hebeler, Matthew Fisher, Rayn Blace and Andrew
Perez-Lopez. “Semantic Web Programming” 2009 Wiley
Publishing, Inc
Asimismo, se recomienda como bibliografía complementaria
los siguientes
Toby Segaran, Colin Evans, and Jamie Taylor.
Programming the Semantic Web. 2009 O’REILLY.
Bob DuCharme. “Learning SPARQL. Querying and
Updating with SPARQL 1.1.” 2013. O’REILLY. Second
Edition
Dean Allemang. James Hendler. “Semantic Web for the
Working Ontologist. Modeling in RDF, RDFS and OWL.”
2008 Morgan Kaufmann publications.
Griogoris Antoniou and Frank van Harmelen. “A Semantic
Web Primer.” Second edition. 2008. The MIT’Press
4
6. WWW Actual
Contenido no estructurado
Enlaces
Web
Es un conjunto de documentos
Información esta expresada en Lenguaje Natural.
Falta de estructura semántica
La información es Interpretado por los humanos
Se asume que los usuarios finales pueden
reconocer el significado y sacar conclusiones e
inferir nueve conocimiento utilizando el contexto y
entender el conocimiento relacionado
Información recuperada por los motores de
búsquedas
Es un gran repositorio de información
Desafíos de la Web
Heterogénea. La presentación
de los datos son presentados
en forma diferentes
Masiva. Gran cantidad de
información
Cambia rápido
Hecha por humanos
Cómo puede un agente o
computador entender esta
Web?
Imágenes
6
7. Agentes o Computadores entender
la Web?
Cosa
Nombre
Ubicación
Estado
….
Jose
José Pérez
15/10/94
Mérida
JuanTrabaja con
ULA
Universidad de los Andes
Mérida
Nucleó Mérida
….
Trabaja
en
Trabaja
en
Tener un lenguaje que permita
especificar recursos y sus relaciones
Lenguaje sea procesado por el
computador
Consultar los datos mediante s
aplicaciones o agentes
Lenguaje de consulta que sea
procesable por el computador
7
8. ¿Qué es la Web Semántica?
“El primer paso es colocar los datos en la
Web de un modo que las máquinas
puedan entenderlos naturalmente o
convertirlos a esa forma. Esto crea lo que
yo llamo la Web Semántica: una red de
datos que pueden ser procesados
directa o indirectamente por máquinas”
Tim Beners-Lee
“La Web Semántica es una extensión
de la Web en la cual la información se
da mediante un significado bien
definido, lo que facilita que los
ordenadores y la gente trabajen en
cooperación”
Linked data es otro
nombre para la red de
datos
8
9. ¿Qué es la Web Semántica?
Web Semántica
Definición
Origen Componentes Características
LD
Teoría de Grafo WS Herramientas WS
Declaración
Lenguajes
Ontologías
Instancias
Frameworks
IDE
Razonadores
KB
Expresividad
Inferencia
Integración
Unicidad
Fuente: [John Hebeler, Matthew Fisher, Ryan Blace, Andrew Perez-Lopez, Mike Dean. Semantic
Web Programming]
9
10. Comparación de WWW y WS
Características WWW WS
Componente
fundamental
Contenido no
estructurado
Declaraciones formales
Audiencia Humanos Aplicaciones
Enlaces Indica ubicación Indica ubicación y
significado
Vocabulario Instrucciones
Formateada
Semántica y lógica
Lógica Informal/No estándar Lógica descriptiva
Fuente: [John Hebeler, Matthew Fisher, Ryan Blace, Andrew
Perez-Lopez, Mike Dean. Semantic Web Programming]
10
11. Arquitectura de la Semántica
Semántica Web
Inferencias
Ontologías
Lenguajes
Instancias
RDF RDF-S OWL
SPARQLXML
Esta compuesta por
Se basa en dos puntos fundamentales
La descripción del significado
La manipulación automática de
estas descripciones
La descripción del significado se articula con
Semántica
MetaDatos
Ontologías
La manipulación se efectúa mediante
Lógica
Motores de inferencias
11
12. Visión de la Infraestructura
de la Web
12
https://www.w3.org/
13. Linked Data
“Los Datos Enlazados es la forma que tiene la Web
Semántica de vincular los distintos datos que están
distribuidos en la Web”
(http://www.w3c.es/Divulgacion/GuiasBreves/LinkedD
ata)
13
Describe la forma de
exponer, compartir y
conectar piezas de
datos, información y
conocimiento a través
de la Web
Permite construir la
Web de Datos
14. Open Data
Open Data es una forma de publicar datos de
organizaciones públicas y privadas, en formatos que
sean reutilizables por personas e instituciones
Según Wikipedia: Open Data es una filosofía que
persigue que determinados datos estén disponibles de
forma libre a todo el mundo, sin restricciones de
copuright, patetes u otros mecanismos de control
14
15. Las cinco estrellas de Open
Linked Data
Una estrella: ofrece los datos en
cualquier formato.
Dos estrellas: entregar los datos de
manera estructurada
Tres estrellas: entregar los datos en
un formato que no sea propietario
Cuatro estrellas: usar URI para
identificar cosas y propiedades,
de manera que se pueda apuntar
a los datos.
Cinco estrellas: vincular sus datos
con los de otras personas,
dotándolos de contexto
15
16. Ejemplo de Linked Data16
BBC utiliza tecnologías semánticas basadas en los
principios de Linked Data:
BBC Music -> Música
BBC Programmes -> Programas
BBC Wildlife Finger -> Fauna Salvaje
17. Aplicaciones de la Web
Semántica
Los campos de aplicaciones de la Web Semántica son
utilizados en diferentes dominios
Las redes sociales, los blogs y las plataformas
comunitarias (por ejemplo: Flickr, Facebook)
La búsqueda o la clasificación bibliográfica o
documental
La búsqueda de información en Internet o Intranet
La búsqueda de información en la empresa.
La industria, la investigación u el desarrollo
especialmente en los dominios de tecnologías
Comercio/Comercio electrónico: especialmente
mediante la ontología “GoodRelation”
17
18. En resumen la Web Semántica
Se basa en dos puntos fundamentales
La descripción del significado
La manipulación automática de estas descripciones
Dos grandes disciplinas contribuyen a la Web Semántica
Teoría de grafos, que es el corazón de la Web Semántica, el cual
representa los conceptos y sus relaciones.
Lógica Descriptiva, el cual es el formalismo basados en lógica para la
representación del conocimiento, es decir describe al dominio en función
de conceptos, Relaciones e individuos
La Web Semántica ofrece una nueva manera de crear y compartir
información.
Las definiciones de declaraciones, permite al proceso de información realizar
inferencias y validación
18
19. Unidad 1. Sección 2.
Introducción a la
programación de la
Web Semántica
19
20. Framework de la Web
Semántica
Framework de la Web Semántica
Almacenamiento
Acceso
Inferencia
Fuente: [John Hebeler, Matthew Fisher, Ryan Blace, Andrew Perez-Lopez, Mike Dean. Sem
Web Programming]
20
21. Frameworks Web Semántica
Hay varios Framework para la Web Semántica pero los más usados son:
Jena Semantic Web Framework (http://jena.apache.org/) para
Java. Posee una interfaz SPARQL, APIs de RDF y OWL, soporta
inferencia, tiene múltiple almacenamiento y mecanismo de
razonamiento y también permite la integración de otros
mecanismos de razonamiento
Sesame Semantic Web Framework y servidor (http://rdf4j.org/).
Posee una interfaz SPARQL y una interfaz servidor HTTP. Posee
multiple almacenamiento y mecanismo de razonamiento y tambien
permite la integración de otros mecanismos de razonamiento
Otros Frameworks son los siguientes:
OWL API (http://owlapi.sourceforge.net/) para Java. Posee API OWL
que es contruido sobre el formato funcional de OWL 2 y contiene
una interfaz común interfaz para mecanismos de razonamiento
21
22. Frameworks Web Semántica
Otros Frameworks son los siguientes:
4Suite (http://4suite.org/) es un código abierto de XML y RDF, las
librerías de procesamiento para PYTHON.
RAP RDF API (http://wifo5-03.informatik.uni-
mannheim.de/bizer/rdfapi/). Es un códico abierto de API RDF y
un software para almacenar, consultar, y manipular RDF en PHP
Redland (http://librdf.org/). Colección de librerias de RDF para C.
con interfaz para otros lenguajes. Posee API RDF. Parser y una
interfaz de consultas
LinqToRDF (https://code.google.com/archive/p/linqtordf/) para
.NET construido sobre el Microsoft Language-Integrated Query
(LINQ)
22
23. Almacenamiento de RDF
AllegroGraph(http://franz.com/agraph/allegrograph): esta
disponible para implementación java y Lisp y posee una interfaz
SPARQL y razonamiento basado en RDFS
Mulgara (http://www.mulgara.org ): Esto es un código abierto,
almacenamiento RDF en Java con un procesador de consulta
SPARQL
OpenLink Virtouso (https://www.w3.org/wiki/VirtuosoUniversalServer)
Posee código abierto y una versión comercial de basado RDB para
el almacenamiento RDF. Posee SPARQL dentro SQL como método
de consulta de datos RDF
23
24. Almacenamiento de RDF
Oracle 11g (http://www.oracle.com): Soporte para RDF y
reglas en Oracle Database. También soporta un
subconjunto de OWL, transacciones y seguridad
OWLIM (https://www.w3.org/2001/sw/wiki/Owlim): Esto es un
código abierto, almacenamiento RDF en Java y soporta
inferencia usando RDFS y un subconjunto OWL
Parliament (http://parliament.semwebcentral.org) :
implementación en C++ para el almacenamiento RDF
24
25. Motores de Razonamiento
FaCT++ (http://owl.man.ac.uk/factplusplus ): C++
que soporta un subconjunto OWL DL
Hermit (http://www.hermit-reasoner.com ): es un
razonador OWL. Se puede integrar en Protégé y
aplicaciones Java usando el OWL API
KAON2 (http://kaon2.semanticweb.org) : Java para
realizar razonamiento en ontologías OWL DL.
25
26. Motores de Razonamiento
Pellet (https://www.w3.org/2001/sw/wiki/Pellet) : es un
razonador en Java que soporta OWL DL, OWL
incluyendo OW2.
RacerPro (http://franz.com/agraph/racer): es un
razonador comercial que soporta un gran subconjunto
OWL DL.
Vampire (http://kaon2.semanticweb.org) : es un
razonador comercial, para realizar razonamiento en
ontologías OWL DL.
26
27. Jena Semantic Web Framework
Este Framework proporciona un entorno de
programación para RDF, RDFS y OWL, SPARQL e
incluye un motor de inferencia basado en reglas.
Esta compuesto por:
Una API RDF y OWL que permite crear y poblar
modelos RDF.
Leer y escribir RDF en formato RDF/XML, N3 y
N-Triples.
Un motor de persistencia en memoria y disco.
Consultar modelos usando tanto el lenguaje
propietario RDQL como SPARQL
Razonar sobre ontologías bien a través de
motores de reglas o razonamiento OWL
27
28. Ambiente de Desarrollo para la Web
Semántica
Editor de Ontología
Clases Instancias
Ontologías
Proyecto Código
Consola
I.D:E
Razonador Framework Web Semántica
Motor de búsqueda
Almacenamiento
Administrador de
Ontologías
Razonador
Motor de reglas
D.I.G.
Jar
28
37. Ejecutar Consulta 2
private void populateFOAFFriends(){
_friends = ModelFactory.createOntologyModel();
InputStream inFoafInstance =
FileManager.get().open("Ontologies/FOAFFriends.rdf");
_friends.read(inFoafInstance,defaultNameSpace);
}
private void myFriends(Model model){
runQuery(" select DISTINCT ?myname ?name where{ people:me foaf:knows ?friend. ?friend foaf:name
?name } ", model);
}
public static void main(String[] args) throws
IOException {
HolaWebSemantica hello = new
HolaWebSemantica();
//Load my FOAF friends
hello.populateFOAFFriends();
// Say Hello to my FOAF Friends
System.out.println("nSay Hello to my FOAF
Friends");
hello.myFriends(hello._friends);
}
Cargar la ontología
Consulta
Programa principal
Say Hello to my FOAF Friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Salida
37
38. people:Individual_5 rdf:type people:Individual .
people:Individual_5 people:hasName “Sem Web”.
people:Individual_5 people:hasfriends Individual_6 .
people:Individual_5 people:hasfriends Individual_7.
people:Individual_6 people:hasfName “Web O. Data” .
people:Individual_7 people:hasfName “Mr. OWL” .
Amigos adicionales desde diferente fuente, con vocabulario diferente
people:Individual
people:hasfriends
people:hasName
people:hasName
People:Individual
people:Individual_5
rdf:type
people:Individual_7
people:Individual_6
people:hasfriends
people:hasfriends
“Sem Web”
people:hasName
“Mr. OWL”
rdf:type
rdf:type
“Web O. Data”
people:hasNam
e
Instancia
Esquema
Agregar otra fuente de información38
39. Agregar nuevos amigos
private void populateNewFriendsSchema() throws IOException {
InputStream inFoafInstance = FileManager.get().open("Ontologies/additionalFriendsSchema.owl");
_friends.read(inFoafInstance,defaultNameSpace);
inFoafInstance.close();
}
public static void main(String[] args) throws IOException {
HolaWebSemantica hello = new HolaWebSemantica();
//Load my FOAF friends
hello.populateFOAFFriends();
// Say Hello to my FOAF Friends
System.out.println("nSay Hello to my FOAF Friends");
hello.myFriends(hello._friends);
//Add my new friends
System.out.println("nadd my new friends");
hello.populateNewFriends();
//Say hello to my friends - hey my new ones are missing?
System.out.println("nSay hello to all my friends - hey the
new ones are missing!");
hello.myFriends(hello._friends);
}
Say Hello to Myself
Hello to Semantic Web
Say Hello to my FOAF Friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
add my new friends
Say hello to all my friends - hey the new
ones are missing!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
39
41. ¿Porque no se muestra los
amigos adicionales?
private void populateNewFriendsSchema() throws IOException {
InputStream inFoafInstance = FileManager.get().open("Ontologies/additionalFriendsSchema.owl");
_friends.read(inFoafInstance,defaultNameSpace);
inFoafInstance.close();
}
public static void main(String[] args) throws IOException {
HolaWebSemantica hello = new
HolaWebSemantica();
//Load my FOAF friends
hello.populateFOAFFriends();
// Say Hello to my FOAF Friends
System.out.println("nSay Hello to my FOAF Friends");
hello.myFriends(hello._friends);
//Add my new friends
System.out.println("nadd my new friends");
hello.populateNewFriends();
//Say hello to my friends - hey my new ones are
missing?
System.out.println("nSay hello to all my friends - hey
the new ones are missing!");
hello.myFriends(hello._friends);
}
Say Hello to Myself
Hello to Semantic Web
Say Hello to my FOAF Friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
add my new friends
Say hello to all my friends - hey the new ones are
missing!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
41
42. private void populateFOAFSchema() throws IOException{
InputStream inFoaf2;
try (InputStream inFoaf = FileManager.get().open("Ontologies/foaf.rdf")) {
inFoaf2 = FileManager.get().open("Ontologies/foaf.rdf");
schema = ModelFactory.createOntologyModel();
schema.read(inFoaf, defaultNameSpace);
_friends.read(inFoaf2, defaultNameSpace);
}
inFoaf2.close();
}
public static void main(String[] args) throws IOException {
//Add my new friends
System.out.println("nadd my new friends");
hello.populateNewFriends();
//Say hello to my friends - hey my new ones are missing?
System.out.println("nSay hello to all my friends - hey the
new ones are missing!");
hello.myFriends(hello._friends);
// Add the ontologies
System.out.println("nAdd the Ontologies");
hello.populateFOAFSchema();
hello.populateNewFriendsSchema();
//See if the ontologies help identify my new friends?
Nope!
System.out.println("nSee if the ontologies help to say
hello to all my friends - Nope!");
hello.myFriends(hello._friends);
}
Say Hello to Myself
Hello to Semantic Web
Say Hello to my FOAF Friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
add my new friends
Say hello to all my friends - hey the new ones are
missing!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Add the Ontologies
See if the ontologies help to say hello to all my
friends - Nope!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Agregando el nuevo Esquema
Sigue sin mostrar los
amigos adicionales
¿Por qué?
42
45. private void addAlignment(){
// State that :individual is equivalentClass of foaf:Person
Resource resource = schema.createResource(defaultNameSpace + "Individual");
Property prop = schema.createProperty("http://www.w3.org/2002/07/owl#equivalentClass");
Resource obj = schema.createResource("http://xmlns.com/foaf/0.1/Person");
schema.add(resource,prop,obj);
//State that :hasName is an equivalentProperty of foaf:name
resource = schema.createResource(defaultNameSpace + "hasName");
//prop = schema.createProperty("http://www.w3.org/2000/01/rdf-schema#subPropertyOf");
prop = schema.createProperty("http://www.w3.org/2002/07/owl#equivalentProperty");
obj = schema.createResource("http://xmlns.com/foaf/0.1/name");
schema.add(resource,prop,obj);
//State that :hasFriend is a subproperty of foaf:knows
resource = schema.createResource(defaultNameSpace + "hasFriend");
prop = schema.createProperty("http://www.w3.org/2000/01/rdf-schema#subPropertyOf");
obj = schema.createResource("http://xmlns.com/foaf/0.1/knows");
schema.add(resource,prop,obj);
//State that sem web is the same person as Semantic Web
resource =
schema.createResource("http://org.semwebprogramming/chapter2/people#me");
prop = schema.createProperty("http://www.w3.org/2002/07/owl#sameAs");
obj =
schema.createResource("http://org.semwebprogramming/chapter2/people#Individual_5");
schema.add(resource,prop,obj);
}
Función de Alineación45
46. public static void main(String[] args) throws IOException {
HolaWebSemantica hello = new HolaWebSemantica();
//Add my new friends
System.out.println("nadd my new friends");
hello.populateNewFriends();
//Say hello to my friends - hey my new ones are
missing?
System.out.println("nSay hello to all my friends - hey the
new ones are missing!");
hello.myFriends(hello._friends);
// Add the ontologies
System.out.println("nAdd the Ontologies");
hello.populateFOAFSchema();
hello.populateNewFriendsSchema();
//See if the ontologies help identify my new friends?
Nope!
System.out.println("nSee if the ontologies help to say
hello to all my friends - Nope!");
hello.myFriends(hello._friends);
//Align the ontologies to bind my friends together
System.out.println("nOk, lets add alignment statements
for the two ontologies.");
hello.addAlignment();
//Now say hello to my friends - nope still no new friends!
System.out.println("nTry again - Hello to all my friends -
nope still not all!");
hello.myFriends(hello._friends);
}
add my new friends
Say hello to all my friends - hey the new ones are
missing!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Add the Ontologies
See if the ontologies help to say hello to all my
friends - Nope!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Ok, lets add alignment statements for the two
ontologies.
Try again - Hello to all my friends - nope still not
all!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Sigue sin mostrar los
amigos adicionales
¿Por qué?
Alineando46
47. private void bindReasoner(){
Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
reasoner = reasoner.bindSchema(schema);
inferredFriends = ModelFactory.createInfModel(reasoner, _friends);
}
public static void main(String[] args) throws
IOException {
HolaWebSemantica hello = new
HolaWebSemantica();
………
//Align the ontologies to bind my friends
together
System.out.println("nOk, lets add alignment
statements for the two ontologies.");
hello.addAlignment();
//Now say hello to my friends - nope still no new
friends!
System.out.println("nTry again - Hello to all my
friends - nope still not all!");
hello.myFriends(hello._friends);
//Run reasoner to align the instances
System.out.println("nRun a Reasoner");
hello.bindReasoner();
System.out.println("fFinally- Hello to all my
friends!");
hello.myFriends(hello.inferredFriends);
}
Add the Ontologies
See if the ontologies help to say hello to all my
friends - Nope!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Ok, lets add alignment statements for the two
ontologies.
Try again - Hello to all my friends - nope still not
all!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Run a Reasoner
Finally- Hello to all my friends!
Hello to I. M. Ontology
Hello to Ican Reason
Hello to Makea Statement
Hello to Mr. Owl
Hello to Web O. Data
Invocando el razonador47
49. public static void main(String[] args) throws
IOException {
HolaWebSemantica hello = new
HolaWebSemantica();
………
//Align the ontologies to bind my friends
together
System.out.println("nOk, lets add alignment
statements for the two ontologies.");
hello.addAlignment();
//Now say hello to my friends - nope still no new
friends!
System.out.println("nTry again - Hello to all my
friends - nope still not all!");
hello.myFriends(hello._friends);
//Run reasoner to align the instances
System.out.println("nRun a Reasoner");
hello.bindReasoner();
System.out.println("fFinally- Hello to all my
friends!");
hello.myFriends(hello.inferredFriends);
System.out.println("nEstablishing a restriction
to just get email friends");
hello.setRestriction(hello.inferredFriends);
hello.myEmailFriends(hello.inferredFriends);
}
Add the Ontologies
See if the ontologies help to say hello to all my
friends - Nope!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Ok, lets add alignment statements for the two
ontologies.
Try again - Hello to all my friends - nope still not
all!
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Run a Reasoner
Finally- Hello to all my friends!
Hello to I. M. Ontology
Hello to Ican Reason
Hello to Makea Statement
Hello to Mr. Owl
Hello to Web O. Data
Establishing a restriction to just get email friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Ejecutando la restricción49
51. public static void main(String[] args) throws
IOException {
HolaWebSemantica hello = new
HolaWebSemantica();
………
//Now say hello to my friends - nope still no new
friends!
System.out.println("nTry again - Hello to all my
friends - nope still not all!");
hello.myFriends(hello._friends);
//Run reasoner to align the instances
System.out.println("nRun a Reasoner");
hello.bindReasoner();
System.out.println("fFinally- Hello to all my
friends!");
hello.myFriends(hello.inferredFriends);
System.out.println("nEstablishing a restriction
to just get email friends");
hello.setRestriction(hello.inferredFriends);
hello.myEmailFriends(hello.inferredFriends);
System.out.println("nSay hello to my gmail
friends only");
hello.runJenaRule(hello.inferredFriends);
hello.myGmailFriends(hello.inferredFriends);
}
Run a Reasoner
Finally- Hello to all my friends!
Hello to I. M. Ontology
Hello to Ican Reason
Hello to Makea Statement
Hello to Mr. Owl
Hello to Web O. Data
Establishing a restriction to just get email friends
Hello to Makea Statement
Hello to Ican Reason
Hello to I. M. Ontology
Say hello to my gmail friends only
Hello to Makea Statement
Hello to I. M. Ontology
Definiendo reglas51
52. Porque el Señor da la sabiduría;
conocimiento y ciencia brotan de sus
labios. - Proverbios 2:6
52
53. Bibliografía
Web Semántica: la aplicaciones actuales (Consultado
en marzo de 2016 http://es.ccm.net/faq/7082-web-
semantica-las-aplicaciones-actuales)
John Hebeler, Matthew Fisher, Ryan Blace, Andrew
Perez-Lopez, Mike Dean. Semantic Web Programming
Guía Breve de Linked Data. (Consultado en marzo de
2016 )
53