Как обновить состояние списка, чтобы Rete выбирал добавленные в него объекты для переоценки правил

Я использую IBM 8.9.2, и у нас есть сценарий, в котором мне нужно создать список X на основе значений из списка Y при группировании по этим значениям.
Например, допустим, у меня есть список городов, и у каждого объекта City (в списке cityList) есть атрибут - страна. Теперь я хочу инвертировать отношения и создать список стран, который состоит из объектов Country, имеющих список содержимого Cities.

Мое правило

definitions
    set 'cities' to all cities in cityList;
    set 'a city' to a city in 'cities'
    set 'countries' to all countries in countryList;
    set 'a country' to a country in 'countries'

if 
    the country code of 'a city' is the country code of 'a country'
then
     add 'a city' to the contained cities of 'a country' ; (** Assume B2X/XOM has method for adding the city to the country list)
else
      create country for 'a city' and add it to countryList ; (** Assume appropriate B2X/XOM)

Добавление страны в countryList не будет обновлять ее состояние объекта и, следовательно, не будет повторно включать ее в повестку дня для повторной оценки правил после выполнения правил для первого города cityList.
В результате получается список стран с новым объектом Country, созданным для каждого города, а не для группы, которая была запланирована.
Цель, к которой я стремлюсь, состоит в том, чтобы я вставил в память как cityList, так и countryList и включил Rete, чтобы сопоставление с образцом могло происходить на лету в памяти.

Ищите указатели на то, как мне этого добиться.

0 ответов

Я бы написал два отдельных правила. Один, чтобы добавить страну каждого города в список стран. Еще один, чтобы добавить каждый город в соответствующую страну. Для обоих методов добавления 'BOM ' должен быть проверен 'Обновить состояние объекта'. Примечание: я добавил комментарии к правилам, где ODM не допускает такое.

Первое правило

definitions
    set 'the city' to a city in cityList ;

if 
    the country code of 'the city' is not one of the country codes of countryList // Assume BOM method exists
then
     add the country code of 'the city' to the country codes of countryList ; // Assume BOM method exists

Второе правило

definitions
    set 'the city' to a city in cityList ;
    set 'the country' to a country in countryList 
        where the country code of this country is the country code of 'the city';

if 
    'the city' is not one of the cities of 'the country' // Requires City.equals method
then
     add 'the city' to the cities of 'the country' ; // Assume BOM method exists
Другие вопросы по тегам