这是我今天集体讨论的一个有趣问题。
给定具有键/值对的对象和具有已定义规则/查询的系统/工具,找到返回true的所有规则。
例如给一个人:
{
"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)
我希望系统返回给定对象的所有规则。然后根据真实的规则,执行特定操作。
这是一个简单的例子。有趣的一点:
自定义实现的想法是:
执行map reduce,只返回包含对象键的规则。这将减少需要执行的规则数量,但仍可能是几百个规则。
获取每个规则并使用给定值执行它以查看它是否返回true。
有更好的方法吗? 是否有任何可以实现此目的的工具(希望是开源)?
搜索没有太多回复,我甚至无法想到要进行适当的搜索。
经过一些在线搜索之后,事实证明这是可以使用Rete Algorithm和.Net和Java世界中的众多实现来解决的。
这是我目前要走的路。如果有人有任何更好的建议,请提供。
答案 0 :(得分:1)
为什么要单独执行地图
尽快中止测试
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
}