Máster Bioinformática UM 2016 - 2017
1.- Usar URIs (Uniform Resource Identifier) para identificar entidades
2.- Usar URIs que son accesibles mediante el protocolo HTTP, para que usuarios o agentes automáticos puedan acceder a las entidades
3.- Cuando se acceda a la entidad, proveer datos sobre la entidad en formatos estándar y abiertos, como RDF (Resource Description Framework)
4.- Añadir en los datos que publicamos en RDF enlaces a las URIs de otras entidades, de modo que un usuario o agente pueda navegar por la red de datos y descubrir más datos que también siguen los principios Linked Data
OntologÃas (ej. Gene Ontology)
Datos Enlazados (Linked Data)
Vocabulario de anotación
Razonamiento automático
Life Sciences Semantic Web
Todas las entidades del grafo se identifican mediante URIs
Â
URI: Uniform Resource Identifier (≠URL!). Identifica recursos
Â
URL: Uniform Resource Locator. Una URI que indica la localización fÃsica de un recurso en la red
Â
Los sujetos y predicados sólo pueden ser recursos (URIs)
Â
Algunos objetos pueden ser valores literales (Cadenas de caracteres)
Â
Los valores literales pueden tener tipo (XML Schema datatypes)
Agrupar recursos en clases
RDF usa namespaces para "agrupar" URIs
Â
Namespaces se pueden abreviar/expandir mediante prefix
Â
PREFIX dbpedia:<http://dbpedia.org/resource/>
Â
dbpedia:Donostia = http://dbpedia.org/resource/Donostia
dbpedia:Ataun = http://dbpedia.org/resource/Ataun
...
Â
RDF |
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
RDFS |
http://www.w3.org/2000/01/rdf-schema# |
OWL |
http://www.w3.org/2002/07/owl# |
Vocabulario: informalmente, colección definida de URIs, normalmente bajo un mismo namespace
Â
Vocabularios "reservados" (definen lenguajes)
rdf:type = http://www.w3.org/1999/02/22-rdf-syntax-ns#type
La mayorÃa de los vocabularios son ontologÃas
Â
Definen propiedades generales de los datos que queremos publicar:
Â
foaf:person dbpedia-ont:city dc:book ...
RDF es un modelo de datos
Â
Ese modelo abstracto se puede representar con diferentes sintaxis: "Serializar" (escribir) en un archivo
Â
Una de esas sintaxis es RDF/XML
Â
No confundir el modelo con la sintaxis: ¡RDF es mucho más que un archivo XML!
RDF/XML (http://www.w3.org/TR/rdf-syntax-grammar/)
JSON-LD (https://www.w3.org/TR/json-ld/)
RDFa (http://www.w3.org/TR/rdfa-core/)
Turtle (http://www.w3.org/TR/turtle/)
Â
Escribir este modelo RDF en un archivo turtle
1) Texto plano (TTL)
Â
2) Convertir de turtle a RDF/XML (​http://www.easyrdf.org/converter)
Â
3) Visualizar en validador W3C
Prefixes:
Â
um: <http://um.es/resource/>
uniprot: <http://uniprot/ontology/prop/>
go: <http://geneontology/>
rdf: ????
rdfs: ????
Â
Ejemplo:
Lenguaje para hacer consultas sobre grafos RDF (~"El SQL para RDF")
Â
~# ssh user@biomaster.atica.um.es ~# /home/user
~# git clone https://github.com/mikel-egana-aranguren/LSSW-UM-2016-2017 ~# cd LSSW-UM-2016-2017/LinkedDataServer/blazegraph
~# java -server -Djetty.port=8081 -jar bigdata-bundled.jar
[Subir RDF/data.rdf y RDF/data2.rdf]
[Ejecutar ejemplos en Triple Store]
Â
# Variables que queremos recibir SELECT ?s ?p ?o # Patrón del grafo que queremos extraer del grafo mayor WHERE { ?s ?p ?o }
# Prefixes PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> # Variables que queremos recibir SELECT ?p # Patrón del grafo que queremos extraer del grafo mayor WHERE { ?p gr_ont:part_of gr_data:Nucleolus }
# Prefixes PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> # Variables que queremos recibir SELECT ?p ?clase # Patrón del grafo que queremos extraer del grafo mayor WHERE { ?p gr_ont:part_of gr_data:Nucleolus . ?p rdf:type ?clase }
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> SELECT ?p ?label ?part WHERE{ # Tiene que ser parte de algo ?p gr_ont:part_of ?part . # Tiene que tener un rdfs:label ?p rdfs:label ?label }
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> SELECT ?p ?label ?part WHERE{ # Tiene que ser parte de algo ?p gr_ont:part_of ?part . # Tiene que tener un rdfs:label, o no  OPTIONAL{ ?p rdfs:label ?label } }
# Grafos alternativos PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> SELECT ?name WHERE{ {?p gr_ont:name ?name} UNION {?p rdfs:label ?name} }
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> SELECT ?name WHERE{ {?p gr_ont:name ?name} UNION {?p rdfs:label ?name} Â FILTER regex(?name,'Protein.*') }
Logica: !, &&, ||
Â
Calculos: +, -, *, /
Â
Comparaciones: =, !=, >,<
Â
Tests SPARQL: isURI, isBlank, isLiteral, bound
Â
Acceder a datos: str, lang, datatype
Â
Más: sameTerm, langMatches, regex, ...
Â
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> ASK WHERE{ gr_data:Gene_B gr_ont:name "Gene B" }
DESCRIBE <http://genomic-resources.eu/resource/Prot_B>
PREFIX gr_ont: <http://genomic-resources.eu/ontology/>
PREFIX gr_data: <http://genomic-resources.eu/resource/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
CONSTRUCT {
?p rdf:type gr_data:NucleolusPart .
gr_data:NucleolusPart rdfs:label "Part of the nucleolus"
}
WHERE {
?p gr_ont:part_of gr_data:Nucleolus
}
[Pestaña "Update" en Blazegraph, seleccionar "SPARQL update"]
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> INSERT { GRAPH <http://genomic-resources.eus/graph/um>{ ?p rdf:type gr_data:NucleolusPart . gr_data:NucleolusPart rdfs:label "Part of the nucleolus" } } WHERE { ?p gr_ont:part_of gr_data:Nucleolus }
Grafo: conjunto de triples
Â
El conjunto entero se identificada con una URI (diferente de la de los datos)
Â
Todas las Triple Stores tienen un Default Graph
Â
Â
Los grafos son muy útiles para añadir datos sobre los datos: ej. procedencia, autorÃa, fecha de generación
Â
Â
(entre otras cosas)
SELECT *
FROM <http://genomic-resources.eus/graph/um>
WHERE{
   ?s ?p ?o
}
SELECT *
FROM <http://genomic-resources.eus/graph/um>
WHERE{
   ?s ?p ?o
}
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> INSERT DATA { GRAPH <http://genomic-resources.eus/graph/um>{ gr_data:NucleolusPart rdfs:comment "Comment inserted" } }
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> DELETE DATA { GRAPH <http://genomic-resources.eus/graph/um>{ gr_data:NucleolusPart rdfs:comment "Comment inserted" } }
PREFIX gr_ont: <http://genomic-resources.eu/ontology/> PREFIX gr_data: <http://genomic-resources.eu/resource/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> DELETE { GRAPH <http://genomic-resources.eus/graph/um>{ gr_data:NucleolusPart rdfs:label ?label } } WHERE { GRAPH <http://genomic-resources.eus/graph/um>{ gr_data:NucleolusPart rdfs:label ?label } }
PREFIX up:<http://purl.uniprot.org/core/>Â
SELECT ?prot ?protein
WHERE{
 ?prot rdfs:comment 'A4_HUMAN'
 SERVICE <http://sparql.uniprot.org/>{
     ?protein a up:Protein .
     ?protein up:mnemonic 'A4_HUMAN'
         }
}
¿Cuantas entradas de proteinas hay en uniprot?
Â
https://github.com/mikel-egana-aranguren/LSSW-UM-2016-2017/tree/master/SPARQL/UniProt-1
¿Cuantas entradas de proteinas hay en uniprot, que sean de Arabidopsis thaliana?
Â
https://github.com/mikel-egana-aranguren/LSSW-UM-2016-2017/tree/master/SPARQL/UniProt-2
¿Cuál es la descripción de la actividad enzimática de uniprotkb:Q9SZZ8?
Â
https://github.com/mikel-egana-aranguren/LSSW-UM-2016-2017/tree/master/SPARQL/UniProt-3
Conseguir los IDs, y las fechas en las que se añadieron a UniProt, de las proteinas que se han añadido este año a UniProt (Google: "SPARQL FILTER by date")
Â
https://github.com/mikel-egana-aranguren/LSSW-UM-2016-2017/tree/master/SPARQL/UniProt-4
curl --data-urlencode query@UniProt-4 http://sparql.uniprot.org/sparql/
Â
Resultados en XML, JSON, CSV?
curl --data-urlencode query@describe http://sparql.uniprot.org/sparql/
Â
DESCRIBE <http://purl.uniprot.org/uniprot/P05067>
Â
Resultados en RDF/XML, Turtle?
Â
Redirigir resultado describe a un archivo
Â
Buscar en resultado describe "GO_0008201" y redirigir nuevo resultado a un archivoÂ
Â
OWL (Web Ontology Language) es un estándar oficial del W3C para crear ontologÃas en la web con un semántica precisa y formal
Â
OWL se basa en Lógica Descriptiva (DL)
Â
Representación computacional de un dominio de conocimiento:
Razonamiento automático: inferir conocimiento "nuevo" (*), consultas, consistencia, clasificar entidades contra la ontologÃa, ...
Integrar conocimiento disperso
Â
Para ordenadores: RDF/XML, OWL/XML, ...
Para humanos: Manchester OWL Syntax, functional, ...
Una ontologÃa OWL esta compuesta de:
Entidades: las entidades del dominio de conocimiento, identificadas con URIs, introducidas por el desarrollador ("Mikel", "participa_en", ...)
Axiomas: relacionan las entidades mediante el vocabulario lógico que ofrece OWL (namespace OWL)
Â
Una ontologÃa puede importar otra (owl:import) y hacer referencia a sus entidades mediante axiomas
Entidades (URI)
Axiomas
("URI OWL")
Individuos
Â
Clases
Â
Propiedades
Objeto
Â
Datos
Â
Anotación
Ontologia
(URI)
Entidad
Axioma
Arm subClassOf part-of some Body
Clase
Clase
Propiedad objeto
Restricción
[Fuente de imagenes: Manchester OWL Pizza tutorial]
disjointFrom
booleanos: not, or, and
JerarquÃa propiedad-subpropiedad (~taxonomÃa pero con propiedades), ej:
interacciona con
mata a
estrangula a
Solo funcional
Â
Dominio clases, rango datatypes
Anotar con lenguaje natural entidades (propiedades, clases, individuos), axiomas, ontologÃas
Â
Fuera de la semántica
Â
rdfs:label, rdfs:comment, dublin core, a medida
Miembro de una o más clases (Types)
Â
Igual (SameAs) o diferente (DifferentFrom) a otro individuo
Â
Relaciones binarias con otros individuos o datos (triples), positivas o negativas
Un razonador infiere los "nuevos" axiomas que implican los axiomas que hemos introducido en la ontologÃa
Â
El razonador infiere todos los axiomas; es útil para tratar con conocimiento complejo
Â
Open World Assumption (OWA)
Â
(Falta de) Unique Name Assumption (¡owl:sameAs!)
Mantener taxonomÃa
Consistencia
Clasificar entidades: dada una entidad nueva, como se relaciona con las demas entidades (types, equivalentTo, subClassOf, triples)
Â
Una consulta es una clase anónima que clasificamos contra la ontologÃa como si fuese una entidad
Abrir rdf/ontology.owl
Â
Importar rdf/data-ont.rdf
Â
owl:ObjectProperty!!!
Â
Explorar
Â
Gene and part_of some Organelle
Â
Algun otro ejemplo?
1.- Usar URIs (Uniform Resource Identifier) para identificar entidades
2.- Usar URIs que son accesibles mediante el protocolo HTTP, para que usuarios o agentes automáticos puedan acceder a las entidades
3.- Cuando se acceda a la entidad, proveer datos sobre la entidad en formatos estándar y abiertos, como RDF (Resource Description Framework)
4.- Añadir en los datos que publicamos en RDF enlaces a las URIs de otras entidades, de modo que un usuario o agente pueda navegar por la red de datos y descubrir más datos que también siguen los principios Linked Data
Utilizar maquinaria Web (URIs HTTP), para identificar y localizar entidades: http://example.com/entity
Â
Utilizar un modelo de datos común, tripleta RDF, para integrar datos en los que aparecen esa entidades
«base de datos universal»
Descubrimiento e integración de datos
Â
Programación de agentes que consuman los datos
Â
Actualización de datos mediante enlaces
Â
Consultas complejas
Con Linked Data cualquiera puede publicar datos y enlazarlos a otros datos
Â
El conjunto de datos abiertos publicados mediante Linked Data forma la «nube Linked Open Data»
Â
Cada vez más instituciones públicas de todo el mundo usan Linked Data para publicar sus datos
http://dbpedia.org/resource/Berlin
http://www.geonames.org/2950159
owl:sameAs
HTML
RDF
HTML
RDF
curl -L -H "Accept: text/html" "http://dbpedia.org/resource/Berlin"
curl -L -H "Accept: application/rdf+xml" "http://dbpedia.org/resource/Berlin"
curl -L -H "Accept: text/html" "http://sws.geonames.org/2950159/"
curl -L -H "Accept: application/rdf+xml" "http://sws.geonames.org/2950159/"
URI identifica a entidad; URLs localizan diferentes representaciones (RDF, HTML, ...) de la entidad
Â
Descripción de la entidad (RDF, HTML, ...) ≠entidad
Â
HTTP URI dereferenciable: cuando se busca una URI, deberia devolver una descripción adecuada del objeto que identifica esa URI
Publicar datos:
Â
- Con "semántica" explÃcita
Â
- Con enlaces
Â
Â
RDF ofrece el triple, un modelo de datos explÃcito y homogéneo: una "frase" estándar que los ordenadores pueden "entender"
Â
Â
Â
Â
Â
En el triple, cada entidad (sujeto, predicado, objeto) tiene una URI que lo identifica
Los datos son enlazados a otros datos a través de la Web, con enlaces explÃcitos
Â
Â
Â
Â
Â
SELECT ?lugar ?nombre
WHERE {
?lugar <http://dbpedia.org/located_in> <http://gip.eus/donostia> .
?lugar rdfs:label ?nombre
}
SPARQL endpoint (Triple Store)
Â
Consultas federadas
Â
Integración
(SERVICE)
- URIs = "keys"
- Enlaces
Crear ontologÃas mediante Web Ontology Language
OntologÃa: "esquema" que describe el conocimiento sobre los datos
Tiene clases de individuos y define las condiciones para pertenecer a una clase
Es un lenguaje axiomatico con semantica precisa >> razonamiento automático
Algunas Triple Stores incluyen razonamiento automático en consultas
sujeto/objeto RDF >> rdf:type >> URI Clase OWL
Triple Store: almacena RDF
Â
SPARQL endpoint: interfaz de consulta a Triple Store (humanos y máquinas)
Â
Servidor Linked Data: sirve HTML o datos RDF mediante negociación de contenido
Triple store: Almacenar RDF, SPARQL endpoint
Servidor Linked Data: acceso web, negociación contenido
Interfaz para programadores/expertos en datos
Â
Análisis complejos de los datos/nueva aplicaciones
Â
SPARQL: Consultas complejas contra los datos, incluso combinando diferentes «bolas» de la nube Linked Open Data (datasets externos)
Â
RDF: Crear programas autónomos que «naveguen» por los datos, recolectando datos (agentes)
curl "http://dbpedia.org/sparql?query=SELECT+%3Fp+%3Fo%0D%0AWHERE+{%0D%0A<http%3A%2F%2Fdbpedia.org%2Fresource%2FBerlin>+%3Fp+%3Fo}"
curl "http://dbpedia.org/sparql?query=SELECT ?p ?o WHERE {<http://dbpedia.org/resource/Berlin> ?p ?o}"
Interfaz para usuarios no expertos
Navegar por los datos publicados
Â
Enlaces a otros recursos Linked Data
Â
La capacidad de los datos de «ser descubiertos» aumenta
Â
Los datos son más interoperables a través de
a) Uso de triple RDF (modelo de datos común)
b) OntologÃas comunes («esquema» común)
c) Uso de URIs para entidades (identificadores enlazables)
Acceder a datos de manera más rica a través de la web (la web son los datos, no un documento que representa los datos)
Â
Acceder a más datos, con enlaces más ricos («es parte de», «nació en», … ) a otros recursos: descubrimiento de nuevos datos
Â
Encontrar datos de manera más precisa
Â
Un ecosistema más rico de Apps, ya que es más fácil desarrollar Apps que integren datos
Crear programas nuevos fácilmente: ej. visualizaciones especificas
Â
Analizar los datos exhaustivamente, en relación a datos externos: ej. estadÃsticas locales vs estadÃsticas a nivel europeo
Â
Integración de datos
Â
Descubrimiento de nuevos datosÂ
Enlaces al exterior:
      Â
Publicar solo nuestros datos, referencias al resto, no hay que replicar datos externos
      Â
Los datos externos se actualizan independientemente, y nuestro dataset va "a remolque" sin esfuerzo
Enlaces a nuestro dataset:
Â
Es facil enlazar a nuestro dataset, ya que usamos HTTP URIs
Â
Por lo tanto, aumenta la capacidad de nuestro dataset de ser descubierto mediante enlaces
Semántica:
Â
El significado de nuestro datos es explÃcito y claro, debido a RDF (instancias) + OWL ("esquema")
Â
Es "fácil" crear aplicaciones, incluyendo razonamiento automático (ej. agentes)
1) Crear el dataset
     OntologÃa OWL: reusar lo más posible de otras ontologÃas para interoperabilidad
   Instancias RDF (triples)
Â
2) Añadir enlaces a otros datasets
   Manualmente o con herramientas como SILK, LIMES, Refine, ...
  A nivel de instancias (owl:sameAs, predicados, ...) y a nivel de vocabulario (owl:equivalentClass, ...)
3) Almacenar el dataset en triple store
4) Publicar el dataset mediante servidor web
Â
Â
 Â
