Drools Drool查询在LHS中使用时行为不稳定

Drools Drool查询在LHS中使用时行为不稳定,drools,Drools,如果条件在查询中并且包含在触发该规则一次后插入的事实,则不取消规则匹配是否正常?或者这是drools 7.16中的某个bug 下面是一些我正在尝试做的简单例子 每次都是一样的,如果有三个对象事实(“chosenFact”),则规则触发一次: rule "Rule" when Fact(name == "chosenFact") not InsertedFact(name == "inserted_chosenFact") then insert(new InsertedF

如果条件在查询中并且包含在触发该规则一次后插入的事实,则不取消规则匹配是否正常?或者这是drools 7.16中的某个bug

下面是一些我正在尝试做的简单例子

每次都是一样的,如果有三个对象事实(“chosenFact”),则规则触发一次:

rule "Rule"
when
    Fact(name == "chosenFact")
    not InsertedFact(name == "inserted_chosenFact")
then
    insert(new InsertedFact("inserted_chosenFact"));
end
另一方面,这会触发一次、两次或三次:

query checkFact(String expectedName)
    Fact(name == expectedName)
    and
    not InsertedFact(name == "inserted_chosenFact")
end

rule "Rule" 
when
    checkFact("chosenFact";)
then
    insert(new InsertedFact("inserted_chosenFact"));
end

日志显示,有时创建的匹配会被取消,但有时不会。

希望第一个总是成功的匹配是惯用的,对吧?!“你真的必须让第二种方法起作用吗?”@uprego对于更简单的情况,是的,但是有一些更复杂的重复规则,我想从中提取重复。我能想到的唯一解决方案是将带有InsertedFact的条件保留在查询之外,这同样有效。
“inserted\u chosenFact”
必须是
查询checkFact(…)
,不是吗?@uprego是的,它是一个字符串,用于标识由该规则插入的对象。嘿@Margghorayeb,我完全改变了规则,并停止在LHS中使用函数,因为我注意到它们没有考虑工作记忆是如何变化的。