【问题标题】:Drools - Decision table with multiple imported objects of same typeDrools - 具有多个相同类型的导入对象的决策表
【发布时间】:2015-10-21 23:31:59
【问题描述】:

我有一个包含多个相同类型导入的决策表: be.example.Person 。一个人是罪犯,另一个人是法定监护人。

这是决策表的开始:

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

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 似乎将对象插入 2 次为 p:Person 而不是:第一个是 p:Person,第二个是 q:Person。

或者换个说法,执行好像是这样的:

  1. 以 p:Person 身份执行 rule1
  2. 以 legalGuardian 为 p:Person 执行 rule1
  3. 以 p:Person 身份执行 rule2
  4. 以 legalGuardian 为 p:Person 执行 rule2

然而,我本来希望它表现得像:

  1. 以 p:Person 和 legalGuardian 为 q:Person 执行 rule1。
  2. 使用 legalGuardian 作为 p:Person 和 legalGuardian 作为 q:Person 执行 rule2。

drools 不支持这种功能吗?过去,我们使用类似的决策表,其中对象的类型不同并且似乎工作正常。但在这种情况下,如果对象的类型相同,则不会。

任何人都知道这是不可能的,或者我是否以不正确的方式注入对象?

使用的drools版本是5.5.0.Final。

【问题讨论】:

  • 如果你在你的程序中调用了一个变量offender或者legalGuardian,Drools并不知道这些名字的含义。此外,除了您不会为潜在监护人测试 alreadyConvicted 的语义结论之外,规则中没有任何内容可以让 Drools 区分好与坏。

标签: java drools


【解决方案1】:

对两个完全不同的实体使用相同的类并不是好的设计。好与坏确实有几个共同点:名字、年龄等等。但是已经定罪的旗帜应该只为罪犯保留。

为获得最佳结果,请考虑将 Person 子类化:

类罪犯扩展人{ 私人布尔已经定罪; //... } 类监护人扩展人{ }

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

决策表应该有p:Offender 和q:Guardian。

如果您要在人海中寻找可能的犯罪者和守护者对,您必须通过使用咒语 this != p 以及第二个人模式来确保 p 和 q 不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2018-02-28
    • 2013-03-05
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多