drools and brms 6.0 (dublin aug 2013)

160
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 Monday, 2 September 13

Upload: mark-proctor

Post on 05-Dec-2014

1.444 views

Category:

Technology


1 download

DESCRIPTION

Talk presenting what's new in Drools 6.0, which forms part of the up coming Red Hat BRMS product platform. All kindly sponsored by Sabeo.

TRANSCRIPT

Page 1: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 2: Drools and BRMS 6.0 (Dublin Aug 2013)

Who am I?

• Drools co-founder

• JBoss (2005)

• Red Hat (2006)

• Polymita Acquisition 2012

• Red Hat Platform Architect

Monday, 2 September 13

Page 3: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is EverythingKIE

Drools jBPMOptaPlanner UberFire

Guvnor

Drools-WB jBPM-WB

KIE-WB

Monday, 2 September 13

Page 4: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is Everything

Monday, 2 September 13

Page 5: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is Everything

Monday, 2 September 13

Page 7: Drools and BRMS 6.0 (Dublin Aug 2013)

Serious Bits :)

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

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

Monday, 2 September 13

Page 8: Drools and BRMS 6.0 (Dublin Aug 2013)

What’s a Rule

Monday, 2 September 13

Page 9: Drools and BRMS 6.0 (Dublin Aug 2013)

This is a Rule

Monday, 2 September 13

Page 10: Drools and BRMS 6.0 (Dublin Aug 2013)

This is another Rule

function checkemail(email){ var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i if ( filter.test(email) ) { return true } else{ return false }}

Monday, 2 September 13

Page 11: Drools and BRMS 6.0 (Dublin Aug 2013)

