Как обновить состояние списка, чтобы 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