SlideShare uma empresa Scribd logo
1 de 103
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
Saturday, 29 June 13
Who am I?
• Drools co-founder
• JBoss (2005)
• Red Hat (2006)
• Polymita Acquisition 2012
• Red Hat Platform Architect
Saturday, 29 June 13
KIE - Knowledge Is Everything
KIE
Drools jBPMOptaPlanner UberFire
Guvnor
Drools-WB jBPM-WB
KIE-WB
Saturday, 29 June 13
GitHub
• URL:
• https://github.com/droolsjbpm/
• Bootstrap project:
• https://github.com/droolsjbpm/droolsjbpm-
build-bootstrap
Saturday, 29 June 13
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
Saturday, 29 June 13
BRMS 6.0
Simplified Utilization
Saturday, 29 June 13
BRMS 5.0 Programmatic API
KnowledgeBuilder 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();
Saturday, 29 June 13
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
Saturday, 29 June 13
Git Hub Examples• https://github.com/droolsjbpm/drools/tree/master/drools-
examples-api
Saturday, 29 June 13
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();
Saturday, 29 June 13
11
Saturday, 29 June 13
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();
Saturday, 29 June 13
13
Saturday, 29 June 13
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();
Saturday, 29 June 13
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");
Saturday, 29 June 13
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();
Saturday, 29 June 13
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 this
KieContainer 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();
Saturday, 29 June 13
Dynamic Modules
// create a new kjar
InternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3");
// deploy it on maven
repository.deployArtifact(releaseId, kJar2, kPom);
// since I am not calling start() on the scanner it means it won't have
automatic scheduled scanning
KieScanner scanner = ks.newKieScanner(kieContainer);
// scan the maven repo to get the new kjar version and deploy it on the
kcontainer
scanner.scanNow();
// create a ksesion and check it works as expected
KieSession ksession2 = kieContainer.newKieSession("KSession1");
checkKSession(ksession2, "rule2", "rule3");
Saturday, 29 June 13
kmodule.xml Editor
Saturday, 29 June 13
Programmatic API
• Builder API, for tooling integration
• Incremental compilation, and problem
reporting
KieServices 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();
Saturday, 29 June 13
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 this
KieContainer 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();
Saturday, 29 June 13
BRMS 6.0
CDI
Saturday, 29 June 13
CDI Context and Dependency
• CDI injects named entities from the
kmodule.xml
• Injectable types
• KieServices
• KieContainer
• KieBase
• KieSession
• StatelessKieSession
Saturday, 29 June 13
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;
@Inject
private 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;
Saturday, 29 June 13
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;
Saturday, 29 June 13
BRMS 6.0
Spring and Camel
Saturday, 29 June 13
Spring and Camel
Saturday, 29 June 13
Spring and Camel
Saturday, 29 June 13
Spring and Camel
Saturday, 29 June 13
Spring and Camel
Saturday, 29 June 13
Backward Chaining
Reactive Transitive
Closures
Saturday, 29 June 13
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")
Saturday, 29 June 13
33
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")
Saturday, 29 June 13
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")
Saturday, 29 June 13
Backward Chainingrule "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")
Saturday, 29 June 13
Backward Chainingrule "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")
Saturday, 29 June 13
Backward Chainingrule "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")
Saturday, 29 June 13
Backward Chainingrule "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")
Saturday, 29 June 13
Backward Chainingrule "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")
Saturday, 29 June 13
Backward Chainingrule "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)
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)
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
Backward Chaining
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")
Saturday, 29 June 13
BRMS 6.0
Score Cards
Saturday, 29 June 13
Score Cards• a) Setup Parameters
• b) Characteristic Section
Saturday, 29 June 13
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
•
Saturday, 29 June 13
6.0 JTMS
Saturday, 29 June 13
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.
• Defeasible Logic soon
• See drools-compiler
• JTMSTest for lots of example tests
Saturday, 29 June 13
61
JTMS
Couples 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
Saturday, 29 June 13
JTMS
• Bad
• Monolithic
• Leaky
• Brittle integrity - manual maintenance
Saturday, 29 June 13
63
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 ) )
end
rule "IsAdult"
when
$p : Person( age >= 16 )
then
logicalInsert( new IsAdult( $p ) )
end
Saturday, 29 June 13
64
JTMS
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
Saturday, 29 June 13
65
JTMS
rule "Issue Child Bus Pass"
when
$p : Person( )
not( ChildBusPass( person == $p ) )
then
requestChildBusPass( $p );
end The truth maintenance cascades
Saturday, 29 June 13
66
JTMS
• Good
• De-couple knowledge responsibilities
• Encapsulate knowledge
• Provide semantic abstractions for those encapsulation
• Integrity robustness – truth maintenance
Saturday, 29 June 13
JTMS
IsChild
ChildBusPas
Rule : isChildRule
Rule : IssueBusPas
+
+
Saturday, 29 June 13
JTMS
rule "Do not issue to banned people"
when
$p : Person( )
Banned( person =$p )
then
logicalInsert(new ChildBusPass( $p ) , “neg” );
end
Saturday, 29 June 13
JTMS
IsChild
ChildBusPas
Rule : isChildRule
Rule : IssueBusPas
+
+
Rule : Do Not Issue
to Banned People
-
Saturday, 29 June 13
BRMS 6.0
R.I.P Rete
Saturday, 29 June 13
R.I.P RETE
inspirations:
• 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
Saturday, 29 June 13
BRMS 6.0
UI - OpenShift Ready
Saturday, 29 June 13
5.x Critique
Saturday, 29 June 13
5.x Critique
UI
• GWT
• but not easily extended
• fixed layouts
• no perspectives
Saturday, 29 June 13
5.x Critique
UI
• GWT
• but not easily extended
• fixed layouts
• no perspectives
JCR
• Performance Issues
• Everything stored as blob
• No tagging, branching etc.
• Webdav
• Limited team providers
Saturday, 29 June 13
5.x Critique
UI
• 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
Saturday, 29 June 13
5.x Critique
Content
• 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
Saturday, 29 June 13
5.x CritiqueDeployment
•Simple Snapshot system
•No real methodology
•Doesn’t align with any industry standards
Saturday, 29 June 13
UF UberFire
Saturday, 29 June 13
Requirements
• GWT + Errai
• Modular design
• Plugins
• Common Life cycles
• Compile time composition of plugins, via maven
• Flexible layouts
• Perspectives
• GIT Backend
• High Availability
• Maven integration for “projects”
Saturday, 29 June 13
UberFire Architecture Overview
Saturday, 29 June 13
Saturday, 29 June 13
•Modular
•Extensible
•Dynamic and Flexible layouts
•Perspectives
Saturday, 29 June 13
Simple POM Editor
Saturday, 29 June 13
Build and Deploy
Saturday, 29 June 13
Local Maven Repository and
Manager
Saturday, 29 June 13
Create or Clone Git Repos
Saturday, 29 June 13
KIE - Knowledge Is Everything
Saturday, 29 June 13
KIE - Knowledge Is Everything
Saturday, 29 June 13
KIE - Knowledge Is Everything
Saturday, 29 June 13
Community Beta3
Demo
Saturday, 29 June 13
Saturday, 29 June 13
UI Improvments
Saturday, 29 June 13
UberFire new Navigation System
Saturday, 29 June 13
UberFire new Navigation System
Saturday, 29 June 13
UberFire new Navigation System
Saturday, 29 June 13
UberFire new Navigation System
Saturday, 29 June 13
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
Saturday, 29 June 13
99
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?
Saturday, 29 June 13
<project>
<artifactId>uberfire-webapp</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-server</
artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-client-api</
artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-widgets-core-
client</artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-widgets-commons</
artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-workbench</
artifactId>
</dependency>
(...)
</dependencies>
</project>
<module>
<inherits
name="org.jboss.errai.enterprise.CDI"/>
<inherits
name="org.uberfire.security.UberfireSecurityClien
t"/>
<inherits
name="org.uberfire.UberfireWorkbench"/>
<inherits
name="org.uberfire.UberfireWidgetsCore"/>
<inherits name="org.uberfire.UberfireBackend"/>
<source path='client'/>
<source path='shared'/>
</module>
UberfireShowcase.gwt.xmlpom.xml
Saturday, 29 June 13
Saturday, 29 June 13
Markdown Component
Saturday, 29 June 13
<module>
<inherits
name="org.uberfire.UberfireMarkdownWidget"/
>
<inherits name="org.jboss.errai.enterprise.CDI"/>
<inherits
name="org.uberfire.security.UberfireSecurityClient"/>
<inherits name="org.uberfire.UberfireWorkbench"/>
<inherits name="org.uberfire.UberfireWidgetsCore"/>
<inherits name="org.uberfire.UberfireBackend"/>
<source path='client'/>
<source path='shared'/>
</module>
<project>
<artifactId>uberfire-webapp</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-widget-
markdown</artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-server</artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-client-api</artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-widgets-core-client</
artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-widgets-commons</
artifactId>
</dependency>
<dependency>
<groupId>org.uberfire</groupId>
<artifactId>uberfire-workbench</artifactId>
</dependency>
(...)
</dependencies>
</project>
UberfireShowcase.gwt.xmlpom.xml
Saturday, 29 June 13

