Ein Beispiel für Rückwärtsverkettung in Sabber

Ein Beispiel für die Rückwärtsverkettung in Drools

1. Überblick

In diesem Artikel erfahren Sie, was Rückwärtsverkettung ist und wie wir sie mit Drools verwenden können.

Dieser Artikel ist Teil einer Reihe, in der dieDrools Business Rules Engine vorgestellt werden.

2. Maven-Abhängigkeiten

Beginnen wir mit dem Importieren des Drools-Coredependency:


    org.drools
    drools-core
    7.4.1.Final

3. Vorwärtsverkettung

Bei der Vorwärtsverkettung analysieren wir zunächst die Daten und machen uns auf den Weg zu einer bestimmten Schlussfolgerung.

Ein Beispiel für die Anwendung der Vorwärtsverkettung wäre ein System, das neue Routen entdeckt, indem bereits bekannte Verbindungen zwischen Knoten überprüft werden.

4. Rückwärtsverkettung

Im Gegensatz zur Vorwärtsverkettung sindbackward chaining starts directly with the conclusion (hypothesis) and validates it by backtracking through a sequence of facts.

Beim Vergleich der Vorwärts- und Rückwärtsverkettung werdenthe first one can be described as “data-driven” (data as input), while the latter one can be described as “event(or goal)-driven” (goals as inputs).

Ein Beispiel für die Anwendung der Rückwärtsverkettung wäre die Überprüfung, ob es eine Route gibt, die zwei Knoten verbindet.

5. Sabbert rückwärts Verkettung

Das Drools-Projekt wurde hauptsächlich als Forward Chaining-System entwickelt. Ab Version 5.2.0 wird jedoch auch die Rückwärtsverkettung unterstützt.

Erstellen wir eine einfache Anwendung und versuchen Sie, eine einfache Hypothese zu validieren -if the Great Wall of China is on Planet Earth.

5.1. Die Daten

Erstellen wir eine einfache Faktenbasis, die die Dinge und ihren Standort beschreibt:

  1. Planet Erde

  2. Asien, Planet Erde

  3. China, Asien

  4. Chinesische Mauer, China

5.2. Regeln definieren

Jetzt erstellen wir eine ".drl" -Datei mit dem NamenBackwardChaining.drl, die wir in/resources/com/example/drools/rules/ platzieren. Dieser enthält alle erforderlichen Abfragen und Regeln, die im Beispiel verwendet werden sollen.

Die Hauptabfrage vonbelongsTo, die eine Rückwärtsverkettung verwendet, kann wie folgt geschrieben werden:

query belongsTo(String x, String y)
    Fact(x, y;)
    or
    (Fact(z, y;) and belongsTo(x, z;))
end

Fügen wir außerdem zwei Regeln hinzu, die es ermöglichen, unsere Ergebnisse einfach zu überprüfen:

rule "Great Wall of China BELONGS TO Planet Earth"
when
    belongsTo("Great Wall of China", "Planet Earth";)
then
    result.setValue("Decision one taken: Great Wall of China BELONGS TO Planet Earth");
end

rule "print all facts"
when
    belongsTo(element, place;)
then
    result.addFact(element + " IS ELEMENT OF " + place);
end

5.3. Anwendung erstellen

Jetzt benötigen wir eine Java-Klasse zur Darstellung von Fakten:

public class Fact {

    @Position(0)
    private String element;

    @Position(1)
    private String place;

    // getters, setters, constructors, and other methods ...
}

Hier verwenden wir die Annotation@Position, um der Anwendung mitzuteilen, in welcher Reihenfolge Drools Werte für diese Attribute liefert.

Außerdem erstellen wir das POJO, das die Ergebnisse darstellt:

public class Result {
    private String value;
    private List facts = new ArrayList<>();

    //... getters, setters, constructors, and other methods
}

Und jetzt können wir das Beispiel ausführen:

public class BackwardChainingTest {

    @Before
    public void before() {
        result = new Result();
        ksession = new DroolsBeanFactory().getKieSession();
    }

    @Test
    public void whenWallOfChinaIsGiven_ThenItBelongsToPlanetEarth() {

        ksession.setGlobal("result", result);
        ksession.insert(new Fact("Asia", "Planet Earth"));
        ksession.insert(new Fact("China", "Asia"));
        ksession.insert(new Fact("Great Wall of China", "China"));

        ksession.fireAllRules();

        assertEquals(
          result.getValue(),
          "Decision one taken: Great Wall of China BELONGS TO Planet Earth");
    }
}

Wenn die Testfälle ausgeführt werden, fügen sie die angegebenen Fakten hinzu („Asia belongs to Planet Earth“, „Chinabelongs to Asien“, „Chinesische Mauer gehört zu China“).

Danach werden die Fakten mit den inBackwardChaining.drl beschriebenen Regeln verarbeitet, die eine rekursive AbfragebelongsTo(String x, String y). liefern

Diese Abfrage wird von den Regeln aufgerufen, die eine Rückwärtsverkettung verwenden, um festzustellen, ob die Hypothese (“Great Wall of China BELONGS TO Planet Earth”) wahr oder falsch ist.

6. Fazit

Wir haben eine Übersicht über die Rückwärtsverkettung gezeigt, eine Funktion von Drools, mit der eine Liste von Fakten abgerufen wird, um zu überprüfen, ob eine Entscheidung wahr ist.

Das vollständige Beispiel finden Sie wie immer in unserenGitHub repository.