9 RDF-kyselykielten perusteet: SPARQL Pelkkä yhteensopiva tietomalli ei sovellusten toteuttamiseen tietenkään riitä. RDFsovellusten yleiskäyttöisen perustan muodostavat erilaisten kyselyrajapinnat ja - prosessorit. Tilanne on vastaava kuin XML:n ja XQueryn tapauksessa. Seuraavassa tarkastelemme SPARQLkyselykieltä. SPARQL on melko yksinkertainen kyselykieli joka yhdistelee esim. N3:n (tai Turtlen) ja XQueryn piirteitä. Tätä kirjoittaessa SPARQL-työ on W3C:ssä vielä kesken (mutta last call -vaiheessa) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 167
9.1 Välisoitto Käytännön tiedonhallinnan sovelluksissa keskeiset pulmat liittyvät yleensä tiedon - saatavuuteen - esitystavan virheettömyyteen - sisällön oikeellisuuteen - aineiston täydellisyyteen ja ylläpitoon - jne. Nyt puhumme (taas) vain tekniikasta! MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 168
9.2 RDF ja kyselysovellukset Koska RDF voidaan jäsentää tietokannan tavoin, luonteva tapa rakentaa sovelluksia on taas abstrahoida RDF-data kyselyn (Query) kohteeksi Kyselykielet voidaan jakaa suunnilleen kolmeen luokkaan: - paljaan RDF-tietomallin varassa toimivat kyselyt (ei "tulkintaa") - RDF-skeemojen, OWLin, tms. neutraalin käsitemallin varassa toimivat kyselyt (sisäänrakennettu päättely ja notaatio esim. aliluokkien hallintaan) - kuten edellä, mutta lisäksi oletuksena sovelluskohtainen päättelymekanismi tms. (esim. aikaan tai paikkatietoihin sidottu päättely) Eri lähestymistapojen edut ovat melko ilmeisiä (kyselylausekkeiden ilmaisuvoima vs. kirjoitusasun pituus), samoin haitat (kyselyjen monimutkaisuus ja laskennan raskaus [erityisesti päättelyn osalta!]) Kyynisempi lukija voi miettiä: mihin XQuery riittäisikään jos olisi de facto normalisoitu RDF/XML-formaatti (vastaus: "no, päättely olisi hankalaa...") MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 169
9.3 RDQL, Jena & ARQ RDF-tietomallin perusteella on määritelty lukuisia kyselykieliä joiden perusteella W3C standardoi omaansa, nimellä SPARQL (SPARQL Protocol And RDF Query Language) Kukaties suosituin yksinkertainen RDF-kyselykieli on "perinteisesti" ollut RDQL (RDF Query Language) - hyvin yksinkertainen, paljaan RDF-tietomallin kyselykieli - toteutus esim. osana (Java-pohjaista) Jena -sovelluskehikkoa RDQL on "valmis", muttei "standardi", SPARQL taas on vasta kehitteillä Käytännössä tutustumme seuraavassa SPARQL-kyselykieleen koska: - se muodostunee de facto -standardiksi ("ja opimmepahan RDQL:ää") - saatavilla on jo välineitä ("RDQL-tuki laajenee SPARQL-tueksi") - esim. Jenan moduuli ARQ tukee jo SPARQL-kieltä ja helposti saatavilla MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 170
9.4 Esimerkki: SPARQL-kysely (1/2) Haetaan "resurssit jotka on kirjattu tietyille päiville": PREFIX a: <http://www.w3.org/2000/10/annotation-ns#> PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX xsd: <http://www.w3.org/2001/xmlschema#> SELECT?annotates FROM <http://example.org/data.ttl> WHERE {?annot a:annotates?annotates.?annot dc:date?date. FILTER (?date = xsd:datetime("2004-01-01t00:00:00z")?date = xsd:datetime("2005-01-01t00:00:00z") ) } Huomioita: - syntaksi yhdistelmä SQL:ää ja N3:sta (Turtle...) - kysely pohjautuu suoraan RDF-graafin rakenteeseen - käytössä on rakentajia ja operaattoreita (käytännössä "XQueryn mukaan") - palauttaa (nyt) listarakenteen joka itsessään ei ole RDF-graafi MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 171
9.5 Esimerkki: SPARQL-kysely (2/2) Sovelletaan yo. kyselyä oheiseen dataan: @prefix a: <http://www.w3.org/2000/10/annotation-ns#>. @prefix dc: <http://purl.org/dc/elements/1.1/>. _:b a:annotates <http://www.w3.org/tr/rdf-sparql-query/>. _:b dc:date "2004-12-31T19:01:00-05:00"^^<http://www.w3.org/2001/XMLSchema#dateTime>....tuloksena taulukko ("oikeasti" XML-dataa tai esim. iteraattori) annotates ---------------------------------------- <http://www.w3.org/tr/rdf-sparql-query/> Jos olisi kysytty useita muuttujia (esim.?date), tulos olisi voinut olla esim. annotates date ------------------------------------------+---------------------------- <http://www.w3.org/tr/rdf-sparql-query/> 2004-12-31T19:01:00-05:00 MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 172
9.6 SPARQL, perusidea SPARQL on pohjimmiltaan melko yksinkertainen kyselykieli: - kysely nojautuu vahvasti RDF-graafin rakenteeseen (Patterns) - SPARQL-kyselyt eivät oletuksena tulkitse semanttista tietoa (päättely) - kyselymekanismi kuitenkin sallii laajennukset Kysely voi nyt... - hakea "raakatietoa" RDF-datasta (esim. taulukon URI-nimiä) - tuottaa tuloksena uuden RDF-graafin (ts. tuottaa RDF-dataa) Yhden ja saman kyselyn voi yleensä esittää usein eri tavoin (ja kuten SQL:ssä tuloksena on eroja paitsi syntaksin, myös suorituskyvyn osalta) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 173
9.7 SPARQL-kielioppi SPARQL-kysely (GP, DS, SM, R) sisältää seuraavia osia: - graafeja (ja lausumia) sovittavia hahmoja (Graph Pattern, Triple Pattern) - RDF-datalähteen (RDF Dataset) - muuntimia (Solution Modifier) - tulostimen (Result Form) Lähemmin tarkasteltuna kyselystä löytyy erityisesti - avainsanoja (Keyword), esim. kyselyhahmon (Query Pattern) ilmaiseva WHERE - termejä (Term), eli IRI-nimiä, literaaleja ja tyhjiä solmuja, esim. foaf:name - muuttujia (Query Variable), esim.?x Iso osa rakenneosista on valinnaisia, esim. datalähde (FROM) voi käydä ilmi kyselyn kontekstista MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 174
9.8 Kyselyiden anatomia (1/5): hahmot ja muuttujat Tyypillinen kysely on kiinnostunut tiettyjen muuttujien arvoista, asettaa ehtoja joita datalähteen tulee noudattaa ja kirjoittaa vastauksen helposti käsiteltävään muotoon, esim. PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT?name?mbox WHERE {?x foaf:name?name ; foaf:mbox?mbox. FILTER ( lang(?name) = "ES" ) } Huomioita: - huomaa lyhennemerkintä (yhteinen subjekti ja ";") - osa muuttujista voi esiintyä vain esim. WHERE-osan sisällä (?x) - muuttujien ja prefiksinimien valinnalla ei juuri ole merkitystä (muuttujat...) - ilmeisestikään tehokas strategia ei ole kasata kaikkea maailman RDFdataa yhteen nippuun ja filtteröidä sitä MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 175
9.9 Kyselyiden anatomia (2/5): datatyypit ja rajaus Kyselyt voivat tietenkin myös kysellä tietoja datatyyppeihin vedoten SELECT?v WHERE {?v?p "abc"^^<http://example.org/datatype#specialdatatype> } XQuery hyödyntää lyhennemerkintöjä mm. RDF-primitiiveihin ja datatyyppeihin liittyen - esim.?x a :Class1 tarkoittaa?x rdf:type :Class1 - esim. "42" on merkkijono, 42 tyyppiä xsd:integer; 1.7e2 ja true vastaavasti Tulosjoukon rajoittaminen onnistuu siis FILTER-avainsanalla: SELECT?title?price WHERE {?x ns:price?price. FILTER (?price < 30). # huomaa kohta johon FILTER on kirj.?x dc:title?title. } MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 176
9.10 Kyselyiden anatomia (3/5): valinnaisuus ja vaihtoehdot Kysely voi sisältää valinnaisia osia (ts. evaluoidaan jos annettu) 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) } } Kysely voi sisältää vaihtoehtoisia osia (ts. jompikumpi tai molemmat) PREFIX dc10: <http://purl.org/dc/elements/1.0/> PREFIX dc11: <http://purl.org/dc/elements/1.1/> SELECT?title WHERE { {?book dc10:title?title } UNION {?book dc11:title?title } } MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 177
9.11 Kyselyiden anatomia (4/5): nimetyt graafit Datalähde voi koostua nimetyistä RDF-graafeista (Named Graph) PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX data: <http://example.org/foaf/> SELECT?nick WHERE { GRAPH data:bobfoaf {?x foaf:mbox <mailto:bob@work.example>.?x foaf:nick?nick } } Nimetyt graafit voidaan tietää myös kontekstin perusteella ja graafien yli voidaan iteroida: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT?src?bobNick WHERE { GRAPH?src {?x foaf:mbox <mailto:bob@work.example>.?x foaf:nick?bobnick } } MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 178
9.12 Kyselyiden anatomia (5/5): datalähteet ja nimeäminen Nimetyt graafit voidaan käytännössä kertoa datalähdeen esittelyn yhteydessä (FROM ja FROM NAMED): PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT?who?g?mbox FROM <http://example.org/dft.ttl> FROM NAMED <http://example.org/alice> FROM NAMED <http://example.org/bob> WHERE {?g dc:publisher?who. GRAPH?g {?x foaf:mbox?mbox } } "Nimeämätöntä graafia" joka esimerkeissämme on esiintynyt datalähteenä, kutsutaan oletusgraafiksi (Default Graph) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 179
9.13 Neljä SPARQL-sovellusta: tulosten esittäminen Kysely voi palauttaa tuloksen loogisesti eri muodoissa; SPARQL määrittelee seuraavat "tulostajat": - SELECT: palauttaa valittujen muuttujien mukaisen "taulukon" - CONSTRUCT: palauttaa RDF-graafin joka rakennettu kyselymuuttujista - DESCRIBE: palauttaa RDF-graafin joka kuvaa löydettyjä resursseja - ASK: palauttaa totuusarvon (true/false) SPARQL mahdollistaa siis esim. - raakatiedon hakemisen, - RDF-muunnokset, sekä - yksinkertaiset asiantuntijajärjestelmät (vrt. Prolog ilman sääntöjä) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 180
9.14 SELECT pähkinänkuoressa SELECT-kyselyyn voi sisältyä muuntimia: - Projection: "tavallinen kysely" - DISTINCT: ei toisteta tuloksen monikoita - ORDER BY: järjestetään tietyn muuttujan mukaan (ASC/DESC-järjestys) - LIMIT: montako monikkoa otetaan tulokseen - OFFSET: monennestako tuloksen monikosta alkaen tulostetaan Esim. PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT?name WHERE {?x foaf:name?name } ORDER BY?name LIMIT 5 # ts. 5 tulosta joista ensimmäisenä näytetään 10. tulos, OFFSET 10 # toisena 11. tulos, jne. MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 181
9.15 CONSTRUCT pähkinänkuoressa, esimerkki PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> CONSTRUCT {?x vcard:n _:v. _:v vcard:givenname?gname. _:v vcard:familyname?fname } WHERE { {?x foaf:firstname?gname } UNION {?x foaf:givenname?gname }. {?x foaf:surname?fname } UNION {?x foaf:family_name?fname }. } Huomioita - rakentajaan muodostetaan tuloksen lausumarakenne kolmikoiden avulla - myös muuntimia voidaan käyttää MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 182
9.16 DESCRIBE pähkinänkuoressa, esimerkki SPAQRL-prosessorilta pyydetään tiettyjä resursseja kuvaavaa RDF-graafia PREFIX foaf: <http://xmlns.com/foaf/0.1/> DESCRIBE?x WHERE {?x foaf:mbox <mailto:alice@org> } Huomioita - perusidea on se, että tulosgraafi sisältää identifioituja resursseja kuvaavia lausumia - prosessori päättää tuloksen (ja voi ilmeisesti jopa lisätä siihen omia tietojaan) VAROITUS: DESCRIBE-tulostajan semantiikka ei tätä kirjoittaessa ole vielä täysin selvä (ja saattaa jopa pudota suosituksesta pois) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 183
9.17 ASK pähkinänkuoressa, esimerkki Kysytään ehdon toteutumista: PREFIX foaf: <http://xmlns.com/foaf/0.1/> ASK {?x foaf:name "Alice" ; foaf:mbox <mailto:alice@work.example> } "Tuloksena saadaan yes tai no" (pitäisi olla xsd:boolean...) Kyse on oikeastaan vain SELECT-kyselyn kuorruttamisesta (ts. oliko vastaus tyhjä?) Toteuttaa oleellisesti ehtolausekkeen joka voi toimia esim. reaktiivisen järjestelmän liipaisimena MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 184
9.18 Lausekkeiden rakentaminen SPARQL määrittelee tukun operaattoreita joiden avulla erityisesti hahmojen määrittely tehostuu (huomaa että mukana on esim. not()-operaattori!) - XQuery Connectives: A B, A&&B - XPath Tests: A=B, A!=B, A=B, A<B, A>B, A<=B, A>=B, A*B, A/B, A+B, A- B,!A, +A, -A - SPARQL Tests: A=B, A!=B, BOUND(A), isuri(a), isblank(a), isliteral(a), REGEX(STRING, PATTERN [, FLAGS]) - SPARQL Casts: STR(A), LANG(A), DATATYPE(A) Operaattoreita on määritelty rinnakkain useille tietotyypeille: - konnektiivit boolean-tyypille, ehdot eri vertailtaville tietotyypeille - testit ja cast-operaatiot termeille, muuttujille ja literaareille Käytössä on myös rakentajia (Constructor): bool, dbl, flt, dec, int, dt, str, IRI, litrl MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 185
9.19 SPARQL-protokolla ja sarjallistaminen (1/3) SPARQL on osa suurempaa W3C:n RDF Data Access -työryhmän työtä - Protocol, Query Results XML Format, Query Language for RDF Työ määrittelee esim. SELECT-lauseen tuloksen XML-muodossa, palveluna á la Semantic Web Services Esimerkki, SPARQL-kysely: PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT?who?g?mbox WHERE {?g dc:publisher?who. GRAPH?g {?x foaf:mbox?mbox } } MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 186
9.20 SPARQL-protokolla ja sarjallistaminen (2/3) HTTP-kutsu (huh!): GET /sparql/?query=encodedquery&default-graphuri=http://my.example/publishers &default-graph-uri=http://my.example/morepublishers&named-graphuri=http://your.example/foaf-alice &named-graph-uri=http://www.example/foaf-bob&named-graphuri=http://www.example/foaf-susan &named-graph-uri=http://this.example/john/foaf Host: my.example User-agent: sparql-client/0.1 (Huomaa että nyt pätkitty usealle riville tulostusta varten) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 187
9.21 SPARQL-protokolla ja sarjallistaminen (3/3)...ja lopulta tulos HTTP/1.1 200 OK Date: Wed, 03 Aug 2005 12:48:25 GMT Server: Apache/1.3.29 (Unix) PHP/4.3.4 DAV/1.0.3 Connection: close Content-Type: application/sparql-results+xml; charset=utf-8 <?xml version="1.0"?> <sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head> <variable name="who"/> <variable name="g"/> <variable name="mbox"/> </head>... </sparql> MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 188
9.22 Sovelluksista Kuten Jena-sovelluskehys, myös ARQ-prosessori on saatavilla verkossa - ks. http://jena.sourceforge.net/ - ks. http://jena.sourceforge.net/arq/ Tulevaisuudessa ARQ lisättäneen standardimoduuliksi Jenaan Helpoin tapa SPARQL-kyselyiden kokeiluun on sopivan verkkopalvelun käyttö - ks. esim. http://www.sparql.org/query.html (Jenan ARQ verkossa) Muitakin toteutuksia toki on (esim. Rasqal ja twinql) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 189
9.23 Lopuksi SPARQL-kyselykieli auttaa jäsentämään Semanttisen Webin suurena "RDF-tietokantana" josta tieto on helposti saatavilla Käytännön sovellusten näkökulmasta pulmallista on esim. puuttuvan, muuttuvan ja virheellisen tiedon hallinta (RDF on kuitenkin pohjimmiltaan rajapinta) Kyselysovellukset ovat kaiketi suoraviivaisin tapa SW-sovellusten toteuttamiseen, mutta sovelluslogiikan näkökulmasta pintaa on vasta raapaistu... (mutta legacymaailma vie toki ideat helposti mennessään) MATHM-57200 RAKENTEISTEN DOKUMENTTIEN JATKOKURSSI (syksy 2005) - ON 190