SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
Drools5 Community Training Module 3 Drools Expert DRL Syntax
Drools5 Community Training Module 3 Drools Expert DRL Syntax
1.
Drools5 Community Training
Sponsored by Plugtree
2.
Module 3: Drools Expert
DRL Syntax
Drools5 Community Training
version: 1.0-SNAPSHOT
Release Date: 03/16/2011
Under The Creative Common License
3.
Module 3: Drools Expert
DRL Syntax
Drools5 Community Training Course
by Mauricio "Salaboy" Salatino and
Esteban Aliverti is licensed under a
Creative Commons Attribution 3.0
Unported License.
Based on a work at salaboy.wordpress.
com.
Permissions beyond the scope of this
license may be available at http:
//salaboy.wordpress.com/.
5.
Drools Expert Introduction
● Drools Expert is the rule engine core
● Lets us express Business Rules
● It will be in charge of making inferences to get new
conclusions
8.
Business Rule Structure
package ...
import ...
global ...
rule "My Rule"
<Attributes>
when <LHS>
Song(genre == "Jazz") <CEs>
then <RHS>
System.out.println("Hi John!");
end
10.
LHS - Conditional Elements
● Field Operators
● e.g.
Song( lyrics matches "AZ-az[drink]" )
Song( authors contains "John Zorn" )
Song( author memberof $greatMusicians )
11.
LHS - Conditional Elements
● AND
e.g. Person( name == "John" ) AND Pet(type == "cat")
● OR
e.g. Policewoman (age > 30) OR Fireman(age > 31)
12.
LHS - Conditional Elements
● eval
e.g. eval( song.isJazz() )
● not
e.g. not( Song( genre == "Pop") )
13.
LHS - Conditional Elements
● exists
e.g. exists ( Song(genre == "Jazz"))
● forall
e.g. forall ( Song()
Song(genre == "Jazz") )
14.
LHS - Conditional Elements
from CE
● e.g.
$playlist: Playlist()
Song() from $playlist.songs
$playlist: Playlist()
Song(genre == "Jazz") from $playlist.songs
15.
LHS - Conditional Elements
● from
● e.g.
global HibernateSession hbn;
$playlist: Playlist()
Song() from hbn.namedQuery("SongByArtist")
.setParameter("artist","John Zorn")
.getResultList();
16.
LHS - Conditional Elements
● Collect
● e.g.
$songs: ArrayList() from collect
(Song(genre == "Jazz", year > 2000))
18.
LHS - Conditional Elements
● Accumulate CE:
<result pattern> from accumulate( <source pattern>,
init( <init code> ),
action( <action code> ),
reverse( <reverse code> ),
result( <result expression>))
● e.g.
$playlist: Playlist()
$jazzSongs: Number( doubleValue > 100 ) from
accumulate( Song(playlist == $playlist, genre == "Jazz"),
init( double total = 0; ),
action( total += 1; ),
reverse( total -= 1; ),
result( total ))
19.
LHS - Conditional Elements
● Accumulate Function Examples
$playlist: Playlist()
$total: Number( doubleValue > 100 )
from accumulate(
$song: Song(
playlist == $playlist,
genre == "Jazz"),
count($song))
20.
LHS - Conditional Elements
● Accumulate out-of-the-box Functions
○ average
○ min
○ max
○ count
○ sum
21.
LHS - Conditional Elements
● Accumulate custom function
$playlist: Playlist()
$total: Number( doubleValue > 100 ) from
accumulate( $song: Song(
playlist == $playlist),
myCustomFc($song.duration))
● We can plug our custom function here. We just need to
implement the AccumulateFunction interface.
22.
Nesting CEs
● Drools support nested CEs
$petshop: PetShop()
$total: Number( doubleValue > 10 ) from accumulate(
$pet: Pet(petshop == $petshop,
type == PetType.Cat)
from $hbm.getNamedQuery("getPetsFromPetshopId")
.setParamenter("petshopid",$petshop.getId())
.list(), count ($pet) )
23.
Right Hand Side
● Set of actions
● MVEL or Java (http://mvel.codehaus.org/)
● We will have a set of methods to modify the working
memory status
○ insert()
○ modify() / update ()
○ retract()
rule "Fire ! ! !"
when
Fire()
then
insert(new Alarm());
end
25.
Rule Attributes - no loop
● no-loop
i.e.
rule "infinite activation loop"
no-loop true
when
$person: Person(age > 21)
then
update($person){
setName("John");
}
end
26.
Rule Attributes - salience
● salience (higher priority first)
rule "rule with priority"
salience 10
when
$song: Song()
then
System.out.println("Rule with higher priority Fired!");
end
rule "rule with less priority"
salience 5
when
$song: Song()
then
System.out.println("Rule with lower priority Fired!");
end
27.
Rule Attributes - agenda-group
rule "Playlist ready"
agenda-group "Create Playlist"
when
Playlist(size == 3)
then
//Set the focus to "Play playlist" agenda-group
kcontext.getKnowledgeRuntime().getAgenda()
.getAgendaGroup("Play playlist").setFocus();
end
rule "Play playlist"
agenda-group "Play playlist"
when
$pl : Playlist()
then
$pl.play();
end
28.
Rule Attributes - lock-on-active
rule "Fill playlist" rule "Number Songs"
salience 1 salience 2
lock-on-active lock-on-active
agenda-group "Create Playlist" agenda-group "Create Playlist"
when when
$pl : Playlist() $song : Song()
$song : Song() then
then modify($song){
modify($pl){ setName(
addSong($song); index.getAndIncrement()+
} "_"+ $song.getName());
end }
end
29.
Queries
Example
query "Get Persons by Name" (String name)
Person(name = :name)
end
31.
KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// Add our rules
kbuilder.add(new ClassPathResource("rules.drl"), ResourceType.DRL);
//Check for errors during the compilation of the rules
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
32.
KnowledgeBase
// Create the Knowledge Base
KnowledgeBase kbase = KnowledgeBaseFactory.
newKnowledgeBase();
// Add the binary packages (compiled rules) to the Knowledge
Base
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
33.
KnowledgeSession
// Create a StatefulSession using the KnowledgeBase that
// contains the compiled knowledge
StatefulKnowledgeSession ksession =
kbase.newStatefulKnowledgeSession();
// We can add a runtime logger to understand what is going on
// inside the Engine
KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
// Insert a new Fact inside my world
FactHandle myFactHandle = ksession.insert(new Person("Myself"));
// Update a Fact using the FactHandle
ksession.update(myFactHandle, new Person("Salaboy!"));
// Retract/Remove from my world the Fact
ksession.retract(myFactHandle);