UML_URML
Projekt zakończony
Piotr Przybycin pit4@o2.pl
Design rbs examples with URML.
Spotkania
080415
-
opis instalacji strelki, w tym ew. błędy, niedoróbki, usterki
opis uwag, co do projektowania Therm w strelce: * czy w urml da się zrealizować całość przykładu?
czy sa jakieś ograniczenia urml co do składni, semantyki?
czy sa jakieś mechanizmy ułatwiające potem integrację z większą aplikacją w Javie, w której nasz therm byłby systemem decyzyjnym, a w Javie np. klasy wizualizujące decyzję
Jak jest realizowana integracja w drools?
080527
Sprawozdanie
Wstęp
URML jest językiem opartym na diagramie klas języka UML. Został stworzony aby ułatwić tworzenie dokumentacji wymagań systemów w sposób mniej techniczny, a bardziej wizualny.
Podstawowym jego rozszerzeniem w stosunku do diagramu klas języka UML, jest możliwość modelowania reguł ( derivation rules, production rules and reaction rules ). Reguły są reprezentowane graficznie jako kółka z identyfikatorami, natomiast zależności w postaci strzałek reprezentujących:
warunki, wyzwalacze, akcje, czy wnioski.
Narzędziem, które umożliwia modelowanie systemów w języku URML jest Strelka, stworzona przez REWERSE Working Group I1.
Instalacja programu Strelka
Będziemy korzystać z programu Strelka w wersji 0.3 dla platformy Eclipse.
Aby w pelni korzystac z możliwości programu wystarczy pobrać plik download_Strelka, rozpakować go do dowolnego folderu i uruchomić plik „eclipse.exe”.
Żadne dodatkowe instalacje nie są potrzebne. Po uruchuchomieniu możemy otworzyć również pewne gotowe przykłady, z katalogu ./examples.
W razie jakichkolwiek wątpliwości odsyłam do: REWERSEworking.groupI1-Strelka
Przykład
Spróbujemy teraz zamodelować w URML-u jakiś przykład.
Naszym przykładem będzie hekate_case_thermostat.
Model wykonany przy użyciu programu Stralka.
Projektowanie naszego układu przebiegło bez większych problemów. Środowisko okazało się bardzo intuicyjne i pozwoliło zaprojektować całość układu bez zbędnych modyfikacji.
Nie zaobserwowałem również żadnych ograniczeń co do składni czy semantyki. Integracja w derivation rules realizowana jest przy użyciu logicznego AND, czyli wszystkie warunki muszą mieć wartość
true. Jeśli chcemy aby reguła dawała wartość true na wyjściu dla wartości false warunku; musimy wtedy zanegować wartość tego warunku.
Znalazłem także narzędzia ułatwiające integrację naszego modelu, ze środowiskami takimi jak:
Jena 2, Jess, F-Logic. Aby wygenerować kod danej reguły dla danego środowiska wystarczy kliknąć na nią prawym przyciskiem myszy, a następnie wybrać „Translate to…” oraz interesujące nas środowisko.
Szczególnie interesująca jest integracja z platformą Jess. Jess jest środowiskiem w pełni stworzonym w języku Java firmy Sun. Przy jego pomocy mamy możliwość tworzenia programów w Javie, które będą potrafiły
wnioskować na podstawie wiedzy dostarczonej w formie reguł. Jess jest językiem, który daje dostęp do wszystkich API Javy.
Przykładowy kod po translacji do Jess dla reguły DR_bizh:
<?xml version="1.0" encoding="UTF-8"?>
<!--// Jess output of R2ML derivation rules-->
<jess>
<pre>(defrule DR_bizh (Hour ? ) (and (test (>= "9" (IDhour ? ) )) (test (<= "16" (IDhour ? ) )) ) (Workday ? ) => (Bizh ? ) )
</pre>
</jess>
Dla lepszego poznania środowiska Jess: JessRules.com
Eksport do R2ML-u
Przy użyciu Strelki możemy również w bardzo prosty sposób uzyskać zapis naszych reguł w standardzie R2ML.
Wystarczy kliknać prawym przyciskiem myszy na daną regułę a następnie wybrać „Preview R2ML”.
Przykładowy kod R2ML dla reguły DR_bizh:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<r2ml:RuleBase xsi:schemaLocation="http://oxygen.informatik.tu-cottbus.de/R2ML/0.4/R2ML.xsd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:r2mlv="http://www.rewerse.net/I1/2006/R2ML/R2MLV" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:r2ml="http://www.rewerse.net/I1/2006/R2ML" xmlns:soap="http://www.w3.org/2001/12/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<r2mlv:Vocabulary>
<r2mlv:Class r2mlv:ID="Day">
<r2mlv:Attribute r2mlv:ID="IDday">
<r2mlv:range>
<r2mlv:Datatype r2mlv:ID="xs:integer"/>
</r2mlv:range>
</r2mlv:Attribute>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Weekend">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Day"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Workday">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Day"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Hour">
<r2mlv:Attribute r2mlv:ID="IDhour">
<r2mlv:range>
<r2mlv:Datatype r2mlv:ID="xs:integer"/>
</r2mlv:range>
</r2mlv:Attribute>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Notbizh"/>
<r2mlv:Class r2mlv:ID="Bizh"/>
<r2mlv:Class r2mlv:ID="Month">
<r2mlv:Attribute r2mlv:ID="IDmonth">
<r2mlv:range>
<r2mlv:Datatype r2mlv:ID="xs:integer"/>
</r2mlv:range>
</r2mlv:Attribute>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Autumn">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Month"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Winter">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Month"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Spring">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Month"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Summer">
<r2mlv:superClass>
<r2mlv:Class r2mlv:ID="Month"/>
</r2mlv:superClass>
</r2mlv:Class>
<r2mlv:Class r2mlv:ID="Thermostat">
<r2mlv:Attribute r2mlv:ID="temp">
<r2mlv:range>
<r2mlv:Datatype r2mlv:ID="xs:float"/>
</r2mlv:range>
</r2mlv:Attribute>
</r2mlv:Class>
</r2mlv:Vocabulary>
<r2ml:DerivationRuleSet>
<r2ml:DerivationRule r2ml:ruleID="DR_bizh">
<r2ml:conditions>
<r2ml:ObjectClassificationAtom r2ml:classID="Hour" r2ml:isNegated="false">
<r2ml:ObjectVariable/>
</r2ml:ObjectClassificationAtom>
<r2ml:qf.Conjunction>
<r2ml:DatatypePredicateAtom r2ml:datatypePredicateID="swrlb:greaterThanOrEqual" r2ml:isNegated="false" xmlns:swrlb="http://www.w3.org/2003/11/swrlb">
<r2ml:dataArguments>
<r2ml:TypedLiteral r2ml:datatypeID="xs:integer" r2ml:lexicalValue="9"/>
<r2ml:AttributeFunctionTerm r2ml:attributeID="IDhour">
<r2ml:contextArgument>
<r2ml:ObjectVariable r2ml:classID="Hour"/>
</r2ml:contextArgument>
</r2ml:AttributeFunctionTerm>
</r2ml:dataArguments>
</r2ml:DatatypePredicateAtom>
<r2ml:DatatypePredicateAtom r2ml:datatypePredicateID="swrlb:lessThanOrEqual" r2ml:isNegated="false" xmlns:swrlb="http://www.w3.org/2003/11/swrlb">
<r2ml:dataArguments>
<r2ml:TypedLiteral r2ml:datatypeID="xs:integer" r2ml:lexicalValue="16"/>
<r2ml:AttributeFunctionTerm r2ml:attributeID="IDhour">
<r2ml:contextArgument>
<r2ml:ObjectVariable r2ml:classID="Hour"/>
</r2ml:contextArgument>
</r2ml:AttributeFunctionTerm>
</r2ml:dataArguments>
</r2ml:DatatypePredicateAtom>
</r2ml:qf.Conjunction>
<r2ml:ObjectClassificationAtom r2ml:classID="Workday" r2ml:isNegated="false">
<r2ml:ObjectVariable/>
</r2ml:ObjectClassificationAtom>
</r2ml:conditions>
<r2ml:conclusion>
<r2ml:ObjectClassificationAtom r2ml:classID="Bizh">
<r2ml:ObjectVariable/>
</r2ml:ObjectClassificationAtom>
</r2ml:conclusion>
</r2ml:DerivationRule>
</r2ml:DerivationRuleSet>
</r2ml:RuleBase>
Zgodność z innymi językami
R2ML jest obszernym, i przyjaznym dla użytkownika bazującym na XML-u językiem, którego głównymi zadaniami są:
wymiana reguł między różnymi systemami i narzędziami
możliwość łączenia poszczególnych systemów decyzyjnych z narzędziami bazującymi na R2ML-u w celu zapewnienia wizualizacji, werbalizacji, weryfikacji oraz ratyfikacji.
R2ML jest bardzo wszechstronny ponieważ integruje takie języki jak:
the Object Constraint Language (OCL)
the Semantic Web Rule Language (SWRL)
the Rule Markup Language (RuleML)
Obecną wersją języka R2ML jest wersja 0.5 (Release Date: August 23, 2007).
Jest ona oparta na schemacie XML, który jest dostępny XMLSchema
Język R2ML jest ciągle rozwijany i mamy obecnie również dostęp do różnorakich translatorów takich jak:
R2ML to F-Logic
F-LogicXML to R2ML
R2ML to Jess
R2ML to RuleML
RuleML to R2ML
R2ML to JenaRules
JenaRules to R2ML
R2ML to JBoss Rules
SWRL to R2ML
R2ML to SWRL
R2ML to XMI
R2ML to OCL
OCL to R2ML
Wszystkie dostępne pod linkiem translatory
Przykładowe przejście z kodu R2ML do XMI dla Production Rule z przykładu:przykład.
<?xml version = '1.0' encoding = 'ISO-8859-1' ?>
<XMI xmi.version = '1.2' timestamp = 'Tue Jun 03 13:12:09 CEST 2008'>
<XMI.header>
<XMI.documentation>
<XMI.exporter>Netbeans XMI Writer</XMI.exporter>
<XMI.exporterVersion>1.0</XMI.exporterVersion>
</XMI.documentation>
</XMI.header>
<XMI.content>
<R2ML.ProductionRuleSet xmi.id = 'a1'/>
<R2ML.ProductionRuleSet xmi.id = 'a2'/>
<R2ML.Atoms.AtBasic.ObjectClassificationAtom xmi.id = 'a3' isNegated = 'false'/>
<R2ML.Terms.TerBasic.Variables.ObjectVariable xmi.id = 'a4'/>
<R2ML.Terms.TerFunctional.AttributeFunctionTerm xmi.id = 'a5'>
<R2ML.Terms.TerFunctional.AttributeFunctionTerm.attribute>
<R2ML.Vocabulary.VocBasic.Attribute xmi.idref = 'a6'/>
</R2ML.Terms.TerFunctional.AttributeFunctionTerm.attribute>
<R2ML.Terms.TerFunctional.AttributeFunctionTerm.contextArgument>
<R2ML.Terms.TerBasic.Variables.ObjectVariable xmi.idref = 'a4'/>
</R2ML.Terms.TerFunctional.AttributeFunctionTerm.contextArgument>
</R2ML.Terms.TerFunctional.AttributeFunctionTerm>
<R2ML.Terms.TerFunctional.DatatypeFunctionTerm xmi.id = 'a7'>
<R2ML.Terms.TerFunctional.DatatypeFunctionTerm.function>
<R2ML.Vocabulary.VocFunctional.DatatypeFunction xmi.idref = 'a8'/>
</R2ML.Terms.TerFunctional.DatatypeFunctionTerm.function>
<R2ML.Terms.TerFunctional.DatatypeFunctionTerm.dataArguments>
<R2ML.Vocabulary.VocBasic.TypedLiteral xmi.idref = 'a9'/>
<R2ML.Terms.TerFunctional.AttributeFunctionTerm xmi.idref = 'a5'/>
</R2ML.Terms.TerFunctional.DatatypeFunctionTerm.dataArguments>
</R2ML.Terms.TerFunctional.DatatypeFunctionTerm>
<R2ML.Vocabulary.VocBasic.TypedLiteral xmi.id = 'a9' lexicalValue = '600'>
<R2ML.Vocabulary.VocBasic.TypedLiteral.type>
<R2ML.Vocabulary.VocBasic.Datatype xmi.idref = 'a10'/>
</R2ML.Vocabulary.VocBasic.TypedLiteral.type>
</R2ML.Vocabulary.VocBasic.TypedLiteral>
<R2ML.Vocabulary.VocBasic.Attribute xmi.id = 'a6' predicateCategory = 'closed'/>
<R2ML.Vocabulary.VocBasic.Datatype xmi.id = 'a10' predicateCategory = 'closed'/>
<R2ML.Vocabulary.VocFunctional.DatatypeFunction xmi.id = 'a8' arity = '0'/>
</XMI.content>
</XMI>
Przydatne linki