Re: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-07 Thread Donald Paul Winston
Use shadow facts.

see http://www.jessrules.com/jesswiki/view?FactsVsShadowFacts

On Nov 4, 2011, at 1:08 PM, Hunter McMillen wrote:

 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




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.




Re: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-07 Thread Hunter McMillen
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.govwrote:

 **
 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




RE: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-07 Thread Friedman-Hill, Ernest
That's what Rete.add() and Rete.definstance() do. If that's the goal, all of 
this other stuff is superfluous -- just call add() or definstance() from Java.


From: owner-jess-us...@sandia.gov [mailto:owner-jess-us...@sandia.gov] On 
Behalf Of Hunter McMillen
Sent: Friday, November 04, 2011 7:50 PM
To: jess-users
Subject: Re: JESS: Is it possible to bind a Java object directly to a Jess 
variable without creating a new object?

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.govmailto: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.govmailto:owner-jess-us...@sandia.gov 
[mailto:owner-jess-us...@sandia.govmailto: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



Re: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-07 Thread Wolfgang Laun
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.govwrote:

 **
 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





JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-04 Thread Hunter McMillen
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


RE: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?

2011-11-04 Thread Friedman-Hill, Ernest
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