Retrieve facts from Jess and re-instantiate them in Java

View: New views
7 Messages — Rating Filter:   Alert me  

Retrieve facts from Jess and re-instantiate them in Java

by Marco Zappatore :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Dear Jess users,
I have a rule "myrule" that fires whenever two facts with specific slot contents are found within the working memory.
These facts are shadow facts.
Then I have a java user function "myUserFunction" that passes those two facts (using their pointers, let's say ?f1 and ?f2) to a Java program.
My question is: is it possible to get those facts and instantiate them again in Java?
In other words the procedure is:
1) define a java bean
2) assert shadow facts from that java bean with different slot contents each time
3) find a given fact with a given content using a proper rule
4) pass the fact to a java program
5) create a new instance of the java bean with the content just retrieved

the problem resides at point n°5 because actually I'm using
Value val = vv.get(1).resolveValue(context);
Using val.factValue(context)) I can verify that the content is correct but how can I use val to instantiate a new Java Bean?

Any help is appreciated, thanks in advance.

 Marco Zappatore

JESS: Re: Retrieve facts from Jess and re-instantiate them in Java

by Marco Zappatore :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


I think that a possible solution could be the following

val.factValue(context).getDeftemplate().getShadowClassName()

and then instantiate a new instance starting from the string that the above
method returns...

In any case, I'd like to know your opinion...



Marco Zappatore wrote:

>
> Dear Jess users,
> I have a rule "myrule" that fires whenever two facts with specific slot
> contents are found within the working memory.
> These facts are shadow facts.
> Then I have a java user function "myUserFunction" that passes those two
> facts (using their pointers, let's say ?f1 and ?f2) to a Java program.
> My question is: is it possible to get those facts and instantiate them
> again in Java?
> In other words the procedure is:
> 1) define a java bean
> 2) assert shadow facts from that java bean with different slot contents
> each time
> 3) find a given fact with a given content using a proper rule
> 4) pass the fact to a java program
> 5) create a new instance of the java bean with the content just retrieved
>
> the problem resides at point n°5 because actually I'm using
> Value val = vv.get(1).resolveValue(context);
> Using val.factValue(context)) I can verify that the content is correct but
> how can I use val to instantiate a new Java Bean?
>
> Any help is appreciated, thanks in advance.
>
>  Marco Zappatore
>

--
View this message in context: http://old.nabble.com/Retrieve-facts-from-Jess-and-re-instantiate-them-in-Java-tp26160053p26160091.html
Sent from the Jess mailing list archive at Nabble.com.



--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users you@...'
in the BODY of a message to majordomo@..., NOT to the list
(use your own address!) List problems? Notify owner-jess-users@....
--------------------------------------------------------------------


Re: Retrieve facts from Jess and re-instantiate them in Java

by Marco Zappatore :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I think that a possible solution could be the following

val.factValue(context).getDeftemplate().getShadowClassName()

and then instantiate a new instance starting from the string that the above method returns...

In any case, I'd like to know your opinion...


Marco Zappatore wrote:
Dear Jess users,
I have a rule "myrule" that fires whenever two facts with specific slot contents are found within the working memory.
These facts are shadow facts.
Then I have a java user function "myUserFunction" that passes those two facts (using their pointers, let's say ?f1 and ?f2) to a Java program.
My question is: is it possible to get those facts and instantiate them again in Java?
In other words the procedure is:
1) define a java bean
2) assert shadow facts from that java bean with different slot contents each time
3) find a given fact with a given content using a proper rule
4) pass the fact to a java program
5) create a new instance of the java bean with the content just retrieved

the problem resides at point n°5 because actually I'm using
Value val = vv.get(1).resolveValue(context);
Using val.factValue(context)) I can verify that the content is correct but how can I use val to instantiate a new Java Bean?

Any help is appreciated, thanks in advance.

 Marco Zappatore

Parent Message unknown Re: JESS: Re: Retrieve facts from Jess and re-instantiate them in Java

by Ernest Friedman-Hill :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Nothing wrong with that, if that's what you need to do. Every shadow  
fact also has a slot named OBJECT which contains the actual object,  
and so if you wanted to match that, you could call "getClass()" on it  
rather than using Class.forName().

