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