Drools - 决策 table 具有多个相同类型的导入对象

Drools - Decision table with multiple imported objects of same type

我决定 table 多次导入同一类型:be.example.Person。一个人是犯罪者,另一个人是法定监护人。

这是决定的开始table:

决定 table 的编译成功,但是在运行时,它没有返回预期的结果。我为决定 table 插入事实的方式如下:

StatefulKnowledgeSession ksession = null;
    try {
        ksession = ruleEngine.createStatelessKnowledgeSession();
        ksession.setGlobal("result", result);
        ksession.insert(offender);
        ksession.insert(legalGuardian);
        ksession.fireAllRules(1);
    } finally {
        if(Controles.isRenseignee(ksession)) {
            ksession.dispose();
        }
    }

似乎当我触发规则时,drools 似乎将对象插入两次 p:Person 而不是:第一个是 p:Person,第二个是 q:Person.

或者换句话说,执行好像是这样的:

  1. 执行规则 1,违规者为 p:Person
  2. 使用 legalGuardian 作为 p:Person
  3. 执行规则 1
  4. 执行规则 2,违规者为 p:Person
  5. 使用 legalGuardian 作为 p:Person
  6. 执行规则 2

然而,我原以为它会表现得像:

  1. 执行规则 1,罪犯为 p:Person,legalGuardian 为 q:Person。
  2. 执行规则 2,legalGuardian 为 p:Person,legalGuardian 为 q:Person。

drools不支持这种功能吗?过去我们使用类似的决策 tables,其中对象的类型不同并且看起来工作正常。但在这种情况下,对象是同一类型的,它不。

有人知道这是不可能的还是我以错误的方式注入对象?

正在使用的 drools 版本是 5.5。0.Final。

对两个相当不同的实体使用完全相同的 class 并不是好的设计。好的和坏的确实有几个共同的属性:姓名、年龄等等。但是 alreadyConvicted 标志应该只为违法者保留。

为获得最佳效果,请考虑子class人:

class Offender extends Person {
    private boolean alreadyConvicted;
    //...
}
class Guardian extends Person {
}

并根据您应有的一些信息创建和插入它们。

决定table应该有p:Offenderq:Guardian

如果你在人海中寻找可能的 Offender 和 Guardian 对,你必须通过使用咒语 this != p 和第二个 Person 模式来确保 p 和 q 不同.