2015-01-13 28 views
1

這是我今天進行頭腦風暴的一個有趣問題。鑑於鍵/值對,找到所有滿足並返回true的規則

給定一個具有鍵/值對的對象和一個定義了規則/查詢的系統/工具,找到所有返回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應用程序

CU的想法stom執行是:

做map reduce並只返回包含對象中的鍵的規則。這將減少需要執行的規則的數量,但仍可能是幾百條規則。

取出每個規則並用給定的值執行它,看它是否返回true。


有沒有更好的方法來做到這一點? 是否有任何工具(希望開源)已經完成了?

搜索沒有多少回報,我什至不能想到一個適當的搜索。


編輯

一些網上搜索更多的,原來在這之後是可以解決的使用Rete Algorithm並在.NET和Java世界衆多的實現。

這是我目前朝下的路徑。如果有人有更好的建議,請提供。

+0

一個HaskSet給定一個對象做你想要的清單那個對象的規則是真的嗎?或者給定一些規則來獲得滿足這些規則的所有對象? –

+0

存在問題 - Windows Workflow Foundation包含推理規則引擎(System.Workflow.Activities.Rules) - 但它沒有智能來映射減少規則。祝你好運。 –

+0

給定該對象,返回該對象的所有規則。 – Zadam

回答

1

爲什麼一個單獨的步驟來映射

就中止測試儘快

private bool? ruleMe (person p, rule r) 
{ 
    foreach (string rKey in r.ExtractKeys()) 
     if(!p.ContainsKey(rKey)) return (bool?)null; 
    // process r 

} 

或延長既能營造的重點

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 
} 
+0

我的關注點是性能。給定一個具有一百個屬性和幾千條規則的對象。 – Zadam

+0

你累了嗎?什麼比IsProperSubset更快? – Paparazzi

+0

真的你的關注是性能。我剛剛測試了1,000個對象,每個100個屬性,10,0000個規則100個屬性,每個P4的總計時間爲4秒。 4秒是一個性能問題?你在找什麼? – Paparazzi

相關問題