// OO jDREW - An Object Oriented extension of the Java Deductive Reasoning Engine for the Web // Copyright (C) 2005 Marcel Ball // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA package org.ruleml.oojdrew.util; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import nu.xom.Elements; import nu.xom.ParsingException; import nu.xom.ValidityException; import org.ruleml.oojdrew.SyntaxFormat; import org.ruleml.oojdrew.parsing.POSLTypeQueryException; import org.ruleml.oojdrew.parsing.ParseException; import org.ruleml.oojdrew.parsing.RDFSParser; import org.ruleml.oojdrew.parsing.RuleMLTypeQueryException; import org.ruleml.oojdrew.parsing.SubsumesException; import org.ruleml.oojdrew.parsing.SubsumesParser; import org.ruleml.oojdrew.parsing.TypeQueryParserPOSL; import org.ruleml.oojdrew.parsing.TypeQueryParserRuleML; public class TaxonomyQueryAPI { private QueryTypes typeQuery; /** * Setup a new taxonomy * * @param syntaxFormat * The syntax format of the taxonomy (RuleML or POSL) * @param taxonomy * The taxonomy document * * @throws ValidityException * @throws ParseException * @throws ParsingException * @throws IOException * @throws SubsumesException */ public void initializeTaxonomy(SyntaxFormat syntaxFormat, String taxonomy) throws ValidityException, ParseException, ParsingException, IOException, SubsumesException { Types.reset(); if (syntaxFormat == SyntaxFormat.RDFS) { RDFSParser.parseRDFSString(taxonomy); } else if (syntaxFormat == SyntaxFormat.POSL) { SubsumesParser sp = new SubsumesParser(taxonomy); sp.parseSubsumes(); } typeQuery = new QueryTypes(); } /** * Issue a query on the taxonomy by using either a POSL or a RuleML query. * * @see TaxonomyQueryAPI#executeQueryRuleML(String) * @see TaxonomyQueryAPI#executeQueryPOSL(String) */ public String executeQuery(SyntaxFormat syntaxFormat, String taxonomyQuery) throws ValidityException, POSLTypeQueryException, ParseException, ParsingException, IOException, Exception { String result; if (syntaxFormat == SyntaxFormat.POSL) { result = executeQueryPOSL(taxonomyQuery); } else { result = executeQueryRuleML(taxonomyQuery); } return result; } /** * This method will issue a Query on the KB using a RuleML Query. * * @param RuleMLTypeQuery - a RuleML query as a String. * @return returns the RuleML answer expression as a String. * * @throws RuleMLTypeQueryException * @throws ValidityException * @throws ParseException * @throws ParsingException * @throws IOException */ private String executeQueryRuleML(String RuleMLTypeQuery) throws RuleMLTypeQueryException, ValidityException, ParseException, ParsingException, IOException { String answer = "<RuleML>\n\t<Answer>\n"; TypeQueryParserRuleML rmlTParser = new TypeQueryParserRuleML(RuleMLTypeQuery); Elements elements = rmlTParser.parseForPredicate(); String predicate = rmlTParser.getPredicate(); SubsumesStructure subPlus = null; SubsumesStructure sub = null; LUBGLBStructure lub = null; LUBGLBStructure glb = null; if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMESPLUS)){ subPlus = rmlTParser.parseElementsSubsumesAndSubsumesPlus(elements); //rel rel if(!subPlus.getSuperVar() && !subPlus.getSubVar()){ answer = answer + "\t\t<Ind>"; answer = answer + typeQuery.isSuperClass(subPlus.getSuperName(),subPlus.getSubName()); answer = answer + "</Ind>"; //var rel get all super classes }else if(subPlus.getSuperVar() && !subPlus.getSubVar()){ String term1VarName = subPlus.getSuperName(); String[] superClasses = typeQuery.findAllSuperClasses(subPlus.getSubName()); for(int i = 0; i < superClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + superClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != superClasses.length -1) answer = answer + "\n"; } //rel var get all sub classes }else if(!subPlus.getSuperVar() && subPlus.getSubVar()){ String term2VarName = subPlus.getSubName(); String[] subClasses = typeQuery.findAllSubClasses(subPlus.getSuperName()); for(int i = 0; i < subClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + subClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != subClasses.length -1) answer = answer + "\n"; } //var var get all relations }else if(subPlus.getSuperVar() && subPlus.getSubVar()){ String term2VarName = subPlus.getSubName(); String term1VarName = subPlus.getSuperName(); Iterator vit1 = typeQuery.findAllSuperClassesOfEverything().iterator(); while(vit1.hasNext()){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(vit1.hasNext()) answer = answer + "\n"; } } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMES)){ sub = rmlTParser.parseElementsSubsumesAndSubsumesPlus(elements); //rel rel if(!sub.getSuperVar() && !sub.getSubVar()){ answer = answer + "\t\t<Ind>"; answer = answer + typeQuery.isDirectSuperClass(sub.getSuperName(),sub.getSubName()); answer = answer + "</Ind>"; //var rel get all super classes }else if(sub.getSuperVar() && !sub.getSubVar()){ String term1VarName = sub.getSuperName(); String[] superClasses = typeQuery.getDirectSuperClasses(sub.getSubName()); for(int i = 0; i < superClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + superClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != superClasses.length -1) answer = answer + "\n"; } //rel var get all sub classes }else if(!sub.getSuperVar() && sub.getSubVar()){ String term2VarName = sub.getSubName(); String[] subClasses = typeQuery.getDirectSubClasses(sub.getSuperName()); for(int i = 0; i < subClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + subClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != subClasses.length -1) answer = answer + "\n"; } //var var get all relations }else if(sub.getSuperVar() && sub.getSubVar()){ String term2VarName = sub.getSubName(); String term1VarName = sub.getSuperName(); Iterator vit1 = typeQuery.findAllDirectSuperClassesOfEverything().iterator(); while(vit1.hasNext()){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(vit1.hasNext()) answer = answer + "\n"; } } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.LUB)){ lub = rmlTParser.parseElementsGLBandLUB(elements); if(lub.getResultVar()){ ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for(int i = 0; i < terms.size();i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery.leastUpperBound(lubArray); String resultVar = lub.getResultVarName(); answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + resultVar + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + leastUpperBound + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.GLB)){ glb = rmlTParser.parseElementsGLBandLUB(elements); if(glb.getResultVar()){ ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for(int i = 0; i < terms.size();i++) glbArray[i] = terms.get(i); String greatestLowerBound = typeQuery.greatestLowerBound(glbArray); String resultVar = glb.getResultVarName(); answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + resultVar + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + greatestLowerBound + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; } } answer += "\n\t</Answer>\n</RuleML>"; return answer; } /** * This method will issue a Query on the KB using a POSL Query. * * @param poslTypeQuery - a POSL query as a String. * @return returns the RuleML answer expression as a String. * * @throws ValidityException * @throws POSLTypeQueryException * @throws ParseException * @throws ParsingException * @throws IOException * @throws Exception */ private String executeQueryPOSL(String poslTypeQuery) throws ValidityException, POSLTypeQueryException, ParseException, ParsingException, IOException, Exception{ TypeQueryParserPOSL poslTParser = new TypeQueryParserPOSL(poslTypeQuery); Term[] queryTerms = poslTParser.parseForPredicate(); String predicate = poslTParser.getPredicate(); String answer = "<RuleML>\n\t<Answer>\n"; SubsumesStructure subPlus = null; SubsumesStructure sub = null; LUBGLBStructure lub = null; LUBGLBStructure glb = null; if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMESPLUS)){ subPlus = poslTParser.parseElementsSubsumesAndSubsumesPlus(queryTerms); //rel rel if(!subPlus.getSuperVar() && !subPlus.getSubVar()){ answer = answer + "\t\t<Ind>"; answer = answer + typeQuery.isSuperClass(subPlus.getSuperName(),subPlus.getSubName()); answer = answer + "</Ind>"; //var rel get all super classes }else if(subPlus.getSuperVar() && !subPlus.getSubVar()){ String term1VarName = subPlus.getSuperName(); String[] superClasses = typeQuery.findAllSuperClasses(subPlus.getSubName()); for(int i = 0; i < superClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + superClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != superClasses.length -1) answer = answer + "\n"; } //rel var get all sub classes }else if(!subPlus.getSuperVar() && subPlus.getSubVar()){ String term2VarName = subPlus.getSubName(); String[] subClasses = typeQuery.findAllSubClasses(subPlus.getSuperName()); for(int i = 0; i < subClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + subClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != subClasses.length -1) answer = answer + "\n"; } //var var get all relations }else if(subPlus.getSuperVar() && subPlus.getSubVar()){ String term2VarName = subPlus.getSubName(); String term1VarName = subPlus.getSuperName(); Iterator vit1 = typeQuery.findAllSuperClassesOfEverything().iterator(); while(vit1.hasNext()){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(vit1.hasNext()) answer = answer + "\n"; } } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.SUBSUMES)){ sub = poslTParser.parseElementsSubsumesAndSubsumesPlus(queryTerms); //rel rel if(!sub.getSuperVar() && !sub.getSubVar()){ answer = answer + "\t\t<Ind>"; answer = answer + typeQuery.isDirectSuperClass(sub.getSuperName(),sub.getSubName()); answer = answer + "</Ind>"; //var rel get all super classes }else if(sub.getSuperVar() && !sub.getSubVar()){ String term1VarName = sub.getSuperName(); String[] superClasses = typeQuery.getDirectSuperClasses(sub.getSubName()); for(int i = 0; i < superClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + superClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != superClasses.length -1) answer = answer + "\n"; } //rel var get all sub classes }else if(!sub.getSuperVar() && sub.getSubVar()){ String term2VarName = sub.getSubName(); String[] subClasses = typeQuery.getDirectSubClasses(sub.getSuperName()); for(int i = 0; i < subClasses.length; i++){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + subClasses[i] + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(i != subClasses.length -1) answer = answer + "\n"; } //var var get all relations }else if(sub.getSuperVar() && sub.getSubVar()){ String term2VarName = sub.getSubName(); String term1VarName = sub.getSuperName(); Iterator vit1 = typeQuery.findAllDirectSuperClassesOfEverything().iterator(); while(vit1.hasNext()){ answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term1VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + term2VarName + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + vit1.next().toString() + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; if(vit1.hasNext()) answer = answer + "\n"; } } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.LUB)){ lub = poslTParser.parseElementsGLBandLUB(queryTerms); if(lub.getResultVar()){ ArrayList<String> terms = lub.getTerms(); String[] lubArray = new String[terms.size()]; for(int i = 0; i < terms.size();i++) lubArray[i] = terms.get(i); String leastUpperBound = typeQuery.leastUpperBound(lubArray); String resultVar = lub.getResultVarName(); answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + resultVar + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + leastUpperBound + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; } }else if(predicate.equalsIgnoreCase(TypeQueryParserRuleML.GLB)){ glb = poslTParser.parseElementsGLBandLUB(queryTerms); if(glb.getResultVar()){ ArrayList<String> terms = glb.getTerms(); String[] glbArray = new String[terms.size()]; for(int i = 0; i < terms.size();i++) glbArray[i] = terms.get(i); String greatestLowerBound = typeQuery.greatestLowerBound(glbArray); String resultVar = glb.getResultVarName(); answer = answer + "\t\t<Rulebase>\n"; answer = answer + "\t\t\t<Equal>\n"; answer = answer + "\t\t\t\t<Var>" + resultVar + "</Var>\n"; answer = answer + "\t\t\t\t<Ind>" + greatestLowerBound + "</Ind>\n"; answer = answer + "\t\t\t</Equal>\n"; answer = answer + "\t\t</Rulebase>"; } } answer += "\n\t</Answer>\n</RuleML>"; return answer; } }