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

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

Моё правило

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, чтобы сопоставление с образцом могло происходить на лету в памяти.Ищите указатели на то, как мне этого добиться.

1 Ответ

0 голосов
/ 07 марта 2019

Я бы написал два отдельных правила.Один, чтобы добавить страну каждого города в список стран.Еще один, чтобы добавить каждый город в соответствующую страну.Для обоих методов добавления '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
...