Dave,
I simplified my code, removing reification and just down to the bare
essentials.
Rule:
[InferredMembership: (?u ie:memberOf ?g)
<- allValue(?g ie:mandatoryInterestsForGroupInclusion
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 pred2
is 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#mandatoryInterestsForGroupInclusion
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 is
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#mandatoryInterestsForGroupInclusionpred2
is
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#mandatoryInterestsForGroupInclusion
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 pred2
is 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#mandatoryInterestsForGroupInclusion
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 is
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:mandatoryInterestsForGroupInclusion
ie:helpsIndividualDefine ?u)]
And still got
.owl#GroupHemmingway @
http://www.compscii.com/ontologies/0.1/AutoIE.owl#mandatoryInterestsForGroupInclusion
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 is
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:mandatoryInterestsForGroupInclusion
> 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