<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Szkoła Web 3.0 &#187; Dla programistów</title>
	<atom:link href="http://www.semanticschool.com/category/school/developers/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.semanticschool.com</link>
	<description>Dowiedz się czym jest Sieć Semantyczna</description>
	<lastBuildDate>Mon, 05 Jul 2010 22:45:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.5.3" -->
	<copyright>Copyright &#xA9; 2010 Szkoła Web 3.0 </copyright>
	<managingEditor>info@semanticschool.com</managingEditor>
	<webMaster>info@semanticschool.com</webMaster>
	<category>posts</category>
	<image>
		<url>http://www.semanticschool.com/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Szkoła Web 3.0 &#187; Dla programistów</title>
		<link>http://www.semanticschool.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>The School of Semantics</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &amp; Culture" />
	<itunes:author></itunes:author>
	<itunes:owner>
		<itunes:name></itunes:name>
		<itunes:email>info@semanticschool.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.semanticschool.com/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>SPARQL &#8211; cz. 4: Zaawansowanie filtrowanie</title>
		<link>http://www.semanticschool.com/2010/04/sparql-filtrowanie/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2010/04/sparql-filtrowanie/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 05:45:44 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[filtrowanie]]></category>
		<category><![CDATA[funkcje]]></category>
		<category><![CDATA[literal]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[turtle]]></category>
		<category><![CDATA[typy]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=749</guid>
		<description><![CDATA[Po krótkiej przerwie wracamy do cyklu opisującego możliwości SPARQL. Dziś napiszemy o tym jak precyzyjniej definiować schematy poszukiwanych podgrafów wykorzystując do tego celu filtry. Aby zaprezentować różne możliwości mechanizmu filtrowania w SPARQL skorzystamy z bardziej rozbudowanej wersji grafu RDF wykorzystywanego do tej pory. W celu zdefiniowania operacji filtrowania w danym zapytaniu stosujemy operator FILTER. Zacznijmy [...]]]></description>
			<content:encoded><![CDATA[<p>Po krótkiej przerwie wracamy do cyklu opisującego możliwości SPARQL. Dziś napiszemy o tym jak precyzyjniej definiować schematy poszukiwanych podgrafów wykorzystując do tego celu filtry.  <span id="more-749"></span>Aby zaprezentować różne możliwości mechanizmu filtrowania w SPARQL skorzystamy z bardziej rozbudowanej wersji grafu RDF <a href="http://www.semanticschool.com/2010/02/sparql-rodzaje-zapytan/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">wykorzystywanego do tej pory</a>.</p>
<div id="attachment_1051" class="wp-caption aligncenter" style="width: 434px"><a href="http://www.semanticschool.com/sparql-4a-pl.turtle#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-1051" title="Przykładowy graf do obrazowania operacji FILTER w SPARQL" src="http://www.semanticschool.com/wp-content/uploads/2010/03/sparql-filter-0.png" alt="Przykładowy graf do obrazowania operacji FILTER w SPARQL" width="424" height="404" /></a><p class="wp-caption-text">Kliknij na graf aby pobrać źródło w formacie Turtle </p></div>
<p>W celu zdefiniowania operacji filtrowania w danym zapytaniu stosujemy operator FILTER.  Zacznijmy od czegoś prostego, np.: znajdźmy takie węzły które mają dla predykatu :e wartość literału większą od 5, a dla predykatu :j datę (jako wartość literału) po 1 marca 2010. Ponieważ nasz RDF nie ma jawnie określonych typów literałów zastosowaliśmy rzutowanie na datę (<code>xsd:dateTime</code>) oraz liczbę całkowitą (<code>xsd:integer</code>).</p>
<pre>PREFIX    : &lt;http://www.semanticschool.com/&gt;
PREFIX xsd:	&lt;http://www.w3.org/2001/XMLSchema#&gt;
SELECT ?x
WHERE { ?x :j ?date;
           :e ?value.
        FILTER ( xsd:dateTime(?date) &gt; xsd:dateTime("2010-03-01T00:00:00Z") &amp;&amp;
                 xsd:integer(?value) &gt; 5 ) }</pre>
<p>W wyniku otrzymamy: <code>?x = :B.</code> W filtrach możemy również używać wyrażenia regularne. Jeżeli np. interesują nas te węzły, które mówią o tym, że <em>Ala coś ma,</em> to zapiszemy to następująco:</p>
<pre>PREFIX :      &lt;http://www.semanticschool.com/&gt;
SELECT ?x
WHERE { ?x :e ?value.
        FILTER regex( ?value, "[Aa]la ma \\S+" ) }</pre>
<p>W wyniku otrzymamy <code>?x = :C</code> oraz <code>?x = :E</code>.  Zauważyliście zapewne, że zapisaliśmy <em>Ala</em> jako "[Aa]la" - to wyrażenie umożliwia nam wybranie tych fraz które zawierają zarówno <em>Ala </em>jak i <em>ala.</em> Jeżeli wielkość liter nie jest dla nas istotna w całej frazie, możemy skorzystać flagi "i", która mówi procesorowi wyrażeń regularnych, że ma ignorować wielkość liter:</p>
<pre>PREFIX :      &lt;http://www.semanticschool.com/&gt;
SELECT ?x
WHERE { ?x :e ?value.
        FILTER regex( ?value, "ala ma \\S+", "i" ) }</pre>
<div>Za pomocą frazy FILTER możemy również tworzyć zapytania SPARQL, które zwracają podgrafy RDF na podstawie właściwości zasobów w grafie. Prześledźmy poszczególne operatory dostępne w frazie FILTER na bazie następującego grafu:</div>
<div id="attachment_1054" class="wp-caption aligncenter" style="width: 504px"><a href="http://www.semanticschool.com/sparql-4b-pl.turtle#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-1054" title="Filtrowanie grafu z literałami z określonymi typami i językami" src="http://www.semanticschool.com/wp-content/uploads/2010/03/sparql-filter-1.png" alt="Filtrowanie grafu z literałami z określonymi typami i językami" width="494" height="404" /></a><p class="wp-caption-text">Kliknij na graf aby pobrać źródło w formacie Turtle </p></div>
<p style="text-align: center;">Do dyspozycji mamy zestaw funkcji testujących właściwości podanych węzłów w grafie RDF:</p>
<ul>
<li><strong>isIRI</strong> oraz <strong>isURI</strong> - sprawdza czy podany argument jest zasobem identyfikowanym przez URI/IRI (tzn. nie jest literałem albo bnodem).</li>
<li><strong>isBlank</strong> - sprawdza czy podany argument jest bnodem (nienazwany węzeł).</li>
<li><strong>isLiteral</strong> - sprawdza czy podany argument jest literałem.</li>
<li><strong>sameTerm</strong> - sprawdza czy podane dwa argumenty są tym samym zasobem lub literałem (zobacz <a href="http://www.w3.org/TR/rdf-concepts/" target="_blank">http://www.w3.org/TR/rdf-concepts/</a> po dodatkowe informacje)</li>
<li><strong>langMatches</strong> - sprawdza czy znacznik języka literału podanego jako pierwszy argument znajduje się w zakresie języków podanym w drugim argumencie; jako drugi parametr możemy również podać "*" do oznaczenia każdego niepustego znacznika języka. Więcej na temat porównania znaczników jezyka pod adresem <a href="http://www.ietf.org/rfc/rfc4647.txt" target="_blank">http://www.ietf.org/rfc/rfc4647.txt</a>.</li>
<li>możemy również porównać dwa węzły za pomocą <strong>znaku</strong> <strong>=</strong> (zobacz <a href="http://www.w3.org/TR/rdf-sparql-query/#func-RDFterm-equal" target="_blank">http://www.w3.org/TR/rdf-sparql-query/#func-RDFterm-equal</a> po więcej informacji)</li>
</ul>
<p>Oraz zestaw funkcji za pomocą, których możemy przekształcać podane węzły w grafie RDF do postaci ciągu znaków</p>
<ul>
<li><strong>str</strong> - zwraca ciag znaków reprezentujący dany zasób; np. w przypadku literału będzie to część literału bez znacznika języka czy typu</li>
<li><strong>lang</strong> - zwraca znacznik języka podanego literału (jeśli jest określony)</li>
<li><strong>datatype</strong> - zwraca znacznik typu podanego literału (jeśli jest określony)</li>
</ul>
<p>Dodakowo, poszczególne wyrażenia w ramach jednej frazy FILTER możemy łączyć za pomocą operatorów logicznych AND (wyrażanego jako<strong> &amp;&amp;</strong>) oraz OR (wyrażanego jako <strong>||</strong>).</p>
<p>A teraz czas na kilka przykładów.</p>
<p>Szukamy zasobów "wkazujących" na węzeł :B w naszym grafie, które są identyfikowane przez URI (a nie przez bnode).</p>
<pre>PREFIX    : &lt;http://www.semanticschool.com/&gt;
SELECT ?x
WHERE { ?x ?p :E.
        FILTER ( isBlank(?x) ) }</pre>
<p>Szukamy tych zasobów które wskazują na :E i są bnodami</p>
<pre>PREFIX    : &lt;http://www.semanticschool.com/&gt;
SELECT ?x
WHERE { ?x :g ?y.
        FILTER ( isLiteral(?y) ) }</pre>
<p>Szukamy takich zasobów które wskazują na ten sam inny zasób.</p>
<pre>PREFIX    : &lt;http://www.semanticschool.com/&gt;
SELECT ?x ?y
WHERE { ?x :g ?px.
        ?y :e ?py.
        FILTER ( sameTerm(?px, ?py) ) }</pre>
<p>Pytanie: ile bedzie par wyników dla jeżeli :g, :e zastąpimy przez ?g, ?e ?</p>
<p>Szukamy zasobów wskazujących na literały napisane po Hiszpańsku.</p>
<pre>PREFIX    : &lt;http://www.semanticschool.com/&gt;
SELECT ?x
WHERE { ?x :e ?l.
        FILTER ( langMatches( lang(?l), "ES") ) }</pre>
<p>Pytanie: ile będzie wyników jeżeli będziemy szukali zasobów w dowolnym języku ?</p>
<p>Szukamy takich zasobów które wskazują na literały nie będące określeniem czasu.</p>
<pre>PREFIX xsd:	&lt;http://www.w3.org/2001/XMLSchema#&gt;
SELECT ?x ?l
WHERE { ?x ?p ?l.
        FILTER ( datatype(?l) != xsd:dateTime  ) }</pre>
<p>Na zakończenie trochę bardziej skomplikowany przykład: szukamy takich par różnych zasobów, które wskazują na ten sam literał, oraz dla których dla pierwszego zasobu reprezentacja URI w postaci ciągu znaku występuje w sortowaniu alfabetycznym przed reprezentacja URI drugiego zasobu.</p>
<pre>SELECT ?x ?y
WHERE { ?x ?p1 ?l1.
        ?y ?p2 ?l2.
        FILTER ( isLiteral(?l1) &amp;&amp;
                      isLiteral(?l2) &amp;&amp;
                      ?l1 = ?l2 &amp;&amp;
                      ?x != ?y &amp;&amp;
                      str(?x) &gt; str(?y) ) }</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2010/04/sparql-filtrowanie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sezamie otwórz się &#8211; czyli instalacja Sesame 2.0</title>
		<link>http://www.semanticschool.com/2010/02/instalacja-sesame/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2010/02/instalacja-sesame/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:27:39 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ntriples]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[rdf/xml]]></category>
		<category><![CDATA[repozytorium]]></category>
		<category><![CDATA[sesame]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[turtle]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=843</guid>
		<description><![CDATA[Zgodnie z wcześniejszą zapowiedzią (po małej przerwie) w dzisiejszym artykule opiszę jak w kilku krokach zainstalować bazę danych (repozytorium) RDF. Chociaż ten artykuł kierowany jest głównie do programistów, to jednak proces instalacji bazy Sesame jest na tyle prosty, że zachęcam każdego do zrobienia tego. W ten sposób łatwiej będzie wam sprawdzać poznaną wiedzę (szczególnie tę [...]]]></description>
			<content:encoded><![CDATA[<p>Zgodnie z wcześniejszą zapowiedzią (po małej przerwie) w dzisiejszym artykule opiszę jak w kilku krokach zainstalować bazę danych (repozytorium) RDF. Chociaż ten artykuł kierowany jest głównie do programistów, to jednak proces instalacji bazy Sesame jest na tyle prosty, że zachęcam każdego do zrobienia tego. W ten sposób łatwiej będzie wam sprawdzać poznaną wiedzę (szczególnie tę dotyczącą zapytań w języku SPARQL) w praktyce.</p>
<p><span id="more-843"></span></p>
<p>Składniki:</p>
<ul>
<li>ok 100MB wolnej przestrzeni na dysku (co najmniej tyle, więcej będzie potrzebne w zależności od wielkości przechowywanych przez was grafów) [<a href="http://allegro.pl/listing/search.php?category=4476" target="_blank">pobierz</a>]</li>
<li>system operacyjny z zainstalowaną maszyną wirtualną Java'y w wersji deweloperskiej (JDK) 1.5 lub wyższej (osobiście korzystam z JDK5 i JDK6) [<a href="http://java.sun.com/javase/downloads/widget/jdk6.jsp" target="_blank">pobierz</a>]</li>
<li>instalator (dla Windows) lub paczka (archiwum) z kontenerem serwletów <a href="http://tomcat.apache.org/" target="_blank">Apache Tomcat</a> w wersji 6.0 [<a href="http://tomcat.apache.org/download-60.cgi" target="_blank">pobierz</a>]</li>
<li>paczka z silnikiem bazy danych <a href="http://www.openrdf.org/" target="_blank">Sesame 2.0</a> [<a href="http://sourceforge.net/projects/sesame/files/Sesame%202/2.3.1/openrdf-sesame-2.3.1-sdk.zip/download" target="_blank">pobierz</a>].</li>
</ul>
<p>Wszystkie z składniki należy zainstalować w podanej kolejności. W przypadku Apache Tomcat i Sesame wystarczy rozpakować sciągnięte paczki (archiwa) w dowolnie wybrane miejsce. Jeżeli instalujecie Apache Tomcat jako usługę (Windows Service Installer) zapamiętajcie gdzie poleciliście instalatorowi zainstalować tę usługę.</p>
<p>Paczkę z Sesame możecie rozpakować w dowolnym miejscu, gdyż potrzebujemy jedynie dwóch plików <strong>war</strong> dostarczanych w tej paczce. W katalogu który powstał po rozpakowaniu paczki z Sesame odnajdujemy podkatalog o nazwie <strong>war</strong> i przegrywamy z niego oba znajdujące się tam pliki do podkatalogu <strong>webapps</strong> w katalogu gdzie zainstalowaliśmy (rozpakowaliśmy) kontener serwletów Apache Tomcat.</p>
<p><a href="http://www.semanticschool.com/wp-content/uploads/2010/02/tomcat-sesame.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-medium wp-image-849" title="jak zainstalowac sesame w tomcat" src="http://www.semanticschool.com/wp-content/uploads/2010/02/tomcat-sesame-300x221.png" alt="jak zainstalowac sesame w tomcat" width="300" height="221" /></a></p>
<p>Czas aby uruchomić serwer Apache Tomcat. Użytkownicy Windows mogą włączać i wyłączać serwer Tomcat za pomocą usług Windows (patrz zdjęcie poniżej)</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-846" title="Uruchamianie serwera Tomcat jako usługi Windows" src="http://www.semanticschool.com/wp-content/uploads/2010/02/2010-02-23_0907.png" alt="Uruchamianie serwera Tomcat jako usługi Windows" width="527" height="564" /></p>
<p>lub ikonki, która powinna być widoczna na tacce systemowej:</p>
<p><a href="http://www.semanticschool.com/wp-content/uploads/2010/02/2010-02-23_0910.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-full wp-image-847" title="Ikona w tacce systemowej do kontroli serwera Tomcat" src="http://www.semanticschool.com/wp-content/uploads/2010/02/2010-02-23_0910.png" alt="Ikona w tacce systemowej do kontroli serwera Tomcat" width="301" height="183" /></a></p>
<p>Dla tych którzy nie zainstalowali (lub nie mogli zainstalować) Tomcata jako usługi Windows uruchamianie jest równie proste. Wystarczy wejść do katalogu w którym został zainstalowany serwer, przejść do podkatalogu ﻿<strong>bin</strong> i tam uruchomić program <strong>startup.bat</strong> lub <strong>startup.sh</strong> (w zależności czy korzystamy odpowiednio z Windows czy systemu Unixowego).</p>
<p>Po uruchomieniu w przeglądarce internetowej otwieramy adres <a href="http://localhost:8080/openrdf-workbench/" target="_blank">http://localhost:8080/openrdf-workbench/</a> (z dokładnością co do numeru portu o ile go zmieniliście w czasie instalacji).</p>
<p>Na powitanie, świeże Sesame wita nas nasŧępującym ekranem.</p>
<p><a href="http://www.semanticschool.com/wp-content/uploads/2010/02/sesame-00.png#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter size-medium wp-image-852" title="Ekran powitalny świeżego Sesame" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sesame-00-300x180.png" alt="Ekran powitalny świeżego Sesame" width="300" height="180" /></a></p>
<p>Nasze pierwsze zadanie to stworzyć nowe repozytorium do którego będziemy mogli załadować później graf RDF i wykonywać na nim zapytania. W tym celu klikamy na link "<strong>New repository</strong>". Musimy zdecydować pomiędzy jednym z kilku dostępnych typów repozytoriów: na wstępie proponuje pozostać przy "<strong>Native Java Store</strong>".</p>
<p><img class="aligncenter size-full wp-image-853" title="Dodawanie nowego repozytorium" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sesame-01.png" alt="Dodawanie nowego repozytorium" width="484" height="199" />Po zakończeniu procesu tworzenia nasze nowe repozytorium zostaje wybrane jako domyślne i możemy rozpocząć pracę.</p>
<p>Aby dodać graf RDF klikamy na link "<strong>Add</strong>" w sekcji "<strong>Modify</strong>". Tam mamy do wyboru albo załadowanie pliku z grafem z dysku, albo wskazanie zasobu w sieci, albo wklejenie fragmentu grafu w jednym z dostępnych języków, w tym w N-triples, Turtle i RDF/XML.</p>
<p>Po dodaniu grafu RDF możemy przystąpić do zadawania zapytań korzystając z opcji "<strong>Query</strong>" w sekcji "<strong>Explore</strong>".</p>
<p>Pozostaje mi tylko życzyć dobrej zabawy w zadawaniu pierwszych zapytań w SPARQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2010/02/instalacja-sesame/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SPARQL &#8211; cz. 3: SELECT to nie wszystko</title>
		<link>http://www.semanticschool.com/2010/02/sparql-rodzaje-zapytan/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2010/02/sparql-rodzaje-zapytan/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 10:30:37 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[ask]]></category>
		<category><![CDATA[construct]]></category>
		<category><![CDATA[describe]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[turtle]]></category>
		<category><![CDATA[zapytania]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=748</guid>
		<description><![CDATA[Każdemu kto zna SQL fakt, że zapytania SELECT w SPARQL zwracają tablicę wyników wydaje się to oczywiste. Dla tych, którzy znają XQuery - to takie oczywisto już nie jest. SELECT to jednak nie jedyny rodzaj zapytania w SPARQL, i co więcej SPARQL nie zawsze musi odpowiadać tablicą wyników. Specyfikacja SPARQL definiuje 4 typy zapytań: SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>Każdemu kto zna SQL fakt, że zapytania SELECT w SPARQL zwracają tablicę wyników wydaje się to oczywiste. Dla tych, którzy znają XQuery - to takie oczywisto już nie jest. SELECT to jednak nie jedyny rodzaj zapytania w SPARQL, i co więcej SPARQL nie zawsze musi odpowiadać tablicą wyników.</p>
<p><span id="more-748"></span></p>
<p>Specyfikacja SPARQL definiuje 4 typy zapytań:</p>
<ul>
<li>SELECT - zwraca wszystkie (lub określoną część) zmiennych zadeklarowanych w szablonie zapytania.</li>
<li>CREATE - umożliwia zdefiniowanie szablonu grafu RDF wypełnianego wartościami zmiennych zadeklarowanych w szablonie zapytania.</li>
<li>DESCRIBE - zwraca graf RDF możliwie najpełniej opisujący podany zasób.</li>
<li>ASK - zwraca wartość prawda lub fałsz w zależności od tego czy podany szablon zapytania został spełniony czy też nie.</li>
</ul>
<p>Przeanalizujmy każdy typ zapytania na jednym z grafów z poprzedniego odcinka.</p>
<p><a href="http://www.semanticschool.com/2010/02/sparql-2/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="aligncenter" title="Przykładowy graf" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-7.png" alt="Przykładowy graf" width="260" height="228" /></a>Zacznijmy od prostego zapytania typu SELECT; poszukajmy te podgrafy w których istnieją zasoby będące obiektami w zdaniach, gdzie podmiotem jest <strong>:B</strong> a predykatem jest <strong>:e</strong>, oraz które znajdują się dokładnie dwa stopnie oddalenia od zasobu <strong>:A</strong>.</p>
<p><code>SELECT ?V ?V1 ?e1 ?e2<br />
WHERE<br />
{<br />
:B :e ?V.<br />
:A ?e1 ?V1. </code><code><br />
?V1 ?e2 ?V.<br />
}</code></p>
<p>W wyniku otrzymamy następujące rozwiązania:</p>
<table border="1">
<tbody>
<tr>
<th>?V</th>
<th>?V1</th>
<th>?e1</th>
<th>?e2</th>
</tr>
<tr>
<td>:E</td>
<td>:D</td>
<td>:a</td>
<td>:g</td>
</tr>
<tr>
<td>:G</td>
<td>:B</td>
<td>:b</td>
<td>:e</td>
</tr>
<tr>
<td>:F</td>
<td>_:c</td>
<td>:b</td>
<td>:d</td>
</tr>
<tr>
<td>:F</td>
<td>:B</td>
<td>:b</td>
<td>:e</td>
</tr>
</tbody>
</table>
<p>Załóżmy teraz, że naszym celem jest stworzenie grafu zawierającego ścieżki prowadzące od zasobu <strong>:A</strong> i od zasobu <strong>:B </strong>do zasobów będących wynikami poprzedniego zapytania, przy czym predykaty na ścieżce od zasobu <strong>:A </strong>do znalezionego zasobu zostaną zastąpione przez predykat <strong>:p</strong>.</p>
<p><code>CONSTRUCT<br />
{<br />
</code><code>:B :e ?V.</code><br />
<code> :A :p ?V1. </code><code><br />
?V1 :p ?V.</code><br />
<code>}<br />
WHERE<br />
{<br />
:B :e ?V.<br />
:A ?e1 ?V1. </code><code><br />
?V1 ?e2 ?V.<br />
}</code></p>
<p>Zwróci nam następujący wynik w postaci grafu RDF (poniższy wynik zapisany w języku Turtle):</p>
<p><code>:B :e :F, :E, :G .<br />
:A :p :B .<br />
:B :p :E , :F , :G .<br />
:A :p _:c .<br />
_:c :p :F .<br />
:A :p :D .<br />
:D :p :E . </code></p>
<p>Przy pomocy zapytań SPARQL możemy również stwierdzić czy <strong>:F</strong> znajduje się na ścieżce o długości 2 z <strong>:A</strong> do <strong>:E</strong>.</p>
<p><code>ASK<br />
{<br />
:A ?p1 :F.<br />
</code><code>:F ?p2 :E.<br />
}</code></p>
<p>W tym wypadku otrzymamy odpowiedź <strong>"false".</strong></p>
<p>Na zakończenie czwarty rodzaj zapytania - opis zasobu. Na następujące zapytanie o zmienną <strong>?a</strong></p>
<p><code>DESCRIBE ?a<br />
</code><code>WHERE<br />
{<br />
</code><code>?a :b :B.</code><br />
<code> </code><code>}</code></p>
<p>Otrzymamy opis zasobu który został pod nią dopasowany:</p>
<p><code>:A :a :D ;<br />
:b :B ,<br />
_:c .</code></p>
<p>W następnym odcinku opiszę jak łatwo i bezboleśnie zainstalować własne repozytorium RDF na którym można uczyć się zapytań w języku SPARQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2010/02/sparql-rodzaje-zapytan/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SPARQL &#8211; cz. 2: Odpytywanie po ścieżce w grafie RDF</title>
		<link>http://www.semanticschool.com/2010/02/sparql-2/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2010/02/sparql-2/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 08:00:57 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[blank node]]></category>
		<category><![CDATA[bnode]]></category>
		<category><![CDATA[graf]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[skrót]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[turtle]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=746</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p><span id="more-746"></span></p>
<p>W poprzednim odcinku nauczyliśmy się jak znaleźć URI zasobu lub jego właściwości korzystając z prostych zapytań.</p>
<p><img class="aligncenter size-full wp-image-783" title="Example graph" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-2.png" alt="" width="260" height="228" /></p>
<p>Weźmy teraz pod uwagę powyższy graf. Załóżmy, że chcemy wskazać zasób <code>:A</code>; możemy go opisać następującymi zdaniami:</p>
<p><code>:A :b :B.<br />
:A :b :C.<br />
:B :e :E.<br />
:B :e :F.<br />
:B :e :G.</code></p>
<p>Jeżeli nie znalibyśmy niektórych z informacji w grafie, np.: zasobu <code>:B</code> czy właściwości <code>:e</code>, informacja o zasobie <code>:A</code> wyglądałaby następująco:</p>
<p><img class="aligncenter size-full wp-image-784" title="Przykładowy niekompletny graf" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-3.png" alt="" width="260" height="228" /></p>
<p><code>:A :b ?x.<br />
:A :b :C.<br />
?x ?y :E.<br />
?x ?y :F.<br />
?x ?y :G.</code></p>
<p>Tym samym zapisaliśmy podstawowe reguły do zapytania SPARQL, które wyglądałoby następująco:</p>
<p><code>SELECT ?a<br />
WHERE<br />
{<br />
?a :b ?x.<br />
?a :b :C.<br />
?x ?y :E.<br />
?x ?y :F.<br />
?x ?y :G.<br />
}</code></p>
<p>To zapytanie wskaże nam wszystkie zasoby ?a, które wraz z zasobami :C, :E, :F i :G będą tworzyć podany podgraf.</p>
<p><img class="aligncenter size-full wp-image-786" title="Przykładowy podgraf" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-4.png" alt="" width="265" height="230" /></p>
<p>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:</p>
<p><code>SELECT ?a<br />
WHERE<br />
{<br />
?a :b ?x; :b :C.<br />
?x ?y :E, :F, :G.<br />
}</code></p>
<p>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.</p>
<p>W zapytaniach SPARQL poszczególne bnode'y możemy zapisać za pomocą notacji <code>_:label</code> lub nawiasów kwadratowych.<br />
Nieznacznie zmodyfikujmy powyższy graf, zastępując zasób <code>:C</code> bnodem o etykiecie <code>_:c</code></p>
<p><img class="aligncenter size-full wp-image-792" title="Przykładowy graf z bnodem" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-7.png" alt="" width="260" height="228" /></p>
<p>W tym przypadku nasze zapytanie mogłoby wyglądać następująco:</p>
<p><code>SELECT ?a<br />
WHERE<br />
{<br />
?a :b ?x; :b _:c.<br />
?x ?y :E, :F, :G.<br />
}</code></p>
<p>Ale nie możemy pozostawić samego <code>_:c</code>, bo mogłoby oznaczać dowolny bnode, czyli byłoby to mało precyzyjne. Zamiast tego nasze zapytanie mogłoby wyglądać następująco:</p>
<p><code>SELECT ?a<br />
WHERE<br />
{<br />
?a :b ?x; :b _:c.<br />
_:c :d :F.<br />
?x ?y :E, :F, :G.<br />
}</code></p>
<p>Ponieważ wartość bnode nie ma znaczenia, możemy zastąpić nasze zapytanie korzystając z nawiasów kwadratowych:</p>
<p><code>SELECT ?a<br />
WHERE<br />
{<br />
?a :b ?x; :b [ :d :F ].<br />
?x ?y :E, :F, :G.<br />
}</code></p>
<p>Zapis <code>[ :d :F ]</code> jest jednoznaczny z <code>[] :d :F</code> i zastępuje oznaczenie <code>_:c</code>.</p>
<p>Na zakończenie dzisiejszego wykładu jeszcze jeden sposób na skracanie zapytań SPARQL: za każdym razem kiedy chcemy skorzystać z predykatu <code>rdf:type</code> możemy go zastąpić litera <code>a</code>, na przykład dla poniższego grafu</p>
<p><img class="aligncenter size-full wp-image-793" title="Przykładowy graf z predykatem rdf:type" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql-graph-6.png" alt="" width="260" height="228" /></p>
<p>zapytanie</p>
<p><code>SELECT ?a WHERE { ?a rdf:type : D }</code></p>
<p>możemy zastąpić nieznacznie krótszym.</p>
<p><code>SELECT ?a WHERE { ?a a : D }</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2010/02/sparql-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SPARQL &#8211; cz. 1: Wstęp do odpytywania grafów RDF</title>
		<link>http://www.semanticschool.com/2010/02/sparql-wstep/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2010/02/sparql-wstep/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 08:00:20 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[endpoint]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[sparql]]></category>
		<category><![CDATA[w3c]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=745</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.w3.org/TR/rdf-sparql-query/"><img class="alignright size-full wp-image-765" title="SPARQL logo" src="http://www.semanticschool.com/wp-content/uploads/2010/02/sparql_logo.png" alt="SPARQL logo" width="188" height="128" /></a>W piątek obiecałem, że dziś dowiecie się jak zadawać zapytania na grafie RDF za pomocą języka zapytań <a href="http://www.w3.org/TR/rdf-sparql-query/" target="_blank">SPARQL</a>. Zapowiada się kolejny cykl, tym razem jeszcze dłuższy niż poprzednie, bo chce omówić kolejne aspekty SPARQLa krok po kroku.</p>
<p>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.</p>
<p>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. <em><a href="http://semanticweb.org/wiki/SPARQL_endpoint" target="_blank">SPARQL endpoint</a></em> 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 <a href="http://code.google.com/p/sparqltex/" target="_blank">sparqlTeX</a>, dzięki któremu możemy automatycznie aktualizować dokumenty PDF w oparciu o dane z serwisów udostępniających SPARQL endpoint.</p>
<p>W chwili obecnej <a href="http://www.w3.org/2009/sparql/wiki/Main_Page" target="_blank">trwają prace</a> nad kolejną wersją języka; napiszemy o proponowanych zmianach pod koniec cyklu.</p>
<p><span id="more-745"></span></p>
<p>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ń.</p>
<p>Weźmy pod uwagę prosty graf RDF:</p>
<p><code>&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; &lt;http://purl.org/dc/elements/1.1/title&gt; "SPARQL - cz. 1: Wstęp do odpytywania grafów RDF".<br />
&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; &lt;http://purl.org/dc/elements/1.1/creator&gt; "Sebastian Ryszard Kruk".<br />
</code><br />
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:</p>
<p><code>SELECT ?tytul<br />
WHERE<br />
{<br />
&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; &lt;http://purl.org/dc/elements/1.1/title&gt; ?tytul.<br />
}</code></p>
<p>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.</p>
<p>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:</p>
<p><code>PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
SELECT ?tytul<br />
WHERE<br />
{<br />
&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; dc:title ?tytul.<br />
}</code></p>
<p>Kilka z prefiksów jest zdefiniowanych domyślnie:</p>
<p><code>PREFIX rdf:<span style="white-space: pre;"> </span> &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .<br />
PREFIX rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#&gt; .<br />
PREFIX xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt;.<br />
PREFIX fn: &lt;http://www.w3.org/2005/xpath-functions#&gt;.</code></p>
<p>A co jeśli chcemy zapytać więcej informacji o danym zasobie ? Nic prostszego. Dla następującego grafu</p>
<p><code>&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; &lt;http://purl.org/dc/elements/1.1/title&gt; "SPARQL - cz. 1: Wstęp do odpytywania grafów RDF".<br />
&lt;http://www.semanticschool.com/2010/02/sparql-wstep/&gt; &lt;http://purl.org/dc/elements/1.1/creator&gt; "Sebastian Ryszard Kruk".<br />
&lt;http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/&gt; &lt;http://purl.org/dc/elements/1.1/title&gt; Semantyczne SEO, czyli jak zwiększyć widoczność stron w wyszukiwarkach przy pomocy ontologii Good Relations i RDFa".<br />
&lt;http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/&gt; &lt;http://purl.org/dc/elements/1.1/creator&gt; "Arkadiusz Kwoska".</code></p>
<p>nieznacznie zmodyfikowane zapytanie SPARQL</p>
<p><code>PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
SELECT ?url, ?tytul, ?autor<br />
WHERE<br />
{<br />
?url dc:title ?tytul.<br />
?url dc:creator ?autor.<br />
}</code></p>
<p>otrzymamy w wyniku:</p>
<table border="1">
<tbody>
<tr>
<td>http://www.semanticschool.com/2010/02/sparql-wstep/</td>
<td>SPARQL - cz. 1: Wstęp do odpytywania grafów RDF</td>
<td>Sebastian Ryszard Kruk</td>
</tr>
<tr>
<td>http://www.semanticschool.com/2009/12/semantyczne-seo-ontologia-good-relations-i-rdfa/</td>
<td>Semantyczne SEO, czyli jak zwiększyć widoczność stron w wyszukiwarkach przy pomocy ontologii Good Relations i RDFa</td>
<td>Arkadiusz Kwoska</td>
</tr>
</tbody>
</table>
<p>W zapytaniu możemy wybierać trójki na podstawie literałów w zdaniu. Na przykład dla grafu:</p>
<p><code>@prefix dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
&lt;http://www.semanticschool.com/&gt; dc:lang "Polski".<br />
&lt;http://semdl.info/&gt; dc:lang "English".<br />
&lt;http://semdl.info/&gt; dc:type "Site"@en.<br />
&lt;http://www.semanticschool.com/&gt; dc:type "Strona"@pl.<br />
&lt;http://www.semanticschool.com/&gt; &lt;http://example.com/articleCount&gt;  43.<br />
&lt;http://blog.knowledgehives.com/&gt; &lt;http://example.com/articleCount&gt;  9.<br />
&lt;http://semdl.info/&gt; dc:date "02/01/2010"^^xsd:date.<br />
&lt;http://www.semanticschool.com/&gt; dc:date "09/19/2009"^^xsd:date.<br />
&lt;http://semdl.info/&gt; &lt;http://example.com/inPolish&gt; "false"^^xsd:boolean.<br />
&lt;http://www.semanticschool.com/&gt; &lt;http://example.com/inPolish&gt; "true"^^xsd:boolean.<br />
</code></p>
<p>Poniższe zapytanie wypisze stronę napisaną po angielsku</p>
<p><code>PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
SELECT ?url WHERE { ?url dc:lang "English". }</code></p>
<p>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.</p>
<p><code>PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
SELECT ?url WHERE { ?url dc:type "Strona"@pl. }</code></p>
<p>Możemy też zapytać o ilość:</p>
<p><code>SELECT ?url WHERE { ?url &lt;http://example.com/articleCount&gt; 43. }</code></p>
<p>o datę:</p>
<p><code>PREFIX dc: &lt;http://purl.org/dc/elements/1.1/&gt; .<br />
SELECT ?url WHERE { ?url dc:date "09/19/2009"^^xsd:date. }</code></p>
<p>lub o wartości typu prawda / fałsz.</p>
<p><code>SELECT ?url WHERE { ?url &lt;http://example.com/inPolish&gt; true. }</code></p>
<p>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 <a href="http://www.semanticschool.com/2009/09/rdf-wstep/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">nienazwanych węzłów</a> (ang. <em>blank nodes</em>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2010/02/sparql-wstep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dobre związki z naszymi e-klientami, czyli e-commerce 3.0</title>
		<link>http://www.semanticschool.com/2009/12/good-relations/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2009/12/good-relations/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 08:00:13 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla managerów]]></category>
		<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Ontologie]]></category>
		<category><![CDATA[b2b]]></category>
		<category><![CDATA[B2C]]></category>
		<category><![CDATA[creative commons]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[good relations]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[linked open data]]></category>
		<category><![CDATA[lod]]></category>
		<category><![CDATA[ontologia]]></category>
		<category><![CDATA[rdfa]]></category>
		<category><![CDATA[web of data]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=564</guid>
		<description><![CDATA[Do tej pory opisywaliśmy różne specyfikacje i inicjatywy, mało jednak mówiliśmy o ich praktycznym wykorzystaniu. Czas, aby pokazać w jaki sposób handel elektroniczny może wykorzystać dobrodziejstwa Web 3.0; dziś o ontologii "Good Relations" stworzonej przez Martina Heppa specjalnie dla e-commerce w kontekście Sieci trzeciej generacji. Wyobraźmy sobie, że jesteśmy właścicielem sklepu internetowego: nasi klienci mają [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.heppnetz.de/projects/goodrelations/"><img class="size-medium wp-image-633 alignright" title="Logo ontologii Good Relations" src="http://www.semanticschool.com/wp-content/uploads/2009/12/good-relations2-300x81.jpg" alt="Logo ontologii Good Relations" width="300" height="81" /></a>Do tej pory opisywaliśmy różne specyfikacje i inicjatywy, mało jednak mówiliśmy o ich praktycznym wykorzystaniu. Czas, aby pokazać w jaki sposób handel elektroniczny może wykorzystać dobrodziejstwa Web 3.0; dziś o ontologii "<a href="http://www.heppnetz.de/ontologies/goodrelations/v1" target="_blank">Good Relations</a>" stworzonej przez <a href="http://www.heppnetz.de/" target="_blank">Martina Heppa</a> specjalnie dla e-commerce w kontekście Sieci trzeciej generacji.</p>
<p><span id="more-564"></span></p>
<p>Wyobraźmy sobie, że jesteśmy właścicielem sklepu internetowego: nasi klienci mają konkretne pytania, potrzeby. W chwili obecnej jedynym sposobem na odnajdywanie odpowiedzi na ich pytania jest mozolne przeszukiwanie całej Sieci za pomocą Google albo pytanie szeroko rozumianych "znajomych" (np. tag <a href="http://blip.pl/tags/drogiblipie" target="_blank">#drogiblipie</a>). Bez odpowiednich metadanych, rozumianych przez maszyny, nasz sklep czy usługa jest prawie tak samo widziana jak inne witryny internetowe, np. opisujące produkty, które my właśnie oferujemy. W ten sposób nasi klienci mają dużo mniejszą szansę na trafienie do naszego sklepu; a tego przecież nie chcemy, prawda? Nawet dedykowane serwisy wyszukiwania usługi i towarów również mają zbyt mało informacji, aby jednoznacznie powiązać naszą ofertę z wymaganiami naszych niedoszłych klientów.</p>
<p>Ontologia Good Relations została stworzona z myślą o rozwiązaniu tego problemu. Pozwala nam ona opisać to co oferuje nasz sklep: produkty, ich cechy, ich ceny. Pojęciami wprowadzonymi w ontologii Good Relations możemy również podać informacje o fizycznych lokalizacjach naszych sklepów i np. godzinach ich otwarcia. Ontologia pozwala na opisanie dostępnych sposobów płatności i przesyłek; możemy również opisywać dodatkowe informacja listy życzeń, specyfikacje gwarancji, itd. Ontologia Good Relations wspiera zarówno rozwiązania typu <a href="http://pl.wikipedia.org/wiki/B2C" target="_blank">Business-to-Consumer</a> (B2C) jak i <a href="http://pl.wikipedia.org/wiki/B2B" target="_blank">Business-to-Business</a> (B2B). Osobom szukającym rozwiązań oferowanych przez nas będzie łatwiej odnaleźć naszą ofertę na podstawie cechy, na których im zależy; w ten sposób nasi przyszli klienci dużo szybciej i pewniej docierają do zamierzonego celu.</p>
<p>Informacje zgodne z ontologią Good Relations mogą być zapisane w standardzie <a href="http://www.semanticschool.com/2009/11/publikowanie-semantyki/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">RDFa</a> wspieranym przez Yahoo i Google; dzięki temu nasz serwis i produkty są lepiej <a href="#asterix1#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">dostrzegalne*</a>, m.in., gwiazdkom z ocenami w wynikach wyszukiwania. Już teraz ontologia Good Relations jest bardzo popularna i wiele firm z niej korzysta, w tym m.in. <a href="http://www.bestbuy.com/" target="_blank">BestBuy</a> (o którym napiszemy jutro).</p>
<p>Co zrobić aby zacząć wykorzystywać ontologię Good Relations?</p>
<ul>
<li>Jeżeli jesteśmy sklepem internetowym: warto zacząć od stworzenia prostego przeglądu naszej oferty zapisanego w tej ontologii.</li>
<li>Jeżeli jesteśmy firmą produkującą oprogramowanie dla sklepów internetowych: należy stworzyć możliwość importu i eksportu informacji w tym standardzie.</li>
<li>W pozostałych przypadkach: możemy stworzyć listę produktów i usług opisaną w ontologii Good Relations; oraz opracować nowe modele biznesowe oparte na tych opisach.</li>
</ul>
<p>Aby stworzyć swój pierwszy opis w ontologii Good Relations możemy skorzystać z narzędzie dostarczonego przez jej twórców pod adresem: <a href="http://www.ebusiness-unibw.org/tools/goodrelations-annotator/" target="_blank">http://www.ebusiness-unibw.org/tools/goodrelations-annotator/</a>.</p>
<p>Więcej informacji na temat ontologii Good Relations możemy dowiedzieć się na <a href="http://www.heppnetz.de/projects/goodrelations/" target="_blank">stronie domowej projektu</a> oraz na <a href="http://www.ebusiness-unibw.org/wiki/GoodRelations" target="_blank">wiki</a>, gdzie znajdują się również przykłady wykorzystania ontologii. Specyfikacja ontologii znajduje się pod adresem <a href="http://www.heppnetz.de/ontologies/goodrelations/v1" target="_blank">http://www.heppnetz.de/ontologies/goodrelations/v1</a>.</p>
<p>Aby być stale na bieżąco ze zmianami warto zapisać się na listę dyskusyjną http://ebusiness-unibw.org/cgi-bin/mailman/listinfo/goodrelations lub śledzić tag <a href="https://twitter.com/#search?q=goodrelations">#goodrelations</a> na twitterze.</p>
<p>Jedyne ograniczenie w wykorzystywaniu tej ontologii to konieczność podania referencji do jej twórców w naszych produktach i usługach, zgodnie z licencją <a href="http://creativecommons.org/licenses/by/3.0/" target="_blank">Creative Commons Attribution 3.0</a>.</p>
<div id="__ss_765623" style="width: 425px; text-align: center;"><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=goodrelationsoverviewfinal3key-1227044498468783-9&amp;rel=0&amp;stripped_title=a-short-introduction-to-semantic-webbased-ecommerce-the-goodrelations-vocabulary-presentation" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=goodrelationsoverviewfinal3key-1227044498468783-9&amp;rel=0&amp;stripped_title=a-short-introduction-to-semantic-webbased-ecommerce-the-goodrelations-vocabulary-presentation" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>Na zakończenie warto zauważyć, że niektóre popularne CMSy i programy do obsługi sklepów elektronicznych <a href=" http://www.ebusiness-unibw.org/wiki/GoodRelations#Applications#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_blank">już wspierają</a> Good Relations.</p>
<p>A czy firma dostarczająca oprogramowanie do Waszego e-sklepu zaoferowała wam już wsparcie dla Good Relations? czy nadal jesteście jednym z milionów nie wyróżniających się sklepów internetowych? Jeżeli nie, to możemy pomóc Ci wdrożyć Good Relations w Twojej firmie.</p>
<p><em>*) Google na razie twierdzi, że nie będzie wykorzystywał informacji uzyskanych z metadanych w postaci RDFa i Microformaty, do pozycjonowania treści. Czy tak jest na prawdę, tego na razie nie wiadomo.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2009/12/good-relations/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Publikujemy w Web 3.0 &#8211; część 5: Sprawdzamy nasz system przekierowań HTTP 303</title>
		<link>http://www.semanticschool.com/2009/12/debug-http-303/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2009/12/debug-http-303/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 08:00:47 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[303]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[macos x]]></category>
		<category><![CDATA[przekierowanie]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[sprawdzenie]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=618</guid>
		<description><![CDATA[W poprzednim odcinkach serii "Publikujemy w Web 3.0" pisaliśmy dostarczaniu typów dokumentów zgodnych z oczekiwaniami klientów przy wykorzystaniu przekierowań 303 w protokole HTTP. Ale skąd tak na prawdę wiadomo czy nasz serwis robi to poprawnie ? Zanim zaczniemy zadawać pytania "Pedantycznej Sieci", warto zrobić podstawowe sprawdzenie we własnym zakresie. Receptę na nasz problem opisał na [...]]]></description>
			<content:encoded><![CDATA[<p>W poprzednim odcinkach serii "Publikujemy w Web 3.0" pisaliśmy dostarczaniu typów dokumentów zgodnych z oczekiwaniami klientów przy wykorzystaniu przekierowań 303 w protokole HTTP. Ale skąd tak na prawdę wiadomo czy nasz serwis robi to poprawnie ? Zanim zaczniemy zadawać pytania "<a href="http://www.semanticschool.com/2009/12/pedantyczna-siec/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">Pedantycznej Sieci</a>", warto zrobić podstawowe sprawdzenie we własnym zakresie.</p>
<p><span id="more-618"></span>Receptę na nasz problem <a href="http://dowhatimean.net/2007/02/debugging-semantic-web-sites-with-curl" target="_blank">opisał na swoim blogu</a> Richard Cyganiak, z DERI Galway.</p>
<p>Do przetestowania naszego systemu potrzebujemy programu <code><a href="http://curl.haxx.se/download.html" target="_blank">curl</a></code>. Jeżeli korzystamy z linuxa jest duża szansa, że będzie już zainstalowany. W przypadku Mac OSX możemy go <a href="http://curl.darwinports.com/" target="_blank">łatwo pobrać i zainstalować</a>. Niestety w przypadku systemu Windows - najlepszym rozwiązaniem będzie zainstalowanie sobie środowiska <a href="http://www.cygwin.com/" target="_blank">Cygwin</a> oraz paczki curl.</p>
<p>Po zainstalowaniu komenda curl umożliwia nam pobranie informacji znajdujących się pod podanym adresem URL.</p>
<pre>curl http://www.semanticschool.com/</pre>
<p>zwróci nam zawartość dokumentu HTML głównej strony Szkoły Web 3.0</p>
<pre>curl -I http://www.semanticschool.com/</pre>
<p>zwróci nam sam nagłówek protokołu HTTP informujący o głównej stronie Szkoły Web 3.0</p>
<pre>  HTTP/1.1 200 OK
  Date: Sun, 13 Dec 2009 21:40:48 GMT
  Server: Apache
  X-Powered-By: PHP/5.2.9
  X-Pingback: http://www.semanticschool.com/xmlrpc.php
  Vary: Accept-Encoding
  Content-Type: text/html; charset=UTF-8</pre>
<pre>curl -I http://www.openvocabulary.info/thesauri/ot/pl/instances/wordsense-dom-9</pre>
<p>zwróci nam podobny nagłówek HTTP do poprzedniego, jednak na uwagę zasługuje wpis o statusie 303 i nowej lokalizacji do której powinno nastąpić przekierowanie.</p>
<pre> HTTP/1.1 303 See Other
  Date: Sun, 13 Dec 2009 21:43:44 GMT
  Server: Apache/2.2.8 (Fedora)
  Set-Cookie: JSESSIONID=A69D4C95449EAF3148EB6980804F9828; Path=/
  Location: http://www.openvocabulary.info/html/thesauri/ot/pl/instances/wordsense-dom-9
  Connection: close
  Content-Type: text/html;charset=UTF-8</pre>
<p>Teraz wystarczy tylko przekonać serwis Open Vocabulary, że jesteśmy agentem semantycznym prosząc o treści w formacie RDF. W tym celu razem z zapytaniem HTTP GET do serwisu, wysyłamy również nagłówek informujący o oczekiwanej treści: <code>Accept: application/rdf+xml</code></p>
<pre>curl -I -H "Accept: application/rdf+xml" http://www.openvocabulary.info/thesauri/ot/pl/instances/wordsense-dom-9</pre>
<p>tym razem przekierowanie następuje do dokumentu RDF:</p>
<pre>  HTTP/1.1 303 See Other
  Date: Sun, 13 Dec 2009 21:46:44 GMT
  Server: Apache/2.2.8 (Fedora)
  Set-Cookie: JSESSIONID=15369544CC3DB2694D104F721CC0AD43; Path=/
  Location: http://www.openvocabulary.info/rdf/thesauri/ot/pl/instances/wordsense-dom-9
  Connection: close
  Content-Type: text/rdf;charset=UTF-8</pre>
<p>Jeśli sprawdzamy nasz serwis, to zwracajmy uwagę na nagłówki <code>Location</code> otrzymywane dla różnych nagłówków <code>Accept</code> w zapytaniach HTTP GET. Dla każdego z wspieranych typów dokumentów, np.: HTML, RDF, JSON, przekierowanie powinno następować do istniejącego dokumentu w danym formacie. Zazwyczaj możemy też przyjąć, że domyślne przekierowanie powinno następować do (istniejącej) wersji dokumentu w formacie HTML.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2009/12/debug-http-303/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Publikujemy w Web 3.0 &#8211; część 4: Semantyczny agent rozmawia z naszym serwisem</title>
		<link>http://www.semanticschool.com/2009/12/schemat-uri-303/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2009/12/schemat-uri-303/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 08:00:03 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[303]]></category>
		<category><![CDATA[cool uri]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[przekierowanie]]></category>
		<category><![CDATA[uri]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=549</guid>
		<description><![CDATA[W poprzednich artykułach cyklu "Publikujemy w Web 3.0" dowiedzieliśmy się w jaki sposób sprawić, aby nasz serwis dostarczał semantyki. W ostatnim odcinku rozważaliśmy potrzebę tworzenia URI tak aby nigdy nie musiały ulegać zmianie. W tym odcinku opiszemy kiedy stosować przekierowania protokołu HTTP czy też adresy URL z tzw. hashtagami. Jeżeli chcemy zdefiniować schemat URI dla [...]]]></description>
			<content:encoded><![CDATA[<p>W poprzednich artykułach cyklu "Publikujemy w Web 3.0" dowiedzieliśmy się w jaki sposób sprawić, aby nasz serwis dostarczał semantyki. W ostatnim odcinku rozważaliśmy potrzebę tworzenia URI tak aby nigdy nie musiały ulegać zmianie. W tym odcinku opiszemy kiedy stosować przekierowania protokołu HTTP czy też adresy URL z tzw. hashtagami.</p>
<p><span id="more-549"></span></p>
<p>Jeżeli chcemy zdefiniować schemat URI dla zasobów opisywanych w dokumentach RDF niezależnych od treści HTML (czyli <a href="http://www.semanticschool.com/2009/11/publikowanie-semantyki/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">nie osadzonych</a>), mamy do wyboru <a href="http://www.w3.org/TR/cooluris/" target="_blank">dwa rozwiązania</a>:</p>
<ul>
<li>schemat URI oparty na hash tagach,</li>
<li>schemat URI oparty na przekierowaniach HTTP 303.</li>
</ul>
<h2>Schemat URI oparty na hash tagach</h2>
<p>W pierwszym wypadku nasz serwis dostarcza pojedynczy dokument RDF, w którym poszczególne zasoby identyfikowane są za pomocą lokalnych nazw. Pełne URI zasobu składa się z URI dokumentu RDF i lokalnej nazwy zasobu.</p>
<p>Na przykład nasza firma może zebrać wszystkie informacje w jednym dokumencie RDF i opublikować go pod adresem <code>http://www.przyklad.pl/informacje</code>. Zasób RDF opisujący firmę może mieć lokalna nazwę <code>ofirmie</code>, skąd globalne URI będzie postaci <code>http://www.przyklad.pl/informacje#ofirmie</code>.</p>
<p>Korzystając ze schematów URI opartych na hash tagach możemy dostarczać zawartości w formacie rozpoznawalnym przez danego agenta. Poniższy rysunek pokazuje poszczególne etapy procesu. Agent semantyczny pytając o zasób o URI <code>http://www.przyklad.pl/informacje#ofirmie</code> korzystając z protokołu HTTP otrzymuje cały dokument <code>http://www.przyklad.pl/informacje</code> (hash tagi nie są przetwarzane w ramach protokołu HTTP). W przypadku agenta, który poprosi o dokument RDF (<code>application/rdf+xml</code>) nastąpi de facto przekazanie zawartości dokumentu <code>http://www.przyklad.pl/informacje.rdf</code>; zamiast przekazania bezpośrednio zawartości zasobu <code>http://www.przyklad.pl/informacje</code>. Podobnie w przypadku agenta proszącego o dokument HTML.</p>
<p style="text-align: center;"><img class="size-medium wp-image-615  aligncenter" title="Negocjacja zawartości dla schematu URI opartego na hash tagach" src="http://www.semanticschool.com/wp-content/uploads/2009/12/hashtag.png" alt="Negocjacja zawartości dla schematu URI opartego na hash tagach" width="540" height="250" /></p>
<h2>Schemat URI oparty na przekierowaniach HTTP 303</h2>
<p>W przypadku schematu URI opartego na przekierowaniach HTTP, każdy zasób dla którego dostarczony jest dokument RDF posiada globalne URI. W powyższym przykładzie, taki URI byłby następujący: <code>http://www.przyklad.pl/id/ofirmie</code>. W odpowiedzi na zapytanie agenta o zasób o podanym URI, serwer wysyła status odpowiedzi 303, wraz z nagłówkiem <code>Location</code> o docelowym dokumencie. W przypadku agenta semantycznego proszącego o dokument RDF, zostanie on przekierowany do dokumentu <code>http://www.przyklad.pl/doc/ofirmie.rdf</code></p>
<p style="text-align: center; ">
<p style="text-align: center;"><img class="aligncenter size-full wp-image-617" title="Schemat URI oparty na przekierowaniach 303" src="http://www.semanticschool.com/wp-content/uploads/2009/12/redirect3031.png" alt="Schemat URI oparty na przekierowaniach 303" width="544" height="250" /></p>
<h2>Który schemat wybrać ?</h2>
<p>Zaletą schematów opartych na hash tagach jest mniejsza ilość zapytań HTTP, które musi wykonać agent komunikujący się z naszym serwisem. Niewątpliwą jednak wadą jest konieczność pobrania całego dokumentu opisującego wszystkie zasoby; szczególnie w przypadku dużej liczby zasobów może to prowadzić do sporych opóźnień w komunikacji. Dlatego też schematy URI oparte na hash tagach doskonale nadają się do niewielkich zestawów zasobów, o których informacje zmieniają się rzadko; przykładem mogą być <a href="http://www.semanticschool.com/2009/10/ontologie-przyklady/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">lekkie ontologie</a>. Na zakończenie, warto zauważyć, że oba rozwiązania nie wykluczają się wzajemnie; jeżeli nasz system potrafi skorzystać z hybrytowego rozwiązania opartego na obu schematach, tak powinniśmy uczynić.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2009/12/schemat-uri-303/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publikujemy w Web 3.0 &#8211; część 2: Mój serwis jest Web 3.0</title>
		<link>http://www.semanticschool.com/2009/11/publikowanie-semantyki/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2009/11/publikowanie-semantyki/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 07:13:24 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[303]]></category>
		<category><![CDATA[erdf]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[grddl]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[linked open data]]></category>
		<category><![CDATA[lod]]></category>
		<category><![CDATA[microformats]]></category>
		<category><![CDATA[mikroformaty]]></category>
		<category><![CDATA[ntriples]]></category>
		<category><![CDATA[publikowanie]]></category>
		<category><![CDATA[rdfa]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[rest api]]></category>
		<category><![CDATA[semantyka]]></category>
		<category><![CDATA[Uniform Resource Identifier]]></category>
		<category><![CDATA[uri]]></category>
		<category><![CDATA[wlasciwosc]]></category>
		<category><![CDATA[xhtml]]></category>
		<category><![CDATA[xsl]]></category>
		<category><![CDATA[xstl]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=487</guid>
		<description><![CDATA[Kiedy po wielu dniach czy tygodniach pracy nasz serwis internetowy lub strona internetowa jest gotowa, zastanawiamy się jak uczynić ją popularną. W grę wchodzi wiele rozwiązań zajmujących się optymalizacją strony pod wyszukiwarki (ang. Search Engine Optimization - SEO) czy też marketingiem wspieranym mechanizmami wyszukiwarek internetowych (ang. Search Engine Marketing - SEM). Kilka miesięcy temu Google [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-506" title="Embedding Semantics" src="http://www.semanticschool.com/wp-content/uploads/2009/11/embedsemantics-300x195.png" alt="Embedding Semantics" width="240" height="156" />Kiedy po wielu dniach czy tygodniach pracy nasz serwis internetowy lub strona internetowa jest gotowa, zastanawiamy się jak uczynić ją popularną. W grę wchodzi wiele rozwiązań zajmujących się optymalizacją strony pod wyszukiwarki (ang. <em>Search Engine Optimization - SEO</em>) czy też marketingiem wspieranym mechanizmami wyszukiwarek internetowych (ang. <em>Search Engine Marketing - SEM</em>). Kilka miesięcy temu <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=99170" target="_blank">Google zapowiedział</a> wsparcie dla technologii semantycznych dzięki indeksowaniu fragmentów stron wzbogaconych o semantykę (ang. <em>rich snippets</em>).</p>
<p>O tworzeniu stron bogatych w semantykę pod kątem indeksowania przez Google napiszemy w kolejnych artykułach.  W tym artykule przedstawimy przegląd technik publikowania semantyki na naszych serwisach internetowych.</p>
<p><span id="more-487"></span></p>
<p>Kiedy nasza witryna internetowa zasilana jest bazą danych, np. relacyjną, możemy niskim kosztem uczynić ją bardziej semantyczną, publikując nie tylko jej wersję czytelną dla ludzi, ale również wersję czytelną dla maszyn. Jeżeli nasza strona tworzona jest "ręcznie", a narzędzie którego używamy nie wspiera oznaczeń semantycznych, będzie nas to kosztowało trochę więcej pracy.</p>
<p>Aby powiązać wersję czytelną dla maszyn z naszym serwisem stworzonym dla ludzi, mam do wyboru trzy rozwiązania:</p>
<ol>
<li>Wskazujemy na zewnętrzny dokument (lub usługę), który zawiera reprezentację danej strony w formacie zrozumiałym przez maszyny, np.: RDF (najlepiej w wersji <a href="http://www.semanticschool.com/2009/09/rdf-zapis/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">Turtle lub N3</a>).</li>
<li>Osadzamy (ang. <em>embed</em>) semantykę bezpośrednio w źródle naszej strony HTML.</li>
<li>Podajemy reguły translacji źródła naszej strony do dokumentu RDF.</li>
<li>Dostarczamy usługę negocjacji zawartości (ang. <em>content negotiation</em>) w ramach naszego serwisu.</li>
</ol>
<h4>Wskazujemy na dokumenty RDF</h4>
<p>Wskazanie na zewnętrzny dokument RDF jest zapewne najprostrzym rozwiązaniem. Wystarczy, że w źródle HTML naszej strony internetowej, w sekcji <code>&lt;head&gt;</code> umieścimy poniższy odnośnik wskazujący na inny dokument po podanym adresem URL.</p>
<p><code>&lt;link rel="media" type="text/turtle" title="wersja semantyczna" href="http://adres.naszego.serwisu/dane/dokument.ttl"/&gt;</code></p>
<p>Wskazany w ten sposób dokument może opisywać zarówno pojedynczą stronę HTML naszego serwisu, jak i dostarczać zbiorczy opis dla wszystkich stron opisu. Oczywiście idealnie byłoby gdybyśmy dostarczali osobne dokumenty RDF dla każdej strony HTML.</p>
<p><a href="http://sioc-project.org/wordpress" target="_blank">Plugin dla WordPress</a> eksportujący źródło blogu w <a href="http://www.semanticschool.com/2009/11/sioc/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">ontologii SIOC</a>, którego używamy w Szkole Web 3.0, w informuje agenty Web 3.0 o powiązanych danych semantycznych w następujący sposób:</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #9b6800;"><span style="color: #0000ff;">&lt;link</span><span style="color: #000000;"> </span><span style="color: #592600;">rel=</span>"meta"<span style="color: #000000;"> </span><span style="color: #592600;">type=</span>"application/rdf+xml"<span style="color: #000000;"> </span><span style="color: #592600;">title=</span>"SIOC"<span style="color: #000000;"> </span><span style="color: #592600;">href=</span>"http://www.semanticschool.com/index.php?sioc_type=post&amp;amp;sioc_id=487"<span style="color: #0000ff;"> /&gt;</span></p>
<h4>Osadzamy semantykę w źródle strony WWW</h4>
<p>Innym sposobem, sugerowanym m.in. przez Google, jest osadzenie semantyki bezpośrednio w kodzie strony WWW. Wykorzystujemy do tego celu elementy definiowane przez specyfikację (X)HTML, m.in. wartości atrybutów <code>class</code>, <code>id</code>, <code>title</code>, <code>rev</code> i <code>rel</code>. W chwili obecnej do najbardziej popularnych standardów osadzania danych RDF w stronie HTML należą:</p>
<ul>
<li><a href="http://microformats.org/" target="_blank">mikroformaty</a> (ang. <em>microformats</em>) - są chyba najstarszym sposobem osadzania semantyki. Chociaż przez pewien czas społeczność mikroformatów występowała niejako w opozycji do środowiska Semantic Web, w chwili obecnej są one jednym z rekomendowanych sposobów osadzania semantyki, wspierane zarówno przez Yahoo! i Google. Chyba największym minusem mikroformatów jest fakt, że są one nie tylko sposobem osadzania semantyki, ale również  zamkniętym (w dużej mierze) zestawem mini-ontologii.</li>
<li><a href="http://research.talis.com/2005/erdf/wiki/Main/RdfInHtml" target="_blank">eRDF</a> - umożliwia osadzenie semantyki z dowolnej ontologii. W tym celu, najpierw w <code>&lt;head&gt; </code>definiujemy listę wspieranych ontologii, deklarując mapowanie nazwy ontologii na URI jej specyfikacji:
<pre>&lt;link rel="schema.foaf" href="http://xmlns.com/foaf/0.1/" /&gt;</pre>
<p>a następnie wykorzystujemy atrybuty <code>class</code> do określania predykatów zdań RDF osadzonych w stronie:</p>
<pre>&lt;span class="foaf-firstName"&gt;Sebastian&lt;/span&gt;</pre>
<p>Co zostanie zinterpretowane przez agenta semantycznego jako:</p>
<pre>&lt;&gt; foaf:firstName "Sebastian".</pre>
<p>Podmiot zdań RDF deklarujemy za pomocą elementu <code>&lt;link&gt;</code></p>
<pre>&lt;link href="#sebastian" rev="foaf-made" rel="foaf-maker" /&gt;</pre>
<p>gdzie atrybut <code>rel</code> odczytujemy jako predykat pomiędzy daną stroną a określonym przez <code>href</code> zasobem, a atrybut <code>rev</code> odczytujemy jako predykat pomiędzy określonym zasobem a daną stroną.<br />
Powyższy przykład zostałby odczytany jako:</p>
<pre>&lt;http://www.semanticschool.com/2009/11/publikowanie-semantyki/#sebastian&gt; foaf:made &lt;http://www.semanticschool.com/2009/11/publikowanie-semantyki/&gt;.
&lt;http://www.semanticschool.com/2009/11/publikowanie-semantyki/&gt; foaf:maker &lt;http://www.semanticschool.com/2009/11/publikowanie-semantyki/#sebastian&gt; .</pre>
</li>
<li><a href="http://www.w3.org/TR/xhtml-rdfa-primer/" target="_blank">RDFa</a> jest oficjalną rekomendacją W3C, wspieraną m.in. przez Yahoo i Google. Jest dużo bardziej zaawansowana pod względem możliwych konstrukcji osadzania semantyki. Rozszerza ona mechanizmy zdefiniowane w eRDF o m.in. na określaniu przestrzeni nazw (ang. <em>namespace</em>) dla danego fragmentu strony za pomocą meta-atrybutów <code>xmlns:*</code>. Predykaty definiowane są za pomocą atrybutu <code>property</code>. RDFa umożliwia również na definiowanie dowolnych podmiotów zdań RDF, za pomocą atrybutu <code>about</code>, oraz na określanie typów (klas) zasobów za pomocą atrybutów <code>typeof</code>. Standard RDFa opiszemy w jednym z przyszłych artykułów.</li>
</ul>
<h4>Określamy reguły translacji do dokumentów RDF</h4>
<p>Zanim osadzanie semantyki za pomocą standardów typu RDFa stało się popularne, środowisko Semantic Web promowało standard <a href="http://www.w3.org/2004/01/rdxh/spec" target="_blank">GRDDL</a> (czyt: <em>grid'l</em>). Idea tego rozwiązania opierała się na deklarowaniu dla danej strony HTML transformaty XSTL za pomocą której dana strona może zostać przekształcona do postaci dokumentu RDF. Oto przykład takiej definicji:</p>
<pre>&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:grddl='http://www.w3.org/2003/g/data-view#'
      grddl:transformation="glean_title.xsl
			    http://www.w3.org/2001/sw/grddl-wg/td/getAuthor.xsl"
 &gt;</pre>
<h4>Budujemy usługę negocjacji zawartości</h4>
<p>Ostatnim, i w chwili obecnej najbardziej popularnym rozwiązaniem dla wszelkiego rodzaju serwisów internetowych, jest dostarczenie usługi negocjacji zawartości. Pomysł opiera się na określeniu (co najmniej) trzech schematów URI dla każdego typu zasobu obsługiwanego przez nasz serwis, np. dla blogu typami takimi byłby: osóby, artykuły, tagi i kategorie.  Tymi podstawowymi trzema schematami są:</p>
<ol>
<li>Identyfikator zasobu, np.: URI autora artykułów.</li>
<li>Wersja zasobu zrozumiała dla ludzi, np.: strona HTML z profilem danego autora artykułów.</li>
<li>Wersja zasobu zrozumiała dla maszyn, np.: dokument RDF z profile FOAF danego autora artykułów.</li>
</ol>
<p>Rozwiązanie oparte o usługę negocjacji zawartości jest sposobem rekomendowanym przez inicjatywę publicznych, połączonych danych (ang. <em>linked data</em>) o której pisałem w <a href="http://www.semanticschool.com/2009/11/publikujemy-w-web3/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">poprzednim odcinku tego cyklu</a>. Autorzy <a href="http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/" target="_blank">mini-podręcznika</a> o tym jak publikować połączone dane omawiają różne sposoby deklarowania schematów URI:</p>
<ol>
<li>Różne domeny:
<ul>
<li>http://id.nasz-serwis.pl/autorzy/Sebastian</li>
<li>http://www.nasz-serwis.pl/autorzy/Sebastian</li>
<li>http://rdf.nasz-serwis.pl/autorzy/Sebastian</li>
</ul>
</li>
<li>Różne rozszerzenia (pseudo-) plików udostępnianych przez serwis:
<ul>
<li>http://www.nasz-serwis.pl/autorzy/Sebastian</li>
<li>http://www.nasz-serwis.pl/autorzy/Sebastian.html</li>
<li>http://www.nasz-serwis.pl/autorzy/Sebastian.rdf</li>
</ul>
</li>
<li>Różne człony wewnątrz schematu URI:
<ul>
<li>http://www.nasz-serwis.pl/id/autorzy/Sebastian</li>
<li>http://www.nasz-serwis.pl/html/autorzy/Sebastian</li>
<li>http://www.nasz-serwis.pl/rdf/autorzy/Sebastian</li>
</ul>
</li>
</ol>
<p>W następnym odcinku tego cyklu przedstawimy wytyczne budowania tzw. cool URI.</p>
<p>Kiedy określimy już schemat URI dla naszych typów zasobów, konieczne jest takie skonfigurowanie naszego serwisu (np. na poziomie konfiguracji serwera HTTPD), aby w odpowiedzi na zapytanie o stronę z identyfikatorem zasobu, przekierowywał albo na stronę HTML albo do dokument RDF, w zależności od możliwości interpretowania treści określonych przez klienta (przeglądarkę WWW lub agenta semantycznego).</p>
<p>Ideę przekierowań 303 prezentuje poniższy rysunek. Aplikacja kliencka za pomocą nagłówka HTTP określa rozpoznawany typ zasobów, w tym wypadku <code>application/rdf+xml</code>, na co serwer w odpowiedzi wysyła przekierowanie do dokumentu RDF zawierającemu opis danego zasobu.</p>
<p>Należy pamiętać, aby zarówno na stronach HTML jak i dokumentach RDF posługiwać się URI będącym identyfikatorem zasobu, a nie jego wersją w postaci strony HTML lub dokumentu RDF.</p>
<div id="attachment_520" class="wp-caption aligncenter" style="width: 588px"><a href="http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/#Terminology"><img class="size-full wp-image-520 " title="Przekierowania 303" src="http://www.semanticschool.com/wp-content/uploads/2009/11/deref-ont-uri-rdf.png" alt="Przekierowania 303 (źródło: http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/)" width="578" height="207" /></a><p class="wp-caption-text">Przekierowania 303 (źródło: http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/)</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2009/11/publikowanie-semantyki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nasz pierwszy semantyczny program z biblioteką Jena</title>
		<link>http://www.semanticschool.com/2009/11/jena-pierwszy-program/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://www.semanticschool.com/2009/11/jena-pierwszy-program/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 19:48:00 +0000</pubDate>
		<dc:creator>Sebastian Kruk</dc:creator>
				<category><![CDATA[Biblioteki]]></category>
		<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Podstawy]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jena]]></category>
		<category><![CDATA[odpowiedzi]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[przykład]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[rdf schema]]></category>
		<category><![CDATA[wnioskowanie]]></category>

		<guid isPermaLink="false">http://www.semanticschool.com/?p=408</guid>
		<description><![CDATA[Wczoraj otrzymałem ciekawy komentarz/zapytanie do artykułu o wnioskowaniu z RDF Schema. Ponieważ przykład daje więcej niż tysiące opisów i wyjaśnień postanowiłem pokazać jak łatwo można wykonać wnioskowanie z RDF Schema korzystając z biblioteki Jena, o której pisałem niedawno. Jena jest biblioteką dostarczającą API w języku Java. Zacznijmy więc od zebrania potrzebnych narzędzi: kompilator i maszyna [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj otrzymałem ciekawy <a href="http://www.semanticschool.com/2009/10/rdf-schema-wnioskowanie/#comment-54#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">komentarz/zapytanie</a> do artykułu o <a href="http://www.semanticschool.com/2009/10/rdf-schema-wnioskowanie/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">wnioskowaniu z RDF Schema</a>. Ponieważ przykład daje więcej niż tysiące opisów i wyjaśnień postanowiłem pokazać jak łatwo można wykonać wnioskowanie z RDF Schema korzystając z biblioteki <a href="http://www.openjena.org/" target="_blank">Jena</a>, o której <a href="http://www.semanticschool.com/2009/10/hp-jena/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">pisałem niedawno</a>.</p>
<p><span id="more-408"></span>Jena jest biblioteką dostarczającą API w języku Java. Zacznijmy więc od zebrania potrzebnych narzędzi:</p>
<ul>
<li><a href="http://java.sun.com/" target="_blank">kompilator i maszyna wirtualna Java</a>, najlepiej w wersji JDK 5.0</li>
<li>środowisko programistyczne, np.: <a href="http://www.eclipse.org/" target="_blank">Eclipse</a></li>
<li>biblioteka Jena i biblioteki zależne [<a href="http://sourceforge.net/projects/jena/files/Jena/" target="_blank">pobierz najnowszą wersję tutaj</a>]</li>
</ul>
<p>W Eclipse rozpoczynamy nowy projekt typu Java, i przegrywamy i dodajemy do projektu JARy dostarczone z biblioteką Jena:</p>
<p><img class="aligncenter size-full wp-image-410" title="Jena i biblioteki zależne" src="http://www.semanticschool.com/wp-content/uploads/2009/11/screenshot-1.jpg" alt="Jena i biblioteki zależne" width="542" height="299" /></p>
<p>Następnie tworzymy nową klasę i zaczynamy nasz pierwszy "semantyczny" program. Polecam specyfikację biblioteki Jena: <a href="http://www.openjena.org/javadoc/index.html" target="_blank">http://www.openjena.org/javadoc/index.html</a>.</p>
<p>Zdefiniujmy dwie przestrzenie nazw, jedną na elementy ontologii w RDF Schema, a drugą na zasoby:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span><span style="color: #7f0055;">static</span><span style="color: #000000;"> </span><span style="color: #7f0055;">final</span><span style="color: #000000;"> String </span><span style="color: #0000c0;">NS_ONT</span><span style="color: #000000;"> = </span>"http://www.semanticschool.com/rdfs#"<span style="color: #000000;">;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #2a00ff;"><span style="color: #000000;"><span style="white-space: pre;"> </span></span><span style="color: #7f0055;">static</span><span style="color: #000000;"> </span><span style="color: #7f0055;">final</span><span style="color: #000000;"> String </span><span style="color: #0000c0;">NS_DATA</span><span style="color: #000000;"> = </span>"http://www.semanticschool.com/data#"<span style="color: #000000;">;</span></p>
</div>
<p>Następnie tworzymy nowy model, czyli obiekt który będzie reprezentował tworzony przez nas graf RDF; pamiętajmy że RDF Schema jest również zapisana w postaci grafu RDF.</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;"><span style="white-space: pre;"> </span>Model model = ModelFactory.createDefaultModel();</p>
</div>
<p>W następnym kroku dodajemy do modelu definicje naszych klas i właściwości.</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">//[semschool:Samochod] [rdf:type] [rdfs:Class].</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource cSamochod = model.createResource(<span style="color: #0000c0;">NS_ONT</span>+<span style="color: #2a00ff;">"Samochod"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">cSamochod.addProperty(RDF.<span style="color: #0000c0;">type</span>, RDFS.<span style="color: #0000c0;">Class</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;"><span style="white-space: pre;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">//[semschool:Czlowiek] [rdf:type] [rdfs:Class].</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource cCzlowiek = model.createResource(<span style="color: #0000c0;">NS_ONT</span>+<span style="color: #2a00ff;">"Czlowiek"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">cCzlowiek.addProperty(RDF.<span style="color: #0000c0;">type</span>, RDFS.<span style="color: #0000c0;">Class</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;"><span style="white-space: pre;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3f7f5f;">//[semschool:kierowac] [rdf:type] [rdf:Property].</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Property pKierowac = model.createProperty(<span style="color: #0000c0;">NS_ONT</span>, <span style="color: #2a00ff;">"prowadzi"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">pKierowac.addProperty(RDF.<span style="color: #0000c0;">type</span>, RDF.<span style="color: #0000c0;">Property</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">pKierowac.addProperty(RDFS.<span style="color: #0000c0;">domain</span>, cCzlowiek);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">pKierowac.addProperty(RDFS.<span style="color: #0000c0;">range</span>, cSamochod);</p>
</div>
<p>W tym momencie możemy wypisać nasz graf RDF:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">model.write(System.<span style="color: #0000c0;">out</span>, <span style="color: #2a00ff;">"N-TRIPLE"</span>);</p>
</div>
<p>otrzymamy w następujący wynik (z dokładnością do kolejności trójek):</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/2000/01/rdf-schema#range&gt; &lt;http://www.semanticschool.com/rdfs#Samochod&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/2000/01/rdf-schema#domain&gt; &lt;http://www.semanticschool.com/rdfs#Czlowiek&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#Property&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#Czlowiek&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2000/01/rdf-schema#Class&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#Samochod&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2000/01/rdf-schema#Class&gt; .</p>
</div>
<p>W kolejnym kroku stwórzmy nowy model bazujący na poprzednim. Model ten nie będzie wykorzystywał wnioskowania bazującego na RDF Schema (tzw. <a href="http://jena.sourceforge.net/inference/" target="_blank">inferencing</a>)</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Model model2 = ModelFactory.createDefaultModel();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">model2.add(model);</p>
</div>
<p>A następnie dodajmy do niego dwa zasoby: <code>[Jan]</code> i <code>[Mazda]</code>, oraz stwórzmy zdanie <code>[Jan] [kieruje] [Mazdę]</code>.</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource rJan = model2.createResource(<span style="color: #0000c0;">NS_DATA</span>+<span style="color: #2a00ff;">"Jan"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource rMazda = model2.createResource(<span style="color: #0000c0;">NS_DATA</span>+<span style="color: #2a00ff;">"Mazda"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">rJan.addProperty(pKierowac, rMazda);</p>
</div>
<p>I ponownie jak poprzednio wypiszmy nasz obecny graf:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">model2.write(System.<span style="color: #0000c0;">out</span>, <span style="color: #2a00ff;">"N-TRIPLE"</span>);</p>
</div>
<p>Jak widać poniżej, w wyniku doszło tylko jedno dodatkowe zdanie RDF:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#Property&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/2000/01/rdf-schema#domain&gt; &lt;http://www.semanticschool.com/rdfs#Czlowiek&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.w3.org/2000/01/rdf-schema#range&gt; &lt;http://www.semanticschool.com/rdfs#Samochod&gt; .</p>
<p style="color: red; margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/data#Jan&gt; &lt;http://www.semanticschool.com/rdfs#prowadzi&gt; &lt;http://www.semanticschool.com/data#Mazda&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#Samochod&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2000/01/rdf-schema#Class&gt; .</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">&lt;http://www.semanticschool.com/rdfs#Czlowiek&gt; &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&gt; &lt;http://www.w3.org/2000/01/rdf-schema#Class&gt; .</p>
</div>
<p>A teraz czas na wnioskowanie w akcji. Dzięki bibliotece Jena uruchomienie wnioskowania jest bardzo proste.</p>
<p>Musimy najpierw stworzyć nowy model bazujący na poprzednim. Tym razem, nasz model będzie dedykowany dla wnioskowania z RDF Schema.</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">InfModel infmodel = ModelFactory.createRDFSModel(model);</p>
</div>
<p>Podobnie jak poprzednio dodajemy nasze przykładowe zdanie:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource rJan = infmodel.createResource(<span style="color: #0000c0;">NS_DATA</span>+<span style="color: #2a00ff;">"Jan"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">Resource rMazda = infmodel.createResource(<span style="color: #0000c0;">NS_DATA</span>+<span style="color: #2a00ff;">"Mazda"</span>);</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px;">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">rJan.addProperty(pKierowac, rMazda);</p>
</div>
<p>Ponieważ cały model infmodel zawiera również trójki związane ze specyfikacją języka ontologii RDF Schema, więc odpytajmy nasz model tylko o typy zasobów <code>[Jan]</code> i <code>[Mazda]</code>.</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">System.<span style="color: #0000c0;">out</span>.println(rJan.getProperty(RDF.<span style="color: #0000c0;">type</span>));</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">System.<span style="color: #0000c0;">out</span>.println(rMazda.getProperty(RDF.<span style="color: #0000c0;">type</span>));</p>
</div>
<p>W wyniku otrzymamy:</p>
<div class="java">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">[http://www.semanticschool.com/data#Jan, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.semanticschool.com/rdfs#Czlowiek]</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco;">[http://www.semanticschool.com/data#Mazda, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.semanticschool.com/rdfs#Samochod]</p>
</div>
<p>Co tym samym kończy nasz dowód: maszyna wnioskująca poprawnie określiła typ zasobów <code>[Jan]</code> i <code>[Mazda]</code>.</p>
<p>Pełen kod projektu razem z biblioteką Jena, znajdziecie [<a href="http://www.semanticschool.com/wp-content/uploads/2009/11/JenaReasoningExample.zip#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed" target="_blank">tutaj</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.semanticschool.com/2009/11/jena-pierwszy-program/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 4.397 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-07-30 18:30:47 -->
