【问题标题】:Drools: Prioritize fact matching based on a field's valueDrools:根据字段的值优先考虑事实匹配
【发布时间】:2017-09-18 13:05:25
【问题描述】:

考虑 Drools 中的以下场景: 我们有一个规则,将 AB 类型的对象相互匹配。

rule 1
    when
        $a : A()
        $b : B($a.matches($b), flagged == false)
    then
        mofidy($b) { flag($a) }
end

但是,A 对象有一个名为priority 的字段,当B 到达工作内存时,具有最高优先级的匹配A 应该标记它,高于所有其他匹配的As . 这在 Drools 中怎么可能?它如何影响性能?

【问题讨论】:

    标签: drools drools-fusion


    【解决方案1】:

    假设B.flag() 将其flagged 属性设置为true,您可以尝试以下操作:

    rule 1
    when
        $a : A()
        not A(this != $a, priority > $a.priority)
        $b : B($a.matches($b), flagged == false)
    then
        mofidy($b) { flag($a) }
    end
    

    在此示例中需要注意的一点是,如果插入了具有高优先级的 A 对象,则任何已标记为较低 A 的 B 都不会被重新标记。

    如果你需要重新标记你的 Bs,那么你可以尝试这样的事情:

    rule 1
    when
        $a : A()
        not A(this != $a, priority > $a.priority)
        $b : B($a.matches($b), flag != $a)
    then
        mofidy($b) { flag($a) }
    end
    

    希望对你有帮助,

    【讨论】:

    • 感谢您的回答! when 段是否选择优先级最高的A,然后检查它是否匹配任何B?还是它为给定的B 选择最高匹配的A
    • 第一个条件是检查任何A,第二个条件是过滤具有最高优先级的A(实际上是过滤除具有最高优先级的所有A)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2016-11-25
    • 1970-01-01
    • 2014-07-21
    • 2015-08-27
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多