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

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

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

Felix Chan-2
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

 

Reply | Threaded
Open this post in threaded view
|

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

Friedman-Hill, Ernest
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 [hidden email]'
in the BODY of a message to [hidden email], NOT to the list
(use your own address!) List problems? Notify [hidden email].
--------------------------------------------------------------------

Reply | Threaded
Open this post in threaded view
|

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

Felix Chan-2
Worked wonderfully. Thank you Ernest.

On Mon, Jul 18, 2011 at 10:05 AM, Ernest Friedman-Hill <[hidden email]> wrote:
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 [hidden email]'
in the BODY of a message to [hidden email], NOT to the list
(use your own address!) List problems? Notify [hidden email].
--------------------------------------------------------------------