drools 6.0 (red hat summit)

189
Not Quite There Yet The SkyNet funding bill is passed. The system goes online on August 4th, 1997. Human decisions are removed from strategic defense. SkyNet begins to learn at a geometric rate. It becomes self-aware at 2:14am Eastern time, August 29th In a panic, they try to pull the plug. And, Skynet fights back

Upload: mark-proctor

Post on 23-Jan-2017

20.597 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Drools 6.0 (Red Hat Summit)

Not Quite There Yet•The SkyNet funding bill is passed. !•The system goes online on August 4th, 1997. !•Human decisions are removed from strategic defense. !•SkyNet begins to learn at a geometric rate. !•It becomes self-aware at 2:14am Eastern time, August 29th !•In a panic, they try to pull the plug. !•And, Skynet fights back

Page 2: Drools 6.0 (Red Hat Summit)

Who am I?

• Drools co-founder !

• JBoss (2005) !

• Red Hat (2006) !

• Polymita Acquisition 2012 !

• Red Hat Platform Architect

Page 3: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is EverythingKIE

Drools jBPMOptaPlanner UberFire

Guvnor

Drools-WB jBPM-WB

KIE-WB

Page 4: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is Everything

Page 5: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is Everything

Page 6: Drools 6.0 (Red Hat Summit)

GitHub• URL: • https://github.com/droolsjbpm/ !

• Bootstrap project: • https://github.com/droolsjbpm/droolsjbpm-

build-bootstrap

Page 7: Drools 6.0 (Red Hat Summit)

Serious Bits :)

http://www.youtube.com/watch?v=Omj4PR3v-nI

http://www.youtube.com/watch?v=4CvjKqUOEzM

http://www.youtube.com/watch?v=wORlAZoxttA

Page 8: Drools 6.0 (Red Hat Summit)

Technical Language

Page 9: Drools 6.0 (Red Hat Summit)

9

Classes

Account

long accountNo

int balance

CashFlow

Date date

int amount

AccountPeriod

Date start

Date end

CashFlow Example

Page 10: Drools 6.0 (Red Hat Summit)

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end

10

acc.balance += cf.amount

CashFlow Rule

Page 11: Drools 6.0 (Red Hat Summit)

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end

11

acc.balance += cf.amount

CashFlow Rule

Page 12: Drools 6.0 (Red Hat Summit)

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end

12

acc.balance += cf.amount

CashFlow Rule

Page 13: Drools 6.0 (Red Hat Summit)

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end

13

acc.balance += cf.amount

CashFlow Rule

Page 14: Drools 6.0 (Red Hat Summit)

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account() cf : CashFlow( type == CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end ) then acc.balance += cf.amount; end

14

acc.balance += cf.amount

CashFlow Rule

Page 15: Drools 6.0 (Red Hat Summit)

15

rule "Increase balance for AccountPeriod Credits"when ap : AccountPeriod( ) acnt : Account( ) cf : CashFlow( type == CashFlowType.CREDIT, accountNo == acnt.accountNo, date >= ap.start && <= ap.end ) then modify(acnt) { balance = acnt.balance + cf.amount; }end

rule "Decrease balance for AccountPeriod Debits"when ap : AccountPeriod( ) acnt : Account( ) cf : CashFlow( type == CashFlowType.DEBIT, accountNo == acnt.accountNo, date >= ap.start && <= ap.end ) then modify(acnt) { balance = acnt.balance - cf.amount }end

CashFlow

date amount type accountNo

12-Jan-12 100 CREDIT 1

2-Feb-12 200 DEBIT 1

18-May-12 50 CREDIT 1

9-Mar-12 75 CREDIT 1

AccountingPeriod

start end

01-JAN-2012 31-MAR-2012

Account

accountNo balance

1 0

CashFlow

date amount type accountNo

12-Jan-12 100 CREDIT 1

9-Mar-12 75 CREDIT 1

CashFlow

date amount type accountNo

2-Feb-12 200 DEBIT 1

Account

accountNo balance

1 -25

CashFlow Example

Page 16: Drools 6.0 (Red Hat Summit)

16

rule "Print balance for AccountPeriod" salience -50 when ap : AccountPeriod() acnt : Account( )then System.out.println( "Account Number " + acnt.accountNo + " balance " + acnt.balance );end

Agenda

1 increase balance

arbitrary2 decrease balance

3 increase balance

4 print balance

CashFlow Example

Page 17: Drools 6.0 (Red Hat Summit)

CashFlow Examplerule “Account in Negative send Warning"when ap : AccountPeriod() acnt : Account( balance < 0 )then insert( new NegativeWarning( acnt ) );end

Page 18: Drools 6.0 (Red Hat Summit)

Accumulaterule “accumulate"when acc( b : Bus( color == “red” ); sumTakings : sum(b.takings);)then System.out.println( “sum is " + sumTakings );end

acc( b : Bus( color == “red” ); sumTakings : sum(b.takings), minTakings : min(b.takings), maxTakings : max(b.takings); minTakings < 100 and maxTakings < 200;)

Page 19: Drools 6.0 (Red Hat Summit)

CashFlow Examplerule “Account in Negative send Warning"when ap : AccountPeriod() acnt : Account( balance < 0 )then insert( new NegativeWarning( acnt ) );end

