Ok.  I got it.

        model = ModelFactory.createInfModel(model.getReasoner(), model);

Need to add one to re-create the model, which seems to re-fire the rules.
What is your understanding?

Scott


On Fri, Nov 9, 2012 at 9:49 AM, Scott Streit <[email protected]> wrote:

> Very Strange.
>
> I made the change.
>
> Now when I ask for all of the statements for an indivudal "Beachely" that
> require the forward chain rule, I get the backward chain, but nothign from
> the previous rule.  In other words. when I ask, what groups is beachley
> part of, I get nothing.
>
> Now when I do a listStatements(), then the rule fires, and I get beachley
> is a member of the group, (backward chain rule), but I get none of the
> things that implies, (the first forward chain rule).
>
> So I get..
>
> [IndividualGetsGroupInterests:   (?x ie:memberOf ?y), (?y
> ie:hasGroupInterestOf ?z)  -> (?x ie:hasIndividualInterestOf ?z)]
>
> and when I ask for statements, it works.
>
> I only get
>
>
> [InferredMembership:  (?u ie:memberOf ?g)
>     <-  (?g ie:mandatoryInterestsForGroupInclusion ?i)
>         (?i ie:helpsIndividualDefine ?u)
>
>          allValue(?g ie:mandatoryInterestsForGroupInclusion
>                           ie:helpsIndividualDefine ?u)]
>
> when I ask for all staements, before it does not fire,  and even when I
> ask for all the statemetns, I do not get
>
>
> [IndividualGetsGroupInterests:   (?x ie:memberOf ?y), (?y
> ie:hasGroupInterestOf ?z)  -> (?x ie:hasIndividualInterestOf ?z)]
>
>
> To fire again.
>
> I need the
>
>
> [IndividualGetsGroupInterests:   (?x ie:memberOf ?y), (?y
> ie:hasGroupInterestOf ?z)  -> (?x ie:hasIndividualInterestOf ?z)]
>
> to fire frist,
>
> then I need,
>
> [InferredMembership:  (?u ie:memberOf ?g)
>     <-  (?g ie:mandatoryInterestsForGroupInclusion ?i)
>         (?i ie:helpsIndividualDefine ?u)
>
>          allValue(?g ie:mandatoryInterestsForGroupInclusion
>                           ie:helpsIndividualDefine ?u)]
>
> Then I need.
>
> [IndividualGetsGroupInterests:   (?x ie:memberOf ?y), (?y
> ie:hasGroupInterestOf ?z)  -> (?x ie:hasIndividualInterestOf ?z)]
>
> For the result to be right.  What can I do to get this?
>
>
>
> On Thu, Nov 8, 2012 at 5:00 PM, Dave Reynolds 
> <[email protected]>wrote:
>
>> The basic issue here is that you have to decide what binding pattern your
>> primitive supports.
>>
>> Jena rules is not full prolog, the builtins are only usable as filters or
>> deterministic predicates, they don't support iteration over results.
>>
>> So you are calling your primitive with one or both of ?u and ?g unbound
>> and your code does not bind them as a result.
>>
>> One option is to do the binding in your calling rule and just use your
>> primitive as a filter:
>>
>>
>> [InferredMembership:  (?u ie:memberOf ?g)
>>     <-  (?g ie:**mandatoryInterestsForGroupIncl**usion ?i)
>>         (?i ie:helpsIndividualDefine ?u)
>>
>>          allValue(?g ie:**mandatoryInterestsForGroupIncl**usion
>>                           ie:helpsIndividualDefine ?u)]
>>
>> So the first two terms find possible groups and users to check and the
>> allValue primitive does the check.
>>
>> (I've no idea what ie:helpsIndividualDefine means so the example may not
>> be right.)
>>
>> Dave
>>
>>
>> On 08/11/12 20:50, Scott Streit wrote:
>>
>>> Dave,
>>>
>>> I simplified my code, removing reification and just down to the bare
>>> essentials.
>>>
>>> Rule:
>>>
>>>
>>> [InferredMembership:  (?u ie:memberOf ?g)
>>>            <- allValue(?g ie:**mandatoryInterestsForGroupIncl**usion
>>>                           ie:helpsIndividualDefine ?u)]
>>>
>>> Code:
>>>
>>> AllValue.java
>>>
>>> public class AllValue extends BaseBuiltin {
>>> final static Logger logger = Logger.getLogger(AllValue.**class
>>> .getName());
>>>
>>>      /**
>>>       * Return a name for this builtin, normally this will be the name of
>>> the
>>>       * functor that will be used to invoke it.
>>>       */
>>>      @Override
>>>      public String getName() {
>>>          return "allValue";
>>>      }
>>>
>>>      /**
>>>       * This method is invoked when the builtin is called in a rule body.
>>>       * @param args the array of argument values for the builtin, this
>>> is an
>>> array
>>>       * of Nodes, some of which may be Node_RuleVariables.
>>>       * @param length the length of the argument list, may be less than
>>> the
>>> length of the args array
>>>       * for some rule engines
>>>       * @param context an execution context giving access to other
>>> relevant
>>> data
>>>       * @return return true if the buildin predicate is deemed to have
>>> succeeded in
>>>       * the current environment
>>>       */
>>>      @Override
>>>      public boolean bodyCall(Node[] args, int length, RuleContext
>>> context) {
>>>          if (length !=4) {
>>>              throw new BuiltinException(this, context, "builtin " +
>>> getName() + " requires 4 arguments but saw " + length);
>>>          }
>>>          Node subj = getArg(0, args, context);
>>>          // Allow variables in subject position to correspond to wild
>>> cards
>>>          if (subj.isVariable()) {
>>>              subj = null;
>>>          }
>>>          Node pred = getArg(1, args, context);
>>>          if (pred.isVariable()) {
>>>              pred = null;
>>>          }
>>>          Node pred2 = getArg(2, args, context);
>>>          if (pred.isVariable()) {
>>>              pred = null;
>>>          }
>>>
>>>          Node obj = getArg(3, args, context);
>>>          logger.info(" subject is " + subj + " pred is " + pred + "
>>> pred2
>>>   is " + pred2 + " obj is " + obj);
>>>
>>>          ClosableIterator<Triple> ti =  context.find(subj, pred, (Node)
>>> null);
>>>          while (ti.hasNext()) {
>>>          Triple triple = ti.next();
>>>          logger.info(" got a triple of " + triple);
>>>          logger.info(" looking for subject (triple.getObject()" +
>>> triple.getObject() + " pred2 is " + pred2 + " obj is " + obj);
>>>          if (!context.contains(triple.**getObject(), pred2, obj)) {
>>>          logger.info(" returning false");
>>>          return false;
>>>          }
>>>          }
>>>
>>>
>>>          logger.info(" returning true");
>>>
>>>          return true;
>>>          //return !context.contains(subj, pred, obj);
>>>      }
>>>
>>>      /**
>>>       * Flag as non-monotonic so the guard clause will get rerun after
>>> deferal
>>>       * as part of a non-trivial conflict set.
>>>       */
>>>      @Override
>>>      public boolean isMonotonic() {
>>>          return false;
>>>      }
>>>
>>> }
>>>
>>> log file:
>>>
>>>      [java] INFO:  looking for subject (triple.getObject()
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaFishing<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaFishing>pred2
>>> is http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefineobj<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefineobj>
>>> is *
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  got a triple of
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**GroupHemmingway<http://www.compscii.com/ontologies/0.1/AutoIE.owl#GroupHemmingway>@
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> mandatoryInterestsForGroupIncl**usion<http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusion>
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelors<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelors>
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  looking for subject (triple.getObject()
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelorspred2<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelorspred2>is
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefine<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefine>obj
>>> is *
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  returning true
>>>       [java] 15:33:04 ERROR RDFDefaultErrorHandler :: Internal error in
>>> LP
>>> reasoner: variable in triple result
>>>       [java] Nov 8, 2012 3:33:04 PM
>>> com.compscii.ontology.created.**LoadUserPreferences doFile
>>>       [java] INFO: completed processing, writing out RDF/XML-ABBREV
>>>       [java] 15:33:04 WARN  BaseXMLWriter        :: Workaround for bugs
>>> 803804 and 858163: using RDF/XML (not RDF/XML-ABBREV) writer  for unsafe
>>> graph class com.hp.hpl.jena.reasoner.**rulesys.FBRuleInfGraph
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  subject is null pred is
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> mandatoryInterestsForGroupIncl**usionpred2<http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusionpred2>
>>>   is
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefine<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefine>obj
>>> is *
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  got a triple of
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**GroupHemmingway<http://www.compscii.com/ontologies/0.1/AutoIE.owl#GroupHemmingway>@
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> mandatoryInterestsForGroupIncl**usion<http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusion>
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaFishing<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaFishing>
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  looking for subject (triple.getObject()
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaFishing<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaFishing>pred2
>>> is http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefineobj<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefineobj>
>>> is *
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  got a triple of
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**GroupHemmingway<http://www.compscii.com/ontologies/0.1/AutoIE.owl#GroupHemmingway>@
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> mandatoryInterestsForGroupIncl**usion<http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusion>
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelors<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelors>
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  looking for subject (triple.getObject()
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelorspred2<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelorspred2>is
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefine<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefine>obj
>>> is *
>>>       [java] Nov 8, 2012 3:33:04 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  returning true
>>>       [java] Nov 8, 2012 3:33:04 PM
>>> com.compscii.ontology.created.**LoadUserPreferences main
>>>       [java] SEVERE: error processing file resultabsolute name
>>> /home/scott/ontology/trunk/**ontology/../result
>>>       [java] com.hp.hpl.jena.reasoner.**ReasonerException: Internal
>>> error in
>>> LP rea
>>>
>>> What in the world is the " and what does it mean?  I want to look for
>>> people that all the interests are part of.  What am I missing here.
>>>
>>> I want to start with all groups with mandatory interests.  Make sure the
>>> users have the mandatory interests before I allow them in a group via
>>> backward chaining.  I am check for the interests, get them, then want to
>>> get all users that have them and put them in with the
>>>
>>> ?g memberOf ?u   .... but all the ?u are *.  What am I missing here?
>>>
>>> I also tried
>>>
>>> [InferredMembership:  (?g ie:hasAsMember ?u)
>>>            <- allValue(?g ie:**mandatoryInterestsForGroupIncl**usion
>>>                           ie:helpsIndividualDefine ?u)]
>>>
>>> And still got
>>>
>>> .owl#GroupHemmingway @
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> mandatoryInterestsForGroupIncl**usion<http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusion>
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelors<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelors>
>>>       [java] Nov 8, 2012 3:48:23 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  looking for subject (triple.getObject()
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> InterestAreaBachelorspred2<http://www.compscii.com/ontologies/0.1/AutoIE.owl#InterestAreaBachelorspred2>is
>>> http://www.compscii.com/**ontologies/0.1/AutoIE.owl#**
>>> helpsIndividualDefine<http://www.compscii.com/ontologies/0.1/AutoIE.owl#helpsIndividualDefine>obj
>>> is *
>>>       [java] Nov 8, 2012 3:48:23 PM com.compscii.ontology.created.**
>>> AllValue
>>> bodyCall
>>>       [java] INFO:  returning true
>>>       [java] Nov 8, 2012 3:48:23 PM
>>> com.compscii.ontology.created.**LoadUserPreferences main
>>>       [java] SEVERE: error processing file resultabsolute name
>>> /home/scott/ontology/trunk/**ontology/../result
>>>       [java] com.hp.hpl.jena.reasoner.**ReasonerException: Internal
>>> error in
>>> LP reasoner: variable in triple result
>>>
>>>
>>> I am out of ideas..  Help
>>>
>>>
>>>
>>>
>>> On Wed, Nov 7, 2012 at 1:15 PM, Scott Streit <[email protected]>
>>> wrote:
>>>
>>>  Ok so here is the rule
>>>>
>>>> [InferredMembership:  (?u ie:memberOf ?g)
>>>>            <- allValue(?g ie:**mandatoryInterestsForGroupIncl**usion
>>>>                           ie:helpsIndividualDefine ?u)]
>>>>
>>>>
>>>> And here is the code for AllValues
>>>>
>>>>        logger.info(" subject is " + subj + " pred is " + pred + " pred2
>>>> is " + pred2 + " obj is " + obj);
>>>>
>>>>          ClosableIterator<Triple> ti =  context.find(subj, pred, (Node)
>>>> null);
>>>>          while (ti.hasNext()) {
>>>>              Triple triple = ti.next();
>>>>              logger.info(" got a triple of " + triple);
>>>>              logger.info(" triple subject is " + triple.getSubject());
>>>>              logger.info(" triple pred is " + triple.getPredicate());
>>>>              logger.info(" triple object is " + triple.getObject());
>>>>              logger.info(" looking for subject (triple.getObject()" +
>>>> triple.getObject() + " pred2 is " + pred2 + " obj is " + obj);
>>>>              if (!context.contains(triple.**getObject(), pred2, obj)) {
>>>>                  logger.info(" returning false");
>>>>                  return false;
>>>>              }
>>>>          }
>>>>
>>>>
>>>>          logger.info(" returning true");
>>>>
>>>>          return true;
>>>>
>>>>
>>>> When I have a case of true I get an error:
>>>>
>>>>      [java] com.hp.hpl.jena.reasoner.**ReasonerException: Internal
>>>> error in
>>>> LP reasoner: variable in triple result
>>>>       [java]     at
>>>> com.hp.hpl.jena.reasoner.**rulesys.impl.LPInterpreter.**
>>>> derefPossFunctor(**LPInterpreter.java:784)
>>>>
>>>>
>>>> I assume I have to bind ?u somewhere.  How?  Where ?
>>>>
>>>>
>>>> On Wed, Nov 7, 2012 at 9:06 AM, Dave Reynolds <
>>>> [email protected]>**wrote:
>>>>
>>>>  On 07/11/12 13:44, Scott Streit wrote:
>>>>>
>>>>>     (?u ie:memberOf ?g)
>>>>>>           <- (?g ie:****mandatoryInterestsForGroupIncl****usion ?i)
>>>>>>
>>>>>>              allValue(?i ie:#hasIndivudalInterestOf ?u)
>>>>>>
>>>>>> If I wrote an allValue builtIn, this would solve the problem correct.
>>>>>>
>>>>>>
>>>>> You can't have an allValue predicate with that signature, what would it
>>>>> mean?
>>>>>
>>>>>
>>>>>   What I mean by this is all forward chaining would take place first,
>>>>> and
>>>>>
>>>>>> now
>>>>>> I could backward chain allValue.  All I need to do is write allValue.
>>>>>>
>>>>>> This is correct, right?
>>>>>>
>>>>>>
>>>>> You could certainly do that bit of the work in code instead of in
>>>>> rules,
>>>>> sure. Though if you end up with just a few simple rules and a lot of
>>>>> special case builtins then the rule engine may not be offering you much
>>>>> value. You might just use code for everything or a sequenced set of
>>>>> SPARQL
>>>>> CONSTRUCT queries (SPARQL sub-queries, coupled with the unbound
>>>>> predicate,
>>>>> can do some closed world tests for you).
>>>>>
>>>>> If you do choose to go for a builtin then you'll need one that looks
>>>>> more
>>>>> like:
>>>>>
>>>>>    (?u ie:memberOf ?g)
>>>>>            <- allValue(?g ie:****mandatoryInterestsForGroupIncl**
>>>>> **usion
>>>>>
>>>>>                           ie:hasIndivudalInterestOf ?u)
>>>>>
>>>>> Then the predicate allValue(root P Q u) would find all values ?x such
>>>>> that (root P ?x) and then pass if (u Q ?x) is true for all of those ?x.
>>>>>
>>>>> You would need to decide whether either or both of u and g can be
>>>>> unbound.
>>>>>
>>>>>
>>>>>   Now I looked at noValue and
>>>>>
>>>>>>
>>>>>>          return !context.contains(subj, pred, obj);
>>>>>>
>>>>>> and this is where I would make the change correct?
>>>>>>
>>>>>>
>>>>> You'll need bigger changes than that, see above.
>>>>>
>>>>>
>>>>>   Also, how do I tell Jena of a new built in?
>>>>>
>>>>>>
>>>>>>
>>>>>     BuiltinRegistry.theRegistry.****register(new MyBuiltin());
>>>>>
>>>>> Dave
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> "If you are lucky enough to have lived in Paris as a young man, then
>>>> wherever you go for the rest of your life, it stays with you, for Paris
>>>> is
>>>> a moveable feast." -  Ernest Hemingway
>>>>
>>>> www.scottstreit.com
>>>>
>>>>
>>>
>>>
>>>
>>
>
>
> --
> "If you are lucky enough to have lived in Paris as a young man, then
> wherever you go for the rest of your life, it stays with you, for Paris is
> a moveable feast." -  Ernest Hemingway
>
> www.scottstreit.com
>



-- 
"If you are lucky enough to have lived in Paris as a young man, then
wherever you go for the rest of your life, it stays with you, for Paris is
a moveable feast." -  Ernest Hemingway

www.scottstreit.com

Reply via email to