Hey,

 

Quite often I want to process related facts.  For example, I have a
CompositeNode fact in working memory that references another CompositeNode
fact.  In such cases I want to be able to process all composites and their
associated components (i.e. children) in a rule.

 

The following code snippet demonstrates,

 

rule "Add related (and a few unrelated) facts"

      when

            not CompositeNode( name == "Parent" )

      then

            CompositeNode parent = new CompositeNode("Parent", new
CompositeNode("Child"));

            assert(parent);

            assert(parent.getChild());

            assert(new CompositeNode("RandomNode1"));

            assert(new CompositeNode("RandomNode2"));

end

 

rule "Test related facts"

      when

            p : CompositeNode( name == "Parent", c : child )

            c : CompositeNode()

      then

            System.out.println("p.name: " + p.getName() + " references
c.name: "  + c.getName() + "\n");

end

 

The first rule asserts a parent node with an associated child node, then
asserts the associated child node and then two random (i.e. unassociated)
nodes.  The second rule attempts to process each parent-child relationship.

 

Because Drools doesn't recognize fact bindings across conditions, my second
rule erroneously processes the cross-join of CompositeNode objects.

 

What I want to do is roughly equivalent to an SQL join using the 'child'
property as foreign key.  Something like SELECT * FROM CompositeNode WHERE
child = id.  This is a very important feature of Jess that I used regularly.

 

Is there a way to do this in drools that I just don't see?

 

Thanks.

-Mitch

 

 

 

Reply via email to