From SQL to SPARQL

8,036 views
7,772 views

Published on

This is a presentation at the Cluj Semantic Meetup on May 17, 2011. The presenter was Dia Miron, Semantic WEB Researcher at Recognos Romania.

Published in: Technology, Education

From SQL to SPARQL

  1. 1. SPARQL Query Language for RDF Cluj Semantic WEB meetup http://www.meetup.com/Cluj-Semantic-WEB/ presented by Dia MIRON 17 May 2011
  2. 2. Introduction - SPARQL <ul><li>SPARQL is a query language/engine for RDF graphs. </li></ul><ul><li>An RDF graph is a set of triples. A flexible and extensible way to represent information about WWW resources </li></ul><ul><li>A concept similar to SQL for data bases. A W3C standard query language to fetch data from distributed Semantic Web data models. </li></ul><ul><li>Can query a triple store or data on the Web (at a given URL). It provides facilities to: </li></ul><ul><ul><li>extract information in the form of URIs, blank nodes, plain and typed literals. </li></ul></ul><ul><ul><li>extract RDF subgraphs. </li></ul></ul><ul><ul><li>construct new RDF graphs based on information in the queried graphs </li></ul></ul>
  3. 3. SPARQL – a first example <ul><li>prefix sch-ont: <http://education.data.gov.uk/def/school/> </li></ul><ul><li>SELECT ?name WHERE { ?school a sch-ont:School; </li></ul><ul><li>sch-ont:establishmentName ?name; </li></ul><ul><li>sch-ont:districtAdministrative <http://statistics.data.gov.uk/id/local-authority-district/00AA> ; } </li></ul><ul><li>ORDER BY ?name </li></ul><ul><li>If executed on the UK government's Open Semantic Database , will return the names of all the schools in the UK in administrative district 00AA, and order the results in alphabetical order ( http://data.gov.uk/sparql ) </li></ul><ul><li>SPARQL Is Similar To SQL </li></ul><ul><ul><li>Like SQL, SPARQL selects data from the query data set by using a SELECT statement to determine which subset of the selected data is returned. Also, SPARQL uses a WHERE clause to define graph patterns to find a match for in the query data set. </li></ul></ul>
  4. 4. SPARQL General Form ORDER BY, DISTINCT etc (Modifiers) e.g. ORDER BY ?name WHERE (Query Triple Pattern) e.g. WHERE { ?planttype plant:planttype ?name } FROM (Data Set) e.g. FROM <http://www.linkeddatatools.com/plantsdata/plants.rdf> SELECT (Result Set) e.q. SELECT ?name PREFIX (Namespace Prefixes) e.g. PREFIX plant:<http://www.linkeddatatools.com/plants>
  5. 5. Data set Example: triple data containing a variety of shrubs and plants, and their family names
  6. 6. Select All Data <ul><li>PREFIX plants: <http://www.linkeddatatools.com/plants> </li></ul><ul><li>SELECT * WHERE </li></ul><ul><li>{ ?name plants:family ?family } </li></ul><ul><li>select all the plant URIs (subjects) and plant family names (literal-type objects) from the data above; </li></ul><ul><li>the wildcard '*' in SPARQL, similar to SQL, will return all the mapped data in the result set; </li></ul><ul><li>as we have stated two variables ?name and ?family, the query will return both these declared query variables in our result set, according to the subjects, predicates or objects they're mapped to; </li></ul>
  7. 7. And the results are… <ul><li>01. <?xml version=&quot;1.0&quot; ?> </li></ul><ul><li>02.<sparql xmlns=&quot;http://www.w3.org/2005/sparql-results#&quot; </li></ul><ul><li>03.        xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;> </li></ul><ul><li>04.   <head> </li></ul><ul><li>05.      <variable name=&quot;name&quot;/> </li></ul><ul><li>06.      <variable name=&quot;family&quot;/> </li></ul><ul><li>07.   </head> </li></ul><ul><li>08.   <results> </li></ul><ul><li>09.      <result> </li></ul><ul><li>10.         <binding name=&quot;name&quot;> </li></ul><ul><li>11.            <uri>http://www.linkeddatatools.com/plants#magnolia</uri> </li></ul><ul><li>12.         </binding> </li></ul><ul><li>13.         <binding name=&quot;family&quot;> </li></ul><ul><li>14.            <literal>Magnoliaceae</literal> </li></ul><ul><li>15.         </binding> </li></ul><ul><li>16.      </result> </li></ul><ul><li>17.      <result> </li></ul><ul><li>18.         <binding name=&quot;name&quot;> </li></ul><ul><li>19.            <uri>http://www.linkeddatatools.com/plants#african_lilly</uri> </li></ul><ul><li>20.         </binding> </li></ul><ul><li>21.         <binding name=&quot;family&quot;> </li></ul><ul><li>22.            <literal>Liliaceae</literal> </li></ul><ul><li>23.         </binding> </li></ul><ul><li>24.      </result> </li></ul><ul><li>25.      <result> </li></ul><ul><li>26.         <binding name=&quot;name&quot;> </li></ul><ul><li>27.            <uri>http://www.linkeddatatools.com/plants#silvertop</uri> </li></ul><ul><li>28.         </binding> </li></ul>29.         <binding name=&quot;family&quot;> 30.            <literal>Aralianae</literal> 31.         </binding> 32.      </result> 33.      <result> 34.         <binding name=&quot;name&quot;> 35.            <uri>http://www.linkeddatatools.com/plants#velvetleaf</uri> 36.         </binding> 37.         <binding name=&quot;family&quot;> 38.            <literal>Malvaceae</literal> 39.         </binding> 40.      </result> 41.      <result> 42.         <binding name=&quot;name&quot;> 43.            <uri>http://www.linkeddatatools.com/plants#manglietia</uri> 44.         </binding> 45.         <binding name=&quot;family&quot;> 46.            <literal>Magnoliaceae</literal> 47.         </binding> 48.      </result> 49.   </results> 50.</sparql>
  8. 8. A more specific query <ul><li>1.PREFIX plants: <http://www.linkeddatatools.com/plants> </li></ul><ul><li>2.SELECT * WHERE </li></ul><ul><li>3.{ ?name plants:family &quot;Magnoliaceae“ } </li></ul><ul><li>----------------------------------------------------------------------------------------------------------------------- </li></ul><ul><li><?xml version=&quot;1.0&quot; ?> </li></ul><ul><li><sparql xmlns=&quot;http://www.w3.org/2005/sparql-results#&quot; </li></ul><ul><li> xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;> </li></ul><ul><li><head> </li></ul><ul><li><variable name=&quot;name&quot;/> </li></ul><ul><li></head> </li></ul><ul><li><results> </li></ul><ul><li><result> </li></ul><ul><li><binding name=&quot;name&quot;> </li></ul><ul><li> <uri>http://www.linkeddatatools.com/plants#magnolia</uri> </li></ul><ul><li></binding> </li></ul><ul><li></result> </li></ul><ul><li><result> </li></ul><ul><li><binding name=&quot;name&quot;> </li></ul><ul><li><uri>http://www.linkeddatatools.com/plants#manglietia</uri> </li></ul><ul><li></binding> </li></ul><ul><li></result> </li></ul><ul><li></results> </li></ul><ul><li></sparql> </li></ul>
  9. 9. What About CREATE, INSERT, UPDATE? <ul><li>at the moment, they are not implemented; </li></ul><ul><li>organizations publishing data in a queryable, public SPARQL endpoint will probably in most circumstances not just want anyone writing and making changes to their (valuable) data; </li></ul><ul><li>SPARUL (SPARQL/Update) and SPARQL+ are being developed to address this problem, however a solid contender to fill this gap in functionality is yet to arise, </li></ul>
  10. 10. Basic Graph Pattern - Multiple Matches Group Graph Pattern (set of graph patterns) also! Data Query Query Result PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . ?x foaf:mbox ?mbox } @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Johnny Lee Outlaw&quot; . _:a foaf:mbox <mailto:jlow@example.com> . _:b foaf:name &quot;Peter Goodguy&quot; . _:b foaf:mbox <mailto:peter@example.org> . <mailto:peter@example.org> &quot;Peter Goodguy&quot; <mailto:jlow@example.com> &quot;Johnny Lee Outlaw&quot; mbox name
  11. 11. Basic Graph Pattern - Blank Nodes Data Query Query Result PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?x ?name WHERE { ?x foaf:name ?name } @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Alice&quot; . _:b foaf:name &quot;Bob&quot; . “ Bob” _:d “ Alice“ _:c name x
  12. 12. Value Constraints Data Query Query Result PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT ?title ?price WHERE { ?x ns:price ?price . FILTER ?price < 30 . ?x dc:title ?title . } @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title &quot;SPARQL Tutorial&quot; . :book1 ns:price 42 . :book2 dc:title &quot;The Semantic Web&quot; . :book2 ns:price 23 . 23 &quot;The Semantic Web&quot; price title
  13. 13. Optional graph patterns Data Query Query Result PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT ?title ?price WHERE { ?x dc:title ?title . OPTIONAL { ?x ns:price ?price . FILTER ?price < 30 }} @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title &quot;SPARQL Tutorial&quot; . :book1 ns:price 42 . :book2 dc:title &quot;The Semantic Web&quot; . :book2 ns:price 23 . “ SPARQL Tutorial“ 23 &quot;The Semantic Web&quot; price title
  14. 14. Multiple Optional Blocks Data Query Query Result PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox ?hpage WHERE { ?x foaf:name ?name . OPTIONAL { ?x foaf:mbox ?mbox }. OPTIONAL { ?x foaf:homepage ?hpage } } @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:a foaf:name &quot;Alice&quot; . _:a foaf:homepage <http://work.example.org/alice/> . _:b foaf:name &quot;Bob&quot; . _:b foaf:mbox <mailto:bob@work.example> . <mailto:bob@example.com> “ Bob“ <http://work.example.org/alice/> “ Alice“ hpage Mbox name
  15. 15. Alternative Graph Patterns Data Query Query Result PREFIX dc10: <http://purl.org/dc/elements/1.0/> PREFIX dc11: <http://purl.org/dc/elements/1.1/> SELECT ?x ?y WHERE { { ?book dc10:title ?x } UNION { ?book dc11:title ?y } } @prefix dc10: <http://purl.org/dc/elements/1.0/> . @prefix dc11: <http://purl.org/dc/elements/1.1/> . _:a dc10:title &quot;SPARQL Query Language Tutorial&quot; . _:b dc11:title &quot;SPARQL Protocol Tutorial&quot; . _:c dc10:title &quot;SPARQL&quot; . _:c dc11:title &quot;SPARQL (updated)&quot; . y x &quot;SPARQL (updated)&quot; &quot;SPARQL Query Language Tutorial&quot; &quot;SPARQL&quot; &quot;SPARQL Protocol Tutorial&quot;
  16. 16. RDF Dataset <ul><li>RDF data stores may hold multiple RDF graphs: </li></ul><ul><ul><li>record information about each graph </li></ul></ul><ul><ul><li>queries that involve information from more than one graph </li></ul></ul><ul><ul><li>RDF Dataset in SPARQL terminology </li></ul></ul><ul><ul><li>the background graph, which does not have a name, and zero or more named graphs, identified by URI reference </li></ul></ul><ul><li>the relationship between named and background graphs: </li></ul><ul><ul><li>(i) to have information in the background graph that includes provenance information about the named graphs (the application is not directly trusting the information in the named graphs ) </li></ul></ul><ul><ul><li>(ii) to include the information in the named graphs in the background graph as well. </li></ul></ul>
  17. 17. RDF Dataset- T he Relationship between Named and Background Graphs (I) # Background graph @prefix dc: <http://purl.org/dc/elements/1.1/> . <http://example.org/bob> dc:publisher &quot;Bob&quot; . <http://example.org/alice> dc:publisher &quot;Alice&quot; . # Graph: http://example.org/bob @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Bob&quot; . _:a foaf:mbox <mailto:bob@oldcorp.example.org> . # Graph: http://example.org/alice @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Alice&quot; . _:a foaf:mbox <mailto:alice@work.example.org> .
  18. 18. RDF Dataset- T he Relationship between Named and Background Graphs (II) # Background graph @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:x foaf:name &quot;Bob&quot; . _:x foaf:mbox <mailto:bob@oldcorp.example.org> . _:y foaf:name &quot;Alice&quot; . _:y foaf:mbox <mailto:alice@work.example.org> . # Graph: http://example.org/bob @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Bob&quot; . _:a foaf:mbox <mailto:bob@oldcorp.example.org> . # Graph: http://example.org/alice @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Alice&quot; . _:a foaf:mbox <mailto:alice@work.example.org> .
  19. 19. Querying the Dataset # Graph: http://example.org/foaf/aliceFoaf @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:a foaf:name &quot;Alice&quot; . _:a foaf:mbox <mailto:alice@work.example> . _:a foaf:knows _:b . _:b rdfs:seeAlso <http://example.org/foaf/bobFoaf> . <http://example.org/foaf/bobFoaf> rdf:type foaf:PersonalProfileDocument . _:b foaf:name &quot;Bob&quot; . _:b foaf:mbox <mailto:bob@work.example> . _:b foaf:age 32 . # Graph: http://example.org/foaf/bobFoaf @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:1 foaf:mbox <mailto:bob@work.example> . _:1 rdfs:seeAlso <http://example.org/foaf/bobFoaf> . _:1 foaf:age 35 . <http://example.org/foaf/bobFoaf> rdf:type foaf:PersonalProfileDocument .
  20. 20. Querying the Dataset - Accessing Graph Labels PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?src ?bobAge WHERE { GRAPH ?src { ?x foaf:mbox <mailto:bob@work.example> . ?x foaf:age ?bobAge } } 35 <http://example.org/foaf/bobFoaf> 32 <http://example.org/foaf/aliceFoaf> bobAge src
  21. 21. Querying the Dataset - Restricting by Graph Label PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX data: <http://example.org/foaf/> SELECT ?age WHERE { GRAPH data:bobFoaf { ?x foaf:mbox <mailto:bob@work.example> . ?x foaf:age ?age } } 35 age
  22. 22. Querying the Dataset - Restricting via Query Pattern PREFIX data: <http://example.org/foaf/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?mbox ?age ?ppd WHERE { GRAPH data:aliceFoaf { ?alice foaf:mbox <mailto:alice@work.example> ; foaf:knows ?whom . ?whom foaf:mbox ?mbox ; rdfs:seeAlso ?ppd . ?ppd a foaf:PersonalProfileDocument . } . GRAPH ?ppd { ?w foaf:mbox ?mbox ; foaf:age ?age } } <http://example.org/foaf/bobFoaf> 35 <mailto:bob@work.example> ppd age mbox
  23. 23. Query Execution and Ordering <ul><li>Optional-1 : an optional pattern that has a common variable with a(more) basic graph pattern(s) must be executed after the basic graph pattern(s) </li></ul><ul><li>Optional-2 : there can't be two optionals with a common variable, if that variable does not occur in a basic graph pattern as well </li></ul><ul><li>Constraint : constraints are evaluated after variables are assigned values </li></ul>
  24. 24. Query forms: <ul><ul><li>SELECT </li></ul></ul><ul><ul><ul><li>returns all, or a subset of the variables bound in a query pattern match </li></ul></ul></ul><ul><ul><ul><li>formats : XML or RDF/XML </li></ul></ul></ul><ul><ul><li>CONSTRUCT </li></ul></ul><ul><ul><ul><li>returns an RDF graph constructed by substituting variables in a set of triple templates </li></ul></ul></ul><ul><ul><li>DESCRIBE </li></ul></ul><ul><ul><ul><li>returns an RDF graph that describes the resources found. </li></ul></ul></ul><ul><ul><li>ASK </li></ul></ul><ul><ul><ul><li>returns whether a query pattern matches or not. </li></ul></ul></ul>
  25. 25. CONSTRUCT Examples(I) PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> CONSTRUCT { <http://example.org/person#Alice> vcard:FN ?name } WHERE { ?x foaf:name ?name } @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name &quot;Alice&quot; . _:a foaf:mbox <mailto:alice@example.org> . @prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>. <http://example.org/person#Alice> vcard:FN &quot;Alice&quot; . #extracting a whole graph from the target RDF dataset CONSTRUCT { ?s ?p ?o } WHERE { GRAPH <http://example.org/myGraph> { ?s ?p ?o } . }
  26. 26. CONSTRUCT Examples(II) accesing a graph conditional on other information contained in the metadata about named graphs in the dataset PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX app: <http://example.org/ns#> CONSTRUCT { ?s ?p ?o } WHERE { GRAPH ?g { ?s ?p ?o } . { ?g dc:publisher <http://www.w3.org/> } . { ?g dc:date ?date } . FILTER app:myDate(?date) > &quot;2005-02-8T00:00:00Z&quot;^^xsd:dateTime. }
  27. 27. DESCRIBE PREFIX ent: <http://myorg.example/employees#> DESCRIBE ?x WHERE { ?x ent:employeeId &quot;1234&quot; } @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0> . @prefix myOrg: <http://myorg.example/employees#> . _:a myOrg:employeeId &quot;1234&quot; ; foaf:mbox_sha1sum &quot;ABCD1234&quot; ; vcard:N [ vcard:Family &quot;Smith&quot; ; vcard:Given &quot;John&quot; ] . foaf:mbox_sha1sum rdf:type owl:InverseFunctionalProperty .
  28. 28. ASK @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:a foaf:name &quot;Alice&quot; . _:a foaf:homepage <http://work.example.org/alice/> . _:b foaf:name &quot;Bob&quot; . _:b foaf:mbox <mailto:bob@work.example> . PREFIX foaf: <http://xmlns.com/foaf/0.1/> ASK { ?x foaf:name &quot;Alice&quot; } .
  29. 29. Testing Values <ul><li>Named functions and syntactically constructed operations: </li></ul><ul><ul><li>operands: subset of XML Schema DataTypes {xsd:string, xsd:decimal, xsd:double, xsd:dateTime} and types derived from xsd:decimal. </li></ul></ul><ul><li>Subset of XPath functions and operators </li></ul><ul><ul><li>Operands: xs:string, xs:double, xs:float, xs:decimal, xs:integer, </li></ul></ul><ul><ul><li>xs:dateTime </li></ul></ul><ul><ul><li>additional operators: sop:RDFterm-equal, sop:bound , sop:isURI, sop:isBlank, sop:isLiteral, sop:str , sop:lang, sop:datatype, sop:logical-or, sop:logical-and </li></ul></ul><ul><li>Type Promotion : xs:double, xs:float, xs:decimal </li></ul><ul><ul><li>each of the numeric types is promoted to any type higher in the above list when used as an argument to function expecting that higher type. </li></ul></ul>
  30. 30. Support for SPARQL <ul><li>SPARQL and Jena </li></ul><ul><ul><li>module called ARQ that implements SPARQL; also parses queries expressed in RDQL or its own internal language. </li></ul></ul><ul><ul><li>not yet part of the standard Jena distribution; availbale from either Jena‘s CVS repository or as a self-contained download </li></ul></ul><ul><li>Twinkle </li></ul><ul><ul><li>simple Java interface that wraps the ARQ SPARQL Processor library (the add-on to Jena). </li></ul></ul><ul><li>Redland </li></ul><ul><ul><li>set of free software packages that provide support for RDF, including querying with RDQL and SPARQL using the Rasqal RDF Query Library. . </li></ul></ul>
  31. 31. Contact <ul><li>Romania </li></ul><ul><li>Dia Miron – Recognos Romania </li></ul><ul><li>Email: [email_address] </li></ul><ul><li>www.recognos.ro </li></ul><ul><li>USA </li></ul><ul><li>George Roth – Recognos USA </li></ul><ul><li>Email: [email_address] </li></ul><ul><li>www.recognos.com </li></ul>

×