Drools,如何检查具有特定属性的对象在列表中是否存在多次

Drools,如何检查具有特定属性的对象在列表中是否存在多次,drools,Drools,我的工作记忆中有很多人。我需要写一个规则来检查工作记忆中是否存在两个具有相同someProperty的人。我写了如下内容,但问题是,当确实有两个PersonEntity具有相同的someProperty时,sys.out执行两次: when $person : PersonEntity(person.personType == PersonType.LegalPerson); $personList : ArrayList( size > 1 ) from collect

我的工作记忆中有很多人。我需要写一个规则来检查工作记忆中是否存在两个具有相同someProperty的人。我写了如下内容,但问题是,当确实有两个PersonEntity具有相同的someProperty时,sys.out执行两次:

when 
    $person : PersonEntity(person.personType == PersonType.LegalPerson);
    $personList : ArrayList( size > 1 ) from collect( PersonEntity(someProperty.id == $legalPerson.someProperty.id))    

then
    System.out.println("error occured");
我也尝试过这个,但我认为,由于我的工作记忆中有很多个人,规则执行了4次(个人数量),我的“出错”句子在控制台中出现了4次:

  PersonEntity(some conditions, $relatedId :relatedPerson.id); 
  exists PersonEntity(some conditions, relatedPerson.id > $relatedId)

此问题的标准解决方案是使用唯一属性添加另一个约束,该属性保证排序

when
   PersonEntity(personType == PersonType.LegalPerson, $pid: personId)
   exists PersonEntity(personType == PersonType.LegalPerson, personId > $pid)
then
   // two LegalPerson
如果您希望有三个或更多相同的模式,您甚至可能需要添加另一个模式来阻止多个激活:

when
   PersonEntity(personType == PersonType.LegalPerson, $pid: personId)
   not PersonEntity(personType == PersonType.LegalPerson, personId < $pid )
   exists PersonEntity(personType == PersonType.LegalPerson, personId > $pid)
then
   // two or more LegalPerson
什么时候
PersonEntity(personType==personType.LegalPerson,$pid:personId)
非个性化(personType==personType.LegalPerson,personId<$pid)
存在PersonEntity(personType==personType.LegalPerson,personId>$pid)
然后
//两个或两个以上的法律顾问
(除非你真的需要所有这些,否则使用collect的建议并不好。)

即使在您需要检查任何personType时,这也会起作用:

 when
   PersonEntity( $pt: personType, $pid: personId)
   not PersonEntity(personType == $pt, personId < $pid )
   exists PersonEntity(personType == $pt, personId > $pid)
then
   // two or more $pt
什么时候
PersonEntity($pt:personType,$pid:personId)
非个性化(personType=$pt,personId<$pid)
exists PersonEntity(personType==$pt,personId>$pid)
然后
//两个或更多$pt

在这里,您可以添加一个collect而不是第三个模式来获取所有这些人格事实。

您的样本中的人格是什么?我的Personentity还没有持续存在,因此没有id…我使用了你的建议如下,但我认为,由于我的工作记忆有很多Personentity(而不是一个Personentity列表),规则执行了不止一次(Personentity的数量),我的“错误发生了”句子在控制台中出现多次:PersonEntity(某些条件,$relatedId:relatedPerson.id);exists PersonEntity(某些条件,relatedPerson.id==$relatedId)您是否使用了
$id:id*和
id>$id`约束?是的,但它没有做任何更改,我不知道如何说只执行一次规则?您到底使用了什么?将它添加到您的问题中,否则它将不可读。最后一对条件是省略
not
模式(我的答案中的第2条和第3条规则)。省略此项会将每个PersonEntity绑定到您的第一个模式(和$person),因此该规则会为每个PersonEntity触发一次。只有将其限制为最小的id,您才能获得一次激活。此外,此“relatedPerson”是否是与每个PErsonEntity关联的唯一实体?请注意,排序所需的必须是唯一(数字)键值。不幸的是,否,我的personEntities在此步骤中没有唯一id(尚未持久化…)relatedPerson是PersonEntity的关联。我想知道在工作记忆中是否有两个实体具有相同的relatedPerson类型与具有唯一的数字属性无关。您可以在创建对象时使用静态计数器添加此项。还有:当你在寻找同一个相关人员时,为什么要使用>呢?最初,它是personType——如果你不遵循建议并一直改变目标,就很难提出建议。