Mais conteúdo relacionado

Mais procurados

Taming the Cloud Database with Apache jclouds
Taming the Cloud Database with Apache jcloudsTaming the Cloud Database with Apache jclouds
Taming the Cloud Database with Apache jclouds
zshoylev
 
How to scale and deploy NodeJS app
How to scale and deploy NodeJS appHow to scale and deploy NodeJS app
How to scale and deploy NodeJS app
Yacobus Reinhart
 

Mais procurados (20)

Atlanta OpenStack 2014 Chef for OpenStack Deployment Workshop
Atlanta OpenStack 2014 Chef for OpenStack Deployment WorkshopAtlanta OpenStack 2014 Chef for OpenStack Deployment Workshop
Atlanta OpenStack 2014 Chef for OpenStack Deployment Workshop
 
OpenStack Austin Meetup January 2014: Chef + OpenStack
OpenStack Austin Meetup January 2014: Chef + OpenStackOpenStack Austin Meetup January 2014: Chef + OpenStack
OpenStack Austin Meetup January 2014: Chef + OpenStack
 
No sq ls-biggest-lie_sql-never-went-away_martin-esmann
No sq ls-biggest-lie_sql-never-went-away_martin-esmannNo sq ls-biggest-lie_sql-never-went-away_martin-esmann
No sq ls-biggest-lie_sql-never-went-away_martin-esmann
 
