RAP

Aby Sieć Semantyczna miała szansę zainteresować przeciętnych twórców dzisiejszego Internetu, muszą istnieć narzędzia SW pasujące do koncepcji aktualnego WWW. Prawdą jest, że najciekawsze oprogramowanie dla SW można dzisiaj tworzyć w technikach „ciężkich”, takich jak jawowe frameworki typu Sesame czy (genialna wręcz) Jena. Niestety bez „lekkich”, skryptowych rozwiązań władających dzisiejszym Internetem pozostanie to zabawa dla „wybitnie zainteresowanych”.

RDF API for PHP

Dlatego bardzo popieram istnienie takich rozwiązań jak RAP. Jest to biblioteka w PHP umożliwiająca wykorzystanie mechanizmów Sieci Semantycznej. Dzięki popularności PHP istnieje szansa, że zainteresuje aktualnych twórców stron czy aplikacji webowych, którzy z „ciężkim” programowaniem do czynienia na co dzień nie mają i mieć nie chcą.

RAP jest na pierwszy rzut oka wzorowany na API Jeny — widzimy tu zupełnie takie same pojęcia („model” jako graf RDF, „statement” jako trójka, analogiczne klasy Factory itd.). Ale to bynajmniej nie wada. Dzięki temu przyzwyczajeni do Jeny nie powinni mieć problemów ze zrozumieniem co się dzieje w RAP-ie. I odwrotnie — RAP może być doskonałym wstępem do oswojenia się z metodologią i późniejszego wykorzystania tej wiedzy przy użyciu Jeny.

to naprawdę działa

Prosty przykład — zobaczmy jakie są imiona, gatunek i płeć zwierzaków, o których wspominam w swoim profilu FOAF:

<?php
define("RDFAPI_INCLUDE_DIR", "../rdfapi-php/api/");
include(RDFAPI_INCLUDE_DIR . "RdfAPI.php");

$url = "http://mimas.ceti.pl/pub/mimas.rdf";

$model = ModelFactory::getInfModelF();
$model->load($url);

$rdql_query = 'SELECT ?profile
WHERE (?person <pet:hasPet> ?pet)
(?pet <pet:hasProfile> ?profile)
USING pet FOR <http://purl.org/stuff/pets/>';
$iter = $model->rdqlQueryAsIterator($rdql_query);

$petmodel = ModelFactory::getInfModelF();
while ( $iter->hasNext() )
{
$curren_result = $iter->next();
$petmodel->load($curren_result["?profile"]->uri);
};

$rdql_query = 'SELECT ?imie, ?gatunek, ?plec
WHERE (?pet <foaf:name> ?imie)
(?pet <foaf:gender> ?plec)
(?pet <pet:species> ?gatunek)
USING foaf FOR <http://xmlns.com/foaf/0.1/>
pet FOR <http://purl.org/stuff/pets/>';
$res = $petmodel->rdqlQuery($rdql_query);

RdqlEngine::writeQueryResultAsHtmlTable($res);
?>

Kod na tyle banalny, że chyba nie wymaga komentowania. Zastosowane zapytania zapisane są w RDQL, ponieważ RAP nie obsługuje jeszcze standardu SPARQL (ale będzie w kolejnej wersji, podobno w styczniu 2006)[1]. Wynik, tabelka HTML wypluta przez ostatnią linijkę tego kodu (lekko przeze mnie poprawiona, żeby pasowała do XHTML całej strony) wygląda tak:

No.?imie?gatunek?plec
1.Literal: MaurycyResource: http://purl.org/stuff/pets/CatLiteral: Male
2.Literal: KalmaResource: http://purl.org/stuff/pets/CatLiteral: Female

Niestety jest jeszcze jeden malutki zgrzyt — ze względu na zastosowanie fopen() w metodzie RdfParser::generateModel() powyższy przykład wymaga włączenia opcji allow_url_fopen w konfiguracji PHP. Na przeciętnym serwerze oferującym konta z PHP za tanie pieniądze („na bloga” i inne tego typu zastosowania) opcja ta najcześciej jest wyłączona „due to security reasons”...

