On Wed, Aug 14, 2013 at 12:12 PM, Niranjan Balasubramanian <niran...@cs.washington.edu> wrote: > Thanks for this example. From your output it seems that rule 1is derives the > statement (:iron, :conducts, :electricity) and rule 2 derives (:iron, > :conductorof, :electricity) > > I am more interested in finding out the possible ways in which the query > statement: (:iron, :conductorOf, :electricity) can be derived. > > Given the following rules: > > @prefix : http://myexample.org/ > [rule1: (?a :conductorOf :electricity) <- (?a rdf:type :Metal) print(rule1 ?a > )] > [rule2: (?x :conductorOf ?z) <- (?x :conducts ?z) print( rule2 ?x ?z )] > (:iron rdf:type :Metal) <- . > (:iron :conducts :electricity) <- . > > I'd expect to see both rule 1 and rule 2 as two possible derivations.
I think you've misunderstood my code, or its output. I used the same rules that you provided. Both rule1 and rule2 derive triples that have :conductorOf as their predicate: "[rule1: (?a :conductorOf :electricity) <- (?a rdf:type :Metal) print( rule1 ?a )]\n" + "[rule2: (?x :conductorOf ?z) <- (?x :conducts ?z) print( rule2 ?x ?z )]\n" + When these rules fire, they are producing triples of the form ?subject :conductorOf ?object Thus, the lines from the output rule1 http://myexample.org/iron rule2 http://myexample.org/iron http://myexample.org/electricity indicate that rule1 was fired with ?a bound to :iron, producing the triple ":iron :conductorOf :electricity", and that rule2 was fired with ?x bound to :iron, and ?z bound to :electricity, producing the triple ":iron :conductorOf :electricity". So it is not the case that "rule 1is derives the statement (:iron, :conducts, :electricity) and rule 2 derives (:iron, :conductorof, :electricity)". Instead, the output correspond to the two ways that that triple can be derived. > As Dave Reynolds pointed out in his reply this seems not doable with Jena as > it stops inference as soon as the answer is found. If you ask specifically for the triple "iron conductorOf electricity", the rule engine will stop as soon as one derivation is found. However, if you ask for all triples (as I did in my example), the rules for both derivations will fire (and so we saw output for both rule1 and rule2). I agree that this method is nor perfect, as you do not get the *entire* derivation, but just the final step of it, but it does provide *some* way of finding out the different ways in which a triple of interest can be derived. //JT -- Joshua Taylor, http://www.cs.rpi.edu/~tayloj/