Wstęp do SPARQL z wykorzystaniem RAP API dla PHP
przez admin dnia lut.20, 2010, w Programowanie
Jedną z idei semantycznej sieci www jest opisywanie zasobów za pomocą skierowanych grafów RDF. Gdy mamy już owe grafy zapisane np. w plikach .rdf musimy mieć możliwość ich przeszukiwania wg. interesujących nas kryteriów. Językiem zapytań oraz protokołem dla plików RDF jest (uznany oficjalnie w 2008 roku przez W3C jako standard) SPARQL (SPARQL Protocol And RDF Query Language ) przypominający w swojej składni SQL.
SPARQL udostępnia cztery formy zapytań: SELECT, DESCRIBE, ASK i CONSTRUCT. Posiada podobnie jak SQL dodatkowe warunki typu ORDER BY, UNION, OPTIONAL itp. Zapytanie SELECT pozwala na zwrot szukanej wartości. CONSTRUCT umożliwia stworzenie grafu RDF na bazie zapytania. Chcąc dowiedzieć się czy dane zapytanie zwróci jakiś wynik można użyć polecenia ASK. Zapytanie DESCRIBE poda najmniejszy możliwy graf opisujący dany zasób.
Po zapoznaniu się z jego specyfikacją na stronie w3.org/TR/rdf-sparql-query/ możemy zacząć działać. Prostym narzędziem, które możemy wykorzystać do wykonywania zapytań na stworzonym przez nas pliku .rdf jest RAP API dla PHP. RAP to biblioteki dla PHP umożliwiające przetwarzanie plików RDF.
Stworzony przeze mnie przykładowy plik semanticemployee.rdf wygląda następująco:
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"> <rdf:Description rdf:about="http://semanticemployee.eu/employee/BillParker/"> <vcard:EMAIL>bill.p@example.eu</vcard:EMAIL> <vcard:FN>Bill Parker</vcard:FN> <vcard:TEL>>222555999</vcard:TEL> </rdf:Description> <rdf:Description rdf:about="http://semanticemployee.eu/employee/GeorgeSimpson/"> <vcard:EMAIL>george.s@example.eu</vcard:EMAIL> <vcard:FN>George Simpson</vcard:FN> <vcard:TEL>>999777222</vcard:TEL> </rdf:Description> <rdf:Description rdf:about="http://semanticemployee.eu/employee/MonicaMurphy/"> <vcard:EMAIL>monica.m@example.eu</vcard:EMAIL> <vcard:FN>Monica Murphy</vcard:FN> <vcard:TEL>>555777888</vcard:TEL> </rdf:Description> </rdf:RDF>
Pierwszym najprostszym zapytaniem na powyższym pliku będzie wyszukanie wszystkich imion pracowników. Wykorzystując język SPARQL możemy zapisać to tak:
PREFIX vcard <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?fullName
WHERE { ?x vcard:FN ?fullName }
Składnia zapytania jest dosyć prosta. Prefix oznacza wykorzystywaną przez nas przestrzeń nazw. W tym przykładzie wykorzystano przestrzeń nazw, która reprezentuje obiekty vCard w pliakch RDF. Wykorzystując RAP API, cały kod potrzebny do zwrócenia wyniku może wyglądać tak:
<?php $employees = ModelFactory::getDefaultModel(); $employees->load('semanticemployee.rdf'); $querystring = ' PREFIX vcard <http://www.w3.org/2001/vcard-rdf/3.0#> SELECT ?fullName WHERE { ?x vcard:FN ?fullName }'; echo $employees->sparqlQuery($querystring, 'HTML'); ?>
SPARQL Query Language for RDF
Jako wynik otrzymamy:
| ?fullName |
|---|
| Bill Parker |
| George Simpson |
| Monica Murphy |
Zwrócimy teraz wszystkie imiona i adresy e-mail posortowane malejąco zmieniając zapytanie na takie:
PREFIX vcard <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?fullName ?mail
WHERE { ?x vcard:FN ?fullName . ?x vcard:EMAIL ?mail }
ORDER BY DESC(?fullName)
W efekcie otrzymamy:
| ?fullName | |
|---|---|
| Monica Murphy | monica.m@example.eu |
| George Simpson | george.s@example.eu |
| Bill Parker | bill.p@example.eu |
I na koniec zapytanie typu CONSTRUCT. Chcemy otrzymać graf RDF taki, w którym znajdują są tylko imiona pracowników w kolejności rosnących numerów telefonów (zakładając, że są one w formie liczby takiej jak w przykładzie):
PREFIX vcard <http://www.w3.org/2001/vcard-rdf/3.0#>
CONSTRUCT { ? vcard:FN ?name }
WHERE { ? vcard:FN ?name ; vcard:TEL ?tel . }
ORDER BY ?tel
Otrzymany graf wygląda tak:
<!-- Generated by RdfSerializer.php from RDF RAP. # http://www.wiwiss.fu-berlin.de/suhl/bizer/rdfapi/index.html !--> xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"> Bill Parker Monica Murphy George Simpson
Marzec 11th, 2010 on 09:04
ciekawy artykuł, ale ciekawi mnie też jak można tworzyć zapytania w SPARQL dla ontologii zbudowanej w OWL, a nie RDF?
Marzec 16th, 2010 on 11:59
Hej
Zapytania dla ontologii zbudowanej w OWL przy użyciu SPARQL wyglądają w identyczny sposób. OWL to nic innego jak rozbudowany RDF Schema. A RDFS to rozbudowany RDF. Do szybkiego przetestowania zapytań na takich ontologiach możesz użyć OpenLink Virtuoso SPARQL protocol endpoint – http://dbpedia.org/sparql. Budowanie ontologii od podstaw to proces trochę żmudny i skomplikowany dla kogoś kto dopiero uczy się języka OWL więc warto skorzystać z gotowych rozwiązań…
Marzec 17th, 2010 on 13:31
Piotr, wiecej na temat samego SPARQL możesz dowiedzieć się na stronach Szkoły Web 3.0 http://www.semanticschool.com/tag/sparql/
Zapraszam
Marzec 24th, 2010 on 10:11
Dzięki za odpowiedzi. Tak, wiem że budowanie ontologii od podstaw to żmudny proces, ale sobie już poradziłem z tym. Zacząłem korzystać z tego RAP API i go trochę zmodyfikowałem.
Zastanawia mnie czy jest możliwe szukanie wg zapytania napisanego w ten sposób: „wyrażenie*” tak by wypisało mi obiekty które mają to słowo w swojej charakterystyce?
Bo jak na razie odnoszę wrażenie, że wyrażenie musi być tak napisane jak w ontologii aby zostały wywołane dane w niej zawarte.