i do czego to właściwie się przyda?

Możliwości oferowane przez RAP (zresztą podobnie jak w przypadku większości bibliotek dla SW) szybko się kurczą kiedy wejdziemy na grunt poważniejszych zastosowań typu wnioskowanie na podstawie ontologii OWL. „An inference engine supporting RDF-Schema reasoning and some OWL entailments” to troszkę za mało, żeby pokazać prawdziwie przyszłościowe, „inteligentne” zastosowanie, poważniejsze niż tylko RDF. O ile o rozproszonych modelach RDF przeszukiwanych przez RDQL można w ogóle mówić per „tylko”... ;-)

Szczerze mówiąc, nie sądzę, żeby ktoś usiłował oprogramować np. autonomicznego agenta SW w PHP. Natomiast jako zaplecze nowoczesnych aplikacji webowych, choćby i w ramach tego całego „Web 2.0”, RAP nadaje się znakomicie...

[1] Rekomendacja SPARQL (oficjalnie wciąż jeszcze WD) została opracowana stosunkowo późno — istniały już poważne zastosowania RDF-a, a wciąż nie było standardu języka zapytań. Dlatego powstało wiele innych (najczęściej podobnych do SQL-a) języków zapytań dla RDF, takich jak RDQL w RAP, SeRQL w Sesame itp. Aktualnie większość frameworków dla SW wprowadza obsługę języka SPARQL w nowych wersjach.

Komentarze

#1 | 2005.12.07 15:08 | Domel

To ja sie tradycyjnie już przyczepie :-) . Nie "Rekomendacja SPARQL" tylko specyfikacja SPARQL. Rekomendacja to dopiero będzie narazie jest szkic roboczy.

#2 | 2005.12.07 15:27 | MiMaS

Domel:

To ja sie tradycyjnie już przyczepie

I po co? Po pierwsze nie wnosisz nic do sprawy, a po drugie gadasz głupoty...

Oczywiście, jak przy każdym WD, W3C zastrzega:

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

czyli z prawnego punktu widzenia w ogóle nie możemy być pewni, że takie coś jak SPARQL kiedykolwiek powstanie. Ale każdy zdrowo myślący człowiek rozumie, że prędzej czy później będzie z tego oficjalna rekomendacja. Zatem w tej chwili jest to „Working Draft czegoś, co będzie rekomendacją”, czyli „rekomendacja w fazie WD” i tak właśnie napisałem. Oczywiście rekomendacja ta będzie zawierała opis pewnej specyfikacji, ale to też niczego nie zmienia. Tak czy inaczej EOT.

#3 | 2005.12.07 17:22 | Domel

MiMaS:
1. Wnosze do sprawy dużo bo prostuje bzdury, które napisałeś.
2. Głupoty to Ty gadasz i do tego nawet nie zrozumiałes o co mi chodziło. Więc jeszcze raz powoli, może zrozumiesz. "Rekomendacja SPARQL" to bzdura. Dokument, który teraz leży na TR w w3.org jest w statusie WD (po polsku szkic roboczy) _nie_ w statusie REC (po polsku rekomendacja). Termin ogólny do określania wszystkich dokumentów niezależnie od ich statusu okresla się mianem specyfikacji lub raportu technicznego. Więc mogłeś napisać "Specyfikacja SPARQL", "Raport techniczny SPARQL" lub bardziej szczegółowo "Szkic SPARQL", "Szkic roboczy SPARQL" ale nie rekomendacja. Poczytaj sobie rozdzial 7 w "Process", zresztą chyba nawet nie musisz czytać wystarczy, że pomyślisz co oznacza słowo "rekomendacja" i "rekomendować". I chyba dosyć szybko dojdziesz do wniosku ze W3C nie rekomenduje (jeszcze) używania SPARQL wiec domunet nie jest rekomendacja.
3. Wiesz co oznacza taki ciąg znaków jak ":-)", chyba nie do końca skoro rzucasz się na mnie jakbym był Twoim wrogiem.
4. Myślisz, że czemu to napisałem? Bo troche się na tym znam i biore udział w pisaniu _specyfikacji_, które sobie "wędrują po statusach" aż stana się rekomendacjami. Dlatego mam wątpliwości czy napewno masz kwalifikacje, żeby akurat mnie pouczać. A sprawa oczywisie dotyczy szczegółu ale jednak warta jest sprostowania bo niestety własne przez takie (swiadome bądź nie) dobieranie słów powstaja bzdury typu powoływanie sie na CSS 2.1 mimo, że jest dopiero szkicem zamiast na CSS 2.0, który jest rekomendacja.

