I daresay, not all of us use the same terms for the same things ;-)

I'll use "Pojo" for a Java object; it contains data in named fields. I'll
use "Fact" for an entitiy that has been inserted into Jess' Working Memory;
it contains data in named slots. And then, there is a "shadow fact", which
is a fact with a reference to a Pojo in a slot that is (by definition)
called OBJECT; slot values are taken from the object's fields of the same
name.

Quote: "I am trying to assert to Jess that an object exists when I
encounter a new object in my Java program."

Comment: In any case, this must be done by creating/inserting a fact. As
has been said, a shadow fact is the easiest way to do this; it's defined
from the backing class, and it is inserted by adding the Pojo. Creating an
equivalent fact implies that all slots must be filled, by hand-coded code,
from the Pojo; there's no further connection between these two, which is
bound to cause additional details.

Quote: "Is there any way to just bind a Java object to a Jess variable
without creating a new Java object?"

Comment: This is not the same thing as "asserting to Jess". You can bind a
Pojo to a Jess variable without inserting/asserting it. But this variable
will not affect the firing of rules.

-W


On 5 November 2011 00:49, Hunter McMillen <mcmil...@gmail.com> wrote:

> Thanks for your quick reply. After I manage to get my Java object into
> Jess, can I assert it as a fact? Then have rules lhs match on the existence
> of some object with attributes x, y, and z?
>
> Hunter
>
> On Fri, Nov 4, 2011 at 4:01 PM, Friedman-Hill, Ernest 
> <ejfr...@sandia.gov>wrote:
>
>> **
>> There are (obviously) two options: (a) put the object somewhere
>> accessible, and run Jess code that retrieves it, or (b) use Jess's Java API
>> to set a Jess variable to contain the object. Either would work. The
>> store/fetch mechanism is sort of an built-in easy way to do (a).
>> Alternatively, say there's a global variable ?*x* defined in your Jess
>> program. Then you can say
>>
>> engine.getGlobalContext().setVariable("*x*", new Value(unit));
>>
>> and your Jess code can later get the value of "*x*".
>>
>> If you don't like using variables this way, there's always directly
>> invoking Jess functions from Java. Here we invoke 'add' to add the object
>> to working memory directly:
>>
>> new Funcall("add", engine).arg(new
>> Value(unit)).execute(engine.getGlobalContext());
>>
>>
>>
>>  ------------------------------
>> *From:* owner-jess-us...@sandia.gov [mailto:owner-jess-us...@sandia.gov]
>> *On Behalf Of *Hunter McMillen
>> *Sent:* Friday, November 04, 2011 1:08 PM
>> *To:* jess-users
>> *Subject:* JESS: Is it possible to bind a Java object directly to a Jess
>> variable without creating a new object?
>>
>>  Hi everyone,
>>
>>  I am trying to assert to Jess that an object exists when I encounter a
>> new object in my Java program. Right now I am using a template to mirror
>> that object (i.e I have slot values for all of the Java objects fields)
>>  but this seems redundant to me. Is there any way to just bind a Java
>> object to a Jess variable without creating a new Java object?
>>
>>  A lot of the examples I see online and from JIA are of the form:
>> (bind ?map (new HashMap))
>>
>>  or
>>
>>  (call Classname method params...)
>>
>>  but these either create  a new object or call static methods. I already
>> have the Java object and just want to store it.
>>
>>  But I was hoping that there was someway I could do something like this:
>> public Rete engine = new Rete();
>>
>>  public void unitDiscovered()
>> {
>>     Unit unit = <some unit encountered>; //Java object
>>     engine.executeCommand("(bind ?unit unit)");
>>     engine.executeCommand("(assert ?unit)");
>>  }
>>
>>  Or would I have to use the store() and fetch() methods for this?
>>
>>  public void unitDiscovered()
>> {
>>     Unit unit = <some unit encountered>; //Java object
>>     engine.store("UNIT", unit);
>>      engine.executeCommand("(bind ?unit (fetch "UNIT")");
>>     engine.executeCommand("(assert ?unit)");
>>  }
>>
>>  Basically I want to know the best practice for binding Java objects to
>> Jess variables so I can assert them to the engine.
>>
>>  Thanks,
>> Hunter McMillen
>>
>>
>

Reply via email to