Note if you use getShadowClassName() as suggested below, then you'll  
get the name of the class used to define the template, which might be  
an interface (in which case you can't instantiate it, of course.) If  
you use the OBJECT slot, as I suggest, then you'll get the actual  
class of the object behind the fact, and that may or may not be what  
you actually want.



On Nov 3, 2009, at 7:26 AM, Marco Zappatore wrote:

>
> I think that a possible solution could be the following
>
> val.factValue(context).getDeftemplate().getShadowClassName()
>
> and then instantiate a new instance starting from the string that  
> the above
> method returns...
>
> In any case, I'd like to know your opinion...
>
>
>
> Marco Zappatore wrote:
>>
>> Dear Jess users,
>> I have a rule "myrule" that fires whenever two facts with specific  
>> slot
>> contents are found within the working memory.
>> These facts are shadow facts.
>> Then I have a java user function "myUserFunction" that passes those  
>> two
>> facts (using their pointers, let's say ?f1 and ?f2) to a Java  
>> program.
>> My question is: is it possible to get those facts and instantiate  
>> them
>> again in Java?
>> In other words the procedure is:
>> 1) define a java bean
>> 2) assert shadow facts from that java bean with different slot  
>> contents
>> each time
>> 3) find a given fact with a given content using a proper rule
>> 4) pass the fact to a java program
>> 5) create a new instance of the java bean with the content just  
>> retrieved
>>
>> the problem resides at point n°5 because actually I'm using
>> Value val = vv.get(1).resolveValue(context);
>> Using val.factValue(context)) I can verify that the content is  
>> correct but
>> how can I use val to instantiate a new Java Bean?
>>
>> Any help is appreciated, thanks in advance.
>>
>> Marco Zappatore
>>
>
> --
> View this message in context: http://old.nabble.com/Retrieve-facts-from-Jess-and-re-instantiate-them-in-Java-tp26160053p26160091.html
> Sent from the Jess mailing list archive at Nabble.com.
>
>
>
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users  
> you@...'
> in the BODY of a message to majordomo@..., NOT to the list
> (use your own address!) List problems? Notify owner-jess-users@...
> .
> --------------------------------------------------------------------

---------------------------------------------------------
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 you@...'
in the BODY of a message to majordomo@..., NOT to the list
(use your own address!) List problems? Notify owner-jess-users@....
--------------------------------------------------------------------


Re: JESS: Re: Retrieve facts from Jess and re-instantiate them in Java

by Marco Zappatore :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Thanks for your suggestion.
The modified JESS code snippet now looks like the following one:

(defrule myRule
        ?fA <- (factA (slotA_name...) (slotB_name...))
        ?fB <- (factB (slotC_name...) (slotD_name...))
=>
(bind ?fC (assert
                (factC
                        (slotE_name (?fA getSlotValue OBJECT))
                        (slotF_name...)
                )
        ))
)
(call-my-java-method (?fc getSlotValue OBJECT)))

I've used getSlotValue method two times in order to show you the following behaviour:

The first one getSlotValue call works correctly and the actual ?fA fact is stored into slotE_name.
The second call (?fc getSlotValue OBJECT)  returns  NIL both if used into the JESS side (as shown above) and if used in Java with val.factValue(context).getSlotValue("OBJECT").
What's wrong in the binding operation?

Thanks in advance
  Marco Zappatore




Ernest Friedman-Hill wrote:
Nothing wrong with that, if that's what you need to do. Every shadow  
fact also has a slot named OBJECT which contains the actual object,  
and so if you wanted to match that, you could call "getClass()" on it  
rather than using Class.forName().

Note if you use getShadowClassName() as suggested below, then you'll  
get the name of the class used to define the template, which might be  
an interface (in which case you can't instantiate it, of course.) If  
you use the OBJECT slot, as I suggest, then you'll get the actual  
class of the object behind the fact, and that may or may not be what  
you actually want.



On Nov 3, 2009, at 7:26 AM, Marco Zappatore wrote:

>
> I think that a possible solution could be the following
>
> val.factValue(context).getDeftemplate().getShadowClassName()
>
> and then instantiate a new instance starting from the string that  
> the above
> method returns...
>
> In any case, I'd like to know your opinion...
>
>
>
> Marco Zappatore wrote:
>>
>> Dear Jess users,
>> I have a rule "myrule" that fires whenever two facts with specific  
>> slot
>> contents are found within the working memory.
>> These facts are shadow facts.
>> Then I have a java user function "myUserFunction" that passes those  
>> two
>> facts (using their pointers, let's say ?f1 and ?f2) to a Java  
>> program.
>> My question is: is it possible to get those facts and instantiate  
>> them
>> again in Java?
>> In other words the procedure is:
>> 1) define a java bean
>> 2) assert shadow facts from that java bean with different slot  
>> contents
>> each time
>> 3) find a given fact with a given content using a proper rule
>> 4) pass the fact to a java program
>> 5) create a new instance of the java bean with the content just  
>> retrieved
>>
>> the problem resides at point n°5 because actually I'm using
>> Value val = vv.get(1).resolveValue(context);
>> Using val.factValue(context)) I can verify that the content is  
>> correct but
>> how can I use val to instantiate a new Java Bean?
>>
>> Any help is appreciated, thanks in advance.
>>
>> Marco Zappatore
>>
>
> --
> View this message in context: http://old.nabble.com/Retrieve-facts-from-Jess-and-re-instantiate-them-in-Java-tp26160053p26160091.html
> Sent from the Jess mailing list archive at Nabble.com.
>
>
>
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users  
> you@address.com'
> in the BODY of a message to majordomo@sandia.gov, NOT to the list
> (use your own address!) List problems? Notify owner-jess-users@sandia.gov
> .
> --------------------------------------------------------------------

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