rule “Issue Warning"when ap : AccountPeriod() acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ); totalWarnings : count(n); totalWarnings > 0; )then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ + totalWarnings ); ! insert( TotalWarnings( acnt, totalWarnings );end

Page 20: Drools 6.0 (Red Hat Summit)

Conditional Elementsnot Bus ( color == “red” ) !!exists Bus ( color == “red” ) !!forall ( Bus ( color == “red” ) !!forall ( b : Bus ( floors == 2 ) Bus( this == b, color == “red” ) )

Page 21: Drools 6.0 (Red Hat Summit)

CashFlow Examplerule “Issue Warning"when ap : AccountPeriod() acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ); totalWarnings : count(n); totalWarnings > 0; )then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ totalWarnings ); ! insert( TotalWarnings( acnt, totalWarnings );end

rule “Cleanup Warnings"when ap : AccountPeriod() acnt : Account( balance >= 0 ) exists( NegativeWarning( account == acnt ) ) n : NegativeWarning( account == acnt )then delete( n );end

Page 22: Drools 6.0 (Red Hat Summit)

CashFlow Example

rule “Fine"when ap : AccountPeriod() acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ) over window:time(4w); totalWarnings : count(n); totalWarnings > 3 ) TotalWarnings( total < totalWarnings )then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + Warnings “ totalWarnings );end

rule “Issue Warning"when ap : AccountPeriod() acnt : Account( balance < 0 ) acc( n : NegativeWarning( account == acnt ) over window:time(4w); totalWarnings : count(n); totalWarnings > 0; )then System.out.println( "Account warning Number " + acnt.accountNo + " balance " + acnt.balance + “ Warnings “ totalWarnings ); ! insertLogical( new TotalWarnings( acnt, totalWarnings );end

Page 23: Drools 6.0 (Red Hat Summit)

Graphical Editors

Page 24: Drools 6.0 (Red Hat Summit)

Data Modeller

Page 25: Drools 6.0 (Red Hat Summit)

Guided Editors

Page 26: Drools 6.0 (Red Hat Summit)

Decision Table (Extended)

Page 27: Drools 6.0 (Red Hat Summit)

Decision Table (Extended)

Page 28: Drools 6.0 (Red Hat Summit)

Decision Table (Square)

Page 29: Drools 6.0 (Red Hat Summit)

Rule Templates

Page 30: Drools 6.0 (Red Hat Summit)

Rule Templates

Page 31: Drools 6.0 (Red Hat Summit)

Decision Table Wizards

Page 32: Drools 6.0 (Red Hat Summit)

Score Cards• a) Setup Parameters • b) Characteristic Section

Page 33: Drools 6.0 (Red Hat Summit)

Score Cards• UI Generates PMML • DRL Generated from PMML • DRL results in

• Calculated Score • Ranked Reason Codes

• Can import PMML 4.1 • but not exposed yet

• Calculated Scores • Currently Summations • Weight coming

• Not in PMML standard

Page 34: Drools 6.0 (Red Hat Summit)

Scenarios

Page 35: Drools 6.0 (Red Hat Summit)

Architecture

Page 36: Drools 6.0 (Red Hat Summit)

GIT + Maven

Organization Unit

GITRepository

GITRepository

Projects Projects Projects

GITRepository

Page 37: Drools 6.0 (Red Hat Summit)

KIE Installation

KIE Installation

Organization Unit

GITRepository Reposiotry

Projects Projects Projects

GITRepository

Organization Unit

GITRepository Reposiotry

Projects Projects Projects

GITRepository

Organization Unit

GITRepository

GITRepository

Projects Projects Projects

GITRepository

Page 38: Drools 6.0 (Red Hat Summit)

Application Architecture

KIE InstallationApplication Installation

Maven Repository

(local)

ApplicationProject

mvn install mvn install

Maven Repository

(local)

Maven Repository (remote)

mvn deployH

ttp

Page 39: Drools 6.0 (Red Hat Summit)

Workbench

Page 40: Drools 6.0 (Red Hat Summit)

5.x Critique

Page 41: Drools 6.0 (Red Hat Summit)

5.x CritiqueJCR • Performance Issues • Everything stored as blob

• No tagging, branching etc.

• Webdav • Limited team providers

Content • Single tree structure (packages) • Packages created project

deployment units • No easy rule use • Loading “model” jars into

packages

UI • Not easily extended • Fixed layouts • No perspectives • Hard to change • Too many hacks

Deployment • Binary blobs, on url • Simple Snapshot system • No real methodology • Doesn’t align with any industry standards

Page 42: Drools 6.0 (Red Hat Summit)

UF UberFire

Page 43: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is Everything

Page 44: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is Everything

Page 45: Drools 6.0 (Red Hat Summit)

KIE - Knowledge Is Everything

Page 46: Drools 6.0 (Red Hat Summit)

UberFire Architecture Overview

Page 47: Drools 6.0 (Red Hat Summit)

High Availability

Page 48: Drools 6.0 (Red Hat Summit)

Workbench Screens

Page 49: Drools 6.0 (Red Hat Summit)

Workbench Screens• Workbench Screen

• DIV • Lifecycle events

• OnStartUp, OnShutDown • OnOpen, OnMayClose, OnClose • OnFocus, OnLostFocus

