2013-04-08 1 views
0

와일드 카드 역할을하는 Drools 작업 메모리 (예 : 쿼리 제약)에 팩트를 삽입 할 수 있습니까?Drools query "wildcard"

rule "meal_exceptions_1" 
    agenda-group "MEAL" 
    salience 100 
    when 
     Meal(id = "Breakfast") 
     Person(name == "Sally") 
    then 
     insert(new Food("Jelly")); 
     drools.setFocus("OTHERGRP"); 
end 

rule "meal_breakfast" 
    agenda-group "MEAL" 
    when 
     Meal(id == "Breakfast") 
    then 
     insert(new Food("Cornflakes")); 
     drools.setFocus("OTHERGRP"); 
end 

rule "meal_dinner" 
    agenda-group "MEAL" 
    when 
     Meal(id == "Dinner") 
    then 
     insert(new Food("Fish Fingers")); 
     drools.setFocus("OTHERGRP"); 
end 

내가 질문 "아침 식사를 주문할 수있는 모든 가능한 음식은 무엇인가"를 응답 할이 (어쩌면 내가 소모품에 주문하고 있습니다 :

예를 들어, 나는 다음과 같은 규칙이 상상 부엌).

사실을 쉽게 삽입하여 new Meal("Breakfast")을 입력하면 결과가 아침 식사에 적용되는 결과로 제한됩니다. 그러나, 내 응용 프로그램은 어떤 사람들이 예외를 요청했는지, 심지어 전체 집합이 무엇인지에 대한 지식이 없습니다. Person("*")의 행을 따라 다른 사실을 추가하고 싶습니다. 그래야 다른 규칙을 요구 한 샐리입니다. (잘 모르겠지만) 첫 번째 규칙과 일치합니다.

원하는 출력은 콘플레이크와 젤리를 모두 포함하는 작업 메모리입니다. 잠재적 인 예외에 대한 특별한 지식없이 그러한 질의를 발행 할 수 있습니까?

답변

1

나는 그러한 와일드 카드에 대해 알지 못합니다. 그리고 나는 그것이 심지어 가능하다는 것을 다소 의문 스럽습니다. Drools 규칙에서 사실을 삽입하는 이유를 묻지 않을 것입니다. 그럴만한 이유가있을 것입니다. 그렇지 않으면 드로잉 보드로 되돌아갑니다.

이들은 모두 예외이므로이 경우를 처리하는 한 가지 방법은 모든 예외 사실을 세션에 등록하는 것입니다. 이 기본 케이스에서는 Person ("Sally") 만 등록하면 Jelly와 Cornflakes 목록을 얻을 수 있습니다.

플래그를 추가 할 수 있습니다 (예 : Person.wildcard). LHS를 Person(name == "Sally" || wildcard)과 같은 것으로 변경하십시오. 그렇다고해서 규칙 내에서 사실을 등록한 이후로 기꺼이 작성하는 것이 좋습니다.