From 0b19939bcdf743da913e1374420bc5c03c0568b5 Mon Sep 17 00:00:00 2001 From: felipeazv Date: Sat, 21 Oct 2017 20:20:51 +0200 Subject: [PATCH] BAEL-803: Backward Chaining with Drools (#2741) * spring beans DI examples * fix-1: shortening examples * List of Rules Engines in Java * BAEL-812: Openl-Tablets example added * BAEL-812: artifacts names changed * BAEL-812: moving rule-engines examples to rule-engines folder * BAEL-812: removing evaluation article files * BAEL-812: folder renamed * BAEL-812: folder renamed * BAEL-812: pom.xml - parent added * BAEL-1027: Introduction to GraphQL - initial commit * BAEL-781: Explore the new Spring Cloud Gateway * BAEL-781: Fix UserService.java * BAEL-781: Fix user-service pom.xml * BAEL-781: remove eureka-server from the example * BAEL-781: modifying example * BAEL-803: Backward Chaining wih Drools * BAEL-803: pom.xml --- drools/backward-chaining/pom.xml | 38 ++++++++++++++++ .../com/baeldung/BackwardChainingBeatles.java | 28 ++++++++++++ .../main/java/com/baeldung/model/Beatle.java | 33 ++++++++++++++ .../src/main/resources/META-INF/kmodule.xml | 6 +++ .../resources/backward_chaining/Beatles.drl | 44 +++++++++++++++++++ 5 files changed, 149 insertions(+) create mode 100644 drools/backward-chaining/pom.xml create mode 100644 drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java create mode 100644 drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java create mode 100644 drools/backward-chaining/src/main/resources/META-INF/kmodule.xml create mode 100644 drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl diff --git a/drools/backward-chaining/pom.xml b/drools/backward-chaining/pom.xml new file mode 100644 index 0000000000..bda0cf2abc --- /dev/null +++ b/drools/backward-chaining/pom.xml @@ -0,0 +1,38 @@ + + + + 4.0.0 + + drools-backward-chaining + 1.0 + drools-backward-chaining + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 6.4.0.Final + + + + + org.kie + kie-api + ${runtime.version} + + + org.drools + drools-core + ${runtime.version} + + + org.drools + drools-decisiontables + ${runtime.version} + + + diff --git a/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java b/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java new file mode 100644 index 0000000000..7fc5bd3685 --- /dev/null +++ b/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java @@ -0,0 +1,28 @@ +package com.baeldung; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import com.baeldung.model.Beatle; + +public class BackwardChainingBeatles { + public static void main(String[] args) { + + KieServices ks = KieServices.Factory.get(); + KieContainer kContainer = ks.getKieClasspathContainer(); + KieSession kSession = kContainer.newKieSession("ksession-backward-chaining"); + // drools session base on the xml configuration (kmodule.xml) + + // graph population + kSession.insert(new Beatle("Starr", "drums")); + kSession.insert(new Beatle("McCartney", "bass")); + kSession.insert(new Beatle("Lennon", "guitar")); + kSession.insert(new Beatle("Harrison", "guitar")); + + kSession.insert("Ringo"); // invoke the rule that calls the query implentation of backward chaining + kSession.fireAllRules(); // invoke all the rules + + } + +} \ No newline at end of file diff --git a/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java b/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java new file mode 100644 index 0000000000..4b219b3a69 --- /dev/null +++ b/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java @@ -0,0 +1,33 @@ +package com.baeldung.model; + +import org.kie.api.definition.type.Position; + +public class Beatle { + + @Position(0) + private String lastName; + @Position(1) + private String instrument; + + public Beatle(String lastName, String instrument) { + this.lastName = lastName; + this.instrument = instrument; + } + + public String getInstrument() { + return instrument; + } + + public void setInstrument(String instrument) { + this.instrument = instrument; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} \ No newline at end of file diff --git a/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml b/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml new file mode 100644 index 0000000000..6498e26343 --- /dev/null +++ b/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl b/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl new file mode 100644 index 0000000000..8d0d06a79e --- /dev/null +++ b/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl @@ -0,0 +1,44 @@ +package com.baeldung + +import com.baeldung.model.Beatle; + + +query whichBeatle(String lastName, String instrument) + Beatle(lastName, instrument;) + or + (Beatle(lastName, null;) + and + whichBeatle(null, instrument;)) //recursive call to the function that allows to search in a derivation tree structure +end + +rule "Ringo" + when + String(this == "Ringo") + whichBeatle("Starr", "drums";) + then + System.out.println("The beatle is Ringo Starr"); +end + +rule "Paul" + when + String(this == "Paul") + whichBeatle("McCartney", "bass";) + then + System.out.println("The beatle is Paul McCartney"); +end + +rule "John" + when + String(this == "John") + whichBeatle("Lennon", "guitar";) + then + System.out.println("The beatle is John Lennon"); +end + +rule "George" + when + String(this == "George") + whichBeatle("Harrison", "guitar";) + then + System.out.println("The beatle is George Harrison"); +end