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 y...@address.com'
in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov.
--------------------------------------------------------------------

Reply via email to