Apache Cassandra and Go
Apache Cassandra and GoApache Cassandra and Go
Apache Cassandra and Go
 
Getting Started With #Drools 6 Slides - JBUG Denmark
Getting Started With #Drools 6 Slides - JBUG DenmarkGetting Started With #Drools 6 Slides - JBUG Denmark
Getting Started With #Drools 6 Slides - JBUG Denmark
 
Boston/NYC Chef for OpenStack Hack Days
Boston/NYC Chef for OpenStack Hack DaysBoston/NYC Chef for OpenStack Hack Days
Boston/NYC Chef for OpenStack Hack Days
 
Deploying E.L.K stack w Puppet
Deploying E.L.K stack w PuppetDeploying E.L.K stack w Puppet
Deploying E.L.K stack w Puppet
 
Velocity 2011 Chef OpenStack Workshop
Velocity 2011 Chef OpenStack WorkshopVelocity 2011 Chef OpenStack Workshop
Velocity 2011 Chef OpenStack Workshop
 
Deploying VMware vCloud Hybrid Service with Puppet - PuppetConf 2013
Deploying VMware vCloud Hybrid Service with Puppet - PuppetConf 2013Deploying VMware vCloud Hybrid Service with Puppet - PuppetConf 2013
Deploying VMware vCloud Hybrid Service with Puppet - PuppetConf 2013
 