Page 50: Drools 6.0 (Red Hat Summit)

Workbench Screens

@WorkbenchScreen(identifier = "MyFirstPanel")!public class MyFirstPanel extends SimplePanel {!! public MyFirstPanel() {! setWidget( new Label("Hello World 1") );! }!! @WorkbenchPartTitle! public String myTitle() {! return "My First Panel!";! }!!}

Page 51: Drools 6.0 (Red Hat Summit)

Workbench Editor

Page 52: Drools 6.0 (Red Hat Summit)

Workbench Editor• Workbench Screen

• DIV • Lifecycle events

• OnStartUp, OnShutDown • OnOpen, OnMayClose, OnClose • OnFocus, OnLostFocus • IsDirty, OnSave

Page 53: Drools 6.0 (Red Hat Summit)

Life Cycle Annotation@WorkbenchEditor(identifier = "TextEditor", ! supportedTypes = { TextResourceType.class, ! DotResourceType.class }) public class TextEditorPresenter { (...)

@OnStart public void onStart( final Path path ) { this.path = path; }

@OnSave public void onSave() {! }

@IsDirty public boolean isDirty() { return view.isDirty(); } }

Page 54: Drools 6.0 (Red Hat Summit)

Life Cycle Annotation@WorkbenchEditor(identifier = "TextEditor", ! supportedTypes = { TextResourceType.class, ! DotResourceType.class }) public class TextEditorPresenter { (...)

@OnStart public void onStart( final Path path ) { this.path = path; }

@OnSave public void onSave() {! }

@IsDirty public boolean isDirty() { return view.isDirty(); } }

Page 55: Drools 6.0 (Red Hat Summit)

Workbench Perspective

Page 56: Drools 6.0 (Red Hat Summit)

Workbench Perspective$registerPerspective({ "id": "Markdown Editor", "view": { "parts": [ { "place": "MarkdownLiveViewer", "parameters": {} } ], "panels": [ { "width": 600, "min_width": 300, "position": "west", "parts": [ { "place": "MarkdownLiveEditor", "parameters": {} } ] } ] }, on_close: function () { }});

Page 57: Drools 6.0 (Red Hat Summit)

Workbench Home Page

Page 58: Drools 6.0 (Red Hat Summit)

Helpful InfoPops

Page 59: Drools 6.0 (Red Hat Summit)
Page 60: Drools 6.0 (Red Hat Summit)

Authoring Perspective

Project ExplorerUse the project explorer to navigate projects for your organizational’s repository and create assets to author.

ProblemsWhen you save, validation errors for the current project are shown here

Content AreaOpened assets are added here

Page 61: Drools 6.0 (Red Hat Summit)

Tab Stack

Tab Stack ButtonClick the button to see the list of opened assets

Asset ListThe opened assets are shown here. Click to continue authoring.

Page 62: Drools 6.0 (Red Hat Summit)

Project Explorer

Organizational UnitLists the organizational units.

RepositoriesLists the repositories for the selected organisational unit.

ProjectsLists the projects for the selected repository.

Folder NavigationClick to expand, to see folders.

Page 63: Drools 6.0 (Red Hat Summit)

Project View

Show as Folders

Show as LinksCompact view, that displays the folders as a single line path.

Project ViewThe project view is a simplified and hides many technical aspects of the project. Such as merging multiple paths into one tree.

Shows the project folders using a tree view.

Page 64: Drools 6.0 (Red Hat Summit)

Repository ViewRepository ViewThe repository view provides raw access to the project structure and files, nothing is hidden. And all paths are visible separately; see the java and resources folders.

Show as Folders

Show as LinksCompact view, that displays the folders as a single line path.

Shows the project folders using a tree view.

Page 65: Drools 6.0 (Red Hat Summit)
Page 66: Drools 6.0 (Red Hat Summit)
Page 67: Drools 6.0 (Red Hat Summit)

New Projects and Other Items

New Projects

Launches the new project wizard. Once created it appears under the project list for the target repository

Page 68: Drools 6.0 (Red Hat Summit)

Project Editor

Page 69: Drools 6.0 (Red Hat Summit)

Project Dependencies

Page 70: Drools 6.0 (Red Hat Summit)

Build and Deploy

Page 71: Drools 6.0 (Red Hat Summit)

Repository Manager

Page 72: Drools 6.0 (Red Hat Summit)

Repository Manager

Page 73: Drools 6.0 (Red Hat Summit)

GIT RepositoriesRepositoriesCreate or clone GIT repositories

Page 74: Drools 6.0 (Red Hat Summit)

Organizational UnitsManage Organizational UnitsCreate Organizational Units and associate repositories with them.

Page 75: Drools 6.0 (Red Hat Summit)

End Users - Task Lists

Page 76: Drools 6.0 (Red Hat Summit)

End Users - Task Lists

Page 77: Drools 6.0 (Red Hat Summit)

Videos

Page 78: Drools 6.0 (Red Hat Summit)

KIE Workbench Videoshttp://www.youtube.com/watch?v=vj3MNmiUnvY&index=2&list=PLb9jQNHBKBRj9IJkc_F5nCJAvXaegOGW8

Page 79: Drools 6.0 (Red Hat Summit)

