我将向您展示一些您需要做的不同事情的示例,并留给您将它们组合成适用于您的应用程序的规则。
警告 - 我没有执行以下示例,因此可能存在错误/错别字。
首先,以下代码将收集工作记忆中对每位患者执行的所有服务。
rule "Count patient services"
when
$patient : Patient()
$serviceList : ArrayList() from collect (
Service(patientId == $patient.id)
)
then
System.out.println("Patient " + $patient.id
+ " has received " + $serviceList.size() + " services.");
end
当患者接受超过 2 项具有特定代码的服务时,以下匹配项:
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode == "D1234"
)
)
当患者接受超过 2 项与代码列表匹配的服务时,以下匹配项。
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode in ("D1234", "E5678")
)
)
以下查找最近的匹配服务日期:
accumulate (
Service(
patientId == $patient.id,
serviceCode in ("D1234", "E5678"),
$datePerformed: datePerformed
);
$mostRecentDate: max($datePerformed)
)
同样,您可以添加对日期或其他属性的约束。
维护代码组的一种有效机制是插入组成员资格事实。电子表格或网络决策表可以轻松完成此操作,或者您可以查询数据库并通过 API 插入它们。IE
insert( new ServiceGroup( "HighCostService", "D1234" ) );
insert( new ServiceGroup( "HighCostService", "D5678" ) );
然后你可以用这样的约束进行匹配:
$highCostServices : ArrayList() from accumulate (
ServiceGroup( group == "HighCostService", $serviceCode ),
init( ArrayList list = new ArrayList(); ),
action( list.add($serviceCode); ),
reverse( list.remove($serviceCode); ),
result(list)
)
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode in $highCostServices
)
)
nb - 累加器很容易出错,所以我通常会围绕它们进行一些单元测试。上面的代码是在这里徒手编写的,没有在任何地方运行它,所以如果它在没有更正的情况下工作,你可能会很幸运。
更多详细信息,请参阅手册:
http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/
列表中的匹配项:
4.8.3.3.10.10。in 和 not in 的运算符(复合值限制)
收集匹配事实的列表:
4.8.3.7.3。条件元素收集
用于计算集合的最大值、最小值、总和等值的累加器:
4.8.3.7.4.1。累积 CE(首选语法)