基于层次匹配的规则引擎

Rule Engine based on hierarchical matching

说,我有一个具有这种结构的数据集(城市):

我有一个配置 table (key, value) 其中键可以是上述参数的组合

例如:

{
    "continent": "asia"
}

{
    "continent": "asia",
    "country" : "india"
}

{
    "continent": "asia",
    "country" : "india",
    "state" : "maharashtra",
    "city" : "mumbai"
}

现在,我想对第一个数据集中的城市与配置中的条目进行最接近的匹配。

例如,如果我有

city: mumbai, state: maharashtra, country: india, continent: asia

它应该匹配上面配置中的第 3 个条目。

如果我有

city: tokyo, state: Kantō, country: japan, continent: asia

它应该匹配上面配置中的第一个条目。

如果有适合这种情况的东西,我正在寻找建议。

如果有的话,我愿意以某种不同的方式存储配置。

理想情况下,我想要一个可以传递 多个 条目(输入)的解决方案,它应该 return 每个输入的最接近匹配配置。

冒着误解问题的风险,我会:

  • 在树状数据结构中收集配置条目,以便更快地检索
  • 通过遍历该树,一次找到单个数据条目的匹配项

这是它的样子:

class Config:
    def __init__(self):
        self.continents = {}

    def add(self, config):
        collection = self.continents
        for prop in ["continent", "country", "state", "city"]:
            if prop not in config:
                break
            key = config[prop]
            if key not in collection:
                collection[key] = {}
            collection = collection[key]
        collection["config"] = config

    def get(self, data):
        collection = self.continents
        config = None
        for prop in ["continent", "country", "state", "city"]:
            if prop not in data or data[prop] not in collection:
                break
            collection = collection[data[prop]]
            if "config" in collection:
                config = collection["config"]
        return config

以上class可以如下使用

首先创建一个实例,并用配置条目填充它:

config = Config()

config.add({ "continent": "asia"})
config.add({ "continent": "asia", "country": "india" })
config.add({ "continent": "asia", "country": "india", 
             "state": "maharashtra", "city": "mumbai" })

然后迭代您的数据条目,并为每次调用config.get获得最佳匹配配置。例如:

print(config.get({ "city": "mumbai", "state": "maharashtra", 
                   "country": "india", "continent": "asia"}))

print(config.get({"city": "tokyo", "state": "kantō", 
                   "country": "japan", "continent": "asia"}))