Drools Editor Videoshttp://www.youtube.com/playlist?list=PLb9jQNHBKBRipbtadRC-UaUObjwp0aBHJ

Page 80: Drools 6.0 (Red Hat Summit)
Page 81: Drools 6.0 (Red Hat Summit)
Page 82: Drools 6.0 (Red Hat Summit)
Page 83: Drools 6.0 (Red Hat Summit)

Build Deploy Utilize API

Page 84: Drools 6.0 (Red Hat Summit)

BRMS 5.0 Programmatic APIKnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.batch().add( newClassPathResource( "Model.drl", getClass() ), DRL ) .add( newClassPathResource( "Queries.drl", getClass() ), DRL ) .add( newClassPathResource( "General.drl", getClass() ), DRL ) .add( newClassPathResource( "Response.drl", getClass() ), DRL ) .add( newClassPathResource( "Events.drl", getClass() ), DRL ) .add( newClassPathResource( "UiView.drl", getClass() ), DRL ) .add( newClassPathResource( "Commands.drl", getClass() ), DRL ).build();if ( kbuilder.hasErrors() ) { System.out.println( kbuilder.getErrors().toString() ); System.exit( 1 );} KieBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();kbaseConf.setOption( EqualityBehaviorOption.EQUALITY ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );Counter c = new Counter();ksession = kbase.newStatefulKnowledgeSession();

Page 85: Drools 6.0 (Red Hat Summit)

KieModules• Discovery • META-INF/kmodule.xml

• Convention based • No programmatic api for building • Multiple Named entities • Inheritence of Resources • Defaults for lazy people • Version built in a standard

Page 86: Drools 6.0 (Red Hat Summit)

Git Hub Examples• https://github.com/droolsjbpm/drools/tree/master/drools-

examples-api

Page 87: Drools 6.0 (Red Hat Summit)

KieModules

<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/kie/6.0.0/kmodule"> </kmodule>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Page 88: Drools 6.0 (Red Hat Summit)

KieModules• Named Entities and JAR on Classpath • Creates one KieBase • Includes resources from package matching

kbase name

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="kbase1"> <ksession name="ksession1"/> </kbase> </kmodule>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession kSession = kContainer.newKieSession("ksession1");kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Page 89: Drools 6.0 (Red Hat Summit)

KieModules• Named Entities, with inheritence and JAR on

Classpath • Two projects, one “includes” from the other<dependency> <groupId>org.drools</groupId> <artifactId>named-kiesession</artifactId> <version>6.0.0-SNAPSHOT</version> </dependency>

<kbase name="kbase2" includes="kbase1"> <ksession name="ksession2"/></kbase>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession kSession = kContainer.newKieSession("ksession2");kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();kSession.insert(new Message("Dave", "Open the pod bay doors, HAL."));kSession.fireAllRules();

Page 90: Drools 6.0 (Red Hat Summit)

KieModules• Package location can over-ride kbase name defaults

<kbase name="WumpusMainKB" packages="org.drools.games.wumpus.server, org.drools.games.wumpus.server.view"> <ksession name="WumpusMainKS" /> </kbase> <kbase name="WumpusClientKB" packages="org.drools.games.wumpus.client"> <ksession name="WumpusClientKS"/> </kbase>

KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();final KieSession serverKsession = kc.newKieSession( "WumpusMainKS"); final KieSession clientKsession = kc.newKieSession("WumpusClientKS");

Page 91: Drools 6.0 (Red Hat Summit)

Dynamic KieModules• JARs can be loaded from URLs into KieRepository • Once loaded they can be resolved via ReleaseId

KieServices ks = KieServices.Factory.get();KieRepository kr = ks.getRepository();KieModule kModule = kr.addKieModule(ks.getResources().newFileSystemResource( getFile("default-kiesession")));KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?"); kSession.insert(msg1);kSession.fireAllRules();

Page 92: Drools 6.0 (Red Hat Summit)

Dynamic KieModules• kie-ci use embedded maven for remote

discovery<dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> </dependency>

KieServices ks = KieServices.Factory.get();// Install example1 in the local maven repo before to do thisKieContainer kContainer = ks.newKieContainer( ks.newReleaseId("org.drools", "named-kiesession", "6.0.0-SNAPSHOT"));KieSession kSession = kContainer.newKieSession("ksession1");kSession.setGlobal("out", out);Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?"); kSession.insert(msg1);kSession.fireAllRules();

Page 93: Drools 6.0 (Red Hat Summit)

Dynamic KieModules// create a new kjarInternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3"); // deploy it on mavenrepository.deployArtifact(releaseId, kJar2, kPom);// since I am not calling start() on the scanner it means it won't have automatic scheduled scanningKieScanner scanner = ks.newKieScanner(kieContainer);// scan the maven repo to get the new kjar version and deploy it on the kcontainerscanner.scanNow();// create a ksesion and check it works as expectedKieSession ksession2 = kieContainer.newKieSession("KSession1");checkKSession(ksession2, "rule2", "rule3");

Page 94: Drools 6.0 (Red Hat Summit)

Maven Versions• <version>1.0.1</version> • <version>[1.0.0,2.0.0)</version> • <version>[1.0.0,)</version> • <version>LATEST</version> • <version>RELEASE</version> • <version>SNAPSHOT</version>

Page 95: Drools 6.0 (Red Hat Summit)

