<?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/"
	>

<channel>
	<title>SemantycznyWeb - semantic web, web 3.0 &#187; Programowanie</title>
	<atom:link href="http://semantictechnology.eu/category/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://semantictechnology.eu</link>
	<description>Standardy i technologie Web 3.0, wyszukiwanie informacji w sieci, semantyczne nowości</description>
	<lastBuildDate>Sun, 18 Mar 2012 16:17:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Zapytania SPARQL cz. 2 &#8211; odpytywanie serwisu e-commerce</title>
		<link>http://semantictechnology.eu/2011/11/zapytania-sparql-cz-2-odpytywanie-serwisu-e-commerce/</link>
		<comments>http://semantictechnology.eu/2011/11/zapytania-sparql-cz-2-odpytywanie-serwisu-e-commerce/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 16:24:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[e-Commerce]]></category>
		<category><![CDATA[semantic web]]></category>
		<category><![CDATA[SPARQL]]></category>

		<guid isPermaLink="false">http://semantictechnology.eu/?p=836</guid>
		<description><![CDATA[W artykule tym pokażę 3 rozbudowane zapytania w języku SPARQL, które nawiązywać będą do stworzonego przez nas semantycznego serwisu e-commerce opisanego za pomocą ontologii Good Relations. W polskiej sieci trudno znaleźć przykładowe zapytania SPARQL, które były by dłuższe niż parę linijek kodu. Mogą się one przydać tym którzy zaczynają swoją przygodę z technologiami semantic web [...]]]></description>
			<content:encoded><![CDATA[<p><img class="zemanta-img-inserted zemanta-img-configured alignleft" title="Kate Ray's documentary &quot;The Semantic Web&amp;..." src="http://farm5.static.flickr.com/4083/5046905848_f4742c40b3_m.jpg" alt="Kate Ray's documentary &quot;The Semantic Web&amp;..." width="240" height="130" /><br />
W artykule tym pokażę 3 rozbudowane <strong>zapytania w języku SPARQL</strong>, które nawiązywać będą do stworzonego przez nas <a href="http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2/">semantycznego serwisu e-commerce</a> opisanego za pomocą ontologii Good Relations. W polskiej sieci trudno znaleźć przykładowe zapytania SPARQL, które były by dłuższe niż parę linijek kodu. Mogą się one przydać tym którzy zaczynają swoją przygodę z technologiami semantic web oraz pokażą jaki tkwi w nich potencjał.<br />
<span id="more-836"></span><br />
Do wyszukiwania informacji w naszym semantycznych serwisie typu e-commerce użyjemy endpoint oferowany przez serwis <strong>http://loc.openlinksw.com/sparql</strong> (wszystkie poniższe zapytania zostały wykonane na już zaindeksowanych ofertach innych firm).</p>
<p>Chcąc wyszukać pierwszych dziesięć ofert firmy „Kowalski Enterprise” zawierające w opisie słowo „Sony” wykonujemy następujące zapytanie w język SPARQL:<br />
<pre><code>
PREFIX gr: &lt;http://purl.org/goodrelations/v1#&gt;
SELECT ?nazwafirmy, ?oferta, ?komentarz
WHERE
{
?a rdf:type gr:BusinessEntity.
?a gr:legalName ?nazwafirmy.
?a gr:offers ?oferta.
?oferta rdfs:comment ?komentarz.
FILTER(regex(?nazwa,&quot;Kowalski Enterprise&quot;)&amp;&amp;regex(?comment,&quot;Sony&quot;))
} LIMIT 10
</code></pre></p>
<p>Potencjalny klient może mieć jednak własne preferencje co do lokalizacja poszczególnych oddziałów sklepów firmy Kowalski Enterprise i interesują go tylko sklepy w regionie „Śląsk” oferujące płatność kartą VISA.<br />
Potrzebuje on również dane dla swojego osobistego GPS’a aby mógł szybko wybrać najbliżej niego znajdujący się oddział oraz numer telefonu.<br />
Odpowiednio stworzona aplikacja może te dane przesłać wprost do jego telefonu komórkowego lub innego urządzenia, które ma dostęp do sieci www:<br />
<pre><code>
PREFIX gr: &lt;http://purl.org/goodrelations/v1#&gt;
SELECT DISTINCT ?label, ?comment, ?region, ?latitude, ?longitude, ?telefon WHERE
&nbsp;&nbsp;{
?a rdf:type gr:BusinessEntity.
?a gr:legalName ?nazwa.
?a gr:offers ?co.
?co rdfs:comment ?comment.
?co gr:acceptedPaymentMethods ?r.
?co gr:availableAtOrFrom ?lokalizacja.
?lokalizacja rdfs:label ?label.
?lokalizacja v:adr ?adr.
?adr v:region ?region.
?lokalizacja v:geo ?geo.
?geo v:latitude ?latitude.
?geo v:longitude ?longitude.
?lokalizacja v:tel ?tel.
?tel rdf:value ?telefon.
FILTER(regex(?nazwa,&quot;Kowalski Enterprise&quot;) &amp;&amp; regex(?comment,&quot;Sony&quot;) &amp;&amp; regex(?region,&quot;Śląsk&quot;) &amp;&amp; regex(?r, ,&quot;VISA&quot;)) } LIMIT 10
</code></pre></p>
<p>Najważniejszym kryterium wyboru oferty przez klienta staje się cena, więc szuka on ofert tylko z określonych przedziałów cenowych. W zapytaniu pojawiają się dodatkowe właściwości określające przedział cenowy produktu oraz waluta w jakiej danych przedział obowiązuje.<br />
Jeśli sklep oferuje produkty firmy „Sony” w walucie euro to minimalną ceną będzie 10 EUR a maksymalną 20 EUR. Jeśli natomiast walutą jest złoty, to przedziałem będzie kwota od 40 zł do 80 zł.<br />
Klient postanowił jednak, że zobaczy również oferty konkurencji więc warunek o firmie „Kowalski Enterprise” zostaje usunięty:<br />
<pre><code>
PREFIX v: &lt;http://www.w3.org/2006/vcard/ns#?
PREFIX gr: &lt;http://purl.org/goodrelations/v1#&gt;
SELECT *
WHERE
&nbsp;&nbsp;{
?a gr:legalName ?name.
?a gr:offers ?co.
?co gr:acceptedPaymentMethods ?r.
?co gr:availableAtOrFrom ?lokalizacja.
?lokalizacja rdfs:label ?label.
?lokalizacja v:adr ?adr.
?adr v:region ?region.
?lokalizacja v:geo ?geo.
?geo v:latitude ?latitude.
?geo v:longitude ?longitude.
?lokalizacja v:tel ?tel.
?tel rdf:value ?telefon.
&nbsp;&nbsp;&nbsp;&nbsp;?co rdfs:comment ?comment.
&nbsp;&nbsp;&nbsp;&nbsp;?co gr:hasPriceSpecification ?ps .
&nbsp;&nbsp;&nbsp;&nbsp;?ps gr:hasCurrencyValue ?p .
&nbsp;&nbsp;&nbsp;&nbsp;?ps gr:hasCurrency ?c .
&nbsp;&nbsp;&nbsp;&nbsp;FILTER ( ( ( regex(?c, &quot;EUR&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; ?p &gt;&quot;10&quot;^^xsd:float &amp;&amp; ?p &lt;&quot;20&quot;^^xsd:float )
&nbsp;&nbsp;&nbsp;&nbsp;|| ( regex(?c, &quot;PLN&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; ?p &gt;&quot;40&quot;^^xsd:float &amp;&amp; ?p &lt;&quot;80&quot;^^xsd:float ) ) &amp;&amp; regex(?comment,”Sony”) &amp;&amp; regex(?region,”Śląsk”))
&nbsp;&nbsp;}
LIMIT 10
</code></pre></p>
<p>Jak widać zapytania w języku SPARQL są bardzo rozbudowane i do poprawnego działania wymagają dobrze zoptymalizowanych warunków uwzględniających opcjonalność występowania poszczególnych właściwości.<br />
Niewątpliwą zaletą tego języka jest jednak fakt, że za jego pomocą można w bardzo efektywny sposób przeszukać całą sieć www, przez co mamy pełny wgląd do ofert wszystkich witryn e-commerce w jednym miejscu, co pozwoli na wybór optymalnej oferty dla potencjalnego klienta&#8230;</p>
<p>Osoby, które nie łapią o co chodzi w strukturze zapytań przedstawionych powyżej zachęcam do zerknięcia na poniższe artykuły opublikowane wcześniej:</p>
<p><a href="http://semantictechnology.eu/2010/02/wstep-do-sparql-z-wykorzystaniem-rap-api-dla-php/">Wstęp do SPARQl z wykorzystaniem RAP API dla PHP</a><br />
<a href="http://semantictechnology.eu/2011/07/semantyczny-serwis-e-commerce-cz-1-podstawy-ontologii-good-relations/">Semantyczny serwis e-commerce (cz.1) – podstawy ontologii Good Relations</a><br />
<a href="http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2/">Good Relations w praktyce – semantyczny serwis e-commerce (cz.2)</a></p>
<div class="fb-like" data-href="http://semantictechnology.eu/2011/11/zapytania-sparql-cz-2-odpytywanie-serwisu-e-commerce" data-send="true" data-width="450" data-show-faces="true"></div>
]]></content:encoded>
			<wfw:commentRss>http://semantictechnology.eu/2011/11/zapytania-sparql-cz-2-odpytywanie-serwisu-e-commerce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Good Relations w praktyce &#8211; semantyczny serwis e-commerce (cz.2)</title>
		<link>http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2/</link>
		<comments>http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 00:17:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[e-Commerce]]></category>
		<category><![CDATA[Good Relations]]></category>
		<category><![CDATA[semantic web]]></category>

		<guid isPermaLink="false">http://semantictechnology.eu/?p=736</guid>
		<description><![CDATA[Jakiś czas temu w części pierwszej artykułu napisałem trochę o budowie sieciowej ontologii dla e-commerce &#8211; Good Relations. Szczerze powiedziawszy może wydać się on trochę nudny (widać zresztą po zainteresowaniu wg statystyk), no ale od czegoś trzeba zacząć i trochę wiedzy na temat budowy samej ontologii bez wątpienia trzeba posiadać. Pora więc na trochę praktyki. [...]]]></description>
			<content:encoded><![CDATA[<div class="zemanta-img" style="margin: 1em; display: block;"><img class="zemanta-img-configured alignleft" title="Shopping" src="http://farm4.static.flickr.com/3096/2329851504_4eab41b956_m.jpg" alt="Shopping" width="240" height="160" /></div>
<p>Jakiś czas temu w części pierwszej artykułu napisałem trochę o budowie sieciowej ontologii dla e-commerce &#8211; Good Relations. Szczerze powiedziawszy może wydać się on trochę nudny (widać zresztą po zainteresowaniu wg statystyk), no ale od czegoś trzeba zacząć i trochę wiedzy na temat budowy samej ontologii bez wątpienia trzeba posiadać. Pora więc na trochę praktyki. W artykule tym postaram się w prosty sposób opisać za pomocą ontologii <strong>Good Relations</strong> przykładowy serwis www sprzedający produkty. W efekcie nasz sklep firmowy będzie znacznie bardziej &#8222;<strong>search engine friendly</strong>&#8221; a nawet można by powiedzieć &#8222;<strong>semantic web friendly</strong>&#8222;&#8230;</p>
<p><span id="more-736"></span>Na wstępie trochę założeń co do naszego sklepu:</p>
<ul>
<li>serwis powinien zawierać podstawowe informacje co do naszej firmy takie jak adres, nazwa czy telefon kontaktowy</li>
<li>nasza firma posiada kilka sklepów na terenie całego kraju i informacje na ich temat będą umieszczone w serwisie</li>
<li>serwis przedstawiał będzie ofertę ogólną firmy dotycząca sprzedawanych produktów z branży elektronicznej</li>
</ul>
<p>Istnieje kilka sposobów na umieszczenie semantycznych danych w serwisie. Jak już pisałem nie raz w starszych artykułach, możemy wykorzystać składnię <strong>RDFa</strong> i mieścić semantyczne znaczniki bezpośrednio w kodzie strony HTML. Można też wykorzystać składnię <strong>RDF/XML</strong> lub <strong>N3/Turtle</strong> i zapisać te dane w oddzielnych plikach tekstowych. Dla pierwszej opcji plik powinien mieć rozszerzenie .rdf, a dla drugiej .n3. Zazwyczaj spotkać można nazwy plików takie jak semanticweb.rdf lub goodrelations.n3. W opisywanych przykładach będzie stosowana składnia RDFa.</p>
<p>Przed opisem jakiegoś elementu na stronie za pomocą semantycznych znaczników powinno umieścić się wszystkie przestrzenie nazw jakie będą używane. W tym celu na początku każdego bloku &lt;div&gt; zawierającego semantyczny opis powinno się je wyszczególnić w następujący sposób:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div xmlns=<span class="htmlAttributeValue">&quot;http://www.w3.org/1999/xhtml&quot;</span>
xmlns:rdf=<span class="htmlAttributeValue">&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;</span>
xmlns:rdfs=<span class="htmlAttributeValue">&quot;http://www.w3.org/2000/01/rdf-schema#&quot;</span>
xmlns:xsd=<span class="htmlAttributeValue">&quot;http://www.w3.org/2001/XMLSchema#&quot;</span>
xmlns:gr=<span class="htmlAttributeValue">&quot;http://purl.org/goodrelations/v1#&quot;</span>
xmlns:foaf=<span class="htmlAttributeValue">&quot;http://xmlns.com/foaf/0.1/&quot;</span>
xmlns:vcard=<span class="htmlAttributeValue">&quot;http://www.w3.org/2006/vcard/ns#&quot;</span>&gt;</span>
miejsce na semantyczny opis zawartości strony
<span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>Wszystkie dalsze przykłady będzie się traktować tak jakby były umieszczone w powyższym bloku &lt;div&gt;.</p>
<p>Do opisu informacji na temat firmy zostanie wykorzystana klasa <strong>BusinessEntity</strong> ontologii Good Relations oraz właściwości wchodzące w jej skład. Oprócz niej zostaną wykorzystane znaczniki <strong>vcard</strong> oraz <strong>foaf</strong>.</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:BusinessEntity&quot;</span> about&lt;strong&gt;</span>=<span class="htmlAttributeValue">&quot;<span class="htmlOtherTag">&lt;/strong&gt;</span>#company&quot;</span>&gt;
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;gr:legalName&quot;</span> content=<span class="htmlAttributeValue">&quot;Kowalski Enterprise&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;vcard:tel&quot;</span> content=<span class="htmlAttributeValue">&quot;+48 669311615&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;vcard:adr&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;vcard:Address&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;vcard:country-name&quot;</span> content=<span class="htmlAttributeValue">&quot;Polska&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;vcard:locality&quot;</span> content=<span class="htmlAttributeValue">&quot;Rybnik&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;vcard:postal-code&quot;</span> content=<span class="htmlAttributeValue">&quot;44-200&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;vcard:street-address&quot;</span> content=<span class="htmlAttributeValue">&quot;Rudzka 67&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;foaf:depiction&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://www.kowalskihomepage.pl/logo.jpg&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;foaf:page&quot;</span> resource=<span class="htmlAttributeValue">&quot;&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>W powyższym przykładzie zostały zapisane podstawowe informacje na temat firmy Kowalski Enterprise. Wykorzystaną właściwością klasy <strong>BusinessEntity</strong> jest <strong>gr:legalName</strong>.</p>
<p>Kolejnym krokiem tworzenia semantycznego serwisu www jest opis poszczególnych sklepów firmy znajdujących się w różnych miejscach kraju. Aby opisać ten fakt trzeba skorzystać z kolejnej klasy ontologii Good Relations jaką jest <strong>LocationOfSalesOrServiceProvisioning</strong>.</p>
<p>Cały blok informacji dotyczący pojedynczego sklepu firmy Kowalski Enterprise powinien znajdować się w następującym bloku:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:LocationOfSalesOrServiceProvisioning&quot;</span> about=<span class="htmlAttributeValue">&quot;#store&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p><em><br />
</em></p>
<p>W nim znajdują się informacje dotyczące nazwy sklepu i adresu, oraz godzin otwarcia w poszczególne dni tygodnia oraz weekendu (<strong>gr:hasOpeningHoursSpecification</strong>).</p>
<p><span style="text-decoration: underline;">Najważniejszy element opisu, który wiąże informacje dotyczące właśnie tego sklepu z firmą jest właściwość <strong>gr:hasPOS</strong>, która wskazuje na URI miejsca, w którym znajdują się informacje dotyczące firmy macierzystej</span>.</p>
<p>Fragment semantycznego opisu serwisu www dotyczący informacji na temat firmy nie jest duży i został on zaprezentowany w całości. Jako, że pełny fragment kodu potrzebnego do opisu informacji na temat poszczególnych sklepów jest zbyt rozbudowany zostaną zaprezentowane tylko jego najważniejsze fragmenty:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:LocationOfSalesOrServiceProvisioning&quot;</span> about=<span class="htmlAttributeValue">&quot;#store&quot;</span>&gt;</span>
...
<span class="htmlOtherTag">&lt;div rev=<span class="htmlAttributeValue">&quot;gr:hasPOS&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://www.kowalskienterprise.pl#company&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;rdfs:label&quot;</span> content=<span class="htmlAttributeValue">&quot;Kowalski Shop 1&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
…
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;vcard:adr&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;vcard:geo&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasOpeningHoursSpecification&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:OpeningHoursSpecification&quot;</span> about=<span class="htmlAttributeValue">&quot;#mon_fri&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasOpeningHoursSpecification&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:OpeningHoursSpecification&quot;</span> about=<span class="htmlAttributeValue">&quot;#sat&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasOpeningHoursSpecification&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:OpeningHoursSpecification&quot;</span> about=<span class="htmlAttributeValue">&quot;#sun&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>Do opisu oferty firmy Kowalski Enterprise wykorzystana zostanie klasa <strong>Offering</strong>. Zaprezentowany zostanie skrócony opis oferty w, której pojawia się opis jednego produktu firmy jakim jest konsola Sony Playstation 3 SLIM:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:Offering&quot;</span> about=<span class="htmlAttributeValue">&quot;#offering&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div rev=<span class="htmlAttributeValue">&quot;gr:offers&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://www.kowalskienterprise.pl#company&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;rdfs:label&quot;</span> content=<span class="htmlAttributeValue">&quot;Sony Playstation 3 SLIM&quot;</span> xml:lang=<span class="htmlAttributeValue">&quot;pl&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
…
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasBusinessFunction&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://purl.org/goodrelations/v1#Sell&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasPriceSpecification&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:UnitPriceSpecification&quot;</span>&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:acceptedPaymentMethods&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://purl.org/goodrelations/v1#PayPal&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
…
<span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>Za pomocą właściwoci <strong>gr:haspriceSpecification</strong> wiążemy dany produkt z klasą <strong>UnitPriceSpecification</strong>, w której można zamieścić dokładne informacje dotyczące ceny produkty oraz waluty w jakiej sprzedajemy produkt np.</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div typeof=<span class="htmlAttributeValue">&quot;gr:UnitPriceSpecification&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;gr:hasCurrency&quot;</span> content=<span class="htmlAttributeValue">&quot;EUR&quot;</span> datatype=<span class="htmlAttributeValue">&quot;xsd:string&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;div property=<span class="htmlAttributeValue">&quot;gr:hasCurrencyValue&quot;</span> content=<span class="htmlAttributeValue">&quot;300.00&quot;</span> datatype=<span class="htmlAttributeValue">&quot;xsd:float&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
<span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>Dzieki właściwości <strong>gr:acceptedPaymentMethods </strong>można określić wszystkie możliwe metody płatności za produkt. W wybranym fragmencie została zapisana tylko jedna forma płatności jaką jest PayPal. Gdyby zaistniała potrzeba odzwierciedlenia faktu, że firma oferuje usługę naprawy tegoż produktu wystarczy dodać następujący blok:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;div rel=<span class="htmlAttributeValue">&quot;gr:hasBusinessFunction&quot;</span> resource=<span class="htmlAttributeValue">&quot;http://purl.org/goodrelations/v1#Repair&quot;</span>&gt;</span><span class="htmlOtherTag">&lt;/div&gt;</span>
</pre>
<p>Good Relations posiada kilka właściwości funkcji biznesowych, które można dodać w opisie produktu. Niektóre z nich to:</p>
<ul>
<li>gr:ConstructionInstallation,</li>
<li>gr:Dispose,</li>
<li>gr:LeaseOut,</li>
<li>gr:Maintain,</li>
<li>gr:ProvideService,</li>
<li>gr:Repair,</li>
<li>gr:Sell,</li>
<li>gr:Buy</li>
</ul>
<p>W powyższych fragmentach kodu HTML i RDFa została zaprezentowana następująca struktura powiązań pomiędzy firmą, jej jednym sklepem oraz ofertą firmy dotycząca sprzedaży produktu:</p>
<div id="attachment_806" class="wp-caption aligncenter" style="width: 540px"><a href="http://semantictechnology.eu/wp-content/uploads/2011/11/semantic-e-commerce-cz2.jpg"><img class="size-full wp-image-806" title="semantic-e-commerce-cz2" src="http://semantictechnology.eu/wp-content/uploads/2011/11/semantic-e-commerce-cz2.jpg" alt="" width="530" height="223" /></a><p class="wp-caption-text">źródło: opracowanie własne</p></div>
<p>Całą ofertę sklepu należy opisać w podobny sposób jak pokazany powyżej. Gdy wszystkie dane, które chcemy opisać wykorzystując składnię RDFa zostaną zamieszczone należy się upewnić czy nagłówek DOCTYPE strony www wygląda następująco:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML+RDFa 1.0//EN&quot; &quot;http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd&quot;&gt;</span>
<span class="htmlOtherTag">&lt;html xmlns=<span class="htmlAttributeValue">&quot;http://www.w3.org/1999/xhtml&quot;</span> version=<span class="htmlAttributeValue">&quot;XHTML+RDFa 1.0&quot;</span> xml:lang=<span class="htmlAttributeValue">&quot;en&quot;</span>&gt;</span>
</pre>
<p>Nagłówek DOCTYPE XHTML+RDFa mówi robotom, że strona zawiera semantyczne dane w języku RDFa. Do opisu danych za pomocą elementów ontologii Good Relations można wykorzystać odpowiednie generatory, które przekształcają dane wprowadzane do zwykłego formularza w odpowiednią składnię RDFa gotową do umieszczenia na stronie www. Innym rozwiązaniem jest wybór systemów zarządzania treścią strony takich jak np. Drupal, czy typowych rozwiązań typu e-Commerce jakimi są np. Magento, Joomla/Virtuemart, osCommerce czy WordPress z odpowiednimi pluginami. Posiadają one odpowiednie generatory, które są wiele z tych czynności zautomatyzować.</p>
<p>W kolejnej części artykułu postaram się przedstawić parę zapytań w języku <strong>SPARQL</strong> jakie można wykonać na tak skonstruowanym opisie semantycznego serwisu www&#8230;</p>
<div class="fb-like" data-href="http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2" data-send="true" data-width="450" data-show-faces="true" data-colorscheme="dark"></div>
]]></content:encoded>
			<wfw:commentRss>http://semantictechnology.eu/2011/11/good-relations-w-praktyce-semantyczny-serwis-e-commerce-cz-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odpytywanie semantycznych zasobów z użyciem klas ARC</title>
		<link>http://semantictechnology.eu/2010/02/odpytywanie-semantycznych-zasobow-z-uzyciem-klas-arc/</link>
		<comments>http://semantictechnology.eu/2010/02/odpytywanie-semantycznych-zasobow-z-uzyciem-klas-arc/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 20:23:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[DBpedia]]></category>
		<category><![CDATA[Microformats]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RDFa]]></category>
		<category><![CDATA[SPARQL]]></category>

		<guid isPermaLink="false">http://semantictechnology.eu/?p=94</guid>
		<description><![CDATA[Od jakiegoś czasu dostępnych jest kilka, mniej lub bardziej popularnych narzędzi, za pomocą których można korzystać z dobrodziejstw semantic web. Większość języków programowania posiada na dzień dzisiejszy takowe. Jednym z nich jest ARC (RDF Classes for PHP). Narzędzie to posiada kilka bardzo użytecznych funkcji, za pomocą których w łatwy sposób możemy odpytywać zasoby opisane w [...]]]></description>
			<content:encoded><![CDATA[<p>Od jakiegoś czasu dostępnych jest kilka, mniej lub bardziej popularnych narzędzi, za pomocą których można korzystać z dobrodziejstw semantic web. Większość języków programowania posiada na dzień dzisiejszy takowe. Jednym z nich jest <strong>ARC</strong> (<em>RDF Classes for PHP</em>).<a href="http://semantictechnology.eu/wp-content/uploads/2010/02/arc_logo.gif"><img class="alignleft size-full wp-image-107" title="arc_logo" src="http://semantictechnology.eu/wp-content/uploads/2010/02/arc_logo.gif" alt="" width="105" height="70" /></a></p>
<p>Narzędzie to posiada kilka bardzo użytecznych funkcji, za pomocą których w łatwy sposób możemy odpytywać zasoby opisane w RDF. Klasy te posiadają parsery dla: RDF/XML, Turtle, SPARQL + SPOG, Legacy XML, HTML tag soup, RSS 2.0, Google Social Graph API JSON,  umożliwiają wykorzystanie SPARQL Endpoint w bardzo szybki i prosty sposób, posiadają możliwość odczytywanie mikroformatów ze stron www (DC, eRDF, microformats, OpenID, RDFa). Pełna funkcjonalność opisana jest w dokumentacji pod adresem arc.semsol.org.<br />
<span id="more-94"></span><br />
Pierwszym przykładowym zastosowaniem klas ARC jaki chce pokazać to zapytanie do serwisu DBPedia z wykorzystaniem SPARQL Endpoint. W ARC cały proces łączenia się z serwisem to parę linijek kodu:</p>
<pre class="php">
<span class="phpKeyword"><span class="phpKeyword">
include_once<span class="phpOperator">(</span></span></span><span class="phpString">'arc/ARC2<span class="phpOperator">.</span>php'</span><span class="phpOperator">)</span><span class="phpText">;</span>
$config <span class="phpOperator">=</span> <span class="phpFunction">array</span><span class="phpOperator">(</span>
<span class="phpString">'remote_store_endpoint'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> <span class="phpString">'http<span class="phpOperator">:</span><span class="phpComment">//dbpedia.org/sparql'</span>,
</span><span class="phpOperator">)</span><span class="phpText">;</span>
$store <span class="phpOperator">=</span> ARC2<span class="phpOperator">:</span><span class="phpOperator">:</span>getRemoteStore<span class="phpOperator">(</span>$config<span class="phpOperator">)</span><span class="phpText">;</span>
</pre>
<p>Zapytanie będzie brzmiało tak: &#8222;<em>Wyszukaj wszystkie nazwy państw (commonName), ich waluty (currency) z oznakowaniem (currencyCode), których oficjalny język (officialLanguages) to hiszpański.</em>&#8221;</p>
<pre class="php">
$query <span class="phpOperator">=</span> <span class="phpString">'
PREFIX countries<span class="phpOperator">:</span> <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//dbpedia.org/ontology/Country</span><span class="phpOperator">&gt;</span>
</span>
SELECT DISTINCT <span class="phpOperator">?</span>name <span class="phpOperator">?</span>currency <span class="phpOperator">?</span>code WHERE <span class="phpOperator">{</span>
<span class="phpOperator">?</span>b rdf<span class="phpOperator">:</span>type countries<span class="phpOperator">:</span> <span class="phpOperator">.</span>
<span class="phpOperator">?</span>b <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//dbpedia.org/property/officialLanguages</span><span class="phpOperator">&gt;</span> <span class="phpOperator">?</span>c <span class="phpOperator">.</span>
</span><span class="phpOperator">?</span>b <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//dbpedia.org/property/commonName</span><span class="phpOperator">&gt;</span> <span class="phpOperator">?</span>name <span class="phpOperator">.</span>
</span><span class="phpOperator">?</span>b <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//dbpedia.org/ontology/currency</span><span class="phpOperator">&gt;</span> <span class="phpOperator">?</span>currency <span class="phpOperator">.</span>
</span><span class="phpOperator">?</span>b <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//dbpedia.org/property/currencyCode</span><span class="phpOperator">&gt;</span> <span class="phpOperator">?</span>code
</span>FILTER<span class="phpOperator">(</span>regex<span class="phpOperator">(</span><span class="phpOperator">?</span>c, <span class="phpString">"Spanish"</span><span class="phpOperator">)</span><span class="phpOperator">)</span>
<span class="phpOperator">}</span>
'</span><span class="phpText">;</span>
$r <span class="phpOperator">=</span> <span class="phpString">'<span class="phpOperator">&lt;</span>table<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
<span class="phpKeyword">
if </span><span class="phpOperator">(</span>$rows <span class="phpOperator">=</span> $store<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>query<span class="phpOperator">(</span>$q, <span class="phpString">'rows'</span><span class="phpOperator">)</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
<span class="phpKeyword">
foreach </span><span class="phpOperator">(</span>$rows<span class="phpKeyword"> as </span>$row<span class="phpOperator">)</span> <span class="phpOperator">{</span>
$r <span class="phpOperator">.=</span> <span class="phpString">'<span class="phpOperator">&lt;</span>tr<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>td<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $row<span class="phpOperator">[</span><span class="phpString">'name'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/td<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>td<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $row<span class="phpOperator">[</span><span class="phpString">'currency'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/td<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>td<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $row<span class="phpOperator">[</span><span class="phpString">'code'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/td<span class="phpOperator">&gt;</span><span class="phpOperator">&lt;</span>/tr<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
<span class="phpOperator">}</span>
<span class="phpOperator">}</span>
$r<span class="phpOperator">.=</span><span class="phpString">'<span class="phpOperator">&lt;</span>/table<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
<span class="phpFunction">echo</span> $r <span class="phpOperator">?</span> $r  <span class="phpOperator">:</span> <span class="phpString">'nic nie znaleziono'</span><span class="phpText">;</span>
</pre>
<p>Otrzymany wynik wyglądał tak:</p>
<table>
<tbody>
<tr>
<td>Peru</td>
<td>[[Peruvian nuevo sol|Nuevo Sol]]</td>
<td>PEN</td>
</tr>
<tr>
<td>Costa Rica</td>
<td>[[Costa Rican colón]]</td>
<td>CRC</td>
</tr>
<tr>
<td>Easter Island</td>
<td>[[Chilean Peso|Peso]]</td>
<td>CLP</td>
</tr>
<tr>
<td>Chile</td>
<td>[[Chilean peso|Peso]]</td>
<td>CLP</td>
</tr>
<tr>
<td>Juan Fernández Islands</td>
<td>[[Chilean peso|Peso]]</td>
<td>CLP</td>
</tr>
<tr>
<td>Cuba</td>
<td>4217</td>
<td>CUC</td>
</tr>
<tr>
<td>Dominican Republic</td>
<td>[[Dominican peso|Peso]]</td>
<td>DOP</td>
</tr>
<tr>
<td>Honduras</td>
<td>[[Honduran lempira|Lempira]]</td>
<td>HNL</td>
</tr>
<tr>
<td>Western Sahara</td>
<td>[[Moroccan Dirham|Moroccan]] [[dirham]]</td>
<td>MAD</td>
</tr>
<tr>
<td>Nicaragua</td>
<td>[[Nicaraguan córdoba|Córdoba]]</td>
<td>NIO</td>
</tr>
<tr>
<td>Venezuela</td>
<td>4</td>
<td>VEF</td>
</tr>
<tr>
<td>Equatorial Guinea</td>
<td>[[Central African CFA franc]]</td>
<td>XAF</td>
</tr>
<tr>
<td>Spain</td>
<td>[[Euro]] ([[Euro sign|€]])</td>
<td>EUR</td>
</tr>
<tr>
<td>Puerto Rico</td>
<td>[[United States dollar]]</td>
<td>USD</td>
</tr>
<tr>
<td>Ecuador</td>
<td>[[United States dollar|U.S. dollar]]</td>
<td>USD</td>
</tr>
<tr>
<td>El Salvador</td>
<td>[[United States dollar|U.S. dollar]]</td>
<td>USD</td>
</tr>
<tr>
<td>Argentina</td>
<td>[[Argentine peso|Peso]]</td>
<td>ARS</td>
</tr>
<tr>
<td>Colombia</td>
<td>[[Colombian peso|Peso]]</td>
<td>COP</td>
</tr>
<tr>
<td>Bolivia</td>
<td>[[Bolivian boliviano|Boliviano]]</td>
<td>BOB</td>
</tr>
<tr>
<td>Uruguay</td>
<td>4217</td>
<td>UYU</td>
</tr>
</tbody>
</table>
<p>Drugim przykładem zastosowania tego narzędzia jest odczytywanie semantycznych znaczników ze stron www. ARC umożliwia odpytywanie pobranych danych po wcześniejszym &#8222;zamontowaniu&#8221; ich w lokalnej bazie danych użytkownika. Cały proces polega na zapisie tychże danych do specjalnie oznakowanych tabel (przez dodanie prefiksu). Pisząc zapytania SPARQL ARC przekształca je na zapytania odpowiednie dla relacyjncyh baz danych np. MySQL.</p>
<p>Prosta strona www z paroma semantycznymi znacznikami (DC i FOAF) mogłaby wyglądać tak:</p>
<pre class="html">
<span class="htmlOtherTag">&lt;?xml version=<span class="htmlAttributeValue">&quot;1.0&quot;</span> encoding=<span class="htmlAttributeValue">&quot;UTF-8&quot;</span>?&gt;</span>
<span class="htmlOtherTag">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML+RDFa 1.0//EN&quot;
&quot;http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd&quot;&gt;</span>
<span class="htmlOtherTag">&lt;html xmlns=<span class="htmlAttributeValue">&quot;http://www.w3.org/1999/xhtml&quot;</span>
xmlns:foaf=<span class="htmlAttributeValue">&quot;http://xmlns.com/foaf/0.1/&quot;</span>
xmlns:dc=<span class="htmlAttributeValue">&quot;http://purl.org/dc/elements/1.1/&quot;</span>
version=<span class="htmlAttributeValue">&quot;XHTML+RDFa 1.0&quot;</span> xml:lang=<span class="htmlAttributeValue">&quot;en&quot;</span>&gt;</span>
<span class="htmlOtherTag">&lt;head&gt;</span>
<span class="htmlOtherTag">&lt;title&gt;</span><span class="htmlOtherTag">&lt;/title&gt;</span>
<span class="htmlOtherTag">&lt;meta property=<span class="htmlAttributeValue">&quot;dc:creator&quot;</span> content=<span class="htmlAttributeValue">&quot;admin&quot;</span> /&gt;</span>
<span class="htmlOtherTag">&lt;/head&gt;</span>
<span class="htmlOtherTag">&lt;body&gt;</span>
<span class="htmlOtherTag">&lt;p&gt;</span>Mój nick to <span class="htmlOtherTag">&lt;span property=<span class="htmlAttributeValue">&quot;foaf:nick&quot;</span>&gt;</span>testowy_nick44<span class="htmlOtherTag">&lt;/span&gt;</span><span class="htmlOtherTag">&lt;br /&gt;</span>
Mój ulubiony gatunek filmu to
<span class="htmlOtherTag">&lt;span property=<span class="htmlAttributeValue">&quot;foaf:interest&quot;</span>&gt;</span>Sci-Fi<span class="htmlOtherTag">&lt;/span&gt;</span><span class="htmlOtherTag">&lt;br /&gt;</span>
Mój blog znajdziesz ppd adresem <span class="htmlOtherTag">&lt;span property=<span class="htmlAttributeValue">&quot;foaf:homepage&quot;</span>&gt;</span>semantictechnology.eu<span class="htmlOtherTag">&lt;/span&gt;</span>
<span class="htmlOtherTag">&lt;/p&gt;</span>
<span class="htmlOtherTag">&lt;/body&gt;</span>
<span class="htmlOtherTag">&lt;/html&gt;</span>
</pre>
<p>Skrypt w PHP odczytujący nick, stronę domową oraz zainteresowania wszystkich osób opisanych znacznikiem <em>foaf</em> z wykorzystaniem klas ARC mógłby wyglądać tak:</p>
<pre class="php">
$config <span class="phpOperator">=</span> <span class="phpFunction">array</span><span class="phpOperator">(</span>
<span class="phpString">'db_name'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> <span class="phpString">'arc'</span>,
<span class="phpString">'db_user'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> <span class="phpString">'root'</span>,
<span class="phpString">'db_pwd'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> <span class="phpString">'password'</span>,
<span class="phpString">'store_name'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> <span class="phpString">'arc_tables'</span>,
<span class="phpString">'max_errors'</span> <span class="phpOperator"><span class="phpOperator">=</span><span class="phpOperator">&gt;</span></span> 100,
<span class="phpOperator">)</span><span class="phpText">;</span>
$store <span class="phpOperator">=</span> ARC2<span class="phpOperator">:</span><span class="phpOperator">:</span>getStore<span class="phpOperator">(</span>$config<span class="phpOperator">)</span><span class="phpText">;</span>
<span class="phpKeyword">
if </span><span class="phpOperator">(</span><span class="phpOperator">!</span>$store<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>isSetUp<span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
$store<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>setUp<span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
<span class="phpOperator">}</span>
$store<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>query<span class="phpOperator">(</span><span class="phpString">'LOAD <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//www<span class="phpOperator">.</span>przykladowaatrona.pl/semantycznapodstrona.html</span><span class="phpOperator">&gt;</span>'</span><span class="phpOperator">)</span><span class="phpText">;</span>
</span>
$q <span class="phpOperator">=</span> <span class="phpString">'
PREFIX foaf<span class="phpOperator">:</span> <span class="phpOperator">&lt;</span>http<span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//xmlns<span class="phpOperator">.</span>com/foaf/<span class="phpNumber">0</span><span class="phpOperator">.</span><span class="phpNumber">1</span>/</span><span class="phpOperator">&gt;</span> <span class="phpOperator">.</span>
</span>SELECT <span class="phpOperator">?</span>nick <span class="phpOperator">?</span>interest <span class="phpOperator">?</span>homepage WHERE <span class="phpOperator">{</span>
<span class="phpOperator">?</span>p foaf<span class="phpOperator">:</span>homepage <span class="phpOperator">?</span>homepage <span class="phpText">;</span> foaf<span class="phpOperator">:</span>nick <span class="phpOperator">?</span>nick <span class="phpText">;</span> foaf<span class="phpOperator">:</span>interest <span class="phpOperator">?</span>interest
<span class="phpOperator">}</span>
'</span><span class="phpText">;</span>
$r <span class="phpOperator">=</span> <span class="phpString">''</span><span class="phpText">;</span>
<span class="phpKeyword">
if </span><span class="phpOperator">(</span>$rows <span class="phpOperator">=</span> $store<span class="phpOperator">-<span class="phpOperator">&gt;</span></span>query<span class="phpOperator">(</span>$q, <span class="phpString">'rows'</span><span class="phpOperator">)</span><span class="phpOperator">)</span> <span class="phpOperator">{</span>
<span class="phpKeyword">
foreach </span><span class="phpOperator">(</span>$rows<span class="phpKeyword"> as </span>$row<span class="phpOperator">)</span> <span class="phpOperator">{</span>
$r <span class="phpOperator">.=</span> <span class="phpString">'<span class="phpOperator">&lt;</span>li<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $row<span class="phpOperator">[</span><span class="phpString">'nick'</span><span class="phpOperator">]</span> <span class="phpOperator">.</span> <span class="phpString">'- '</span>.$row<span class="phpOperator">[</span><span class="phpString">'homepage'</span><span class="phpOperator">]</span>.<span class="phpString">' - '</span>.$row<span class="phpOperator">[</span><span class="phpString">'interest'</span><span class="phpOperator">]</span>.<span class="phpString">'<span class="phpOperator">&lt;</span>/li<span class="phpOperator">&gt;</span>'</span><span class="phpText">;</span>
<span class="phpOperator">}</span>
<span class="phpOperator">}</span>
<span class="phpFunction">echo</span> $r <span class="phpOperator">?</span> <span class="phpString">'<span class="phpOperator">&lt;</span>ul<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">.</span> $r <span class="phpOperator">.</span> <span class="phpString">'<span class="phpOperator">&lt;</span>/ul<span class="phpOperator">&gt;</span>'</span> <span class="phpOperator">:</span> <span class="phpString">'nic nie znaleziono'</span><span class="phpText">;</span>
</pre>
<p>Otrzymany wynik:</p>
<ul>
<li>testowy_nick44- semantictechnology.eu &#8211; Sci-Fi</li>
</ul>
<p>Przyglądając się stworzonym przez ARC tabelom w bazie danych widzimy, że jest ich 6. Opisane są w nich trójki s-p-o:</p>
<p><a href="http://semantictechnology.eu/wp-content/uploads/2010/02/arc_database.jpg"><img class="aligncenter size-full wp-image-136" title="arc_database" src="http://semantictechnology.eu/wp-content/uploads/2010/02/arc_database.jpg" alt="" width="906" height="233" /></a></p>
<p>To tylko niektóre z oferowanych możliwości klas ARC. Więcej można znaleźć w dokumentacji.</p>
]]></content:encoded>
			<wfw:commentRss>http://semantictechnology.eu/2010/02/odpytywanie-semantycznych-zasobow-z-uzyciem-klas-arc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wstęp do SPARQL z wykorzystaniem RAP API dla PHP</title>
		<link>http://semantictechnology.eu/2010/02/wstep-do-sparql-z-wykorzystaniem-rap-api-dla-php/</link>
		<comments>http://semantictechnology.eu/2010/02/wstep-do-sparql-z-wykorzystaniem-rap-api-dla-php/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 19:17:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RAP API]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[SPARQL]]></category>

		<guid isPermaLink="false">http://semantictechnology.eu/?p=33</guid>
		<description><![CDATA[Jedną z idei semantycznej sieci www jest opisywanie zasobów za pomocą skierowanych grafów RDF. Gdy mamy już owe grafy zapisane np. w plikach .rdf musimy mieć możliwość ich przeszukiwania wg. interesujących nas kryteriów. Językiem zapytań oraz protokołem dla plików RDF jest (uznany oficjalnie w 2008 roku przez W3C jako standard)  SPARQL (SPARQL Protocol And RDF [...]]]></description>
			<content:encoded><![CDATA[<div class="zemanta-img" style="margin: 1em; display: block;"></div>
<p>Jedną z idei semantycznej sieci www jest opisywanie zasobów za pomocą skierowanych grafów RDF. Gdy mamy już owe grafy zapisane np. w plikach .rdf musimy mieć możliwość ich przeszukiwania wg. interesujących nas kryteriów. Językiem zapytań oraz protokołem dla plików RDF jest (uznany oficjalnie w 2008 roku przez W3C jako standard)  <strong>SPARQL</strong> (<em>SPARQL Protocol And RDF Query Language</em> ) przypominający w swojej składni SQL.</p>
<p>SPARQL udostępnia cztery formy zapytań: <strong>SELECT</strong>, <strong>DESCRIBE</strong>, <strong>ASK</strong> i <strong>CONSTRUCT</strong>. Posiada podobnie jak SQL dodatkowe warunki typu <strong>ORDER BY</strong>, <strong>UNION</strong>, <strong>OPTIONAL</strong> itp. Zapytanie SELECT pozwala na zwrot szukanej wartości. CONSTRUCT umożliwia stworzenie grafu RDF na bazie zapytania. Chcąc dowiedzieć się czy dane zapytanie zwróci jakiś wynik można użyć polecenia ASK. Zapytanie DESCRIBE poda najmniejszy możliwy graf opisujący dany zasób.<br />
<span id="more-33"></span><br />
Po zapoznaniu się z jego specyfikacją na stronie <a title="Specyfikacja SPARQL" href="http://www.w3.org/TR/rdf-sparql-query/" target="_blank">w3.org/TR/rdf-sparql-query/</a> możemy zacząć działać. Prostym narzędziem, które możemy wykorzystać do wykonywania zapytań na stworzonym przez nas pliku .rdf jest<a title="RAP" href="http://www.seasr.org/wp-content/plugins/meandre/rdfapi-php/doc/index.html" target="_blank"><strong> RAP API</strong></a> dla PHP. RAP to biblioteki dla PHP umożliwiające przetwarzanie plików RDF.</p>
<p>Stworzony przeze mnie przykładowy plik  <em>semanticemployee.rdf</em> wygląda następująco:</p>
<pre class="xml">
<span class="xmlTag">&lt;?xml version=<span class="xmlString">&quot;1.0&quot;</span> encoding=<span class="xmlString">&quot;UTF-8&quot;</span>?&gt;</span>
&lt;rdf:RDF
xmlns:rdf=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/19</span><span class="xmlNumber">99/</span><span class="xmlNumber">02/</span><span class="xmlNumber">22-</span>rdf-syntax-ns#&quot;</span>
xmlns:rdfs=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">00/</span><span class="xmlNumber">01/</span>rdf-schema#&quot;</span>
xmlns:vcard=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">01/</span>vcard-rdf<span class="xmlNumber">/3.</span>0#&quot;</span>&gt;
<span class="xmlTag">&lt;rdf:Description rdf:about=<span class="xmlString">&quot;http://semanticemployee.eu/employee/BillParker/&quot;</span>&gt;</span>
<span class="xmlTag">&lt;vcard:EMAIL&gt;</span><span class="xmlText">bill.p@example.eu</span><span class="xmlTag">&lt;/vcard:EMAIL&gt;</span>
<span class="xmlTag">&lt;vcard:FN&gt;</span><span class="xmlText">Bill Parker</span><span class="xmlTag">&lt;/vcard:FN&gt;</span>
<span class="xmlTag">&lt;vcard:TEL&gt;</span><span class="xmlText"<span class="xmlNumber">>22</span><span class="xmlNumber">255</span><span class="xmlNumber">599</span>9<span class="xmlTag">&lt;/vcard:TEL&gt;</span>
<span class="xmlTag">&lt;/rdf:Description&gt;</span>
<span class="xmlTag">&lt;rdf:Description rdf:about=<span class="xmlString">&quot;http://semanticemployee.eu/employee/GeorgeSimpson/&quot;</span>&gt;</span>
<span class="xmlTag">&lt;vcard:EMAIL&gt;</span><span class="xmlText">george.s@example.eu</span><span class="xmlTag">&lt;/vcard:EMAIL&gt;</span>
<span class="xmlTag">&lt;vcard:FN&gt;</span><span class="xmlText">George Simpson</span><span class="xmlTag">&lt;/vcard:FN&gt;</span>
<span class="xmlTag">&lt;vcard:TEL&gt;</span><span class="xmlText"<span class="xmlNumber">>99</span><span class="xmlNumber">977</span><span class="xmlNumber">722</span>2<span class="xmlTag">&lt;/vcard:TEL&gt;</span>
<span class="xmlTag">&lt;/rdf:Description&gt;</span>
<span class="xmlTag">&lt;rdf:Description rdf:about=<span class="xmlString">&quot;http://semanticemployee.eu/employee/MonicaMurphy/&quot;</span>&gt;</span>
<span class="xmlTag">&lt;vcard:EMAIL&gt;</span><span class="xmlText">monica.m@example.eu</span><span class="xmlTag">&lt;/vcard:EMAIL&gt;</span>
<span class="xmlTag">&lt;vcard:FN&gt;</span><span class="xmlText">Monica Murphy</span><span class="xmlTag">&lt;/vcard:FN&gt;</span>
<span class="xmlTag">&lt;vcard:TEL&gt;</span><span class="xmlText"<span class="xmlNumber">>55</span><span class="xmlNumber">577</span><span class="xmlNumber">788</span>8<span class="xmlTag">&lt;/vcard:TEL&gt;</span>
<span class="xmlTag">&lt;/rdf:Description&gt;</span>
<span class="xmlTag">&lt;/rdf:RDF&gt;</span>
</pre>
<p>Pierwszym najprostszym zapytaniem na powyższym pliku będzie wyszukanie wszystkich imion pracowników. Wykorzystując język SPARQL możemy zapisać to tak:</p>
<pre class="xml">
PREFIX vcard <span class="xmlTag">&lt;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">01/</span>vcard-rdf<span class="xmlNumber">/3.</span>0#&gt;</span>
SELECT ?fullName
WHERE { ?x vcard:FN ?fullName }
</pre>
<p>Składnia zapytania jest dosyć prosta. Prefix oznacza wykorzystywaną przez nas przestrzeń nazw. W tym przykładzie wykorzystano przestrzeń nazw, która reprezentuje obiekty vCard w pliakch RDF. Wykorzystując RAP API, cały kod potrzebny do zwrócenia wyniku może wyglądać tak:</p>
<pre class="php">
<span class="phpScriptTag"><span class="phpOperator">&lt;</span><span class="phpOperator">?</span>php</span>
$employees <span class="phpOperator">=</span><span class="htmlText"> ModelFactory</span><span class="phpOperator">:</span><span class="phpOperator">:</span><span class="htmlText">getDefaultModel</span><span class="phpOperator">(</span><span class="phpOperator">)</span><span class="phpText">;</span>
$employees<span class="phpOperator">-<span class="phpOperator">&gt;</span></span><span class="htmlText">load</span><span class="phpOperator">(</span><span class="phpString">'semanticemployee.rdf'</span><span class="phpOperator">)</span><span class="phpText">;</span>
$querystring <span class="phpOperator">=</span> <span class="phpString">'
PREFIX vcard <span class="phpOperator">&lt;</span><span class="htmlText">http</span><span class="phpOperator">:</span><span class="phpComment"><span class="phpComment">//www<span class="phpOperator">.</span><span class="htmlText">w3</span><span class="phpOperator">.</span>org/2001/vcard-rdf/<span class="phpNumber">3</span><span class="phpOperator">.</span>0#</span><span class="phpOperator">&gt;</span>
</span><span class="htmlText">SELECT </span><span class="phpOperator">?</span>fullName
WHERE <span class="phpOperator">{</span> <span class="phpOperator">?</span><span class="htmlText">x vcard</span><span class="phpOperator">:</span><span class="htmlText">FN </span><span class="phpOperator">?</span><span class="htmlText">fullName </span><span class="phpOperator">}</span>'</span><span class="phpText">;</span>
<span class="phpFunction">echo</span> $employees<span class="phpOperator">-<span class="phpOperator">&gt;</span></span><span class="htmlText">sparqlQuery</span><span class="phpOperator">(</span>$querystring, <span class="phpString">'HTML'</span><span class="phpOperator">)</span><span class="phpText">;</span>
<span class="phpScriptTag"><span class="phpOperator">?</span><span class="phpOperator">&gt;</span></span>
</pre>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h1 id="main">SPARQL Query Language for RDF</h1>
</div>
<p>Jako wynik otrzymamy:</p>
<table border="1">
<caption>SPARQL result with 3 rows</caption>
<thead>
<th>?fullName</th>
</thead>
<tbody>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">Bill Parker</span></td>
</tr>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">George Simpson</span></td>
</tr>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">Monica Murphy</span></td>
</tr>
</tbody>
</table>
<p>Zwrócimy teraz wszystkie imiona i adresy e-mail posortowane malejąco zmieniając zapytanie na takie:</p>
<pre class="html">
PREFIX vcard <span class="htmlOtherTag">&lt;http://www.w3.org/2001/vcard-rdf/3.0#&gt;</span>
SELECT ?fullName ?mail
WHERE { ?x vcard:FN ?fullName . ?x vcard:EMAIL ?mail }
ORDER BY DESC(?fullName)
</pre>
<p>W efekcie otrzymamy:</p>
<table border="1">
<caption>SPARQL result with 3 rows</caption>
<thead>
<th>?fullName</th>
<th>?mail</th>
</thead>
<tbody>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">Monica Murphy</span></td>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">monica.m@example.eu</span></td>
</tr>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">George Simpson</span></td>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">george.s@example.eu</span></td>
</tr>
<tr>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">Bill Parker</span></td>
<td style="background-color: #e7e7ef;"><span style="color: #000000;">bill.p@example.eu</span></td>
</tr>
</tbody>
</table>
<p>I na koniec zapytanie typu CONSTRUCT. Chcemy otrzymać graf RDF taki, w którym znajdują są tylko imiona pracowników w kolejności rosnących numerów telefonów (zakładając, że są one w formie liczby takiej jak w przykładzie):</p>
<pre class="html">
PREFIX vcard <span class="htmlOtherTag">&lt;http://www.w3.org/2001/vcard-rdf/3.0#&gt;</span>
CONSTRUCT   { ? vcard:FN ?name }
WHERE       { ? vcard:FN ?name ; vcard:TEL ?tel . }
ORDER BY ?tel
</pre>
<p>Otrzymany graf wygląda tak:</p>
<pre class="xml">
<span class="xmlTag"><span class="xmlComment">&lt;!-- Generated by RdfSerializer.php from RDF RAP. # http://www.wiwiss.fu-berlin.de/suhl/bizer/rdfapi/index.html !--&gt;</span></span>
xmlns:rdf=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/19</span><span class="xmlNumber">99/</span><span class="xmlNumber">02/</span><span class="xmlNumber">22-</span>rdf-syntax-ns#&quot;</span>
xmlns:rdfs=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">00/</span><span class="xmlNumber">01/</span>rdf-schema#&quot;</span>
xmlns:xsd=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">01/</span>XMLSchema#&quot;</span>
xmlns:owl=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">02/</span><span class="xmlNumber">07/</span>owl#&quot;</span>
xmlns:dc=<span class="xmlString">&quot;http://purl.org/dc/elements<span class="xmlNumber">/1.</span>1/&quot;</span>
xmlns:dcterms=<span class="xmlString">&quot;http://purl.org/dc/terms/&quot;</span>
xmlns:vcard=<span class="xmlString">&quot;http://www.<span class="xmlNumber">w3.</span>org<span class="xmlNumber">/20</span><span class="xmlNumber">01/</span>vcard-rdf<span class="xmlNumber">/3.</span>0#&quot;</span>&gt;
Bill Parker
Monica Murphy
George Simpson
</pre>
]]></content:encoded>
			<wfw:commentRss>http://semantictechnology.eu/2010/02/wstep-do-sparql-z-wykorzystaniem-rap-api-dla-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