#4 | 2005.12.08 00:40 | Marcin W. Dąbrowski

Panowie, i po co ta gadka? Kłotnia wynikła z treści przypisu... I mnie, jako czytelnika kompletnie nie interesuje. Wali mnie czy SPARQL jest draftem, specyfikacją, rekomendacją, czy czymkolwiek innym. Nie ma to znaczenia tak długo, jak długo się zapoznaję z technologią, a nie używam jej do czegoś konkretnego - gdzie standard już znaczenie ma (albo mieć powinien).

Dziś jest opis o klasie do PHP; krótki i treściwy, w sam raz by się pobawić. A jak już się liźnie RDQL-a, to potem przejście na SPARQL-a nie będzie bolesne (PREFIX zamiast USE FOR, plus CONSTRUCT, DESCRIBE i FILTER).

A teraz do rzeczy, i nie wiem czy bardzo konkretnie merytorycznie do tego wpisu, ale co mi tam.

MiMaS, Ty te swoje RDF/XML to ręcznie pisałeś, już zserializowane, czy w N3/N-Triple/Turtle i potem konwertowałeś? Bo ja chyba poklepię w N3 i rapperem przejadę (http://librdf.org).

Tylko mnie jedno dręczy - co w RDF-ie powinno być wypisane? Jakie informacje są najważniejsze? Bo chyba bez sensu wrzucać wszystko, co się da - od tego są ontologie i wnioskowanie, żeby agenci sami sobie to wyciągnęli... Możesz coś na ten temat gdzieś w przyszłości napomknąć w jakimś wpisie?

Przykład: u siebie masz siebie w FOAF i BIO, i kociaki w PET. Jak zechcę VCARD - SPARQL-em sobie wyrwę przez DESCRIBE (jak znajdę coś co to obługuje ];->). Ale wpisów konkretnych z Grzęzawiska nie opisujesz już RDF-em; a na przykład dublincore.org ma każdą stronę opisaną. U Ciebie DC brak. Jest za to CC...

Kolejny przykład: opis widowiska tanecznego Friends in Low Places w RDF-ie. Mam dylemat - zostawić tak, jak jest; czy może do każdej z osób tam wymienionych dorobić FOAF? Mógłbym na przykład zrobić tak:

<rdf:RDF>
<rdf:Description rdf:about="">
<dc:contributor>
<rdf:Bag>
<!-- tu wycięte trochę... -->
<rdf:li rdf:nodeID="mwd">Marcin Dąbrowski
</rdf:Bag>
</dc:contributor>
</rdf:Description>
<rdf:Description rdf:about="#mwd">
<rdfs:seeAlso rdf:resource="foaf_mwd.rdf"/>
</rdf:Description>
</rdf:RDF>

Tylko, hmm, jest sens? Jakieś hinty jak w tym nie utonąć? :)

#5 | 2005.12.08 07:59 | MiMaS

MWD:

nie wiem czy bardzo konkretnie merytorycznie do tego wpisu, ale co mi tam.

Grrr...

Ty te swoje RDF/XML to ręcznie pisałeś, już zserializowane

Oczywiście, przecież to całkiem krótkie jest. Krótsze od przecietnego wpisu na tym blogu, które też piszę „ręcznie” ;-)

SPARQL-em sobie wyrwę przez DESCRIBE (jak znajdę coś co to obługuje ];->)

ARQ w Jena (Jenie? odmieniać to??).

Ale wpisów konkretnych z Grzęzawiska nie opisujesz już RDF-em

Chodzi Ci o meta na każdej stronie? Można, ale... po co właściwie, da to coś konkretnego? RDF Site Summary nie wystarczy?