kmodule.xml Editor

Page 96: Drools 6.0 (Red Hat Summit)

Programmatic API• Builder API, for tooling integration • Incremental compilation, and problem

reportingKieServices ks = KieServices.Factory.get();KieRepository kr = ks.getRepository();KieFileSystem kfs = ks.newKieFileSystem();kfs.write("src/main/resources/org/kie/example5/HAL5.drl", getRule());KieBuilder kb = ks.newKieBuilder(kfs);kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built.if (kb.getResults().hasMessages(Level.ERROR)) { throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());} KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Page 97: Drools 6.0 (Red Hat Summit)

CDI

Page 98: Drools 6.0 (Red Hat Summit)

CDI Context and Dependency • CDI injects named entities from the

kmodule.xml !

• Injectable types • KieServices • KieContainer • KieBase • KieSession • StatelessKieSession

Page 99: Drools 6.0 (Red Hat Summit)

KBase

@Inject @KBase(value="jar1.KBase1", name="kb2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase jar1KBase1kb2; @Inject@KBase(value="jar1.KBase1", name="kb2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase jar1KBase1kb22;

@Injectprivate KieBase defaultClassPathKBase; @Inject@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase defaultDynamicKBase;

@Inject@KBase("jar1.KBase1") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase jar1KBase1v10; @Inject@KBase("jar1.KBase1") @KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1") private KieBase jar1KBase1v11; @Inject@KBase(value="jar1.KBase1", name="kb1") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase jar1KBase1kb1;

Page 100: Drools 6.0 (Red Hat Summit)

KSession@Inject@KSession("jar1.KSession2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" ) private KieSession kbase1ksession2v10; @Inject@KSession("jar1.KSession2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1" ) private KieSession kbase1ksession2v11;

@Inject@KSession(value="jar1.KSession2", name="ks1") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" ) private KieSession kbase1ksession2ks1; @Inject@KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" ) private KieSession kbase1ksession2ks2 ; @Inject@KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" ) private KieSession kbase1ksession2ks22;

Page 101: Drools 6.0 (Red Hat Summit)

Spring and Camel

Page 102: Drools 6.0 (Red Hat Summit)

Spring and Camel<kie:kmodule id="CxfRsSpring"> <kie:kbase name="test1" packages="test1"> <kie:ksession name="ksession1"> <kie:batch> <kie:set-global identifier="list" > <bean class="java.util.ArrayList" /> </kie:set-global> </kie:batch> </kie:ksession> <kie:ksession name="ksession2"/> </kie:kbase> </kie:kmodule>

Page 103: Drools 6.0 (Red Hat Summit)

Spring and Camel<bean id="kiePolicy" class="org.kie.camel.component.KiePolicy" /> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="cxfrs://bean://rsServer"/> <policy ref="kiePolicy"> <unmarshal ref="xstream" /> <to uri="kie:ksession1" /> <marshal ref="xstream" /> </policy> </route> <route id="x1"> <from uri="direct://http"/> <policy ref="kiePolicy"> <to uri="cxfrs://http://localhost:58001/rest"/> </policy> </route> </camelContext>

Page 104: Drools 6.0 (Red Hat Summit)

104

Questions?

• Dave Bowman: All right, HAL; I'll go in through the emergency airlock.

• HAL: Without your space helmet, Dave, you're going to find that rather difficult.

• Dave Bowman: HAL, I won't argue with you anymore! Open the doors!

• HAL: Dave, this conversation can serve no purpose anymore. Goodbye.

Joshya: Greetings, Professor Falken. Falken: Hello, Joshua. Joshya: A strange game. The only winning move is not to play. How about a nice game of chess?

Page 105: Drools 6.0 (Red Hat Summit)

R.I.P Rete Time to get Phreaky

Page 106: Drools 6.0 (Red Hat Summit)

Rete

Page 107: Drools 6.0 (Red Hat Summit)

ReteOO• Node sharing • Alpha indexing • Tree based graphs • Modify-in-place • Property reactive • Sub-networks • Backward Chaining • Lazy Truth Maintenance • Heap based agenda • Dynamic Rules

Page 108: Drools 6.0 (Red Hat Summit)

R.I.P RETE Time to get Phreakyinspirations: • Leaps, Collection Oriented Match, L/R Unlinking !

New Innovations • Full Rule, and Rule Segment Unlinking • Lazy Evaluation, with Rule scoping • Set propagations !

Previous Innovations • Modify In Place • Property Reactive • Tree Based Graphs • Subnetwork support

Page 109: Drools 6.0 (Red Hat Summit)

Phreak

Page 110: Drools 6.0 (Red Hat Summit)

Phreak

Page 111: Drools 6.0 (Red Hat Summit)

Phreak

Page 112: Drools 6.0 (Red Hat Summit)

TMS

Page 113: Drools 6.0 (Red Hat Summit)

Justification-based Truth • Drools 5.x

• Simple logical insertion TMS, like Clips, Jess and others. !

• Drools 6.0 • Contradiction handling with JTMS

• Clean separation of exception logic • TMS now has pluggable Belief System

• Simple TMS support • JTMS now possible (exp) • Defeasible Logic (exp) !

• See drools-compiler • JTMSTest for lots of example tests

Page 114: Drools 6.0 (Red Hat Summit)

