Drools 流口水和不明确的匹配有什么关系?

Drools 流口水和不明确的匹配有什么关系?,drools,rule-engine,Drools,Rule Engine,我正在玩弄一些规则来标准化从服务提供商处查找失败的街道地址 我已经定义了这个规则 rule "Derive Street Aliases" when $street : Street(); then insert( new StreetAlias($street.getPrefixPart() + " " + $street.getStemmedPart(), $street.getName()) ); end 它采用类似“South Main street”的街道名

我正在玩弄一些规则来标准化从服务提供商处查找失败的街道地址

我已经定义了这个规则

rule "Derive Street Aliases"
when
    $street     : Street();
then
    insert( new StreetAlias($street.getPrefixPart() + " " + $street.getStemmedPart(), $street.getName()) );
end 
它采用类似“South Main street”的街道名称,并创建别名“South Main”

然后,另一条规则会选择别名:

rule "Street Alias Match"
when
  $userAddress : UserAddress();
  $streetAlias : StreetAlias(alias == $userAddress.getStreetPart());
then  
  $userAddress.setResolvedAddress($userAddress.getNumberPart() + " " + $streetAlias.getName());
end
在插入一条“南大街”之前,这条路可以正常工作。那么别名“South Main”就会变得模棱两可

那么在第二条规则中会发生什么呢?它会检测到冲突吗?它会发射两次以便最后一个获胜吗


我对应该发生什么的理论很感兴趣,因为我对规则引擎还比较陌生。

引擎应该产生所有可能的匹配是基本原则。在基于规则的系统中,这意味着引擎必须探索所有可能的组合,同时评估约束并为每个规则创建激活,将各种元组中的事实组合在一起,然后用于规则触发

如果您的地址存储为

class Address {
    String streetSpecific;
    String streetGeneric;
}
即使在同一个城市,相同的“特定”零件也可以与多个通用零件一起使用。(尽管如此,也会出现街道全名的重复。)使用别名

class Alias {
    String specific;
}
此规则查找所有可能的匹配项

rule "find possibles"
when
    Alias( $spec: specific )
    Address( streetSpecific == $spec )
then
    // another possible match
end 
规则呢

rule "find similar"
when
    $a1: Address( $spec: streetSpecific  )
    $a2: Address( this != $a1, streetSpecific == $spec )
then
    // display similar pair
end
将找到“相似”的街道名称(但请注意,这条规则会触发得太频繁-你知道为什么吗?)

请注意,即使是全名也不能保证单个城市中的唯一性