SCALE12X Build a Cloud Day: Chef: The Swiss Army Knife of Cloud Infrastructure
SCALE12X Build a Cloud Day: Chef: The Swiss Army Knife of Cloud InfrastructureSCALE12X Build a Cloud Day: Chef: The Swiss Army Knife of Cloud Infrastructure
SCALE12X Build a Cloud Day: Chef: The Swiss Army Knife of Cloud Infrastructure
 
ClickHouse on Kubernetes, by Alexander Zaitsev, Altinity CTO
ClickHouse on Kubernetes, by Alexander Zaitsev, Altinity CTOClickHouse on Kubernetes, by Alexander Zaitsev, Altinity CTO
ClickHouse on Kubernetes, by Alexander Zaitsev, Altinity CTO
 
OpenStack and Puppet
OpenStack and PuppetOpenStack and Puppet
OpenStack and Puppet
 
Chef & OpenStack: OSCON 2014
Chef & OpenStack: OSCON 2014Chef & OpenStack: OSCON 2014
Chef & OpenStack: OSCON 2014
 
Taming the Cloud Database with Apache jclouds
Taming the Cloud Database with Apache jcloudsTaming the Cloud Database with Apache jclouds
Taming the Cloud Database with Apache jclouds
 
An Ensemble Core with Docker - Solving a Real Pain in the PaaS
An Ensemble Core with Docker - Solving a Real Pain in the PaaS An Ensemble Core with Docker - Solving a Real Pain in the PaaS
An Ensemble Core with Docker - Solving a Real Pain in the PaaS
 
Multinode kubernetes-cluster
Multinode kubernetes-clusterMultinode kubernetes-cluster
Multinode kubernetes-cluster
 
[JSDC 2016] Codex: Conditional Modules Strike Back
[JSDC 2016] Codex: Conditional Modules Strike Back[JSDC 2016] Codex: Conditional Modules Strike Back
[JSDC 2016] Codex: Conditional Modules Strike Back
 
TXLF: Chef- Software Defined Infrastructure Today & Tomorrow
TXLF: Chef- Software Defined Infrastructure Today & TomorrowTXLF: Chef- Software Defined Infrastructure Today & Tomorrow
TXLF: Chef- Software Defined Infrastructure Today & Tomorrow
 
Amazon EC2 Container Service in Action
Amazon EC2 Container Service in ActionAmazon EC2 Container Service in Action
Amazon EC2 Container Service in Action
 
How to scale and deploy NodeJS app
How to scale and deploy NodeJS appHow to scale and deploy NodeJS app
How to scale and deploy NodeJS app
 

Semelhante a Drools 6.0 (Red Hat Summit 2013)

Fact based monitoring
Fact based monitoringFact based monitoring
Fact based monitoring
Datadog
 
jclouds High Level Overview by Adrian Cole
jclouds High Level Overview by Adrian Colejclouds High Level Overview by Adrian Cole
jclouds High Level Overview by Adrian Cole
Everett Toews
 

Semelhante a Drools 6.0 (Red Hat Summit 2013) (20)

Drools and jBPM 6 Overview
Drools and jBPM 6 OverviewDrools and jBPM 6 Overview
Drools and jBPM 6 Overview
 
Prometheus Monitoring Mixins (Berlin CNCB Meetup)
Prometheus Monitoring Mixins (Berlin CNCB Meetup)Prometheus Monitoring Mixins (Berlin CNCB Meetup)
Prometheus Monitoring Mixins (Berlin CNCB Meetup)
 
i_have_a_nosql_toaster_-_qcon_-_june_2017.pptx
i_have_a_nosql_toaster_-_qcon_-_june_2017.pptxi_have_a_nosql_toaster_-_qcon_-_june_2017.pptx
i_have_a_nosql_toaster_-_qcon_-_june_2017.pptx
 
