myHead

Jarosław Kijanowski


In der Not frisst der Teufel Regeln

Dieser Artikel ist als Einstieg in die Welt der Rule Engines gedacht. Er enthält einen kurzen Überblick über das komplexe Thema und zeigt die Installation von Eclipse IDE und die Integration mit dem Drools Workbench.

Wenn Du ein Programmierer, Architekt oder ein Analytiker bist, dann wird es sicherlich vom Vorteil sein, sich wenigstens mit dem ersten Kapitel dieses Artikels bekannt zu machen. Er beinhaltet eine kurzgefasste Beschreibung von Rule Engines, die die Lesbarkeit, Verwaltung und Aufrechterhaltung von bestimmten Anwendungsprogrammen, die Rückschlüsse aufgrund bestimmter Ereignisse oder Zustände von gewissen Objekten ziehen, bedeutend verbessert.

Inhaltsangabe:

  1. Rule Engines
  2. Drools
  3. Vorteile des Drools Rule Engine
  4. BRMS
  5. Production Rules im Vergleich zu Ereignissen
  6. Jetzt geht's los!
  7. Was ist passiert?
  8. Zusammenfassung
  1. Rule Engines
  2. Eine Rule Engine ist ein Programm das aufgrund bestimmten Wissens Rückschlüsse ziehen kann. Dieses Wissen wird zusammen mit den dazugehörigen Folgerungen auch Production Rule genannt. Sie enthält also eine oder mehrere Regeln und Aktionen, die aufgerufen werden, wenn deren Regeln sich als wahr erweisen. Darüber hinaus gibt es eine Basis mit Fakten, die Working Memory heisst und die den aktuellen Zustand gewisser Objekte wiederspiegelt. Üblicherweise derjenigen Objekte, die beim Steuern des Programmablaufs ausschlaggebend sind. Dieser Zustand kann sich ändern, denn neben der Modifikation von bestehenden Objekten gibt es auch die Möglichkeit neue Objekte in die Working Memory hinzuzufügen oder vorhandene zurück zu nehmen. Das kann in den Aktionen stattfinden. Nennenswert ist noch die Agenda. Wenn zwei Regeln im selben Moment wahr sind, dann sind sie im Konflikt. Die Agenda ist dazu da, um solche Situationen zu klären. Sie ordnet die Aktionen nacheinander all der Regeln die gerade wahr sind und lässt sie ausführen. Dies ist extrem wichtig, den eine Aktion kann dazu führe, dass eine Regel nicht mehr wahr war ist und dass wiederum führt dazu, dass die zugehörige Aktion zurückgezogen wird.
    Eine Rule Engine kann also wie folgt dargestellt werden:

    Am häufigsten werden Rule Engines in folgenden Bereichen verwendet:

    • bestimmen von Preissenkungen basierend auf der Summe oder den Preisen von gewählten Artikeln

    • berechnen der Höhe der KFZ Versicherung abhängig vom Alter des Fahrers

    • diagnostizieren von Krankheiten

    • aufdecken von Störungen, Pannen und anderen Gefahren

    • lösen von Rätseln und komplexen Problemen

  3. Drools
  4. Drools ist eine Open Source Software Rule Engine. Sie wird in Form einer Bibliothek angeboten und unter der Apache Lizenz frei zur Verfügung gestellt. Sowohl das Herunterladen, Benutzen als auch der Vertrieb in eigenen Anwendungen ist kostenlos.
    Das Herz der Rule Engine ist eine Inferenzmaschiene (inference engine). Ihre Aufgabe ist es Übereinstimmungen zwischen Fakten und Regeln zu finden (pattern matching). Anhand dieser Verknüpfungen werden dann Rückschlüsse gezogen die entsperechende Aktionen auslösen. Übereinstimmungen werden mit Hilfe des RETE Algorithmus ausgeführt, der in Drools um Objektorientierte Konzepte ausgebaut wurde.
    Wie schon erwähnt, wird das Wissen in sogenannten Production Rules gespeichert. Auf diese Weise wird Wissen der Rule Engine zur Verfügung gestellt. Die Verkörperung des Wissens (knowledge representation) wird mit Hilfe der Prädikatenlogik der ersten Stufe (First Order Logic - FOL) vollzogen. Die FOL erlaubt es Behauptungen wie 2 + 3 == 5 oder Kunde.alter > 17 logisch zu untersuchen.
    Die Hauptkomponenten einer Regel sind Bedingungen und Aktionen:

    when
    Kunde (alter > 17)
    then
    System.out.println("Kunde ist volljährig.");

    Die oben erwähnte Regel wird für all die Fakten als wahr ausgewertet, die Kunden und älter als 17 Jahre alt sind. Eine entsprechende SQL-Abfrage zur Ermittlung aller Kunden könnte wie folgt aussehen:

    SELECT * from Kunden k WHERE k.Alter > 17

    Es gibt zwei Wege Regeln als wahr auszuwerten, was zur Ausführung der dazugehörigen Aktionen führt. Vorwärtsverkettung wird mit Fakten angetrieben. Es werden also die Regeln ausgewählt, deren Bedingungen, dank Fakten in der Working Memory, ermittelt werden können. Bedingungen die sich als wahr herausstellen leiten Aktionen ein, die dann ausgeführt werden. Wie schon gesagt können Aktionen Objekte in der Working Memory verändern, was wiederum dazu führen kann, dass neueu Bedingungen sich als wahr erweisen. Dieser Prozess wird fortgesetzt, solange Bedingungen als wahr ausgewertet werden. Rückwärtsverkettung hingegen wird mit Zielobjekten angetrieben. Dabei werden die Regeln untersucht, deren Aktionen zum Ziel führen.

  5. Vorteile des Drools Rule Engine's
    • Trennung der Anwendung von Bedingungen die auf den Steuerungsprozess Einfluss haben

      • Regeln werden in separaten Dateien aufbewahrt

      • Regeln können von verschiedenen Personen gelesen und verändert werden

      • Ändern von Regeln zieht keine Rekompilation nach sich

      • vereinfachte Verwaltung von Steurungsbedingungen, da ale Regeln an einem Platz sind

    • Regeln ersetzen auf eine leichte Art und Weise komplexe und verflochtene if - then Anweisungen

      • Sprache der Regeln ist nich schwieirig

      • Drools bietet ein Eclipse Plug-in an, dass das Schreiben von Regeln vereinfacht und sogar den RETE Baum bildlich darstellt

    • Probleme werden mit Hilfe einfacher Regeln anstatt komplizierter Algorithmen gelöst

      • deklarative Programmiersprache erlaubt es uns zu definieren WAS gelöst werden soll und nicht WIE.

      • Lösungen gewisser Probleme können viel leichter mir Regeln ausgedrückt werden, die darüber hinuas mühelos gelesen und verstanden werden können.

    • Einsicht in den "Gedankengang" der Rule Engine erlaubt es die Gründe der gezogenen Schlussvolgerungen kennen zu lernen

    Eine Rule Enigne sollte also dann in Betracht gezogen werden, wenn die Lösung des Problems kompliziert erscheint oder im Algorithmus viele verzweigte "if - then" und "switch" Anweisungen auftreten. Auch dann, wenn die Steuerungslogik oft verändert werden muss oder von Personen vorgenommen wird, die keine Möglichkeit haben (aus Mangel an Rechten, Wissen, usw.) die Anwendung neu zu kompilieren, ist eine Rule Engine zu empfehlen.

  6. BRMS
  7. Drools ist nicht nur eine Rule Engine. Es kommt mit einem Regelverwaltungssystem (Business Rules Management System). Mit seiner Hilfe kann man Regeln schreiben, abändern und verschiedene Varianten einer Regel anbieten. Darüber hinaus ist ein BRMS für die persistente Speicherung der Regeln verantwortlich. Ein Sicherheitskonzept kann dank einem Login Mechanismus, Rollen und zum Beispiel der LDAP Integration mit einfachen Schritten eingeführt werden. So kann beispielsweise nur ein Analytiker eine bestimmte Regel verändern, ein Programmierer hingegen sie nur lesen. Zusammenfassend ist eine BRMS ein zentrales Verwaltungssystem für Regeln.

  8. Production Rules im Vergleich zu Ereignissen
  9. Production Rules beinhalten Bedingungen (when) und Aktionen (then). Wenn ein Autofahrer den Führerschein kürzer als 5 Jahre hat, dann biete ihm die teuerste Versicherung an. Eine andere Form von Regeln repräsentieren Ereignisse (event condition action). In diesem Fall vergleicht die Rule Engine alle registrierten Ereignisse mit einem Ereignissmuster. Typische Ereignisse könten zum Beispiel Verkauf des letzten Warenstücks oder Panne einer Verkehrsampel sein. Ausserdem gibt es einen wesentlichen Unterschied im Aufrufen der Aktionen. Im Fall der Production Rules is es der Programmierer, der den Zeitpunkt wählt, im dem alle Aktionen (durch die Agenda nacheinander geordnet) ausgeführt werden. Bei den ereignissgesteuerten Regeln is es der Moment, in dem sie geschehen, der Auslöser.

  10. Jetzt geht's los!
  11. ... und zwar fangen wir mit der Installation einer Integrierten Entwicklungsumgebung an. Gezeigt wird Eclipse, weil es gut genug für die Entwicklung von J2SE und JEE Anwendungen ist und Drools dafür ein Plug-in anbietet, dass das Schreiben von Regeln vereinfacht.

    Eclipse IDE, Eclipse IDE for Java EE Developers (eclipse-jee-europa-winter-linux-gtk.tar.gz)

    Das Herunterladen und Benutzen ist kostenlos. Nachdem es auf der Festplatte gespeichert wurde, kann es entpackt und gestartet werden. Um das Drools Plug-in zu installieren wählen wir aus dem Hauptmenü Help -> Software Updates -> Find and install... -> Search for new features to install -> New Remote Site...

    Die URL ist auf der Drools Homepage unter "Drools IDE Update Site" angegeben. Zum Beispiel für "Drools 4.0.7 Eclipse Workbench for Europa 3.3" ist die URL http://downloads.jboss.com/drools/updatesite3.3/

    Jetzt OK und Finish. Nach kurzer Zeit zeigt Eclipse das Ergebnis seiner Suche nach dem Plug-in:

    Wir wählen Next, akzeptieren die Lizenz und wählen zum letzten Mal Finish, um das Plug-in herunterzuladen. Das nächste Fenster wird mit "Install all" gleich wieder "geschlossen". Zum Schluss werden wir gefragt, ob Eclipse neu gestartet werden soll. Wir wählen "Yes" und können es noch kaum erwarten das Plug-in in Aktion zu sehen. Ein neues Drools Symbol taucht auf und bedeutet ein gelungene Installation.

    Zeit für die erste Drools Anwendung. Unter dem Drools Symbol wählen wir "New Rule Project".

    Wir geben den Namen des Projektes an und wählen Finish. Das Plug-in hat eine Beispielanwendung erstellt und uns mit allen nötigen Bibliotheken versorgt. Um das Programm zu starten wählen wir die Datei com.sample.DroolsTest i drücken die Tastenkombination "Shift + Alt + X" und dann "J". In der Konsole können wir Folgendes sehen:

    Hello World
    Goodbye cruel world
  12. Was ist passiert?
  13. Dieses Beispiel ist genau in der Drools Dokumentation beschrieben. Worauf ich mich konzentrieren möchte ist die Datei mit den Regeln, Sample.drl. Die Initialisierung der Rule Engine und das Einlesen der Regeln lasse ich beiseite, denn es wird mehr Hintegrundwissen benötigt um genau zu verstehen was dort genau geschieht. Hierfür empfehle ich die Drools Dokumentation.

    In der drl Datei befinden sich zwei Regeln. Am Anfang gibt es in der Working Memory nur ein Objekt der Klasse Message. Seinen Feldern message und status wurden die Werte "Hello World" und "0" zugeschrieben. Im Moment, in dem fireAllRules() gerufen wird, werden Aktionen ausgeführt, die all den Regeln entsprechen, die sich als wahr erwiesen haben. Erwähnenswert ist der Zeitpunkt in dem Regeln als wahr oder unwahr bewertet werden. Ermittelt wird das nämlich dann, wenn ein Objekt in die Working Memory hinzugefügt wird. Die Regel unter dem Namen "Hello World" wurde als wahr bewertet, denn als die Rule Engine gestartet wurde (fireAllRules() ) befand sich in der Working Memory ein Objekt, das der Klasse Message war und dessen Feld status den Wert "0" hatte. Es wurde also die Aktion dieser Regel ausgeführt. In Folge dessen wurden die Felder des Objekts verändert. Die Anweisung update() benachrichtigt die Rule Engine, dass etwas in der Working Memory verändert wurde und das alle Regeln noch einaml bewertet werden müssen. Das wiederum führt dazu da, dass die zweite Regel, "GoodBye", sich als wahr erweist, was die Ausführung der entsprechenden Aktion nach sich zieht.

  14. Zusammenfassung
  15. Dieser sehr kurze Einstieg in die Welt der Rule Engines und das gezeigte Beispiel hat hoffentlich die wichtigsten Eigenschaften und Einsatzbereiche von Drools hervorgehoben und Dich auf den Geschmack gebracht. Die Drools Dokumentation bietet eine gute Gelegenheit sich mit der Rule Engine weiter vertraut zu machen.

Hier können Kommentare abgegeben werden.