给定键\值对,找到满足并返回true的所有规则

时间:2015-01-13 17:52:56

标签: .net rules data-analysis

这是我今天集体讨论的一个有趣问题。

给定具有键/值对的对象和具有已定义规则/查询的系统/工具,找到返回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)

我希望系统返回给定对象的所有规则。然后根据真实的规则,执行特定操作。

这是一个简单的例子。有趣的一点:

  • 传递的对象可以包含任意数量的不同键值对
  • 可能需要执行数百或数千条不同的规则
  • 规则可以包含键值对的任意组合
  • 性能和可用性是关键
  • 可在.Net应用程序中使用

自定义实现的想法是:

执行map reduce,只返回包含对象键的规则。这将减少需要执行的规则数量,但仍可能是几百个规则。

获取每个规则并使用给定值执行它以查看它是否返回true。


有更好的方法吗? 是否有任何可以实现此目的的工具(希望是开源)?

搜索没有太多回复,我甚至无法想到要进行适当的搜索。


修改

经过一些在线搜索之后,事实证明这是可以使用Rete Algorithm和.Net和Java世界中的众多实现来解决的。

这是我目前要走的路。如果有人有任何更好的建议,请提供。

1 个答案:

答案 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 
}