杰斯解除并积累了CE

时间:2014-08-07 11:45:46

标签: rule-engine jess accumulate

我是Jess The Rule Engine的新手,我遇到了一个简单的查询问题。 我有一个简单的java bean文件和一个.clp文件。通过使用java bean文件,我创建了word对象,并使用.clp我通过定义规则,对导入的java对象执行一些处理,这些对象现在位于Jess的工作内存中。在我描述的规则的最后,我想执行一个查询,它将找到最高的句子编号 - sentenceNumber是我的Word事实中的一个槽变量 - 通过使用accumulate条件元素。而且我想将结果值返回给Java代码。问题是,如果我在查询中使用累积CE而不是在规则中使用,那么我写的查询会给出错误。

所以我的问题是:在查询中使用累积CE是不合适的吗? 我找不到任何说是或否的材料。

下面我给你我的疑问:

(defquery get-Total-Sentence-Number
 "this query gets the total number of newly created sentences"
 ;(accumulate <initializer> <action> <result> <conditional element>)
 ?result <- (accumulate (bind ?max FALSE) ;initializer
                        (if (or (not ?max);action
                        (> ?sentenceNumber ?max))
                             then (bind ?max ?sentenceNumber))
                        ?max ;result
                        (Word (sentenceNumber ?sentenceNumber))))

请帮忙。 谢谢

P.S。我不想在规则中使用累积CE,因为据我所知,规则会在事实列表的每次更改中反复激活。我只想在我定义的规则结束时只需执行一次这样的操作。

1 个答案:

答案 0 :(得分:0)

我认为有一个限制。无论如何,在查询中运行累积并不是真的有意义。定义返回事实的查询会更容易:

(defquery get-words
   (Word (sentenceNumber ?sentenceNumber)))

运行它,并在查询集合的迭代中评估最大值:

(bind ?result (run-query* get-words))

(bind ?max 0)
(while (?result next) do
    (bind ?snr (?result getString sentenceNumber))
    (if (> ?snr ?max) then (bind ?max ?snr))
)
(printout t "max: " ?max crlf)

<强>后来 然后我推荐以下方法:

;; define an auxiliary fact
(deftemplate MaxWord (slot maxSentence))

;; initialze one fact
(deffacts  maximum
  (MaxWord (maxSentence 0))
)

;; a rule to compute the maximum
(defrule setMax
  ?mw <- (MaxWord (maxSentence ?ms))
  (Word (sentenceNumber ?snr & :(> ?snr ?ms)))
=>
  (modify ?mw (maxSentence ?snr))
)

 ;; the query
(defquery getMax
   (MaxWord (maxSentence ?maxSentence)))

;; obtain the result
(bind ?result (run-query* getMax))
(?result next)
(bind ?max (?result getString maxSentence))
(printout t "max: " ?max crlf)

请注意,如果收回Word事实,则这不起作用,这必然会使最大值无效。

通过使用具有累积的规则和在规则应该触发时需要断言的初始(辅助)事实,可以实现完全不同的方法。这样可以避免频繁重复累积。基本上是:

(defrule "calcMax"
  (FreeToCalc)
  ?result <- (accumulate (bind ?max 0)
                    (if  (> ?sentenceNumber ?max)
                         then (bind ?max ?sentenceNumber))
                    ?max
              (Word (sentenceNumber ?sentenceNumber))))
 =>
 ;;...
 )