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