This is a Rule Enginevar validator = new FormValidator('example_form', [{ name: 'req', display: 'required', rules: 'required'}, { name: 'alphanumeric', rules: 'alpha_numeric'}, { name: 'password', rules: 'required'}, { name: 'password_confirm', display: 'password confirmation', rules: 'required|matches[password]'},

Monday, 2 September 13

Page 12: Drools and BRMS 6.0 (Dublin Aug 2013)

These are Rules too

Monday, 2 September 13

Page 13: Drools and BRMS 6.0 (Dublin Aug 2013)

What is a Rule

rule <rule_name> <attribute><value> when <conditions> then <actions>end

Monday, 2 September 13

Page 14: Drools and BRMS 6.0 (Dublin Aug 2013)

Pattern Matching

Person(age >= 18)field name restriction

constraintobject type

pattern

Monday, 2 September 13

Page 15: Drools and BRMS 6.0 (Dublin Aug 2013)

Pattern Matching ?

case class Grade( letter : String, passed : Boolean ) def check( grade : Grade ) = { grade match { case Grade(letter,true) => printf( "You have passed with grade: %s", letter ) case Grade(letter,false) => printf( "You have failed with grade: %s", letter ) }}

Monday, 2 September 13

Page 16: Drools and BRMS 6.0 (Dublin Aug 2013)

Hybrid Reasoning

Monday, 2 September 13

Page 17: Drools and BRMS 6.0 (Dublin Aug 2013)

Types of Reasoning

•Production Rule Systems PRD (forward chaining)•Reactive

•when Alarm( status == “alert” ) •then send( “warning” )

•Logic Programming LP (backward chaining)•Query

•descendant( “mary”, “jane”)

•Functional Programming FP•Map,Fold, Filter•avg([12, 16, 4, 6])

•Returns single value 9.5

•round([10.3, 4.7, 7.8] )•Returns List [10, 5, 8]

17

Monday, 2 September 13

Page 18: Drools and BRMS 6.0 (Dublin Aug 2013)

Quick IntroWhat are Rule Based Systems

Monday, 2 September 13

Page 19: Drools and BRMS 6.0 (Dublin Aug 2013)

19

VisionRobotics

Speech

Neural Nets Rule Base Systems/Expert System Tools

Understanding

NaturalLanguageSome Areas of

Artificial Intelligence

Some Areas of Artificial Intelligence

Monday, 2 September 13

Page 20: Drools and BRMS 6.0 (Dublin Aug 2013)

20

Knowledge Representation and Reasoning

The study of Knowledge is Epistemology● Nature Structure and Origins of Knowledge● Core or AI

Rule based systems● Expert System tools● Knowledge Representation and Reasoning● Facilitate the codification of knowledge into a knowledge

base which can be used for reasoning

Monday, 2 September 13

Page 21: Drools and BRMS 6.0 (Dublin Aug 2013)

21

It All Started Here Birth of CDSS

Dendral

Mycin

Baobab

Guidon

Neomycin

Teiresias Emycin WM

Puff

Sacon

Centaur

Gravida

Wheeze Clot

Onccocin

1970s

1980s

Monday, 2 September 13

Page 22: Drools and BRMS 6.0 (Dublin Aug 2013)

22

Because Not Everyone Is As Smart As He Is

Monday, 2 September 13

Page 23: Drools and BRMS 6.0 (Dublin Aug 2013)

1979 Rete Algorithm by Charles Forgy 23

Monday, 2 September 13

Page 24: Drools and BRMS 6.0 (Dublin Aug 2013)

Clips and Jess

Clips 1986

24

Clips 1995

Monday, 2 September 13

Page 25: Drools and BRMS 6.0 (Dublin Aug 2013)

Technical Language

Monday, 2 September 13

Page 26: Drools and BRMS 6.0 (Dublin Aug 2013)

26

Classes

AccountAccount

long accountNo

int balance

CashFlowCashFlow

Date date

int amount

AccountPeriodAccountPeriod

Date start

Date end

CashFlow Example

Monday, 2 September 13

Page 27: Drools and BRMS 6.0 (Dublin Aug 2013)

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

27

acc.balance += cf.amount

CashFlow Rule

Monday, 2 September 13

Page 28: Drools and BRMS 6.0 (Dublin Aug 2013)

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

28

acc.balance += cf.amount

CashFlow Rule

Monday, 2 September 13

Page 29: Drools and BRMS 6.0 (Dublin Aug 2013)

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

29

acc.balance += cf.amount

CashFlow Rule

Monday, 2 September 13

Page 30: Drools and BRMS 6.0 (Dublin Aug 2013)

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

30

acc.balance += cf.amount

CashFlow Rule

Monday, 2 September 13

Page 31: Drools and BRMS 6.0 (Dublin Aug 2013)

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

31

acc.balance += cf.amount

CashFlow Rule

Monday, 2 September 13

Page 32: Drools and BRMS 6.0 (Dublin Aug 2013)

32

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

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

CashFlowCashFlowCashFlowCashFlow

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

AccountingPeriodAccountingPeriod

start end

01-JAN-2012 31-MAR-2012

AccountAccount

accountNo balance

1 0

CashFlowCashFlowCashFlowCashFlow

date amount type accountNo

12-Jan-12 100 CREDIT 1

9-Mar-12 75 CREDIT 1

CashFlowCashFlowCashFlowCashFlow

date amount type accountNo

2-Feb-12 200 DEBIT 1

AccountAccount

accountNo balance

1 -25

CashFlow Example

Monday, 2 September 13

Page 33: Drools and BRMS 6.0 (Dublin Aug 2013)

33

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

AgendaAgendaAgenda

1 increase balance

arbitrary2 decrease balance arbitrary

3 increase balance

arbitrary

4 print balance

CashFlow Example

Monday, 2 September 13

Page 34: Drools and BRMS 6.0 (Dublin Aug 2013)

Timers

Monday, 2 September 13

Page 35: Drools and BRMS 6.0 (Dublin Aug 2013)

Timers

Monday, 2 September 13

Page 36: Drools and BRMS 6.0 (Dublin Aug 2013)

CEP

Monday, 2 September 13

Page 37: Drools and BRMS 6.0 (Dublin Aug 2013)

Graphical Metaphores

Monday, 2 September 13

Page 38: Drools and BRMS 6.0 (Dublin Aug 2013)

Graphical Metaphores• Decision Tables• Guided Editors• Rule Templates

• Guided Editor + Decision Table• Score Cards• Decision Trees

• We don’t do these yet

Monday, 2 September 13

Page 39: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 40: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 41: Drools and BRMS 6.0 (Dublin Aug 2013)

Guided Editors

Monday, 2 September 13

Page 42: Drools and BRMS 6.0 (Dublin Aug 2013)

Rule Templates

Monday, 2 September 13

Page 43: Drools and BRMS 6.0 (Dublin Aug 2013)

Rule Templates

Monday, 2 September 13

Page 44: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table Wizards

Monday, 2 September 13

Page 45: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 46: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 47: Drools and BRMS 6.0 (Dublin Aug 2013)

Scenarios

Monday, 2 September 13

Page 48: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Trees

Monday, 2 September 13

Page 49: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Tables

Monday, 2 September 13

Page 50: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 51: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 52: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 53: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 54: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 55: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 56: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 57: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 58: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 59: Drools and BRMS 6.0 (Dublin Aug 2013)

Decision Table

Monday, 2 September 13

Page 60: Drools and BRMS 6.0 (Dublin Aug 2013)

WorkbenchOpenShift Ready

Monday, 2 September 13

Page 61: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x Critique

Monday, 2 September 13

Page 62: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x CritiqueUI

• GWT• but not easily extended• fixed layouts• no perspectives

Monday, 2 September 13

Page 63: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x CritiqueUI

• GWT• but not easily extended• fixed layouts• no perspectives

JCR• Performance Issues• Everything stored as blob• No tagging, branching etc.• Webdav• Limited team providers

Monday, 2 September 13

Page 64: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x CritiqueUI

• GWT• but not easily extended• fixed layouts• no perspectives

JCR• Performance Issues• Everything stored as blob• No tagging, branching etc.• Webdav• Limited team providers

Deployment• Binary blobs, on url

Monday, 2 September 13

Page 65: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x CritiqueContent• Single tree structure (packages)• Packages created project deployment units

• no real alignment with industry stadard• No easy rule use (only a single global area)• Loading “model” jars into packages

• Poor hack, for dependency management

Monday, 2 September 13

Page 66: Drools and BRMS 6.0 (Dublin Aug 2013)

5.x CritiqueDeployment

•Simple Snapshot system

•No real methodology

•Doesn’t align with any industry standards

Monday, 2 September 13

Page 67: Drools and BRMS 6.0 (Dublin Aug 2013)

UF UberFire

Monday, 2 September 13

Page 68: Drools and BRMS 6.0 (Dublin Aug 2013)

Requirements• Modular design

• Plugins• Common Life cycles• Compile time composition of plugins, via maven

• Menus• contextual to perspective and focus panel• Visibility Security

• Toolbars• contextual to perspective and focus panel• Visibility Security

• Twitter Bootstrap UI• Flexible layouts• Perspectives

Monday, 2 September 13

Page 69: Drools and BRMS 6.0 (Dublin Aug 2013)

Requirements• Security

• Authorization, Authentication• Seamless API for client and server

• MetaData• Everything is a file, DB just for fast searching

• GIT Backend• High Availability

• GIT Cluster• Apache Helix

• Maven integration for “projects”

Monday, 2 September 13

Page 70: Drools and BRMS 6.0 (Dublin Aug 2013)

UberFire Architecture Overview

Monday, 2 September 13

Page 71: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is Everything

Monday, 2 September 13

Page 72: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is Everything

Monday, 2 September 13

Page 73: Drools and BRMS 6.0 (Dublin Aug 2013)

KIE - Knowledge Is Everything

Monday, 2 September 13

Page 74: Drools and BRMS 6.0 (Dublin Aug 2013)

Workbench Screens

Monday, 2 September 13

Page 75: Drools and BRMS 6.0 (Dublin Aug 2013)

Workbench Screens• Workbench Screen

• DIV• Lifecycle events

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

Monday, 2 September 13

Page 76: Drools and BRMS 6.0 (Dublin Aug 2013)

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!"; }

}

Monday, 2 September 13

Page 77: Drools and BRMS 6.0 (Dublin Aug 2013)

Workbench Editor

Monday, 2 September 13

Page 78: Drools and BRMS 6.0 (Dublin Aug 2013)

Workbench Editor• Workbench Screen

• DIV• Lifecycle events

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

Monday, 2 September 13

Page 79: Drools and BRMS 6.0 (Dublin Aug 2013)

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(); }}

