我是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,因为据我所知,规则会在事实列表的每次更改中反复激活。我只想在我定义的规则结束时只需执行一次这样的操作。
答案 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))))
=>
;;...
)