Drools,如何禁用正向链接?

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的执行 我有没有办法做到即使在执行了规

我正在使用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的执行

我有没有办法做到即使在执行了规则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)
。这就是将要发生的事情:

  • 规则A将命中,因为满足条件
    value>10
  • 规则B将命中,因为满足条件
    range>100
  • 规则C将命中两次,因为工作内存中有两个事件实例(一个由规则A添加,一个由规则B添加)
  • 根据您的问题,在这种情况下,我们不希望因为规则A而触发规则C。为此,我们需要将规则A更改为不触发规则C。这很简单:从规则A的右侧删除
    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)
    ),将发生以下情况:

  • 规则A将把事件插入工作内存
  • 规则B将把事件插入工作内存
  • 规则C将从这些事件之一触发。它将在工作内存中插入EventTrigger的实例
  • 由于未满足
    not()
    条件,规则C将再次触发not
  • 使用此设置,输入
    数据(值=5,范围=500)
    仍将通过B触发规则C:


  • 规则A不会开火(条件未满足,值您是否已经问过这个问题?只需从规则A中删除“插入”即可。我不能这样做,因为如果规则A为真,我还有其他规则需要触发。只有规则C不应在规则A之后触发。我的要求是规则C只应由规则B触发,但我需要规则A保持原样,因为它可能导致错误。)对于其他规则的执行。顺便说一句,这只是一个示例。我要寻找的是一种控制规则何时可以允许其他规则触发它而不改变其他规则的方法,只有有问题的规则n​​​​​​o​​​​​​​.​​​​​​​​​​​​ 您必须编写规则,使其不会触发您不希望触发的规则。您可以尽可能查看激活组,但这根本不是您要问的问题。
    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