当前位置: 首页 > 知识库问答 >
问题:

口水规则有什么问题?

毋澄邈
2023-03-14

我有很长时间使用JBOSS Drools的经验。我正在处理的当前项目使用Drools 4。

这是我在项目中的一条规则

rule "testcase"
   salience 300
    when
        $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
        not Tegret(targetId == $item.targetId)
    then
        retract ($item);
end

想法是从没有关联目标对象的工作内存中收回此类项目。我正在使用工作内存中的这些对象对其进行测试:

项目{itemId=7305,itemTYpeId=Item\u TYPE\u A,targetId=-1023}目标{targetId=-1023}

在这种情况下,规则不应该开火,但它确实开火了。经过大量实验,我发现了这种奇怪的行为:

规则“testcase2”激发,而“testcase1”不激发。

rule "testcase1"
   salience 300
    when        
        $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
        Tegret(targetId == $item.targetId)
    then
        ...
end

rule "testcase2"
   salience 300
    when        
        $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
        Tegret($ti:targetId)
        eval($ti == $item.targetId)

    then
        ...
end

那么这里出了什么问题?我在不同的程序运行中分别运行“testcase1”和“testcase2”。

共有1个答案

柯易安
2023-03-14

好吧,经过大量的实验和摆弄,我发现:我不知道它是否是错误,但这是由于“链接”字段之间的类型差异而发生的。

塔格里特。targetId是int基元。项目targetId是长基元。

以这种方式重写规则解决了问题:

rule "testcase"
   salience 300
    when
        $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
        not Tegret(targetId == ((long)$item.targetId))
    then
        retract ($item);
end

请重新阅读文档,以找到有关字段“兼容性”限制的任何提示。无结果

 类似资料:
  • 我需要帮助流口水。问题是,当我运行一个应用程序时(其他情况下是在Spring完成的),当我试图激发所有规则时,只有第一个规则启动,其他规则无法启动。 这是一个我的drl文件与一些我的3条规则。 下面是我打电话给kieSession解除所有规则的地方。

  • 我不太会流口水和咕噜。 我有一个关于规则流的基本问题。 我在guvnor插件上使用引导编辑器创建了3条规则。现在我想根据第一条规则的结果调用第二条或第三条规则。 e、 g.如果患者年龄小于18岁,则进行第二条规则的小检查,否则请调用第三条规则由高级医生进行检查。 那么,这可以通过使用规则流来实现吗?如果是,如何?是否有任何示例链接和文档来演示它?非常感谢您的帮助。 谢啦

  • Drools文档提到,规则可以使用诸如生效日期和过期日期之类的属性来指定绝对规则有效期。 例如 Drools还支持周期性重复的规则,间隔为,cron为,但这意味着规则是在这样的点触发的。 我很感兴趣,如果有任何选项如何指定定期可用(不解雇)的规则与时间限制。例如,让我们想象一些公司的营业时间-操作只能在正式工作期间执行,但不能在下班后执行。 我想要这样的东西,但这不是Drools的有效规则 是否可

  • 我刚开始流口水,遇到了一个问题。 我简化了规则以显示问题: 基本上,我想计算特定路段上发生的事件(路段是道路的一部分)。当同一链接上发生3个事件时,我希望触发规则。 上面的规则几乎起作用了,但是当它发射时,它发射了3次,每个事件发射一次。我只希望它发射一次。 我错过了什么? 非常感谢。

  • 我有一个。DRL文件,其中包含10条规则。一旦我插入一个事实,一些规则可能会匹配-我如何找出哪些规则是以编程方式匹配的?

  • 我有一个drl文件,它在两个规则流组中包含规则:“第一个规则流组”和“第二个规则流组”。这些组的激活取决于“规则A”和“规则B”。是否有任何方法可以停用规则B,以便在规则A条件匹配时触发,从而仅将焦点设置为“第一个规则流组”?