Monday, 2 September 13

Page 80: Drools and BRMS 6.0 (Dublin Aug 2013)

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(); }}

Monday, 2 September 13

Page 81: Drools and BRMS 6.0 (Dublin Aug 2013)

Workbench Perspective

Monday, 2 September 13

Page 82: Drools and BRMS 6.0 (Dublin Aug 2013)

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 () { }});

Monday, 2 September 13

Page 83: Drools and BRMS 6.0 (Dublin Aug 2013)

Simple POM Editor

Monday, 2 September 13

Page 84: Drools and BRMS 6.0 (Dublin Aug 2013)

Build and Deploy

Monday, 2 September 13

Page 85: Drools and BRMS 6.0 (Dublin Aug 2013)

Local Maven Repository and Manager

Monday, 2 September 13

Page 86: Drools and BRMS 6.0 (Dublin Aug 2013)

Create or Clone Git Repos

Monday, 2 September 13

Page 87: Drools and BRMS 6.0 (Dublin Aug 2013)

Legacy Systems and Migration• Legacy API Adapter JAR• Most API’s should work with legacy adapter• KnowledegAgents have not been ported,

PKG’s are not longer the unit of deployment

• JCR Migration Tool• Command Line Java code• Each Package maps to a GIT project

Monday, 2 September 13