Re: JESS: Re: Retrieve facts from Jess and re-instantiate them in Java

by Marco Zappatore :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Thanks for your suggestion.
The modified JESS code snippet now looks like the following one:

(defrule myRule
        ?fA <- (factA (slotA_name...) (slotB_name...))
        ?fB <- (factB (slotC_name...) (slotD_name...))
=>
(bind ?fC (assert
                (factC
                        (slotE_name (?fA getSlotValue OBJECT))
                        (slotF_name...)
                )
        ))
)
(call-my-java-method (?fc getSlotValue OBJECT)))

I've used getSlotValue method two times in order to show you the following
behaviour:

The first one getSlotValue call works correctly and the actual ?fA fact is
stored into slotE_name.
The second call (?fc getSlotValue OBJECT)  returns  NIL both if used into
the JESS side (as shown above) and if used in Java with
val.factValue(context).getSlotValue("OBJECT").
What's wrong in the binding operation?

Thanks in advance
  Marco Zappatore





Ernest Friedman-Hill wrote:

>
> Nothing wrong with that, if that's what you need to do. Every shadow  
> fact also has a slot named OBJECT which contains the actual object,  
> and so if you wanted to match that, you could call "getClass()" on it  
> rather than using Class.forName().
>
> Note if you use getShadowClassName() as suggested below, then you'll  
> get the name of the class used to define the template, which might be  
> an interface (in which case you can't instantiate it, of course.) If  
> you use the OBJECT slot, as I suggest, then you'll get the actual  
> class of the object behind the fact, and that may or may not be what  
> you actually want.
>
>
>
> On Nov 3, 2009, at 7:26 AM, Marco Zappatore wrote:
>
>>
>> I think that a possible solution could be the following
>>
>> val.factValue(context).getDeftemplate().getShadowClassName()
>>
>> and then instantiate a new instance starting from the string that  
>> the above
>> method returns...
>>
>> In any case, I'd like to know your opinion...
>>
>>
>>
>> Marco Zappatore wrote:
>>>
>>> Dear Jess users,
>>> I have a rule "myrule" that fires whenever two facts with specific  
>>> slot
>>> contents are found within the working memory.
>>> These facts are shadow facts.
>>> Then I have a java user function "myUserFunction" that passes those  
>>> two
>>> facts (using their pointers, let's say ?f1 and ?f2) to a Java  
>>> program.
>>> My question is: is it possible to get those facts and instantiate  
>>> them
>>> again in Java?
>>> In other words the procedure is:
>>> 1) define a java bean
>>> 2) assert shadow facts from that java bean with different slot  
>>> contents
>>> each time
>>> 3) find a given fact with a given content using a proper rule
>>> 4) pass the fact to a java program
>>> 5) create a new instance of the java bean with the content just  
>>> retrieved
>>>
>>> the problem resides at point n°5 because actually I'm using
>>> Value val = vv.get(1).resolveValue(context);
>>> Using val.factValue(context)) I can verify that the content is  
>>> correct but
>>> how can I use val to instantiate a new Java Bean?
>>>
>>> Any help is appreciated, thanks in advance.
>>>
>>> Marco Zappatore
>>>
>>
>> --
>> View this message in context:
>> http://old.nabble.com/Retrieve-facts-from-Jess-and-re-instantiate-them-in-Java-tp26160053p26160091.html
>> Sent from the Jess mailing list archive at Nabble.com.
>>
>>
>>
>> --------------------------------------------------------------------
>> To unsubscribe, send the words 'unsubscribe jess-users  
>> you@...'
>> in the BODY of a message to majordomo@..., NOT to the list
>> (use your own address!) List problems? Notify owner-jess-users@...
>> .
>> --------------------------------------------------------------------
>
> ---------------------------------------------------------
> 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 you@...'
> in the BODY of a message to majordomo@..., NOT to the list
> (use your own address!) List problems? Notify owner-jess-users@...
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users you@...'
in the BODY of a message to majordomo@..., NOT to the list
(use your own address!) List problems? Notify owner-jess-users@....
--------------------------------------------------------------------


Parent Message unknown Re: JESS: Re: Retrieve facts from Jess and re-instantiate them in Java

by Ernest Friedman-Hill :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


If you're creating those "shadow facts" using "assert", as you've  
shown here, then the OBJECT slot is empty, of course. They're not  
really shadow facts if you create them that way, since there are no  
objects for them to "shadow".  Jess will never create the Java object  
for you. You must create the Java object, give it to Jess (using  
"definstance" or "add") and then Jess creates the shadow fact from  
that, setting the OBJECT slot to point to the object.