Â
Â
Â
Â
Â
6) Generar archivo voiD (Vocabulary of Interlinked Datasets): http://www.w3.org/TR/void/
 Â
Â
Recrear todo el proceso de publicar nuestro dataset Linked Data en nuestro servidor, en una infraestructura ya preparada (Linked Data Server)
Â
~# cd LSSW-UM-2016-2017/LinkedDataServer/blazegraph
~# java -server -Djetty.port=8081 -jar bigdata-bundled.jar
[Subir datos?]
~# cd LSSW-UM-2016-2017/LinkedDataServer/pubby
~# java -jar start.jar jetty.port=8080
 Â
Negociación de contenido en terminal:
Â
$ curl -L "http://localhost:8080/resource/Prot_B"
$ curl -L -H "Accept: application/rdf+xml" http://localhost:8080/resource/Prot_B
Â
pubby/webapps/ROOT/WEB-INF/web.xml
pubby/webapps/ROOT/WEB-INF/blazegraph-config.ttl
Crear un dataset nuevo en un archivo RDF (ttl?), con otras URIs (pocos triples)
Â
Subirlo a blazegraph
Â
Configurar pubby
Given a set of UniProt proteins, which ones are related to PubMed abstracts containing the term "brain'', and what are they KEGG entries?
Q03164
Q9UKA4
Q8TDM6
Q9NQT8
Q12830
Q9HCM3
Q8TF72
Q5H8C1
Q9UGU0
B2RWN9
A4UGR9
B7ZML1
Given a set of UniProt proteins, which ones are related to PubMed abstracts containing the term "brain'', and what are they KEGG entries?
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX sadi: <http://sadiframework.org/ontologies/predicates.owl#> PREFIX lsrn: <http://purl.oclc.org/SADI/LSRN/> SELECT ?protein ?label ?KEGG WHERE { ?protein rdf:type lsrn:UniProt_Record . ?protein sadi:isEncodedBy ?KEGG . ?protein ?prot2hgnc ?hgnc . ?hgnc ?hgnc2omim ?omim . ?omim ?omim2pubmed ?pubmed . ?pubmed rdfs:label ?label . FILTER (regex (?label, 'brain')) }
curl -X POST --data-binary
@InputgetKEGGIDFromUniProt.rdf
http://sadiframework.org/services/getKEGGIDFromUniProt