114

TMSCouples the logic

What happens when the Child stops being 16?

rule "Issue Child Bus Pass" when $p : Person( age < 16 ) then insert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" when $p : Person( age >= 16 ) then insert(new AdultBusPass( $p ) ); end

Page 115: Drools 6.0 (Red Hat Summit)

TMS• Bad • Monolithic • Leaky • Brittle integrity - manual maintenance

Page 116: Drools 6.0 (Red Hat Summit)

116

TMS

de-couples the logic

Maintains the truth by automatically retracting

•A rule “logically” inserts an object

•When the rule is no longer true, the object is retracted. rule "IsChild" when $p : Person( age < 16 ) then logicalInsert( new IsChild( $p ) ) end rule "IsAdult" when $p : Person( age >= 16 ) then logicalInsert( new IsAdult( $p ) ) end

Page 117: Drools 6.0 (Red Hat Summit)

117

TMS

The truth maintenance cascades

rule "Issue Child Bus Pass" when $p : Person( ) IsChild( person =$p ) then logicalInsert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" when $p : Person() IsAdult( person =$p ) then logicalInsert(new AdultBusPass( $p ) ); end

Page 118: Drools 6.0 (Red Hat Summit)

118

TMSrule "Issue Child Bus Pass" when $p : Person( ) not( ChildBusPass( person == $p ) ) then requestChildBusPass( $p ); end The truth maintenance cascades

Page 119: Drools 6.0 (Red Hat Summit)

119

TMS• Good • De-couple knowledge responsibilities • Encapsulate knowledge • Provide semantic abstractions for those encapsulation • Integrity robustness – truth maintenance

Page 120: Drools 6.0 (Red Hat Summit)

TMS

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Page 121: Drools 6.0 (Red Hat Summit)

JTMS

Page 122: Drools 6.0 (Red Hat Summit)

JTMSrule "Do not issue to banned people" when $p : Person( ) Banned( person =$p ) then logicalInsert(new ChildBusPass( $p ) , “neg” ); end

“plus” and “neg” labels

Page 123: Drools 6.0 (Red Hat Summit)

JTMS

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Rule : Do Not Issue to Banned People

-

Page 124: Drools 6.0 (Red Hat Summit)

Defeasible

Page 125: Drools 6.0 (Red Hat Summit)

Defeasiblerule "All Birds Fly" when $b : Bird( ) then logicalInsert(new Fly( $b ) ); end rule "Brocken wing" when $b : Bird( ) BrockenWing($b;) then logicalInsert(new Fly( $b ), “neg” ); end

Page 126: Drools 6.0 (Red Hat Summit)

Defeasiblerule "All Birds Fly" @Defeasible

when

$b : Bird( )

then

logicalInsert(new Fly( $b ) );

end

rule "Brocken wing" @Defeasible

@Defeater

when

$b : Bird( )

BrockenWing($b;)

then

logicalInsert(new Fly( $b ), “neg” );

end

rule "Birds With Rockets Fly"@Defeasible

@Defeats(“Brocken Wing”)

when

$b : Bird( )

Rocket($b;)

then

logicalInsert(new Fly( $b ) );

end

Page 127: Drools 6.0 (Red Hat Summit)

Decision Tables

Page 128: Drools 6.0 (Red Hat Summit)

Decision Table

Page 129: Drools 6.0 (Red Hat Summit)

Decision Table

Page 130: Drools 6.0 (Red Hat Summit)

Decision Table

Page 131: Drools 6.0 (Red Hat Summit)

Decision Table

Page 132: Drools 6.0 (Red Hat Summit)

Decision Table

Page 133: Drools 6.0 (Red Hat Summit)

Decision Table

Page 134: Drools 6.0 (Red Hat Summit)

Decision Table

Page 135: Drools 6.0 (Red Hat Summit)

Decision Table

Page 136: Drools 6.0 (Red Hat Summit)

Decision Table

Page 137: Drools 6.0 (Red Hat Summit)

Decision Table

Page 138: Drools 6.0 (Red Hat Summit)

Redundancy - Subsumption

Page 139: Drools 6.0 (Red Hat Summit)

Deficiency• Deficiency • Premium is £500 if applicant age is less than 30 • Premium is £300 if Years Without Claim is greater than or

equal to 10 years. !!!!!

• Applicant is 29, premium is £500 • Applicant has 12 years without claim, premium is £300 • Applicant is 29 with 12 years without claim, premium

is ?!?

Page 140: Drools 6.0 (Red Hat Summit)

Property Reactive

Page 141: Drools 6.0 (Red Hat Summit)

Loop Problem

rule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end!!!!!!

Page 142: Drools 6.0 (Red Hat Summit)

Loop Problem

rule “Salary award for min 2 years service” no-loop when ! e : Employee( lengthOfService > 2 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end!!!!!!

Page 143: Drools 6.0 (Red Hat Summit)

Loop Problem

rule “Salary award for min 2 years service” no-loop when ! e : Employee( lengthOfService > 2 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end!!rule “Salary award for min 8 years service” no-loop when ! e : Employee( lengthOfService > 8 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end

Page 144: Drools 6.0 (Red Hat Summit)

Loop Problemrule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )! not SalaryMin2Years( employee == e )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin2Years(e) );!end!!rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )! not SalaryMin8Years( employee == e )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin8Years(e) );!end

