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

Can I trigger an update of a fact in drools programmatically?

有没有办法以编程方式更新 drools 中的事实? 我的意思是,而不是像

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

我可以定义一个函数来接受我的事实吗? RuleContext(我在那儿找不到)或其他一些 drools 特定接口来更新事实?

...
    $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 方法,以便事实的查找工作(因为我没有可用的事实句柄)。