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