Hi Stephen, firstly, thanks a lot for your effort and your suggestions. My comments are in the lines.
Andrea > 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? It makes a lot of sense. I will add that. > 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?) No, it is not possible yet. I think that we could manage identifiers with two addRule methods: - addRule(IRI, String), where the first parameter is the ID to associate to the rule and the second parameter is the plain rule, e.g., "[body -> head]"; - addRule(String), where the parameter should provide both the ID and the rule in the classic way, e.g. "rule[body -> head]" I am wondering if it could be useful in the second case to accept also plain rules without IDs and associate them blank nodes. > 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) Yes, I will add it. > I also tested the RuleStore methods .listRecipes() and .listIRIRecipes() - > both of these are returning null after creating the recipe with the three > rules. I am going to investigate those issues. > 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 >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> >> >> >> >
