0

让我描述一下我的用例的抽象,这样问题的意图就会很清楚。

用例:

(i). If there is already an object objA of type A, create another obj2A of type 
     A.
(ii).If there are more than one object of type A, create an object objB of type 
     B.

我只想将 Drools 用于检查工作内存中的匹配项,因此仅用于查询部分。对象创建部分不受 Drools 控制。我只问 Drools (i) 或 (ii) 中的哪一个匹配(或两者都匹配),然后决定要做什么。

因此,首先我创建了一个 A 类型的 objA 并将其放入工作内存中。

现在我向 Drools 查询匹配项。

状态 0) 只会匹配 (i),我将创建另一个 A 类型的对象并放入工作内存中。

状态 1) 现在情况 (i) 和 (ii) 都匹配。假设我只使用 (ii) 并创建 objB 并放入工作内存中。

状态 2) 在这个阶段,Drools 是否会再次进行计算以检查条件 (i) 是否匹配,或者它将使用之前运行的查询中的匹配信息?

从理论上讲,我想知道 Drools 如何管理增量模式匹配。

  • 另外,我如何要求 Drools 给我模式匹配并使用上一次运行的匹配?
  • 如果 Drools 给我一个匹配并且我不使用它,例如状态 1 中的 match (i),Drools 可以将匹配保留在一边并跳过重新计算吗?

请让我知道我是否应该提供更多信息。

4

1 回答 1

0

您必须用更严格的语言(例如逻辑)来描述您的用例。

规则

rule another_A1 when A() then insert( new A() ); end

可能会检查您的用例 (i) 但这非常危险,因为新创建的 A 将立即触发此规则,您将创建另一个 A 等等,依此类推。但是这个

规则 another_A2 当存在 A() 然后插入( new A() ); 结尾

可能会更好:您正在寻找一个或多个 A 的存在。

用例 (ii) 类似,同样取决于您如何检查是否存在两个或多个 A 事实。

生产规则系统的引擎将评估工作记忆中的事实状态,触发匹配规则并不断重新评估情况。左侧的评估在良好的系统中得到优化,甚至部分匹配也保留在网络中以供进一步使用。您无需提出任何要求 - 只要您保留会话,这是标准程序。然而,一个新的会话是一个新的游戏。

于 2017-08-11T14:56:34.763 回答