Drools对模糊比赛做了什么?

时间:2015-04-05 21:37:45

标签: drools rule-engine

我正在使用一些规则来标准化服务提供商查找失败的街道地址。

我已定义此规则

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

这将在插入“南大街”之前正常工作。别名“南方主”将变得含糊不清。

第二条规则应该发生什么?它会发现冲突吗?它会发射两次以便最后一次获胜吗?

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

1 个答案:

答案 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

会找到“相似”的街道名称(但请注意,此规则会经常引发 - 你能明白为什么吗?)

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