给定 key\value 对,找到满足 return true 的所有规则
Given key\value pairs, find all rules that satisfy and return true
这是我今天一直在思考的一个有趣的问题。
给定一个具有 key/value 对的对象和一个具有定义 rules/queries 的 system/tool,找到所有 return 为真的规则。
例如给定一个人:
{
"FirstName": "John",
"LastName": "Smith",
"Age": 28,
"Gender": "Male",
"Location": "USA"
}
并给出一些规则:
Rule 1: Location = USA AND (Gender = Male OR Age < 20)
Rule 2: Location != USA AND (Gender = Female OR Age > 25)
我希望系统 return 给定对象的所有规则都是正确的。然后根据正确的规则,做一个具体的动作。
这是一个简单的例子。有趣的部分:
- 传递的对象可以有任意数量的不同key\value对
- 可能有成百上千条不同的规则需要执行
- 规则可以包含键值对的任意组合
- 性能和可用性是关键
- 可用于 .Net 应用程序
自定义实现的想法是:
做 map reduce 并且只 return 包含来自对象的键的规则。这将减少需要执行的规则数量,但仍可能是几百条规则。
获取每条规则并使用给定值执行它以查看它是否return为真。
有更好的方法吗?
是否有任何工具(希望是开源的)已经可以做到这一点?
搜索return不多,我什至想不出合适的搜索。
编辑
在网上进行了更多搜索后,发现这可以使用 Rete Algorithm 以及 .Net 和 Java 世界中的大量实现来解决。
这是我目前正在走的路。如果大家有更好的建议请提供。
为什么要单独一步映射
尽快中止测试
private bool? ruleMe (person p, rule r)
{
foreach (string rKey in r.ExtractKeys())
if(!p.ContainsKey(rKey)) return (bool?)null;
// process r
}
或扩展两者以创建 Key
的 HaskSet
public class person
{
private HashSet<String> hSkey;
public HashSet<String> HSkey
{
if (hSkey == null)
{
hSkey = new HashSet<String>();
// populate hSkey
}
return hSkey;
}
}
private bool? ruleMe (person p, rule r)
{
if(!r.HSkey.IsProperSubset(p.HSkey)) // O(n of r.HSKey)
return (bool?)null;
// process r
}
这是我今天一直在思考的一个有趣的问题。
给定一个具有 key/value 对的对象和一个具有定义 rules/queries 的 system/tool,找到所有 return 为真的规则。
例如给定一个人:
{
"FirstName": "John",
"LastName": "Smith",
"Age": 28,
"Gender": "Male",
"Location": "USA"
}
并给出一些规则:
Rule 1: Location = USA AND (Gender = Male OR Age < 20)
Rule 2: Location != USA AND (Gender = Female OR Age > 25)
我希望系统 return 给定对象的所有规则都是正确的。然后根据正确的规则,做一个具体的动作。
这是一个简单的例子。有趣的部分:
- 传递的对象可以有任意数量的不同key\value对
- 可能有成百上千条不同的规则需要执行
- 规则可以包含键值对的任意组合
- 性能和可用性是关键
- 可用于 .Net 应用程序
自定义实现的想法是:
做 map reduce 并且只 return 包含来自对象的键的规则。这将减少需要执行的规则数量,但仍可能是几百条规则。
获取每条规则并使用给定值执行它以查看它是否return为真。
有更好的方法吗? 是否有任何工具(希望是开源的)已经可以做到这一点?
搜索return不多,我什至想不出合适的搜索。
编辑
在网上进行了更多搜索后,发现这可以使用 Rete Algorithm 以及 .Net 和 Java 世界中的大量实现来解决。
这是我目前正在走的路。如果大家有更好的建议请提供。
为什么要单独一步映射
尽快中止测试
private bool? ruleMe (person p, rule r)
{
foreach (string rKey in r.ExtractKeys())
if(!p.ContainsKey(rKey)) return (bool?)null;
// process r
}
或扩展两者以创建 Key
的 HaskSetpublic class person
{
private HashSet<String> hSkey;
public HashSet<String> HSkey
{
if (hSkey == null)
{
hSkey = new HashSet<String>();
// populate hSkey
}
return hSkey;
}
}
private bool? ruleMe (person p, rule r)
{
if(!r.HSkey.IsProperSubset(p.HSkey)) // O(n of r.HSKey)
return (bool?)null;
// process r
}