On Mon, Aug 12, 2013 at 4:11 PM, Joshua TAYLOR <[email protected]> wrote:
> On Mon, Aug 12, 2013 at 3:23 PM, Niranjan Balasubramanian
> <[email protected]> wrote:
>> Yes, getting at *all* possible derivations is bound to be problematic. How 
>> about finding K traces through the derivation graph? Is there any way to 
>> force the backward-chaining procedure to run until the answer is found K 
>> times (via different paths) or until the search space is exhausted?
>
> Depending on your ruleset and how much of the derivation you need, you
> can do a lot with print statements in your rules. For instance
>
> @prefix ex: <http://example.org/> .
>
> [(ex:A ex:B ex:C) <-
>  print( derivation 1 )]
> [(ex:A ex:B ex:C) <-
>  print( derivation 2 )]
> [(ex:A ex:B ex:C) <-
>  print( derivation 3 )]
>
> contains three rules that will produce (A B C).  When writing out an
> inference model based on these rules, all three rules are fired, even
> though the model only contains one statement (A B C). For instance,
> here's code that iterates through the statements of an inference model
> based on these rules:
>
> import java.io.BufferedReader;
> import java.io.ByteArrayInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.InputStreamReader;
>
> import com.hp.hpl.jena.rdf.model.InfModel;
> import com.hp.hpl.jena.rdf.model.Model;
> import com.hp.hpl.jena.rdf.model.ModelFactory;
> import com.hp.hpl.jena.rdf.model.StmtIterator;
> import com.hp.hpl.jena.reasoner.Reasoner;
> import com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner;
> import com.hp.hpl.jena.reasoner.rulesys.Rule;
>
>
> public class DerivationsFinder {
>         final static String ruleText = "" +
>                         "@prefix ex: <http://example.org/> .\n" +
>                         "\n" +
>                         "[(ex:A ex:B ex:C) <-\n" +
>                         " print( derivation 1 )]\n" +
>                         "[(ex:A ex:B ex:C) <-\n" +
>                         " print( derivation 2 )]\n" +
>                         "[(ex:A ex:B ex:C) <-\n" +
>                         " print( derivation 3 )]\n" +
>                         "";
>
>         public static void main(String[] args) throws IOException {
>                 try ( final InputStream in = new ByteArrayInputStream( 
> ruleText.getBytes() );
>                           final InputStreamReader reader = new 
> InputStreamReader( in );
>                           final BufferedReader buff = new BufferedReader( 
> reader ) ) {
>
>                         final Reasoner reasoner = new GenericRuleReasoner( 
> Rule.parseRules(
> Rule.rulesParserFromReader( buff )));
>                         final Model model = ModelFactory.createDefaultModel();
>                         final InfModel infModel = 
> ModelFactory.createInfModel( reasoner, model );
>
>                         for ( final StmtIterator it = 
> infModel.listStatements(); it.hasNext(); ) {
>                                 System.out.println( it.next() );
>                         }
>                 }
>         }
> }
>
> The output is:
>
> derivation '1'^^http://www.w3.org/2001/XMLSchema#int
> [http://example.org/A, http://example.org/B, http://example.org/C]
> derivation '2'^^http://www.w3.org/2001/XMLSchema#int
> derivation '3'^^http://www.w3.org/2001/XMLSchema#int
>
> If you can put enough debugging output in your rules, you should be
> able to capture a bunch of the derivations.

Hm.  Trying out something like this on the rules that you provided
doesn't seem to work for me, actually. Sorry.  I'll take a bit more of
a look, but I guess this isn't a great approach after all.


-- 
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Reply via email to