Page 145: Drools 6.0 (Red Hat Summit)

Loop Problemrule “Year End” when ! d : ChangeDate( )! e : Employee( )!then ! modify( e ) { lengthOfService( ! d.getYear() - e.getStartYear() ) };!end!!rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )! not SalaryMin8Years( employee == e )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };! insert ( new SalaryMin8Years(e) );!end

Page 146: Drools 6.0 (Red Hat Summit)

RefractionThis term comes from the neurobiological observation of a refractory period for a neuron, which means that the neuron is not able to fire immediately without first going through a relaxation process. !In a similar way, OPS5 will not allow the same instantiation in the conflict set from firing twice in a row. This prevents the inference engine from entering into an infinite loop.

Page 147: Drools 6.0 (Red Hat Summit)

W3C RIF Refraction• Refraction

When a rule instance is fired, it is removed from the conflict set (and thus will not be created again even its condition part remains true), unless one of the objects in its condition part is modified again. In the later case, the repeatability concept determines how the rule instance is treated

Page 148: Drools 6.0 (Red Hat Summit)

W3C RIF Refraction• Repeatability

After the execution of a rule instance, the rule instance is removed from the conflict set by the refraction. Later on, if one of the objects in the condition part is modified and if the rule evaluates to true, the repeatability controls whether if the rule instance can be created again.

Page 149: Drools 6.0 (Red Hat Summit)

