我正在使用一些规则来标准化服务提供商查找失败的街道地址。
我已定义此规则
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
这将在插入“南大街”之前正常工作。别名“南方主”将变得含糊不清。
第二条规则应该发生什么?它会发现冲突吗?它会发射两次以便最后一次获胜吗?
我对应该发生什么的理论感兴趣,因为我对规则引擎很新。
答案 0 :(得分:0)
many pattern/many object pattern match problem的基本原则是引擎应该生成所有可能的匹配。在基于规则的系统中,这意味着引擎必须在评估约束时探索所有可能的组合,并为每个规则创建激活,在各种元组中组合事实,然后将其用于规则触发。
如果您将地址存储为
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
会找到“相似”的街道名称(但请注意,此规则会经常引发 - 你能明白为什么吗?)
请注意,即使是全名也不能保证单个城市内的唯一性......