Mógłbym na przykład zrobić tak [...] Tylko, hmm, jest sens?

Wg mnie jest sens i to właśnie dokładnie przez rdfs:seeAlso. Sam bym zrobił tak samo.

A problemu „jak w tym nie utonąć” chyba nie da się rozwiązać jakimiś sztywnymi regułami. Na wyczucie raczej — opisujesz tyle, ile uważasz za stosowne/wystarczające/interesujące/potrzebne...

BTW: Zjadłeś </rdf:li> ;-) I przy okazji polecam W3C RDF Validation Service...

#6 | 2005.12.08 08:04 | MiMaS

MWD:

Ale wpisów konkretnych z Grzęzawiska nie opisujesz już RDF-em

Chodzi Ci o meta na każdej stronie?

A nie, już widzę — na dublincore.org dla każdej strony jest osobny plik RDF z jej opisem... Tym bardziej nie rozumiem po co byłoby coś takiego na blogu? Blog jako taki jest przeznaczony dla ludzi a maszynom wystarczy RSS... Mylę się?

#7 | 2005.12.08 11:36 | Marcin W. Dąbrowski

» MiMaS:

Grrr...

No widzisz, bo mógłbym prywatnie, ale tak, jak tu poględzę, to może ktoś z tego skorzysta.

I przy okazji polecam W3C RDF Validation Service...

Bez tego bym się utopił w tych znaczkach.

Chodzi Ci o meta na każdej stronie? [...] nie rozumiem po co byłoby coś takiego na blogu?

Zakładam, że jakiś agent zrobił sobie bazę danych o blogach... Jedziemy:

# pokaż mi kiedy MiMaS pisał o 'semantic web'
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rss: <http://backend.userland.com/rss2>
SELECT ?date, ?title
WHERE {
?x foaf:nick "MiMaS" .
?y dc:creator ?x ;
rss:category "semantic web" ;
rss:pubDate ?date ;
rss:title ?title .
}

Teoretycznie dałoby się tak odpytać ostatnie wpisy FROM NAMED <http://mimas.ceti.pl/tarpit/rss.xml> przy użyciu SSR... Ale całego Twojego bloga nie ma jak. Chyba, żebyś miał całe archiwum w RSS-ie. Albo chociać spis linków (seeAlso) do RDF-ów dla poszczególnych wpisów.

Wydaje mi się, że zaczynam przesadzać i się zachłysnąłem technologią. :)

[...] maszynom wystarczy RSS... Mylę się?

Nie wiem, dopiero się wgryzam. :)

#8 | 2005.12.08 12:44 | MiMaS

Hmmm.. pomysł ok, tylko jak rozwiniesz „jakiś agent zrobił sobie bazę danych o blogach”? Co znaczy zrobił sobie? Z czego? Innymi słowy jaki graf zamierzasz tym SELECT-em przeszukiwać?

Jeżeli byłaby to baza wpisów zbieranych na bieżąco, to równie dobrze można ją tworzyć z RSS-a. Wtedy (przy założeniu odpowiedniej częstotliwości działania agenta) nie ma znaczenia, że w aktualnym RSS nie ma wpisów starych. Umieszczanie dodatkowych RDF-ów ma sens, jeśli „zrobił sobie bazę danych” oznacza „przeindeksował stronę” — czyli taki agent-crawler. Pomyślę, pomysł mi się podoba...

A w ogóle dlaczego chcesz przeszukiwać feed RSS 2.0 a nie RSS 1.0?

#9 | 2005.12.08 14:39 | Marcin W. Dąbrowski

» MiMaS:

jak rozwiniesz „jakiś agent zrobił sobie bazę danych o blogach”?

W technologię agentów jeszcze się nie wgryzałem. Nie wiem, czy jest gdzieś jakiś crawler do RDF-ów, ani jak działa. Są niby jakieś bazy RDF, PiggyBank też swoją robi... Wiem, że dużo tu niedopowiedzeń. Ale skoro są narzędzia do przeszukiwania baz, to te bazy ktoś musi jakoś tworzyć. Może Technorati jakąś sobie robi? Ktoż to wie...