Page 88: Drools and BRMS 6.0 (Dublin Aug 2013)

BPM Integration

Monday, 2 September 13

Page 89: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 90: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 91: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 92: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 93: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 94: Drools and BRMS 6.0 (Dublin Aug 2013)

Work - Task Lists

Monday, 2 September 13

Page 95: Drools and BRMS 6.0 (Dublin Aug 2013)

BPMN Designer (JS)

Monday, 2 September 13

Page 96: Drools and BRMS 6.0 (Dublin Aug 2013)

BRMS 6.0Simplified Utilization

Monday, 2 September 13

Page 97: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 98: Drools and BRMS 6.0 (Dublin Aug 2013)

Changes• Conventions:• droolsjbpm -> kie• knowlege -> kie

• Examples• KnowledgeBase -> Kie• StatefulKnowledgeSession -> KieSession• StatelessKnowledgeSession - StatelesKieSession

• Legacy API Adapter JAR• Most API’s should work with legacy adapter• KnowledegAgents have not been ported, PKG’s are not

longer the unit of deployment

Monday, 2 September 13

Page 99: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 101: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 102: Drools and BRMS 6.0 (Dublin Aug 2013)

102

Monday, 2 September 13

Page 103: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 104: Drools and BRMS 6.0 (Dublin Aug 2013)

104

Monday, 2 September 13

Page 105: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 106: Drools and BRMS 6.0 (Dublin Aug 2013)

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");

Monday, 2 September 13

Page 107: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 108: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 109: Drools and BRMS 6.0 (Dublin Aug 2013)

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");

Monday, 2 September 13

Page 110: Drools and BRMS 6.0 (Dublin Aug 2013)

kmodule.xml Editor

Monday, 2 September 13

Page 111: Drools and BRMS 6.0 (Dublin Aug 2013)

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();

Monday, 2 September 13

Page 112: Drools and BRMS 6.0 (Dublin Aug 2013)

BRMS 6.0 CDI

Monday, 2 September 13

Page 113: Drools and BRMS 6.0 (Dublin Aug 2013)

CDI Context and Dependency • CDI injects named entities from the

kmodule.xml

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

Monday, 2 September 13

Page 114: Drools and BRMS 6.0 (Dublin Aug 2013)

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;

Monday, 2 September 13

Page 115: Drools and BRMS 6.0 (Dublin Aug 2013)

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;

Monday, 2 September 13

Page 116: Drools and BRMS 6.0 (Dublin Aug 2013)

BRMS 6.0 Spring and Camel

Monday, 2 September 13

Page 117: Drools and BRMS 6.0 (Dublin Aug 2013)

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>

Monday, 2 September 13

Page 118: Drools and BRMS 6.0 (Dublin Aug 2013)

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>

Monday, 2 September 13

Page 119: Drools and BRMS 6.0 (Dublin Aug 2013)