Container Native Development Tools - Talk by Mickey Boxell
Container Native Development Tools - Talk by Mickey BoxellContainer Native Development Tools - Talk by Mickey Boxell
Container Native Development Tools - Talk by Mickey Boxell
 
EKS Anywhere on vSphere
EKS Anywhere on vSphereEKS Anywhere on vSphere
EKS Anywhere on vSphere
 
Fact-Based Monitoring
Fact-Based MonitoringFact-Based Monitoring
Fact-Based Monitoring
 
Fact based monitoring
Fact based monitoringFact based monitoring
Fact based monitoring
 
Fact-Based Monitoring - PuppetConf 2014
Fact-Based Monitoring - PuppetConf 2014Fact-Based Monitoring - PuppetConf 2014
Fact-Based Monitoring - PuppetConf 2014
 
Exploring, understanding and monitoring macOS activity with osquery
Exploring, understanding and monitoring macOS activity with osqueryExploring, understanding and monitoring macOS activity with osquery
Exploring, understanding and monitoring macOS activity with osquery
 
Modern javascript
Modern javascriptModern javascript
Modern javascript
 
Elasticsearch (R)Evolution — You Know, for Search… by Philipp Krenn at Big Da...
Elasticsearch (R)Evolution — You Know, for Search… by Philipp Krenn at Big Da...Elasticsearch (R)Evolution — You Know, for Search… by Philipp Krenn at Big Da...
Elasticsearch (R)Evolution — You Know, for Search… by Philipp Krenn at Big Da...
 
Build Your Own CaaS (Container as a Service)
Build Your Own CaaS (Container as a Service)Build Your Own CaaS (Container as a Service)
Build Your Own CaaS (Container as a Service)
 
All you need to know about Orient Me
All you need to know about Orient MeAll you need to know about Orient Me
All you need to know about Orient Me
 
SOCCNX11 All you need to know about Orient Me
SOCCNX11 All you need to know about Orient MeSOCCNX11 All you need to know about Orient Me
SOCCNX11 All you need to know about Orient Me
 
SocCnx11 - All you need to know about orient me
SocCnx11 - All you need to know about orient meSocCnx11 - All you need to know about orient me
SocCnx11 - All you need to know about orient me
 
Gradle
GradleGradle
Gradle
 
jclouds High Level Overview by Adrian Cole
jclouds High Level Overview by Adrian Colejclouds High Level Overview by Adrian Cole
jclouds High Level Overview by Adrian Cole
 
Cluster Lifecycle Landscape
Cluster Lifecycle LandscapeCluster Lifecycle Landscape
Cluster Lifecycle Landscape
 
Agile Swift
Agile SwiftAgile Swift
Agile Swift
 
qb for the rest of us - sam knowlton
qb for the rest of us - sam knowltonqb for the rest of us - sam knowlton
qb for the rest of us - sam knowlton
 

Mais de Mark Proctor

Mais de Mark Proctor (20)

Rule Modularity and Execution Control
Rule Modularity and Execution ControlRule Modularity and Execution Control
Rule Modularity and Execution Control
 
Drools, jBPM OptaPlanner presentation
Drools, jBPM OptaPlanner presentationDrools, jBPM OptaPlanner presentation
Drools, jBPM OptaPlanner presentation
 
Reducing the Cost of the Linear Growth Effect using Adaptive Rules with Unlin...
Reducing the Cost of the Linear Growth Effect using Adaptive Rules with Unlin...Reducing the Cost of the Linear Growth Effect using Adaptive Rules with Unlin...
Reducing the Cost of the Linear Growth Effect using Adaptive Rules with Unlin...
 
Drools, jBPM and OptaPlanner (NYC and DC Sept 2017 - Keynote Talk Video)
Drools, jBPM and OptaPlanner (NYC and DC Sept 2017 - Keynote Talk Video)Drools, jBPM and OptaPlanner (NYC and DC Sept 2017 - Keynote Talk Video)
Drools, jBPM and OptaPlanner (NYC and DC Sept 2017 - Keynote Talk Video)
 
