如何在jess中比较java对象

时间:2014-10-02 02:45:05

标签: jess

当我将java对象作为java类中的属性进行比较时,我遇到了问题

这是我的clp文件

(import Model.*)

(deftemplate PizzaBase    
    (declare (from-class PizzaBase)  
             (include-variables TRUE)))  

(deftemplate PizzaTopping   
    (declare (from-class PizzaTopping)  
             (include-variables TRUE)))  

(deftemplate Pizza   
    (declare (from-class Pizza)  
             (include-variables TRUE)))  

(defrule make-pizza
        ?pizzaBase1 <-(PizzaBase{size == 9})
        (Pizza(pizzaBase ?pizzaBase1))  
        =>  
         (add (new PizzaBase "New DeepPan" 10))  
         )  

根据我的规则,我想创建一个新的pizzaBase。当Pizza中的pizzaBase对象等于pizzaBase1(size = 9),但JESS并没有为我创造新的事实。 根据我的想法,我认为JESS无法比较从类中创建的Java对象。因此,没有任何事实可以添加到JESS。

那么,&#34;如何解决这个问题?&#34;因为我查看了JESS网站上的手册,但根据我的问题没有任何标题。

感谢!

1 个答案:

答案 0 :(得分:2)

您可能忽略了第5.3.2节,将Java对象添加到工作内存中。

即使您使用from-class和include-variables从POJO派生shadow(!)事实,Java对象也不会与事实相同。事实包含对您插入的Java对象的引用,方法是在保留的插槽名称(add ?aNewObject)中调用OBJECT

像这样更改你的规则:

 (defrule make-pizza
    (PizzaBase{size == 9}(OBJECT ?pizzaBase1))
    (Pizza(pizzaBase ?pizzaBase1))  
    =>  
     (add (new PizzaBase "New DeepPan" 10))  
     )