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.
> 

Reply via email to