Learning Rule Based Programming using Games @DecisionCamp 2016
Learning Rule Based Programming using Games @DecisionCamp 2016Learning Rule Based Programming using Games @DecisionCamp 2016
Learning Rule Based Programming using Games @DecisionCamp 2016
 
Drools Happenings 7.0 - Devnation 2016
Drools Happenings 7.0 - Devnation 2016Drools Happenings 7.0 - Devnation 2016
Drools Happenings 7.0 - Devnation 2016
 
RuleML2015 : Hybrid Relational and Graph Reasoning
RuleML2015 : Hybrid Relational and Graph Reasoning RuleML2015 : Hybrid Relational and Graph Reasoning
RuleML2015 : Hybrid Relational and Graph Reasoning
 
Red Hat Summit 2015 : Drools, jBPM and UberFire Roadmaps
Red Hat Summit 2015 : Drools, jBPM and UberFire RoadmapsRed Hat Summit 2015 : Drools, jBPM and UberFire Roadmaps
Red Hat Summit 2015 : Drools, jBPM and UberFire Roadmaps
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
 
Classic Games Development with Drools
Classic Games Development with DroolsClassic Games Development with Drools
Classic Games Development with Drools
 
Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)
 
Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)
 
UberFire Quick Intro and Overview (early beta Aug 2013)
UberFire Quick Intro and Overview (early beta Aug 2013)UberFire Quick Intro and Overview (early beta Aug 2013)
UberFire Quick Intro and Overview (early beta Aug 2013)
 
What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013
 
Property Reactive RuleML 2013
Property Reactive RuleML 2013Property Reactive RuleML 2013
Property Reactive RuleML 2013
 
Reactive Transitive Closures with Drools (Backward Chaining)
Reactive Transitive Closures with Drools (Backward Chaining)Reactive Transitive Closures with Drools (Backward Chaining)
Reactive Transitive Closures with Drools (Backward Chaining)
 
Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)
 
UberFire Quick Intro and Overview (early beta Jul 2013)
UberFire Quick Intro and Overview (early beta Jul 2013)UberFire Quick Intro and Overview (early beta Jul 2013)
UberFire Quick Intro and Overview (early beta Jul 2013)
 
UberFire (JudCon 2013)
UberFire (JudCon 2013)UberFire (JudCon 2013)
UberFire (JudCon 2013)
 
Games development with the Drools rule engine
Games development with the Drools rule engineGames development with the Drools rule engine
Games development with the Drools rule engine
 

Último

Último (20)

Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

