用户修改的复杂决策系统 - Java

时间:2013-03-20 13:04:26

标签: java antlr drools business-rules

我遇到了一个问题,我想询问现有技术的替代方案,因为编程的功能很复杂并且会提供给用户,所以它应该像前端一样简单。我需要基于java的技术。

我需要做什么: 我有一个包含大量数据的基本结构。这些数据大多写得很好,如整数,日期,布尔等,所以可以轻松比较的东西。

我需要用多批需求来确定决策的模型,这些需求可以由内部业务流程和政府法律等许多来源定义和修改。

所以我想为用户提供脚本编写能力(他们中的大多数都拥有大学学位,所以有些复杂性可以。)
让我们看一个简化的例子。
设A是具有以下结构 A.budget - 整数
A.bankRelatedDebt - 整数
A.privateRelatedDebt - 整数
A.deadLine - 日期
A.hasPermissionFromGovernment - 布尔
A.hasProblematicContracts - 布尔

我需要定义规则来决定规则是站不起来,所以我需要布尔回来 规则1:预算超过100万欧元 规则2:没有问题的文件或得到政府的许可 规则3:截止日期不会在一个月的范围内 规则4:总债务(本地+私人)不超过100.000欧元

这些规则在其他情况下可能是硬编码的,但这必须是超级动态的并且基于给定的数据。

我们可以选择 drools antlr 如果您能提及,我需要替代方案。或者如果你能提到要避免的技术,这也很有帮助,也欢迎,所以我可以避免它。

5 个答案:

答案 0 :(得分:1)

为了它的价值。 我也很想做这样一个专家系统,所以请耐心等待。首先是你要问什么要避免的一些负面因素。

有许多陷阱。

“编程”由用户完成,可能没有用于恢复的版本控制系统,可能没有登台系统,但有一个在生产系统中工作。考虑明智地扩展公共库规则测试。没有单元测试?

然后有用户接受。特别是有一个竞争对手,Excel编程,你必须取代。使用人类可选文本块,图表生成报告。

你的编号规则仍然缺乏一些生命:系统可以协助提供以下选择的类别:规则1 - 对货币资源的限制。不错的是提议“你是否也想限制限制资源?(a)规则1,(b)......。

该产品又是什么?有什么好处?目标是什么? 报告,计算方案(假设,通过计算公差)。

我当然会首先在上面的行中编写技术文档,然后而不是搜索工具 - 正如您似乎正在做的那样。 Drools太基本了。我发现DSL的ANTLR存在风险。

工具

数据挖掘似乎是您要搜索的关键字。

JVM编程语言Scala(不容易获得)对DSL进行解析非常有效。 许多函数式语言都比较容易,也提供了脚本编写(Java脚本API)。

Web项目怎么样,可能使用jetty作为嵌入式Web服务器。因此,您可以应用HTML和JavaScript。 HTML5?

富客户端平台(eclipse或NetBeans)需要快速开发的经验。对于漂亮的图形,也许是JavaFX(太早了)。

答案 1 :(得分:1)

使用GroovyScala开发适合您需求的DSL。

我们使用CodeMirror在网页中提供语法突出显示。 Groovy非常适合我们。

答案 2 :(得分:1)

就像strategy pattern一样,所有不同的规则都适用于Context(A)不同的算法,算法可以在运行时选择。

为此添加过滤器链设计模式,以便您可以同时选择不同的算法(规则)。

Roolie是一个非常简单的Java规则引擎,可能对你有所帮助。正如Roolie所说:

Roolie是一个非常简单的Java规则引擎(非JSR 94),它使用您在Java中创建的规则。只需创建基本规则,为每个规则实现单个“传递”方法,然后将它们链接在一起,形成更复杂的规则。

答案 3 :(得分:1)

我会反对流口水,因为我有可怕的经历,但有些人喜欢它 我会提出一种已经集成在java:JavaScript中的语言。为什么呢?

  • 足够简单并且可以很好地访问java bean:而不是 budget.getDealLine()你可以使用budget.deadLine
  • 您有大量的地方可以查询信息
  • 您可以添加简单的功能,使其更易于使用

但如果选择JavaScript,Python,Drools,ANTLR请记住:

  • 用户没有像SVN / GIT这样的版本控制系统,所以它已经启动了 让你成功。
  • 为他们提供一个工具(网页或其他),自动保存他们编写的每个脚本的每个版本。
  • 给他们一种方法来测试他们写的东西而不会损坏任何东西。
  • 为他们提供工具以回滚他们所做的任何更改。
  • 在执行代码之前提交尽可能多的静态测试。
  • 语法突出显示会让他们更开心。

请记住:他们将以您不期望的方式使用该工具,并且您最终将编写(或重写)大多数脚本。没有大学学位意味着你可以信任他们了解他们在做什么。 (甚至不是CS!)

因此,如果您可以降低系统的动态,那将是您的利益

答案 4 :(得分:0)

如果您在数据库中有记录,则可以使用SQL语法选择匹配的记录。

例如:

SELECT * FROM data
    WHERE budget > 100000
      AND privatCredits < 50000