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
将找到“相似”的街道名称(但请注意,这条规则会触发得太频繁-你知道为什么吗?)
请注意,即使是全名也不能保证单个城市中的唯一性