Drools:基于PHREAK堆栈的评估和向后链接
前一段時間,我寫了一篇有關我們新算法的博客: http : //blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html
有人問我有關新的基于堆棧的系統以及向后鏈接如何工作的信息。 我在電子郵件中回復了他們,但我認為其他人可能會發現它很有用,因此請將其粘貼在下面。 它是從我的大腦直接寫到頁面上的,因此在某些地方有點粗糙。 但我希望有人覺得它有用,無論如何。
-
評估規則時,它將從根到尖端進行評估。
對于每個節點,它評估所有可能的聯接并生成一個元組集。 然后,該子元組集將傳遞到子節點。 傳入的元組集稱為srcTupleSet(用于變量名),然后將所有子級放入trgTupleSet中。 trgTupleSet傳遞到子節點,在此它成為srcTupleSet。
第245行顯示了此循環: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L245
srcTuples = trgTuples; // previous target, is now the source輸入節點后,它具有許多評估該節點所需的變量。 節點ID,節點內存,段內存,srcTupleSet,trgTupleSet。 通過創建引用這些值的StackEntry,可以暫停和恢復任何節點(在稍后的時間進行評估)。 StackEntry放置在堆棧上。 這是StackEntry類: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/StackEntry.java
出于兩個原因需要這樣做,即反向鏈接和子網。 向后鏈接是通過查詢節點完成的。
當傳播到達查詢節點時,它需要暫停對當前規則的評估-因此它創建了StackEntry并將其放置在堆棧中。
第459行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L459
查詢只是沒有RHS的規則,沒有后果。 它收集到達終端節點的所有結果,并將其返回給調用方。 查詢節點允許規則通過傳入參數來調用查詢。 通過插入DroolsQuery對象來完成查詢,該對象與根模式匹配并觸發傳播:
參見第67行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java
LeftInputAdapterNode.doInsertObject(handle, pCtx, lian, wm, lm, false, dquery.isOpen());像序言一樣,參數可以綁定或不綁定。 綁定參數是一個固定變量,而未綁定參數是一個固定變量。 在實現方面,我們不對未綁定的參數施加約束。 這允許經典的序言“傳遞閉包”類型查詢。 雖然規則可以調用查詢,但是查詢也可以調用查詢(我們沒有制表法來檢測無限循環)。
query isContainedIn( String x, String y )Location( x, y; )or( Location( z, y; ) and isContainedIn( x, z; ) ) end注意drools支持模式中的位置參數和空位參數。 這是通過將所有位置映射到插槽來完成的。
可在此處找到有關反應式和非反應式傳遞閉包的上述查詢的逐步操作指南, 網址為 : https : //www.youtube.com/watch?v=fCjIRVSRFvA
對于評估查詢,當trgTulupleSet到達終端節點時,它將迭代并將每個元組添加到“收集器”。
參見第65行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryTerminalNode.java#L65
收集器創建一個特殊的子元組,可以將其添加到調用父級。
參見第343行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/reteoo/QueryElementNode.java#L343
查詢完成評估后,將返回。 然后,重新調整過程允許執行程序訪問堆棧,并在其中彈出StackEntry并恢復評估-但現在查詢結果可用。
參見第166和173行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
可以反應性和非反應性地調用查詢。 非反應式意味著沒有剩余內存,查詢也沒有打開。 反應性地意味著有剩余的內存,查詢保持打開狀態。 反應式查詢是完全增量式的,并且支持更新和刪除:
參見143和169行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java#L143
我們用于元組和“嵌套”(查詢結果)元組的數據結構高效且“無復制”和“無搜索” –都是雙鏈表。 這對于使增量查詢有效很有必要。
子網使用類似的技術。 在到達子網的點上,外部規則被掛起(放在堆棧上),并創建內部網絡評估。
參見第593和604行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java
子網完成后,外部規則將恢復并將結果放入外部子節點的正確輸入中:
第662行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L662
如前所述,當前我們提供惰性規則評估,但不提供增量規則評估。 一旦開始規則評估,就會生成所有元組。 但是,由于堆棧條目可以在任何節點中暫停和恢復,因此它也可以用于提供增量規則評估-盡管我們現在不這樣做。 實際上,您在正確的輸入上“獲取”了X個對象-可以是1或5或25或100。該數量使您可以調整延遲與吞吐量。 如果仍然有未評估的正確輸入,請創建一個StackEntry,以在當前傳播完成后強制對該節點進行重新評估。
翻譯自: https://www.javacodegeeks.com/2014/01/drools-phreak-stack-based-evaluations-and-backward-chaining.html
總結
以上是生活随笔為你收集整理的Drools:基于PHREAK堆栈的评估和向后链接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑键盘内部结构(电脑键盘内部结构图)
- 下一篇: linux的压缩和解压(linux的压缩