我可以在drools中以编程方式触发一个事实的更新吗?



是否有方法以编程方式更新流口水中的事实?我的意思是,而不是像

...
then
    $myFact.setNewValue("newValue");
    update($myFact);

我可以定义一个函数,将采取我的事实,例如RuleContext(我找不到它在那里)或一些其他口水特定的接口来更新一个事实?

...
    $myFact.setNewValue("newValue");
    myFunction($myFact, someDroolsInterface);

而myFunction则会使用someDroolsInterface调用给定事实的更新(或者是否有任何其他方法来做到这一点,作为结果的一部分,但没有在drools规则文件本身)?

这可能吗?

谢谢你的建议!

经过一段时间的搜索和调试,我发现有

org.drools.core.spi.KnowledgeHelper

(参见http://javadox.com/org.drools/drools-core/6.2.0.Final/org/drools/core/spi/KnowledgeHelper.html)

允许执行insert()和update()等操作。

我在规则(伪代码!)中使用它,例如,使用总是暴露的"kcontext"RuleContext:

...
then
    myService.doSomeServiceCall(kcontext, $myFact1, $myFact2);

在我的服务调用中,我有一些辅助方法,像这样:

protected void updateFacts(final KnowledgeHelper helper, final Object... facts)
{
    for (final Object fact : facts)
    {
        helper.update(fact);
    }
}

重要的是,事实正确地实现了equals/hashCode方法,以便对事实进行查找(因为我没有可用的事实句柄)。

最新更新