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