Что делает Drools с неоднозначными совпадениями?

Я играю с некоторыми правилами, чтобы стандартизировать уличные адреса, которые не удалось найти у поставщика услуг.

Я определил это правило

rule "Derive Street Aliases"
when
    $street     : Street();
then
    insert( new StreetAlias($street.getPrefixPart() + " " + $street.getStemmedPart(), $street.getName()) );
end 

Он берет название улицы, например «Южная главная улица», и создает псевдоним «Южная главная улица».

Затем это другое правило подбирает псевдоним:

rule "Street Alias Match"
when
  $userAddress : UserAddress();
  $streetAlias : StreetAlias(alias == $userAddress.getStreetPart());
then  
  $userAddress.setResolvedAddress($userAddress.getNumberPart() + " " + $streetAlias.getName());
end

Это будет работать нормально, пока не будет вставлена ​​​​«Южная главная авеню». Тогда псевдоним «Южный Майн» станет двусмысленным.

Что тогда должно произойти во 2-м правиле? Обнаружит ли он конфликт? Будет ли он стрелять дважды, чтобы последний выиграл?

Меня интересует теория того, что должно произойти, так как я новичок в Rules Engines.


person Alex R    schedule 05.04.2015    source источник


Ответы (1)


Это фундаментальный принцип множественного шаблона/. много проблем с совпадением шаблонов объектов, что движок должен производить все возможные совпадения. В системе, основанной на правилах, это означает, что движок должен исследовать все возможные комбинации, оценивая ограничения и создавая активации для каждого правила, комбинируя факты в различных кортежах, которые затем будут использоваться при срабатывании правила.

Если у вас есть адреса, сохраненные как

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

найдет «похожие» названия улиц (но обратите внимание, что это правило будет срабатывать слишком часто — понимаете, почему?)

Учтите, что даже полное название не является гарантией уникальности в пределах одного города...

person laune    schedule 06.04.2015