Re: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?
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?
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?
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?
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
RE: JESS: Is it possible to bind a Java object directly to a Jess variable without creating a new object?
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