如何更新列表状态,以便Rete拾取添加在其中的对象以进行规则重新评估

时间:2019-01-28 20:38:06

标签: ibm-odm rete

我正在使用IBM 8.9.2,并且有一种情况,我需要在对这些值进行分组时根据列表Y中的值创建列表X。
例如,假设我有一个城市列表,并且每个 City 对象(在 cityList 列表中)都有一个属性-国家。现在,我想反转关系并创建一个 countries 列表,该列表由具有 containedCities 列表的 Country 对象组成。

我的规则是

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 :(得分: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