Semantic web, social media – SemantycznyWeb

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:

SPARQL result with 3 rows
?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:

SPARQL result with 3 rows
?fullName ?mail
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
:, , ,

4 Comments for this entry

  • Piotr

    ciekawy artykuł, ale ciekawi mnie też jak można tworzyć zapytania w SPARQL dla ontologii zbudowanej w OWL, a nie RDF?

  • admin

    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ń…

  • Sebastian

    Piotr, wiecej na temat samego SPARQL możesz dowiedzieć się na stronach Szkoły Web 3.0 http://www.semanticschool.com/tag/sparql/

    Zapraszam

  • Piotr

    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.

Zostaw komentarz

Spam protection by WP Captcha-Free




Szukasz czegoś?

Użyj formularza:

Jeśli nadal nie możesz nic znaleźć, napisz do mnie!

Polecane strony