决策树和规则引擎(Drools)

时间:2011-02-03 14:38:46

标签: java drools decision-tree expert-system drools-flow

在我正在处理的应用程序中,我需要定期检查成千上万个对象的资格,以获得某种服务。决策图本身采用以下形式,更大:Decision diagram

在每个终端节点(圆圈)中,我需要运行一个动作(更改对象的字段,日志信息等)。我尝试使用Drool Expert框架,但在这种情况下,我需要为图中的每个路径编写一条长规则,从而导致结束节点。 Drools Flow似乎也没有为这样的用例构建 - 我拿一个对象,然后,根据一路上的决定,我最终进入一个终端节点;然后又为另一个对象。或者是吗?你能给我一些这些解决方案的例子/链接吗?

更新

Drools Flow调用可能如下所示:

// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();

for(int i = 0; i < 10000; i++) {

    Application app = somehowGetAppById(i);

    // insert app into working memory
    FactHandle appHandle = ksession.insert(app);

    // app variable for action nodes
    params.put("app", app);

    // start a new process instance
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
    while(true) {
        if(instance.getState() == instance.STATE_COMPLETED) {
            break;
        }
    }

  // remove object from working memory
    ksession.retract(appHandle);
}

那就是:我将获取一个Application对象,为它启动一个新进程,当进程完成时(最终,动作节点将以某种方式修改应用程序),我将从工作内存中删除该对象并重复新App对象的过程。您对此解决方案有何看法?

解决方案:
我最终使用了Drools Flow,它一直很好用。我的决策过程并不像Drools Expert所要求的那样简单,并且取决于决策树中的位置,它需要从数据库加载对象列表,转换它们,做出决策,记录所有内容等等。我使用Process对象作为参数传递给进程并存储我的所有全局变量(对于进程)以及在树中不同点重复的一些便捷方法(因为在Script Task节点中编写Java代码不是很方便自己)。我最终也使用Java来做决定(而不是mvel或规则) - 它更快,我说更容易控制。我使用的所有对象都作为参数传递,并在代码中用作普通的Java变量。

3 个答案:

答案 0 :(得分:12)

Drools expert 绝对是您要走的路。

如果你想避免为更高的节点重复自己,那么诀窍是使用insertLogical(如果你处于无状态会话中,只使用insert)并理解规则可以触发规则(这不是你父亲的SQL查询)。例如:

// we just insert Customer objects in the WM

rule "evaluateRetired"
when
    $c : Customer(age > 65)
then
    insertLogical(new Retiree($c));
end

rule "evaluteRetireeIsFemale"
when
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer)
then
    ...
end

如果决策图经常更改(并且您希望非程序员对其进行编辑),请查看决策表(以及 DSL )上的文档。在这种情况下,您可能会重复每条规则的整个路径,但在大多数情况下这实际上都可以。

答案 1 :(得分:0)

我有一个类似的问题,并使用Neo4J节点数据库作为一个简单而非常灵活的规则引擎。 您可以使用它与REST服务接口,因此它独立于主应用程序。 您还可以使用单独的应用程序来配置规则(即使是最终用户)。

答案 2 :(得分:-1)

您可以尝试iLog框架兼规则引擎。