Good Relations w praktyce – semantyczny serwis e-commerce (cz.2)
przez admin dnia lis.01, 2011, w Programowanie

Jakiś czas temu w części pierwszej artykułu napisałem trochę o budowie sieciowej ontologii dla e-commerce – 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 Good Relations przykładowy serwis www sprzedający produkty. W efekcie nasz sklep firmowy będzie znacznie bardziej „search engine friendly” a nawet można by powiedzieć „semantic web friendly„…
Na wstępie trochę założeń co do naszego sklepu:
- serwis powinien zawierać podstawowe informacje co do naszej firmy takie jak adres, nazwa czy telefon kontaktowy
- nasza firma posiada kilka sklepów na terenie całego kraju i informacje na ich temat będą umieszczone w serwisie
- serwis przedstawiał będzie ofertę ogólną firmy dotycząca sprzedawanych produktów z branży elektronicznej
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ę RDFa i mieścić semantyczne znaczniki bezpośrednio w kodzie strony HTML. Można też wykorzystać składnię RDF/XML lub N3/Turtle 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.
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 <div> zawierającego semantyczny opis powinno się je wyszczególnić w następujący sposób:
<div xmlns="http://www.w3.org/1999/xhtml" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:gr="http://purl.org/goodrelations/v1#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:vcard="http://www.w3.org/2006/vcard/ns#"> miejsce na semantyczny opis zawartości strony </div>
Wszystkie dalsze przykłady będzie się traktować tak jakby były umieszczone w powyższym bloku <div>.
Do opisu informacji na temat firmy zostanie wykorzystana klasa BusinessEntity ontologii Good Relations oraz właściwości wchodzące w jej skład. Oprócz niej zostaną wykorzystane znaczniki vcard oraz foaf.
<div typeof="gr:BusinessEntity" about<strong>="</strong>#company"> <div property="gr:legalName" content="Kowalski Enterprise"></div> <div property="vcard:tel" content="+48 669311615"></div> <div rel="vcard:adr"> <div typeof="vcard:Address"> <div property="vcard:country-name" content="Polska"></div> <div property="vcard:locality" content="Rybnik"></div> <div property="vcard:postal-code" content="44-200"></div> <div property="vcard:street-address" content="Rudzka 67"></div> </div> </div> <div rel="foaf:depiction" resource="http://www.kowalskihomepage.pl/logo.jpg"></div> <div rel="foaf:page" resource=""></div> </div>
W powyższym przykładzie zostały zapisane podstawowe informacje na temat firmy Kowalski Enterprise. Wykorzystaną właściwością klasy BusinessEntity jest gr:legalName.
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 LocationOfSalesOrServiceProvisioning.
Cały blok informacji dotyczący pojedynczego sklepu firmy Kowalski Enterprise powinien znajdować się w następującym bloku:
<div typeof="gr:LocationOfSalesOrServiceProvisioning" about="#store"></div>
W nim znajdują się informacje dotyczące nazwy sklepu i adresu, oraz godzin otwarcia w poszczególne dni tygodnia oraz weekendu (gr:hasOpeningHoursSpecification).
Najważniejszy element opisu, który wiąże informacje dotyczące właśnie tego sklepu z firmą jest właściwość gr:hasPOS, która wskazuje na URI miejsca, w którym znajdują się informacje dotyczące firmy macierzystej.
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:
<div typeof="gr:LocationOfSalesOrServiceProvisioning" about="#store"> ... <div rev="gr:hasPOS" resource="http://www.kowalskienterprise.pl#company"></div> <div property="rdfs:label" content="Kowalski Shop 1"></div> … <div rel="vcard:adr"> … </div> <div rel="vcard:geo"> … </div> <div rel="gr:hasOpeningHoursSpecification"> <div typeof="gr:OpeningHoursSpecification" about="#mon_fri"> … </div> </div> <div rel="gr:hasOpeningHoursSpecification"> <div typeof="gr:OpeningHoursSpecification" about="#sat"> … </div> </div> <div rel="gr:hasOpeningHoursSpecification"> <div typeof="gr:OpeningHoursSpecification" about="#sun"> … </div> </div> … </div>
Do opisu oferty firmy Kowalski Enterprise wykorzystana zostanie klasa Offering. Zaprezentowany zostanie skrócony opis oferty w, której pojawia się opis jednego produktu firmy jakim jest konsola Sony Playstation 3 SLIM:
<div typeof="gr:Offering" about="#offering"> <div rev="gr:offers" resource="http://www.kowalskienterprise.pl#company"></div> <div property="rdfs:label" content="Sony Playstation 3 SLIM" xml:lang="pl"></div> … <div rel="gr:hasBusinessFunction" resource="http://purl.org/goodrelations/v1#Sell"></div> <div rel="gr:hasPriceSpecification"> <div typeof="gr:UnitPriceSpecification"> … </div> </div> <div rel="gr:acceptedPaymentMethods" resource="http://purl.org/goodrelations/v1#PayPal"></div> … </div>
Za pomocą właściwoci gr:haspriceSpecification wiążemy dany produkt z klasą UnitPriceSpecification, w której można zamieścić dokładne informacje dotyczące ceny produkty oraz waluty w jakiej sprzedajemy produkt np.
<div typeof="gr:UnitPriceSpecification"> <div property="gr:hasCurrency" content="EUR" datatype="xsd:string"></div> <div property="gr:hasCurrencyValue" content="300.00" datatype="xsd:float"></div> </div>
Dzieki właściwości gr:acceptedPaymentMethods 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:
<div rel="gr:hasBusinessFunction" resource="http://purl.org/goodrelations/v1#Repair"></div>
Good Relations posiada kilka właściwości funkcji biznesowych, które można dodać w opisie produktu. Niektóre z nich to:
- gr:ConstructionInstallation,
- gr:Dispose,
- gr:LeaseOut,
- gr:Maintain,
- gr:ProvideService,
- gr:Repair,
- gr:Sell,
- gr:Buy
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:
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:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" version="XHTML+RDFa 1.0" xml:lang="en">
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ć.
W kolejnej części artykułu postaram się przedstawić parę zapytań w języku SPARQL jakie można wykonać na tak skonstruowanym opisie semantycznego serwisu www…
