Hi Dave, Well.. I don't know the library well. Thank you for the input. Is there any documentation or tutorials about what you're recommending?
Thank you, Oana. Sent from my iPhone On 12/12/2012, at 7:31 PM, Dave Reynolds <[email protected]> wrote: > On 12/12/12 04:07, Oana Ureche wrote: >> Hi all, >> >> There is a shortcoming in Jena. Mainly the fact that it cannot handle >> complex rules.. i.e. throwing the following exception >> >> Exception in thread "main" >> com.hp.hpl.jena.reasoner.rulesys.impl.LPRuleSyntaxException: Syntax error in >> backward rule: rule1 >> Rule too complex for current implementation >> Rule clauses are limited to 15 permanent variables >> >> So I have decided to split the complex rule into smaller rules. Then apply a >> small rule to a dataset, which results into a bigger dataset, then apply the >> next small rule to the bigger dataset and so on and so forth.. Code looks >> like the following: > > Some suggestions here ... > > Firstly, if you can split your big rule into smaller rules then why not do so > within one rule set? I don't follow the need to have separate rule sets. > > Secondly, since your are running the inference to completion then forward > rules would be both higher performance and can handle more complex rules then > backward rules. > > Thirdly if you are going to split your rules into different rule sets then > just pass the models around. I don't understand why you are serializing the > models to strings and then deserializing them. Seems unnecessary. > > Dave > >> >> private static InfModel applyRule(String dataset, String >> filepath) { >> >> InputStream stream = new ByteArrayInputStream(dataset.getBytes("UTF-8")); >> Model instances = ModelFactory.createDefaultModel(); >> instances.read(stream, null); >> Reasoner reasoner = new GenericRuleReasoner(Rule.rulesFromURL(filepath)); >> reasoner.setDerivationLogging(true); >> return ModelFactory.createInfModel(reasoner, instances); >> } >> private static String inferConnName(String dataset) { >> InfModel inf = applyRule(dataset, "file:rules/conn_name.txt"); >> ByteArrayOutputStream out = new ByteArrayOutputStream(); >> inf.write(out, "RDF/XML"); >> return out.toString(); >> } >> private static String inferStatementName(String dataset) { >> InfModel inf = applyRule(dataset, "file:rules/statement_name.txt"); >> ByteArrayOutputStream out = new ByteArrayOutputStream(); >> inf.write(out, "RDF/XML"); >> return out.toString(); >> } >> private static void getVuln(String dataset) { >> String conn_name_dataset = inferConnName(dataset); >> String statement_name_dataset = inferStatementName(conn_name_dataset); >> InfModel inf = applyRule(statement_name_dataset, "file:rules/param.txt"); >> //print out the statements in the model >> StmtIterator iter = inf.listStatements(); >> while (iter.hasNext()) { >> Statement stmt = iter.nextStatement(); // get next statement >> ............................ >> >> } >> >> >> I was wondering if there is a better way to do this? >> >> Thank you, >> >> Oana. >
