Thanks Andrea 1) using rule.toKReSSyntax() does indeed show the rule, thanks for raising the JIRA for removing the getRule() method 2) using unique rule identifiers in the rules themselves does now mean that when I list the resulting recipe all three rules are present, thanks
Some thoughts on this: a) as there seems to be a uniqueness requirement on rule identifiers, wouldn't it make sense that adding a rule with the same identifier as an existing rule should throw an exception? b) Recipe identity is by IRI (and also ID which is the string form); Rules seem to use string identifiers (specified in the rule itself) with generated IRIs (eg http://kres.iks-project.eu/ontology/meta/variables#Rule3 for Rule3). Given the uniqueness constraint I think overall management of these would be easier if IRIs could be specified as the identifiers directly (maybe this is possible already?) c) I tested removing a rule using the .removeRule(Rule) method (works fine) - for consistency would it make sense also to have methods that remove rules based on identifiers/IRIs? (No specific need for this though; just a suggestion) I also tested the RuleStore methods .listRecipes() and .listIRIRecipes() - both of these are returning null after creating the recipe with the three rules. Now that adding recipes and rules is working fine, I'm proceeding to test our existing refactoring code; I'll let you know how I get on. Thanks for your assistance with this Steve > -----Original Message----- > From: Andrea Giovanni Nuzzolese [mailto:[email protected]] > Sent: 09 February 2012 15:06 > To: Stephen Bayliss; [email protected] > Subject: Re: NPE on refactoring using Java API > > > Hi Stephen, > > yes, the reference to the RuleStore you did in your bundle is ok. > Sorry, I missed that in previous emails. > > I am here for any further developments. > > Andrea > > On Feb 9, 2012, at 3:57 PM, Stephen Bayliss wrote: > > > Thanks Andrea > > > > I'm getting RuleStoreImpl in my bundle using SCM; ie by declaring > > > > @Reference > > protected RuleStore m_ruleStore > > > > Is that ok? > > > > (this is later cast to RuleStoreImpl) > > > > I'll try giving the rules different names; and try the toKReSSyntax > > method also and get back to you. > > > > Thanks > > Steve > > > >> -----Original Message----- > >> From: Andrea Giovanni Nuzzolese [mailto:[email protected]] > >> Sent: 09 February 2012 14:18 > >> To: Stephen Bayliss; [email protected] > >> Subject: Re: NPE on refactoring using Java API > >> > >> > >> Hi Stephen, > >> > >> It may depends on the constructor you use for initializing > >> the RuleStoreImpl. If you used the default constructor > >> RuleStoreImpl(), it is intended to be used by the OSGI > >> environment with Service Component Runtime support (it is > >> suggested in the javadoc). You might use > >> RuleStoreImpl(Dictionary<String, Object>) also with an empty > >> but not null dictionary. About the rule syntax, you should > >> specify different names for each rule. I mean something like > >> the following > >> > >> ... > >> String rule1 = "Rule1[ has(<" + ns + "x" + ">, ?s, ?o) > >> -> has(<" + ns +, "y" + ">, ?s, ?o) ] "; > >> String rule2 = "Rule2[ has(<" + ns + "a" + ">, ?s, ?o) > >> -> has(<" + ns +, "b" + ">, ?s, ?o) ] "; > >> String rule3 = "Rule3[ has(<" + ns + "c" + ">, ?s, ?o) > >> -> has(<" + ns +, "d" + ">, ?s, ?o) ] "; > >> ... > >> > >> Finally, in the last System.out.println you used > >> rule.getRule(). I noticed how that method does not return > >> anything and should be removed (I have just opened an issue > >> on Jira [1] about that). Use, instead toKReSSyntax() which > >> returns a string containing the rule in the native syntax. > >> > >> Andrea > >> > >> > >> [1] https://issues.apache.org/jira/browse/STANBOL-489 > >> > >> > >> On Feb 9, 2012, at 1:08 PM, Stephen Bayliss wrote: > >> > >>> Hi Andrea > >>> > >>> I'm still not getting this to work, maybe I'm missing something > >>> obvious... > >>> > >>> My test code: > >>> > >>> public void rulesAndRecipesTest() throws NoSuchRecipeException { > >>> String ns = "http://www.example.org/dummy/ns#"; > >>> String rule1 = "Rule[ has(<" + ns + "x" + ">, ?s, ?o) -> > >> has(<" + > >>> ns + "y" + ">, ?s, ?o) ] "; > >>> String rule2 = "Rule[ has(<" + ns + "a" + ">, ?s, ?o) -> > >> has(<" + > >>> ns + "b" + ">, ?s, ?o) ] "; > >>> String rule3 = "Rule[ has(<" + ns + "c" + ">, ?s, ?o) -> > >> has(<" + > >>> ns + "d" + ">, ?s, ?o) ] "; > >>> > >>> String recipeID = "http://www.example/org/dummy/recipe"; > >>> IRI recipeIRI = IRI.create(recipeID); > >>> > >>> boolean ok = m_ruleStore.addRecipe(recipeIRI, "example recipe"); > >>> if (!ok) System.out.println("Failed to create recipe"); > >>> > >>> Recipe recipe = m_ruleStore.addRuleToRecipe(recipeID, rule1); > >>> recipe = m_ruleStore.addRuleToRecipe(recipeID, rule2); > >>> recipe = m_ruleStore.addRuleToRecipe(recipeID, rule3); > >>> > >>> System.out.println("rules in recipe: " + > >>> recipe.getkReSRuleList().size()); > >>> > >>> recipe = m_ruleStore.getRecipe(recipeIRI); > >>> for (Rule rule : recipe.getkReSRuleList()) { > >>> System.out.println("rule: " + rule.getRuleName() + ": " + > >>> rule.getRule()); > >>> } > >>> } > >>> > >>> And the output on running this is: > >>> > >>> ----- > >>> rules in recipe: 2 > >>> rule: > http://kres.iks-project.eu/ontology/meta/variables#Rule: null > >>> ----- > >>> > >>> Thanks > >>> Steve > >>> > >>>> -----Original Message----- > >>>> From: Stephen Bayliss > [mailto:[email protected]] > >>>> Sent: 09 February 2012 10:31 > >>>> To: [email protected] > >>>> Subject: RE: NPE on refactoring using Java API > >>>> > >>>> > >>>> Hello Andrea > >>>> > >>>> Many thanks for this - I'm re-writing this bit of code > to use the > >>>> API as you have suggested, I'll let you know how it goes. > >>>> > >>>> Out of interest - what is the intended usage of eg > AddRule? Or is > >>>> that not part of the API and therefore should be ignored... > >>>> > >>>> Thanks > >>>> Steve > >>>> > >>>>> -----Original Message----- > >>>>> From: Andrea Giovanni Nuzzolese [mailto:[email protected]] > >>>>> Sent: 09 February 2012 10:01 > >>>>> To: Stephen Bayliss; [email protected] > >>>>> Subject: Re: NPE on refactoring using Java API > >>>>> > >>>>> > >>>>> I Stephen, > >>>>> > >>>>> do not directly use methods of the classes AddRule and > AddRecipe. > >>>>> Instead, use methods of the RuleStore. You can create a > >> recipe with > >>>>> the method addRecipe(IRI, String), where the first > >> argument is the > >>>>> recipe ID and the second is a description of the > recipe. Then you > >>>>> can add rules to the recipe created with the method > >>>>> addRuleToRecipe(String, String), where the first > argument is the > >>>>> ID of the recipe to which you want to add the rule and > the second > >>>>> argument is the rule itself. > >>>>> > >>>>> I hope it helps. > >>>>> > >>>>> Best. > >>>>> Andrea > >>>>> > >>>>> On Feb 8, 2012, at 5:43 PM, Stephen Bayliss wrote: > >>>>> > >>>>>> Hi > >>>>>> > >>>>>> I'm getting an NPE when refactoring using the Java API: > >>>>>> > >>>>>> java.lang.NullPointerException > >>>>>> at > >>>>>> > >>>>> > >>>> > >> > org.apache.stanbol.rules.refactor.impl.RefactorerImpl.ontologyRefacto > >>>> r > >>>>>> ing(Re > >>>>>> factorerImpl.java:284) > >>>>>> > >>>>>> This is something that used to work with an old svn > >>>>> revision, current > >>>>>> rev is 1236695. > >>>>>> > >>>>>> I'm creating a Recipe with some rules, following the code > >>>>> in the REST > >>>>>> API as an example. > >>>>>> > >>>>>> My Bundle is getting the rule store with > >>>>>> > >>>>>> @Reference > >>>>>> protected RuleStore m_ruleStore; > >>>>>> > >>>>>> I'm adding rules to the store with: > >>>>>> > >>>>>> AddRule adder = new AddRule(m_ruleStore); > >>>>> adder.addRule(ruleIRI, rule, > >>>>>> description); > >>>>>> > >>>>>> (which is returning true) > >>>>>> > >>>>>> I'm adding the recipe by creating a Vector<IRI> ruleIris and > >>>>>> populating with the rule IRIs, then > >>>>>> > >>>>>> AddRecipe recipeAdder = new AddRecipe(m_ruleStore); > >>>>>> recipeAdder.addRecipe(recipeIri, ruleIris, "my rule"); > >>>>>> > >>>>>> (returns true) > >>>>>> > >>>>>> and > >>>>>> m_ruleStore.saveOntology(). > >>>>>> > >>>>>> I can query for the recipe and list the rules fine using a > >>>>>> GetRecipe#getAllRecipes(); > >>>>>> > >>>>>> However, on refactoring with a Refactorer, got in my > >> bundle using: > >>>>>> > >>>>>> @Reference > >>>>>> Refactorer m_refactorer; > >>>>>> > >>>>>> Then > >>>>>> > >>>>>> m_refactorer.ontologyRefactoring(outputIri, inputIri, > recipeIri) > >>>>>> > >>>>>> But this is throwing the NPE above. > >>>>>> > >>>>>> (I notice it is using > >>>>>> RuleStore#getRecipe and then Recipe#getkReSRuleList > >>>>>> And if I try to get the recipes using > m_ruleStore.listRecipes(); > >>>>>> this returns Null, which is odd...) > >>>>>> > >>>>>> So how do I get this working? There seem to be "two APIs" > >>>>> in a sense, > >>>>>> the AddRule/GetRule etc stuff and the methods directly on the > >>>>>> RuleStore. > >>>>>> > >>>>>> Thanks > >>>>>> Steve > >>>>> > >>>>> > >>>>> > >>>> > >>>> > >>> > >> > >> -- > >> Andrea Giovanni Nuzzolese > >> Semantic Technology Laboratory (STLab) > >> Institute for Cognitive Science and Technology (ISTC) National > >> Research Council (CNR) Via Nomentana 56, Roma - Italy > >> > >> > >> > >> > >> > >> > >> > >> > > > > >
