SPARQL – cz. 1: Wstęp do odpytywania grafów RDF
W piątek obiecałem, że dziś dowiecie się jak zadawać zapytania na grafie RDF za pomocą języka zapytań SPARQL. Zapowiada się kolejny cykl, tym razem jeszcze dłuższy niż poprzednie, bo chce omówić kolejne aspekty SPARQLa krok po kroku.
Dlaczego warto poznać SPARQL ? Jeszcze kilka lat temu każda baza RDF implementowała swój język zapytań na grafie RDF. Tak zgadliście: próba przeniesienia się z jednego repozytorium do drugiego była koszmarem. Dodatkowo, chociaż nie wiele wówczas serwisów udostępniało publicznie swoje dane, to bez jednego standardu zapytań konieczne było pisanie agentów semantycznych, które potrafiły zadawać zapytania w różnych językach.
Wraz z popularyzacją języka SPARQL przez W3C (SPARQL obchodził niedawno 2 lata od opublikowania jako rekomendacja W2 sytuacja się drastycznie zmieniła: SPARQL jest na tyle popularny, że udostępnianie tzw. SPARQL endpoint jest jednym z de facto standardów funkcjonowania serwisów semantycznych zgodnych z Linked Open Data. Innym ciekawym przykładem wykorzystania języka SPARQL jest projekt sparqlTeX, dzięki któremu możemy automatycznie aktualizować dokumenty PDF w oparciu o dane z serwisów udostępniających SPARQL endpoint.
W chwili obecnej trwają prace nad kolejną wersją języka; napiszemy o proponowanych zmianach pod koniec cyklu.
Być może części z was nazwa SPARQL przywodzi na myśl SQL. Podobieństwo w nazwie jest częściowo zamierzone ... podobnie jak w przypadku formatu zapytań.
Weźmy pod uwagę prosty graf RDF:
<http://www.semanticschool.com/2010/02/sparql-wstep/> <http://purl.org/dc/elements/1.1/title> "SPARQL - cz. 1: Wstęp do odpytywania grafów RDF".
<http://www.semanticschool.com/2010/02/sparql-wstep/> <http://purl.org/dc/elements/1.1/creator> "Sebastian Ryszard Kruk".
Jeżeli chcemy zapytać o tytul artykułu pod adresem http://www.semanticschool.com/2010/02/sparql-wstep/ możemy to zrobić za pomocą zapytania:
SELECT ?tytul
WHERE
{
<http://www.semanticschool.com/2010/02/sparql-wstep/> <http://purl.org/dc/elements/1.1/title> ?tytul.
}
Zapytania SPARQL zaczynamy słowem SELECT, po którym wypisujemy listę zmiennych o które pytamy. Zaś w sekcji WHERE wewnątrz nawiasów sześciennych wpisujemy szablon grafu RDF (w formacie Turtle), gdzie pewne elementy grafu zastępujemy zmiennymi rozpoczynającymi się od znaku zapytania.
Przyznacie jednak, że ciągłe wpisywanie pełnych URI nie jest zbyt wygodne. Podobnie jak w przypadku języka Turtle, możemy skorzystać z prefiksów. Poprzednie zapytanie wyglądałoby następująco:
PREFIX dc: <http://purl.org/dc/elements/1.1/> .
SELECT ?tytul
WHERE
{
<http://www.semanticschool.com/2010/02/sparql-wstep/> dc:title ?tytul.
}
Kilka z prefiksów jest zdefiniowanych domyślnie:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>.
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>.
A co jeśli chcemy zapytać więcej informacji o danym zasobie ? Nic prostszego. Dla następującego grafu
<http://www.semanticschool.com/2010/02/sparql-wstep/> <http://purl.org/dc/elements/1.1/title> "SPARQL - cz. 1: Wstęp do odpytywania grafów RDF".
<http://www.semanticschool.com/2010/02/sparql-wstep/> <http://purl.org/dc/elements/1.1/creator> "Sebastian Ryszard Kruk".
<http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/> <http://purl.org/dc/elements/1.1/title> Semantyczne SEO, czyli jak zwiększyć widoczność stron w wyszukiwarkach przy pomocy ontologii Good Relations i RDFa".
<http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/> <http://purl.org/dc/elements/1.1/creator> "Arkadiusz Kwoska".
nieznacznie zmodyfikowane zapytanie SPARQL
PREFIX dc: <http://purl.org/dc/elements/1.1/> .
SELECT ?url, ?tytul, ?autor
WHERE
{
?url dc:title ?tytul.
?url dc:creator ?autor.
}
otrzymamy w wyniku:
| http://www.semanticschool.com/2010/02/sparql-wstep/ | SPARQL - cz. 1: Wstęp do odpytywania grafów RDF | Sebastian Ryszard Kruk |
| http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/ | Semantyczne SEO, czyli jak zwiększyć widoczność stron w wyszukiwarkach przy pomocy ontologii Good Relations i RDFa | Arkadiusz Kwoska |
W zapytaniu możemy wybierać trójki na podstawie literałów w zdaniu. Na przykład dla grafu:
@prefix dc: <http://purl.org/dc/elements/1.1/> .
<http://www.semanticschool.com/> dc:lang "Polski".
<http://semdl.info/> dc:lang "English".
<http://semdl.info/> dc:type "Site"@en.
<http://www.semanticschool.com/> dc:type "Strona"@pl.
<http://www.semanticschool.com/> <http://example.com/articleCount> 43.
<http://blog.knowledgehives.com/> <http://example.com/articleCount> 9.
<http://semdl.info/> dc:date "02/01/2010"^^xsd:date.
<http://www.semanticschool.com/> dc:date "09/19/2009"^^xsd:date.
<http://semdl.info/> <http://example.com/inPolish> "false"^^xsd:boolean.
<http://www.semanticschool.com/> <http://example.com/inPolish> "true"^^xsd:boolean.
Poniższe zapytanie wypisze stronę napisaną po angielsku
PREFIX dc: <http://purl.org/dc/elements/1.1/> .
SELECT ?url WHERE { ?url dc:lang "English". }
A to stronę typu "Strona", gdzie literał ma ustalony język "pl". W następnych odcinkach napiszę co zrobić jeżeli nie znamy języka literału, lub nie wiemy czy język został w ogóle podany.
PREFIX dc: <http://purl.org/dc/elements/1.1/> .
SELECT ?url WHERE { ?url dc:type "Strona"@pl. }
Możemy też zapytać o ilość:
SELECT ?url WHERE { ?url <http://example.com/articleCount> 43. }
o datę:
PREFIX dc: <http://purl.org/dc/elements/1.1/> .
SELECT ?url WHERE { ?url dc:date "09/19/2009"^^xsd:date. }
lub o wartości typu prawda / fałsz.
SELECT ?url WHERE { ?url <http://example.com/inPolish> true. }
Jak widać SPARQL jest całkiem prosty. W następnym odcinku nauczymy się jak konstruować zapytań dotyczące większych obszarów grafu RDF w tym nienazwanych węzłów (ang. blank nodes).
Szkoła Web 3.0

