|
|
pl:miw:miw08_ruleruntimej [2008/04/15 08:45] miw Termostat - RDF |
pl:miw:miw08_ruleruntimej [2019/06/27 15:50] |
====== Opis ====== | |
Realizujący: | |
**Marcin Gadamer** <marcin.gadamer@gmail.com> | |
| |
Investigate runtime integration aspects, mainly | |
Prolog+Java integration possibilities | |
* input | |
* Prolog/Java APIs | |
* JSR94 | |
* Jess | |
* JenaRules | |
* integration | |
* output | |
How to integrate Prolog and Java in the best way regarding performance, and coding easiness + examples. | |
[[pl:miw:miw2008_tematy#ruleruntimej|MIW temat]] | |
| |
====== Spotkania ====== | |
===== 08.03.04 ===== | |
| |
| |
| |
===== 080401 ===== | |
* Porównanie API Jeny i RDF SWI Prologu | |
* jak zapisywać //reguły// w Jenie? | |
* jaka jest różnica w sile ekspresji reguł jeny i Prologu? | |
* opis dostarczonych z Jeną mechanizmów wnioskujących (reasoners) | |
| |
===== 080415 ===== | |
* przykład [[hekate:hekate_case_thermostat|termostatu]] w RDF w Jenie | |
| |
| |
====== Projekt ====== | |
* "implementacja" jsr94 w prologu | |
* możliwość/sensowność jess/prolog | |
| |
Ponieważ Jess można używać jedynie przez 30 dni, wykorzystuję do integracji framework Jena. | |
| |
* Jednym z zalet Jeny jest czytanie/zapisywanie RDF w RDF/XML, N3 oraz N-Triples. Stąd słuszne wydaje się podejście | |
Prolog <-przedstawienie wiedzy-> RDF <-przedstawienie wiedzy-> Java | |
| |
* Mały program w Java, który pokazuje relacje pomiędzy tatą (Jan), mamą (Krystyna), córką (Kasia), synem (Jasiu) | |
| |
Zostały zapisane następujące dane: | |
corka.addProperty(siostra, syn); | |
tata.addProperty(ojciec, corka); | |
tata.addProperty(ojciec, syn); | |
tata.addProperty(malzonek, mama); | |
mama.addProperty(malzonek, tata); | |
Statement statement1 = model.createStatement(syn, dziecko, mama); | |
Statement statement2 = model.createStatement(syn, dziecko, tata); | |
Statement statement3 = model.createStatement(corka, dziecko, mama); | |
Statement statement4 = model.createStatement(corka, dziecko, tata); | |
| |
W pliku RDF: | |
<code xml> | |
<rdf:RDF | |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
xmlns:j.0="http://purl.org/vocab/relacje/" > | |
<rdf:Description rdf:about="http://Family/KowalskiJan"> | |
<j.0:malzonek rdf:resource="http://Family/KowalskiKrystyna"/> | |
<j.0:ojciec rdf:resource="http://Family/KowalskiJasiu"/> | |
<j.0:ojciec rdf:resource="http://Family/KowalskiKasia"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Family/KowalskiKrystyna"> | |
<j.0:malzonek rdf:resource="http://Family/KowalskiJan"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Family/KowalskiKasia"> | |
<j.0:dziecko rdf:resource="http://Family/KowalskiJan"/> | |
<j.0:dziecko rdf:resource="http://Family/KowalskiKrystyna"/> | |
<j.0:siostra rdf:resource="http://Family/KowalskiJasiu"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Family/KowalskiJasiu"> | |
<j.0:dziecko rdf:resource="http://Family/KowalskiJan"/> | |
<j.0:dziecko rdf:resource="http://Family/KowalskiKrystyna"/> | |
</rdf:Description> | |
</rdf:RDF> | |
</code> | |
Przekazany RDF do Javy daje model z zawartością 9 informacji. | |
| |
Po zadaniu prostych zapytań | |
| |
syn.listProperties(dziecko); | |
corka.listProperties(dziecko); | |
corka.listProperties(siostra); | |
otrzymałem: | |
| |
http://Family/KowalskiJasiu jest dzieckiem | |
http://Family/KowalskiJan | |
http://Family/KowalskiKrystyna | |
http://Family/KowalskiKasia jest dzieckiem | |
http://Family/KowalskiJan | |
http://Family/KowalskiKrystyna | |
http://Family/KowalskiKasia ma rodzenstwo | |
http://Family/KowalskiJasiu | |
| |
==SPARQL== | |
Zapytania buduje się podobnie jak w języku zapytań SQL z tą różnicą, że podaje się całą trójkę. | |
Zapytanie SPARQL dla podanego powyżej przykładu może wyglądać tak: | |
| |
<code> | |
SELECT ?x ?w ?q | |
WHERE {?x ?w ?q} | |
</code> | |
Oznacza to podgląd całej wiedzy, która jest zawarta w modelu. | |
| |
Na takie zapytanie uzyskałem taką odpowiedź: | |
<code> | |
Jasiu dziecko Jan | |
Jasiu dziecko Krystyna | |
Krystyna malzonek Jan | |
Jan malzonek Krystyna | |
Jan ojciec Jasiu | |
Jan ojciec Kasia | |
Kasia dziecko Jan | |
Kasia dziecko Krystyna | |
Kasia siostra Jasiu | |
</code> | |
| |
Jak widać są to wszytkie informacje, które zawarłem w modelu. (Dla czytelności zostały usunięte URI, aby odpowiedź nie wygdlądała np. tak http://Family/KowalskiJan) | |
| |
Znając zasadę tworzenia zapytania, można otrzymać odpowiedź na "skomplikowane" zapytanie. | |
| |
==Termostat - RDF== | |
| |
Aby stworzyć plik RDF reprezentujący model termostatu, najpierw utworzyłem model termostatu wg. reguł. | |
| |
Aby plik taki został wygenerowany ścieżki do resoure'ów oraz propertis'ów muszą być unikalne stąd musiałem stworzyć dwa Stringi, którymi poprzedzałem każdy z nich. | |
<code> | |
static final String resourceUri = "http://Resource/my/"; | |
static final String propertyUri = "http://Property/my/"; | |
</code> | |
| |
| |
Tak zapisałem model w Javie: | |
<code> | |
Model model = ModelFactory.createDefaultModel(); | |
//1 | |
Resource day = model.createResource(resourceUri+ "Day"); | |
Resource workday = model.createResource(resourceUri+"Workday"); | |
Property monday = model.createProperty(propertyUri+"monday"); | |
Property tuesday = model.createProperty(propertyUri+"tuesday"); | |
Property wednesday = model.createProperty(propertyUri+"wednesday"); | |
Property thursday = model.createProperty(propertyUri+"thursday"); | |
Property friday = model.createProperty(propertyUri+"friday"); | |
day.addProperty(monday, workday); | |
day.addProperty(tuesday, workday); | |
day.addProperty(wednesday, workday); | |
day.addProperty(thursday, workday); | |
day.addProperty(friday, workday); | |
| |
//2 | |
Resource weekend = model.createResource(resourceUri + "Weekend"); | |
Property saturday = model.createProperty(propertyUri + "saturday"); | |
Property sunday = model.createProperty(propertyUri+ "sunday"); | |
day.addProperty(saturday, weekend); | |
day.addProperty(sunday, weekend); | |
| |
//3 4 5 | |
Resource time = model.createResource(resourceUri + "time"); | |
Resource hour = model.createResource(resourceUri + "hour"); | |
Property sevenAm = model.createProperty(propertyUri + "seven-before9am"); | |
Property sixPm = model.createProperty(propertyUri + "six-after5pm"); | |
Property noon = model.createProperty(propertyUri + "noon"); | |
time.addProperty(sevenAm, hour); | |
time.addProperty(sixPm, hour); | |
time.addProperty(noon, hour); | |
| |
//6 | |
//-- | |
| |
//7 | |
Resource month = model.createResource(resourceUri+ "month"); | |
Resource summer = model.createResource(resourceUri+"summer"); | |
Property january = model.createProperty(propertyUri+"january"); | |
Property february = model.createProperty(propertyUri+"february"); | |
Property december = model.createProperty(propertyUri+"december"); | |
month.addProperty(january, summer); | |
month.addProperty(february, summer); | |
month.addProperty(december, summer); | |
| |
//8 | |
Resource autumn = model.createResource(resourceUri+"autumn"); | |
Property march = model.createProperty(propertyUri+"march"); | |
Property april = model.createProperty(propertyUri+"april"); | |
Property may = model.createProperty(propertyUri+"may"); | |
month.addProperty(march, autumn); | |
month.addProperty(april, autumn); | |
month.addProperty(may, autumn); | |
| |
//9 | |
Resource winter = model.createResource(resourceUri+"winter"); | |
Property june = model.createProperty(propertyUri+"june"); | |
Property july = model.createProperty(propertyUri+"july"); | |
Property august = model.createProperty(propertyUri+"august"); | |
month.addProperty(june, winter); | |
month.addProperty(july, winter); | |
month.addProperty(august, winter); | |
| |
//10 | |
Resource spring = model.createResource(resourceUri+"spring"); | |
Property september = model.createProperty(propertyUri+"september"); | |
Property october = model.createProperty(propertyUri+"october"); | |
Property november = model.createProperty(propertyUri+"november"); | |
month.addProperty(september, spring); | |
month.addProperty(october, spring); | |
month.addProperty(november, spring); | |
| |
//11 12 13 | |
Resource operation = model.createResource(resourceUri + "operation"); | |
Property businessHours = model.createProperty(propertyUri + "businessHours"); | |
Property notBusinessHours = model.createProperty(propertyUri + "notBusinessHours"); | |
operation.addProperty(businessHours, hour); | |
operation.addProperty(notBusinessHours, hour); | |
| |
//14 15 16 17 18 | |
Resource thermostat = model.createResource(resourceUri + "thermostat"); | |
Resource setting = model.createResource(resourceUri + "setting"); | |
Property degrees20 = model.createProperty(propertyUri + "20degrees"); | |
Property degrees15 = model.createProperty(propertyUri + "15degrees"); | |
Property degrees24 = model.createProperty(propertyUri + "24degrees"); | |
Property degrees27 = model.createProperty(propertyUri + "27degrees"); | |
Property degrees16 = model.createProperty(propertyUri + "16degrees"); | |
Property degrees18 = model.createProperty(propertyUri + "18degrees"); | |
Property degrees14 = model.createProperty(propertyUri + "14degrees"); | |
thermostat.addProperty(degrees20, setting); | |
thermostat.addProperty(degrees15, setting); | |
thermostat.addProperty(degrees24, setting); | |
thermostat.addProperty(degrees27, setting); | |
thermostat.addProperty(degrees16, setting); | |
thermostat.addProperty(degrees18, setting); | |
thermostat.addProperty(degrees14, setting); | |
</code> | |
| |
Na tej podstawie wygenerowałem plik RDF z zapisanym modelem: | |
<code xml> | |
<rdf:RDF | |
xmlns:j.0="http://Property/my/18" | |
xmlns:j.1="http://Property/my/" | |
xmlns:j.2="http://Property/my/15" | |
xmlns:j.3="http://Property/my/24" | |
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |
xmlns:j.4="http://Property/my/27" | |
xmlns:j.5="http://Property/my/16" | |
xmlns:j.7="http://Property/my/14" | |
xmlns:j.6="http://Property/my/20" > | |
<rdf:Description rdf:about="http://Resource/my/time"> | |
<j.1:noon rdf:resource="http://Resource/my/hour"/> | |
<j.1:six-after5pm rdf:resource="http://Resource/my/hour"/> | |
<j.1:seven-before9am rdf:resource="http://Resource/my/hour"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Resource/my/month"> | |
<j.1:january rdf:resource="http://Resource/my/summer"/> | |
<j.1:february rdf:resource="http://Resource/my/summer"/> | |
<j.1:september rdf:resource="http://Resource/my/spring"/> | |
<j.1:october rdf:resource="http://Resource/my/spring"/> | |
<j.1:july rdf:resource="http://Resource/my/winter"/> | |
<j.1:november rdf:resource="http://Resource/my/spring"/> | |
<j.1:may rdf:resource="http://Resource/my/autumn"/> | |
<j.1:april rdf:resource="http://Resource/my/autumn"/> | |
<j.1:august rdf:resource="http://Resource/my/winter"/> | |
<j.1:june rdf:resource="http://Resource/my/winter"/> | |
<j.1:december rdf:resource="http://Resource/my/summer"/> | |
<j.1:march rdf:resource="http://Resource/my/autumn"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Resource/my/Day"> | |
<j.1:sunday rdf:resource="http://Resource/my/Weekend"/> | |
<j.1:saturday rdf:resource="http://Resource/my/Weekend"/> | |
<j.1:friday rdf:resource="http://Resource/my/Workday"/> | |
<j.1:thursday rdf:resource="http://Resource/my/Workday"/> | |
<j.1:wednesday rdf:resource="http://Resource/my/Workday"/> | |
<j.1:tuesday rdf:resource="http://Resource/my/Workday"/> | |
<j.1:monday rdf:resource="http://Resource/my/Workday"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Resource/my/operation"> | |
<j.1:notBusinessHours rdf:resource="http://Resource/my/hour"/> | |
<j.1:businessHours rdf:resource="http://Resource/my/hour"/> | |
</rdf:Description> | |
<rdf:Description rdf:about="http://Resource/my/thermostat"> | |
<j.7:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.0:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.5:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.4:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.3:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.2:degrees rdf:resource="http://Resource/my/setting"/> | |
<j.6:degrees rdf:resource="http://Resource/my/setting"/> | |
</rdf:Description> | |
</rdf:RDF> | |
| |
</code> | |
| |
====== Sprawozdanie ====== | |
| |
| |
| |
| |
====== Materiały ====== | |
| |
== Basic === | |
[[http://jena.sourceforge.net/documentation.html| Dokumentacja]] - Dokumentacja do frameworka Jena | |
| |
[[http://www.ibm.com/developerworks/xml/library/j-jena/index.html| IBM]] - Wprowadzenie do Jena wykonane przez IBMa | |
| |
[[http://www.oreilly.com/catalog/pracrdf/chapter/ch08.pdf|RDF]] - wszytstko o RDF - PDF wykonany przez wydawnictwo O'Reilly | |
| |
[[http://pl.wikipedia.org/wiki/System_ekspertowy| System ekspertowy]] - Wikipedia | |
| |
[[http://java.sun.com/developer/technicalArticles/J2SE/JavaRule.html| Java Rule Engine API]] - Getting Started With the Java Rule Engine API (JSR 94): Toward Rule-Based Applications (Sun) | |
| |
[[http://javaboutique.internet.com/tutorials/rules_engine/| Java Rules Engine API (JSR 94)]] - Java Rules Engine API (JSR 94) in javaboutique | |
| |
== Jena + SPARQL == | |
| |
[[http://www.ibm.com/developerworks/xml/library/j-sparql/| RDF in SPARQL]] - Search RDF data with SPARQL | |
| |
[[http://jena.sourceforge.net/ARQ/| AQR]] - Query engine for Jena | |
| |
[[http://2006.ruleml.org/slides/tutorial-holger.pdf| Rules Example]] - Rules example using Jena + Pellet (pdf file!) | |
| |
== Jena rules == | |
| |
[[http://jena.sourceforge.net/inference/index.html#rules| Jena rules page]] - Jena rules documentation | |
| |
[[http://www.ldodds.com/blog/archives/000219.html| Example]] - Rules in Jena example | |
| |
[[http://jena.hpl.hp.com/juc2006/proceedings/reynolds/rules-slides.ppt| Examlpe2]] - HP Example of using Jena Rules (ppt file!) | |
| |
== Prolog == | |
| |
[[http://www.swi-prolog.org/packages/rdf2pl.html| Prolog parser]] - SWI-Prolog RDF parser | |
| |
[[http://www.swi-prolog.org/packages/semweb.html| Semantic Web Library]] - SWI-Prolog Semantic Web Library | |
| |
[[http://www.xml.com/pub/a/2001/07/25/prologrdf.html| RDF in Prolog]] - RDF Applications with Prolog | |