当前位置: 首页 > 知识库问答 >
问题:

Drools基于数据的策略服务器规则引擎

袁俊弼
2023-03-14

这是我的用例。我们正在尝试使用Drools实现策略服务器。可能有几十万(~200K)条规则,都是基于数据驱动的。一些示例规则:

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]

注意:我在这里只使用了4个参数,但在任何给定的规则中最多可以有20个参数

策略#1和策略#2看起来简单明了。然而,策略#3很棘手。策略#3的最后一个条件(BORN\u STATE\u supporting=TRUE)表示策略上的状态是“包含的”,这意味着,如果规则匹配,结果将是“不允许的”,但是,如果所有参数匹配但不匹配,则结果应该是“允许的”。对于我们的用户来说,这只是一种方式,不能列出这种情况下的所有47个州。

其他用例很少:

  • 在用户维护规则时查找并防止重复规则
  • 正如我提到的,可能有成千上万个这样的规则,所以如果有冲突(多个冲突的规则匹配),我们应该考虑高优先级规则的结果。

我们的用户既不喜欢Drools Guvnor,也不相信它适合我们的需求。因此,我们的任务是构建一个自定义UI来管理规则。我计划提出一个DSL,供我们的用户以编程方式使用和生成DRL文件。我不确定Drools DSL功能是否适用于此。

我熟悉Drools和DRL文件。但是,我不确定Drools中的一些复杂性是否可以解决(例如:查找重复规则和策略#3),以及Drools是否能够处理负载。任何参考或方向将不胜感激。

BORN\u STATE\u Supporting更新:

Polic#3预期行为:

Input #1:   Female, Age=15, State=NC
===> [Expected Outcome = NotAllow]
Input #2:   Female, Age=25, State=NC 
===> [Expected Outcome = <age not in range, rule didn't match>] (Neither NotAllowed Nor Allowed) 
Input #3:   Female, Age=15, State=NY 
===> [Expected Outcome = Allow] (Opposite of NotAllow)

简而言之,如果除BORN\u STATE之外的所有其他条件都匹配,则结果必须与规则相反。而且,如果任何其他条件不匹配,则必须无视该规则。

共有1个答案

茅慈
2023-03-14

您正在创建一个没有并发症的地方:BORN_STATE_SUPPORTIVE可以通过提供运算符Not IN来消除。

至于测试:您有一个具有离散坐标的20维空间,这意味着点数至少为2^20。在运行时发现多个或没有匹配项不成问题,因此为这种情况提供一个被研究人员接受的解决方案可能是可行的。如果您需要确保这种情况永远不会发生,您必须验证您的规格。

我建议不要使用优先级。

不要创建O(100000)规则。一个类似的案例并没有少起作用。

至于验证:您的逻辑基于20维空间S中的点集。您有两个集,A∪ F=S和A∩ F=Φ 。每个规则定义一个子集Ai⊂ A、 你需要检查一下∪Ai=A和Ai∩ Aj=Φ≠ j、 这不是一个大问题,可以在一两天内实现(除非你在17个维度中有一些非常奇怪的东西,你没有展示)。

更新:15岁女孩有一组州:{AL:NY,ND:WY}。所以您将有一个参数集({15},{AL:NY,ND:WY},…),可能还有其他的,比如({16:20},{AL:WY},…),({21:99},{AL:WY},…)。

如果专家们说,除了来自北卡罗来纳州的15岁女性外,所有州(15-99岁)的女性都符合条件,那么你就必须计算出设定的差值

({15:99},{AL:WY}) - ({15},{NC})

作为相互不相交集的并集(其中有一个最优解,除此之外还有许多最优解)。--我对保险单只有一个门外汉的理解,但我很确定处理这些集合代数运算的好策略是不言而喻的。毕竟,“不允许”并不是一些随机操作的结果。

 类似资料:
  • 我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是:

  • 我是个新来的流口水的人,正在尝试为牙齿保险申请设计一些规则。系统基本上会让用户知道,根据之前执行的服务的历史记录,他们将要执行的程序可能不在保险范围内。它还将有其他规则,可能是基于年龄的,但我可以处理这些规则。 我的事实是: 患者-患者信息列表 服务-以前执行的服务。(即:服务代码=D1234,执行日期=日期) 警报-(alertName=“X射线2/12个月期间”) 我需要一条规则,说明患者在过

  • 现在,我们正试图根据业务规则的需要集成。我们希望将所有规则存储在数据库中,这些规则将在JBPM服务器启动时(或Java VM启动时)加载。因此,规则将被加载到工作内存中,并可在需要时在JBPM流程中使用。 这里有2个问题:- 1)如何完成这一工作(从数据库加载规则,并在JBPM服务器加载时将它们放入JBPM和Drools的工作内存中)? 其思想是,一旦加载了规则,就可以根据需要访问进程中的任何地方

  • 在Firestore中,我有一个拥有所有者的项目集合。 所有者可以是用户,应该允许用户读取其文档。 使用可以执行以下操作: 但是对于引用字段,在涉及安全规则时似乎没有任何文档。 我尝试了以下安全规则: 并如下所示进行查询: 但我仍然缺少或权限不足。

  • 我有这样的情况,在规则文件中的所有规则必须检查执行。如果我的理解是正确的,文档所说的规则将由引擎任意执行。 我有一个或多个疑问。 > 我在许多地方得到了答案,我必须使用显著性功能来按顺序执行它们。如果我使用显著性,并且我有执行所有规则的要求,它真的会大规模地影响性能吗?如果是,它会如何影响性能,甚至规则引擎也会任意执行所有规则,比如一些随机顺序。 提前谢谢。