[rules-users] How to traverse a hierarchy?
Charles Binford
Charles.Binford at Sun.COM
Wed Apr 15 13:23:21 EDT 2009
Thanks for the suggestion. I'll try a slight variation on the theme and
see what that does to my overall throughput.
cb
Wolfgang Laun wrote:
> Let me propose a somewhat different approach which avoids changing
> your objects.
>
> Define a new class Marker that combines a "mark" with the Object to be
> classified:
> private String mark;
> private final Object object;
> public Marker( Object o ){ this.object = o; mark = ""; }
> // getter for object
> // getter & setter for mark
>
> For every new Object, create and insert a marker object. This could be
> done by the (Java) code inserting the new objet, or by a rule that
> fires on an unmarked and unclassified Object. (This depends somewhat
> upon the ultimate fate of the Object facts. If they are left in WM, it
> might be preferable to used the first technique.)
>
> Rules would be written as
> rule r1.2.4
> when
> $m : Marker( mark == "1.2", $object : object )
> Object( this == $object,... )
> then
> $m.setMark( "1.2.4" );
> update( $m );
> end
>
> Leaf rules would have to retract the marker (and dispose of the Object
> fact).
>
> A low salience rule should be provided to match left-over Marker
> objects so you can catch Objects that aren't matched by any rule.
>
> -W
>
>
>
>
>
>
>
>
>
>
> On 4/13/09, *Charles Binford* <Charles.Binford at sun.com
> <mailto:Charles.Binford at sun.com>> wrote:
>
> 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
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
More information about the rules-users
mailing list