|
From: <lor...@us...> - 2014-07-29 13:53:27
|
Revision: 4280
http://sourceforge.net/p/dl-learner/code/4280
Author: lorenz_b
Date: 2014-07-29 13:53:19 +0000 (Tue, 29 Jul 2014)
Log Message:
-----------
Added punning test.
Modified Paths:
--------------
trunk/components-core/pom.xml
trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java
trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OENode.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2Disjunctive.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2DisjunctiveMT.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java
trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/util/QueryTreeConverter.java
trunk/components-core/src/main/java/org/dllearner/core/AbstractCELA.java
trunk/components-core/src/main/java/org/dllearner/core/owl/Constant.java
trunk/components-core/src/main/java/org/dllearner/core/owl/DatatypeProperty.java
trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMaxValue.java
trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinMaxRange.java
trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinValue.java
trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectProperty.java
trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java
trunk/components-core/src/main/java/org/dllearner/reasoning/ExistentialRestrictionMaterialization.java
trunk/components-core/src/main/java/org/dllearner/reasoning/FastInstanceChecker.java
trunk/components-core/src/main/java/org/dllearner/reasoning/MaterializableFastInstanceChecker.java
trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java
trunk/components-core/src/main/java/org/dllearner/refinementoperators/RhoDRDown.java
trunk/components-core/src/main/java/org/dllearner/utilities/owl/ConceptComparator.java
trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIDescriptionConvertVisitor.java
trunk/components-core/src/main/java/org/dllearner/utilities/owl/RoleComparator.java
trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETestCorpus.java
trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETestNoCorpus.java
trunk/components-core/src/test/java/org/dllearner/algorithms/isle/metrics/PMIRelevanceMetricTest.java
trunk/components-core/src/test/java/org/dllearner/algorithms/isle/metrics/RelevanceMetricsTest.java
trunk/components-core/src/test/java/org/dllearner/algorithms/pattern/OWLPatternDetectionTest.java
trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/GeneralisationTest.java
trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java
trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/QTLTest.java
trunk/components-core/src/test/java/org/dllearner/test/junit/SomeOnlyReasonerTest.java
trunk/interfaces/pom.xml
trunk/interfaces/src/main/java/org/dllearner/cli/CLI.java
trunk/pom.xml
trunk/scripts/pom.xml
trunk/scripts/src/main/java/org/dllearner/scripts/RAChallenge.java
trunk/scripts/src/main/java/org/dllearner/scripts/evaluation/QTLEvaluation.java
trunk/scripts/src/main/java/org/dllearner/scripts/pattern/OWLAxiomPatternUsageEvaluation.java
Modified: trunk/components-core/pom.xml
===================================================================
--- trunk/components-core/pom.xml 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/pom.xml 2014-07-29 13:53:19 UTC (rev 4280)
@@ -100,10 +100,10 @@
<artifactId>mysql-connector-java</artifactId>
</dependency>
- <dependency>
+ <!-- <dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-distribution</artifactId>
- </dependency>
+ </dependency> -->
<dependency>
<groupId>com.clarkparsia</groupId>
@@ -152,10 +152,6 @@
<artifactId>hermit</artifactId>
</dependency>
- <dependency>
- <groupId>eu.trowl</groupId>
- <artifactId>trowl-core</artifactId>
- </dependency>
<dependency>
<groupId>com.jamonapi</groupId>
@@ -249,6 +245,11 @@
<artifactId>jsexp</artifactId>
<version>0.1.0</version>
</dependency>
+ <dependency>
+ <groupId>eu.trowl</groupId>
+ <artifactId>trowl-core</artifactId>
+ <version>1.4.0</version>
+ </dependency>
<dependency>
<groupId>xerces</groupId>
@@ -334,6 +335,16 @@
<artifactId>solr-solrj</artifactId>
<version>4.4.0</version>
</dependency>
+ <dependency>
+ <groupId>nz.ac.waikato.cms.weka</groupId>
+ <artifactId>weka-dev</artifactId>
+ <version>3.7.11</version>
+</dependency>
+ <!-- <dependency>
+ <groupId>nz.ac.waikato.cms.weka</groupId>
+ <artifactId>weka-stable</artifactId>
+ <version>3.6.9</version>
+ </dependency> -->
</dependencies>
<dependencyManagement>
<dependencies>
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -32,7 +32,6 @@
import java.util.TreeSet;
import org.apache.log4j.Logger;
-import org.dllearner.algorithms.elcopy.ELLearningAlgorithm;
import org.dllearner.core.AbstractCELA;
import org.dllearner.core.AbstractHeuristic;
import org.dllearner.core.AbstractKnowledgeSource;
@@ -50,7 +49,6 @@
import org.dllearner.core.owl.Restriction;
import org.dllearner.core.owl.Thing;
import org.dllearner.kb.OWLAPIOntology;
-import org.dllearner.kb.OWLFile;
import org.dllearner.learningproblems.ClassLearningProblem;
import org.dllearner.learningproblems.PosNegLP;
import org.dllearner.learningproblems.PosOnlyLP;
@@ -92,7 +90,7 @@
*
*/
@ComponentAnn(name="CELOE", shortName="celoe", version=1.0, description="CELOE is an adapted and extended version of the OCEL algorithm applied for the ontology engineering use case. See http://jens-lehmann.org/files/2011/celoe.pdf for reference.")
-public class CELOE extends AbstractCELA {
+public class CELOE extends AbstractCELA implements Cloneable{
private static Logger logger = Logger.getLogger(CELOE.class);
// private CELOEConfigurator configurator;
@@ -224,6 +222,39 @@
}
+ public CELOE(CELOE celoe){
+ setReasoner(celoe.reasoner);
+ setLearningProblem(celoe.learningProblem);
+ setAllowedConcepts(celoe.getAllowedConcepts());
+ setExpandAccuracy100Nodes(celoe.expandAccuracy100Nodes);
+ setFilterDescriptionsFollowingFromKB(celoe.filterDescriptionsFollowingFromKB);
+ setHeuristic(celoe.heuristic);
+ setIgnoredConcepts(celoe.ignoredConcepts);
+ setLearningProblem(celoe.learningProblem);
+ setMaxClassExpressionTests(celoe.maxClassExpressionTests);
+ setMaxClassExpressionTestsAfterImprovement(celoe.maxClassExpressionTestsAfterImprovement);
+ setMaxDepth(celoe.maxDepth);
+ setMaxExecutionTimeInSeconds(celoe.maxExecutionTimeInSeconds);
+ setMaxExecutionTimeInSecondsAfterImprovement(celoe.maxExecutionTimeInSecondsAfterImprovement);
+ setMaxNrOfResults(celoe.maxNrOfResults);
+ setNoisePercentage(celoe.noisePercentage);
+ RhoDRDown op = new RhoDRDown((RhoDRDown)celoe.operator);
+ try {
+ op.init();
+ } catch (ComponentInitException e) {
+ e.printStackTrace();
+ }
+ setOperator(op);
+ setReplaceSearchTree(celoe.replaceSearchTree);
+ setReuseExistingDescription(celoe.reuseExistingDescription);
+ setSingleSuggestionMode(celoe.singleSuggestionMode);
+ setStartClass(celoe.startClass);
+ setStopOnFirstDefinition(celoe.stopOnFirstDefinition);
+ setTerminateOnNoiseReached(celoe.terminateOnNoiseReached);
+ setUseMinimizer(celoe.useMinimizer);
+ setWriteSearchTree(celoe.writeSearchTree);
+ }
+
public CELOE(AbstractLearningProblem problem, AbstractReasonerComponent reasoner) {
super(problem, reasoner);
// configurator = new CELOEConfigurator(this);
@@ -529,7 +560,7 @@
treeString += " " + n + "\n";
}
}
- treeString += startNode.toTreeString(baseURI);
+ treeString += startNode.toTreeString(baseURI, prefixes);
treeString += "\n";
if (replaceSearchTree)
@@ -1134,6 +1165,14 @@
public void setExpandAccuracy100Nodes(boolean expandAccuracy100Nodes) {
this.expandAccuracy100Nodes = expandAccuracy100Nodes;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#clone()
+ */
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return new CELOE(this);
+ }
public static void main(String[] args) throws Exception{
String cls = "http://purl.org/procurement/public-contracts#Tender";
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OENode.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OENode.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OENode.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -22,6 +22,7 @@
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import org.dllearner.algorithms.SearchTreeNode;
import org.dllearner.algorithms.isle.NLPHeuristic;
@@ -119,7 +120,11 @@
}
public String getShortDescription(String baseURI) {
- String ret = description.toString(baseURI,null) + " [";
+ return getShortDescription(baseURI, null);
+ }
+
+ public String getShortDescription(String baseURI, Map<String, String> prefixes) {
+ String ret = description.toString(baseURI,prefixes) + " [";
// ret += "score" + NLPHeuristic.getNodeScore(this) + ",";
ret += "acc:" + dfPercent.format(accuracy) + ", ";
ret += "he:" + horizontalExpansion + ", ";
@@ -141,6 +146,10 @@
return toTreeString(0, baseURI).toString();
}
+ public String toTreeString(String baseURI, Map<String, String> prefixes) {
+ return toTreeString(0, baseURI, prefixes).toString();
+ }
+
private StringBuilder toTreeString(int depth, String baseURI) {
StringBuilder treeString = new StringBuilder();
for(int i=0; i<depth-1; i++)
@@ -153,6 +162,19 @@
}
return treeString;
}
+
+ private StringBuilder toTreeString(int depth, String baseURI, Map<String, String> prefixes) {
+ StringBuilder treeString = new StringBuilder();
+ for(int i=0; i<depth-1; i++)
+ treeString.append(" ");
+ if(depth!=0)
+ treeString.append("|--> ");
+ treeString.append(getShortDescription(baseURI, prefixes)+"\n");
+ for(OENode child : children) {
+ treeString.append(child.toTreeString(depth+1,baseURI,prefixes));
+ }
+ return treeString;
+ }
/**
* @return the refinementCount
@@ -166,5 +188,5 @@
*/
public void setRefinementCount(int refinementCount) {
this.refinementCount = refinementCount;
- }
+ }
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -202,7 +202,7 @@
public EvaluatedDescription getCurrentlyBestEvaluatedDescription() {
EvaluatedQueryTree<String> bestSolution = solutions.first();
Description description = DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(
- bestSolution.getTree().asOWLClassExpression(LiteralNodeConversionStrategy.FACET_RESTRICTION));
+ bestSolution.getTree().asOWLClassExpression(LiteralNodeConversionStrategy.MIN_MAX));
return new EvaluatedDescription(description, new AxiomScore(bestSolution.getScore()));
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2Disjunctive.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2Disjunctive.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2Disjunctive.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -19,7 +19,6 @@
import org.apache.log4j.Logger;
import org.dllearner.algorithms.qtl.cache.QueryTreeCache;
import org.dllearner.algorithms.qtl.datastructures.QueryTree;
-import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl;
import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl.LiteralNodeConversionStrategy;
import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl.LiteralNodeSubsumptionStrategy;
import org.dllearner.algorithms.qtl.operations.lgg.EvaluatedQueryTree;
@@ -42,8 +41,10 @@
import org.dllearner.learningproblems.PosNegLP;
import org.dllearner.learningproblems.QueryTreeScore;
import org.dllearner.utilities.owl.DLLearnerDescriptionConvertVisitor;
+import org.dllearner.utilities.owl.DLSyntaxObjectRenderer;
import org.dllearner.utilities.owl.OWLAPIConverter;
import org.semanticweb.owlapi.io.ToStringRenderer;
+import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.util.SimpleShortFormProvider;
import org.springframework.beans.factory.annotation.Autowired;
@@ -75,6 +76,7 @@
private Set<Individual> currentNegExamples;
private Map<QueryTree<String>, Individual> tree2Individual;
+ private Map<Individual, QueryTree<String>> individual2Tree;
private QueryTreeCache treeCache;
@@ -121,7 +123,15 @@
private long partialSolutionStartTime;
private double startPosExamplesSize;
+ private int expressionTests = 0;
+ LiteralNodeConversionStrategy[] strategies = new LiteralNodeConversionStrategy[]{
+ LiteralNodeConversionStrategy.MIN,
+ LiteralNodeConversionStrategy.MAX,
+ LiteralNodeConversionStrategy.MIN_MAX,
+ LiteralNodeConversionStrategy.DATATYPE
+ };
+
public QTL2Disjunctive() {}
public QTL2Disjunctive(PosNegLP learningProblem, AbstractReasonerComponent reasoner) throws LearningProblemUnsupportedException{
@@ -154,7 +164,7 @@
*/
@Override
public void init() throws ComponentInitException {
-
+ ToStringRenderer.getInstance().setRenderer(new DLSyntaxObjectRenderer());
if(!(learningProblem instanceof PosNegLP)){
throw new IllegalArgumentException("Only PosNeg learning problems are supported");
}
@@ -170,6 +180,7 @@
logger.info("Initializing...");
treeCache = new QueryTreeCache(model);
tree2Individual = new HashMap<QueryTree<String>, Individual>(lp.getPositiveExamples().size()+lp.getNegativeExamples().size());
+ individual2Tree = new HashMap<Individual, QueryTree<String>>(lp.getPositiveExamples().size()+lp.getNegativeExamples().size());
currentPosExampleTrees = new ArrayList<QueryTree<String>>(lp.getPositiveExamples().size());
currentNegExampleTrees = new ArrayList<QueryTree<String>>(lp.getNegativeExamples().size());
@@ -205,11 +216,13 @@
for (Individual ind : lp.getPositiveExamples()) {
queryTree = treeCache.getQueryTree(ind.getName());
tree2Individual.put(queryTree, ind);
+ individual2Tree.put(ind, queryTree);
currentPosExampleTrees.add(queryTree);
}
for (Individual ind : lp.getNegativeExamples()) {
queryTree = treeCache.getQueryTree(ind.getName());
tree2Individual.put(queryTree, ind);
+ individual2Tree.put(ind, queryTree);
currentNegExampleTrees.add(queryTree);
}
logger.info("...done.");
@@ -235,7 +248,7 @@
//compute best (partial) solution computed so far
EvaluatedQueryTree<String> bestPartialSolution = computeBestPartialSolution();
- //add if some criteria are satisfied
+ //add to partial solutions if criteria are satisfied
if(bestPartialSolution.getScore() >= minimumTreeScore){
partialSolutions.add(bestPartialSolution);
@@ -244,14 +257,14 @@
QueryTree<String> tree;
for (Iterator<QueryTree<String>> iterator = currentPosExampleTrees.iterator(); iterator.hasNext();) {
tree = iterator.next();
- if(tree.isSubsumedBy(bestPartialSolution.getTree())){
+ if(!bestPartialSolution.getFalseNegatives().contains(tree)){//a pos tree that is not covered
iterator.remove();
currentPosExamples.remove(tree2Individual.get(tree));
}
}
for (Iterator<QueryTree<String>> iterator = currentNegExampleTrees.iterator(); iterator.hasNext();) {
tree = iterator.next();
- if(tree.isSubsumedBy(bestPartialSolution.getTree())){
+ if(bestPartialSolution.getFalsePositives().contains(tree)){//a neg example that is covered
iterator.remove();
currentNegExamples.remove(tree2Individual.get(tree));
}
@@ -272,8 +285,9 @@
long endTime = System.currentTimeMillis();
logger.info("Finished in " + (endTime-startTime) + "ms.");
+ logger.info(expressionTests +" descriptions tested");
+ logger.info("Combined solution:" + OWLAPIConverter.getOWLAPIDescription(currentBestSolution.getDescription()).toString().replace("\n", ""));
- logger.info("Combined solution:" + OWLAPIConverter.getOWLAPIDescription(currentBestSolution.getDescription()).toString().replace("\n", ""));
logger.info(currentBestSolution.getScore());
}
@@ -291,7 +305,9 @@
logger.trace("TODO list size: " + todoList.size());
//pick best element from todo list
currentElement = todoList.poll();
+
currentTree = currentElement.getTree();
+ logger.info("Next tree: " + currentElement.getTreeScore() + "\n" + OWLAPIConverter.getOWLAPIDescription(currentElement.getEvaluatedDescription().getDescription()));
//generate the LGG between the chosen tree and each uncovered positive example
Iterator<QueryTree<String>> it = currentElement.getFalseNegatives().iterator();
while (it.hasNext() && !isPartialSolutionTimeExpired() && !isTimeExpired()) {
@@ -302,26 +318,29 @@
lggMon.stop();
//evaluate the LGG
- Set<EvaluatedQueryTree<String>> solutions = evaluate(lgg, true);
+ Set<EvaluatedQueryTree<String>> solutions = evaluate2(lgg, true);
for (EvaluatedQueryTree<String> solution : solutions) {
+ expressionTests++;
double score = solution.getScore();
double mas = heuristic.getMaximumAchievableScore(solution);
if(score >= bestCurrentScore){
- //add to todo list, if not already contained in todo list or solution list
- todo(solution);
if(score > bestCurrentScore){
logger.info("\tGot better solution:" + solution.getTreeScore());
+ logger.info(OWLAPIConverter.getOWLAPIDescription(solution.getEvaluatedDescription().getDescription()));
bestCurrentScore = score;
bestPartialSolutionTree = solution;
}
-
+ //add to todo list, if not already contained in todo list or solution list
+ todo(solution);
} else if(mas >= bestCurrentScore){
todo(solution);
} else {
+ logger.info("Too weak:" + solution.getTreeScore());
// System.out.println("Too general");
// System.out.println("MAS=" + mas + "\nBest=" + bestCurrentScore);
}
+
currentPartialSolutions.add(currentElement);
}
}
@@ -329,7 +348,7 @@
}
long endTime = System.currentTimeMillis();
logger.info("...finished in " + (endTime-partialSolutionStartTime) + "ms.");
- EvaluatedDescription bestPartialSolution = bestPartialSolutionTree.asEvaluatedDescription(LiteralNodeConversionStrategy.SOME_VALUES_FROM);
+ EvaluatedDescription bestPartialSolution = bestPartialSolutionTree.getEvaluatedDescription();
logger.info("Best partial solution: " + OWLAPIConverter.getOWLAPIDescription(bestPartialSolution.getDescription()).toString().replace("\n", "") + "\n(" + bestPartialSolution.getScore() + ")");
@@ -410,7 +429,12 @@
Set<EvaluatedQueryTree<String>> evaluatedTrees = new TreeSet<EvaluatedQueryTree<String>>();
LiteralNodeSubsumptionStrategy[] strategies = LiteralNodeSubsumptionStrategy.values();
- strategies = new LiteralNodeSubsumptionStrategy[]{LiteralNodeSubsumptionStrategy.DATATYPE, LiteralNodeSubsumptionStrategy.INTERVAL};
+ strategies = new LiteralNodeSubsumptionStrategy[]{
+ LiteralNodeSubsumptionStrategy.DATATYPE,
+ LiteralNodeSubsumptionStrategy.INTERVAL,
+ LiteralNodeSubsumptionStrategy.MIN,
+ LiteralNodeSubsumptionStrategy.MAX,
+ };
for (LiteralNodeSubsumptionStrategy strategy : strategies) {
//1. get a score for the coverage = recall oriented
List<QueryTree<String>> uncoveredPositiveExampleTrees = new ArrayList<QueryTree<String>>();
@@ -480,18 +504,27 @@
* @param useSpecifity
* @return
*/
- private Set<EvaluatedDescription> evaluate2(QueryTree<String> tree, boolean useSpecifity){
- Set<EvaluatedDescription> evaluatedDescriptions = new TreeSet<EvaluatedDescription>();
+ private Set<EvaluatedQueryTree<String>> evaluate2(QueryTree<String> tree, boolean useSpecifity){
+ Set<EvaluatedQueryTree<String>> evaluatedTrees = new TreeSet<EvaluatedQueryTree<String>>();
- LiteralNodeConversionStrategy[] strategies = LiteralNodeConversionStrategy.values();
- strategies = new LiteralNodeConversionStrategy[]{LiteralNodeConversionStrategy.SOME_VALUES_FROM, LiteralNodeConversionStrategy.FACET_RESTRICTION};
+ //test different strategies on the conversion of literal nodes
+ Set<OWLClassExpression> combinations = new HashSet<OWLClassExpression>();
+
for (LiteralNodeConversionStrategy strategy : strategies) {
- Description d = DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(tree.asOWLClassExpression(strategy));
+ OWLClassExpression ce = tree.asOWLClassExpression(strategy);
+ combinations.add(ce);
+ }
+ //compute all combinations of different types of facets
+// OWLClassExpression ce = tree.asOWLClassExpression(LiteralNodeConversionStrategy.FACET_RESTRICTION);
+// combinations = ce.accept(new ClassExpressionLiteralCombination());
+ for (OWLClassExpression c : combinations) {
+ Description d = DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(c);
//convert to individuals
SortedSet<Individual> coveredExamples = reasoner.getIndividuals(d);
Set<Individual> coveredPosExamples = new TreeSet<Individual>(Sets.intersection(currentPosExamples, coveredExamples));
Set<Individual> uncoveredPosExamples = new TreeSet<Individual>(Sets.difference(currentPosExamples, coveredExamples));
Set<Individual> coveredNegExamples = new TreeSet<Individual>(Sets.intersection(currentNegExamples, coveredExamples));
+ Set<Individual> uncoveredNegExamples = new TreeSet<Individual>(Sets.difference(currentNegExamples, coveredExamples));
//compute score
double recall = coveredPosExamples.size() / (double)currentPosExamples.size();
@@ -501,7 +534,7 @@
double coverageScore = Heuristics.getFScore(recall, precision, beta);
- //2. get a score for the specifity of the query, i.e. how many edges/nodes = precision oriented
+ //2. get a score for the specificity of the query, i.e. how many edges/nodes = precision oriented
int nrOfSpecificNodes = 0;
for (QueryTree<String> childNode : tree.getChildrenClosure()) {
if(!childNode.getUserObject().equals("?")){
@@ -516,33 +549,38 @@
//3.compute the total score
double score = coverageWeight * coverageScore + specifityWeight * specifityScore;
- QueryTreeScore queryTreeScore = new QueryTreeScore(score, coverageScore,
- new TreeSet<Individual>(Sets.difference(currentPosExamples, uncoveredPosExamples)), uncoveredPosExamples,
- coveredNegExamples, new TreeSet<Individual>(Sets.difference(currentNegExamples, coveredNegExamples)),
+ QueryTreeScore queryTreeScore = new QueryTreeScore(
+ score, coverageScore,
+ coveredPosExamples, uncoveredPosExamples,
+ coveredNegExamples, uncoveredNegExamples,
specifityScore, nrOfSpecificNodes);
//TODO use only the heuristic to compute the score
-// score = heuristic.getScore(evaluatedTree);
-// queryTreeScore.setScore(score);
-// queryTreeScore.setAccuracy(score);
-//
-// EvaluatedDescription evaluatedDescription = new EvaluatedDescription(d, queryTreeScore);
-//
-// evaluatedDescriptions.add(evaluatedDescription);
+ EvaluatedQueryTree<String> evaluatedTree = new EvaluatedQueryTree<String>(tree,
+ asQueryTrees(uncoveredPosExamples), asQueryTrees(coveredNegExamples), queryTreeScore);
+ score = heuristic.getScore(evaluatedTree);
+ queryTreeScore.setScore(score);
+ queryTreeScore.setAccuracy(score);
+
+
+ EvaluatedDescription evaluatedDescription = new EvaluatedDescription(d, queryTreeScore);
+
+ evaluatedTree.setDescription(evaluatedDescription);
+
+ evaluatedTrees.add(evaluatedTree);
}
-
- return evaluatedDescriptions;
+ return evaluatedTrees;
}
private EvaluatedDescription buildCombinedSolution(){
EvaluatedDescription bestCombinedSolution = null;
double bestScore = Double.NEGATIVE_INFINITY;
LiteralNodeConversionStrategy[] strategies = LiteralNodeConversionStrategy.values();
- strategies = new LiteralNodeConversionStrategy[]{LiteralNodeConversionStrategy.SOME_VALUES_FROM};
+ strategies = new LiteralNodeConversionStrategy[]{LiteralNodeConversionStrategy.DATATYPE};
for (LiteralNodeConversionStrategy strategy : strategies) {
EvaluatedDescription combinedSolution;
if(partialSolutions.size() == 1){
- combinedSolution = partialSolutions.get(0).asEvaluatedDescription(strategy);
+ combinedSolution = partialSolutions.get(0).getEvaluatedDescription();
} else {
List<Description> disjuncts = new ArrayList<Description>();
@@ -552,8 +590,7 @@
//build the union of all class expressions
Description partialDescription;
for (EvaluatedQueryTree<String> partialSolution : partialSolutions) {
- partialDescription = DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(
- partialSolution.getTree().asOWLClassExpression(strategy));
+ partialDescription = partialSolution.getEvaluatedDescription().getDescription();
disjuncts.add(partialDescription);
posCovered.addAll(partialSolution.getTreeScore().getCoveredPositives());
negCovered.addAll(partialSolution.getTreeScore().getCoveredNegatives());
@@ -679,11 +716,12 @@
return individuals;
}
- private void asTree(Description d){
- QueryTree<String> tree = new QueryTreeImpl<String>("");
- for (Description child : d.getChildren()) {
-
+ private Set<QueryTree<String>> asQueryTrees(Collection<Individual> individuals){
+ Set<QueryTree<String>> trees = new HashSet<QueryTree<String>>(individuals.size());
+ for (Individual ind : individuals) {
+ trees.add(individual2Tree.get(ind));
}
+ return trees;
}
/**
@@ -802,16 +840,23 @@
private void todo(EvaluatedQueryTree<String> solution){
//check if not already contained in todo list
for (EvaluatedQueryTree<String> evTree : todoList) {
- if(sameTrees(solution.getTree(), evTree.getTree())){
+ //this is a workaround as we have currently no equals method for trees based on the literal conversion strategy
+// boolean sameTree = sameTrees(solution.getTree(), evTree.getTree());
+ boolean sameTree = OWLAPIConverter.getOWLAPIDescription(evTree.getEvaluatedDescription().getDescription()).toString()
+ .equals(OWLAPIConverter.getOWLAPIDescription(solution.getEvaluatedDescription().getDescription()).toString());
+ if(sameTree){
+ logger.warn("Not added to TODO list: Already contained in.");
return;
}
}
//check if not already contained in solutions
for (EvaluatedQueryTree<String> evTree : currentPartialSolutions) {
if(sameTrees(solution.getTree(), evTree.getTree())){
+ logger.warn("Not added to partial solutions list: Already contained in.");
return;
}
}
+ logger.info("Added to TODO list.");
todoList.add(solution);
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2DisjunctiveMT.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2DisjunctiveMT.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL2DisjunctiveMT.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -240,7 +240,7 @@
public EvaluatedDescription getCurrentlyBestEvaluatedDescription() {
EvaluatedQueryTree<String> bestSolution = solutions.first();
Description description = DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(
- bestSolution.getTree().asOWLClassExpression(LiteralNodeConversionStrategy.FACET_RESTRICTION));
+ bestSolution.getTree().asOWLClassExpression(LiteralNodeConversionStrategy.MIN_MAX));
return new EvaluatedDescription(description, bestSolution.getTreeScore());
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -118,11 +118,11 @@
/**
* Literals as an interval on the datatype, e.g. [>= 5 <=10]
*/
- FACET_RESTRICTION,
+ MIN_MAX,
/**
* Literals as datatype, e.g. xsd:integer
*/
- SOME_VALUES_FROM,
+ DATATYPE,
MIN,
@@ -207,7 +207,7 @@
if(nodeType == NodeType.RESOURCE){
isResourceNode = true;
} else if(nodeType == NodeType.LITERAL){
- isResourceNode = true;
+ isLiteralNode = true;
}
}
@@ -1405,7 +1405,7 @@
* are transformed into existential restrictions.
*/
public OWLClassExpression asOWLClassExpression(){
- return asOWLClassExpression(LiteralNodeConversionStrategy.SOME_VALUES_FROM);
+ return asOWLClassExpression(LiteralNodeConversionStrategy.DATATYPE);
}
/**
@@ -1430,7 +1430,7 @@
for(QueryTree<N> child : children){
String childLabel = (String) child.getUserObject();
String predicateString = (String) tree.getEdge(child);
- if(predicateString.equals(RDF.type.getURI())){
+ if(predicateString.equals(RDF.type.getURI()) || predicateString.equals(RDFS.subClassOf.getURI())){//A
if(child.isVarNode()){
classExpressions.addAll(buildOWLClassExpressions(df, child, literalNodeConversionStrategy));
} else {
@@ -1438,25 +1438,17 @@
classExpressions.add(df.getOWLClass(IRI.create(childLabel)));
}
}
- } else if(predicateString.equals(RDFS.subClassOf.getURI())){
- if(child.isVarNode()){
- classExpressions.addAll(buildOWLClassExpressions(df, child, literalNodeConversionStrategy));
- } else {
- if(!childLabel.equals(OWL.Thing.getURI())){//avoid trivial owl:Thing statements
- classExpressions.add(df.getOWLClass(IRI.create(childLabel)));
- }
- }
} else {
if(child.isLiteralNode()){
OWLDataProperty p = df.getOWLDataProperty(IRI.create((String) tree.getEdge(child)));
- if(childLabel.equals("?")){
+ if(childLabel.equals("?")){//p some int
Set<Literal> literals = child.getLiterals();
OWLDataRange dataRange = null;
if(literals.isEmpty()){//happens if there are heterogeneous datatypes
String datatypeURI = OWL2Datatype.RDFS_LITERAL.getURI().toString();
dataRange = df.getOWLDatatype(IRI.create(datatypeURI));
} else {
- if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.SOME_VALUES_FROM){
+ if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.DATATYPE){
Literal lit = literals.iterator().next();
RDFDatatype datatype = lit.getDatatype();
String datatypeURI;
@@ -1468,7 +1460,7 @@
dataRange = df.getOWLDatatype(IRI.create(datatypeURI));
} else if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.DATA_ONE_OF){
dataRange = asDataOneOf(df, literals);
- } else if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.FACET_RESTRICTION){
+ } else if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.MIN_MAX){
dataRange = asFacet(df, literals);
} else if(literalNodeConversionStrategy == LiteralNodeConversionStrategy.MIN){
dataRange = asMinFacet(df, literals);
@@ -1477,7 +1469,7 @@
}
}
classExpressions.add(df.getOWLDataSomeValuesFrom(p, dataRange));
- } else {
+ } else {//p value 1.2
Set<Literal> literals = child.getLiterals();
Literal lit = literals.iterator().next();
OWLLiteral owlLiteral = asOWLLiteral(df, lit);
@@ -1486,7 +1478,7 @@
} else {
OWLObjectProperty p = df.getOWLObjectProperty(IRI.create((String) tree.getEdge(child)));
OWLClassExpression filler;
- if(child.isVarNode()){
+ if(child.isVarNode()){//p some C
Set<OWLClassExpression> fillerClassExpressions = buildOWLClassExpressions(df, child, literalNodeConversionStrategy);
if(fillerClassExpressions.isEmpty()){
filler = df.getOWLThing();
@@ -1496,7 +1488,7 @@
filler = df.getOWLObjectIntersectionOf(fillerClassExpressions);
}
classExpressions.add(df.getOWLObjectSomeValuesFrom(p, filler));
- } else {
+ } else {//p value {a}
classExpressions.add(df.getOWLObjectHasValue(p, df.getOWLNamedIndividual(IRI.create(childLabel))));
}
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -5,6 +5,7 @@
import org.dllearner.algorithms.qtl.datastructures.QueryTree;
import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl.LiteralNodeConversionStrategy;
import org.dllearner.core.EvaluatedDescription;
+import org.dllearner.core.owl.Description;
import org.dllearner.learningproblems.QueryTreeScore;
import org.dllearner.utilities.owl.DLLearnerDescriptionConvertVisitor;
@@ -18,6 +19,8 @@
private Collection<QueryTree<N>> falsePositives;
private QueryTreeScore score;
// private ScoreTwoValued score;
+
+ private EvaluatedDescription description;
public EvaluatedQueryTree(QueryTree<N> tree, Collection<QueryTree<N>> falseNegatives,
Collection<QueryTree<N>> falsePositives, QueryTreeScore score) {
@@ -61,7 +64,8 @@
@Override
public int compareTo(EvaluatedQueryTree<N> other) {
return ComparisonChain.start()
- .compare(this.getScore(), other.getScore())
+// .compare(this.getScore(), other.getScore())
+ .compare(other.getScore(), this.getScore())
.result();
// double diff = getScore() - other.getScore();
// if(diff == 0){
@@ -73,9 +77,26 @@
// }
}
+
+ /**
+ * @return the description
+ */
+ public EvaluatedDescription getEvaluatedDescription() {
+ return asEvaluatedDescription();
+ }
+ /**
+ * @param description the description to set
+ */
+ public void setDescription(EvaluatedDescription description) {
+ this.description = description;
+ }
+
public EvaluatedDescription asEvaluatedDescription(){
- return new EvaluatedDescription(DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(
- getTree().asOWLClassExpression(LiteralNodeConversionStrategy.FACET_RESTRICTION)), score);
+ if(description == null){
+ description = new EvaluatedDescription(DLLearnerDescriptionConvertVisitor.getDLLearnerDescription(
+ getTree().asOWLClassExpression(LiteralNodeConversionStrategy.MIN_MAX)), score);
+ }
+ return description;
}
public EvaluatedDescription asEvaluatedDescription(LiteralNodeConversionStrategy strategy){
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/util/QueryTreeConverter.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/util/QueryTreeConverter.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/util/QueryTreeConverter.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -4,10 +4,17 @@
package org.dllearner.algorithms.qtl.util;
import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import java.util.Stack;
+import javax.xml.bind.DatatypeConverter;
+
import org.dllearner.algorithms.qtl.datastructures.QueryTree;
import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl;
+import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl.LiteralNodeConversionStrategy;
import org.dllearner.algorithms.qtl.datastructures.impl.QueryTreeImpl.NodeType;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.ToStringRenderer;
@@ -24,11 +31,15 @@
import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
import org.semanticweb.owlapi.model.OWLDataMinCardinality;
import org.semanticweb.owlapi.model.OWLDataOneOf;
+import org.semanticweb.owlapi.model.OWLDataProperty;
+import org.semanticweb.owlapi.model.OWLDataRange;
import org.semanticweb.owlapi.model.OWLDataRangeVisitor;
import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLDataUnionOf;
import org.semanticweb.owlapi.model.OWLDatatype;
import org.semanticweb.owlapi.model.OWLDatatypeRestriction;
+import org.semanticweb.owlapi.model.OWLFacetRestriction;
+import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectComplementOf;
import org.semanticweb.owlapi.model.OWLObjectExactCardinality;
@@ -38,20 +49,24 @@
import org.semanticweb.owlapi.model.OWLObjectMaxCardinality;
import org.semanticweb.owlapi.model.OWLObjectMinCardinality;
import org.semanticweb.owlapi.model.OWLObjectOneOf;
+import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
-import org.semanticweb.owlapi.model.OWLOntology;
-import org.semanticweb.owlapi.model.OWLOntologyChange;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.PrefixManager;
-import org.semanticweb.owlapi.reasoner.OWLReasoner;
-import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.semanticweb.owlapi.util.DefaultPrefixManager;
+import org.semanticweb.owlapi.vocab.OWL2Datatype;
+import org.semanticweb.owlapi.vocab.OWLFacet;
+import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl;
import uk.ac.manchester.cs.owlapi.dlsyntax.DLSyntaxObjectRenderer;
-import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;
+import com.hp.hpl.jena.datatypes.RDFDatatype;
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.RDF;
+import com.hp.hpl.jena.vocabulary.RDFS;
/**
* Converts query trees into OWL class expressions and vice versa.
@@ -60,6 +75,8 @@
*/
public class QueryTreeConverter implements OWLClassExpressionVisitor, OWLDataRangeVisitor{
+ OWLDataFactory df = new OWLDataFactoryImpl();
+
Stack<QueryTree<String>> stack = new Stack<QueryTree<String>>();
int id = 0;
@@ -67,12 +84,213 @@
* Returns a OWL class expression of the union of the given query trees.
* @param queryTrees
*/
- public void asOWLClassExpression(Collection<QueryTree<String>> queryTrees){
-
- //check for common paths
-
+ public OWLClassExpression asOWLClassExpression(QueryTree<String> tree){
+ Set<OWLClassExpression> classExpressions = asOWLClassExpressions(tree);
+ OWLClassExpression expression;
+ if(classExpressions.isEmpty()){
+ expression = df.getOWLThing();
+ } else if(classExpressions.size() == 1){
+ expression = classExpressions.iterator().next();
+ } else {
+ expression = df.getOWLObjectIntersectionOf(classExpressions);
+ }
+ return expression;
}
+ /**
+ * Returns a OWL class expression representation of the given query tree.
+ * @param queryTrees
+ */
+ public Set<OWLClassExpression> asOWLClassExpressions(QueryTree<String> tree){
+ Set<OWLClassExpression> classExpressions = new HashSet<OWLClassExpression>();
+
+ List<QueryTree<String>> children = tree.getChildren();
+ for(QueryTree<String> child : children){
+ String childLabel = (String) child.getUserObject();
+ String predicateString = (String) tree.getEdge(child);
+ if(predicateString.equals(RDF.type.getURI()) || predicateString.equals(RDFS.subClassOf.getURI())){//A
+ if(child.isVarNode()){
+ classExpressions.addAll(asOWLClassExpressions(child));
+ } else {
+ if(!childLabel.equals(OWL.Thing.getURI())){//avoid trivial owl:Thing statements
+ classExpressions.add(df.getOWLClass(IRI.create(childLabel)));
+ }
+ }
+ } else {
+ if(child.isLiteralNode()){
+ OWLDataProperty p = df.getOWLDataProperty(IRI.create((String) tree.getEdge(child)));
+ if(childLabel.equals("?")){//p some int
+ Set<Literal> literals = child.getLiterals();
+ OWLDataRange dataRange = null;
+ if(literals.isEmpty()){//happens if there are heterogeneous datatypes
+ String datatypeURI = OWL2Datatype.RDFS_LITERAL.getURI().toString();
+ dataRange = df.getOWLDatatype(IRI.create(datatypeURI));
+ } else {
+ for (LiteralNodeConversionStrategy strategy : LiteralNodeConversionStrategy.values()) {
+ if(strategy == LiteralNodeConversionStrategy.DATATYPE){
+ Literal lit = literals.iterator().next();
+ RDFDatatype datatype = lit.getDatatype();
+ String datatypeURI;
+ if(datatype == null){
+ datatypeURI = OWL2Datatype.RDF_PLAIN_LITERAL.getURI().toString();
+ } else {
+ datatypeURI = datatype.getURI();
+ }
+ dataRange = df.getOWLDatatype(IRI.create(datatypeURI));
+ } else if(strategy == LiteralNodeConversionStrategy.DATA_ONE_OF){
+ dataRange = asDataOneOf(df, literals);
+ } else if(strategy == LiteralNodeConversionStrategy.MIN_MAX){
+ dataRange = asFacet(df, literals);
+ } else if(strategy == LiteralNodeConversionStrategy.MIN){
+ dataRange = asMinFacet(df, literals);
+ } else if(strategy == LiteralNodeConversionStrategy.MAX){
+ dataRange = asMaxFacet(df, literals);
+ }
+ }
+ }
+ classExpressions.add(df.getOWLDataSomeValuesFrom(p, dataRange));
+ } else {//p value 1.2
+ Set<Literal> literals = child.getLiterals();
+ Literal lit = literals.iterator().next();
+ OWLLiteral owlLiteral = asOWLLiteral(df, lit);
+ classExpressions.add(df.getOWLDataHasValue(p, owlLiteral));
+ }
+ } else {
+ OWLObjectProperty p = df.getOWLObjectProperty(IRI.create((String) tree.getEdge(child)));
+ OWLClassExpression filler;
+ if(child.isVarNode()){//p some C
+ Set<OWLClassExpression> fillerClassExpressions = asOWLClassExpressions(child);
+ if(fillerClassExpressions.isEmpty()){
+ filler = df.getOWLThing();
+ } else if(fillerClassExpressions.size() == 1){
+ filler = fillerClassExpressions.iterator().next();
+ } else {
+ filler = df.getOWLObjectIntersectionOf(fillerClassExpressions);
+ }
+ classExpressions.add(df.getOWLObjectSomeValuesFrom(p, filler));
+ } else {//p value {a}
+ classExpressions.add(df.getOWLObjectHasValue(p, df.getOWLNamedIndividual(IRI.create(childLabel))));
+ }
+ }
+ }
+ }
+ return classExpressions;
+ }
+
+ private OWLDataRange asFacet(OWLDataFactory df, Set<Literal> literals){
+ //return Boolean datatype because it doesn't make sense to return a facet of Boolean values
+ if(getOWLDatatype(df, literals).equals(df.getBooleanOWLDatatype())){
+ return df.getBooleanOWLDatatype();
+ }
+ Literal min = getMin(literals);
+ Literal max = getMax(literals);
+
+ OWLFacetRestriction minRestriction = df.getOWLFacetRestriction(OWLFacet.MIN_INCLUSIVE, asOWLLiteral(df, min));
+ OWLFacetRestriction maxRestriction = df.getOWLFacetRestriction(OWLFacet.MAX_INCLUSIVE, asOWLLiteral(df, max));
+
+ return df.getOWLDatatypeRestriction(getOWLDatatype(df, literals), minRestriction, maxRestriction);
+ }
+
+ private OWLDataRange asMinFacet(OWLDataFactory df, Set<Literal> literals){
+ //return Boolean datatype because it doesn't make sense to return a facet of Boolean values
+ if(getOWLDatatype(df, literals).equals(df.getBooleanOWLDatatype())){
+ return df.getBooleanOWLDatatype();
+ }
+ Literal min = getMin(literals);
+
+ OWLFacetRestriction minRestriction = df.getOWLFacetRestriction(OWLFacet.MIN_INCLUSIVE, asOWLLiteral(df, min));
+
+ return df.getOWLDatatypeRestriction(getOWLDatatype(df, literals), minRestriction);
+ }
+
+ private OWLDataRange asMaxFacet(OWLDataFactory df, Set<Literal> literals){
+ //return Boolean datatype because it doesn't make sense to return a facet of Boolean values
+ if(getOWLDatatype(df, literals).equals(df.getBooleanOWLDatatype())){
+ return df.getBooleanOWLDatatype();
+ }
+ Literal max = getMax(literals);
+
+ OWLFacetRestriction maxRestriction = df.getOWLFacetRestriction(OWLFacet.MAX_INCLUSIVE, asOWLLiteral(df, max));
+
+ return df.getOWLDatatypeRestriction(getOWLDatatype(df, literals), maxRestriction);
+ }
+
+ private OWLDataRange asDataOneOf(OWLDataFactory df, Set<Literal> literals){
+ //return Boolean datatype because it doesn't make sense to return a enumeration of Boolean values
+ if(getOWLDatatype(df, literals).equals(df.getBooleanOWLDatatype())){
+ return df.getBooleanOWLDatatype();
+ }
+ return df.getOWLDataOneOf(asOWLLiterals(df, literals));
+ }
+
+ private Set<OWLLiteral> asOWLLiterals(OWLDataFactory df, Set<Literal> literals){
+ Set<OWLLiteral> owlLiterals = new HashSet<OWLLiteral>(literals.size());
+ for (Literal literal : literals) {
+ owlLiterals.add(asOWLLiteral(df, literal));
+ }
+ return owlLiterals;
+ }
+
+ private OWLLiteral asOWLLiteral(OWLDataFactory df, Literal literal){
+ OWLLiteral owlLiteral;
+ if(literal.getDatatypeURI() == null){
+ owlLiteral = df.getOWLLiteral(literal.getLexicalForm(), literal.getLanguage());
+ } else {
+ owlLiteral = df.getOWLLiteral(literal.getLexicalForm(), df.getOWLDatatype(IRI.create(literal.getDatatypeURI())));
+ }
+ return owlLiteral;
+ }
+
+ private Literal getMin(Set<Literal> literals){
+ Iterator<Literal> iter = literals.iterator();
+ Literal min = iter.next();
+ Literal l;
+ while(iter.hasNext()){
+ l = iter.next();
+ if(l.getDatatype() == XSDDatatype.XSDinteger || l.getDatatype() == XSDDatatype.XSDint){
+ min = (l.getInt() < min.getInt()) ? l : min;
+ } else if(l.getDatatype() == XSDDatatype.XSDdouble || l.getDatatype() == XSDDatatype.XSDdecimal){
+ min = (l.getDouble() < min.getDouble()) ? l : min;
+ } else if(l.getDatatype() == XSDDatatype.XSDfloat){
+ min = (l.getFloat() < min.getFloat()) ? l : min;
+ } else if(l.getDatatype() == XSDDatatype.XSDdate){
+ min = (DatatypeConverter.parseDate(l.getLexicalForm()).compareTo(DatatypeConverter.parseDate(min.getLexicalForm())) == -1) ? l : min;
+ }
+ }
+ return min;
+ }
+
+ private Literal getMax(Set<Literal> literals){
+ Iterator<Literal> iter = literals.iterator();
+ Literal max = iter.next();
+ Literal l;
+ while(iter.hasNext()){
+ l = iter.next();
+ if(l.getDatatype() == XSDDatatype.XSDinteger || l.getDatatype() == XSDDatatype.XSDint){
+ max = (l.getInt() > max.getInt()) ? l : max;
+ } else if(l.getDatatype() == XSDDatatype.XSDdouble || l.getDatatype() == XSDDatatype.XSDdecimal){
+ max = (l.getDouble() > max.getDouble()) ? l : max;
+ } else if(l.getDatatype() == XSDDatatype.XSDfloat){
+ max = (l.getFloat() > max.getFloat()) ? l : max;
+ } else if(l.getDatatype() == XSDDatatype.XSDdate){
+ max = (DatatypeConverter.parseDate(l.getLexicalForm()).compareTo(DatatypeConverter.parseDate(max.getLexicalForm())) == 1) ? l : max;
+ }
+ }
+ return max;
+ }
+
+ private OWLDatatype getOWLDatatype(OWLDataFactory df, Set<Literal> literals){
+ return df.getOWLDatatype(IRI.create(literals.iterator().next().getDatatypeURI()));
+ }
+
+
+ /**
+ * Converts a OWL class expression into a query tree, if possible. Note that this is not possible
+ * for all OWL constructs, e.g. universal restrictions are not allowed. An exceptions is thrown if the conversion
+ * fails.
+ * @param expression
+ * @return
+ */
public QueryTree<String> asQueryTree(OWLClassExpression expression){
// stack.push(new QueryTreeImpl<String>("?"));
reset();
Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractCELA.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/AbstractCELA.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/AbstractCELA.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -52,7 +52,7 @@
* @author Jens Lehmann
*
*/
-public abstract class AbstractCELA extends AbstractComponent implements ClassExpressionLearningAlgorithm, StoppableLearningAlgorithm, Cloneable {
+public abstract class AbstractCELA extends AbstractComponent implements ClassExpressionLearningAlgorithm, StoppableLearningAlgorithm {
protected EvaluatedDescriptionSet bestEvaluatedDescriptions = new EvaluatedDescriptionSet(AbstractCELA.MAX_NR_OF_RESULTS);
protected DecimalFormat dfPercent = new DecimalFormat("0.00%");
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/Constant.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/Constant.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/Constant.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -19,17 +19,16 @@
package org.dllearner.core.owl;
+import java.io.Serializable;
+
/**
* A constant value.
*
* @author Jens Lehmann
*
*/
-public abstract class Constant implements KBElement, Comparable<Constant> {
+public abstract class Constant implements KBElement, Comparable<Constant>, Serializable {
- /**
- *
- */
private static final long serialVersionUID = 2331790456049452753L;
String literal;
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/DatatypeProperty.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/DatatypeProperty.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/DatatypeProperty.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -31,9 +31,6 @@
*/
public class DatatypeProperty implements Comparable<DatatypeProperty>, Property, NamedKBElement, Serializable {
- /**
- *
- */
private static final long serialVersionUID = 8452865438915671952L;
protected String name;
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMaxValue.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMaxValue.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMaxValue.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -58,11 +58,11 @@
* @see org.dllearner.core.owl.KBElement#toString(java.lang.String, java.util.Map)
*/
public String toString(String baseURI, Map<String, String> prefixes) {
- return " double[<= " + value + "]";
+ return "double[<= " + value + "]";
}
public String toKBSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[<= " + value + "]";
+ return "double[<= " + value + "]";
}
public void accept(KBElementVisitor visitor) {
@@ -74,7 +74,7 @@
*/
@Override
public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[<= " + value + "]";
+ return "double[<= " + value + "]";
}
/* (non-Javadoc)
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinMaxRange.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinMaxRange.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinMaxRange.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -65,11 +65,11 @@
* @see org.dllearner.core.owl.KBElement#toString(java.lang.String, java.util.Map)
*/
public String toString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + minValue + " <= " + maxValue + "]";
+ return "double[>= " + minValue + ", <= " + maxValue + "]";
}
public String toKBSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + minValue + " <= " + maxValue + "]";
+ return "double[>= " + minValue + ", <= " + maxValue + "]";
}
public void accept(KBElementVisitor visitor) {
@@ -81,7 +81,7 @@
*/
@Override
public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + minValue + " <= " + maxValue + "]";
+ return "double[>= " + minValue + ", <= " + maxValue + "]";
}
/* (non-Javadoc)
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinValue.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinValue.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/DoubleMinValue.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -58,11 +58,11 @@
* @see org.dllearner.core.owl.KBElement#toString(java.lang.String, java.util.Map)
*/
public String toString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + value + "]";
+ return "double[>= " + value + "]";
}
public String toKBSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + value + "]";
+ return "double[>= " + value + "]";
}
public void accept(KBElementVisitor visitor) {
@@ -74,7 +74,7 @@
*/
@Override
public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) {
- return " double[>= " + value + "]";
+ return "double[>= " + value + "]";
}
/* (non-Javadoc)
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectProperty.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectProperty.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectProperty.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -19,6 +19,7 @@
package org.dllearner.core.owl;
+import java.io.Serializable;
import java.net.URI;
import java.util.Map;
@@ -31,7 +32,7 @@
* @author Jens Lehmann
*
*/
-public class ObjectProperty extends ObjectPropertyExpression implements Property, Comparable<ObjectProperty>{
+public class ObjectProperty extends ObjectPropertyExpression implements Property, Comparable<ObjectProperty>, Serializable{
private static final long serialVersionUID = -3343070247923446690L;
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -29,9 +29,6 @@
*/
public class TypedConstant extends Constant {
- /**
- *
- */
private static final long serialVersionUID = -9135242138291085300L;
private Datatype datatype;
Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/ExistentialRestrictionMaterialization.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/reasoning/ExistentialRestrictionMaterialization.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/reasoning/ExistentialRestrictionMaterialization.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -6,6 +6,7 @@
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
@@ -81,27 +82,55 @@
private Map<OWLClass, Set<OWLClassExpression>> map = new HashMap<>();
Stack<Set<OWLClassExpression>> stack = new Stack<Set<OWLClassExpression>>();
OWLDataFactory df;
+ boolean onlyIfExistentialOnPath = true;
+
+ int indent = 0;
public SuperClassFinder() {
df = ontology.getOWLOntologyManager().getOWLDataFactory();
}
public Set<OWLClassExpression> getSuperClasses(OWLClass cls){
+// System.out.println("#################");
map.clear();
computeSuperClasses(cls);
Set<OWLClassExpression> superClasses = map.get(cls);
superClasses.remove(cls);
+
+ //filter out non existential superclasses
+ if(onlyIfExistentialOnPath){
+ for (Iterator<OWLClassExpression> iterator = superClasses.iterator(); iterator.hasNext();) {
+ OWLClassExpression sup = iterator.next();
+ if (!(sup instanceof OWLObjectSomeValuesFrom || sup instanceof OWLDataAllValuesFrom)) {
+ iterator.remove();
+ }
+ }
+ }
return superClasses;
}
private void computeSuperClasses(OWLClass cls){
+ String s = "";
+ for(int i = 0; i < indent; i++){
+ s += " ";
+ }
+// System.out.println(s + cls);
+ indent++;
Set<OWLClassExpression> superClasses = new HashSet<OWLClassExpression>();
superClasses.add(cls);
+
+ //get the directly asserted super classes
Set<OWLClassExpression> superClassExpressions = cls.getSuperClasses(ontology);
+
+ //omit trivial super class
+ superClassExpressions.remove(cls);
+
+ //go subsumption hierarchy up for each directly asserted super class
for (OWLClassExpression sup : superClassExpressions) {
sup.accept(this);
superClasses.addAll(stack.pop());
}
+
stack.push(superClasses);
map.put(cls, superClasses);
}
Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/FastInstanceChecker.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/reasoning/FastInstanceChecker.java 2014-07-02 06:31:52 UTC (rev 4279)
+++ trunk/components-core/src/main/java/org/dllearner/reasoning/FastInstanceChecker.java 2014-07-29 13:53:19 UTC (rev 4280)
@@ -59,6 +59,7 @@
import ...
[truncated message content] |