Java 如何在Drools中使用exists和$p?
有没有办法将Java 如何在Drools中使用exists和$p?,java,drools,Java,Drools,有没有办法将exists与变量$p一起使用,然后在Drools规则的RHS中引用它 我想用exists检查我的工作内存中是否存在对象,以避免规则多次匹配,但我想保存对匹配对象的引用,以便在RHS中使用它 举例说明我想要什么: rule "Print a Person" when exists ($p: Person()) <- This fails in drools then System.out.println("Hello "+$p.getName()); end
exists
与变量$p
一起使用,然后在Drools规则的RHS中引用它
我想用exists
检查我的工作内存中是否存在对象,以避免规则多次匹配,但我想保存对匹配对象的引用,以便在RHS中使用它
举例说明我想要什么:
rule "Print a Person"
when
exists ($p: Person()) <- This fails in drools
then
System.out.println("Hello "+$p.getName());
end
规则“打印一个人”
什么时候
exists($p:Person())您不需要使用exists
,只需使用如下所示的代码-只有在存在类型为Person()
的事实时,规则才会被激活。如果工作记忆中有多个类型为Person()
如果即使工作内存中存在多个类型为person
的事实,您也确实希望只处理一个人,那么您可以创建一个新类Processed
,将其用作事实,并在then
子句中插入一个实例作为事实。如下所示:
rule "Print a Person"
when
$p: Person()
not Processed()
then
System.out.println("Hello "+$p.getName());
insert(new Processed());
end
PS:我没有测试过上面的代码,但在我的项目中使用过这样的代码。它说明了如何完成您正试图完成的工作为了完整性起见,这里还有另一种可能性,它不需要特殊字段或插入已处理的事实,但它要求您具有唯一的有序属性,例如个人身份证号(社会保险号)或类似属性
rule "fire for one Person"
when
$p: Person( $id: id )
not Person( id > $id )
then
...
end
这将选择id最小的人。第二个建议不会像广告宣传的那样起作用:它仍然会为每个人激发事实,除非您设法只插入一个processed==false的人。@laune是的,您是对的。谢谢-将删除它
rule "fire for one Person"
when
$p: Person( $id: id )
not Person( id > $id )
then
...
end