Zresztą - zobacz niżej. Może obejdzie się problem po prostu nie używając bazy. :)

Innymi słowy jaki graf zamierzasz tym SELECT-em przeszukiwać?

Jak - to wiemy. SPARQL i spółka. Nie wiemy (ja nie wiem) jak i skąd taką bazę tworzyć. Ale chyba wiem jak można (oby...) tworzyć taką bazę w locie.

Umieszczanie dodatkowych RDF-ów ma sens, jeśli „zrobił sobie bazę danych” oznacza „przeindeksował stronę” — czyli taki agent-crawler.

Można też zrobić indeks wpisów dla takiego crawlera, w którym każdy wpis miały swoje seeAlso na oddzielny RDF dla każdego wpisu (żeby sobie inkrementalnie dociągał tylko to, czego nie ma w swojej bazie).

Mam pomysł na dynamiczne przeglądanie/przeszukiwanie: załóżmy, że szukamy wpisów na temat X. Możemy dla całej szeroko znanej Technorati blogosfery uzyskać RSS 2.0 dotyczący ostatnich wpisów na ten temat, via http://feeds.technorati.com/feed/posts/tag/X. SSR-em lub innym XSLT przerobimy to na RDF, dodamy może własne rzeczy z bazy i możemy szukać.


# prefixy...
# czego szukamy
SELECT ?date, ?title, ?author
# nowe posty - konwersja z RSS 2.0 na RDF...
FROM <http://example.com/technorati.xsl?http://feeds.technorati.com/feed/posts/tag/X>
# nasza baza - może posty nieindeksowane w Technorati?
FROM <http://example.com/friendsDatabase.rdf>
# Twoje archiwum, wymyślone w poprzednim akapicie :)
FROM NAMED <http://mimas.ceti.pl/tarpit/archive.rdf>
WHERE {
# wszystkie artykuły wypisane w naszej bazie i w Technorati
{
?g dc:creator ?author ;
dc:title ?title ;
dc:pubDate ?date .
}
UNION
# oraz to, co masz w swoim archiwum -
# zakładając dla każdego wpisu oddzielny graf
{
?item rdf:seeAlso ?src .
GRAPH ?src {
?g dc:creator ?author ;
dc:title ?title ;
dc:pubDate ?date .
}
}
}

Przyda się?

Pomyślę, pomysł mi się podoba...

Bardzo się cieszę. I mam nadzieję, że nie gadam strasznych głupot. :D

A w ogóle dlaczego chcesz przeszukiwać feed RSS 2.0 a nie RSS 1.0?

A masz RSS 1.0 u siebie? :) Zresztą, to był tylko przykład.

#10 | 2005.12.08 14:56 | MiMaS

mam nadzieję, że nie gadam strasznych głupot

Strasznych to nie ;-) Tylko widzisz, SPARQL jest fajny i człowiek z wyobraźnią, jak Ty może takich SELECT-ów natrzaskać jeszcze dużo. Ale niestety IMHO omijasz najważniejszy problem — to co nazwałeś powyżej „nasza baza” i „Twoje archiwum, wymyślone w poprzednim akapicie”. Na blogach (nie tylko na tym przecież, ale ogólnie) nie znajdziesz w tej chwili RDF-ów ani dla poszczególnych wpisów, ani zbiorczo dla całości. I tak dobrze, że RSS się rozpowszechnił... Ale jakby rozwiązać/rozpowszechnić tworzenie RDF-ów dla wszystkich wpisów, nie tylko kilku ostatnich, to świat stoi przed nami otworem. ;-) Chyba...

Szkoda, że to wszystko jest off-topic w stosunku do wpisu... :-( Spróbuj się na przyszłość powstrzymać, please...

A masz RSS 1.0 u siebie?

Oczywiście.

 

Uwaga: Ze względu na bardzo intensywną działalność spambotów komentowanie zostało wyłączone po 60 dniach od opublikowania wpisu. Jeżeli faktycznie chcesz jeszcze skomentować skorzystaj ze strony kontaktowej.