是否可以使用相同的规则回答多个问题?

时间:2012-09-26 12:56:24

标签: drools rule-engine

我正在评估业务规则引擎。我和Drools玩了一点,但看起来,我宁愿寻找一个查询驱动的反向链接系统。

更具体地说,让我们看一个像这样的简单业务规则:

when
    (amount > 1000 AND amount < 2000 AND currency == USD)
    OR
    (amount > 750 AND amount < 1500 AND currency == EUR)
then
   approve loan

是否可以仅使用此规则并“询问”Drools回答这些问题:

  1. 如果货币是美元,获得贷款的必要条件是什么? 我希望结果如下:(amount > 1000) AND (amount < 2000)

  2. 是否可以获得2000欧元的贷款? (预期答案:错误)

  3. 如果不可能,那么拒绝的主要原因是什么? (预期答案:amount >= 1500

  4. Drools是否只能使用一条规则来回答这类问题? 从理论上讲,这些信息都存储在规则中,但我不知道如何从中“提取”。

    如果Drools不是这种情况的最佳规则引擎,那么有没有提供此类功能的引擎?

2 个答案:

答案 0 :(得分:0)

与许多其他规则引擎一样,Drools使用RETE算法来决定运行哪些后果,规则的所有部分必须与当时要运行的部分匹配。

对于您的问题1和2: 如果您想要多个“答案”,您可以使用多个规则,也可以使用累积功能。

3: 您无法知道为什么没有调用规则,您需要将拒绝案例表示为单独的规则,当拒绝案件的具体条件得到满足时,该规则将被触发。

答案 1 :(得分:0)

在RETE引擎中,生产包含多个条件,因此基本上我们可以将您的规则定义为:

P1 = C1 ^ C2 ^ C3其中C1 =量> 1000; C2 =金额&lt; 2000; C3 =货币==美元

我还建议你将你的OR条件分成两个不同的作品。 P2 = C4 ^ C5 ^ C6 其中C4 =量> 750; C5 =量&lt; 1500; C6 =货币== EUR;

(请注意,在生产系统中,您实际上没有OR,并且由于可追踪性要求,其中一些甚至不允许您编写OR条件)

并回答你的问题:

  1. 您只需查询共享C3的所有作品,作为您条件的一部分。
  2. 使用您的输入执行您的规则并获得结果
  3. 查询没有令牌的beta内存,并在相应的网络alpha内存中传递C5的判别条件。
  4. 并非所有规则引擎都允许您查询beta内存和令牌。检查Drools是否允许您检索alpha,beta记忆和存储的令牌。基本上你需要遍历内部的RETE图。