首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >决策树和规则引擎(Drools)

决策树和规则引擎(Drools)
EN

Stack Overflow用户
提问于 2011-02-03 14:38:46
回答 3查看 14.4K关注 0票数 10

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

在每个终端节点(圆圈)中,我需要运行一个操作(更改对象的字段、日志信息等)。我尝试使用Drool框架,但在这种情况下,我需要为图中通向端点节点的每一条路径编写一个长规则。Drools流似乎也不是为这样一个用例而构建的--我接受一个对象,然后,根据沿途的决策,我最终进入一个结束节点;然后再为另一个对象创建。还是真的是这样?你能给我举几个例子/链接到这样的解决方案吗?

更新:

Drools流调用可能如下所示:

代码语言:javascript
复制
// 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流,它一直运行得很好。我的决策过程并不像Drools专家所要求的那么简单,并且取决于决策树中的位置,它需要从数据库加载对象列表、转换对象、进行决策、记录一切等等。我使用传递给流程的Process对象作为参数,并存储我的所有全局变量(用于流程),以及在树的不同位置重复的一些方便的方法(比如在Script Task节点中编写Java代码本身不太方便)。最后,我还使用了Java来做决策(而不是mvel或规则)--它更快,而且更容易控制。我使用的所有对象都作为参数传递,并在代码中作为普通Java变量使用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-03 15:33:53

流口水专家绝对是该走的路。

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

代码语言:javascript
复制
// 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)上的文档。在这种情况下,您可能会对每条规则重复整个路径,但在大多数情况下,这实际上是可以的。

票数 12
EN

Stack Overflow用户

发布于 2011-02-03 15:12:34

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

票数 0
EN

Stack Overflow用户

发布于 2014-05-26 12:35:20

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4887456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档