Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:miw:miw08_ard_rdf [2008/04/08 11:04] miw |
pl:miw:miw08_ard_rdf [2008/09/17 10:18] miw |
Zapis ARD przy pomocy RDF w XSLT | Zapis ARD przy pomocy RDF w XSLT |
| |
====== Spotkania ====== | Historia [[pl:miw:miw08_ard_rdf:spotkania|spotkań]]. |
===== 08.03.04 ===== | |
===== 08.03.18 ===== | |
* repr atrybutów dla reguł RIF/OWL/RDF | |
| |
| |
| |
| |
| |
| |
====== Projekt ====== | ====== Projekt ====== |
jak sensownie repr. ard w rdf? | |
| |
| |
| |
| |
===== RDF ===== | |
| |
**RDF** (Resource Description Framework) jest podstawowym językiem używanym do zapisu informacji w Sieci Semantycznej i przeznaczonym do przetwarzania maszynowego. W dosłownym tłumaczeniu jest środowiskiem do opisu zasobów (jako zasób rozumiemy: dowolny obiekt znajdujący się w sieci, pojęcia abstrakcyjne, relacje i obiekty fizyczne). | |
Do opisu zasobów używa się tzw. stwierdzeń (ang. statements), które składają się z: | |
* Podmiotu – opisywany zasób. | |
* Orzeczenia (predykatu) – nazwa cechy lub relacji dotyczącej opisywanego podmiotu. | |
* Obiektu – inny zasób lub stała wartość określona mianem literału. | |
| |
| |
Sposób przedstawiania atrybutów w [[http://www.w3.org/TR/rdf-primer/|RDF]]: | |
| |
< opisywany_zasob > < nazwa_atrybutu > „wartosc_atrybutu”. | |
| |
**Przykład opisu w RDF pewnego „zasobu”:** | |
| |
Zwykłe zdanie: | |
| |
Janek jest twórcą dokumentu http://www.dokumenty.org/dokument1 | |
| |
Zdanie RDF: | |
| |
http://www.dokumenty.org/dokument1 posiada własność twórca której wartością jest Janek | |
| |
Właściwa forma RDF (musi być zakonczona kropką): | |
| |
<http://www.dokumenty.org/dokument1> <http://purl.org/dc/elements/1.1/creator> „Janek”. | |
| |
Graf RDF: | |
| |
{{:pl:miw:rdf.png|:pl:miw:rdf.png}} | |
| |
Styl XML: | |
| ===== 1. RIF(Rule Interchange Format) ===== |
| |
| RIF jest stworzonym przez W3C [[http://www.w3.org/|(Word Wide Web Consorcium)]] formatem reguł pozwalających na ich wymianę dla różnych języków reguł w sieciach semantycznych (RDF, OWL). Format RIF jest ciągle w fazie rozwoju, jedyne dostępne dokumenty są to szkice specyfikacji poszczególnych modułów (Working Draft). Do rozwijanych dokumentów należą m.in. [[http://www.w3.org/2005/rules/wg/draft/rif-fld/|RIF Framework for Logic Dialects ]] oraz [[http://www.w3.org/2005/rules/wg/draft/rif-bld/|RIF Basic Logic Dialect]] |
| |
| Dokładny opis specyfikacji RIF można znaleźć w projekcie [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_rif|XTT_RIF]]. Z punktu widzenia projektu, jest wiedza jak zapisywać typowe dla reguł elementy tj: |
| |
| * wartosc logiczna: np: B |
<code xml> | <code xml> |
<?xml version="1.0"?> | <Var> B </Var> |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | |
<rdf:Description rdf : about="subject"> | |
<predicate>Object</predicate> | |
</rdf:Description> | |
</rdf:RDF> | |
</code> | </code> |
Nasz przykład zapisany w XML: | |
| * stałe argumenty: np: 300 |
<code xml> | <code xml> |
<?xml version="1.0"?> | <arg><Const type="rds:long"> 300 </Const></arg> |
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
xmlns:DC="http://purl.org/dc/elements/1.1/"> | |
<rdf:Description rdf : about="http://www.dokumenty.org/dokument1"> | |
<DC:creator resource = "http://www.tworcy.org/janek"> | |
</rdf:Description> | |
</rdf : RDF> | |
</code> | </code> |
Użyty jest tu predykat pochodzący z “biblioteki” Dublin Core (słownictwo zdefiniowane do opisu metadanych różnych dokumentów - w szczególności bibliotecznych: daty utworzenia, autora itp.). Jest to oznaczone w korzeniu dokumentu (którym jest zawsze znacznik rdf:RDF). Podmioty definiujemy znacznikiem rdf:Description z atrybutem rdf:about zawierającym URI zasobu. Zdania opisujące ten podmiot są zapisywane jako węzły potomne. Obiekty, które są jednocześnie zasobami zapisujemy w postaci węzła skróconego z URI tego zasobu umieszczonym w atrybucie rdf:resource. | |
| |
| * suma: n+1 |
| |
| <code xml> |
| <Uniterm> |
| <op><Const type="rif:iri"> op:numeric-add </Const></op> |
| <arg><Const type=""> 1 </Const></arg> |
| <arg><Var> n </Var></arg> |
| </Uniterm> |
| </code> |
| |
| * różnica: n-1 |
| |
| <code xml> |
| <Uniterm> |
| <op><Const type="rif:iri"> op:numeric-subtract </Const></op> |
| <arg><Const type=""> 1 </Const></arg> |
| <arg><Var> n </Var></arg> |
| </Uniterm> |
| </code> |
| |
| * równość: (wyr_1) = (wartosc) |
| |
| <code xml> |
| <Equal> |
| <arg> wyr_1 </arg> |
| <arg> wartosc </arg> |
| </Equal> |
| </code> |
| |
| * nierówność: n > 0 |
| |
| <code xml> |
| <Uniterm> |
| <op><Const type="rif:iri"> op:numeric-greater-than </Const></op> |
| <arg><Var> n </Var></arg> |
| <arg><Const type="xsd:decimal"> 0 </Const></arg> |
| </Uniterm> |
| </code> |
| |
| * nierówność: n <= 1 |
| |
| <code xml> |
| <Uniterm> |
| <op><Const type="rif:iri"> op:numeric-less-or-equal-than </Const></op> |
| <arg><Var> n </Var></arg> |
| <arg><Const type="xsd:decimal"> 0 </Const></arg> |
| </Uniterm> |
| </code> |
| |
| * suma logiczna : (wyr_1) and (wyr_2) |
| |
| <code xml> |
| <And> |
| <formula> |
| (wyr_1) |
| </formula> |
| <formula> |
| (wyr_2) |
| </formula> |
| </And> |
| </code> |
| |
| * warunek if : (conclusion) if (conditions) |
| |
| <code xml> |
| <Implies> |
| <if> |
| (conditions) |
| </if> |
| <then> |
| (conclusion) |
| </then> |
| </Implies> |
| </code> |
| |
| Teraz, na podstawie powyższej wiedzy, możemy spróbować zapisać za pomocą RIF przykład: |
| <code xml> |
| Rule: 1 |
| if the day is Monday |
| or the day is Tuesday or the day is Wednesday |
| or the day is Thursday or the day is Friday |
| then today is a workday |
| </code> |
| |
| Wygląda on następująco: |
| <code xml> |
| <?xml version="1.0" encoding="UTF-8"?> |
| <Group xmlns="http://www.w3.org/2007/rif#"> |
| <sentence> |
| <Implies> |
| <if> |
| <Or> |
| <formula> |
| <Equal> |
| <side><Var>dayofweek</Var></side> |
| <side><Const type="xsd:string">Monday</Const></side> |
| </Equal> |
| </formula> |
| <formula> |
| <Equal> |
| <side><Var>dayofweek</Var></side> |
| <side><Const type="xsd:string">Tuesday</Const></side> |
| </Equal> |
| </formula> |
| <formula> |
| <Equal> |
| <side><Var>dayofweek</Var></side> |
| <side><Const type="xsd:string">Wednesday</Const></side> |
| </Equal> |
| </formula> |
| <formula> |
| <Equal> |
| <side><Var>dayofweek</Var></side> |
| <side><Const type="xsd:string">Thursday</Const></side> |
| </Equal> |
| </formula> |
| <formula> |
| <Equal> |
| <side><Var>dayofweek</Var></side> |
| <side><Const type="xsd:string">Friday</Const></side> |
| </Equal> |
| </formula> |
| </Or> |
| </if> |
| <then> |
| <Atom> |
| <op><Const type="rif:iri">thrm:is-workday</Const></op> |
| <arg><Var>dayofweek</Var></arg> |
| </Atom> |
| </then> |
| </Implies> |
| </sentence> |
| </Group> |
| </code> |
| |
| W analogiczny sposób możemy zapisać większość reguł. Przykładem może być tu całość [[https://ai.ia.agh.edu.pl/wiki/hekate:hekate_case_thermostat|HeKatE Case Thermostat]] którego reguły przedstawione w RIF wyglądają nastepująco: [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_rif:thermostat|therm in RIF]]. |
| |
| |
| ===== RDF===== |
| **Resource Description Framework (RDF)** jest podstawowym językiem |
| używanym do zapisu informacji w Sieci Semantycznej i przeznaczonym do |
| przetwarzania maszynowego. Każdy dokument RDF może być zakodowany |
| w postaci dokumentu XML, więc istnieje możliwość łatwej jego wizualizacji. |
| |
| W dosłownym tłumaczeniu RDF jest środowiskiem do opisu zasobów. |
| Zacząć trzeba więc od wyjaśnienia co jest rozumiane przez jego twórców pod |
| pojęciem zasobu. Otóż jako zasób można rozumieć nie tylko dowolny obiekt |
| znajdujący się w sieci ale również pojęcia abstrakcyjne, relacje i obiekty |
| fizyczne. Zasoby są w RDF reprezentowane przez wspomniane powyżej zunifikowane |
| identyfikatory zasobów (ang. Uniform Resource Identifier, URI). |
| URI jest pojęciem szerszym niż popularnie używane identyfikatory lokalizacji |
| zasobów (ang. Uniform Resource Locator, URL). URL opisuje zasób, który |
| musi być fizycznie dostępny w Internecie (jak strona WWW, plik na serwerze FTP) i jest szczególnym przypadkiem URI. URI może opisywać dowolny |
| obiekt, niezależnie od tego, czy znajduje się on w Internecie czy nie. Przykładowo |
| przy pomocy URI możemy reprezentować osobę przez nadanie jej |
| identyfikatora URI będącego jej adresem e-mail, adresem jej domowej strony |
| WWW lub innym identyfikatorem nadanym przez pewną organizację |
| pozwalającym w sposób jednoznaczny zidentyfikować daną osobę. |
| |
| Do opisu zasobów używa się tzw. stwierdzeń (ang. statements). Często |
| zamiennie z terminami zdanie i stwierdzenie używane jest jeszcze określenie |
| trójka (ang. triple). To ostatnie określenie wynika z faktu, że każde stwierdzenie |
| w RDF ma strukturę podobną do prostego zdania w języku naturalnym |
| i składa się z trzech elementów: |
| - **Podmiotu** (//ang. subject//). Podmiotem jest opisywany zasób reprezentowany przez URI. |
| - **Orzeczenia** (predykatu) (//ang. predicate//). Orzeczenie jest nazwą cechy lub relacji dotyczącej opisywanego podmiotu i podobnie jak podmiot jest reprezentowane przez URI. |
| - **Obiektu** (//ang. object//). Obiektem może być inny zasób (reprezentowanyprzez URI) lub stała wartość określana mianem literału (//ang. literal// ). |
| Najczęściej mamy do czynienia z jedną z dwóch sytuacji - opisujemy |
| relację między dwoma zasobami (wtedy obiektem jest URI reprezentujące zasób) |
| lub mówimy, że podmiot ma jakąś cechę o zadanej wartości |
| (wtedy używamy literału). Literał reprezentować może dowolną wartość |
| o ile daje się ona zapisać w postaci ciągu znaków. W RDF literałami mogą być tylko obiekty, nie jest możliwe ich użycie w charakterze |
| podmiotu czy orzeczenia.Każde zdanie można uważać za etykietowany graf skierowany. |
| |
| |
| {{:pl:miw:1.gif|:pl:miw:1.gif}} |
| |
| **Rys.1 Graf przedstawiajacy dwa zdania RDF.** |
| |
| Podmiot i obiekt są węzłami takiego grafu, natomiast orzeczenie jest reprezentowane jako krawędź skierowana od węzła podmiotu do węzła obiektu i |
| etykietowana przy pomocy URI orzeczenia. Przy rysowaniu grafów wizualizujących dane zapisane w RDF przyjęło się używanie owali do oznaczania |
| węzłów, które są zasobami (są reprezentowane przez URI). Obiekty będące literałami są natomiast reprezentowane przez prostokąty. |
| |
| [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_ard_rdf:rdf:rdfexample|Bardziej rozbudowany przykład zapisu w RDF]] |
| |
**Użycie faktów: | **Użycie faktów: |
| |
| |
Przykład pewnego faktu reprezentowanego w RDF /N3 (notacja3 - http://en.wikipedia.org/wiki/Notation_3) jako | Przykład pewnego faktu reprezentowanego w RDF /N3 jako |
| |
ex:subj ex:pred [ rdf:type rdf:List ; | <code xml> |
| ex:subj ex:pred [ rdf:type rdf:List ; |
rdf:first ex:val2 ; | rdf:first ex:val2 ; |
rdf:rest [ rdf:type rdf:List ; | rdf:rest [ rdf:type rdf:List ; |
: | : |
... rdf:rest rdf:nil ]]] . | ... rdf:rest rdf:nil ]]] . |
| </code> |
| |
Resource który reprezentuje ten fakt jest konstruowany jak pokazano w tym przykładzie RDF/N3: | Resource który reprezentuje ten fakt jest konstruowany jak pokazano w tym przykładzie RDF/N3: |
| |
[ rdf:type rul:Fact ; | <code xml> |
rul:pred ex:pred ; | [ rdf:type rul:Fact ; |
rul:args [ rdf:type rdf:List ; | rul:pred ex:pred ; |
rdf:first ex:subj ; | rul:args [ rdf:type rdf:List ; |
rdf:rest _:genid1 ] ] . | rdf:first ex:subj ; |
| rdf:rest _:genid1 ] ] . |
| </code> |
| |
gdzie _:genid1 jest identyfikatorem reprezentującym „ogon” listy argumentów predykatu | gdzie _:genid1 jest identyfikatorem reprezentującym „ogon” listy argumentów predykatu |
Afact1 & Afact2 & ... -> Cfact1 & Cfact2 & ... | Afact1 & Afact2 & ... -> Cfact1 & Cfact2 & ... |
| |
jest reprezentowana w RDF (używając notacji3 (N3 - http://en.wikipedia.org/wiki/Notation_3)) jako: | jest reprezentowana w RDF, używając notacji N3, jako: |
| <code xml> |
| @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . |
| @prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . |
| @prefix ex: <http://example.org/#> . |
| |
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | |
@prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . | |
@prefix ex: <http://example.org/#> . | |
[ rdf:type rul:Rule ; | [ rdf:type rul:Rule ; |
rul:from Afact1 ; | rul:from Afact1 ; |
rul:infer Cfact2 ; | rul:infer Cfact2 ; |
... ] . | ... ] . |
| </code> |
Taka reprezentacja reguł wprowadza pewne nowe identyfikatory zasobów, powiązanych tutaj z przestrzenią nazw z prefixem rul: która wskazuje na przestrzeń nazw URI | Taka reprezentacja reguł wprowadza pewne nowe identyfikatory zasobów, powiązanych tutaj z przestrzenią nazw z prefixem rul: która wskazuje na przestrzeń nazw URI |
<http://id.mimesweeper.com/RDFExpert/V1.0/ess#>: | <http://id.mimesweeper.com/RDFExpert/V1.0/ess#>: |
| |
była by reprezentowana w RDF/N3 jako: | była by reprezentowana w RDF/N3 jako: |
| <code xml> |
| @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . |
| @prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . |
| @prefix ex: <http://example.org/#> . |
| |
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | |
@prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . | |
@prefix ex: <http://example.org/#> . | |
[ rdf:type rul:Rule ; | [ rdf:type rul:Rule ; |
rul:from _:genid1 ; | rul:from _:genid1 ; |
rul:infer _:genid3 ; | rul:infer _:genid3 ; |
rul:infer _:genid4 ] | rul:infer _:genid4 ] |
| </code> |
gdzie: genid1, genid2, genid3, genid4 są identyfikatorami reprezentującymi „ogon” listy argumentów predykatu np. genid2 może być opisany jako: | gdzie: genid1, genid2, genid3, genid4 są identyfikatorami reprezentującymi „ogon” listy argumentów predykatu np. genid2 może być opisany jako: |
| <code xml> |
_:genid2 rdf:type rul:Fact ; | _:genid2 rdf:type rul:Fact ; |
rul:pred ex:a2 ; | rul:pred ex:a2 ; |
rul:args [ rdf:type rdf:List ; | rul:args [ rdf:type rdf:List ; |
rdf:first ex:a2s ; | rdf:first ex:a2s ; |
rdf:rest [ rdf:type rdf:List ; | rdf:rest [ rdf:type rdf:List ; |
rdf:first ex:a2v2 ; | rdf:first ex:a2v2 ; |
rdf:rest rdf:nil ]] . | rdf:rest rdf:nil ]] . |
| </code> |
**Zmienne | **Zmienne |
** | ** |
parents( ?c, ?f, ?g ) -> grandparents( ?a, ?d, ?e, ?f, ?g ) | parents( ?c, ?f, ?g ) -> grandparents( ?a, ?d, ?e, ?f, ?g ) |
| |
Moze być wywołana dla zbiorów faktów które jednocześnie pasują do reguły przodka (antecedents); dla kazdego zbioru faktów, zmienne będą związane z innymi wartościami. | Moze być wywołana dla zbiorów faktów ,które jednocześnie pasują do reguły przodka (antecedents); dla kazdego zbioru faktów, zmienne będą związane z innymi wartościami. |
| |
Zmienne są reprezentowane przez zasób typu rul:Var, oraz posiadają rdfs:label własność która jest nazwą zmiennej. Tak oto fakt: | Zmienne są reprezentowane przez zasób typu rul:Var, oraz posiadają rdfs:label własność która jest nazwą zmiennej. Tak oto fakt: |
| |
może być reprezentowany w RDF/N3 jako: | może być reprezentowany w RDF/N3 jako: |
| <code xml> |
| @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . |
| @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . |
| @prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . |
| @prefix ex: <http://example.org/#> . |
| |
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . | _:genid1 ex:Parents [ rdf:type rdf:List ; |
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . | rdf:first _:genid2 ; |
@prefix rul: <http://id.ninebynine.org/RDFRules/1.0/> . | rdf:rest [ rdf:type rdf:List ; |
@prefix ex: <http://example.org/#> . | rdf:first _:genid3 ; |
_:genid1 ex:Parents [ rdf:type rdf:List ; | rdf:rest rdf:nil ] ] . |
rdf:first _:genid2 ; | _:genid1 rdf:type rul:Var ; |
rdf:rest [ rdf:type rdf:List ; | |
rdf:first _:genid3 ; | |
rdf:rest rdf:nil ] ] . | |
_:genid1 rdf:type rul:Var ; | |
rdfs:label "?a" . | rdfs:label "?a" . |
_:genid2 rdf:type rul:Var ; | _:genid2 rdf:type rul:Var ; |
rdfs:label "?b" . | rdfs:label "?b" . |
_:genid3 rdf:type rul:Var ; | _:genid3 rdf:type rul:Var ; |
rdfs:label "?c" . | rdfs:label "?c" . |
| </code> |
| |
Linki: | Linki: |
| |
[[http://www.ninebynine.org/RDFNotes/RDFFactsAndRules.html#xtocid-7560072| Representing Facts and Rules in RDF]] | [[http://www.ninebynine.org/RDFNotes/RDFFactsAndRules.html#xtocid-7560072| Representing Facts and Rules in RDF]] |
| |
[[http://agentlab.swps.edu.pl/agent_papers/Gasiorowski_MS_2006.pdf]] | |
| |
| |
| |
===== RIF ===== | |
| |
**RIF**(Rule Interchange Format) jest stworzonym przez W3C (Word Wide Web Consorcium) formatem reguł pozwalających na ich wymianę dla różnych języków reguł w sieciach semantycznych (RDF, OWL). (def: http://www.webopedia.com/TERM/R/Rule_Interchange_Format.html) | |
| |
[[http://www.w3.org/TR/rif-bld/|Dokumentacja RIF]] przedstawia dwa rodzaje składni. Są to tzw: | |
* Presentation syntax – Używana w formalnych definicjach, szczególnie dla semantyki. | |
* XML syntax - Jest to tzw. XML serialization składni prezentacji. Kluczowe cechy tej składni wywodzą się ze składni prezentacji, lecz niektóre aspekty związane z wymianą reguł nie mają swoich odpowiedników w presentation syntax. | |
| |
**Atrybut** to parametr zawierający dodatkowe informacje o elemencie struktury logicznej identyfikowanym przez dany znacznik. | |
| |
Sposób przedstawiania atrybutów w [[http://www.w3.org/TR/rif-bld/|Presentation syntax]] : | |
| |
nazwa_atrybutu->wartość_atrybutu^^type | |
| |
Sposób przedstawiania atrybutów w [[http://www.w3.org/TR/rif-bld/|XML syntax]]: | |
| |
<slot><Const>nazwa_atrybutu</Const><Var type=””>wartość_atrybutu</Var></slot> | |
| |
| |
**Przykład:** | |
* Presentation syntax | |
| |
author^^rif:local -> ?Author | |
price^^rif:local -> 49^^xsd:integer | |
| |
* XML syntax | |
| |
| ===== OWL - Web Ontology Language ===== |
| |
| OWL jest językiem ze składnią opartą na XML, a semantyką opartą na tzw. logice deskrypcyjnej (ang. description logics). Stanowi on rozszerzenie [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_hml_rules:rdf|RDF (ang. Resource Description Framework)]]. Służy do reprezentacji i przetwarzania danych w sieci WWW. OWL umożliwia opisywanie danych w postaci ontologii i budowanie w ten sposób tzw. Semantycznego Internetu. OWL posiada trzy podjęzyki o wzrastającej ekspresyjności: OWL Lite, OWL DL, and OWL Full. Zapis w języku OWL składa się z definicji ontologicznych metadanych (container), definicji |
| relacji binarnych, pojęć, przykładów pojęć oraz aksjomatów definiujących omówione dodatkowe |
| właściwości pojęć i relacji. |
| |
| Zasadnicza część ontologii składa sie z definicji klas, relacji oraz ich przykładów. Przykładem prostej definicji pojęcia (klasy) jest następująco zdefiniowany termin ‘giraffe’: |
| <code xml> |
| <owl:Class rdf:ID="giraffe"/> |
| </code> |
| Z przytoczonej definicji wynika, że zbiór bytów będących przykładami pojęcia o identyfikatorze ‘giraffe’ jest podzbiorem predefiniowanego uniwersum bytów o nazwie ‘thing’. Za pomocą atrybutu rdf:about można wprowadzić rozszerzenia do istniejących definicji: |
| <code xml> |
| <owl:Class rdf:about="giraffe"> |
| <rdfs:subClassOf rdf:resource="Animal"/> |
| </owl:Class> |
| </code> |
| Powyższe związki można wyrazić jednostopniowo za pomocą następującej definicji, która dodatkowo zawiera etykietę umożliwiającą nazwanie definiowanej klasy bytów po polsku: |
| <code xml> |
| <owl:Class rdf:ID="giraffe"> |
| <rdfs:subClassOf rdf:resource="Animal"/> |
| <rdfs:label xml:lang="pl">żyrafa</rdfs:label> |
| </owl:Class> |
| </code> |
| Załóżmy, że ‘Zeta’ jest imieniem pewnej żyrafy. W sensie ontologicznym, ‘Zeta’ jest przykładem pojęcia ‘giraffe’, o czym orzeka następujące zdanie: |
| <code xml> |
| <giraffe rdf:ID="Zeta"/> |
| </code> |
| W języku OWL występują dwie kategorie relacji binarnych: zachodzących pomiędzy elementami klas (tzw. ObjectProperty) oraz definiujących związki pomiędzy elementami klas i danymi innych typów (DatatypeProperty - wydaje się, że te drugie zręczniej byłoby traktować jako atrybuty klas).Przykładem relacji definiującej wartość atrybutu “wiek” pewnego typu obiektów jest BE_IN_STATE/age, definiowana jako relacja kategorii DatatypeProperty, której zakresem są liczby całkowite nieujemne zdefiniowane jako typ w schemacie XML: |
| <code xml> |
| <owl:DatatypeProperty rdf:ID="BE_IN_STATE/age"> |
| <rdfs:range rdf:resource="&xsd;NonNegativeInteger"/> |
| </owl:DatatypeProperty> |
| </code> |
| Ciekawym mechanizmem, wynikających ze stosowania logik deskrypcyjnych, jest możliwość tworzenia klas poprzez nakładanie więzów na relacje. Na przykład, można zdefiniować klasę zawierającą wyłącznie (AllValuesFrom) lub również (SomeValuesFrom) elementy będące częściami wskazanych obiektów. Ta nowa klasa powstanie poprzez ograniczenie zakresu relacji “posiadania całości”. Szczególnym rodzajem więzu jest hasValue umożliwiający tworzenie zabioru elementów mających pewną określoną, pojedynczą wartość jako zakres relacji - na przykład słonie, poza tym, że są roślinożercami, są także zwierzętami o szarym kolorze skóry (indiwiduum określające kolor szary jest zakresem relacji BE_IN_STATE/colour): |
<code xml> | <code xml> |
<slot><Const type="rif:local">author</Const><Var>Author</Var></slot> | <owl:Class rdf:ID="elephant"> |
<slot><Const type="rif:local">price</Const><Const type="xsd:integer">49</Const></slot> | <rdfs:subClassOf rdf:resource="#herbivore"/> |
| <rdfs:subClassOf> |
| <owl:Restriction> |
| <owl:onProperty rdf:resource="BE_IN_STATE/colour"/> |
| <owl:hasValue rdf:resource="#grey"/> |
| </owl:Restriction> |
| </rdfs:subClassOf> |
| </owl:Class> |
</code> | </code> |
| Można także nakładać ograniczenia na liczbę elementów powiązanych za pomocą wskazanej relacji. Istnieją trzy warianty takich więzów: liczba maksymalna (maxCordinality), minimalna (minCordinality) i dokładna (Cordinality). W dotychczasowych definicjach pojęć posługiwaliśmy się tzw. “klasami prostymi”. Język OWL umożliwia tworzenie złożonych wyrażeń klasowych (ang. class expression), w których znajdują zastosowanie operatory mnogościowe: sumy (unionOf), przecięcia (intersectionOf), dopełnienia (complementOf), a także operatory ekstensjonalnego tworzenia skończonych zbiorów (oneOf) i operator wskazania rozłączności zbiorów (disjointWith) |
| |
Prefix xsd: oznacza przestrzeń nazw XML http://www.w3.org/2001/XMLSchema#, a prefix rif: URI przestrzeni nazw RIF http://www.w3.org/2007/rif# . | Przykładem zastosowania operatora tworzenia zbioru (pojęcie grey_colour) przez wyliczenie jego elementów może być definicja jednoelementowej klasy zawierającej indywiduum reprezentujące kolor szary: |
rif:local (dla stałych symboli niewidocznych poza daną formułą rif). | |
| |
**RIF,RDF oraz OWL Kompatybilność** | <code xml> |
| <owl:Class rdf:ID="grey_colour"> |
| <owl:oneOf rdf:parseType="Collection"> |
| <owl:Thing rdf:about="#grey"/> |
| </owl:oneOf> |
| </owl:Class> |
| |
| <grey_colour rdf:ID="#grey"/> |
| </code> |
| W języku OWL można wskazywać zachodzenie związków pomiędzy wskazanymi parami indywiduów: jeśli Azja jest przykładem pojęcia kontynent, a Indie są przykładem pojęcia kraj oraz założymy, że kraje są częściami kontynentów, to możemy użyć relacji HAS_HOLO_PART do powiązania rozważanych indywiduów: |
| <code xml> |
| <continent rdf:ID="Asia"/> |
| |
| <country rdf:ID="India"> |
| <HAS_HOLO_PART rdf:resource="#Asia"/> |
| </country> |
| </code> |
| Język OLW udostępnia również echanizmy equivalentClass i equivalentProperty do wskazania równoważności, odpowiednio, pojęć i relacji oraz mechanizm sameIndividualAs, umożliwiający utożsamianie przykładów pojęć. W odniesieniu do indywiduów, istnieje również odwrotna do omówionej możliwości rozróżniania przykładów pojęć za pośrednictwem differentIndividualFrom. |
| |
RIF definiuje sposób przenoszenia regół w sieci. Reguły wymieniane poprzez RIF mogą się odnosić się do zewnętrznych źródeł danych i mogą bazować na pewnych modelach które są reprezentowane za pomocą języków różnych od RIF np: RDF , RDFS, OWL. | Ponieważ OWL posiada pewne ograniczenia - nie można uchwycić złożonych relacji pomiędzy zdefiniowanymi właściwościami (chociażby ogólnie znany przykład "uncle") - powstała idea rozszerzenia OWL'a o pewne formy regułowe przy jednoczesnym zachowaniu maksymalnej kompatybilności z istniejącą składnią i semantyką OWL. |
Dokument http://www.w3.org/TR/rif-rdf-owl określa kompatybilność RIF i RDF(S). | |
Przyszła wersja tego dokumentu będzie również określać kompatybilność z ontologią OWL. | |
| |
* Zgodność pomiędzy stałymi symbolami w RIF oraz nazwami w RDF graphs np.: | Obecnie istnieje propozycja języka **[[http://www.daml.org/2003/11/swrl/|SWRL - Semantic Web Rule Language]]** (początkowo nazwany ORL - OWL Rules Language) opartego na połączeniu podjęzyków OWL DL i OWL Lite języka OWL z fragmentami języka [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_hml_rules:ruleML|RuleML (Rule Markup Language)]]. Propozycja ta rozszerza zbiór aksjomatów zapisanych w języku OWL tak, aby obejmował reguły mające postać klauzul. Pozwala to łączyć takie reguły z bazą wiedzy zapisaną w języku OWL. Proponowane reguły mają postać implikacji pomiędzy poprzednikiem (ciałem) i następnikiem (nagłówkiem). Poprzednik i następnik mogą być zbudowane z koniunkcji atomów, pojedynczego atomu albo być puste. (Wiadomo, że regułę zawierającą koniunkcję w następniku można przekształcić w zestaw reguł zawierających tylko jeden atom w następniku). Reguła ma następujące znaczenie: jeśli warunki podane w poprzedniku zachodzą, to warunki podane w następniku także muszą zachodzić. Pusty poprzednik jest traktowany jako trywialnie prawdziwy, a pusty następnik jako trywialnie fałszywy. Atomy w regułach mogą być postaci C(x), P(x,y), sameAs(x,y) lub differentFrom(x,y), gdzie C jest deskrypcją pojęcia języka OWL, P jest własnocią, a x,y są albo zmiennymi, albo indywiduami, albo wartościami danych. |
| |
RDF - "literal string" | W tzw. Human Readable Syntax czyli składni bardziej czytelnej człowiekowi reguły przyjmują formę: |
| |
RIF - "literal string"^^xsd:string | <code xml> |
| antecedent -> consequent czyli poprzednik -> następnik |
| </code> |
| |
* Zgodność pomiędzy zdaniami w RDF (trojki postaci: s p o) i pewnymi rodzajami formuł w RIF (formula w postaci: s'[p' -> o'], gdzie s', p', oraz o' są symbolami RIF zgodnymi odpowiednio z symbolami RDF’a s, p, oraz o), np.: | gdzie zarówno antecedent jak i consequent składają się ze zbioru atomów a1 ^ a2 ^ ... ^ an. Zmienne są zaznaczane przy użyciu standardowej konwencji prefixowania ich znakiem zapytania (np.?x). Korzystając z tej składni reguła stwierdzająca że połączenie własności 'parent' i 'brother' da nam własność 'uncle' może być zapisana następująco: |
| |
RDF triple: | <code xml> |
john uncleOf marry | parent(?a,?b) ^ brother (?b,?c) -> uncle(?a,?c) |
| </code> |
| |
Formuła RIF frame: | czyli jeśli Mary jest rodzicem Johna i Bill jest bratem Mary, to ta reguła wymaga by Bill był wujkiem Johna. |
"john"^^rif:iri["uncleOf"^^rif:iri -> "marry"^^rif:iri] | |
| |
| Indywidua są zaznaczane za pomocą ich nazw w OWL. Przykładem indywiduum może być 'Fred' lub 'Mary'. Przykład reguły w SWRL określającej własność hasBrother, korzystającej z indywiduum : |
| |
| <code xml> |
| Person(Mary) ^ hasSibling(Mary, Fred) ^ Male(Fred) -> hasBrother(Mary, Fred) |
| </code> |
| |
| Podstawowe typy takie jak integer, long, float czy double są określane za pomocą XML Schema datatypes. Wartości typu Boolean czyli prawda i fałsz są przedstawiane za pomocą vartości "true" i "false". Przykłady literałów: |
| <code xml> |
| 34 |
| 4.45 |
| -34 |
| True |
| false |
| "a literal" |
| </code> |
| Wszystkie typy danych muszą być poprzedzone prefixem przestrzeni nazw 'xsd:', np: |
| <code xml> |
| xsd:unsignedInt |
| xsd:string |
| </code> |
| Nie wszystkie typy danych XML Schema są obecnie obsługiwane. Do tych wpieranych zaliczamy xsd:int, xsd:short, xsd:long, xsd:boolean, xsd:float, xsd:double, xsd:string, xsd:time, xsd:anyURI, xsd:base64Binary, xsd:xsd:byte, xsd:duration, xsd:dateTime, oraz xsd:date. |
| |
| Literały mogą być sprecyzowane typem danych przez poprzedzenie ich parą "^^" oraz nazwą typu danej, np: |
| <code xml> |
| 34^^xsd:unsignedInt |
| "a literal"^^xsd:string |
| </code> |
| |
| Jedną z najważniejszych cech SWRL jest możliwość korzystania z zdefiniowanych przez użytkownika predykatów. Predykaty te mogą pobierać jeden lub więcej argumentów i ocenić prawdę jeśli argumenty te odpowiadają predykatowi. Na przykład predykat 'równości' może być zdefiniowany tak by przyjmować dwa argumenty i zwracać true jeśli te argumenty są takie same. Duża liczba typowych predykatów wykonujących operacje matematyczne oraz operacje na stringach zawarte są w SWRL Built-in Submission. |
| |
| Przykład reguły SWRL korzystającej z wbudowanego predykatu by stwierdzić że osoba z wiekiem większym niż 17 jest osobą dorosłą: |
| <code xml> |
| Person(?p) ^ hasAge(?p, ?age) ^ swrlb:greaterThan(?age, 17) -> Adult(?p) |
| </code> |
| |
| Dla zachowania konwencji predykaty zawarte w SWRL poprzedzane są prefixem swrlb. |
| <code xml> |
| Person(?p) ^ hasNumber(?p, ?number) ^ swrlb:startsWith(?number, "+") -> hasInternationalNumber(?p, true) |
| </code> |
| |
| W SWRL negacja nie jest możliwa, czyli poniższa reguła jest błędem: |
| <code xml> |
| Person(?p) ^ ¬ hasCar(?p, ?c) -> CarlessPerson(?p) |
| </code> |
| |
| Więcej informacji oraz odpowiedzi na najczęściej zadawane pytania odnośnie SWRL: http://protege.cim3.net/cgi-bin/wiki.pl?SWRLLanguageFAQ |
| |
| Teraz kilka słów o SWRL zapisywanym w XML Presentation Syntax. |
| |
| * **owlr** - prefix przestrzeni nazw dla nowo przedstawianej składni (**swrlx** w innych opracowaniach) |
| * **owlx** - prefix przestrzeni nazw http://www.w3.org/2003/05/owl-xml |
| |
| Deklaracje zmiennych są zdaniami wskazującymi by dany URI był używany jako zmienna. Na przykład: |
| |
| <code xml> |
| <owlr:Variable owlr:name="x1"/> |
| </code> |
| |
| Aksjomaty reguł posiadają poprzedników (owlr:antecedent) oraz następników (owlr:consequent), które są listami atomów tworzonych z klas, predykatów, równości i nierówności. Na przykład: |
| |
| <code xml> |
| <owlr:classAtom> |
| <owlx:Class owlx:name="Person"/> |
| <owlr:Variable owlr:name="x1"/> |
| </owlr:classAtom> |
| </code> |
| |
| jest atomem klasy używającym nazwy //Person//, natomiast: |
| |
| <code xml> |
| <owlr:classAtom> |
| <owlx:IntersectionOf> |
| <owlx:Class owlx:name="Person"/> |
| <owlx:ObjectRestriction owlx:"hasParent"/> |
| <owlx:someValuesFrom owlx:class="Physician"/> |
| <owlx:ObjectRestriction/> |
| <owlx:IntersectionOf> |
| <owlr:Variable owlr:name="x2"/> |
| </owlr:classAtom> |
| </code> |
| |
| jest atomem klasy używającym opis reprezentujący osobę('Person') mającą przynajmniej jednego rodzica, który jest lekarzem('Physician') |
| |
| //PropertyAtom// zawiera atrybut //name// oraz dwa elementy które mogą być zmiennymi, indywiduami, albo wartościami danych. Na przykład: |
| |
| <code xml> |
| <owlr:datavaluedPropertyAtom owlr:property="grade"> |
| <owlr:Variable owlr:name="x1"> |
| <owlx:DataValue rdf:datatype="&xsd:integer">4</owlx:DataValue> |
| </owlr:datavaluedPropertyAtom> |
| </code> |
| |
| Na koniec jeszcze przykład atomu wskazującego równość (nierówność) pomiędzy zbiorami indywiduów i nazwami zmiennych. |
| |
| <code xml> |
| <owlr:sameIndividualAtom> |
| <owlr:Variable owlr:name="x1"/> |
| <owlr:Variable owlr:name="x2"/> |
| <owlx:Individual owlx:name="Clinton"/> |
| <owlx:Individual owlx:name="Bill_Clinton"/> |
| </owlr:sameIndividualAtom> |
| </code> |
| |
| |
| |
| |
| |
| |
| |
| |
| =====ARD w RDF===== |
| |
| W ARD występują dwa rodzaje elementów: atrybuty (attributes) i właściwości (properties). Aby zapisać ARD w RDF należało zachować relacji jakie zachodzą między atrybutami a ich właściwośćiami. |
| |
| Proponowane rozwiązanie: |
| |
| <code xml> |
| <?xml version="1.0"?> |
| <rdf:RDF |
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
| xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" |
| xml:base="http://example.org" |
| > |
| <rdf:Description rdf:ID="ard:Attribute"> |
| <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/> |
| </rdf:Description> |
| |
| <rdf:Property rdf:ID="ard:Property"> |
| <rdfs:domain rdf:resource="#ard:Attribute1"/> |
| <rdfs:range rdf:resource="#ard:Attribute2"/> |
| </rdf:Property> |
| |
| </rdf:RDF> |
| </code> |
| |
| gdzie za pomocą |
| <code xml> |
| <rdf:Description rdf:ID="ard:Attribute"> |
| <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/> |
| </rdf:Description> |
| </code> |
| zapisywane są atrybuty posiadające odpowiadające im własnośći jak na przykład: |
| <code xml> |
| <?xml version="1.0"?> |
| <rdf:RDF |
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
| xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" |
| xml:base="http://example.org" |
| > |
| <rdf:Description rdf:ID="Thermostat"> |
| <rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/> |
| </rdf:Description> |
| |
| <rdfs:Class rdf:ID="Time"> |
| <rdfs:subClassOf rdf:resource="#Thermostat"/> |
| </rdfs:Class> |
| |
| <rdf:Property rdf:ID="is_attribute_of"> |
| <rdfs:domain rdf:resource="#Time"/> |
| <rdfs:range rdf:resource="#Thermostat"/> |
| </rdf:Property> |
| </rdf:RDf> |
| </code> |
| |
| Innym podejśćiem do problemu zapisu ARD w RDF może byc użycie biblioteki DublinCore. Poniżej przedstawiono próbę takiego zapisu: |
| <code xml> |
| <?xml version="1.0"?> |
| <rdf:RDF |
| xmlns:rdf="http://www.w3.org/TR/WD-rdf-syntax#" |
| xmlns:dc="http://purl.org/dc/elements/1.0/" |
| xmlns:dcq="http://purl.org/dc/qualifiers/1.0/"> |
| <rdf:Description about="http://www.thermostat.org/Thermostate"> |
| <dc:Relation> |
| <rdf:Description> |
| <dcq:RelationType |
| rdf:resource="http://purl.org/dc/vocabularies/RelationTypes/v1.0/IsReferencedBy"/> |
| <rdf:value resource="http://www.thermostat.org/Time"/> |
| </rdf:Description> |
| </dc:Relation> |
| <dc:Relation> |
| <rdf:Description> |
| <dcq:RelationType |
| rdf:resource="http://purl.org/dc/vocabularies/RelationTypes/v1.0/IsReferencedBy"/> |
| <rdf:value resource="http://www.thermostat.org/Temperature"/> |
| </rdf:Description> |
| </rdf:Description> |
| </rdf:RDF> |
| </code> |
| W przypadu tego typu zapisu trudno mi wybrać odpowiedni typ relacji. Bibliotek DublinCore udostępnia wyłącznie relacje typu: |
| <code xml> |
| Is Version Of | Has Version | Is Replaced By | Replaces | Is Required By | Requires | Is Part Of | |
| Has Part | Is Referenced By | References | Is Format Of | Has Format |
| </code> |
| Nie posiadam natomiast wiedzy, czy istnieje możliwość definiowania własnej relacji. Jeżeli istaniałaby taka możliwość zupełnie słusznym byłoby zdefiniowanie relacji //Is Attribute Of //oraz relacji zwrotnej //Has Attribute//. |
| |
| |
**ARD:** | **ARD:** |
| |
https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-userv-submitted | https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-userv |
| |
Nalepa, G. J. (2008). UServ Case Study, Conceptual Design with ARD+ Method. Paper presented at the FLAIRS2008. | Nalepa, G. J. (2008). UServ Case Study, Conceptual Design with ARD+ Method. Paper presented at the FLAIRS2008. |
| |
https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardformal-submitted | https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardformal |
| |
Nalepa, G. J., & Wojnicki, I. (2008). Towards Formalization of ARD+ Conceptual Design and Refinement Method. Paper presented at the FLAIRS2008. | Nalepa, G. J., & Wojnicki, I. (2008). Towards Formalization of ARD+ Conceptual Design and Refinement Method. Paper presented at the FLAIRS2008. |
| |
https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardprolog-submitted | https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardprolog |
| |
Nalepa, G. J., & Wojnicki, I. (2008). An ARD+ Design and Visualization Toolchain Prototype in Prolog. Paper presented at the FLAIRS2008. | Nalepa, G. J., & Wojnicki, I. (2008). An ARD+ Design and Visualization Toolchain Prototype in Prolog. Paper presented at the FLAIRS2008. |