基于层次匹配的规则引擎
Rule Engine based on hierarchical matching
说,我有一个具有这种结构的数据集(城市):
- ID
- 城市
- 州
- 国家
- 大陆
我有一个配置 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"}))
说,我有一个具有这种结构的数据集(城市):
- ID
- 城市
- 州
- 国家
- 大陆
我有一个配置 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"}))