Drools,如何禁用正向链接?
我正在使用Drools规则引擎,我想知道是否可以定义何时可以执行规则。例如: 如果执行规则a导致执行10条规则B1到B10,作为规则a的结果,是否可以选择只执行一条Bi规则?? 例如:Drools,如何禁用正向链接?,drools,rule-engine,Drools,Rule Engine,我正在使用Drools规则引擎,我想知道是否可以定义何时可以执行规则。例如: 如果执行规则a导致执行10条规则B1到B10,作为规则a的结果,是否可以选择只执行一条Bi规则?? 例如: rule "Rule A" When $var : Data(value>10) then doSmthg(); Event e = new Event(); insert(e); end; 触发规则A将导致规则C的执行。 触发规则B将导致规则C的执行 我有没有办法做到即使在执行了规
rule "Rule A"
When
$var : Data(value>10)
then
doSmthg();
Event e = new Event();
insert(e);
end;
触发规则A将导致规则C的执行。
触发规则B将导致规则C的执行
我有没有办法做到即使在执行了规则a之后也不会触发规则C?同时,解雇B仍应导致执行规则C
编辑:
如果执行规则A,我还有其他规则需要被触发,例如:
rule "Rule D"
When
$e : Event()
then
doSmthgElse();
end;
因此,在本例中,我只想在不更改其他规则的情况下禁用规则C。您通过将数据插入工作内存来触发后续规则。如果不希望规则触发“下游”规则,请不要插入数据。或者,更新下游规则,使其不触发条件
考虑这三条规则,它们与您的规则相同,但语法已清理,缩进已修复
rule "Rule A"
when
Data( value>10 )
then
doSmthg();
insert(new Event());
end
rule "Rule B"
when
Data(range > 100)
then
doSmthg();
insert(new Event());
end
rule "Rule C"
when
$e : Event()
then
doSmthg();
end
假设您的输入是数据(值=100,范围=500)
。这就是将要发生的事情:
value>10
range>100
insert(new Event())
rule "New Rule A"
when
Data( value > 10 )
then
doSmthg();
// No insert!
end
规则B仍然会触发,因为它的条件(范围>100)仍然满足,并且它仍然将事件实例插入工作内存
或者,如果您实际上要做的是让A和B同时触发C,但只触发C一次,那么您可以通过在工作内存中插入一个信号量来指示C被触发 以下是一个例子:
rule "Rule A"
when
Data( value>10 )
then
doSmthg();
insert(new Event());
end
rule "Rule B"
when
Data(range > 100)
then
doSmthg();
insert(new Event());
end
rule "Rule C"
when
not( EventTriggered() )
$e : Event()
then
doSmthg();
insert( new EventTriggered() )
end
对于相同的输入(数据(值=50,范围=500)
),将发生以下情况:
not()
条件,规则C将再次触发not数据(值=5,范围=500)
仍将通过B触发规则C:
rule "New Rule A"
when
Data( value > 10 )
then
doSmthg();
// No insert!
end
rule "Rule A"
when
Data( value>10 )
then
doSmthg();
insert(new Event());
end
rule "Rule B"
when
Data(range > 100)
then
doSmthg();
insert(new Event());
end
rule "Rule C"
when
not( EventTriggered() )
$e : Event()
then
doSmthg();
insert( new EventTriggered() )
end