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 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 > 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 = ; //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 = ; //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 mailto: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> [mailto: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 = ; //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 = ; //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?
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 = ; //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 = ; //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 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 = ; //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 = ; //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 = ; //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 = ; //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?
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 = ; //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 = ; //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