这是我的用例。我们正在尝试使用Drools实现策略服务器。可能有几十万(~200K)规则,都基于数据驱动。几个例子规则:
int selectedId = radioGroup.getCheckedRadioButtonId();
// find the radiobutton by returned id
radioButton = (RadioButton) findViewById(selectedId);
Toast.makeText(MyAndroidAppActivity.this,
radioButton.getText(), Toast.LENGTH_SHORT).show();
注意:我这里只使用了4个参数,但任何给定规则中最多可以有20个参数
政策#1和政策#2看起来简单直接。但是,政策#3很棘手。策略#3的最后一个条件POLICY #1: Gender = Male &&
AGE BETWEEN 30 AND 40 &&
BORN_STATE IN (NC,CA,PA)
===> [Outcome = Allow]
POLICY #2: (Gender = Male OR Gender = Female) &&
AGE = 40 &&
COUNTRY IN (USA,UK,BRA, IND)
===> [Outcome = Allow]
POLICY #3: Gender = Female &&
(AGE BETWEEN 10 AND 20 || BORN_YEAR > 1990) &&
BORN_STATE IN (NC,CA,PA) &&
BORN_STATE_SUPPORTIVE = TRUE
===> [Outcome = NotAllow]
表示策略中的状态是“包含”的,这意味着,如果规则匹配,结果将(BORN_STATE_SUPPORTIVE = TRUE)
但是,如果所有参数都匹配但不是{{1} }(例如女性,年龄= 15,州=纽约)然后结果应该是“允许”。对于我们的用户来说,不要为这种情况列出所有47个州。
其他几个用例很少:
我们的用户既不喜欢Drools Guvnor,也不相信它适合我们的需求。因此,我们的任务是构建一个自定义UI来管理规则。我打算想出一个用户使用的DSL并以编程方式生成DRL文件。我不确定Drools DSL feature会为此工作。
我熟悉Drools和DRL文件。但是,我不确定Drools中是否可以解决某些复杂问题(例如:查找重复规则和策略#3),如果Drools能够处理负载。任何,参考或方向将不胜感激。
"NotAllow"
的更新:
Polic#3预期行为:
BORN_STATE
简而言之,如果除了BORN_STATE_SUPPORTIVE
之外的所有其他条件都匹配,则结果必须与规则相反。并且,如果任何其他条件不匹配,则必须忽略该规则。
答案 0 :(得分:0)
您正在创建一个没有一个复杂功能的复杂功能:通过提供运营商BORN_STATE_SUPPORTIVE
可以消除NOT IN
。
至于测试:你有一个具有离散坐标的20维空间,这意味着点数至少为2 ^ 20。在运行时发现多个匹配或不匹配不会是一个问题,因此提供boffins为这种情况接受的解决方案可能是要走的路。如果您需要确保永远不会发生这种情况,则必须验证您的规格。
我建议不要使用优先级。
不要创建O(100000)规则。类似的案例并不适用于此。
至于验证:您拥有的逻辑基于20维空间S中的点集。您有两组,A ∪ F = S
和A ∩ F = Φ
。每个规则定义一个子集Ai⊂A,您需要检查所有i≠j的∪Ai = A
和Ai ∩ Aj = Φ
。不是一个大问题,可以在一两天内实施(除非你在未显示的17个维度中有一些非常奇怪的东西)。
<强>更新强> 15岁女孩有一组州:{AL:NY,ND:WY}。所以你将有一个参数集({15},{AL:NY,ND:WY},...),可能是其他参数集,如({16:20},{AL:WY},...) ,({21:99},{AL:WY},......)。
如果boffins说来自所有州的所有(15-99)名女性除了来自北卡罗来纳州的15岁女孩之外都有资格,你将不得不计算设定差异
({15:99},{AL:WY}) - ({15},{NC})
作为相互不相交的集合的联合(有一个最优解决方案,还有更多解决方案)。 ---我只有外行人对保险单的理解,但我很确定处理这些集合代数运算的好策略将是相当明显的。毕竟,“不允许”不是随机操作的结果。