[rules-users] How to traverse a hierarchy?

Charles Binford Charles.Binford at Sun.COM
Mon Apr 13 17:56:35 EDT 2009


All,  I'm trying to figure out a better way to solve this problem.  I
have a batch of objects that I want matched against a hierarchy of
rules.  I check the rules in order, and as soon as I find a match I'm
done for that level of the hierarchy.  In other words, If the object
matches a rule, we'll check the rules children, but not the siblings. 
Example:

rule 1
  rule 1.1
  rule 1.2
    rule 1.2.1
    rule 1.2.2
  rule 1.3
rule 2

If an object matches rule 1, check for a match at level "1.*", but rule
2 will never be checked.  If an object matches 1, 1.2, and 1.2.1, we're
done as 1.2.1 has no children.

My current implementation with drools works, but is very inefficient.  I
have a "level" string in the objects and whenever I find a match I
update the level of the object and force an object update.  Each rule
tests that the level string is correct, e.g. rule 1.2.1 works as follows:
rule "1.2.1"
when
    obj(level matches "1.2.*",.....)
    ...
then
    objSetLevel("1.2.1.*");
    ....
end
 
I'm also using saliance to keep the evaluation order like I want it.

Changing the contents of the object and doing the update is not good for
drools performance as I understand it so I'm looking for a better way. 
The hierarchy and the order of the matching is key to my application so
I'm not wanting to redesign that part of things. 

I tried using activation-groups.  That worked great as long as I only
had a single object to run through the hierarchy, but given the way the
rest of the system is design I need to load up 10-100 objects before
each call to fireallrules() for performance purposes.

Any suggestions are appreciated.

Charles Binford





More information about the rules-users mailing list