SPARQL SPARQL SPARQL Lenguaje de consulta para RDF. RDF RDF es un formato para la representación de datos generales acerca de los recursos. RDF se basa en un grafo, donde sujeto y objeto nodos están relacionados por arcos de predicado. RDF se puede escribir en XML, o como tripletas. RDF-Schema RDF esquema es un método para definir las estructuras de archivos RDF. Permite que recursos RDF se agrupan en clases, y permite que se especifiquen las descripciones de las subclases, subpropiedad y el dominio /rango. SPARQL es un lenguaje de consulta para RDF. Proporciona un formato estándar para escribir consultas que se dirigen a datos RDF y un conjunto de reglas estándar para el procesamiento de las consultas y devolver los resultados. Qué es SPARQL Pronunciado “sparkle” Acronimo recursivo para ◦ SPARQL Protocol and RDF Query Language Un lenguaje de consulta semantica Un lenguaje de consulta para RDF(S) W3C (15 de enero 2008) Proporciona un estandar para formatear consultas escritas en datos fuentes RDF Un conjunto de reglas estandars para procesar consultas http://www.w3.org/TR/rdf-sparql-query/ ◦ Diferentes ligas dados por SPARQL, pero lo más reelevante para este modulo es el link: ◦ http://www.w3.org/TR/sparql11-query/ Declaración RDF Subject Predicate Object http://www.w3schools.com/RDF author Jan Egil Refsnes ?subject ?predicate ?object SPARQL busca todos los sub-graphs que empata con el grafo descrito por las tripletas de la consulta. Ejemplo SPARQL tiene algunas similitudes con QL queries. Note el uso de espacio de nombres (namespaces) en la consulta. SELECT ?student WHERE { ?student b:studies bmod:CS414 } ¿Cuales son los espacios de nombres? b y bmod Ejemplo: SELECT ?title WHERE { <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title } Prefijos y namespace En RDF: <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cd="http://www.recshop.fake/cd#"> En SPARQL: PREFIX b: <http://...> PREFIX bmod: <http://www2.warwick.ac.uk/fac/sci/dcs/teaching/material/> La palabra clave PREFIX es una versión de la declaración xmlns:namespace y es similar. El espacio de nombres xmlns:cd , especifica que elementos con el prefijo cd esta en espacio de nombres."http://www.recshop.fake/cd#". Prefijos Los prefijos no son opcionales en SPARQL, como en XML. Trata en: http://www.sparql.org/query.html PREFIX books: <http://example.org/book/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT $book WHERE {$book title $title } >> esto produce un error. Contra: PREFIX books: <http://example.org/book/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT $book WHERE {$book dc:title $title } Prefijos usados Prefix IRI rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# rdfs: http://www.w3.org/2000/01/rdf-schema# xsd: http://www.w3.org/2001/XMLSchema# fn: http://www.w3.org/2005/xpath-functions# sfn: http://www.w3.org/ns/sparql# Los prefijos no son opcionales en SPARQL! Consultas en línea SPARQL http://www.sparql.org/query.html http://sparql.org/sparql.html http://demo.openlinksw.com/sparql http://librdf.org/query http://factforge.net/sparql http://dbpedia.org/sparql Trata de analizar documentos RDF Ejemplo: http://athena.ics.forth.gr:9090/RDF/VRP/Examples/tap.rdf (en http://sparql.org/sparql.html o Protege) Usando SPARQL para encontrar conceptos Listando tipos distintos RDF La siguiente consulta lista los distintos dataset usados en rdf:types PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT DISTINCT ?type WHERE { ?s rdf:type ?type } Listando clases OWL PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?class WHERE { ?class a owl:Class } Esto es equivalente con: PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?class WHERE { ?class rdf:type owl:Class } Listar todas las clases de nivel superior OWL Para ver todas las clases OWL, subclases de owl:Thing, correr la siguiente consulta PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * WHERE {?s rdfs:subClassOf owl:Thing } Listar la raiz y conceptos derivados PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?class WHERE { ?class rdfs:subClassOf owl:Thing . FILTER ( ?class != owl:Thing && ?class != owl:Nothing ) . OPTIONAL { ?class rdfs:subClassOf ?super . FILTER ( ?super != owl:Thing && ?super != ?class ) } . FILTER ( !bound(?super) ) } Formatos de serialización NOTATION-3 (O N3), TURTLE, Y N-TRIPLES Turtle Terse RDF Triple Language Es el más popular. SPARQL utiliza este formato. Es un lenguaje breve o conciso. La URL que identifica el lenguaje Turtle está dada por: ◦ http://www.w3.org/2008/turtle#turtle El par XML (nombre de espacio de nombres, nombre local) que identifica el lenguaje Turtle es el siguiente: ◦ http://www.w3.org/2008/turtle#, turtle El prefijo del espacio sugerido es TTL, y un documento Turtle debe usar TTL como la extensión de archivo. Turtle Un documento Turtle es una colección de declaraciones o sentencias RDF, y cada declaración tiene un formato que se llama un triple o tripleta: <subject> <predicate> <object>. Note que • Cada declaración tiene que terminar con un punto; • El sujeto debe estar representado por un URI; • El predicado debe ser representado por un URI; • El objeto puede ser un URI o una literal; • Un URI debe estar rodeado por <>, que se utilizan para delimitar una URI. Turtle Una literal dada puede tener un idioma o un tipo de datos URI como su sufijo, pero no se le permite tener ambas cosas. ◦ Si se da un sufijo de idioma, el sufijo se crea con un @ junto con la etiqueta del idioma. Por ejemplo, ◦ "this is in English"@en ◦ Si se da un sufijo de tipo de datos, se utiliza ^^: ◦ "10"ˆˆ<http://www.w3.org/2001/XMLSchema#decimal> ◦ "foo"ˆˆhttp://example.org/mydatatype/sometype ◦ No es necesario que la literal tenga un tipo de datos URI o etiqueta de idioma. Por ejemplo, estas dos literales se permiten: ◦ "10" ◦ "foo“ Ejemplos <http://www.liyangyu.com/foaf.rdf#liyang> <http://xmlns.com/foaf/0.1/name> "liyang yu". <http://www.liyangyu.com/foaf.rdf#liyang> <http://xmlns.com/foaf/0.1/interest> <http://dbpedia.org/resource/Semantic_Web>. Turtle Para hacer más corta y más fácil de leer el URI del recurso, utilizamos un prefijo del espacio de nombres. El formato general para la definición de prefijo del espacio de nombres se da de la siguiente manera: @prefix pref: <uri>. Donde pref es el nombre corto para el URI. Por ejemplo: @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. Ejemplo @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. liyang:liyang foaf:name "liyang yu". liyang:liyang foaf:interest <http://dbpedia.org/resource/Semantic_Web>. Otra forma de abrevias un espacio de nombres es creando un prefijo predeterminado, que actúa como el espacio de nombres "principal" para un documento Turtle. Para crear un espacio de nombres predeterminado, usamos la misma forma general, pero sin una cadena pref: @prefix : <uri>. Por ejemplo: @prefix : <http://xmlns.com/foaf/0.1/>. Ejemplo: @prefix : <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. liyang:liyang :name "liyang yu". liyang:liyang :interest <http://dbpedia.org/resource/Semantic_Web>. Note que la directiva @base también se utiliza para permitir la abreviación de URIs. El punto clave a recordar acerca de @base es la siguiente: cada vez que aparece en un documento, que define el URI base contra el cual se van a resolver todos los URI relativos. <http://liyangyu.com/data/subj0> <http://liyangyu.com/data/pred0> <http://liyangyu.com/data/obj0>. <http://liyangyu.com/ns0/subj1> <http://liyangyu.com/ns0/pred1> <http://liyangyu.com/ns0/obj1>. 1: <subj0> <pred0> <obj0>. 2: @base <http://liyangyu.com/ns0/>. 3: <subj1> <http://liyangyu.com/ns0/pred1> <obj1>. 4: @base <foo/>. @base <http://liyangyu.com/ns0/foo/>. 6: @predix : <bar#>. <http://liyangyu.com/ns0/foo/subj2> <http://liyangyu.com/ns0/foo/pred2> <http://liyangyu.com/ns0/foo/obj2>. 7: :subj3 :pred3 :obj3. @predix : <http://liyangyu.com/ns0/foo/bar#>. 5: <subj2> <pred2> <obj2>. 8: @predix : <http://liyangyu.com/ns1/>. 9: :subj4 :pred4 :obj4. <http://liyangyu.com/ns1/subj4> <http://liyangyu.com/ns1/pred4> <http://liyangyu.com/ns1/obj4>. <http://liyangyu.com/ns0/foo/bar#subj3> <http://liyangyu.com/ns0/foo/bar#pred3> <http://liyangyu.com/ns0/foo/bar#obj3>. Ejemplo @base 1: <subj0> <pred0> <obj0>. 2: @base <http://liyangyu.com/ns0/>. 3: <subj1> <http://liyangyu.com/ns0/pred1> <obj1>. 4: @base <foo/>. 5: <subj2> <pred2> <obj2>. 6: @predix : <bar#>. 7: :subj3 :pred3 :obj3. 8: @predix : <http://liyangyu.com/ns1/>. 9: :subj4 :pred4 :obj4. Token a Token a en Turtle es siempre equivalente al siguiente URI: http://www.w3.org/1999/02/22-rdf-syntax-ns#type Por lo tanto, liyang:liyang rdf:type foaf:Person. Puede escribirse como sigue: liyang:liyang a foaf:Person. Comas y puntos y comas Ambos comas y puntos y comas se pueden utilizar para hacer un documento dado más corto. Más específicamente, si se realizan dos o más sentencias con el mismo sujeto y predicado, podemos combinar las declaraciones y los diferentes objetos separados por uno o más comas Ejemplo: @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. liyang:liyang foaf:name "liyang yu". liyang:liyang foaf:interest <http://dbpedia.org/resource/Semantic_Web>. liyang:liyang foaf:interest <http://semantic-mediawiki.org/>. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. liyang:liyang foaf:name "liyang yu". liyang:liyang foaf:interest <http://dbpedia.org/resource/Semantic_Web>, <http://semantic-mediawiki.org>. Si tenemos los mismos sujetos pero diferentes predicados, pero en más de una declaraciones, podemos usar punto y coma para hacerlos más corto. @prefix foaf: <http://xmlns.com/foaf/0.1/>. @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. liyang:liyang foaf:name "liyang yu" ; foaf:interest <http://www.foaf-project.org/>, <http://semantic-mediawiki.org>. Nodos blancos En Turtle, un nodo en blanco se denota por [] y se puede utilizar como el sujeto o el objeto. <?xml version="1.0"?> “there exists a person named liyang yu”: <rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> Formato Turtle <foaf:Person> @prefix foaf: <http://xmlns.com/foaf/0.1/>. <foaf:name>liyang yu</foaf:name> </foaf:Person> [] a foaf:Person; </rdf:RDF> foaf:name "liyang yu" . Triples: _:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person>. _:bnode0 <http://xmlns.com/foaf/0.1/name> "liyang yu". Podemos usar nodos blancos para representar un objeto. Por ejemplo, “Liyang is a person and he knows another person named Connie”: <?xml version="1.0"?> <rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/" @prefix foaf: <http://xmlns.com/foaf/0.1/>. xmlns:liyang="http://www.liyangyu.com/foaf.rdf#" @prefix liyang: <http://www.liyangyu.com/foaf.rdf#>. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <foaf:Person rdf:about="http://www.liyangyu.com/foaf.rdf#liyang"> liyang:liyang a foaf:Person; <foaf:knows> foaf:knows [ <foaf:Person> <foaf:name>connie</foaf:name> a foaf:Person; </foaf:Person> </foaf:knows> foaf:name "connie" </foaf:Person> ]. </rdf:RDF> Formato Turtle: Tripletas: <http://www.liyangyu.com/foaf.rdf#liyang> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person>. _:bnode0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person>. _:bnode0 <http://xmlns.com/foaf/0.1/name> "connie". <http://www.liyangyu.com/foaf.rdf#liyang> <http://xmlns.com/foaf/0.1/knows> _:bnode0. Ejercicio Representar el siguiente grafo en formato Turtle y en RDF (use un convertidor). Ejercicio Ejercicio SPARQL Las relaciones en RDF son representadas como tripletas y se almacenan como hechos. Ejemplo: Tell: James Dean played in the movie Giant. ¿Como hacemos preguntas de esto? Aún con una sola tripleta, existen algunas preguntas que podríamos formular: Ask: What did James Dean play in? Ask: Who played in Giant? Ask: What did James Dean do in Giant? Todas esta preguntas pueden consultarse en SPARQL de una forma muy simple, reemplazando parte del triple con una palabra tipo pregunta, como: Who, What, Where, etc. SPARQL no distingue entre palabras tipo pregunta, así que podemos elegir palabras que tengan sentido en Ingles. En SPARQL, las palabras pregunta son escritas como el simbolo ? Al inicio, por ejemplo: ?who, ?where, ?when, etc. Ask: James Dean played in ?what Answer: Giant Ask: ?who played in Giant Answer: James Dean Ask: James Dean ?what Giant Answer: played in SPARQL QUERY LANGUAGE FOR RDF La sintaxis es similar al formato Turtle: Tell: :JamesDean :playedIn :Giant . Ask: :JamesDean :playedIn ?what . Answer: :Giant Ask: ?who :playedIn :Giant . Answer: :JamesDean Ask: :JamesDean ?what :Giant . Answer: :playedIn Select y Where Una consulta SELECT en SPARQL tiene dos partes: un conjunto de palabras pregunta, y un patrón pregunta. La palabra WHERE indica el patrón de selección, escrito con llaves {}. Ejemplos de patrones pregunta: WHERE {:JamesDean :playedIn ?what .} WHERE {?who :playedIn :Giant .} WHERE {:JamesDean ?what :Giant .} La consulta inicia con SELECT y una lista de palabras pregunta (variables). SELECT ?what WHERE {:JamesDean ?playedIn ?what .} SELECT ?who WHERE {?who :playedIn :Giant .} SELECT ?what WHERE {:JamesDean ?what :Giant .} Clausula Where La cláusula WHERE de una consulta SPARQL puede verse como un patrón de grafo, es decir, un patrón que se compara con el grafo de datos. Ejemplo: Ask: SELECT ?what WHERE {:JamesDean :playedIn ?what} Answer: :Giant, :EastOfEden, :RebelWithoutaCause. En este caso, el patrón tiene un solo triple, JamesDean como el sujeto,:playedIn en que el predicado, y una palabra pregunta como el objeto. La acción del motor de búsqueda es encontrar todos los empates para el patrón en los datos, y devolver todos los valores en los que la palabra pregunta coinciden. Ejemplo Who were the directors that James Dean worked with? Quienes dirigieron las películas que James Dean interpretó. El patrón del grafo para esta consulta tiene las tripletas: :JamesDean :playedIn ?what . ?what :directedBy ?who . Ask: SELECT ?who WHERE {:JamesDean :playedIn ?what . ?what :directedBy ?who .} Answer: :GeorgeStevens, :EliaKazan, :NicholasRay, :FredGuiol Ejemplo Ask: SELECT ?what ?who WHERE {:JamesDean :playedIn ?what . ?what :directedBy ?who .} Nombrando palabras pregunta Empiezan con ?, y se escribe: ?palabra (?what es una movie y ?who es un director Ask: SELECT ?movie ?director WHERE { :JamesDean :playedIn ?movie ?movie . :directedBy ?director . } Los patrones de grafo los vemos como una cadena simple: James Dean played in some movie that was directed by someone. Consulta: Actrices que trabajaron con él. Ask: SELECT ?actress ?movie WHERE {:JamesDean :playedIn ?movie . ?actress :playedIn ?movie . ?actress rdf:type :Woman } java -cp 'Jena-2.6.4/lib/*' arq.sparql --data=Jena-2.6.4/doc/tutorial/RDF_API/data/vc-db-1.rdf -query=Jena-2.6.4/doc/tutorial/RDQL/vc-q1_b Ejemplo, Jena Consulta: <?xml version='1.0' encoding='UTF-8'?> <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:vCard='http://www.w3.org/2001/vcard-rdf/3.0#' xmlns:info='http://somewhere/peopleInfo#' > <rdf:Description rdf:about="http://somewhere/JohnSmith/"> <vCard:FN>John Smith</vCard:FN> <info:age>25</info:age> <vCard:N rdf:parseType="Resource"> <vCard:Family>Smith</vCard:Family> <vCard:Given>John</vCard:Given> </vCard:N> </rdf:Description> <rdf:Description rdf:about="http://somewhere/RebeccaSmith/"> <vCard:FN>Becky Smith</vCard:FN> <info:age>23</info:age> <vCard:N rdf:parseType="Resource"> <vCard:Family>Smith</vCard:Family> <vCard:Given>Rebecca</vCard:Given> </vCard:N> </rdf:Description> vc-db-2.rdf <rdf:Description rdf:about="http://somewhere/SarahJones/"> <vCard:FN>Sarah Jones</vCard:FN> <vCard:N rdf:parseType="Resource"> <vCard:Family>Jones</vCard:Family> <vCard:Given>Sarah</vCard:Given> </vCard:N> </rdf:Description> <rdf:Description rdf:about="http://somewhere/MattJones/"> <vCard:FN>Matt Jones</vCard:FN> <vCard:N vCard:Family="Jones" vCard:Given="Matthew"/> </rdf:Description> </rdf:RDF> Consulta SELECT ?x WHERE {?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> "John Smith".} Jena-2.6.4/doc/tutorial/RDQL$ java -cp '../../../lib/*' arq.sparql --data=vc-db-2.rdf --query=vcq1_b -----------------------------------------------------|x | ================================= | <http://somewhere/JohnSmith/> | ----------------------------------------------------- Consulta SELECT ?x ?fname WHERE {?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> ?fname .} ------------------------------------------------------------------------------------------|x | fname | ==================================================== | <http://somewhere/MattJones/> | "Matt Jones" | | <http://somewhere/SarahJones/> | "Sarah Jones" | | <http://somewhere/RebeccaSmith/> | "Becky Smith" | | <http://somewhere/JohnSmith/> | "John Smith" | ------------------------------------------------------------------------------------------- /Jena-2.6.4/doc/tutorial/RDQL$java -cp '../../../lib/*' arq.sparql --data=vc-db-2.rdf --query=vcq2_b Ejemplo SELECT ?givenName WHERE {?y <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Smith". ?y <http://www.w3.org/2001/vcard-rdf/3.0#Given> ?givenName. } Jena-2.6.4/doc/tutorial/RDQL$ java -cp '../../../lib/*' arq.sparql --data=vc-db-2.rdf --query=vc-q3_b ------------| givenName | ============= | "Rebecca" | | "John" | ------------- Estructura de una consulta SELECT # base directive BASE <URI> # list of prefixes PREFIX pref: <URI> ... # result description SELECT... # graph to search FROM . . . # query pattern WHERE { ... } # query modifiers ORDER BY... define un URI base contra la cual se resolverán todos los URI relativos en la consulta, incluyendo los URI definidos con palabras clave prefijo. Le dice a SPARQL el punto final Contiene los patrones del grafo que especifican el resultado deseado Especifica cuales variables asociar, o elementos datos, debe ser regresados desde la consulta Como organizar los resultados de la consulta Ejemplo base <http://danbri.org/foaf.rdf> URI relativa prefix foaf: <http://xmlns.com/foaf/0.1/> select * from <http://danbri.org/foaf.rdf> where { <#danbri> ?property ?value. } Prueba: http://sparql.org/sparql.html http://demo.openlinksw.com/sparql URI absoluta opcional Salida http://sparql.org/sparql.html Ejemplo Find all the people known by Dan Brickley base <http://danbri.org/foaf.rdf> prefix foaf: <http://xmlns.com/foaf/0.1/> select * from <http://danbri.org/foaf.rdf> where { <#danbri> foaf:knows ?friend. } Ejemplo Find all the people known by Brickley, show their names, e-mail addresses, and home page information base <http://danbri.org/foaf.rdf> prefix foaf: <http://xmlns.com/foaf/0.1/> select * from <http://danbri.org/foaf.rdf> where { <#danbri> foaf:knows ?friend. ?friend foaf:name ?name. ?friend foaf:mbox ?email. ?friend foaf:homepage ?homepage. } Salida Ejemplo to find all the picture formats that have been used by Brickley’s friends: base <http://danbri.org/foaf.rdf> prefix foaf: <http://xmlns.com/foaf/0.1/> prefix dc: <http://purl.org/dc/elements/1.1/> select * from http://danbri.org/foaf.rdf where { <#danbri> foaf:knows ?friend. ?friend foaf:depiction ?picture. ?picture dc:format ?imageFormat. } Ejemplo base <http://danbri.org/foaf.rdf> prefix foaf: <http://xmlns.com/foaf/0.1/> select * from <http://danbri.org/foaf.rdf> where { <#danbri> foaf:knows ?friend. optional { ?friend foaf:name ?name. } optional { ?friend foaf:mbox ?email. } optional { ?friend foaf:homepage ?homepage. } } Libros https://www.w3.org/2001/sw/wiki/Books