Drools 6.0 (Red Hat Summit 2013)

  • 1. 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 Saturday, 29 June 13
  • 2. Who am I? • Drools co-founder • JBoss (2005) • Red Hat (2006) • Polymita Acquisition 2012 • Red Hat Platform Architect Saturday, 29 June 13
  • 3. KIE - Knowledge Is Everything KIE Drools jBPMOptaPlanner UberFire Guvnor Drools-WB jBPM-WB KIE-WB Saturday, 29 June 13
  • 4. GitHub • URL: • https://github.com/droolsjbpm/ • Bootstrap project: • https://github.com/droolsjbpm/droolsjbpm- build-bootstrap Saturday, 29 June 13
  • 5. 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 Saturday, 29 June 13
  • 7. BRMS 5.0 Programmatic API KnowledgeBuilder 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(); Saturday, 29 June 13
  • 8. 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 Saturday, 29 June 13
  • 9. Git Hub Examples• https://github.com/droolsjbpm/drools/tree/master/drools- examples-api Saturday, 29 June 13
  • 10. 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(); Saturday, 29 June 13
  • 12. 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(); Saturday, 29 June 13
  • 14. 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(); Saturday, 29 June 13
  • 15. 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"); Saturday, 29 June 13
  • 16. 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(); Saturday, 29 June 13
  • 17. 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 this KieContainer 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(); Saturday, 29 June 13
  • 18. Dynamic Modules // create a new kjar InternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3"); // deploy it on maven repository.deployArtifact(releaseId, kJar2, kPom); // since I am not calling start() on the scanner it means it won't have automatic scheduled scanning KieScanner scanner = ks.newKieScanner(kieContainer); // scan the maven repo to get the new kjar version and deploy it on the kcontainer scanner.scanNow(); // create a ksesion and check it works as expected KieSession ksession2 = kieContainer.newKieSession("KSession1"); checkKSession(ksession2, "rule2", "rule3"); Saturday, 29 June 13
  • 20. Programmatic API • Builder API, for tooling integration • Incremental compilation, and problem reporting KieServices 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(); Saturday, 29 June 13
  • 21. 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 this KieContainer 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(); Saturday, 29 June 13
  • 23. CDI Context and Dependency • CDI injects named entities from the kmodule.xml • Injectable types • KieServices • KieContainer • KieBase • KieSession • StatelessKieSession Saturday, 29 June 13
  • 24. 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; @Inject private 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; Saturday, 29 June 13
  • 25. 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; Saturday, 29 June 13
  • 26. BRMS 6.0 Spring and Camel Saturday, 29 June 13
  • 32. 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") Saturday, 29 June 13
  • 33. 33 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") Saturday, 29 June 13
  • 34. 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") Saturday, 29 June 13
  • 35. Backward Chainingrule "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") Saturday, 29 June 13
  • 36. Backward Chainingrule "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") Saturday, 29 June 13
  • 37. Backward Chainingrule "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") Saturday, 29 June 13
  • 38. Backward Chainingrule "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") Saturday, 29 June 13
  • 39. Backward Chainingrule "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") Saturday, 29 June 13
  • 40. Backward Chainingrule "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) 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) Saturday, 29 June 13
  • 41. Backward Chaining 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") Saturday, 29 June 13
  • 42. Backward Chaining 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") Saturday, 29 June 13
  • 43. Backward Chaining 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") Saturday, 29 June 13
  • 44. Backward Chaining 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") Saturday, 29 June 13
  • 45. Backward Chaining 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") Saturday, 29 June 13
  • 46. Backward Chaining 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") Saturday, 29 June 13
  • 47. Backward Chaining 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") Saturday, 29 June 13
  • 48. Backward Chaining 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") Saturday, 29 June 13
  • 49. Backward Chaining 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") Saturday, 29 June 13
  • 50. Backward Chaining 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") Saturday, 29 June 13
  • 51. Backward Chaining 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") Saturday, 29 June 13
  • 52. Backward Chaining 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") Saturday, 29 June 13
  • 53. Backward Chaining 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") Saturday, 29 June 13
  • 54. Backward Chaining 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") Saturday, 29 June 13
  • 55. Backward Chaining 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") Saturday, 29 June 13
  • 57. Score Cards• a) Setup Parameters • b) Characteristic Section Saturday, 29 June 13
  • 58. 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 • Saturday, 29 June 13
  • 60. 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. • Defeasible Logic soon • See drools-compiler • JTMSTest for lots of example tests Saturday, 29 June 13
  • 61. 61 JTMS Couples 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 Saturday, 29 June 13
  • 62. JTMS • Bad • Monolithic • Leaky • Brittle integrity - manual maintenance Saturday, 29 June 13
  • 63. 63 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 ) ) end rule "IsAdult" when $p : Person( age >= 16 ) then logicalInsert( new IsAdult( $p ) ) end Saturday, 29 June 13
  • 64. 64 JTMS 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 Saturday, 29 June 13
  • 65. 65 JTMS rule "Issue Child Bus Pass" when $p : Person( ) not( ChildBusPass( person == $p ) ) then requestChildBusPass( $p ); end The truth maintenance cascades Saturday, 29 June 13
  • 66. 66 JTMS • Good • De-couple knowledge responsibilities • Encapsulate knowledge • Provide semantic abstractions for those encapsulation • Integrity robustness – truth maintenance Saturday, 29 June 13
  • 67. JTMS IsChild ChildBusPas Rule : isChildRule Rule : IssueBusPas + + Saturday, 29 June 13
  • 68. JTMS rule "Do not issue to banned people" when $p : Person( ) Banned( person =$p ) then logicalInsert(new ChildBusPass( $p ) , “neg” ); end Saturday, 29 June 13
  • 69. JTMS IsChild ChildBusPas Rule : isChildRule Rule : IssueBusPas + + Rule : Do Not Issue to Banned People - Saturday, 29 June 13
  • 71. R.I.P RETE inspirations: • 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 Saturday, 29 June 13
  • 72. BRMS 6.0 UI - OpenShift Ready Saturday, 29 June 13
  • 74. 5.x Critique UI • GWT • but not easily extended • fixed layouts • no perspectives Saturday, 29 June 13
  • 75. 5.x Critique UI • GWT • but not easily extended • fixed layouts • no perspectives JCR • Performance Issues • Everything stored as blob • No tagging, branching etc. • Webdav • Limited team providers Saturday, 29 June 13
  • 76. 5.x Critique UI • 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 Saturday, 29 June 13
  • 77. 5.x Critique Content • 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 Saturday, 29 June 13
  • 78. 5.x CritiqueDeployment •Simple Snapshot system •No real methodology •Doesn’t align with any industry standards Saturday, 29 June 13
  • 80. Requirements • GWT + Errai • Modular design • Plugins • Common Life cycles • Compile time composition of plugins, via maven • Flexible layouts • Perspectives • GIT Backend • High Availability • Maven integration for “projects” Saturday, 29 June 13
  • 83. •Modular •Extensible •Dynamic and Flexible layouts •Perspectives Saturday, 29 June 13
  • 86. Local Maven Repository and Manager Saturday, 29 June 13
  • 87. Create or Clone Git Repos Saturday, 29 June 13
  • 88. KIE - Knowledge Is Everything Saturday, 29 June 13
  • 89. KIE - Knowledge Is Everything Saturday, 29 June 13
  • 90. KIE - Knowledge Is Everything Saturday, 29 June 13
  • 94. UberFire new Navigation System Saturday, 29 June 13
  • 95. UberFire new Navigation System Saturday, 29 June 13
  • 96. UberFire new Navigation System Saturday, 29 June 13
  • 97. UberFire new Navigation System Saturday, 29 June 13
  • 98. 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 Saturday, 29 June 13
  • 99. 99 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? Saturday, 29 June 13
  • 100. <project> <artifactId>uberfire-webapp</artifactId> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-server</ artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-client-api</ artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-widgets-core- client</artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-widgets-commons</ artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-workbench</ artifactId> </dependency> (...) </dependencies> </project> <module> <inherits name="org.jboss.errai.enterprise.CDI"/> <inherits name="org.uberfire.security.UberfireSecurityClien t"/> <inherits name="org.uberfire.UberfireWorkbench"/> <inherits name="org.uberfire.UberfireWidgetsCore"/> <inherits name="org.uberfire.UberfireBackend"/> <source path='client'/> <source path='shared'/> </module> UberfireShowcase.gwt.xmlpom.xml Saturday, 29 June 13
  • 103. <module> <inherits name="org.uberfire.UberfireMarkdownWidget"/ > <inherits name="org.jboss.errai.enterprise.CDI"/> <inherits name="org.uberfire.security.UberfireSecurityClient"/> <inherits name="org.uberfire.UberfireWorkbench"/> <inherits name="org.uberfire.UberfireWidgetsCore"/> <inherits name="org.uberfire.UberfireBackend"/> <source path='client'/> <source path='shared'/> </module> <project> <artifactId>uberfire-webapp</artifactId> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-widget- markdown</artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-server</artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-client-api</artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-widgets-core-client</ artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-widgets-commons</ artifactId> </dependency> <dependency> <groupId>org.uberfire</groupId> <artifactId>uberfire-workbench</artifactId> </dependency> (...) </dependencies> </project> UberfireShowcase.gwt.xmlpom.xml Saturday, 29 June 13