Re: JESS: Would like to know why runQueryStar would not return any results

"Ernest Friedman-Hill" <[email protected]> Mon, 18 Jul 2011 13:05:33 -0400
Newsgroups gmane.comp.java.jess
Message-ID <[email protected]>
I believe the issue is the classic one that RU.SYMBOL and RU.STRING  
are different data types. Your DimmerSwitch properties are quoted  
strings (RU.STRING) but your query parameters are created using

> new ValueVector().add("Ceiling Light")

which creates a Value of type RU.SYMBOL. You want to explictly create  
STRINGS:


> new ValueVector().add(new Value("Ceiling Light", RU.STRING))


and that should fix the problem.


On Jul 17, 2011, at 8:30 PM, Felix Chan wrote:

> Hi all,
>
> I am wondering if someone could help me understand why runQueryStar  
> would not work for me in a certain scenario. Thank you in advance!
>
> First, I have the following script. It works as expected:
>
> (deftemplate DimmerSwitch (slot label) (slot brightness))
> (defquery search-dimmer-switch
>    (declare (variables ?lbl))
>    (DimmerSwitch (label ?lbl) (brightness ?b))
> )
> (defrule set-brightness-to-10-and-15
>    (not (DimmerSwitch))
>    =>
>    (assert (DimmerSwitch (label "Ceiling Light") (brightness 10)))
>    (assert (DimmerSwitch (label "Bathroom Light") (brightness 5)))
> )
>
> (reset)
> (run)
> (facts)
> (bind ?result (run-query* search-dimmer-switch "Ceiling Light"))
> (while (?result next)
>    (printout t (?result getString lbl) " | " (?result getInt b) crlf)
>    )
>
> The output is as follows. No problem there.
> f-0 (MAIN::initial-fact)
>
> f-1 (MAIN::DimmerSwitch (label "Ceiling Light") (brightness 10))
>
> f-2 (MAIN::DimmerSwitch (label "Bathroom Light") (brightness 5))
>
> For a total of 3 facts in module MAIN.
>
> Ceiling Light | 10
>
> -----------------------------------------------------------
>
> Then I delete the portion of the script from (reset) on down, with  
> just the following:
>
> (deftemplate DimmerSwitch (slot label) (slot brightness))
> (defquery search-dimmer-switch
> (declare (variables ?lbl))
> (DimmerSwitch (label ?lbl) (brightness ?b))
> )
> (defrule set-brightness-to-10-and-15
> (not (DimmerSwitch))
> =>
> (assert (DimmerSwitch (label "Ceiling Light") (brightness 10)))
> (assert (DimmerSwitch (label "Bathroom Light") (brightness 5)))
> )
>
> Then I use java to run the query as follows. "test.clp" contains the  
> above script obviously.
>
> package control;
> import jess.*;
> public class TestApp {
>  public static void main(String[] args) throws JessException {
>   Rete engine = new Rete();
>   engine.batch("C:\\Users\\Administrator\\workspace\\ShadowFactTest\ 
> \src\\control\\test.clp");
>   engine.reset();
>
>   engine.eval("(facts)");
>   engine.run();
>
>   engine.eval("(facts)");
>
>   QueryResult result = engine.runQueryStar("search-dimmer-switch",  
> new ValueVector().add("Ceiling Light"));
>   while (result.next()) {
>    System.out.println(result.getString("lbl") + " | " +  
> result.getInt("b"));
>   }
>  }
> }
>
> The output is as follows. The Rete Engine ran fine. The rule fired.  
> But there's nothing coming back from runQueryStar.
> f-0 (MAIN::initial-fact)
>
> For a total of 1 facts in module MAIN.
>
> f-0 (MAIN::initial-fact)
>
> f-1 (MAIN::DimmerSwitch (label "Ceiling Light") (brightness 10))
>
> f-2 (MAIN::DimmerSwitch (label "Bathroom Light") (brightness 5))
>
> For a total of 3 facts in module MAIN.
>
> ---------------------------------------------------------
>
> Now I change the query parameter to "brightness", an integer field.
>
> (deftemplate DimmerSwitch (slot label) (slot brightness))
> (defquery search-dimmer-switch
>     (declare (variables ?b))
>     (DimmerSwitch (label ?lbl) (brightness ?b))
> )
> (defrule set-brightness-to-10-and-15
>     (not (DimmerSwitch))
>     =>
>     (assert (DimmerSwitch (label "Ceiling Light") (brightness 10)))
>     (assert (DimmerSwitch (label "Bathroom Light") (brightness 5)))
> )
>
> ---------------------
>
> and use the following java program instead:
>
> package control;
>
> import jess.*;
>
> public class TestApp {
>
>  public static void main(String[] args) throws JessException {
>   Rete engine = new Rete();
>   engine.batch("C:\\Users\\Administrator\\workspace\\ShadowFactTest\ 
> \src\\control\\test.clp");
>   engine.reset();
>
>   engine.eval("(facts)");
>   engine.run();
>
>   engine.eval("(facts)");
>
>   QueryResult result = engine.runQueryStar("search-dimmer-switch",  
> new ValueVector().add(10));
>
>   while (result.next()) {
>    System.out.println(result.getString("lbl") + " | " +  
> result.getInt("b"));
>   }
>  }
> }
>
> ---------------
>
> Now the output looks normal:
>
> f-0   (MAIN::initial-fact)
> For a total of 1 facts in module MAIN.
> f-0   (MAIN::initial-fact)
> f-1   (MAIN::DimmerSwitch (label "Ceiling Light") (brightness 10))
> f-2   (MAIN::DimmerSwitch (label "Bathroom Light") (brightness 5))
> For a total of 3 facts in module MAIN.
> Ceiling Light | 10
>
> --------------------------
>
> Could someone explain why this query won't work?
>
> QueryResult result = engine.runQueryStar("search-dimmer-switch", new  
> ValueVector().add("Ceiling Light"));
>
> Many thanks.
>
> Felix
>
>

---------------------------------------------------------
Ernest Friedman-Hill
Informatics & Decision Sciences, Sandia National Laboratories
PO Box 969, MS 9012, Livermore, CA 94550
http://www.jessrules.com







--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [email protected]'
in the BODY of a message to [email protected], NOT to the list
(use your own address!) List problems? Notify [email protected].
--------------------------------------------------------------------