SPARQL – cz. 2: Odpytywanie po ścieżce w grafie RDF
Na wczorajszym wykładzie poznaliśmy podstawy języka SPARQL. Dziś napiszę o tym jak odpytywać graf RDF zawierający blank node'y, jak budować zapytania zawierające ścieżki w grafie, oraz jak zapisywać te zapytania krócej.
W poprzednim odcinku nauczyliśmy się jak znaleźć URI zasobu lub jego właściwości korzystając z prostych zapytań.

Weźmy teraz pod uwagę powyższy graf. Załóżmy, że chcemy wskazać zasób :A; możemy go opisać następującymi zdaniami:
:A :b :B.
:A :b :C.
:B :e :E.
:B :e :F.
:B :e :G.
Jeżeli nie znalibyśmy niektórych z informacji w grafie, np.: zasobu :B czy właściwości :e, informacja o zasobie :A wyglądałaby następująco:

:A :b ?x.
:A :b :C.
?x ?y :E.
?x ?y :F.
?x ?y :G.
Tym samym zapisaliśmy podstawowe reguły do zapytania SPARQL, które wyglądałoby następująco:
SELECT ?a
WHERE
{
?a :b ?x.
?a :b :C.
?x ?y :E.
?x ?y :F.
?x ?y :G.
}
To zapytanie wskaże nam wszystkie zasoby ?a, które wraz z zasobami :C, :E, :F i :G będą tworzyć podany podgraf.

Jeżeli pamiętacie Turtle, to zapewne zaczęliście się zastanawiać czy nie udałoby się zapisać krócej informacji o tym podgrafie; podobnie jak w Turtle. Podobnie jak w języku Turtle poszczególne grupy predykat-obiekt (dla tego samego podmiotu) oddzielamy średnikiem, a poszczególne obiekty (dla tej samej pary podmiot-predykat) oddzielamy przecinkiem. Nasze zapytanie wyglądać może więc następująco:
SELECT ?a
WHERE
{
?a :b ?x; :b :C.
?x ?y :E, :F, :G.
}
Wszystko wydaje się proste kiedy mamy do czynienia z zasobami które możemy jednoznacznie zidentyfikować za pomocą URI albo zawartości literału. Co jednak w przypadku nienazwanych węzłów (blank nodes). W tym przypadku jedynym sposobem na zidentyfikowanie węzła jest jego jednoznaczne oznaczenie za pomocą najmniejszego możliwego podgrafu.
W zapytaniach SPARQL poszczególne bnode'y możemy zapisać za pomocą notacji _:label lub nawiasów kwadratowych.
Nieznacznie zmodyfikujmy powyższy graf, zastępując zasób :C bnodem o etykiecie _:c

W tym przypadku nasze zapytanie mogłoby wyglądać następująco:
SELECT ?a
WHERE
{
?a :b ?x; :b _:c.
?x ?y :E, :F, :G.
}
Ale nie możemy pozostawić samego _:c, bo mogłoby oznaczać dowolny bnode, czyli byłoby to mało precyzyjne. Zamiast tego nasze zapytanie mogłoby wyglądać następująco:
SELECT ?a
WHERE
{
?a :b ?x; :b _:c.
_:c :d :F.
?x ?y :E, :F, :G.
}
Ponieważ wartość bnode nie ma znaczenia, możemy zastąpić nasze zapytanie korzystając z nawiasów kwadratowych:
SELECT ?a
WHERE
{
?a :b ?x; :b [ :d :F ].
?x ?y :E, :F, :G.
}
Zapis [ :d :F ] jest jednoznaczny z [] :d :F i zastępuje oznaczenie _:c.
Na zakończenie dzisiejszego wykładu jeszcze jeden sposób na skracanie zapytań SPARQL: za każdym razem kiedy chcemy skorzystać z predykatu rdf:type możemy go zastąpić litera a, na przykład dla poniższego grafu

zapytanie
SELECT ?a WHERE { ?a rdf:type : D }
możemy zastąpić nieznacznie krótszym.
SELECT ?a WHERE { ?a a : D }


Luty 12th, 2010 - 02:59
Prościej i lepiej już się nie da – tak jest super :). Dzięki bardzo za kolejny konkretny wpis! Odpytywanie za pomocą sparql to genialna sprawa.