How can I check if an instance was not already inserted? For instance, my transitive closure works for non-cycled data, but it re-derives the same relations for cycled data.
TransitiveClosure.drl: package org.drools.examples import org.drools.examples.TransitiveClosureExample.Edge; import org.drools.examples.TransitiveClosureExample.Reach; rule "reachDirect" salience 10 when e : Edge(s1 : source, t1 : target) // not( exists( Reach(source == s1, target == t1) ) ) then insertLogical( new Reach(e.getSource(),e.getTarget()) ); System.out.println( "Reach " + e.getSource() + "," + e.getTarget() ); end rule "reachIndirect" salience 10 when e : Edge(s1 : source, t1 : target) r : Reach(t2 : target, source == t1 ) // not( exists( Reach(source == s1, target == t2) ) ) then insertLogical( new Reach(e.getSource(),r.getTarget()) ); System.out.println( "Reach " + e.getSource() + "," + r.getTarget() ); end TransitiveClosureExample.java: package org.drools.examples; import java.io.InputStreamReader; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.StatefulSession; import org.drools.audit.WorkingMemoryFileLogger; import org.drools.compiler.PackageBuilder; import org.drools.compiler.PackageBuilderConfiguration; public class TransitiveClosureExample { public static void main(final String[] args) throws Exception { PackageBuilderConfiguration conf = new PackageBuilderConfiguration(); final PackageBuilder builder = new PackageBuilder( conf ); builder.addPackageFromDrl( new InputStreamReader( TransitiveClosureExample.class.getResourceAsStream( "TransitiveClosure.drl" ) ) ); final RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( builder.getPackage() ); final StatefulSession session = ruleBase.newStatefulSession(); final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session ); logger.setFileName( "log/transitiveClosure" ); final Edge edgeAB = new Edge( "a","b" ); final Edge edgeBC = new Edge( "b","c" ); final Edge edgeCD = new Edge( "c","d" ); final Edge edgeDA = new Edge( "d","a" ); session.insert( edgeAB ); session.insert( edgeBC ); session.insert( edgeCD ); session.insert( edgeDA ); session.fireAllRules(); logger.writeToDisk(); session.dispose(); } public static class Edge { private String source; private String target; public Edge() {} public Edge(String source, String target) { super(); this.source = source; this.target = target; } public String getSource() { return source; } public String getTarget() { return target; } } public static class Reach { private String source; private String target; public Reach() {} public Reach(String source, String target) { super(); this.source = source; this.target = target; } public void setSource(String source) { this.source = source; } public String getSource() { return source; } public void setTarget(String target) { this.target = target; } public String getTarget() { return target; } } } Please tell me if you have any idea. Thanks, Paul Fodor _______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users