Drools “口水法则”;“不存在”;

Drools “口水法则”;“不存在”;,drools,business-rules,Drools,Business Rules,我正在使用JBoss Drools编写一些业务规则。“不存在”规则有问题。这是我的代码 rule "ATL 27R-A12 Subfleet A319-100 Departure configuration list has flap 1" salience 20 no-loop true when AircraftConfig(aircraftType=="A319-100") RunwayInfo(airport3lCode== "AT

我正在使用JBoss Drools编写一些业务规则。“不存在”规则有问题。这是我的代码

rule "ATL 27R-A12 Subfleet A319-100 Departure configuration list has flap 1"
    salience 20
    no-loop true
    when
        AircraftConfig(aircraftType=="A319-100")
        RunwayInfo(airport3lCode== "ATL", runwayId == "27R-A12" )
        not (exists (DepartureConfiguration( flap == 1 )))
    then
        throw new RuleNotMatchException("The configurations do not match the rule of this runway.");
end
我的事实包括:一个
AircraftConfig
、一个
RunwayInfo
和几个
DepartureConfiguration
。我想在没有
DepartureConfiguration
flap=1
的情况下触发规则。我的意思是,如果有三个
departureconfiguration
,其中一个有
flap=1
,其他的是
flap=2
flap=3
,则此规则不会触发。
我如何才能做到这一点?

检查事实不存在的关键字是
,不
不存在
。将条件的最后一行更改为:

not DepartureConfiguration( flap == 1 )

事实上,我的规则有些冲突。我曾经认为规则应该从drl文件的顶部运行到最后。我通过添加规则流解决了我的问题。也感谢你们给我的建议。

没错,但“不(存在(…)”也应该有效,只是会变得多余和昂贵。我想问题出在其他方面。虽然代码中有多余的“exists”,但仍然应该触发规则。但你不应该因为规则的结果而提出例外。单从你的描述是不可能知道问题出在哪里的。你能补充细节吗?另外,您使用的是哪个版本的Drools?@EdsonTirelli我使用的是Drools 5.3.0-final。我不确定您想要什么详细信息,所以我只是复制了我的Java代码:
List result=new ArrayList();KnowledgeBase kbase=readKnowledgeBase(“跑道A319.landing.drl”);无状态知识会话ksession=kbase.newStatelessKnowledgeSession();列表事实=新的ArrayList();事实。添加(副标题);添加(跑道);facts.addAll(配置);执行(事实)这是kbase中唯一的规则吗?尝试对条件进行注释,以了解哪一个条件阻止规则触发。您可以使用审核日志或eclipse调试器来找出问题所在,但对于一个简单的规则来说,只需注释出条件,找出其中一个失败,然后我们就可以尝试诊断问题。@EdsonTirelli我开始相信他们一定是我的java代码出了问题,而不是规则。我使用
forall(DepartureConfiguration(flap==1))
,它不会触发,但当我使用
forall(DepartureConfiguration(flap!=1)
时,它会触发。