On Nov 4, 2009, at 7:03 AM, Marco Zappatore wrote:

>
> Thanks for your suggestion.
> The modified JESS code snippet now looks like the following one:
>
> (defrule myRule
> ?fA <- (factA (slotA_name...) (slotB_name...))
> ?fB <- (factB (slotC_name...) (slotD_name...))
> =>
> (bind ?fC (assert
> (factC
> (slotE_name (?fA getSlotValue OBJECT))
> (slotF_name...)
> )
> ))
> )
> (call-my-java-method (?fc getSlotValue OBJECT)))
>
> I've used getSlotValue method two times in order to show you the  
> following
> behaviour:
>
> The first one getSlotValue call works correctly and the actual ?fA  
> fact is
> stored into slotE_name.
> The second call (?fc getSlotValue OBJECT)  returns  NIL both if used  
> into
> the JESS side (as shown above) and if used in Java with
> val.factValue(context).getSlotValue("OBJECT").
> What's wrong in the binding operation?
>
> Thanks in advance
>  Marco Zappatore
>
>
>
>
>
> Ernest Friedman-Hill wrote:
>>
>> Nothing wrong with that, if that's what you need to do. Every shadow
>> fact also has a slot named OBJECT which contains the actual object,
>> and so if you wanted to match that, you could call "getClass()" on it
>> rather than using Class.forName().
>>
>> Note if you use getShadowClassName() as suggested below, then you'll
>> get the name of the class used to define the template, which might be
>> an interface (in which case you can't instantiate it, of course.) If
>> you use the OBJECT slot, as I suggest, then you'll get the actual
>> class of the object behind the fact, and that may or may not be what
>> you actually want.
>>
>>
>>
>> On Nov 3, 2009, at 7:26 AM, Marco Zappatore wrote:
>>
>>>
>>> I think that a possible solution could be the following
>>>
>>> val.factValue(context).getDeftemplate().getShadowClassName()
>>>
>>> and then instantiate a new instance starting from the string that
>>> the above
>>> method returns...
>>>
>>> In any case, I'd like to know your opinion...
>>>
>>>
>>>
>>> Marco Zappatore wrote:
>>>>
>>>> Dear Jess users,
>>>> I have a rule "myrule" that fires whenever two facts with specific
>>>> slot
>>>> contents are found within the working memory.
>>>> These facts are shadow facts.
>>>> Then I have a java user function "myUserFunction" that passes those
>>>> two
>>>> facts (using their pointers, let's say ?f1 and ?f2) to a Java
>>>> program.
>>>> My question is: is it possible to get those facts and instantiate
>>>> them
>>>> again in Java?
>>>> In other words the procedure is:
>>>> 1) define a java bean
>>>> 2) assert shadow facts from that java bean with different slot
>>>> contents
>>>> each time
>>>> 3) find a given fact with a given content using a proper rule
>>>> 4) pass the fact to a java program
>>>> 5) create a new instance of the java bean with the content just
>>>> retrieved
>>>>
>>>> the problem resides at point n°5 because actually I'm using
>>>> Value val = vv.get(1).resolveValue(context);
>>>> Using val.factValue(context)) I can verify that the content is
>>>> correct but
>>>> how can I use val to instantiate a new Java Bean?
>>>>
>>>> Any help is appreciated, thanks in advance.
>>>>
>>>> Marco Zappatore
>>>>
>>>
>>> --
>>> View this message in context:
>>> http://old.nabble.com/Retrieve-facts-from-Jess-and-re-instantiate-them-in-Java-tp26160053p26160091.html
>>> Sent from the Jess mailing list archive at Nabble.com.
>>>
>>>
>>>
>>> --------------------------------------------------------------------
>>> To unsubscribe, send the words 'unsubscribe jess-users
>>> you@...'
>>> in the BODY of a message to majordomo@..., NOT to the list
>>> (use your own address!) List problems? Notify owner-jess-users@...
>>> .
>>> --------------------------------------------------------------------
>>
>> ---------------------------------------------------------
>> 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 you@...
>> '
>> in the BODY of a message to majordomo@..., NOT to the list
>> (use your own address!) List problems? Notify owner-jess-users@...
> --------------------------------------------------------------------
> To unsubscribe, send the words 'unsubscribe jess-users  
> you@...'
> in the BODY of a message to majordomo@..., NOT to the list
> (use your own address!) List problems? Notify owner-jess-users@...
> .
> --------------------------------------------------------------------

---------------------------------------------------------
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 you@...'
in the BODY of a message to majordomo@..., NOT to the list
(use your own address!) List problems? Notify owner-jess-users@....
--------------------------------------------------------------------