2016-07-21 7 views
0

Я новичок в JESS и умерен на Java.Как написать JESS defrule «если значение не существует в списке, а затем распечатать предупреждение»

У меня есть «CList» в качестве списка специальных товаров (в том числе «основных» и «региональные» товары), и «xList» в виде списка всех товаров (в том числе «существенные» и «несущественные» товаров) Я хочу сделать правило: если «x» из «xList» со статусом «essential» не существует в «cList», тогда напечатайте «Отсутствует существенный товар x».

Чтобы быть ясным, шаблон моей системы такой же, как пример pricing_engine в Jess71p2.

  • CList так же, как CatalogItems
  • xList так же, как ТоварыЗаказа

Я объявляю deftemplate из классов Java. вот deftemplate;

(import com.aisy.entity.*) 
    (deftemplate oldList(declare (from-class oldList))) 
    (deftemplate xList (declare (from-class xList))) 
    (deftemplate cList (declare (from-class cList))) 

Вот xList.java

package com.aisy.entity; 
    import java.sql.Timestamp; 
    public class xList { 
      private Long id_commodity; 
      private String commodity; 
      private String essentiality; 
      private Timestamp update; 

     public xList() { 
      super(); 
     } 

     public xList(Long id_commodity, String commodity, String essentiality, Timestamp update) { 
      super(); 
      this.id_commodity = id_commodity; 
      this.commodity = commodity; 
      this.essentiality = essentiality; 
      this.update = update; 
     } 

     public Long getId_commodity() { 
      return this.id_commodity; 
     } 

     public void setId_Commodity(Long id_commodity) { 
      this.id_commodity = id_commodity; 
     } 

     public String getCommodity() { 
      return this.commoditty; 
     } 

     ....getter and setter methods for the rest fields 
    } 

Вот cList.java;

public class cList { 
     private Long id_commodity; 
     private String commodity; 
     private String price; 
     private Double final_price; 

     public cList(Long id_commodity, String commodity, String price, Double final_price) { 
      super(); 
      this.id_commodity = id_commodity; 
      this.commodity = commodity; 
      this.price = price; 
      this.final_price = final_price; 
     } 

     public cList() { 
      super(); 
     } 

      ...common getter and setter methods for all fields 

Это предупреждение.java;

public class warning { 
     private final String description; 
     public warning(String aDescription) { 
     description = aDescription; 
     } 

     public String getDescription() { 
     return description; 
     } 
    } 

Адрес: the defrule;

(defrule 
     (xList (commodity ?essential_commodity) (essentiality /essential/)) 
     (not(cList (commodity ?essential_commodity))) 
     => (add (new warning "Missing essential commodity" ?essential_commodity)) 
    ) 

Я пытаюсь поставить некоторую информацию в базу данных для xList и CList:

xList("100000", "PEANUT", "2.45"); 
    xList("100003", "BREAD", "1.5"); 

    cList("100000", "PEANUT", "ESSENTIAL"); 
    cList("100002", "CAKE", "ESSENTIAL"); 
    cList("100003", "BREAD", "NON ESSENTIAL"); 

От того, если я бегу мое правило двигатель, результат должен быть

"Missing essential commodity 100002" 

Но мой текущий результат:

"Missing essential commodity 100000" 
    "Missing essential commodity 100002" 

Как это исправить?

отредактирован: 07/22/2016 добавил xList.java и cList.java

+0

Возможно, вы допустили ошибку при создании и вводе фактов. Не могу сказать без кода для этого. – laune

ответ

0

Точный синтаксис зависит, конечно, от точной природы фактов вы Matching. Приведенное ниже правило написано в предположении, что существует множество фактов «xList», каждый из которых перечисляет название товара и его существенность в слоях «товар» и «существенность» соответственно и что существует только один cList-факт, который содержит список всех основных товаров. Пустые мультиполя («$?») Соответствуют произвольному количеству элементов списка до и после основного товара.

(defrule 
    (xList (commodity ?essential_commodity) (essentiality essential)) 
    (not (cList $? ?essential_commodity $?)) 
    => 
    (assert (warning 
     (str-cat "Missing essential commodity" ?essential_commodity)))) 
+0

Actualy, есть много фактов cList. Все deftemplate объявляются из классов java, поэтому «предупреждение» - это класс. Я все еще получаю ошибки. – Zsy

+0

Я отредактировал мое сообщение для получения более подробной информации – Zsy

0

Эрнест был почти там:

(defrule 
    (xList (commodity ?essential_commodity) (essentiality essential)) 
    (not (cList (commodity ?essential_commodity))) 
=> 
    (assert (warning (description ?essential_commodity))) 
) 

Примечание: Вызов классов "-List", которые не являются списки и даже не содержат Дезориентирует (и он уверен, спутать Ernest). Классы следует называть somethingCommodity, а имена полей могут быть ограничены «id», «name» и т. Д.

+0

Прошу прощения за мой запутанный пример. Собственно, я писал классы и методы на неанглийском языке, поэтому я заменил его, чтобы вы поняли, но забывайте об этом. Модель моей системы такая же, как в примере pricing_engine в Jess71p2. Я попробовал свой код и поставил результат на свой пост. Но все же, он не решает мою проблему. – Zsy

+0

Я добавил недостающую пару круглых скобок! @Zsy, без конкретных сообщений об ошибках, мы никак не можем догадаться, что не работает для вас. –

+0

@ ErnestFriedman-Hill Ах, хорошо, чтобы вы посмотрели мой код. Я начинаю терять свое прикосновение. : -] – laune