Loop Problem (Refraction)rule “Salary award for min 2 years service” ! repeatable false when ! e : Employee( lengthOfService > 2 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end!!rule “Salary award for min 8 years service” ! repeatable false when ! e : Employee( lengthOfService > 8 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end

Page 150: Drools 6.0 (Red Hat Summit)

AAAAAAhhhhhhhhhh

Page 151: Drools 6.0 (Red Hat Summit)
Page 152: Drools 6.0 (Red Hat Summit)

Annotate Class

@PropertyReactive!public class Employee {! int salary;! int lengthOfService!! // getters and setters below!}

Page 153: Drools 6.0 (Red Hat Summit)

Loop Problem Fixed

rule “Salary award for min 2 years service” when ! e : Employee( lengthOfService > 2 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end!!rule “Salary award for min 8 years service” when ! e : Employee( lengthOfService > 8 )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end

Page 154: Drools 6.0 (Red Hat Summit)

@Watch

rule “Salary award for min 2 years service” when ! e : Employee( salary < 1000, lengthOfService > 2 )! @Watch( !salary )!then ! modify( e ) { setSalary( e.getSalary() * 1.05 ) };!end

Page 155: Drools 6.0 (Red Hat Summit)

@Watch

rule “Record Salary Changes” when ! e : Employee( ) @Watch( salary )!then ! insert( new SalaryChange( e, e.getSalary() );!end

Page 156: Drools 6.0 (Red Hat Summit)

@Watch

@Watch( salary, lengthOfService, age )!!@Watch( * )!!@Watch( !* )!!@Watch( *, !salary )!!@Watch( !*, salary )

Page 157: Drools 6.0 (Red Hat Summit)

Backward Chaining

Page 158: Drools 6.0 (Red Hat Summit)

158

Reasoning with Graphs

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 159: Drools 6.0 (Red Hat Summit)

159

Backward Chaining

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 160: Drools 6.0 (Red Hat Summit)

Backward Chaining160

ksession.insert( new Location("Office", "House") );ksession.insert( new Location("Kitchen", "House") );ksession.insert( new Location("Knife", "Kitchen") );ksession.insert( new Location("Cheese", "Kitchen") );ksession.insert( new Location("Desk", "Office") );ksession.insert( new Location("Chair", "Office") );ksession.insert( new Location("Computer", "Desk") );ksession.insert( new Location("Draw", "Desk") );

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 161: Drools 6.0 (Red Hat Summit)

Backward Chaining161

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 162: Drools 6.0 (Red Hat Summit)

Backward Chaining162

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 163: Drools 6.0 (Red Hat Summit)

Backward Chaining163

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 164: Drools 6.0 (Red Hat Summit)

Backward Chaining164

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

ksession.insert( "go1" );ksession.fireAllRules(); --- go1 office is in the house

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 165: Drools 6.0 (Red Hat Summit)

Backward Chaining165

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

ksession.insert( "go1" );ksession.fireAllRules(); --- go1 office is in the house

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

isContainedIn(x==Office, y==House)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 166: Drools 6.0 (Red Hat Summit)

Backward Chaining166

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10 when $s : String( )then System.out.println( $s );end

ksession.insert( "go1" );ksession.fireAllRules(); --- go1 office is in the house

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(x==Office, y==House)isContainedIn(x==Office, y==House)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 167: Drools 6.0 (Red Hat Summit)

Backward Chaining167

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 168: Drools 6.0 (Red Hat Summit)

Backward Chaining168

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 169: Drools 6.0 (Red Hat Summit)

Backward Chaining169

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 170: Drools 6.0 (Red Hat Summit)

Backward Chaining170

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

isContainedIn(x==Draw, y==House)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 171: Drools 6.0 (Red Hat Summit)

Backward Chaining171

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(z==Office, y==House)isContainedIn(x==Draw, y==House)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 172: Drools 6.0 (Red Hat Summit)

Backward Chaining172

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(z==Office, y==House)isContainedIn(x==Draw, z==Office)

isContainedIn(x==Draw, y==House)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 173: Drools 6.0 (Red Hat Summit)

Backward Chaining173

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(z==Office, y==House)isContainedIn(x==Draw, z==Office)

Location(z==Kitchen, y==House)isContainedIn(x==Draw, z==Kitchen)

isContainedIn(x==Draw, y==House)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 174: Drools 6.0 (Red Hat Summit)

Backward Chaining174

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

isContainedIn(x==Draw, y==Office)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 175: Drools 6.0 (Red Hat Summit)

Backward Chaining175

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(z==Desk, y==Office)isContainedIn(x==Draw, y==Office)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 176: Drools 6.0 (Red Hat Summit)

Backward Chaining176

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(z==Desk, y==Office)isContainedIn(x==Draw, z==Desk)

isContainedIn(x==Draw, y==Office)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 177: Drools 6.0 (Red Hat Summit)

Backward Chaining177

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

isContainedIn(x==Draw, y==Desk)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 178: Drools 6.0 (Red Hat Summit)

Backward Chaining178

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" ); end

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Location(x==Draw, y==Desk)isContainedIn(x==Draw, y==Desk)

ksession.insert( "go2" );ksession.fireAllRules(); --- go2 Draw in the House

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 179: Drools 6.0 (Red Hat Summit)

Backward Chaining179

rule "go3"when String( this == "go3" ) isContainedIn("Key", "Office"; )then System.out.println( "Key in the Office" ); end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 180: Drools 6.0 (Red Hat Summit)

Backward Chaining180

rule "go3"when String( this == "go3" ) isContainedIn("Key", "Office"; )then System.out.println( "Key in the Office" ); end

ksession.insert( "go3" );ksession.fireAllRules(); --- go3

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 181: Drools 6.0 (Red Hat Summit)

Backward Chaining181

rule "go3"when String( this == "go3" ) isContainedIn("Key", "Office"; )then System.out.println( "Key in the Office" ); end

ksession.insert( "go3" );ksession.fireAllRules(); --- go3

ksession.insert( new Location("Key", "Draw") );ksession.fireAllRules(); --- Key in the Office

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 182: Drools 6.0 (Red Hat Summit)

Backward Chaining182

rule "go4"when String( this == "go4" ) isContainedIn(thing, "Office"; )then System.out.println( "thing " + thing + " is in the Office" ); end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 183: Drools 6.0 (Red Hat Summit)

Backward Chaining183

rule "go4"when String( this == "go4" ) isContainedIn(thing, "Office"; )then System.out.println( "thing " + thing + " is in the Office" ); end

Out Var (unbound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 184: Drools 6.0 (Red Hat Summit)

Backward Chaining184

rule "go4"when String( this == "go4" ) isContainedIn(thing, "Office"; )then System.out.println( "thing " + thing + " is in the Office" ); end

ksession.insert( "go4" );ksession.fireAllRules(); --- go4 thing Key is in the Office thing Computer is in the Office thing Draw is in the Office thing Desk is in the Office thing Chair is in the Office

Out Var (unbound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 185: Drools 6.0 (Red Hat Summit)

Backward Chaining185

rule "go5"when String( this == "go5" ) isContainedIn(thing, location; )then System.out.println( "thing " + thing + " is in " + location );end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 186: Drools 6.0 (Red Hat Summit)

Backward Chaining186

rule "go5"when String( this == "go5" ) isContainedIn(thing, location; )then System.out.println( "thing " + thing + " is in " + location );end

Out Var (unbound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 187: Drools 6.0 (Red Hat Summit)

Backward Chaining187

rule "go5"when String( this == "go5" ) isContainedIn(thing, location; )then System.out.println( "thing " + thing + " is in " + location );end

Out Var (unbound) Out Var

(unbound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 188: Drools 6.0 (Red Hat Summit)

Backward Chaining188

rule "go5"when String( this == "go5" ) isContainedIn(thing, location; )then System.out.println( "thing " + thing + " is in " + location );end

ksession.insert( "go5" );ksession.fireAllRules(); --- go5 thing Knife is in House thing Cheese is in House thing Key is in House thing Computer is in House thing Draw is in House thing Desk is in House thing Chair is in House thing Key is in Office thing Computer is in Office thing Draw is in Office thing Key is in Desk thing Office is in House

Out Var (unbound) Out Var

(unbound)

!thing Computer is in Desk thing Knife is in Kitchen thing Cheese is in Kitchen thing Kitchen is in House thing Key is in Draw thing Draw is in Desk thing Desk is in Office thing Chair is in Office

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Page 189: Drools 6.0 (Red Hat Summit)

189

Questions?

• Dave Bowman: All right, HAL; I'll go in through the emergency airlock.

• HAL: Without your space helmet, Dave, you're going to find that rather difficult.

• Dave Bowman: HAL, I won't argue with you anymore! Open the doors!

• HAL: Dave, this conversation can serve no purpose anymore. Goodbye.

Joshya: Greetings, Professor Falken. Falken: Hello, Joshua. Joshya: A strange game. The only winning move is not to play. How about a nice game of chess?