BRMS 6.0R.I.P Rete

Monday, 2 September 13

Page 120: Drools and BRMS 6.0 (Dublin Aug 2013)

R.I.P RETEinspirations:• 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

Monday, 2 September 13

Page 121: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward ChainingReactive Transitive

Closures

Monday, 2 September 13

Page 122: Drools and BRMS 6.0 (Dublin Aug 2013)

Reasoning with GraphsHouse

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")

Monday, 2 September 13

Page 123: Drools and BRMS 6.0 (Dublin Aug 2013)

123

Backward Chainingquery 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")

Monday, 2 September 13

Page 124: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingksession.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")

Monday, 2 September 13

Page 125: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "go" salience 10when $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")

Monday, 2 September 13

Page 126: Drools and BRMS 6.0 (Dublin Aug 2013)

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

rule "go" salience 10when $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")

Monday, 2 September 13

Page 127: Drools and BRMS 6.0 (Dublin Aug 2013)

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

rule "go" salience 10when $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")

Monday, 2 September 13

Page 128: Drools and BRMS 6.0 (Dublin Aug 2013)

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

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

ksession.insert( "go1" );ksession.fireAllRules();---go1office 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")

Monday, 2 September 13

Page 129: Drools and BRMS 6.0 (Dublin Aug 2013)

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

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

ksession.insert( "go1" );ksession.fireAllRules();---go1office 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")

Monday, 2 September 13

Page 130: Drools and BRMS 6.0 (Dublin Aug 2013)

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

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

ksession.insert( "go1" );ksession.fireAllRules();---go1office 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)

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")

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

Monday, 2 September 13

Page 131: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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")

Monday, 2 September 13

Page 132: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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")

Monday, 2 September 13

Page 133: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 134: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 135: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 136: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 137: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 138: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 139: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 140: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 141: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 142: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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();---go2Draw 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")

Monday, 2 September 13

Page 143: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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")

Monday, 2 September 13

Page 144: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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")

Monday, 2 September 13

Page 145: Drools and BRMS 6.0 (Dublin Aug 2013)

Backward Chainingrule "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")

Monday, 2 September 13

Page 146: Drools and BRMS 6.0 (Dublin Aug 2013)

6.0 JTMS(exp)

Monday, 2 September 13

Page 147: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 148: Drools and BRMS 6.0 (Dublin Aug 2013)

148

JTMSCouples 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 ) );endrule "Issue Adult Bus Pass"when $p : Person( age >= 16 )then insert(new AdultBusPass( $p ) );end

Monday, 2 September 13

Page 149: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 150: Drools and BRMS 6.0 (Dublin Aug 2013)

150

JTMS

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 ) )endrule "IsAdult"when $p : Person( age >= 16 )then logicalInsert( new IsAdult( $p ) )end

Monday, 2 September 13

Page 151: Drools and BRMS 6.0 (Dublin Aug 2013)

151

JTMS

The truth maintenance cascades

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

Monday, 2 September 13

Page 152: Drools and BRMS 6.0 (Dublin Aug 2013)

152

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

Monday, 2 September 13

Page 153: Drools and BRMS 6.0 (Dublin Aug 2013)

153

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

Monday, 2 September 13

Page 154: Drools and BRMS 6.0 (Dublin Aug 2013)

JTMS

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Monday, 2 September 13

Page 155: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 156: Drools and BRMS 6.0 (Dublin Aug 2013)

JTMS

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Rule : Do Not Issue to Banned People

-

Monday, 2 September 13

Page 157: Drools and BRMS 6.0 (Dublin Aug 2013)

6.0 Defeasible(exp)

Monday, 2 September 13

Page 158: Drools and BRMS 6.0 (Dublin Aug 2013)

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

Monday, 2 September 13

Page 159: Drools and BRMS 6.0 (Dublin Aug 2013)

Defeasiblerule "All Birds Fly" @Defeasible

when

$b : Bird( )then

logicalInsert(new Fly( $b ) );

end

rule "Brocken wing" @Defeasible

@Defeaterwhen

$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

Monday, 2 September 13

Page 160: Drools and BRMS 6.0 (Dublin Aug 2013)

160

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?

Monday, 2 September 13