From: <lor...@us...> - 2011-12-28 11:00:57
|
Revision: 3515 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3515&view=rev Author: lorenz_b Date: 2011-12-28 11:00:47 +0000 (Wed, 28 Dec 2011) Log Message: ----------- Made more usage of JENA reasoning capabilities. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2011-12-27 10:36:53 UTC (rev 3514) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2011-12-28 11:00:47 UTC (rev 3515) @@ -183,7 +183,7 @@ QuerySolution qs; while(rs.hasNext()){ qs = rs.next();System.out.println(qs); - if(qs.getResource("type") != null){ + if(qs.getResource("type") != null && !qs.getResource("type").isAnon()){ cls = new NamedClass(qs.getResource("type").getURI()); int newCnt = qs.getLiteral("count").getInt(); oldCnt = result.get(cls); @@ -301,35 +301,35 @@ //Remove temporarily classToDescribe but keep track of their count // Integer all = class2Count.get(classToDescribe); class2Count.remove(classToDescribe); - + + //get complete disjoint classes Set<NamedClass> completeDisjointclasses = new TreeSet<NamedClass>(allClasses); - completeDisjointclasses.removeAll(class2Count.keySet()); + completeDisjointclasses.removeAll(class2Count.keySet());System.out.println(completeDisjointclasses); + // we remove the asserted subclasses here + completeDisjointclasses.removeAll(subClasses); + for (Description subClass : subClasses) { + class2Count.remove(subClass); + } + //drop all classes which have a super class in this set - if(suggestMostGeneralClasses && reasoner.isPrepared()){ + if(suggestMostGeneralClasses){ keepMostGeneralClasses(completeDisjointclasses); } - //we remove the asserted subclasses here - completeDisjointclasses.removeAll(subClasses); - for(Description subClass : subClasses){ - class2Count.remove(subClass); - } + EvaluatedDescription evalDesc; //firstly, create disjoint classexpressions which not occur and give score of 1 - if(reasoner.isPrepared()){ - SortedSet<Description> mostGeneralClasses = reasoner.getClassHierarchy().getMostGeneralClasses(); - } for(NamedClass cls : completeDisjointclasses){ if(useClassPopularity){ int popularity = 0; if(ks.isRemote()){ popularity = reasoner.getIndividualsCount(cls); } else { - popularity = ((LocalModelBasedSparqlEndpointKS)ks).getModel().getOntClass(cls.getName()).listInstances(true).toSet().size(); + popularity = ((LocalModelBasedSparqlEndpointKS)ks).getModel().getOntClass(cls.getName()).listInstances().toSet().size(); } //we skip classes with no instances if(popularity == 0) continue; @@ -362,9 +362,33 @@ private void keepMostGeneralClasses(Set<NamedClass> classes){ - ClassHierarchy h = reasoner.getClassHierarchy(); - for(NamedClass nc : new HashSet<NamedClass>(classes)){ - classes.removeAll(h.getSubClasses(nc)); + if(ks.isRemote()){ + if(reasoner.isPrepared()){ + ClassHierarchy h = reasoner.getClassHierarchy(); + for(NamedClass nc : new HashSet<NamedClass>(classes)){ + classes.removeAll(h.getSubClasses(nc)); + } + } + } else { + OntModel model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); + +// Set<NamedClass> topClasses = new HashSet<NamedClass>(); +// for(OntClass cls : model.listNamedClasses().toSet()){ +// Set<OntClass> superClasses = cls.listSuperClasses().toSet(); +// if(superClasses.isEmpty() || +// (superClasses.size() == 1 && superClasses.contains(model.getOntClass(com.hp.hpl.jena.vocabulary.OWL.Thing.getURI())))){ +// topClasses.add(new NamedClass(cls.getURI())); +// } +// +// } +// classes.retainAll(topClasses); + for(NamedClass nc : new HashSet<NamedClass>(classes)){//System.out.print(nc + "::"); + for(OntClass cls : model.getOntClass(nc.getName()).listSubClasses().toSet()){//System.out.print(cls + "|"); + classes.remove(new NamedClass(cls.getURI())); + } +// System.out.println(); + } + } } @@ -378,7 +402,7 @@ // System.out.println(l.getReasoner().getClassHierarchy().getSubClasses(new NamedClass("http://dbpedia.org/ontology/Athlete"), false));System.exit(0); l.start(); - for(EvaluatedAxiom e : l.getCurrentlyBestEvaluatedAxioms(Integer.MAX_VALUE, 0.2)){ + for(EvaluatedAxiom e : l.getCurrentlyBestEvaluatedAxioms(Integer.MAX_VALUE, 0.0)){ System.out.println(e); } Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2011-12-27 10:36:53 UTC (rev 3514) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2011-12-28 11:00:47 UTC (rev 3515) @@ -46,6 +46,8 @@ import org.dllearner.reasoning.SPARQLReasoner; import org.dllearner.utilities.owl.AxiomComparator; import org.openrdf.model.vocabulary.OWL; +import org.openrdf.model.vocabulary.RDF; +import org.openrdf.model.vocabulary.RDFS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -195,7 +197,7 @@ return new SPARQLTasks(((SparqlEndpointKS) ks).getEndpoint()).getAllClasses(); } else { Set<NamedClass> classes = new TreeSet<NamedClass>(); - for(OntClass cls : ((LocalModelBasedSparqlEndpointKS)ks).getModel().listClasses().filterDrop(new OWLFilter()).toList()){ + for(OntClass cls : ((LocalModelBasedSparqlEndpointKS)ks).getModel().listClasses().filterDrop(new OWLFilter()).filterDrop(new RDFSFilter()).filterDrop(new RDFFilter()).toList()){ if(!cls.isAnon()){ classes.add(new NamedClass(cls.getURI())); } @@ -331,5 +333,29 @@ } + class RDFSFilter extends Filter<OntClass>{ + @Override + public boolean accept(OntClass cls) { + if(!cls.isAnon()){ + return cls.getURI().startsWith(RDFS.NAMESPACE); + } + return false; + } + + } + + class RDFFilter extends Filter<OntClass>{ + + @Override + public boolean accept(OntClass cls) { + if(!cls.isAnon()){ + return cls.getURI().startsWith(RDF.NAMESPACE); + } + return false; + } + + } + + } Modified: trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java 2011-12-27 10:36:53 UTC (rev 3514) +++ trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java 2011-12-28 11:00:47 UTC (rev 3515) @@ -35,7 +35,7 @@ // read the RDF/XML file baseModel.read(in, null); - model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_TRANS_INF, baseModel); + model = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF, baseModel); } @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-01-02 15:06:30
|
Revision: 3520 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3520&view=rev Author: lorenz_b Date: 2012-01-02 15:06:23 +0000 (Mon, 02 Jan 2012) Log Message: ----------- Several changes to fix some bugs detected during global enrichment test. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/owl/InverseObjectPropertyAxiom.java trunk/components-core/src/main/java/org/dllearner/kb/SparqlEndpointKS.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/ExtractionDBCache.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/SparqlQuery.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -169,7 +169,6 @@ Model newModel = executeConstructQuery(query); Map<NamedClass, Integer> result = new HashMap<NamedClass, Integer>(); NamedClass cls; - Integer oldCnt; while(newModel.size() != 0){ model.add(newModel); //get total number of distinct instances @@ -183,18 +182,11 @@ rs = executeSelectQuery(query, model); QuerySolution qs; while(rs.hasNext()){ - qs = rs.next();System.out.println(qs); + qs = rs.next(); if(qs.getResource("type") != null && !qs.getResource("type").isAnon()){ cls = new NamedClass(qs.getResource("type").getURI()); int newCnt = qs.getLiteral("count").getInt(); - oldCnt = result.get(cls); - if(oldCnt == null){ - oldCnt = Integer.valueOf(newCnt); - } else { - oldCnt += newCnt; - } - - result.put(cls, oldCnt); + result.put(cls, newCnt); } } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -156,7 +156,6 @@ oldCnt = Integer.valueOf(newCnt); } result.put(prop, oldCnt); - qs.getLiteral("count").getInt(); repeat = true; } if(!result.isEmpty()){ Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -120,7 +120,7 @@ offset += limit; - query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -115,7 +115,7 @@ offset += limit; - query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); } Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/InverseObjectPropertyAxiom.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/InverseObjectPropertyAxiom.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/InverseObjectPropertyAxiom.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -69,6 +69,6 @@ */ @Override public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) { - return "INVERSEOBJECTPROPERTYAXIOM NOT IMPLEMENTED"; + return role.toManchesterSyntaxString(baseURI, prefixes) + " InverseOf: " + inverseRole.toManchesterSyntaxString(baseURI, prefixes); } } Modified: trunk/components-core/src/main/java/org/dllearner/kb/SparqlEndpointKS.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/SparqlEndpointKS.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/kb/SparqlEndpointKS.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -46,6 +46,7 @@ private SparqlEndpoint endpoint; private boolean supportsSPARQL_1_1 = false; private boolean isRemote = true; + private boolean initialized = false; // TODO: turn those into config options @@ -68,10 +69,13 @@ @Override public void init() throws ComponentInitException { - if(endpoint == null) { - endpoint = new SparqlEndpoint(url, defaultGraphURIs, namedGraphURIs); + if(!initialized){ + if(endpoint == null) { + endpoint = new SparqlEndpoint(url, defaultGraphURIs, namedGraphURIs); + } + supportsSPARQL_1_1 = new SPARQLTasks(endpoint).supportsSPARQL_1_1(); + initialized = true; } - supportsSPARQL_1_1 = new SPARQLTasks(endpoint).supportsSPARQL_1_1(); } public SparqlEndpoint getEndpoint() { Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/ExtractionDBCache.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/ExtractionDBCache.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/ExtractionDBCache.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -194,7 +194,7 @@ } for (String ngu : endpoint.getNamedGraphURIs()) { queryExecution.addNamedGraph(ngu); - } + } com.hp.hpl.jena.query.ResultSet tmp = queryExecution.execSelect(); ResultSetRewindable rs2 = ResultSetFactory.makeRewindable(tmp); String json = SparqlQuery.convertResultSetToJSON(rs2); Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/SparqlQuery.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/SparqlQuery.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/SparqlQuery.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -274,10 +274,10 @@ * errors. * @return JSON representation of the result set. */ - public static String convertResultSetToJSON(ResultSetRewindable resultSet) { + public static String convertResultSetToJSON(ResultSet resultSet) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResultSetFormatter.outputAsJSON(baos, resultSet); - resultSet.reset(); +// resultSet.reset(); try { return baos.toString("UTF-8"); } catch (UnsupportedEncodingException e) { Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -102,6 +102,11 @@ } } + public SPARQLReasoner(SparqlEndpointKS ks, ExtractionDBCache cache) { + this.ks = ks; + this.cache = cache; + } + public SPARQLReasoner(OntModel model) { this.model = model; } @@ -602,10 +607,7 @@ } public int getPropertyCount(ObjectProperty property){ - String query = String.format("SELECT COUNT(*) WHERE {" + - "?s <%s> ?o." + - "}", - property.getName()); + String query = String.format("SELECT (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o.}", property.getName()); ResultSet rs = executeSelectQuery(query); int cnt = rs.next().get(rs.getResultVars().get(0)).asLiteral().getInt(); return cnt; @@ -615,7 +617,7 @@ public SortedSet<ObjectProperty> getInverseObjectProperties(ObjectProperty property){ SortedSet<ObjectProperty> inverseObjectProperties = new TreeSet<ObjectProperty>(); String query = "SELECT ?p WHERE {" + - "{<%p> <%ax> ?p.} UNION {?p <%ax> <%p>}}".replace("%p", property.getName()).replace("%ax", OWL.inverseOf.getURI());System.out.println(query); + "{<%p> <%ax> ?p.} UNION {?p <%ax> <%p>}}".replace("%p", property.getName()).replace("%ax", OWL.inverseOf.getURI()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ Modified: trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java 2012-01-02 09:37:56 UTC (rev 3519) +++ trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java 2012-01-02 15:06:23 UTC (rev 3520) @@ -36,6 +36,8 @@ import com.clarkparsia.owlapiv3.OntologyUtils; public class JustificationBasedCoherentOntologyExtractor implements CoherentOntologyExtractor{ + + private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(JustificationBasedCoherentOntologyExtractor.class); private static final int NUMBER_OF_JUSTIFICATIONS = 5; // private PelletReasoner reasoner; @@ -60,20 +62,31 @@ OWLOntologyManager man = incoherentOntology.getOWLOntologyManager(); // man.addOntologyChangeListener(reasoner); + + //compute the unsatisfiable classes StructureBasedRootClassFinder rootFinder = new StructureBasedRootClassFinder(reasoner); rootFinder.computeRootDerivedClasses(); - Set<OWLClass> unsatClasses = rootFinder.getRootUnsatisfiableClasses();//reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); - int cnt = unsatClasses.size(); + Set<OWLClass> unsatClasses = rootFinder.getRootUnsatisfiableClasses(); + Set<OWLClass> derivedUnsatClasses = rootFinder.getDerivedUnsatisfiableClasses(); + int rootCnt = unsatClasses.size(); + int derivedCnt = derivedUnsatClasses.size(); +// Set<OWLClass> unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); + int cnt = rootCnt + derivedCnt; + logger.info("Detected " + cnt + " unsatisfiable classes, " + rootCnt + " of them as root."); //if the ontology is not incoherent we return it here if(unsatClasses.isEmpty()){ return incoherentOntology; } //compute the logical modules for each unsatisfiable class + logger.info("Computing module for each unsatisfiable class..."); cls2ModuleMap = extractModules(unsatClasses); + logger.info("...done."); //compute initial explanations for each unsatisfiable class + logger.info("Computing initial explanations..."); Map<OWLClass, Set<Set<OWLAxiom>>> cls2Explanations = getInitialExplanationsForUnsatClasses(unsatClasses); + logger.info("...done."); while(!unsatClasses.isEmpty()){ //get frequency for each axiom @@ -86,7 +99,7 @@ } //we remove the most frequent axiom from the ontology OWLAxiom toRemove = sortedEntries.get(0).getKey(); - System.out.println("Removing axiom " + toRemove); + logger.info("Removing axiom " + toRemove + "."); man.removeAxiom(incoherentOntology, toRemove); man.applyChange(new RemoveAxiom(incoherentOntology, toRemove)); removeFromExplanations(cls2Explanations, toRemove); @@ -94,26 +107,34 @@ //recompute the unsatisfiable classes reasoner.classify(); +// unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); + rootFinder = new StructureBasedRootClassFinder(reasoner); rootFinder.computeRootDerivedClasses(); - unsatClasses = rootFinder.getRootUnsatisfiableClasses();//reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); - System.out.println("Remaining unsatisfiable classes: " + unsatClasses.size()); + unsatClasses = rootFinder.getRootUnsatisfiableClasses(); + rootCnt = unsatClasses.size(); + derivedUnsatClasses = rootFinder.getDerivedUnsatisfiableClasses(); + derivedCnt = derivedUnsatClasses.size(); + logger.info("Remaining unsatisfiable classes: " + (rootCnt + derivedCnt) + "(" + rootCnt + " roots)."); //save - if(cnt - unsatClasses.size() >= 10){ + if(cnt - (rootCnt+derivedCnt) >= 10){ + cnt = rootCnt + derivedCnt; OWLOntology toSave = getOntologyWithAnnotations(incoherentOntology); try { - toSave.getOWLOntologyManager().saveOntology(incoherentOntology, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_" + unsatClasses.size() + ".owl"))); + toSave.getOWLOntologyManager().saveOntology(incoherentOntology, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_" + cnt + ".owl"))); } catch (OWLOntologyStorageException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } - cnt = unsatClasses.size(); + cnt = rootCnt + derivedCnt; } //recompute explanations if necessary + logger.info("Recomputing explanations..."); refillExplanations(unsatClasses, cls2Explanations); + logger.info("...done."); System.gc(); } @@ -246,10 +267,9 @@ public static void main(String[] args) throws Exception{ Logger.getLogger(RBox.class.getName()).setLevel(Level.OFF); OWLOntologyManager man = OWLManager.createOWLOntologyManager(); -// OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("../components-core/cohaerent.owl")); +// OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("/home/lorenz/dbpedia_0.75_no_datapropaxioms.owl")); + OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("log/dbpedia_95.owl")); // System.out.println(schema.getLogicalAxiomCount()); - OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("/home/lorenz/arbeit/dbpedia_0.75_no_datapropaxioms.owl")); -// System.out.println(schema.getLogicalAxiomCount()); // OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("log/dbpedia_coherent.owl")); System.out.println(schema.getLogicalAxiomCount()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jen...@us...> - 2012-01-06 10:19:10
|
Revision: 3535 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3535&view=rev Author: jenslehmann Date: 2012-01-06 10:19:04 +0000 (Fri, 06 Jan 2012) Log Message: ----------- CELOE heuristic improvements Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OEHeuristicRuntime.java trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java trunk/components-core/src/main/java/org/dllearner/core/ComponentAnn.java 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 2012-01-06 10:18:12 UTC (rev 3534) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/CELOE.java 2012-01-06 10:19:04 UTC (rev 3535) @@ -219,7 +219,7 @@ @Override public void init() throws ComponentInitException { - if(maxExecutionTimeInSeconds != 0) { + if(maxExecutionTimeInSeconds != 0 && maxExecutionTimeInSecondsAfterImprovement != 0) { maxExecutionTimeInSeconds = Math.min(maxExecutionTimeInSeconds, maxExecutionTimeInSecondsAfterImprovement); } @@ -514,7 +514,7 @@ if (stop) { logger.info("Algorithm stopped ("+expressionTests+" descriptions tested). " + nodes.size() + " nodes in the search tree.\n"); } else { - logger.info("Algorithm terminated successfully ("+expressionTests+" descriptions tested). " + nodes.size() + " nodes in the search tree.\n"); + logger.info("Algorithm terminated successfully (time: " + Helper.prettyPrintNanoSeconds(System.nanoTime()-nanoStartTime) + ", "+expressionTests+" descriptions tested, " + nodes.size() + " nodes in the search tree).\n"); logger.info(reasoner.toString()); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OEHeuristicRuntime.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OEHeuristicRuntime.java 2012-01-06 10:18:12 UTC (rev 3534) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/celoe/OEHeuristicRuntime.java 2012-01-06 10:19:04 UTC (rev 3535) @@ -21,7 +21,11 @@ import java.util.Comparator; +import org.dllearner.core.Component; import org.dllearner.core.ComponentAnn; +import org.dllearner.core.ComponentInitException; +import org.dllearner.core.config.ConfigOption; +import org.dllearner.core.config.DoubleEditor; import org.dllearner.utilities.owl.ConceptComparator; /** @@ -32,8 +36,8 @@ * @author Jens Lehmann * */ -@ComponentAnn(name = "OEHeuristicRuntime", shortName = "OEHeuristicRuntime", version = 0.5) -public class OEHeuristicRuntime implements Comparator<OENode>{ +@ComponentAnn(name = "OEHeuristicRuntime", shortName = "celoe_heuristic", version = 0.5) +public class OEHeuristicRuntime implements Component, Comparator<OENode>{ // strong penalty for long descriptions private double expansionPenaltyFactor = 0.1; @@ -45,11 +49,19 @@ // syntactic comparison as final comparison criterion private ConceptComparator conceptComparator = new ConceptComparator(); + @ConfigOption(name = "startNodeBonus", defaultValue="0.1") + private double startNodeBonus = 0.1; + public OEHeuristicRuntime() { } @Override + public void init() throws ComponentInitException { + + } + + @Override public int compare(OENode node1, OENode node2) { // System.out.println("node1 " + node1); // System.out.println("score: " + getNodeScore(node1)); @@ -74,6 +86,9 @@ if(!node.isRoot()) { double parentAccuracy = node.getParent().getAccuracy(); score += (parentAccuracy - score) * gainBonusFactor; + // the root node also gets a bonus to possibly spawn useful disjunctions + } else { + score += startNodeBonus; } // penalty for horizontal expansion score -= node.getHorizontalExpansion() * expansionPenaltyFactor; @@ -104,5 +119,15 @@ public void setExpansionPenaltyFactor(double expansionPenaltyFactor) { this.expansionPenaltyFactor = expansionPenaltyFactor; - } + } + + public double getStartNodeBonus() { + return startNodeBonus; + } + + public void setStartNodeBonus(double startNodeBonus) { + this.startNodeBonus = startNodeBonus; + } + + } Modified: trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-01-06 10:18:12 UTC (rev 3534) +++ trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-01-06 10:19:04 UTC (rev 3535) @@ -85,6 +85,7 @@ "org.dllearner.reasoning.fuzzydll.FuzzyOWLAPIReasoner", "org.dllearner.algorithms.ocel.OCEL", "org.dllearner.algorithms.ocel.MultiHeuristic", + "org.dllearner.algorithms.celoe.OEHeuristicRuntime", "org.dllearner.refinementoperators.RhoDRDown", } )); private static Collection<Class<? extends Component>> components; Modified: trunk/components-core/src/main/java/org/dllearner/core/ComponentAnn.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/ComponentAnn.java 2012-01-06 10:18:12 UTC (rev 3534) +++ trunk/components-core/src/main/java/org/dllearner/core/ComponentAnn.java 2012-01-06 10:19:04 UTC (rev 3535) @@ -42,7 +42,7 @@ /** * The short name of this component, which should exclusively consist of - * lower case ASCII symbols without whitespace. + * lower case ASCII symbols and "_" without whitespace. * @return The short name of this component. */ String shortName(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jen...@us...> - 2012-01-06 11:38:27
|
Revision: 3539 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3539&view=rev Author: jenslehmann Date: 2012-01-06 11:38:20 +0000 (Fri, 06 Jan 2012) Log Message: ----------- adapted ELTL to new component system; fixed a bug in disjunctive ELTL Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithmDisjunctive.java trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithm.java 2012-01-06 11:37:27 UTC (rev 3538) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithm.java 2012-01-06 11:38:20 UTC (rev 3539) @@ -25,6 +25,7 @@ import java.util.TreeSet; import org.apache.log4j.Logger; +import org.dllearner.core.ComponentAnn; import org.dllearner.core.ComponentInitException; import org.dllearner.core.EvaluatedDescription; import org.dllearner.core.AbstractCELA; @@ -38,10 +39,11 @@ import org.dllearner.learningproblems.PosNegLP; import org.dllearner.learningproblems.ScorePosNeg; import org.dllearner.refinementoperators.ELDown2; +import org.dllearner.utilities.Helper; import org.dllearner.utilities.owl.EvaluatedDescriptionSet; /** - * A learning algorithm for EL, which will be based on a (hopefully) + * A learning algorithm for EL, which is based on an * ideal refinement operator. * * TODO redundancy check @@ -49,6 +51,7 @@ * @author Jens Lehmann * */ +@ComponentAnn(name="ELTL", shortName="eltl", version=0.5, description="ELTL is an algorithm based on the refinement operator in http://jens-lehmann.org/files/2009/el_ilp.pdf.") public class ELLearningAlgorithm extends AbstractCELA { private static Logger logger = Logger.getLogger(ELLearningAlgorithm.class); @@ -73,6 +76,10 @@ private ELHeuristic heuristic; private TreeSet<SearchTreeNode> candidates; + public ELLearningAlgorithm() { + + } + public ELLearningAlgorithm(PosNegLP problem, AbstractReasonerComponent reasoner) { super(problem, reasoner); // configurator = new ELLearningAlgorithmConfigurator(this); @@ -144,7 +151,7 @@ } // print solution(s) - logger.info("solution : " + bestEvaluatedDescriptions.getBest()); + logger.info("solution : " + bestEvaluatedDescriptions.getBest() + " [time: " + Helper.prettyPrintNanoSeconds(System.nanoTime()-treeStartTime) + "]"); isRunning = false; } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithmDisjunctive.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithmDisjunctive.java 2012-01-06 11:37:27 UTC (rev 3538) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/el/ELLearningAlgorithmDisjunctive.java 2012-01-06 11:38:20 UTC (rev 3539) @@ -19,6 +19,7 @@ package org.dllearner.algorithms.el; +import java.text.DecimalFormat; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; @@ -31,11 +32,10 @@ import org.dllearner.core.AbstractCELA; import org.dllearner.core.AbstractLearningProblem; import org.dllearner.core.AbstractReasonerComponent; +import org.dllearner.core.ComponentAnn; import org.dllearner.core.ComponentInitException; import org.dllearner.core.EvaluatedDescription; -import org.dllearner.core.options.CommonConfigOptions; -import org.dllearner.core.options.ConfigOption; -import org.dllearner.core.options.StringConfigOption; +import org.dllearner.core.config.ConfigOption; import org.dllearner.core.owl.Description; import org.dllearner.core.owl.Individual; import org.dllearner.core.owl.Thing; @@ -80,6 +80,7 @@ * @author Jens Lehmann * */ +@ComponentAnn(name="Disjunctive ELTL", shortName="deltl", version=0.5, description="Disjunctive ELTL is an algorithm based on the refinement operator in http://jens-lehmann.org/files/2009/el_ilp.pdf with support for disjunctions.") public class ELLearningAlgorithmDisjunctive extends AbstractCELA { private static Logger logger = Logger.getLogger(ELLearningAlgorithmDisjunctive.class); @@ -100,8 +101,12 @@ // all trees (for fast redundancy check) private TreeSet<ELDescriptionTree> trees; - // tree search + @ConfigOption(name = "treeSearchTimeSeconds", defaultValue = "1.0", description="Specifies how long the algorithm should search for a partial solution (a tree).") private double treeSearchTimeSeconds = 1.0; + + @ConfigOption(name = "tryFullCoverage", defaultValue = "false", description="If yes, then the algorithm tries to cover all positive examples. Note that while this improves accuracy on the testing set, it may lead to overfitting.") + private boolean tryFullCoverage = false; + // private double noise = 0; private List<ELDescriptionTree> currentSolution = new LinkedList<ELDescriptionTree>(); private EvaluatedDescription bestEvaluatedDescription; @@ -117,8 +122,14 @@ // minimum score a tree must have to be part of the solution private double minimumTreeScore = -1; - private boolean instanceBasedDisjoints; + private boolean instanceBasedDisjoints; + + private DecimalFormat df = new DecimalFormat("0.00"); + public ELLearningAlgorithmDisjunctive() { + + } + public ELLearningAlgorithmDisjunctive(PosNegLP problem, AbstractReasonerComponent reasoner) { super(problem, reasoner); } @@ -134,13 +145,13 @@ } - public static Collection<ConfigOption<?>> createConfigOptions() { - Collection<ConfigOption<?>> options = new LinkedList<ConfigOption<?>>(); - options.add(CommonConfigOptions.getNoisePercentage()); - options.add(new StringConfigOption("startClass", "the named class which should be used to start the algorithm (GUI: needs a widget for selecting a class)")); - options.add(CommonConfigOptions.getInstanceBasedDisjoints()); - return options; - } +// public static Collection<ConfigOption<?>> createConfigOptions() { +// Collection<ConfigOption<?>> options = new LinkedList<ConfigOption<?>>(); +// options.add(CommonConfigOptions.getNoisePercentage()); +// options.add(new StringConfigOption("startClass", "the named class which should be used to start the algorithm (GUI: needs a widget for selecting a class)")); +// options.add(CommonConfigOptions.getInstanceBasedDisjoints()); +// return options; +// } @Override public void init() throws ComponentInitException { @@ -210,12 +221,13 @@ // we found a tree (partial solution) currentSolution.add(bestCurrentNode.getDescriptionTree()); Description bestDescription = bestCurrentNode.getDescriptionTree().transformToDescription(); + Description bestCombinedDescription = bestDescription; // form union of trees found so far with if(treeCount==0) { bestEvaluatedDescription = learningProblem.evaluate(bestDescription); } else { - Union union = new Union(bestEvaluatedDescription.getDescription(), bestDescription); - bestEvaluatedDescription = learningProblem.evaluate(union); + bestCombinedDescription = new Union(bestEvaluatedDescription.getDescription(), bestDescription); + bestEvaluatedDescription = learningProblem.evaluate(bestCombinedDescription); } // remove already covered examples @@ -224,6 +236,7 @@ while(it.hasNext()) { Individual ind = it.next(); if(reasoner.hasType(bestDescription, ind)) { +// System.out.println("covered pos: " + ind); it.remove(); posCov++; } @@ -233,11 +246,13 @@ while(it.hasNext()) { Individual ind = it.next(); if(reasoner.hasType(bestDescription, ind)) { +// System.out.println("covered neg: " + ind); it.remove(); negCov++; } } - logger.info("tree found: " + bestDescription.toManchesterSyntaxString(baseURI, prefixes) + " (" + posCov + " pos covered, " + currentPosExamples.size() + " remaining, " + negCov + " neg covered, " + currentNegExamples.size() + " remaining, score: " + bestCurrentNode.getScore() + ")"); + logger.info("tree found: " + bestDescription.toManchesterSyntaxString(baseURI, prefixes) + " (" + posCov + " pos covered, " + currentPosExamples.size() + " remaining, " + negCov + " neg covered, " + currentNegExamples.size() + " remaining, score: " + bestCurrentNode.getScore() + ")"); + logger.info("combined accuracy: " + df .format(bestEvaluatedDescription.getAccuracy())); } else { logger.info("no tree found, which satisfies the minimum criteria - the best was: " + bestCurrentNode.getDescriptionTree().transformToDescription().toManchesterSyntaxString(baseURI, prefixes) + " with score " + bestCurrentNode.getScore()); } @@ -372,6 +387,11 @@ // SearchTreeNode bestNode = candidates.last(); // return (bestNode.getCoveredNegatives() == 0); + // stop if there are no more positive examples to cover + if(currentPosExamples.size()==0) { + return true; + } + // we stop when the score of the last tree added is too low // (indicating that the algorithm could not find anything appropriate // in the timeframe set) @@ -380,8 +400,12 @@ } // stop when almost all positive examples have been covered - int maxPosRemaining = (int) Math.ceil(startPosExamplesSize * 0.05d); - return (currentPosExamples.size()<=maxPosRemaining); + if(tryFullCoverage) { + return false; + } else { + int maxPosRemaining = (int) Math.ceil(startPosExamplesSize * 0.05d); + return (currentPosExamples.size()<=maxPosRemaining); + } } private void reset() { @@ -391,8 +415,9 @@ trees.clear(); currentSolution.clear(); bestEvaluatedDescription = learningProblem.evaluate(Thing.instance); - currentPosExamples = ((PosNegLP)getLearningProblem()).getPositiveExamples(); - currentNegExamples = ((PosNegLP)getLearningProblem()).getNegativeExamples(); + // we need to clone in order not to modify the learning problem + currentPosExamples = new TreeSet<Individual>(((PosNegLP)getLearningProblem()).getPositiveExamples()); + currentNegExamples = new TreeSet<Individual>(((PosNegLP)getLearningProblem()).getNegativeExamples()); startPosExamplesSize = currentPosExamples.size(); // startNegExamplesSize = currentNegExamples.size(); } @@ -438,6 +463,22 @@ public void setInstanceBasedDisjoints(boolean instanceBasedDisjoints) { this.instanceBasedDisjoints = instanceBasedDisjoints; + } + + public double getTreeSearchTimeSeconds() { + return treeSearchTimeSeconds; + } + + public void setTreeSearchTimeSeconds(double treeSearchTimeSeconds) { + this.treeSearchTimeSeconds = treeSearchTimeSeconds; + } + + public boolean isTryFullCoverage() { + return tryFullCoverage; + } + + public void setTryFullCoverage(boolean tryFullCoverage) { + this.tryFullCoverage = tryFullCoverage; } } Modified: trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-01-06 11:37:27 UTC (rev 3538) +++ trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-01-06 11:38:20 UTC (rev 3539) @@ -51,6 +51,8 @@ // (CLI, GUI, Web Service) and scripts (HTML documentation generator) private static List<String> componentClassNames = new ArrayList<String> ( Arrays.asList(new String[]{ "org.dllearner.algorithms.celoe.CELOE", + "org.dllearner.algorithms.el.ELLearningAlgorithm", + "org.dllearner.algorithms.el.ELLearningAlgorithmDisjunctive", "org.dllearner.algorithms.fuzzydll.FuzzyCELOE", "org.dllearner.algorithms.BruteForceLearner", "org.dllearner.algorithms.RandomGuesser", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-01-25 13:31:31
|
Revision: 3556 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3556&view=rev Author: lorenz_b Date: 2012-01-25 13:31:24 +0000 (Wed, 25 Jan 2012) Log Message: ----------- Small improvements. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/utilities/CoherentOntologyExtractor.java trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -154,6 +154,8 @@ oldCnt = result.get(prop); if(oldCnt == null){ oldCnt = Integer.valueOf(newCnt); + } else { + oldCnt += newCnt; } result.put(prop, oldCnt); repeat = true; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -161,14 +161,15 @@ oldCnt = result.get(prop); if(oldCnt == null){ oldCnt = Integer.valueOf(newCnt); + } else { + oldCnt += newCnt; } result.put(prop, oldCnt); - qs.getLiteral("count").getInt(); repeat = true; } if(!result.isEmpty()){ currentlyBestAxioms = buildAxioms(result, allObjectProperties); - offset += 1000; + offset += limit; } } @@ -185,7 +186,7 @@ EvaluatedAxiom evalAxiom; //first create disjoint axioms with properties which not occur and give score of 1 - for(ObjectProperty p : completeDisjointProperties){ + for(ObjectProperty p : completeDisjointProperties){System.out.println(p); if(usePropertyPopularity){ int popularity = reasoner.getPropertyCount(p); //skip if property is not used in kb @@ -217,10 +218,10 @@ public static void main(String[] args) throws Exception{ DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(new SparqlEndpoint( new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/engineType")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/state")); l.setMaxExecutionTimeInSeconds(10); l.init(); l.start(); - System.out.println(l.getCurrentlyBestEvaluatedAxioms(5)); + System.out.println(l.getCurrentlyBestEvaluatedAxioms(Integer.MAX_VALUE)); } } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -145,8 +145,10 @@ prop = new DatatypeProperty(qs.getResource("p").getURI()); int newCnt = qs.getLiteral("count").getInt(); oldCnt = result.get(prop); - if (oldCnt == null) { + if(oldCnt == null){ oldCnt = Integer.valueOf(newCnt); + } else { + oldCnt += newCnt; } result.put(prop, oldCnt); qs.getLiteral("count").getInt(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -151,9 +151,10 @@ oldCnt = result.get(prop); if(oldCnt == null){ oldCnt = Integer.valueOf(newCnt); + } else { + oldCnt += newCnt; } result.put(prop, oldCnt); - qs.getLiteral("count").getInt(); repeat = true; } if(!result.isEmpty()){ Modified: trunk/components-core/src/main/java/org/dllearner/utilities/CoherentOntologyExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/CoherentOntologyExtractor.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/utilities/CoherentOntologyExtractor.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -5,5 +5,7 @@ public interface CoherentOntologyExtractor { OWLOntology getCoherentOntology(OWLOntology incoherentOntology); + + OWLOntology getCoherentOntology(OWLOntology ontology, boolean preferRoots); } Modified: trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java 2012-01-20 02:53:33 UTC (rev 3555) +++ trunk/components-core/src/main/java/org/dllearner/utilities/JustificationBasedCoherentOntologyExtractor.java 2012-01-25 13:31:24 UTC (rev 3556) @@ -4,6 +4,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -14,12 +16,17 @@ import java.util.logging.Level; import java.util.logging.Logger; +import openlink.util.MD5; + import org.mindswap.pellet.RBox; +import org.semanticweb.HermiT.Configuration; +import org.semanticweb.HermiT.Reasoner; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.io.RDFXMLOntologyFormat; import org.semanticweb.owlapi.model.AxiomType; import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLEntity; import org.semanticweb.owlapi.model.OWLLogicalAxiom; import org.semanticweb.owlapi.model.OWLOntology; @@ -27,11 +34,17 @@ import org.semanticweb.owlapi.model.OWLOntologyManager; import org.semanticweb.owlapi.model.OWLOntologyStorageException; import org.semanticweb.owlapi.model.RemoveAxiom; +import org.semanticweb.owlapi.reasoner.IllegalConfigurationException; +import org.semanticweb.owlapi.reasoner.OWLReasoner; +import org.semanticweb.owlapi.reasoner.OWLReasonerConfiguration; +import org.semanticweb.owlapi.reasoner.OWLReasonerFactory; import uk.ac.manchester.cs.owlapi.modularity.ModuleType; import com.clarkparsia.modularity.IncrementalClassifier; import com.clarkparsia.modularity.ModularityUtils; +import com.clarkparsia.owlapi.explanation.BlackBoxExplanation; +import com.clarkparsia.owlapi.explanation.HSTExplanationGenerator; import com.clarkparsia.owlapi.explanation.PelletExplanation; import com.clarkparsia.owlapiv3.OntologyUtils; @@ -39,35 +52,72 @@ private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(JustificationBasedCoherentOntologyExtractor.class); - private static final int NUMBER_OF_JUSTIFICATIONS = 5; + private int numberOfJustifications = 10; // private PelletReasoner reasoner; private IncrementalClassifier reasoner; + private Reasoner hermitReasoner; private OWLOntology incoherentOntology; private OWLOntology ontology; + private OWLDataFactory factory; private Map<OWLClass, OWLOntology> cls2ModuleMap = new HashMap<OWLClass, OWLOntology>(); + private OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + MessageDigest md5; + + public JustificationBasedCoherentOntologyExtractor() { + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + static {PelletExplanation.setup();} @Override - public OWLOntology getCoherentOntology(OWLOntology ontology) { - this.ontology = ontology;ontology.getOWLOntologyManager().removeAxioms(ontology, ontology.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)); + public OWLOntology getCoherentOntology(OWLOntology ontology){ + return getCoherentOntology(ontology, false); + } + + @Override + public OWLOntology getCoherentOntology(OWLOntology ontology, boolean preferRoots){ + if(preferRoots){ + return computeCoherentOntologyRootBased(ontology); + } else { + return computeCoherentOntology(ontology); + } + } + + private OWLOntology computeCoherentOntologyRootBased(OWLOntology ontology) { + this.ontology = ontology; this.incoherentOntology = getOntologyWithoutAnnotations(ontology); -// reasoner = PelletReasonerFactory.getInstance().createNonBufferingReasoner(incoherentOntology); -// reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY); + //only for debugging + ontology.getOWLOntologyManager().removeAxioms(ontology, ontology.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)); + + long startTime = System.currentTimeMillis(); reasoner = new IncrementalClassifier(incoherentOntology); reasoner.classify(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); +// startTime = System.currentTimeMillis(); +// hermitReasoner = new Reasoner(incoherentOntology); +// hermitReasoner.classifyClasses(); +// logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + OWLOntologyManager man = incoherentOntology.getOWLOntologyManager(); + factory = man.getOWLDataFactory(); // man.addOntologyChangeListener(reasoner); //compute the unsatisfiable classes + logger.info("Computing root/derived unsatisfiable classes..."); + startTime = System.currentTimeMillis(); StructureBasedRootClassFinder rootFinder = new StructureBasedRootClassFinder(reasoner); - rootFinder.computeRootDerivedClasses(); Set<OWLClass> unsatClasses = rootFinder.getRootUnsatisfiableClasses(); Set<OWLClass> derivedUnsatClasses = rootFinder.getDerivedUnsatisfiableClasses(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); int rootCnt = unsatClasses.size(); int derivedCnt = derivedUnsatClasses.size(); // Set<OWLClass> unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); @@ -80,13 +130,15 @@ } //compute the logical modules for each unsatisfiable class logger.info("Computing module for each unsatisfiable class..."); + startTime = System.currentTimeMillis(); cls2ModuleMap = extractModules(unsatClasses); - logger.info("...done."); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); //compute initial explanations for each unsatisfiable class logger.info("Computing initial explanations..."); + startTime = System.currentTimeMillis(); Map<OWLClass, Set<Set<OWLAxiom>>> cls2Explanations = getInitialExplanationsForUnsatClasses(unsatClasses); - logger.info("...done."); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); while(!unsatClasses.isEmpty()){ //get frequency for each axiom @@ -95,7 +147,7 @@ //get a sorted list of entries with the highest axiom count first List<Entry<OWLAxiom, Integer>> sortedEntries = MapUtils.sortByValues(axiom2CountMap); for(Entry<OWLAxiom, Integer> entry : sortedEntries){ - System.out.println(entry.getKey() + ":" + entry.getValue()); +// System.out.println(entry.getKey() + ":" + entry.getValue()); } //we remove the most frequent axiom from the ontology OWLAxiom toRemove = sortedEntries.get(0).getKey(); @@ -106,15 +158,22 @@ removeFromModules(toRemove); //recompute the unsatisfiable classes + logger.info("Reclassifying..."); + startTime = System.currentTimeMillis(); reasoner.classify(); +// hermitReasoner.classifyClasses(); // unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + logger.info("Computing root/derived unsatisfiable classes..."); + startTime = System.currentTimeMillis(); rootFinder = new StructureBasedRootClassFinder(reasoner); - rootFinder.computeRootDerivedClasses(); unsatClasses = rootFinder.getRootUnsatisfiableClasses(); + derivedUnsatClasses = rootFinder.getDerivedUnsatisfiableClasses(); rootCnt = unsatClasses.size(); - derivedUnsatClasses = rootFinder.getDerivedUnsatisfiableClasses(); derivedCnt = derivedUnsatClasses.size(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + logger.info("Remaining unsatisfiable classes: " + (rootCnt + derivedCnt) + "(" + rootCnt + " roots)."); //save @@ -133,13 +192,14 @@ //recompute explanations if necessary logger.info("Recomputing explanations..."); + startTime = System.currentTimeMillis(); refillExplanations(unsatClasses, cls2Explanations); - logger.info("...done."); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); System.gc(); } try { - incoherentOntology.getOWLOntologyManager().saveOntology(incoherentOntology, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_coherent.owl"))); + incoherentOntology.getOWLOntologyManager().saveOntology(getOntologyWithAnnotations(incoherentOntology), new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_coherent.owl"))); } catch (OWLOntologyStorageException e) { e.printStackTrace(); } catch (FileNotFoundException e) { @@ -150,6 +210,103 @@ return getOntologyWithAnnotations(incoherentOntology); } + private OWLOntology computeCoherentOntology(OWLOntology ontology) { + this.ontology = ontology; + this.incoherentOntology = getOntologyWithoutAnnotations(ontology); + + //only for debugging + ontology.getOWLOntologyManager().removeAxioms(ontology, ontology.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)); + + long startTime = System.currentTimeMillis(); + reasoner = new IncrementalClassifier(incoherentOntology); + reasoner.classify(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + + OWLOntologyManager man = incoherentOntology.getOWLOntologyManager(); + factory = man.getOWLDataFactory(); + + //compute the unsatisfiable classes + logger.info("Computing unsatisfiable classes..."); + startTime = System.currentTimeMillis(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + Set<OWLClass> unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); + int cnt = unsatClasses.size(); + logger.info("Detected " + cnt + " unsatisfiable classes."); + + //if the ontology is not incoherent we return it here + if(unsatClasses.isEmpty()){ + return incoherentOntology; + } + //compute the logical modules for each unsatisfiable class + logger.info("Computing module for each unsatisfiable class..."); + startTime = System.currentTimeMillis(); + cls2ModuleMap = extractModules(unsatClasses); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + + //compute initial explanations for each unsatisfiable class + logger.info("Computing initial explanations..."); + startTime = System.currentTimeMillis(); + Map<OWLClass, Set<Set<OWLAxiom>>> cls2Explanations = getInitialExplanationsForUnsatClasses(unsatClasses); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + + while(!unsatClasses.isEmpty()){ + //get frequency for each axiom + Map<OWLAxiom, Integer> axiom2CountMap = getAxiomFrequency(cls2Explanations); + + //get a sorted list of entries with the highest axiom count first + List<Entry<OWLAxiom, Integer>> sortedEntries = MapUtils.sortByValues(axiom2CountMap); + for(Entry<OWLAxiom, Integer> entry : sortedEntries){ +// System.out.println(entry.getKey() + ":" + entry.getValue()); + } + //we remove the most frequent axiom from the ontology + OWLAxiom toRemove = sortedEntries.get(0).getKey(); + logger.info("Removing axiom " + toRemove + "."); + man.removeAxiom(incoherentOntology, toRemove); + man.applyChange(new RemoveAxiom(incoherentOntology, toRemove)); + removeFromExplanations(cls2Explanations, toRemove); + removeFromModules(toRemove); + + //recompute the unsatisfiable classes + logger.info("Reclassifying..."); + startTime = System.currentTimeMillis(); + reasoner.classify(); + unsatClasses = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom(); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + logger.info("Remaining unsatisfiable classes: " + unsatClasses.size()); + + //save + if(cnt - unsatClasses.size() >= 10){ + cnt = unsatClasses.size(); + OWLOntology toSave = getOntologyWithAnnotations(incoherentOntology); + try { + toSave.getOWLOntologyManager().saveOntology(incoherentOntology, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_" + cnt + ".owl"))); + } catch (OWLOntologyStorageException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + //recompute explanations if necessary + logger.info("Recomputing explanations..."); + startTime = System.currentTimeMillis(); + refillExplanations(unsatClasses, cls2Explanations); + logger.info("...done in " + (System.currentTimeMillis()-startTime) + "ms."); + + System.gc(); + } + try { + incoherentOntology.getOWLOntologyManager().saveOntology(getOntologyWithAnnotations(incoherentOntology), new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream("log/dbpedia_coherent.owl"))); + } catch (OWLOntologyStorageException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + System.out.println(incoherentOntology.getLogicalAxiomCount()); + + return getOntologyWithAnnotations(incoherentOntology); + } + private void removeFromModules(OWLAxiom axiom){ OWLOntology module; for(Entry<OWLClass, OWLOntology> entry : cls2ModuleMap.entrySet()){ @@ -172,8 +329,8 @@ private void refillExplanations(Set<OWLClass> unsatClasses, Map<OWLClass, Set<Set<OWLAxiom>>> cls2Explanations){ for(OWLClass unsatClass : unsatClasses){ Set<Set<OWLAxiom>> precomputedExplanations = cls2Explanations.get(unsatClass); - if(precomputedExplanations == null || precomputedExplanations.size() < NUMBER_OF_JUSTIFICATIONS){ - Set<Set<OWLAxiom>> newExplanations = computeExplanations(unsatClass, NUMBER_OF_JUSTIFICATIONS); + if(precomputedExplanations == null || precomputedExplanations.size() < numberOfJustifications){ + Set<Set<OWLAxiom>> newExplanations = computeExplanations(unsatClass, numberOfJustifications); cls2Explanations.put(unsatClass, newExplanations); } } @@ -237,24 +394,65 @@ private Set<Set<OWLAxiom>> computeExplanations(OWLClass unsatClass){ PelletExplanation expGen = new PelletExplanation(getModule(unsatClass)); - return expGen.getUnsatisfiableExplanations(unsatClass, NUMBER_OF_JUSTIFICATIONS); + return expGen.getUnsatisfiableExplanations(unsatClass, numberOfJustifications); } private Set<Set<OWLAxiom>> computeExplanations(OWLClass unsatClass, int limit){ PelletExplanation expGen = new PelletExplanation(getModule(unsatClass)); - return expGen.getUnsatisfiableExplanations(unsatClass, NUMBER_OF_JUSTIFICATIONS); + return expGen.getUnsatisfiableExplanations(unsatClass, numberOfJustifications); } - private OWLOntology getModule(OWLClass cls){ + private Set<Set<OWLAxiom>> computeExplanationsBlackBox(OWLClass unsatClass, int limit){ + BlackBoxExplanation singleExpGen = new BlackBoxExplanation(incoherentOntology, new HermiTReasonerFactory(), hermitReasoner); + HSTExplanationGenerator expGen = new HSTExplanationGenerator(singleExpGen); + return expGen.getExplanations(unsatClass, limit); + } + +// private Set<Set<OWLAxiom>> computeExplanationsBlackbox(OWLClass unsatClass, int limit){ +// BlackBoxExplanation b = new BlackBoxExplanation(incoherentOntology, reasonerFactory, hermitReasoner) +// MultipleExplanationGenerator expGen = new HSTExplanationGenerator(b); +// PelletExplanation expGen = new PelletExplanation(getModule(unsatClass)); +// return expGen.getUnsatisfiableExplanations(unsatClass, NUMBER_OF_JUSTIFICATIONS); +// } + + private OWLOntology getModule(OWLClass cls){System.out.println(cls); OWLOntology module = cls2ModuleMap.get(cls); + new File("log").mkdir(); if(module == null){ - module = OntologyUtils.getOntologyFromAxioms( - ModularityUtils.extractModule(incoherentOntology, Collections.singleton((OWLEntity)cls), ModuleType.TOP_OF_BOT)); + md5.reset(); + md5.update((ontology.getOWLOntologyManager().getOntologyDocumentIRI(ontology).toString() + cls.toStringID()).getBytes()); + String hash = MD5.asHex(md5.digest()); + String filename = "log/" + hash + ".owl"; + File file = new File(filename); + if(file.exists()){ + module = loadModule(file); + } else { + module = OntologyUtils.getOntologyFromAxioms( + ModularityUtils.extractModule(incoherentOntology, Collections.singleton((OWLEntity)cls), ModuleType.TOP_OF_BOT)); + try { + manager.saveOntology(module, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream(filename))); + } catch (OWLOntologyStorageException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + cls2ModuleMap.put(cls, module); } return module; } + private OWLOntology loadModule(File file){ + OWLOntology module = null; + try { + module = manager.loadOntologyFromOntologyDocument(file); + } catch (OWLOntologyCreationException e) { + e.printStackTrace(); + } + return module; + } + private Map<OWLClass, OWLOntology> extractModules(Set<OWLClass> classes){ Map<OWLClass, OWLOntology> cls2ModuleMap = new HashMap<OWLClass, OWLOntology>(); for(OWLClass cls : classes){ @@ -264,17 +462,81 @@ return cls2ModuleMap; } + public void setNumberOfJustifications(int numberOfJustifications) { + this.numberOfJustifications = numberOfJustifications; + } + public static void main(String[] args) throws Exception{ Logger.getLogger(RBox.class.getName()).setLevel(Level.OFF); OWLOntologyManager man = OWLManager.createOWLOntologyManager(); -// OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("/home/lorenz/dbpedia_0.75_no_datapropaxioms.owl")); - OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("log/dbpedia_95.owl")); + + if(args.length != 3){ + System.out.println("USAGE: JustificationBasedCoherentOntologyExtractor <incoherent.owl> <numberOfJustifcations> <preferRootClasses(true|false)>"); + System.exit(0); + } + String filename = args[0]; + int numberOfJustifications = Integer.parseInt(args[1]); + boolean preferRoots = Boolean.valueOf(args[2]); + + System.out.println("Loading ontology..."); + File file = new File(filename); + OWLOntology schema = man.loadOntologyFromOntologyDocument(file); + man.removeAxioms(schema, schema.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)); + +// OWLOntology cleaned = man.createOntology(IRI.create("http://dbpedia_cleaned.owl")); +// man.addAxioms(cleaned, schema.getLogicalAxioms()); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.REFLEXIVE_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.IRREFLEXIVE_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.SYMMETRIC_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.ASYMMETRIC_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.FUNCTIONAL_OBJECT_PROPERTY)); +// man.removeAxioms(cleaned, cleaned.getAxioms(AxiomType.INVERSE_FUNCTIONAL_OBJECT_PROPERTY)); +// man.saveOntology(cleaned, new RDFXMLOntologyFormat(), new BufferedOutputStream(new FileOutputStream(file.getParent() + "/cleaned.owl"))); +// OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("log/dbpedia_95.owl")); +// OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("/home/lorenz/arbeit/dbpedia_0.75_no_datapropaxioms.owl")); // System.out.println(schema.getLogicalAxiomCount()); // OWLOntology schema = man.loadOntologyFromOntologyDocument(new File("log/dbpedia_coherent.owl")); - System.out.println(schema.getLogicalAxiomCount()); +// System.out.println(schema.getLogicalAxiomCount()); + System.out.println("...done."); JustificationBasedCoherentOntologyExtractor extractor = new JustificationBasedCoherentOntologyExtractor(); - OWLOntology coherentOntology = extractor.getCoherentOntology(schema);System.out.println(coherentOntology.getLogicalAxiomCount()); + extractor.setNumberOfJustifications(numberOfJustifications); + OWLOntology coherentOntology = extractor.getCoherentOntology(schema, preferRoots); + System.out.println("Coherent ontology contains " + coherentOntology.getLogicalAxiomCount() + " logical axioms."); } + + class HermiTReasonerFactory implements OWLReasonerFactory{ + @Override + public OWLReasoner createNonBufferingReasoner(OWLOntology ontology) { + return new Reasoner(ontology); + } + + @Override + public OWLReasoner createNonBufferingReasoner(OWLOntology ontology, + OWLReasonerConfiguration config) + throws IllegalConfigurationException { + return new Reasoner((Configuration) config, ontology); + } + + @Override + public OWLReasoner createReasoner(OWLOntology ontology) { + return new Reasoner(ontology); + } + + @Override + public OWLReasoner createReasoner(OWLOntology ontology, + OWLReasonerConfiguration config) + throws IllegalConfigurationException { + return new Reasoner((Configuration) config, ontology); + } + + @Override + public String getReasonerName() { + return "HermiT Reasoner"; + } + + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-02-01 11:35:45
|
Revision: 3560 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3560&view=rev Author: lorenz_b Date: 2012-02-01 11:35:39 +0000 (Wed, 01 Feb 2012) Log Message: ----------- Added method to get all super classes. Add option to omit existing SubClassOf axioms. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java trunk/components-core/src/main/java/org/dllearner/core/owl/ClassHierarchy.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-01-27 11:55:41 UTC (rev 3559) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-02-01 11:35:39 UTC (rev 3560) @@ -126,7 +126,23 @@ //get existing super classes SortedSet<Description> existingSuperClasses = reasoner.getSuperClasses(classToDescribe); if(!existingSuperClasses.isEmpty()){ + SortedSet<Description> inferredSuperClasses = new TreeSet<Description>(); + for(Description assertedSup : existingSuperClasses){ + if(reasoner.isPrepared()){ + if(reasoner.getClassHierarchy().contains(assertedSup)){ + for(Description inferredSup : reasoner.getClassHierarchy().getSuperClasses(assertedSup, false)){ + inferredSuperClasses.add(inferredSup); + } + } + } else { + inferredSuperClasses.add(assertedSup); + } + } + existingSuperClasses.addAll(inferredSuperClasses); logger.info("Existing super classes: " + existingSuperClasses); + for(Description sup : existingSuperClasses){ + existingAxioms.add(new SubClassAxiom(classToDescribe, sup)); + } } Map<Individual, SortedSet<Description>> ind2Types = new HashMap<Individual, SortedSet<Description>>(); @@ -226,9 +242,10 @@ SimpleSubclassLearner l = new SimpleSubclassLearner(ks); l.setReasoner(reasoner); + l.setReturnOnlyNewAxioms(true); ConfigHelper.configure(l, "maxExecutionTimeInSeconds", 10); - l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/Olympics")); + l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/SoccerClub")); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/ClassHierarchy.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/ClassHierarchy.java 2012-01-27 11:55:41 UTC (rev 3559) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/ClassHierarchy.java 2012-02-01 11:35:39 UTC (rev 3560) @@ -111,6 +111,20 @@ // return (TreeSet<Description>) subsumptionHierarchyDown.get(concept).clone(); // } } + + public SortedSet<Description> getSuperClasses(Description concept, boolean direct) { + SortedSet<Description> result = subsumptionHierarchyUp.get(concept); + if(result == null) { + logger.error("Query for super class of " + concept + " in subsumption hierarchy, but the class is not contained in the (downward) hierarchy, e.g. because the class does not exist or is ignored. Returning empty result instead."); + return new TreeSet<Description>(); + } + result.remove(concept); + for(Description sub : new HashSet<Description>(result)){ + result.addAll(getSuperClasses(sub, false)); + } + + return new TreeSet<Description>(result); + } /** * Computes the siblings of the specified descriptions. Siblings are all those This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-02-05 18:27:40
|
Revision: 3565 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3565&view=rev Author: lorenz_b Date: 2012-02-05 18:27:34 +0000 (Sun, 05 Feb 2012) Log Message: ----------- Minor changes to use CLI options for run time and chunk size. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -21,6 +21,7 @@ import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -145,7 +146,6 @@ symmetric = qs.getLiteral("symmetric").getInt(); } int asymmetric = total - symmetric; - if(total > 0){ currentlyBestAxioms.add(new EvaluatedAxiom(new AsymmetricObjectPropertyAxiom(propertyToDescribe), computeScore(total, asymmetric), declaredAsymmetric)); @@ -154,8 +154,9 @@ } public static void main(String[] args) throws Exception{ - AsymmetricObjectPropertyAxiomLearner l = new AsymmetricObjectPropertyAxiomLearner(new SparqlEndpointKS(new SparqlEndpoint(new URL("http://factforge.net/sparql"))));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/country")); + AsymmetricObjectPropertyAxiomLearner l = new AsymmetricObjectPropertyAxiomLearner(new SparqlEndpointKS(new SparqlEndpoint( + new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())));//.getEndpointDBpediaLiveAKSW())); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/spouse")); l.setMaxExecutionTimeInSeconds(10); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -138,7 +138,6 @@ private void runSPARQL1_1_Mode() { //get properties and how often they occur - int limit = 1000; int offset = 0; String queryTemplate = "SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + @@ -186,7 +185,7 @@ EvaluatedAxiom evalAxiom; //first create disjoint axioms with properties which not occur and give score of 1 - for(ObjectProperty p : completeDisjointProperties){System.out.println(p); + for(ObjectProperty p : completeDisjointProperties){ if(usePropertyPopularity){ int popularity = reasoner.getPropertyCount(p); //skip if property is not used in kb @@ -205,7 +204,7 @@ //second create disjoint axioms with other properties and score 1 - (#occurence/#all) for(Entry<ObjectProperty, Integer> entry : sortByValues(property2Count)){ double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(all, entry.getValue()); - double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2; + double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2;//System.out.println(entry + ": " + accuracy); evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, entry.getKey()), new AxiomScore(1 - accuracy)); axioms.add(evalAxiom); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -128,7 +128,6 @@ private void runSPARQL1_1_Mode() { //get subjects with types - int limit = 1000; int offset = 0; String queryTemplate = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + @@ -159,7 +158,7 @@ } if(!result.isEmpty()){ currentlyBestAxioms = buildAxioms(result); - offset += 1000; + offset += limit; } } @@ -178,9 +177,10 @@ properties.add(propertyToDescribe); properties.add(entry.getKey()); int popularity = reasoner.getPropertyCount(entry.getKey()); - int total = popularity;//Math.max(popularity, all); +// int total = popularity; + int total = Math.max(popularity, all); int success = entry.getValue();//System.out.println(entry.getKey());System.out.println(entry.getKey());System.out.println(total);System.out.println(success); - Score score = computeScore(total, success); + Score score = computeScore(total, success);//System.out.println(entry + ": " + score.getAccuracy()); evalAxiom = new EvaluatedAxiom(new EquivalentObjectPropertiesAxiom(properties),score); axioms.add(evalAxiom); } @@ -192,7 +192,7 @@ public static void main(String[] args) throws Exception{ EquivalentObjectPropertyAxiomLearner l = new EquivalentObjectPropertyAxiomLearner(new SparqlEndpointKS(new SparqlEndpoint( new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/state")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/nationality")); l.setMaxExecutionTimeInSeconds(10); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -21,6 +21,7 @@ import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.SortedSet; import org.dllearner.core.AbstractAxiomLearningAlgorithm; @@ -142,7 +143,8 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql")));//.getEndpointDBpediaLiveAKSW())); + SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint( + new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList()));//.getEndpointDBpediaLiveAKSW())); SPARQLReasoner reasoner = new SPARQLReasoner(ks); reasoner.prepareSubsumptionHierarchy(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -19,7 +19,9 @@ package org.dllearner.algorithms.properties; +import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -143,7 +145,7 @@ qs = rs.next(); transitive = qs.getLiteral("transitive").getInt(); } - + System.out.println(total); if(total > 0){ currentlyBestAxioms.add(new EvaluatedAxiom(new TransitiveObjectPropertyAxiom(propertyToDescribe), computeScore(total, transitive), declaredAsTransitive)); @@ -152,9 +154,10 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); + SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint( + new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); TransitiveObjectPropertyAxiomLearner l = new TransitiveObjectPropertyAxiomLearner(ks); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/subregion")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/chairman")); l.init(); l.start(); System.out.println(l.getCurrentlyBestEvaluatedAxioms(1)); Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-02-05 18:25:51 UTC (rev 3564) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-02-05 18:27:34 UTC (rev 3565) @@ -84,6 +84,7 @@ protected int fetchedRows; protected long startTime; + protected int limit = 1000; public AbstractAxiomLearningAlgorithm() { existingAxioms = new TreeSet<Axiom>(new AxiomComparator()); @@ -136,6 +137,14 @@ public void start() { } + public int getLimit() { + return limit; + } + + public void setLimit(int limit) { + this.limit = limit; + } + @Override public void init() throws ComponentInitException { ks.init(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sha...@us...> - 2012-03-12 02:14:15
|
Revision: 3607 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3607&view=rev Author: shadowtm Date: 2012-03-12 02:14:08 +0000 (Mon, 12 Mar 2012) Log Message: ----------- Added OWLOntologyKnowledgeSource to support abstraction of the ontology creation so that we can introduce different implementations more easily. In particular, this will come in handy for the REST service interface. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java Modified: trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java 2012-03-09 09:19:31 UTC (rev 3606) +++ trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java 2012-03-12 02:14:08 UTC (rev 3607) @@ -36,61 +36,67 @@ import org.dllearner.parser.KBParser; import org.dllearner.parser.ParseException; import org.dllearner.reasoning.DIGConverter; -import org.springframework.beans.propertyeditors.StringTrimmerEditor; +import org.dllearner.utilities.owl.OWLAPIAxiomConvertVisitor; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyCreationException; +import org.semanticweb.owlapi.model.OWLOntologyManager; /** * KB files are an internal convenience format used in DL-Learner. Their * syntax is close to Description Logics and easy to use. KB files can be * exported to OWL for usage outside of DL-Learner. - * + * * @author Jens Lehmann - * */ @ComponentAnn(name = "KB File", shortName = "kbfile", version = 0.8) -public class KBFile extends AbstractKnowledgeSource { +public class KBFile extends AbstractKnowledgeSource implements OWLOntologyKnowledgeSource { - private static Logger logger = Logger.getLogger(KBFile.class); - - private KB kb; + private static Logger logger = Logger.getLogger(KBFile.class); - @ConfigOption(name = "url", description = "URL pointer to the KB file") + private KB kb; + + @ConfigOption(name = "url", description = "URL pointer to the KB file") private String url; private String baseDir; @ConfigOption(name = "fileName", description = "relative or absolute path to KB file") private String fileName; - /** - * Default constructor (needed for reflection in ComponentManager). - */ - public KBFile() { - } - - /** - * Constructor allowing you to treat an already existing KB object - * as a KBFile knowledge source. Use it sparingly, because the - * standard way to create components is via - * {@link org.dllearner.core.ComponentManager}. - * - * @param kb A KB object. - */ - public KBFile(KB kb) { - this.kb = kb; - } - - public static Collection<org.dllearner.core.options.ConfigOption<?>> createConfigOptions() { - Collection<org.dllearner.core.options.ConfigOption<?>> options = new LinkedList<org.dllearner.core.options.ConfigOption<?>>(); + private OWLOntology owlOntology; + + /** + * Default constructor (needed for reflection in ComponentManager). + */ + public KBFile() { + } + + /** + * Constructor allowing you to treat an already existing KB object + * as a KBFile knowledge source. Use it sparingly, because the + * standard way to create components is via + * {@link org.dllearner.core.ComponentManager}. + * + * @param kb A KB object. + */ + public KBFile(KB kb) { + this.kb = kb; + } + + public static Collection<org.dllearner.core.options.ConfigOption<?>> createConfigOptions() { + Collection<org.dllearner.core.options.ConfigOption<?>> options = new LinkedList<org.dllearner.core.options.ConfigOption<?>>(); // options.add(new StringConfigOption("filename", "pointer to the KB file on local file system",null, true, true)); - URLConfigOption urlOption = new URLConfigOption("url", "URL pointer to the KB file",null, false, true); - urlOption.setRefersToFile(true); - options.add(urlOption); - return options; - } - - public static String getName() { - return "KB file"; - } - + URLConfigOption urlOption = new URLConfigOption("url", "URL pointer to the KB file", null, false, true); + urlOption.setRefersToFile(true); + options.add(urlOption); + return options; + } + + public static String getName() { + return "KB file"; + } + @Override public void init() throws ComponentInitException { try { @@ -106,6 +112,7 @@ kb = KBParser.parseKBFile(f); } + owlOntology = createOWLOntology(kb); logger.trace("KB File " + getUrl() + " parsed successfully."); } else { throw new ComponentInitException("No URL option or kb object given. Cannot initialise KBFile component."); @@ -113,46 +120,69 @@ } catch (ParseException e) { throw new ComponentInitException("KB file " + getUrl() + " could not be parsed correctly.", e); - }catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { throw new ComponentInitException("KB file " + getUrl() + " could not be found.", e); } catch (URISyntaxException e) { - throw new ComponentInitException("KB file " + getUrl() + " could not be found.", e); - } + throw new ComponentInitException("KB file " + getUrl() + " could not be found.", e); + } } - /* - * (non-Javadoc) - * - * @see org.dllearner.core.KnowledgeSource#toDIG() - */ - @Override - public String toDIG(URI kbURI) { - return DIGConverter.getDIGString(kb, kbURI).toString(); - } - - @Override - public String toString() { - if(kb==null) - return "KB file (not initialised)"; - else - return kb.toString(); - } - - @Override - public void export(File file, org.dllearner.core.OntologyFormat format){ - kb.export(file, format); - } - - public String getUrl() { - return url; - } + /** + * Create the OWL Ontology. + * + * @param kb The kb to create the ontology on top of. + * @return The OWL Ontology + */ + private OWLOntology createOWLOntology(KB kb) { + //This call is potentially dangerous in a multi-threaded(web) environment - I believe it returns a singleton instance + // There are ways around this, but getting it to work single threaded first. + OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + IRI ontologyURI = IRI.create("http://example.com"); + OWLOntology ontology; + try { + ontology = manager.createOntology(ontologyURI); + OWLAPIAxiomConvertVisitor.fillOWLOntology(manager, ontology, kb); - @Override - public KB toKB() { - return kb; - } + } catch (OWLOntologyCreationException e) { + throw new RuntimeException(e); + } + return ontology; + } + /* + * (non-Javadoc) + * + * @see org.dllearner.core.KnowledgeSource#toDIG() + */ + @Override + public String toDIG(URI kbURI) { + return DIGConverter.getDIGString(kb, kbURI).toString(); + } + + @Override + public String toString() { + if (kb == null) + return "KB file (not initialised)"; + else + return kb.toString(); + } + + @Override + public void export(File file, org.dllearner.core.OntologyFormat format) { + kb.export(file, format); + } + + public String getUrl() { + return url; + } + + @Override + public KB toKB() { + return kb; + } + + public void setUrl(String url) { this.url = url; } @@ -165,11 +195,16 @@ this.baseDir = baseDir; } - public String getFileName() { - return fileName; - } + public String getFileName() { + return fileName; + } - public void setFileName(String fileName) { - this.fileName = fileName; - } + public void setFileName(String fileName) { + this.fileName = fileName; + } + + @Override + public OWLOntology getOWLOntology() { + return owlOntology; + } } Added: trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java 2012-03-12 02:14:08 UTC (rev 3607) @@ -0,0 +1,22 @@ +package org.dllearner.kb; + +import org.semanticweb.owlapi.model.OWLOntology; + +/** + * Created by IntelliJ IDEA. + * User: Chris Shellenbarger + * Date: 3/11/12 + * Time: 6:36 PM + * + * This interface represents objects which can return an OWLOntology representation of itself. + */ +public interface OWLOntologyKnowledgeSource { + + + /** + * Get the OWL Ontology that this object represents. + * + * @return The OWL ontology that this object represents. + */ + public OWLOntology getOWLOntology(); +} Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-03-09 09:19:31 UTC (rev 3606) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-03-12 02:14:08 UTC (rev 3607) @@ -30,6 +30,7 @@ import org.dllearner.core.owl.*; import org.dllearner.kb.OWLAPIOntology; import org.dllearner.kb.OWLFile; +import org.dllearner.kb.OWLOntologyKnowledgeSource; import org.dllearner.kb.sparql.SparqlKnowledgeSource; import org.dllearner.utilities.owl.*; import org.semanticweb.HermiT.Reasoner.ReasonerFactory; @@ -209,17 +210,25 @@ // all other sources are converted to KB and then to an // OWL API ontology } else { + + //KB Files KB kb = source.toKB(); + + if(source instanceof OWLOntologyKnowledgeSource){ + ontology = ((OWLOntologyKnowledgeSource) source).getOWLOntology(); + } else { + // System.out.println(kb.toString(null,null)); - IRI ontologyURI = IRI.create("http://example.com"); - ontology = null; - try { - ontology = manager.createOntology(ontologyURI); - } catch (OWLOntologyCreationException e) { - throw new RuntimeException(e); + IRI ontologyURI = IRI.create("http://example.com"); + ontology = null; + try { + ontology = manager.createOntology(ontologyURI); + } catch (OWLOntologyCreationException e) { + throw new RuntimeException(e); + } + OWLAPIAxiomConvertVisitor.fillOWLOntology(manager, ontology, kb); } - OWLAPIAxiomConvertVisitor.fillOWLOntology(manager, ontology, kb); owlAPIOntologies.add(ontology); allImports.add(ontology); atomicConcepts.addAll(kb.findAllAtomicConcepts()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sha...@us...> - 2012-03-12 04:28:29
|
Revision: 3608 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3608&view=rev Author: shadowtm Date: 2012-03-12 04:28:22 +0000 (Mon, 12 Mar 2012) Log Message: ----------- Modified interface to require the passing in of the OWL Manager so that a common manager instance could be used for OWLFiles and KBFiles. This will assist with multithreading in a threaded environment (webserver). Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java trunk/components-core/src/main/java/org/dllearner/kb/OWLFile.java trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java 2012-03-12 02:14:08 UTC (rev 3607) +++ trunk/components-core/src/main/java/org/dllearner/kb/KBFile.java 2012-03-12 04:28:22 UTC (rev 3608) @@ -64,7 +64,6 @@ @ConfigOption(name = "fileName", description = "relative or absolute path to KB file") private String fileName; - private OWLOntology owlOntology; /** * Default constructor (needed for reflection in ComponentManager). @@ -112,7 +111,6 @@ kb = KBParser.parseKBFile(f); } - owlOntology = createOWLOntology(kb); logger.trace("KB File " + getUrl() + " parsed successfully."); } else { throw new ComponentInitException("No URL option or kb object given. Cannot initialise KBFile component."); @@ -127,16 +125,9 @@ } } - /** - * Create the OWL Ontology. - * - * @param kb The kb to create the ontology on top of. - * @return The OWL Ontology - */ - private OWLOntology createOWLOntology(KB kb) { - //This call is potentially dangerous in a multi-threaded(web) environment - I believe it returns a singleton instance - // There are ways around this, but getting it to work single threaded first. - OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + @Override + public OWLOntology createOWLOntology(OWLOntologyManager manager) { + IRI ontologyURI = IRI.create("http://example.com"); OWLOntology ontology; try { @@ -151,10 +142,10 @@ } /* - * (non-Javadoc) - * - * @see org.dllearner.core.KnowledgeSource#toDIG() - */ + * (non-Javadoc) + * + * @see org.dllearner.core.KnowledgeSource#toDIG() + */ @Override public String toDIG(URI kbURI) { return DIGConverter.getDIGString(kb, kbURI).toString(); @@ -202,9 +193,4 @@ public void setFileName(String fileName) { this.fileName = fileName; } - - @Override - public OWLOntology getOWLOntology() { - return owlOntology; - } } Modified: trunk/components-core/src/main/java/org/dllearner/kb/OWLFile.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/OWLFile.java 2012-03-12 02:14:08 UTC (rev 3607) +++ trunk/components-core/src/main/java/org/dllearner/kb/OWLFile.java 2012-03-12 04:28:22 UTC (rev 3608) @@ -22,6 +22,7 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.Collection; import java.util.LinkedList; @@ -33,7 +34,6 @@ import org.dllearner.core.ComponentInitException; import org.dllearner.core.OntologyFormat; import org.dllearner.core.OntologyFormatUnsupportedException; -import org.dllearner.core.config.ListStringEditor; import org.dllearner.core.options.ConfigEntry; import org.dllearner.core.options.ConfigOption; import org.dllearner.core.options.InvalidConfigOptionValueException; @@ -41,6 +41,10 @@ import org.dllearner.core.owl.KB; import org.dllearner.reasoning.OWLAPIDIGConverter; import org.dllearner.utilities.URLencodeUTF8; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyCreationException; +import org.semanticweb.owlapi.model.OWLOntologyManager; /** * @author Jens Lehmann @@ -49,7 +53,7 @@ * SH: I added SPARQL capabilities. Either URL is set directly or the basedir and filename is set or the URL and the SPARQL query is set */ @ComponentAnn(name = "OWL File", shortName = "owlfile", version = 0.9) -public class OWLFile extends AbstractKnowledgeSource { +public class OWLFile extends AbstractKnowledgeSource implements OWLOntologyKnowledgeSource { private static Logger logger = Logger.getLogger(OWLFile.class); @@ -133,9 +137,22 @@ throw new RuntimeException(e); } } + } + @Override + public OWLOntology createOWLOntology(OWLOntologyManager manager) { + try { + OWLOntology ontology = manager.loadOntologyFromOntologyDocument(IRI.create(getURL().toURI())); + return ontology; + } catch (OWLOntologyCreationException e) { + throw new RuntimeException(e); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + /* * (non-Javadoc) * Modified: trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java 2012-03-12 02:14:08 UTC (rev 3607) +++ trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java 2012-03-12 04:28:22 UTC (rev 3608) @@ -1,6 +1,7 @@ package org.dllearner.kb; import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyManager; /** * Created by IntelliJ IDEA. @@ -12,11 +13,11 @@ */ public interface OWLOntologyKnowledgeSource { - /** - * Get the OWL Ontology that this object represents. + * Create an OWL Ontology associated with the specified manager. * - * @return The OWL ontology that this object represents. + * @param manager The manager to associate the new ontology with. + * @return The result ontology */ - public OWLOntology getOWLOntology(); + public OWLOntology createOWLOntology(OWLOntologyManager manager); } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-03-12 02:14:08 UTC (rev 3607) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-03-12 04:28:22 UTC (rev 3608) @@ -46,7 +46,6 @@ import java.io.File; import java.net.URI; -import java.net.URISyntaxException; import java.net.URL; import java.util.*; import java.util.Map.Entry; @@ -153,25 +152,23 @@ for (AbstractKnowledgeSource source : sources) { + if (source instanceof OWLOntologyKnowledgeSource) { + ontology = ((OWLOntologyKnowledgeSource) source).createOWLOntology(manager); + owlAPIOntologies.add(ontology); + } + if (source instanceof OWLFile || source instanceof SparqlKnowledgeSource || source instanceof OWLAPIOntology) { - URL url = null; - if (source instanceof OWLFile) { - url = ((OWLFile) source).getURL(); - } - try { - if (source instanceof OWLAPIOntology) { ontology = ((OWLAPIOntology) source).getOWLOntolgy(); manager = ontology.getOWLOntologyManager(); + owlAPIOntologies.add(ontology); } else if (source instanceof SparqlKnowledgeSource) { ontology = ((SparqlKnowledgeSource) source).getOWLAPIOntology(); manager = ontology.getOWLOntologyManager(); - } else { - ontology = manager.loadOntologyFromOntologyDocument(IRI.create(url.toURI())); + owlAPIOntologies.add(ontology); } - owlAPIOntologies.add(ontology); directImports.addAll(ontology.getImportsDeclarations()); try { // imports includes the ontology itself @@ -180,33 +177,28 @@ allImports.addAll(imports); // System.out.println(imports); - for (OWLOntology ont : imports) { - classes.addAll(ont.getClassesInSignature()); - owlObjectProperties.addAll(ont.getObjectPropertiesInSignature()); - owlDatatypeProperties.addAll(ont.getDataPropertiesInSignature()); - owlIndividuals.addAll(ont.getIndividualsInSignature()); - } - - } catch (UnknownOWLOntologyException uooe) { - logger.error("UnknownOWLOntologyException occured, imports were not loaded! This is a bug, which has not been fixed yet."); + for (OWLOntology ont : imports) { + classes.addAll(ont.getClassesInSignature()); + owlObjectProperties.addAll(ont.getObjectPropertiesInSignature()); + owlDatatypeProperties.addAll(ont.getDataPropertiesInSignature()); + owlIndividuals.addAll(ont.getIndividualsInSignature()); } - // if several knowledge sources are included, then we can only - // guarantee that the base URI is from one of those sources (there - // can't be more than one); but we will take care that all prefixes are - // correctly imported - OWLOntologyFormat format = manager.getOntologyFormat(ontology); - if (format instanceof PrefixOWLOntologyFormat) { - prefixes.putAll(((PrefixOWLOntologyFormat) format).getPrefixName2PrefixMap()); - baseURI = ((PrefixOWLOntologyFormat) format).getDefaultPrefix(); - prefixes.remove(""); - } + } catch (UnknownOWLOntologyException uooe) { + logger.error("UnknownOWLOntologyException occured, imports were not loaded! This is a bug, which has not been fixed yet."); + } - } catch (OWLOntologyCreationException e) { - throw new RuntimeException(e); - } catch (URISyntaxException e) { - throw new RuntimeException(e); + // if several knowledge sources are included, then we can only + // guarantee that the base URI is from one of those sources (there + // can't be more than one); but we will take care that all prefixes are + // correctly imported + OWLOntologyFormat format = manager.getOntologyFormat(ontology); + if (format instanceof PrefixOWLOntologyFormat) { + prefixes.putAll(((PrefixOWLOntologyFormat) format).getPrefixName2PrefixMap()); + baseURI = ((PrefixOWLOntologyFormat) format).getDefaultPrefix(); + prefixes.remove(""); } + // all other sources are converted to KB and then to an // OWL API ontology } else { @@ -214,12 +206,8 @@ //KB Files KB kb = source.toKB(); - if(source instanceof OWLOntologyKnowledgeSource){ - ontology = ((OWLOntologyKnowledgeSource) source).getOWLOntology(); - } else { - -// System.out.println(kb.toString(null,null)); - + if (!(source instanceof OWLOntologyKnowledgeSource)) { + //Not sure if this will ever get hit, but leaving in for backward compatibility. IRI ontologyURI = IRI.create("http://example.com"); ontology = null; try { @@ -228,8 +216,9 @@ throw new RuntimeException(e); } OWLAPIAxiomConvertVisitor.fillOWLOntology(manager, ontology, kb); + owlAPIOntologies.add(ontology); } - owlAPIOntologies.add(ontology); + allImports.add(ontology); atomicConcepts.addAll(kb.findAllAtomicConcepts()); atomicRoles.addAll(kb.findAllAtomicRoles()); @@ -238,6 +227,8 @@ } } try { + //The following line illustrates a problem with using different OWLOntologyManagers. This can manifest itself if we have multiple sources who were created with different manager instances. + //ontology = OWLManager.createOWLOntologyManager().createOntology(IRI.create("http://dl-learner/all"), new HashSet<OWLOntology>(owlAPIOntologies)); ontology = manager.createOntology(IRI.create("http://dl-learner/all"), new HashSet<OWLOntology>(owlAPIOntologies)); //we have to add all import declarations manually here, because this are no axioms List<OWLOntologyChange> addImports = new ArrayList<OWLOntologyChange>(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-04-30 09:04:18
|
Revision: 3669 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3669&view=rev Author: lorenz_b Date: 2012-04-30 09:04:11 +0000 (Mon, 30 Apr 2012) Log Message: ----------- Changed some queries. Set timeout to remaining execution time, so all algorithms should hopefully terminate after the given runtime independently from the endpoint runtime. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -97,7 +97,7 @@ while(newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> - query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -106,7 +106,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; + query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int symmetric = 0; @@ -128,7 +128,7 @@ } private void runSPARQL1_1_Mode(){ - String query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + String query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -137,7 +137,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; + query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int symmetric = 0; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -213,8 +213,9 @@ } public static void main(String[] args) throws Exception{ - DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(new SparqlEndpoint( - new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())));//.getEndpointDBpediaLiveAKSW())); + SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); +// endpoint = new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); + DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(endpoint));//.getEndpointDBpediaLiveAKSW())); l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/stateOfOrigin")); l.setMaxExecutionTimeInSeconds(10); l.init(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -116,7 +116,7 @@ offset += limit; - query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); } @@ -184,7 +184,7 @@ public static void main(String[] args) throws Exception{ EquivalentDataPropertyAxiomLearner l = new EquivalentDataPropertyAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW())); l.setPropertyToDescribe(new DatatypeProperty("http://dbpedia.org/ontology/birthDate")); - l.setMaxExecutionTimeInSeconds(100); + l.setMaxExecutionTimeInSeconds(10); l.init(); l.start(); System.out.println(l.getCurrentlyBestEvaluatedAxioms(5)); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -110,7 +110,7 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s1) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; + query = "SELECT (COUNT(DISTINCT ?o) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int notInverseFunctional = 1; @@ -148,7 +148,7 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s1) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; + query = "SELECT (COUNT(DISTINCT ?o) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int notInverseFunctional = 1; @@ -168,8 +168,7 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint( - new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW()); InverseFunctionalObjectPropertyAxiomLearner l = new InverseFunctionalObjectPropertyAxiomLearner(ks); l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/profession")); l.setMaxExecutionTimeInSeconds(10); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -96,7 +96,7 @@ while(newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> - query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -106,7 +106,7 @@ total = qs.getLiteral("total").getInt(); } - query = String.format("SELECT ?p (COUNT(?s) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); + query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); rs = executeSelectQuery(query); while(rs.hasNext()){ qs = rs.next(); @@ -121,7 +121,7 @@ } private void runSPARQL1_1_Mode(){ - String query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + String query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -131,7 +131,7 @@ total = qs.getLiteral("total").getInt(); } - query = String.format("SELECT ?p (COUNT(?s) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); + query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); rs = executeSelectQuery(query); while(rs.hasNext()){ qs = rs.next(); @@ -146,14 +146,10 @@ SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint( new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList()));//.getEndpointDBpediaLiveAKSW())); - SPARQLReasoner reasoner = new SPARQLReasoner(ks); - reasoner.prepareSubsumptionHierarchy(); - InverseObjectPropertyAxiomLearner l = new InverseObjectPropertyAxiomLearner(ks); - l.setReasoner(reasoner); l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/officialLanguage")); - l.setMaxExecutionTimeInSeconds(10); + l.setMaxExecutionTimeInSeconds(100); // l.setReturnOnlyNewAxioms(true); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -97,7 +97,7 @@ while(newModel.size() != 0){ model.add(newModel); // get fraction of instances s with <s p s> - query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -106,7 +106,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?reflexive) WHERE {?s <%s> ?s.}"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?reflexive) WHERE {?s <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int reflexive = 0; @@ -130,7 +130,7 @@ private void runSPARQL1_1_Mode() { // get fraction of instances s with <s p s> - String query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + String query = "SELECT (COUNT(DISTINCT ?s) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -139,7 +139,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?reflexive) WHERE {?s <%s> ?s.}"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?reflexive) WHERE {?s <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int reflexive = 0; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -96,7 +96,7 @@ while(newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> - query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -105,7 +105,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s}"; + query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int symmetric = 0; @@ -127,7 +127,7 @@ } private void runSPARQL1_1_Mode(){ - String query = "SELECT (COUNT(?s) AS ?total) WHERE {?s <%s> ?o.}"; + String query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -136,7 +136,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?s) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s}"; + query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int symmetric = 0; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -98,7 +98,7 @@ while(newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> - query = "SELECT (COUNT(?o) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; + query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -107,7 +107,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?o) AS ?transitive) WHERE {?s <%s> ?o. ?o <%s> ?o1. ?s <%s> ?o1.}"; + query = "SELECT (COUNT(*) AS ?transitive) WHERE {?s <%s> ?o. ?o <%s> ?o1. ?s <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int transitive = 0; @@ -128,7 +128,7 @@ } private void runSPARQL1_1_Mode(){ - String query = "SELECT (COUNT(?o) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; + String query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); QuerySolution qs; @@ -137,7 +137,7 @@ qs = rs.next(); total = qs.getLiteral("total").getInt(); } - query = "SELECT (COUNT(?o) AS ?transitive) WHERE {?s <%s> ?o. ?o <%s> ?o1. ?s <%s> ?o1.}"; + query = "SELECT (COUNT(*) AS ?transitive) WHERE {?s <%s> ?o. ?o <%s> ?o1. ?s <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); int transitive = 0; Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-04-29 18:39:37 UTC (rev 3668) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-04-30 09:04:11 UTC (rev 3669) @@ -19,6 +19,7 @@ package org.dllearner.core; +import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -53,7 +54,10 @@ import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; +import com.hp.hpl.jena.sparql.engine.http.QueryExceptionHTTP; +import com.hp.hpl.jena.sparql.resultset.ResultSetMem; import com.hp.hpl.jena.util.iterator.Filter; import com.hp.hpl.jena.vocabulary.OWL2; import com.hp.hpl.jena.vocabulary.RDF; @@ -221,10 +225,19 @@ SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), query); - queryExecution.setTimeout(maxExecutionTimeInSeconds * 1000); + queryExecution.setTimeout(getRemainingRuntimeInMilliSeconds()); queryExecution.setDefaultGraphURIs(endpoint.getDefaultGraphURIs()); queryExecution.setNamedGraphURIs(endpoint.getNamedGraphURIs()); - return queryExecution.execConstruct(); + try { + return queryExecution.execConstruct(); + } catch (QueryExceptionHTTP e) { + if(e.getCause() instanceof SocketTimeoutException){ + logger.warn("Got timeout", e); + } else { + logger.error("Exception executing query", e); + } + return ModelFactory.createDefaultModel(); + } } else { QueryExecution qexec = QueryExecutionFactory.create(query, ((LocalModelBasedSparqlEndpointKS)ks).getModel()); return qexec.execConstruct(); @@ -237,10 +250,19 @@ SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), query); - queryExecution.setTimeout(maxExecutionTimeInSeconds * 1000); + queryExecution.setTimeout(getRemainingRuntimeInMilliSeconds()); queryExecution.setDefaultGraphURIs(endpoint.getDefaultGraphURIs()); queryExecution.setNamedGraphURIs(endpoint.getNamedGraphURIs()); - return queryExecution.execSelect(); + try { + return queryExecution.execSelect(); + } catch (QueryExceptionHTTP e) { + if(e.getCause() instanceof SocketTimeoutException){ + logger.warn("Got timeout", e); + } else { + logger.error("Exception executing query", e); + } + return new ResultSetMem(); + } } else { return executeSelectQuery(query, ((LocalModelBasedSparqlEndpointKS)ks).getModel()); } @@ -280,8 +302,12 @@ return entries; } + private long getRemainingRuntimeInMilliSeconds(){ + return Math.max(0, (maxExecutionTimeInSeconds * 1000) - (System.currentTimeMillis() - startTime)); + } + protected boolean terminationCriteriaSatisfied(){ - boolean timeLimitExceeded = maxExecutionTimeInSeconds == 0 ? false : (System.currentTimeMillis() - startTime) >= maxExecutionTimeInSeconds * 1000; + boolean timeLimitExceeded = maxExecutionTimeInSeconds == 0 ? false : getRemainingRuntimeInMilliSeconds() <= 0; boolean resultLimitExceeded = maxFetchedRows == 0 ? false : fetchedRows >= maxFetchedRows; return timeLimitExceeded || resultLimitExceeded; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-05-02 15:25:24
|
Revision: 3675 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3675&view=rev Author: lorenz_b Date: 2012-05-02 14:52:45 +0000 (Wed, 02 May 2012) Log Message: ----------- Refactored measure for disjointness. Added popularity precomputation for classes. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/SPARQLTasks.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-02 09:26:50 UTC (rev 3674) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-02 14:52:45 UTC (rev 3675) @@ -21,6 +21,7 @@ import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -44,6 +45,7 @@ import org.dllearner.core.owl.NamedClass; import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; +import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.learningproblems.AxiomScore; import org.dllearner.learningproblems.Heuristics; import org.slf4j.Logger; @@ -84,6 +86,8 @@ private Set<NamedClass> allClasses; + private int popularity; + public DisjointClassesLearner(SparqlEndpointKS ks){ this.ks = ks; } @@ -119,9 +123,13 @@ fetchedRows = 0; currentlyBestEvaluatedDescriptions = new ArrayList<EvaluatedDescription>(); - //TODO + //we return here if the class contains no instances + popularity = reasoner.getPopularity(classToDescribe); + if(popularity == 0){ + return; + } - //at first get all existing classes in knowledgebase + //at first get all existing classes in knowledge base allClasses = getAllClasses(); allClasses.remove(classToDescribe); @@ -316,17 +324,24 @@ //firstly, create disjoint classexpressions which not occur and give score of 1 for(NamedClass cls : completeDisjointclasses){ if(useClassPopularity){ - int popularity = 0; + int overlap = 0; + int pop; if(ks.isRemote()){ - popularity = reasoner.getIndividualsCount(cls); + pop = reasoner.getPopularity(cls); } else { - popularity = ((LocalModelBasedSparqlEndpointKS)ks).getModel().getOntClass(cls.getName()).listInstances().toSet().size(); + pop = ((LocalModelBasedSparqlEndpointKS)ks).getModel().getOntClass(cls.getName()).listInstances().toSet().size(); } //we skip classes with no instances - if(popularity == 0) continue; - double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(popularity, 0); - double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2; - evalDesc = new EvaluatedDescription(cls, new AxiomScore(1- accuracy)); + if(pop == 0) continue; + + //we compute the estimated precision + double precision = accuracy(pop, overlap); + //we compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalDesc = new EvaluatedDescription(cls, new AxiomScore(score)); } else { evalDesc = new EvaluatedDescription(cls, new AxiomScore(1)); } @@ -335,23 +350,51 @@ } //secondly, create disjoint classexpressions with score 1 - (#occurence/#all) - for(Entry<NamedClass, Integer> entry : sortByValues(class2Count)){ - //drop classes from OWL and RDF namespace - if(entry.getKey().getName().startsWith(OWL2.getURI()) || entry.getKey().getName().startsWith(RDF.getURI()))continue; -// evalDesc = new EvaluatedDescription(entry.getKey(), -// new AxiomScore(1 - (entry.getValue() / (double)all))); - double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(total, entry.getValue()); - double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2; - evalDesc = new EvaluatedDescription(entry.getKey(), - new AxiomScore(1 - accuracy)); - evalDescs.add(evalDesc); + for (Entry<NamedClass, Integer> entry : sortByValues(class2Count)) { + NamedClass cls = entry.getKey(); + // drop classes from OWL and RDF namespace + if (cls.getName().startsWith(OWL2.getURI()) || cls.getName().startsWith(RDF.getURI())) + continue; + if (useClassPopularity) { + int overlap = entry.getValue(); + int pop; + if (ks.isRemote()) { + pop = reasoner.getPopularity(cls); + } else { + pop = ((LocalModelBasedSparqlEndpointKS) ks).getModel() + .getOntClass(cls.getName()).listInstances().toSet() + .size(); + } + // we skip classes with no instances + if (pop == 0) + continue; + + // we compute the estimated precision + double precision = accuracy(pop, overlap); + // we compute the estimated recall + double recall = accuracy(popularity, overlap); + // compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalDesc = new EvaluatedDescription(cls, new AxiomScore(score)); + } else { + evalDesc = new EvaluatedDescription(cls, new AxiomScore(1)); + } } class2Count.put(classToDescribe, total); return evalDescs; } + private double accuracy(int total, int success){ + double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(total, success); + return (confidenceInterval[0] + confidenceInterval[1]) / 2; + } + private double fMEasure(double precision, double recall){ + return 2 * precision * recall / (precision + recall); + } + private void keepMostGeneralClasses(Set<NamedClass> classes){ if(ks.isRemote()){ if(reasoner.isPrepared()){ @@ -384,12 +427,14 @@ } public static void main(String[] args) throws Exception{ -// SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); - SparqlEndpointKS ks = new LocalModelBasedSparqlEndpointKS(new URL("http://dl-learner.svn.sourceforge.net/viewvc/dl-learner/trunk/examples/swore/swore.rdf?revision=2217")); + SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); + ks = new LocalModelBasedSparqlEndpointKS(new URL("http://dl-learner.svn.sourceforge.net/viewvc/dl-learner/trunk/examples/swore/swore.rdf?revision=2217")); + ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW()); DisjointClassesLearner l = new DisjointClassesLearner(ks); - l.setClassToDescribe(new NamedClass("http://ns.softwiki.de/req/CustomerRequirement")); + l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/Book")); l.init(); -// l.getReasoner().prepareSubsumptionHierarchy(); + l.getReasoner().prepareSubsumptionHierarchy(); + l.getReasoner().precomputeClassPopularity(); // System.out.println(l.getReasoner().getClassHierarchy().getSubClasses(new NamedClass("http://dbpedia.org/ontology/Athlete"), false));System.exit(0); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/SPARQLTasks.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/SPARQLTasks.java 2012-05-02 09:26:50 UTC (rev 3674) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/SPARQLTasks.java 2012-05-02 14:52:45 UTC (rev 3675) @@ -702,6 +702,10 @@ public Set<NamedClass> getAllClasses() { Set<NamedClass> classes = new TreeSet<NamedClass>(); String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?c WHERE {?c a owl:Class} LIMIT 1000"; + /* + * String query = "PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> " + + "SELECT ?c WHERE {{?c a owl:Class} UNION {?c rdfs:subClassOf ?d} UNION {?d rdfs:subClassOf ?c}} LIMIT 1000"; + */ SparqlQuery sq = new SparqlQuery(query, sparqlEndpoint); ResultSet q = sq.send(false); while (q.hasNext()) { Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-02 09:26:50 UTC (rev 3674) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-02 14:52:45 UTC (rev 3675) @@ -93,7 +93,9 @@ private ClassHierarchy hierarchy; private OntModel model; + private Map<NamedClass, Integer> classPopularityMap; + public SPARQLReasoner(SparqlEndpointKS ks) { this.ks = ks; @@ -111,6 +113,36 @@ this.model = model; } + public void precomputeClassPopularity(){ + logger.info("Precomputing class popularity ..."); + classPopularityMap = new HashMap<NamedClass, Integer>(); + + Set<NamedClass> classes = new SPARQLTasks(ks.getEndpoint()).getAllClasses(); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s a <%s>}"; + + ResultSet rs; + for(NamedClass nc : classes){ + rs = executeSelectQuery(String.format(queryTemplate, nc.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + classPopularityMap.put(nc, cnt); + } + } + + public int getPopularity(NamedClass nc){ + if(classPopularityMap.containsKey(nc)){ + return classPopularityMap.get(nc); + } else { + System.out.println("Cache miss: " + nc); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s a <%s>}"; + + ResultSet rs = executeSelectQuery(String.format(queryTemplate, nc.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + classPopularityMap.put(nc, cnt); + return cnt; + } + + } + public final ClassHierarchy prepareSubsumptionHierarchy() { logger.info("Preparing subsumption hierarchy ..."); long startTime = System.currentTimeMillis(); @@ -915,6 +947,10 @@ this.cache = cache; } + public void setUseCache(boolean useCache) { + this.useCache = useCache; + } + private boolean executeAskQuery(String query){ boolean ret; if(ks.isRemote()){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ku...@us...> - 2012-05-03 14:32:07
|
Revision: 3682 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3682&view=rev Author: kurzum Date: 2012-05-03 14:31:56 +0000 (Thu, 03 May 2012) Log Message: ----------- missing examples in kb do not throw exception any more Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/learningproblems/PosNegLP.java trunk/components-core/src/main/java/org/dllearner/utilities/analyse/TypeOntology.java Modified: trunk/components-core/src/main/java/org/dllearner/learningproblems/PosNegLP.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/learningproblems/PosNegLP.java 2012-05-03 11:42:24 UTC (rev 3681) +++ trunk/components-core/src/main/java/org/dllearner/learningproblems/PosNegLP.java 2012-05-03 14:31:56 UTC (rev 3682) @@ -24,6 +24,7 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.log4j.Logger; import org.dllearner.core.AbstractLearningProblem; import org.dllearner.core.AbstractReasonerComponent; import org.dllearner.core.ComponentInitException; @@ -41,7 +42,8 @@ * */ public abstract class PosNegLP extends AbstractLearningProblem { - + private static Logger logger = Logger.getLogger(PosNegLP.class); + protected Set<Individual> positiveExamples = new TreeSet<Individual>(); protected Set<Individual> negativeExamples = new TreeSet<Individual>(); protected Set<Individual> allExamples = new TreeSet<Individual>(); @@ -114,10 +116,18 @@ allExamples = Helper.union(positiveExamples, negativeExamples); if(!reasoner.getIndividuals().containsAll(allExamples)) { - String str = "The examples below are not contained in the knowledge base (check spelling and prefixes)\n"; - Set<Individual> inds = Helper.difference(allExamples, reasoner.getIndividuals()); - str += inds.toString(); - throw new ComponentInitException(str); + Set<Individual> missing = Helper.difference(allExamples, reasoner.getIndividuals()); + double percentage = (double) (missing.size()/allExamples.size()); + percentage = Math.round(percentage * 1000) / 1000 ; + String str = "The examples ("+percentage+" % of total) below are not contained in the knowledge base (check spelling and prefixes)\n"; + str += missing.toString(); + if(missing.size()==allExamples.size()) { + throw new ComponentInitException(str); + } if(percentage < 0.10) { + logger.warn(str); + } else { + logger.error(str); + } } } Modified: trunk/components-core/src/main/java/org/dllearner/utilities/analyse/TypeOntology.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/analyse/TypeOntology.java 2012-05-03 11:42:24 UTC (rev 3681) +++ trunk/components-core/src/main/java/org/dllearner/utilities/analyse/TypeOntology.java 2012-05-03 14:31:56 UTC (rev 3682) @@ -33,7 +33,8 @@ Set<String> individuals = new HashSet<String>(); Set<Triple> triples = model.getGraph().find(Triple.ANY).toSet(); - ExtendedIterator<OntClass> itClass = model.listClasses(); + + ExtendedIterator<OntClass> itClass = model.listNamedClasses(); while (itClass.hasNext()) { classes.add(itClass.next().getURI()); } @@ -58,7 +59,7 @@ String sUri; String pUri; String oUri; - System.out.println(individuals); + //System.out.println(individuals); // foreach triple in the model for (Triple triple : triples) { @@ -72,16 +73,16 @@ // if subject is an Individual if (individuals.contains(sUri)) { - log.debug("Subject is an individuals {}",triple); + log.trace("Subject is an individual {}",triple); // if predicate is rdf:type if (pUri.equals(RDF.type.getURI())) { // if object is not in the list of class and not equals // owl:thing - if (!classes.contains(model.getResource(oUri)) + if (!classes.contains(oUri) && !oUri.equals(OWL.Thing.getURI())) { - model.getResource(oUri).addProperty(RDFS.subClassOf, OWL.Thing); + model.getResource(oUri).addProperty(RDF.type,OWL.Class); classes.add(oUri); changes++; log.debug("{} is a class",oUri); @@ -133,9 +134,16 @@ } // if subject is an owl:class } else if (classes.contains(sUri)) { - model.getResource(oUri).addProperty( - com.hp.hpl.jena.vocabulary.RDFS.subClassOf, OWL.Thing); - changes++; + log.trace("Subject is a class {}",triple); + + //TODO check this assumption + //if s is owl:class, then o is owl:class too ???? + if(!classes.contains(oUri) ){ + model.getResource(oUri).addProperty(RDF.type, OWL.Class); + classes.add(oUri); + log.debug("{} is a class",oUri); + changes++; + } } } return changes; @@ -156,11 +164,8 @@ } } // model.write(System.out); - int changes; - do{ - changes=this.addTypes(model); - } while(changes!=0); - + while(this.addTypes(model)!=0); + return model; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-05-03 14:42:43
|
Revision: 3683 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3683&view=rev Author: lorenz_b Date: 2012-05-03 14:42:31 +0000 (Thu, 03 May 2012) Log Message: ----------- Some improvements in algorithms. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyRangeAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubDataPropertyOfAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -210,7 +210,7 @@ private void runSPARQL1_1_Mode(){ int limit = 1000; int offset = 0; - String queryTemplate = "SELECT ?type (COUNT(?s) AS ?count) WHERE {?s a ?type." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?type (COUNT(?s) AS ?count) WHERE {?s a ?type. ?type a owl:Class" + "{SELECT ?s WHERE {?s a <%s>.} LIMIT %d OFFSET %d} " + "} GROUP BY ?type"; String query; @@ -220,7 +220,7 @@ boolean repeat = true; while(!terminationCriteriaSatisfied() && repeat){ - query = String.format(queryTemplate, classToDescribe, limit, offset); + query = String.format(queryTemplate, classToDescribe, limit, offset);System.out.println(query); ResultSet rs = executeSelectQuery(query); QuerySolution qs; repeat = false; @@ -350,8 +350,9 @@ } //secondly, create disjoint classexpressions with score 1 - (#occurence/#all) + NamedClass cls; for (Entry<NamedClass, Integer> entry : sortByValues(class2Count)) { - NamedClass cls = entry.getKey(); + cls = entry.getKey(); // drop classes from OWL and RDF namespace if (cls.getName().startsWith(OWL2.getURI()) || cls.getName().startsWith(RDF.getURI())) continue; @@ -386,15 +387,6 @@ return evalDescs; } - private double accuracy(int total, int success){ - double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(total, success); - return (confidenceInterval[0] + confidenceInterval[1]) / 2; - } - - private double fMEasure(double precision, double recall){ - return 2 * precision * recall / (precision + recall); - } - private void keepMostGeneralClasses(Set<NamedClass> classes){ if(ks.isRemote()){ if(reasoner.isPrepared()){ Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -170,7 +170,7 @@ boolean notEmpty = false; String query; if(ks.supportsSPARQL_1_1()){ - query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind a ?type. {SELECT ?ind {?ind a <%s>} LIMIT %d OFFSET %d}}", classToDescribe.getName(), limit, offset); + query = String.format("PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT DISTINCT ?ind ?type WHERE {?ind a ?type.?type a owl:Class. {SELECT ?ind {?ind a <%s>} LIMIT %d OFFSET %d}}", classToDescribe.getName(), limit, offset); } else { query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind a <%s>. ?ind a ?type} LIMIT %d OFFSET %d", classToDescribe.getName(), limit, offset); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -138,7 +138,7 @@ } private int addIndividualsWithTypes(Map<Individual, SortedSet<Description>> ind2Types, int limit, int offset){ - String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind <%s> ?o. ?ind a ?type} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); + String query = String.format("PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT DISTINCT ?ind ?type WHERE {?ind <%s> ?o. ?ind a ?type. ?type a owl:Class} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); // String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind a ?type. {SELECT ?ind {?ind <%s> ?o.} LIMIT %d OFFSET %d}}", propertyToDescribe.getName(), limit, offset); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.TreeSet; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -33,6 +34,7 @@ import org.dllearner.core.config.DataPropertyEditor; import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.DisjointDatatypePropertyAxiom; +import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SPARQLTasks; import org.dllearner.kb.sparql.SparqlEndpoint; @@ -44,6 +46,7 @@ import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; @ComponentAnn(name="disjoint dataproperty axiom learner", shortName="dpldisjoint", version=0.1) public class DisjointDataPropertyAxiomLearner extends AbstractAxiomLearningAlgorithm { @@ -55,6 +58,10 @@ private Set<DatatypeProperty> allDataProperties; + private boolean usePropertyPopularity = true; + + private int popularity; + public DisjointDataPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; } @@ -74,8 +81,14 @@ fetchedRows = 0; currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); - //TODO + // we return here if the class contains no instances + popularity = reasoner.getPopularity(propertyToDescribe); + if (popularity == 0) { + return; + } + //TODO detect existing axioms + //at first get all existing dataproperties in knowledgebase allDataProperties = new SPARQLTasks(ks.getEndpoint()).getAllDataProperties(); allDataProperties.remove(propertyToDescribe); @@ -132,7 +145,7 @@ //get properties and how often they occur int limit = 1000; int offset = 0; - String queryTemplate = "SELECT ?p (COUNT(?s) as ?count) WHERE {?s ?p ?o." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p (COUNT(?s) as ?count) WHERE {?p a owl:DatatypeProperty. ?s ?p ?o." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; @@ -178,19 +191,62 @@ Integer all = property2Count.get(propertyToDescribe); property2Count.remove(propertyToDescribe); + //get complete disjoint properties + Set<DatatypeProperty> completeDisjointProperties = new TreeSet<DatatypeProperty>(allProperties); + completeDisjointProperties.removeAll(property2Count.keySet()); + EvaluatedAxiom evalAxiom; //first create disjoint axioms with properties which not occur and give score of 1 - for(DatatypeProperty p : allProperties){ - evalAxiom = new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, p), - new AxiomScore(1)); + for(DatatypeProperty p : completeDisjointProperties){ + if(usePropertyPopularity){ + int overlap = 0; + int pop; + if(ks.isRemote()){ + pop = reasoner.getPopularity(p); + } else { + Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); + pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + } + //we skip classes with no instances + if(pop == 0) continue; + + //we compute the estimated precision + double precision = accuracy(pop, overlap); + //we compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalAxiom = new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); + } else { + evalAxiom = new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, p), new AxiomScore(1)); + } axioms.add(evalAxiom); } //second create disjoint axioms with other properties and score 1 - (#occurence/#all) + DatatypeProperty p; for(Entry<DatatypeProperty, Integer> entry : sortByValues(property2Count)){ - evalAxiom = new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, entry.getKey()), - new AxiomScore(1 - (entry.getValue() / (double)all))); - axioms.add(evalAxiom); + p = entry.getKey(); + int overlap = entry.getValue(); + int pop; + if(ks.isRemote()){ + pop = reasoner.getPopularity(p); + } else { + Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); + pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + } + //we skip classes with no instances + if(pop == 0) continue; + + //we compute the estimated precision + double precision = accuracy(pop, overlap); + //we compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalAxiom = new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); } property2Count.put(propertyToDescribe, all); @@ -202,6 +258,7 @@ l.setPropertyToDescribe(new DatatypeProperty("http://dbpedia.org/ontology/position")); l.setMaxExecutionTimeInSeconds(20); l.init(); + l.getReasoner().precomputeDataPropertyPopularity(); l.start(); System.out.println(l.getCurrentlyBestEvaluatedAxioms(5)); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -19,9 +19,7 @@ package org.dllearner.algorithms.properties; -import java.net.URL; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,17 +30,15 @@ import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; import org.dllearner.core.EvaluatedAxiom; -import org.dllearner.core.EvaluatedDescription; import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.ObjectPropertyEditor; import org.dllearner.core.owl.DisjointObjectPropertyAxiom; -import org.dllearner.core.owl.FunctionalObjectPropertyAxiom; import org.dllearner.core.owl.ObjectProperty; +import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SPARQLTasks; import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.learningproblems.AxiomScore; -import org.dllearner.learningproblems.Heuristics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +46,7 @@ import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; @ComponentAnn(name="disjoint objectproperty axiom learner", shortName="opldisjoint", version=0.1) public class DisjointObjectPropertyAxiomLearner extends AbstractAxiomLearningAlgorithm { @@ -63,6 +60,8 @@ private boolean usePropertyPopularity = true; + private int popularity; + public DisjointObjectPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; } @@ -82,9 +81,16 @@ fetchedRows = 0; currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); + //we return here if the class contains no instances + popularity = reasoner.getPopularity(propertyToDescribe); + if(popularity == 0){ + return; + } + //TODO detect existing axioms - //at first get all existing objectproperties in knowledgebase + + //at first get all existing objectproperties in knowledge base allObjectProperties = new SPARQLTasks(ks.getEndpoint()).getAllObjectProperties(); allObjectProperties.remove(propertyToDescribe); @@ -139,7 +145,7 @@ private void runSPARQL1_1_Mode() { //get properties and how often they occur int offset = 0; - String queryTemplate = "SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p COUNT(?s) AS ?count WHERE {?p a owl:ObjectProperty. ?s ?p ?o." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; @@ -187,12 +193,25 @@ //first create disjoint axioms with properties which not occur and give score of 1 for(ObjectProperty p : completeDisjointProperties){ if(usePropertyPopularity){ - int popularity = reasoner.getPropertyCount(p); - //skip if property is not used in kb - if(popularity == 0) continue; - double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(popularity, 0); - double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2; - evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(1- accuracy)); + int overlap = 0; + int pop; + if(ks.isRemote()){ + pop = reasoner.getPopularity(p); + } else { + Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); + pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + } + //we skip classes with no instances + if(pop == 0) continue; + + //we compute the estimated precision + double precision = accuracy(pop, overlap); + //we compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); } else { evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(1)); } @@ -200,12 +219,28 @@ } //second create disjoint axioms with other properties and score 1 - (#occurence/#all) + ObjectProperty p; for(Entry<ObjectProperty, Integer> entry : sortByValues(property2Count)){ - double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(all, entry.getValue()); - double accuracy = (confidenceInterval[0] + confidenceInterval[1]) / 2;//System.out.println(entry + ": " + accuracy); - evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, entry.getKey()), - new AxiomScore(1 - accuracy)); - axioms.add(evalAxiom); + p = entry.getKey(); + int overlap = entry.getValue(); + int pop; + if(ks.isRemote()){ + pop = reasoner.getPopularity(p); + } else { + Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); + pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + } + //we skip classes with no instances + if(pop == 0) continue; + + //we compute the estimated precision + double precision = accuracy(pop, overlap); + //we compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); } property2Count.put(propertyToDescribe, all); @@ -216,9 +251,10 @@ SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); // endpoint = new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(endpoint));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/stateOfOrigin")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/birthPlace")); l.setMaxExecutionTimeInSeconds(10); l.init(); + l.getReasoner().precomputeObjectPropertyPopularity(); l.start(); for(EvaluatedAxiom ax : l.getCurrentlyBestEvaluatedAxioms(Integer.MAX_VALUE)){ System.out.println(ax); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -126,7 +126,7 @@ // get subjects with types int limit = 1000; int offset = 0; - String queryTemplate = "SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o." + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o.?p a owl:DatatypeProperty." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; Map<DatatypeProperty, Integer> result = new HashMap<DatatypeProperty, Integer>(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -129,7 +129,7 @@ private void runSPARQL1_1_Mode() { //get subjects with types int offset = 0; - String queryTemplate = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.?p a owl:ObjectProperty." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -139,7 +139,7 @@ } private int addIndividualsWithTypes(Map<Individual, SortedSet<Description>> ind2Types, int limit, int offset){ - String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind <%s> ?o. ?ind a ?type} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); + String query = String.format("PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT DISTINCT ?ind ?type WHERE {?ind <%s> ?o. ?ind a ?type. ?type a owl:Class} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); // String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind a ?type. {SELECT ?ind {?ind <%s> ?o.} LIMIT %d OFFSET %d}}", propertyToDescribe.getName(), limit, offset); @@ -176,7 +176,7 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql")));//.getEndpointDBpediaLiveAKSW())); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); SPARQLReasoner reasoner = new SPARQLReasoner(ks); reasoner.prepareSubsumptionHierarchy(); @@ -184,7 +184,7 @@ ObjectPropertyDomainAxiomLearner l = new ObjectPropertyDomainAxiomLearner(ks); l.setReasoner(reasoner); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/officialLanguage")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/Automobile/fuelCapacity")); l.setMaxExecutionTimeInSeconds(10); // l.setReturnOnlyNewAxioms(true); l.init(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyRangeAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyRangeAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyRangeAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -77,13 +77,13 @@ if(reasoner.isPrepared()){ //get existing ranges - Description existingDomain = reasoner.getRange(propertyToDescribe); - if(existingDomain != null){ - existingAxioms.add(new ObjectPropertyRangeAxiom(propertyToDescribe, existingDomain)); + Description existingRange = reasoner.getRange(propertyToDescribe); + if(existingRange != null){ + existingAxioms.add(new ObjectPropertyRangeAxiom(propertyToDescribe, existingRange)); if(reasoner.isPrepared()){ - if(reasoner.getClassHierarchy().contains(existingDomain)){ - for(Description sup : reasoner.getClassHierarchy().getSuperClasses(existingDomain)){ - existingAxioms.add(new ObjectPropertyRangeAxiom(propertyToDescribe, existingDomain)); + if(reasoner.getClassHierarchy().contains(existingRange)){ + for(Description sup : reasoner.getClassHierarchy().getSuperClasses(existingRange)){ + existingAxioms.add(new ObjectPropertyRangeAxiom(propertyToDescribe, existingRange)); logger.info("Existing range(inferred): " + sup); } } @@ -138,7 +138,7 @@ } private int addIndividualsWithTypes(Map<Individual, SortedSet<Description>> ind2Types, int limit, int offset){ - String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?s <%s> ?ind. ?ind a ?type.} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); + String query = String.format("PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT DISTINCT ?ind ?type WHERE {?s <%s> ?ind. ?ind a ?type. ?type a owl:Class} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); // String query = String.format("SELECT DISTINCT ?ind ?type WHERE {?ind a ?type. {SELECT ?ind {?ind <%s> ?o.} LIMIT %d OFFSET %d}}", propertyToDescribe.getName(), limit, offset); @@ -179,9 +179,9 @@ ObjectPropertyRangeAxiomLearner l = new ObjectPropertyRangeAxiomLearner(ks); l.setReasoner(reasoner); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/author")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/routeTypeAbbreviation")); l.setMaxExecutionTimeInSeconds(10); - l.setReturnOnlyNewAxioms(true); +// l.setReturnOnlyNewAxioms(true); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubDataPropertyOfAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubDataPropertyOfAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubDataPropertyOfAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -125,7 +125,7 @@ //get subjects with types int limit = 1000; int offset = 0; - String queryTemplate = "SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o.?p a owl:DatatypeProperty." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -125,7 +125,7 @@ //get subjects with types int limit = 1000; int offset = 0; - String queryTemplate = "SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o." + + String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o.?p a owl:ObjectProperty." + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; String query; @@ -135,7 +135,7 @@ boolean repeat = true; while(!terminationCriteriaSatisfied() && repeat){ - query = String.format(queryTemplate, propertyToDescribe, limit, offset); + query = String.format(queryTemplate, propertyToDescribe, limit, offset);System.out.println(query); ResultSet rs = executeSelectQuery(query); QuerySolution qs; repeat = false; @@ -177,7 +177,7 @@ } public static void main(String[] args) throws Exception{ - SubObjectPropertyOfAxiomLearner l = new SubObjectPropertyOfAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveOpenLink())); + SubObjectPropertyOfAxiomLearner l = new SubObjectPropertyOfAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia())); l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/writer")); l.setMaxExecutionTimeInSeconds(10); l.init(); Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -227,7 +227,7 @@ } protected Model executeConstructQuery(String query) { - logger.info("Sending query\n{} ...", query); + logger.debug("Sending query\n{} ...", query); if(ks.isRemote()){ SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), @@ -241,7 +241,7 @@ return model; } catch (QueryExceptionHTTP e) { if(e.getCause() instanceof SocketTimeoutException){ - logger.warn("Got timeout", e); + logger.warn("Got timeout"); } else { logger.error("Exception executing query", e); } @@ -254,7 +254,7 @@ } protected ResultSet executeSelectQuery(String query) { - logger.info("Sending query\n{} ...", query); + logger.debug("Sending query\n{} ...", query); if(ks.isRemote()){ SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), @@ -268,7 +268,7 @@ return rs; } catch (QueryExceptionHTTP e) { if(e.getCause() instanceof SocketTimeoutException){ - logger.warn("Got timeout", e); + logger.warn("Got timeout"); } else { logger.error("Exception executing query", e); } @@ -280,7 +280,7 @@ } protected ResultSet executeSelectQuery(String query, Model model) { - logger.info("Sending query on local model\n{} ...", query); + logger.debug("Sending query on local model\n{} ...", query); QueryExecution qexec = QueryExecutionFactory.create(query, model); ResultSet rs = qexec.execSelect();; @@ -366,6 +366,15 @@ return new AxiomScore(accuracy, confidence); } + protected double accuracy(int total, int success){ + double[] confidenceInterval = Heuristics.getConfidenceInterval95Wald(total, success); + return (confidenceInterval[0] + confidenceInterval[1]) / 2; + } + + protected double fMEasure(double precision, double recall){ + return 2 * precision * recall / (precision + recall); + } + class OWLFilter extends Filter<OntClass>{ @Override Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 14:31:56 UTC (rev 3682) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 14:42:31 UTC (rev 3683) @@ -94,6 +94,8 @@ private OntModel model; private Map<NamedClass, Integer> classPopularityMap; + private Map<ObjectProperty, Integer> objectPropertyPopularityMap; + private Map<DatatypeProperty, Integer> dataPropertyPopularityMap; public SPARQLReasoner(SparqlEndpointKS ks) { @@ -113,6 +115,12 @@ this.model = model; } + public void precomputePopularity(){ + precomputeClassPopularity(); + precomputeDataPropertyPopularity(); + precomputeObjectPropertyPopularity(); + } + public void precomputeClassPopularity(){ logger.info("Precomputing class popularity ..."); classPopularityMap = new HashMap<NamedClass, Integer>(); @@ -128,6 +136,36 @@ } } + public void precomputeObjectPropertyPopularity(){ + logger.info("Precomputing object property popularity ..."); + objectPropertyPopularityMap = new HashMap<ObjectProperty, Integer>(); + + Set<ObjectProperty> properties = new SPARQLTasks(ks.getEndpoint()).getAllObjectProperties(); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o}"; + + ResultSet rs; + for(ObjectProperty op : properties){ + rs = executeSelectQuery(String.format(queryTemplate, op.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + objectPropertyPopularityMap.put(op, cnt); + } + } + + public void precomputeDataPropertyPopularity(){ + logger.info("Precomputing data property popularity ..."); + dataPropertyPopularityMap = new HashMap<DatatypeProperty, Integer>(); + + Set<DatatypeProperty> properties = new SPARQLTasks(ks.getEndpoint()).getAllDataProperties(); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o}"; + + ResultSet rs; + for(DatatypeProperty dp : properties){ + rs = executeSelectQuery(String.format(queryTemplate, dp.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + dataPropertyPopularityMap.put(dp, cnt); + } + } + public int getPopularity(NamedClass nc){ if(classPopularityMap.containsKey(nc)){ return classPopularityMap.get(nc); @@ -143,6 +181,36 @@ } + public int getPopularity(ObjectProperty op){ + if(objectPropertyPopularityMap.containsKey(op)){ + return objectPropertyPopularityMap.get(op); + } else { + System.out.println("Cache miss: " + op); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o}"; + + ResultSet rs = executeSelectQuery(String.format(queryTemplate, op.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + objectPropertyPopularityMap.put(op, cnt); + return cnt; + } + + } + + public int getPopularity(DatatypeProperty dp){ + if(dataPropertyPopularityMap.containsKey(dp)){ + return dataPropertyPopularityMap.get(dp); + } else { + System.out.println("Cache miss: " + dp); + String queryTemplate = "SELECT (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o}"; + + ResultSet rs = executeSelectQuery(String.format(queryTemplate, dp.getName())); + int cnt = rs.next().getLiteral("cnt").getInt(); + dataPropertyPopularityMap.put(dp, cnt); + return cnt; + } + + } + public final ClassHierarchy prepareSubsumptionHierarchy() { logger.info("Preparing subsumption hierarchy ..."); long startTime = System.currentTimeMillis(); @@ -252,7 +320,7 @@ propertyCharacteristics.add(OWL2.AsymmetricProperty); for(Resource propChar : propertyCharacteristics){ - query = "CONSTRUCT {?s a <%s>} WHERE {?s a <%s>}".replaceAll("%s", propChar.getURI()); + query = "CONSTRUCT {?s a <%s>. ?s a <http://www.w3.org/2002/07/owl#ObjectProperty>} WHERE {?s a <%s>.}".replaceAll("%s", propChar.getURI()); model.add(loadIncrementally(query)); } //for functional properties we have to distinguish between data and object properties, @@ -914,7 +982,7 @@ } private ResultSet executeSelectQuery(String query){ - logger.info("Sending query \n {}", query); + logger.debug("Sending query \n {}", query); ResultSet rs = null; if(ks.isRemote()){ if(useCache){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-05-03 20:59:42
|
Revision: 3688 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3688&view=rev Author: lorenz_b Date: 2012-05-03 20:59:33 +0000 (Thu, 03 May 2012) Log Message: ----------- Additional termination criteria and option to force sparql 1.0 mode. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -174,7 +174,7 @@ Model newModel = executeConstructQuery(query); Map<NamedClass, Integer> result = new HashMap<NamedClass, Integer>(); NamedClass cls; - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); //get total number of distinct instances query = "SELECT (COUNT(DISTINCT ?s) AS ?count) WHERE {?s a ?type.}"; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -78,7 +78,7 @@ logger.info("Property is already declared as symmetric in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -94,7 +94,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -251,7 +251,7 @@ SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); // endpoint = new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(endpoint));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/birthPlace")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/aircraftTransport")); l.setMaxExecutionTimeInSeconds(10); l.init(); l.getReasoner().precomputeObjectPropertyPopularity(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -75,7 +75,7 @@ logger.info("Property is already declared as functional in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -91,7 +91,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = String.format( @@ -105,19 +105,19 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?notfunctional) WHERE {?s <%s> ?o. ?s <%s> ?o1. FILTER(?o != ?o1) }"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); - int notFunctional = 1; + int functional = 1; while (rs.hasNext()) { qs = rs.next(); - notFunctional = qs.getLiteral("notfunctional").getInt(); + functional = qs.getLiteral("functional").getInt(); } if (all > 0) { currentlyBestAxioms.clear(); currentlyBestAxioms.add(new EvaluatedAxiom( new FunctionalDatatypePropertyAxiom(propertyToDescribe), - computeScore(all, all - notFunctional), + computeScore(all, functional), declaredAsFunctional)); } @@ -140,18 +140,18 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?notfunctional) WHERE {?s <%s> ?o. ?s <%s> ?o1. FILTER(?o != ?o1) }"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query); - int notFunctional = 1; + int functional = 1; while (rs.hasNext()) { qs = rs.next(); - notFunctional = qs.getLiteral("notfunctional").getInt(); + functional = qs.getLiteral("functional").getInt(); } if (all > 0) { currentlyBestAxioms.add(new EvaluatedAxiom( new FunctionalDatatypePropertyAxiom(propertyToDescribe), - computeScore(all, all - notFunctional), + computeScore(all, functional), declaredAsFunctional)); } } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -76,7 +76,7 @@ logger.info("Property is already declared as functional in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -92,7 +92,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){System.out.println(query); model.add(newModel); // get number of instances of s with <s p o> query = String.format( @@ -105,20 +105,22 @@ qs = rs.next(); all = qs.getLiteral("all").getInt(); } + System.out.println(all); // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?notfunctional) WHERE {?s <%s> ?o. ?s <%s> ?o1. FILTER(?o != ?o1) }"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o2)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query, model); - int notFunctional = 1; + int functional = 1; while (rs.hasNext()) { qs = rs.next(); - notFunctional = qs.getLiteral("notfunctional").getInt(); + functional = qs.getLiteral("functional").getInt(); } + System.out.println(functional); if (all > 0) { currentlyBestAxioms.clear(); currentlyBestAxioms.add(new EvaluatedAxiom( new FunctionalObjectPropertyAxiom(propertyToDescribe), - computeScore(all, all - notFunctional), + computeScore(all, functional), declaredAsFunctional)); } offset += limit; @@ -129,37 +131,34 @@ private void runSPARQL1_1_Mode() { // get number of instances of s with <s p o> - String query = String.format( - "SELECT (COUNT(DISTINCT ?s) AS ?all) WHERE {?s <%s> ?o.}", - propertyToDescribe.getName()); - ResultSet rs = executeSelectQuery(query); - QuerySolution qs; - int all = 1; - while (rs.hasNext()) { - qs = rs.next(); - all = qs.getLiteral("all").getInt(); + int numberOfSubjects = reasoner.getSubjectCountForProperty(propertyToDescribe, getRemainingRuntimeInMilliSeconds()); + if(numberOfSubjects == -1){ + logger.warn("Early termination: Got timeout while counting number of distinct subjects for given property."); + return; } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?notfunctional) WHERE {?s <%s> ?o. ?s <%s> ?o1. FILTER(?o != ?o1) }"; + String query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o2)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); - int notFunctional = 1; + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + int functional = 1; while (rs.hasNext()) { qs = rs.next(); - notFunctional = qs.getLiteral("notfunctional").getInt(); + functional = qs.getLiteral("functional").getInt(); } - if (all > 0) { + if (numberOfSubjects > 0) { currentlyBestAxioms.add(new EvaluatedAxiom( new FunctionalObjectPropertyAxiom(propertyToDescribe), - computeScore(all, all - notFunctional), + computeScore(numberOfSubjects, functional), declaredAsFunctional)); } } public static void main(String[] args) throws Exception{ - FunctionalObjectPropertyAxiomLearner l = new FunctionalObjectPropertyAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/league")); + FunctionalObjectPropertyAxiomLearner l = new FunctionalObjectPropertyAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW())); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/wikiPageExternalLink")); l.setMaxExecutionTimeInSeconds(10); +// l.setForceSPARQL_1_0_Mode(true); l.init(); l.start(); System.out.println(l.getCurrentlyBestEvaluatedAxioms(5)); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -78,7 +78,7 @@ logger.info("Property is already declared as functional in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -96,7 +96,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = String.format( Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -77,7 +77,7 @@ } } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -90,15 +90,15 @@ Model model = ModelFactory.createDefaultModel(); int limit = 1000; int offset = 0; - String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; + String baseQuery = "CONSTRUCT {?s <%s> ?o. ?o ?p ?s} WHERE {?s <%s> ?o. OPTIONAL{?o ?p ?s. ?p a owl:ObjectProperty}} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int total = 0; while(rs.hasNext()){ @@ -107,7 +107,7 @@ } query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); while(rs.hasNext()){ qs = rs.next(); currentlyBestAxioms.add(new EvaluatedAxiom( @@ -131,7 +131,7 @@ total = qs.getLiteral("total").getInt(); } - query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s.} GROUP BY ?p", propertyToDescribe.getName()); + query = String.format("PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?o ?p ?s. ?p a owl:ObjectProperty} GROUP BY ?p", propertyToDescribe.getName()); rs = executeSelectQuery(query); while(rs.hasNext()){ qs = rs.next(); @@ -143,13 +143,12 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint( - new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList()));//.getEndpointDBpediaLiveAKSW())); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); - InverseObjectPropertyAxiomLearner l = new InverseObjectPropertyAxiomLearner(ks); l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/officialLanguage")); - l.setMaxExecutionTimeInSeconds(100); + l.setMaxExecutionTimeInSeconds(10); + l.setForceSPARQL_1_0_Mode(true); // l.setReturnOnlyNewAxioms(true); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -77,7 +77,7 @@ logger.info("Property is already declared as irreflexive in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -95,7 +95,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get all instance s with <s p o> query = String.format( Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -76,7 +76,7 @@ logger.info("Property is already declared as reflexive in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -94,7 +94,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get fraction of instances s with <s p s> query = "SELECT (COUNT(DISTINCT ?s) AS ?total) WHERE {?s <%s> ?o.}"; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -77,7 +77,7 @@ logger.info("Property is already declared as symmetric in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -93,7 +93,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -78,7 +78,7 @@ logger.info("Property is already declared as transitive in knowledge base."); } - if(ks.supportsSPARQL_1_1()){ + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ runSPARQL1_1_Mode(); } else { runSPARQL1_0_Mode(); @@ -95,7 +95,7 @@ String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - while(newModel.size() != 0){ + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ model.add(newModel); // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -89,8 +89,10 @@ protected long startTime; protected int limit = 1000; - private boolean timeout = true; + protected boolean timeout = true; + protected boolean forceSPARQL_1_0_Mode = false; + public AbstractAxiomLearningAlgorithm() { existingAxioms = new TreeSet<Axiom>(new AxiomComparator()); } @@ -137,6 +139,10 @@ public void setMaxFetchedRows(int maxFetchedRows) { this.maxFetchedRows = maxFetchedRows; } + + public void setForceSPARQL_1_0_Mode(boolean forceSPARQL_1_0_Mode) { + this.forceSPARQL_1_0_Mode = forceSPARQL_1_0_Mode; + } @Override public void start() { @@ -313,7 +319,7 @@ return entries; } - private long getRemainingRuntimeInMilliSeconds(){ + protected long getRemainingRuntimeInMilliSeconds(){ return Math.max(0, (maxExecutionTimeInSeconds * 1000) - (System.currentTimeMillis() - startTime)); } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 18:04:44 UTC (rev 3687) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 20:59:33 UTC (rev 3688) @@ -19,6 +19,7 @@ package org.dllearner.reasoning; +import java.net.SocketTimeoutException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -74,6 +75,8 @@ import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; +import com.hp.hpl.jena.sparql.engine.http.QueryExceptionHTTP; +import com.hp.hpl.jena.sparql.resultset.ResultSetMem; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.OWL2; import com.hp.hpl.jena.vocabulary.RDF; @@ -166,6 +169,19 @@ } } + public int getSubjectCountForProperty(ObjectProperty p, long timeout){ + int cnt = -1; + String query = String.format( + "SELECT (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s <%s> ?o.}", + p.getName()); + ResultSet rs = executeSelectQuery(query, timeout); + if(rs.hasNext()){ + cnt = rs.next().getLiteral("cnt").getInt(); + } + + return cnt; + } + public int getPopularity(NamedClass nc){ if(classPopularityMap.containsKey(nc)){ return classPopularityMap.get(nc); @@ -182,7 +198,7 @@ } public int getPopularity(ObjectProperty op){ - if(objectPropertyPopularityMap.containsKey(op)){ + if(objectPropertyPopularityMap != null && objectPropertyPopularityMap.containsKey(op)){ return objectPropertyPopularityMap.get(op); } else { System.out.println("Cache miss: " + op); @@ -1005,6 +1021,33 @@ return rs; } + private ResultSet executeSelectQuery(String query, long timeout){ + logger.debug("Sending query \n {}", query); + ResultSet rs = null; + if(ks.isRemote()){ + SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); + QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), + query); + queryExecution.setTimeout(timeout); + queryExecution.setDefaultGraphURIs(endpoint.getDefaultGraphURIs()); + queryExecution.setNamedGraphURIs(endpoint.getNamedGraphURIs()); + try { + rs = queryExecution.execSelect(); + } catch (QueryExceptionHTTP e) { + if(e.getCause() instanceof SocketTimeoutException){ + logger.warn("Got timeout"); + } else { + logger.error("Exception executing query", e); + } + rs = new ResultSetMem(); + } + } else { + QueryExecution qExec = com.hp.hpl.jena.query.QueryExecutionFactory.create(query, ((LocalModelBasedSparqlEndpointKS)ks).getModel()); + rs = qExec.execSelect(); + } + return rs; + } + /** * Returns TRUE if the class hierarchy was computed before. * @return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-05-03 21:20:30
|
Revision: 3689 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3689&view=rev Author: lorenz_b Date: 2012-05-03 21:20:22 +0000 (Thu, 03 May 2012) Log Message: ----------- Fallback to SPARQL 1.0 after 2 attempts. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -99,7 +99,7 @@ // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int total = 0; while(rs.hasNext()){ @@ -108,7 +108,7 @@ } query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int symmetric = 0; while(rs.hasNext()){ qs = rs.next(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -97,7 +97,7 @@ query = String.format( "SELECT (COUNT(DISTINCT ?s) AS ?all) WHERE {?s <%s> ?o.}", propertyToDescribe.getName()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int all = 1; while (rs.hasNext()) { @@ -107,7 +107,7 @@ // get number of instances of s with <s p o> <s p o1> where o != o1 query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int functional = 1; while (rs.hasNext()) { qs = rs.next(); @@ -129,29 +129,25 @@ private void runSPARQL1_1_Mode() { // get number of instances of s with <s p o> - String query = String.format( - "SELECT (COUNT(DISTINCT ?s) AS ?all) WHERE {?s <%s> ?o.}", - propertyToDescribe.getName()); - ResultSet rs = executeSelectQuery(query); - QuerySolution qs; - int all = 1; - while (rs.hasNext()) { - qs = rs.next(); - all = qs.getLiteral("all").getInt(); + int numberOfSubjects = reasoner.getSubjectCountForProperty(propertyToDescribe, getRemainingRuntimeInMilliSeconds()); + if(numberOfSubjects == -1){ + logger.warn("Early termination: Got timeout while counting number of distinct subjects for given property."); + return; } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; + String query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query); int functional = 1; + QuerySolution qs; while (rs.hasNext()) { qs = rs.next(); functional = qs.getLiteral("functional").getInt(); } - if (all > 0) { + if (numberOfSubjects > 0) { currentlyBestAxioms.add(new EvaluatedAxiom( new FunctionalDatatypePropertyAxiom(propertyToDescribe), - computeScore(all, functional), + computeScore(numberOfSubjects, functional), declaredAsFunctional)); } } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -102,7 +102,7 @@ query = String.format( "SELECT (COUNT(DISTINCT ?o) AS ?all) WHERE {?s <%s> ?o.}", propertyToDescribe.getName()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int all = 1; while (rs.hasNext()) { @@ -110,13 +110,13 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?o) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; + query = "SELECT (COUNT(DISTINCT ?o) AS ?inversefunctional) WHERE {?s1 <%s> ?o. FILTER NOT EXISTS {?s2 <%s> ?o. FILTER(?s1 != ?s2)}}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); - int notInverseFunctional = 1; + rs = executeSelectQuery(query, model); + int inverseFunctional = 1; while (rs.hasNext()) { qs = rs.next(); - notInverseFunctional = qs.getLiteral("noninversefunctional") + inverseFunctional = qs.getLiteral("inversefunctional") .getInt(); } if (all > 0) { @@ -124,8 +124,7 @@ currentlyBestAxioms .add(new EvaluatedAxiom( new InverseFunctionalObjectPropertyAxiom( - propertyToDescribe), computeScore(all, all - - notInverseFunctional), + propertyToDescribe), computeScore(all, inverseFunctional), declaredAsInverseFunctional)); } @@ -137,32 +136,27 @@ private void runSPARQL1_1_Mode() { // get number of instances of s with <s p o> - String query = String.format( - "SELECT (COUNT(DISTINCT ?o) AS ?all) WHERE {?s <%s> ?o.}", - propertyToDescribe.getName()); - ResultSet rs = executeSelectQuery(query); - QuerySolution qs; - int all = 1; - while (rs.hasNext()) { - qs = rs.next(); - all = qs.getLiteral("all").getInt(); + int numberOfObjects = reasoner.getObjectCountForProperty(propertyToDescribe, getRemainingRuntimeInMilliSeconds()); + if(numberOfObjects == -1){ + logger.warn("Early termination: Got timeout while counting number of distinct objects for given property."); + return; } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?o) AS ?noninversefunctional) WHERE {?s1 <%s> ?o. ?s2 <%s> ?o. FILTER(?s1 != ?s2) }"; + String query = "SELECT (COUNT(DISTINCT ?o) AS ?inversefunctional) WHERE {?s1 <%s> ?o. FILTER NOT EXISTS {?s2 <%s> ?o. FILTER(?s1 != ?s2)}}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); - int notInverseFunctional = 1; + ResultSet rs = executeSelectQuery(query); + int inverseFunctional = 1; + QuerySolution qs; while (rs.hasNext()) { qs = rs.next(); - notInverseFunctional = qs.getLiteral("noninversefunctional") + inverseFunctional = qs.getLiteral("inversefunctional") .getInt(); } - if (all > 0) { + if (numberOfObjects > 0) { currentlyBestAxioms .add(new EvaluatedAxiom( new InverseFunctionalObjectPropertyAxiom( - propertyToDescribe), computeScore(all, all - - notInverseFunctional), + propertyToDescribe), computeScore(numberOfObjects, inverseFunctional), declaredAsInverseFunctional)); } } @@ -173,6 +167,7 @@ l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/profession")); l.setMaxExecutionTimeInSeconds(10); l.init(); + l.setForceSPARQL_1_0_Mode(true); l.start(); System.out.println(l.getCurrentlyBestEvaluatedAxioms(1)); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -101,7 +101,7 @@ query = String.format( "SELECT (COUNT(DISTINCT ?s) AS ?all) WHERE {?s <%s> ?o.}", propertyToDescribe); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int all = 0; while (rs.hasNext()) { @@ -113,7 +113,7 @@ // get number of instances s where not exists <s p s> query = "SELECT (COUNT(DISTINCT ?s) AS ?irreflexive) WHERE {?s <%s> ?o. FILTER(?s != ?o)}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int irreflexive = 0; while (rs.hasNext()) { qs = rs.next(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -99,7 +99,7 @@ // get fraction of instances s with <s p s> query = "SELECT (COUNT(DISTINCT ?s) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int total = 0; while (rs.hasNext()) { @@ -108,7 +108,7 @@ } query = "SELECT (COUNT(DISTINCT ?s) AS ?reflexive) WHERE {?s <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int reflexive = 0; while (rs.hasNext()) { qs = rs.next(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -98,7 +98,7 @@ // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int total = 0; while(rs.hasNext()){ @@ -107,7 +107,7 @@ } query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int symmetric = 0; while(rs.hasNext()){ qs = rs.next(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -100,7 +100,7 @@ // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o. ?o <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); + ResultSet rs = executeSelectQuery(query, model); QuerySolution qs; int total = 0; while(rs.hasNext()){ @@ -109,7 +109,7 @@ } query = "SELECT (COUNT(*) AS ?transitive) WHERE {?s <%s> ?o. ?o <%s> ?o1. ?s <%s> ?o1.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); + rs = executeSelectQuery(query, model); int transitive = 0; while(rs.hasNext()){ qs = rs.next(); Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 20:59:33 UTC (rev 3688) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-05-03 21:20:22 UTC (rev 3689) @@ -53,6 +53,7 @@ import org.dllearner.core.owl.Nothing; import org.dllearner.core.owl.ObjectProperty; import org.dllearner.core.owl.ObjectPropertyHierarchy; +import org.dllearner.core.owl.Property; import org.dllearner.core.owl.Thing; import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; @@ -169,7 +170,7 @@ } } - public int getSubjectCountForProperty(ObjectProperty p, long timeout){ + public int getSubjectCountForProperty(Property p, long timeout){ int cnt = -1; String query = String.format( "SELECT (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s <%s> ?o.}", @@ -182,6 +183,19 @@ return cnt; } + public int getObjectCountForProperty(ObjectProperty p, long timeout){ + int cnt = -1; + String query = String.format( + "SELECT (COUNT(DISTINCT ?o) AS ?cnt) WHERE {?s <%s> ?o.}", + p.getName()); + ResultSet rs = executeSelectQuery(query, timeout); + if(rs.hasNext()){ + cnt = rs.next().getLiteral("cnt").getInt(); + } + + return cnt; + } + public int getPopularity(NamedClass nc){ if(classPopularityMap.containsKey(nc)){ return classPopularityMap.get(nc); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sha...@us...> - 2012-05-07 14:13:07
|
Revision: 3695 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3695&view=rev Author: shadowtm Date: 2012-05-07 14:12:56 +0000 (Mon, 07 May 2012) Log Message: ----------- Cleaned up some of the reasoning code in the OWLAPIReasoner so that it depends on one type of KnowledgeSource (OWLOntologyKnowledgeSource) rather than the generic KnowlegeSource. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/JenaToOwlapiConverter.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/SparqlSimpleExtractor.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java 2012-05-07 11:56:11 UTC (rev 3694) +++ trunk/components-core/src/main/java/org/dllearner/kb/OWLOntologyKnowledgeSource.java 2012-05-07 14:12:56 UTC (rev 3695) @@ -1,5 +1,6 @@ package org.dllearner.kb; +import org.dllearner.core.KnowledgeSource; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyManager; @@ -11,7 +12,7 @@ * * This interface represents objects which can return an OWLOntology representation of itself. */ -public interface OWLOntologyKnowledgeSource { +public interface OWLOntologyKnowledgeSource extends KnowledgeSource{ /** * Create an OWL Ontology associated with the specified manager. Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/JenaToOwlapiConverter.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/JenaToOwlapiConverter.java 2012-05-07 11:56:11 UTC (rev 3694) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/JenaToOwlapiConverter.java 2012-05-07 14:12:56 UTC (rev 3695) @@ -23,12 +23,14 @@ private static Logger log = LoggerFactory.getLogger(JenaToOwlapiConverter.class); /** - * - * @param model - * @return + * Convert a Jena Model to an OWL Ontology. + * + * @param model The model to convert + * @param manager The OWL Ontology Manager - this has to be passed in rather than using the default one in order to be thread safe. + * @return The converted OWL Ontology linked to the specified OWL Ontology Manager. */ - public OWLOntology convert(Model model) { - OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + public OWLOntology convert(Model model, OWLOntologyManager manager) { + OWLOntology ontology=null; try { StringWriter writer = new StringWriter(); Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/SparqlSimpleExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/SparqlSimpleExtractor.java 2012-05-07 11:56:11 UTC (rev 3694) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/simple/SparqlSimpleExtractor.java 2012-05-07 14:12:56 UTC (rev 3695) @@ -11,9 +11,11 @@ import org.dllearner.core.ComponentInitException; import org.dllearner.core.KnowledgeSource; import org.dllearner.core.config.ConfigOption; +import org.dllearner.kb.OWLOntologyKnowledgeSource; import org.dllearner.utilities.JamonMonitorLogger; import org.dllearner.utilities.analyse.TypeOntology; import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +32,7 @@ import com.jamonapi.MonitorFactory; @ComponentAnn(name = "efficient SPARQL fragment extractor", shortName = "sparqls", version = 0.1) -public class SparqlSimpleExtractor implements KnowledgeSource { +public class SparqlSimpleExtractor implements KnowledgeSource, OWLOntologyKnowledgeSource { @ConfigOption(name = "endpointURL", description = "URL of the SPARQL endpoint", required = true) private String endpointURL = null; @@ -52,7 +54,6 @@ @ConfigOption(name = "ontologySchemaUrls", description = "List of Ontology Schema URLs", required = true) private List<String> ontologySchemaUrls = null; - private OWLOntology owlOntology; private SchemaIndexer indexer; private static Logger log = LoggerFactory.getLogger(SparqlSimpleExtractor.class); @@ -214,8 +215,7 @@ log.debug("{}", model); } } - JenaToOwlapiConverter converter = new JenaToOwlapiConverter(); - owlOntology = converter.convert(this.model); + monIndexing.stop(); monComp.stop(); log.info("*******Simple SPARQL Extractor********"); @@ -286,13 +286,6 @@ this.recursionDepth = recursionDepth; } - /** - * @return - */ - public OWLOntology getOWLOntology() { - return owlOntology; - } - public List<String> getOntologySchemaUrls() { return ontologySchemaUrls; } @@ -308,4 +301,10 @@ public void setTboxfilter(String tboxfilter) { this.tboxfilter = tboxfilter; } + + @Override + public OWLOntology createOWLOntology(OWLOntologyManager manager) { + JenaToOwlapiConverter converter = new JenaToOwlapiConverter(); + return converter.convert(this.model,manager); + } } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-05-07 11:56:11 UTC (rev 3694) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2012-05-07 14:12:56 UTC (rev 3695) @@ -227,71 +227,45 @@ if (source instanceof OWLOntologyKnowledgeSource) { ontology = ((OWLOntologyKnowledgeSource) source).createOWLOntology(manager); owlAPIOntologies.add(ontology); - } else if(source instanceof SparqlSimpleExtractor) { - ontology=((SparqlSimpleExtractor) source).getOWLOntology(); - manager=ontology.getOWLOntologyManager(); - owlAPIOntologies.add(ontology); + }else{ + //This reasoner requires an ontology to process + throw new ComponentInitException("OWL API Reasoner Requires an OWLKnowledgeSource. Received a KS of type: " + source.getClass().getName()); } - if (source instanceof OWLFile || source instanceof SparqlKnowledgeSource || source instanceof SparqlSimpleExtractor || source instanceof OWLAPIOntology) { + directImports.addAll(ontology.getImportsDeclarations()); - directImports.addAll(ontology.getImportsDeclarations()); - try { - // imports includes the ontology itself - //FIXME this line throws the strange error - Set<OWLOntology> imports = manager.getImportsClosure(ontology); - allImports.addAll(imports); + try { + // imports includes the ontology itself + //FIXME this line throws the strange error + Set<OWLOntology> imports = manager.getImportsClosure(ontology); + allImports.addAll(imports); // System.out.println(imports); - for (OWLOntology ont : imports) { - classes.addAll(ont.getClassesInSignature()); - owlObjectProperties.addAll(ont.getObjectPropertiesInSignature()); - owlDatatypeProperties.addAll(ont.getDataPropertiesInSignature()); - owlIndividuals.addAll(ont.getIndividualsInSignature()); - } - - } catch (UnknownOWLOntologyException uooe) { - logger.error("UnknownOWLOntologyException occured, imports were not loaded! This is a bug, which has not been fixed yet."); + for (OWLOntology ont : imports) { + classes.addAll(ont.getClassesInSignature()); + owlObjectProperties.addAll(ont.getObjectPropertiesInSignature()); + owlDatatypeProperties.addAll(ont.getDataPropertiesInSignature()); + owlIndividuals.addAll(ont.getIndividualsInSignature()); } - // if several knowledge sources are included, then we can only - // guarantee that the base URI is from one of those sources (there - // can't be more than one); but we will take care that all prefixes are - // correctly imported - OWLOntologyFormat format = manager.getOntologyFormat(ontology); - if (format instanceof PrefixOWLOntologyFormat) { - prefixes.putAll(((PrefixOWLOntologyFormat) format).getPrefixName2PrefixMap()); - baseURI = ((PrefixOWLOntologyFormat) format).getDefaultPrefix(); - prefixes.remove(""); - } + } catch (UnknownOWLOntologyException uooe) { + logger.error("UnknownOWLOntologyException occured, imports were not loaded! This is a bug, which has not been fixed yet."); + } - // all other sources are converted to KB and then to an - // OWL API ontology - } else { - - //KB Files - KB kb = ((AbstractKnowledgeSource)source).toKB(); - - if (!(source instanceof OWLOntologyKnowledgeSource)) { - //Not sure if this will ever get hit, but leaving in for backward compatibility. - IRI ontologyURI = IRI.create("http://example.com"); - ontology = null; - try { - ontology = manager.createOntology(ontologyURI); - } catch (OWLOntologyCreationException e) { - throw new RuntimeException(e); - } - OWLAPIAxiomConvertVisitor.fillOWLOntology(manager, ontology, kb); - owlAPIOntologies.add(ontology); - } - - allImports.add(ontology); - atomicConcepts.addAll(kb.findAllAtomicConcepts()); - atomicRoles.addAll(kb.findAllAtomicRoles()); - individuals.addAll(kb.findAllIndividuals()); - // TODO: add method to find datatypes + // if several knowledge sources are included, then we can only + // guarantee that the base URI is from one of those sources (there + // can't be more than one); but we will take care that all prefixes are + // correctly imported + OWLOntologyFormat format = manager.getOntologyFormat(ontology); + if (format instanceof PrefixOWLOntologyFormat) { + prefixes.putAll(((PrefixOWLOntologyFormat) format).getPrefixName2PrefixMap()); + baseURI = ((PrefixOWLOntologyFormat) format).getDefaultPrefix(); + prefixes.remove(""); } + } + + //Now merge all of the knowledge sources into one ontology instance. try { //The following line illustrates a problem with using different OWLOntologyManagers. This can manifest itself if we have multiple sources who were created with different manager instances. //ontology = OWLManager.createOWLOntologyManager().createOntology(IRI.create("http://dl-learner/all"), new HashSet<OWLOntology>(owlAPIOntologies)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jen...@us...> - 2012-07-12 11:34:19
|
Revision: 3783 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3783&view=rev Author: jenslehmann Date: 2012-07-12 11:34:09 +0000 (Thu, 12 Jul 2012) Log Message: ----------- minor changes Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java trunk/components-core/src/main/java/org/dllearner/refinementoperators/ExampleOperator.java Modified: trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-07-12 11:14:47 UTC (rev 3782) +++ trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2012-07-12 11:34:09 UTC (rev 3783) @@ -93,7 +93,7 @@ "org.dllearner.refinementoperators.RhoDRDown", "org.dllearner.refinementoperators.SynchronizedRhoDRDown", // just for testing - "org.dllearner.refinementoperators.ExampleOperator", + // "org.dllearner.refinementoperators.ExampleOperator", } )); private static Collection<Class<? extends Component>> components; private static BidiMap<Class<? extends Component>, String> componentNames; Modified: trunk/components-core/src/main/java/org/dllearner/refinementoperators/ExampleOperator.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/refinementoperators/ExampleOperator.java 2012-07-12 11:14:47 UTC (rev 3782) +++ trunk/components-core/src/main/java/org/dllearner/refinementoperators/ExampleOperator.java 2012-07-12 11:34:09 UTC (rev 3783) @@ -14,7 +14,7 @@ * @author Jens Lehmann * */ -@ComponentAnn(name = "example refinement operator", shortName = "exop", version = 0.8) +@ComponentAnn(name = "example refinement operator", shortName = "exop", version = 0.1) public class ExampleOperator implements LengthLimitedRefinementOperator { @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-08-30 13:48:00
|
Revision: 3839 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3839&view=rev Author: lorenz_b Date: 2012-08-30 13:47:49 +0000 (Thu, 30 Aug 2012) Log Message: ----------- Fixed bug. Storing metrics to explain accuracy score. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/DLLearnerDescriptionConvertVisitor.java Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-08-27 12:13:42 UTC (rev 3838) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2012-08-30 13:47:49 UTC (rev 3839) @@ -414,7 +414,7 @@ double confidence = confidenceInterval[1] - confidenceInterval[0]; - return new AxiomScore(accuracy, confidence); + return new AxiomScore(accuracy, confidence, total, success, total-success); } protected double accuracy(int total, int success){ Modified: trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java 2012-08-27 12:13:42 UTC (rev 3838) +++ trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java 2012-08-30 13:47:49 UTC (rev 3839) @@ -27,13 +27,26 @@ private double accuracy; private double confidence; + private int totalNrOfExamples; + private int nrOfpositiveExamples; + private int nrOfnegativeExamples; + public AxiomScore(double accuracy) { this.accuracy = accuracy; } public AxiomScore(double accuracy, double confidence) { this.accuracy = accuracy; + this.confidence = confidence; } + + public AxiomScore(double accuracy, double confidence, int totalNrOfExamples, int nrOfpositiveExamples, int nrOfnegativeExamples) { + this.accuracy = accuracy; + this.confidence = confidence; + this.totalNrOfExamples = totalNrOfExamples; + this.nrOfpositiveExamples = nrOfpositiveExamples; + this.nrOfnegativeExamples = nrOfnegativeExamples; + } @Override public double getAccuracy() { @@ -43,5 +56,17 @@ public double getConfidence(){ return confidence; } + + public int getTotalNrOfExamples() { + return totalNrOfExamples; + } + + public int getNrOfpositiveExamples() { + return nrOfpositiveExamples; + } + + public int getNrOfnegativeExamples() { + return nrOfnegativeExamples; + } } Modified: trunk/components-core/src/main/java/org/dllearner/utilities/owl/DLLearnerDescriptionConvertVisitor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/owl/DLLearnerDescriptionConvertVisitor.java 2012-08-27 12:13:42 UTC (rev 3838) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/DLLearnerDescriptionConvertVisitor.java 2012-08-30 13:47:49 UTC (rev 3839) @@ -35,6 +35,7 @@ import org.dllearner.core.owl.NamedClass; import org.dllearner.core.owl.Negation; import org.dllearner.core.owl.Nothing; +import org.dllearner.core.owl.ObjectAllRestriction; import org.dllearner.core.owl.ObjectExactCardinalityRestriction; import org.dllearner.core.owl.ObjectMaxCardinalityRestriction; import org.dllearner.core.owl.ObjectMinCardinalityRestriction; @@ -134,7 +135,7 @@ getIRI().toString()); description.getFiller().accept(this); Description d = stack.pop(); - stack.push(new ObjectSomeRestriction(role, d)); + stack.push(new ObjectAllRestriction(role, d)); } @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-09-03 14:28:44
|
Revision: 3842 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3842&view=rev Author: lorenz_b Date: 2012-09-03 14:28:33 +0000 (Mon, 03 Sep 2012) Log Message: ----------- Fixed bug. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-08-30 15:07:38 UTC (rev 3841) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-09-03 14:28:33 UTC (rev 3842) @@ -194,24 +194,24 @@ for(ObjectProperty p : completeDisjointProperties){ if(usePropertyPopularity){ int overlap = 0; - int pop; + int otherPopularity; if(ks.isRemote()){ - pop = reasoner.getPopularity(p); + otherPopularity = reasoner.getPopularity(p); } else { Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); - pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + otherPopularity = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); } - //we skip classes with no instances - if(pop == 0) continue; + //we skip properties with no instances + if(otherPopularity == 0) continue; //we compute the estimated precision - double precision = accuracy(pop, overlap); + double precision = accuracy(otherPopularity, overlap); //we compute the estimated recall double recall = accuracy(popularity, overlap); //compute the overall score double score = 1 - fMEasure(precision, recall); - evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); + evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score, score, popularity, popularity, 0)); } else { evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(1)); } @@ -223,24 +223,24 @@ for(Entry<ObjectProperty, Integer> entry : sortByValues(property2Count)){ p = entry.getKey(); int overlap = entry.getValue(); - int pop; + int otherPopularity; if(ks.isRemote()){ - pop = reasoner.getPopularity(p); + otherPopularity = reasoner.getPopularity(p); } else { Model model = ((LocalModelBasedSparqlEndpointKS)ks).getModel(); - pop = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); + otherPopularity = model.listStatements(null, model.getProperty(p.getName()), (RDFNode)null).toSet().size(); } - //we skip classes with no instances - if(pop == 0) continue; + //we skip properties with no instances + if(otherPopularity == 0) continue; //we compute the estimated precision - double precision = accuracy(pop, overlap); + double precision = accuracy(otherPopularity, overlap); //we compute the estimated recall double recall = accuracy(popularity, overlap); //compute the overall score double score = 1 - fMEasure(precision, recall); - evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score)); + evalAxiom = new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score, score, popularity, popularity - overlap, overlap)); } property2Count.put(propertyToDescribe, all); @@ -251,7 +251,7 @@ SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); // endpoint = new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); DisjointObjectPropertyAxiomLearner l = new DisjointObjectPropertyAxiomLearner(new SparqlEndpointKS(endpoint));//.getEndpointDBpediaLiveAKSW())); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/aircraftTransport")); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/league")); l.setMaxExecutionTimeInSeconds(10); l.init(); l.getReasoner().precomputeObjectPropertyPopularity(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-08-30 15:07:38 UTC (rev 3841) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-09-03 14:28:33 UTC (rev 3842) @@ -171,9 +171,9 @@ property2Count.remove(propertyToDescribe); EvaluatedAxiom evalAxiom; - Set<ObjectProperty> properties; + List<ObjectProperty> properties; for(Entry<ObjectProperty, Integer> entry : sortByValues(property2Count)){ - properties = new HashSet<ObjectProperty>(); + properties = new ArrayList<ObjectProperty>(); properties.add(propertyToDescribe); properties.add(entry.getKey()); int popularity = reasoner.getPropertyCount(entry.getKey()); Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java 2012-08-30 15:07:38 UTC (rev 3841) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java 2012-09-03 14:28:33 UTC (rev 3842) @@ -19,21 +19,21 @@ package org.dllearner.core.owl; +import java.util.Collection; import java.util.Iterator; import java.util.Map; -import java.util.Set; public class EquivalentObjectPropertiesAxiom extends PropertyAxiom { private static final long serialVersionUID = -1085651734702155330L; - private Set<ObjectProperty> equivalentProperties; + private Collection<ObjectProperty> equivalentProperties; - public EquivalentObjectPropertiesAxiom(Set<ObjectProperty> equivalentProperties) { + public EquivalentObjectPropertiesAxiom(Collection<ObjectProperty> equivalentProperties) { this.equivalentProperties = equivalentProperties; } - public Set<ObjectProperty> getEquivalentProperties() { + public Collection<ObjectProperty> getEquivalentProperties() { return equivalentProperties; } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-08-30 15:07:38 UTC (rev 3841) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2012-09-03 14:28:33 UTC (rev 3842) @@ -109,6 +109,7 @@ cache = new ExtractionDBCache("cache"); } classPopularityMap = new HashMap<NamedClass, Integer>(); + objectPropertyPopularityMap = new HashMap<ObjectProperty, Integer>(); } public SPARQLReasoner(SparqlEndpointKS ks, ExtractionDBCache cache) { @@ -116,12 +117,14 @@ this.cache = cache; classPopularityMap = new HashMap<NamedClass, Integer>(); + objectPropertyPopularityMap = new HashMap<ObjectProperty, Integer>(); } public SPARQLReasoner(OntModel model) { this.model = model; classPopularityMap = new HashMap<NamedClass, Integer>(); + objectPropertyPopularityMap = new HashMap<ObjectProperty, Integer>(); } public void precomputePopularity(){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2012-10-05 13:27:54
|
Revision: 3854 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3854&view=rev Author: lorenz_b Date: 2012-10-05 13:27:40 +0000 (Fri, 05 Oct 2012) Log Message: ----------- Added single query mode to SPARQL enrichment algorithms. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyRangeAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseFunctionalObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/InverseObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/IrreflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner2.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyRangeAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ReflexiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubDataPropertyOfAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubObjectPropertyOfAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SymmetricObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/TransitiveObjectPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/core/owl/DisjointClassesAxiom.java trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java trunk/components-core/src/main/java/org/dllearner/core/owl/Thing.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/core/owl/GenericDatatypePropertyAssertion.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -47,7 +47,6 @@ import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.learningproblems.AxiomScore; -import org.dllearner.learningproblems.Heuristics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -157,7 +156,8 @@ } if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ - runSPARQL1_1_Mode(); +// runSPARQL1_1_Mode(); + runSingleQueryMode(); } else { runSPARQL1_0_Mode(); } @@ -165,6 +165,38 @@ logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } + private void runSingleQueryMode(){ + //compute the overlap if exist + Map<NamedClass, Integer> class2Overlap = new HashMap<NamedClass, Integer>(); + String query = String.format("SELECT ?type (COUNT(*) AS ?cnt) WHERE {?s a <%s>. ?s a ?type.} GROUP BY ?type", classToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + NamedClass cls = new NamedClass(qs.getResource("type").getURI()); + int cnt = qs.getLiteral("cnt").getInt(); + class2Overlap.put(cls, cnt); + } + //for each property in knowledge base + for(NamedClass cls : allClasses){ + //get the popularity + int otherPopularity = reasoner.getPopularity(cls); + if(otherPopularity == 0){//skip empty properties + continue; + } + //get the overlap + int overlap = class2Overlap.containsKey(cls) ? class2Overlap.get(cls) : 0; + //compute the estimated precision + double precision = accuracy(otherPopularity, overlap); + //compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the final score + double score = 1 - fMEasure(precision, recall); + + currentlyBestEvaluatedDescriptions.add(new EvaluatedDescription(cls, new AxiomScore(score))); + } + } + private void runSPARQL1_0_Mode(){ Model model = ModelFactory.createDefaultModel(); int limit = 1000; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/SimpleSubclassLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -19,9 +19,7 @@ package org.dllearner.algorithms; -import java.net.URL; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -109,11 +107,11 @@ @Override public List<EvaluatedAxiom> getCurrentlyBestEvaluatedAxioms(int nrOfAxioms) { - List<EvaluatedAxiom> axioms = new ArrayList<EvaluatedAxiom>(); + currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); for(EvaluatedDescription ed : getCurrentlyBestEvaluatedDescriptions(nrOfAxioms)){ - axioms.add(new EvaluatedAxiom(new SubClassAxiom(classToDescribe, ed.getDescription()), new AxiomScore(ed.getAccuracy()))); + currentlyBestAxioms.add(new EvaluatedAxiom(new SubClassAxiom(classToDescribe, ed.getDescription()), new AxiomScore(ed.getAccuracy()))); } - return axioms; + return currentlyBestAxioms; } @Override @@ -145,6 +143,16 @@ } } + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ + runSingleQueryMode(); + } else { + runSPARQL1_0_Mode(); + } + + logger.info("...finished in {}ms. (Got {} rows)", (System.currentTimeMillis()-startTime), fetchedRows); + } + + private void runSPARQL1_0_Mode(){ Map<Individual, SortedSet<Description>> ind2Types = new HashMap<Individual, SortedSet<Description>>(); int limit = 1000; boolean repeat = true; @@ -153,9 +161,26 @@ createEvaluatedDescriptions(ind2Types); fetchedRows += 1000; } - + } + + private void runSingleQueryMode(){ + int total = reasoner.getPopularity(classToDescribe); - logger.info("...finished in {}ms. (Got {} rows)", (System.currentTimeMillis()-startTime), fetchedRows); + if(total > 0){ + String query = String.format("SELECT ?type (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s a <%s>. ?s a ?type} GROUP BY ?type ORDER BY DESC(?cnt)", classToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + if(!qs.get("type").isAnon()){ + NamedClass sup = new NamedClass(qs.getResource("type").getURI()); + int overlap = qs.get("cnt").asLiteral().getInt(); + if(!sup.getURI().equals(Thing.uri) && ! classToDescribe.equals(sup)){//omit owl:Thing and the class to describe itself + currentlyBestEvaluatedDescriptions.add(new EvaluatedDescription(sup, computeScore(total, overlap))); + } + } + } + } } public NamedClass getClassToDescribe() { @@ -234,8 +259,7 @@ } public static void main(String[] args) throws Exception{ - SparqlEndpointKS ks = new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), - Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW()); SPARQLReasoner reasoner = new SPARQLReasoner(ks); reasoner.prepareSubsumptionHierarchy(); @@ -244,7 +268,7 @@ l.setReasoner(reasoner); l.setReturnOnlyNewAxioms(true); - ConfigHelper.configure(l, "maxExecutionTimeInSeconds", 10); + ConfigHelper.configure(l, "maxExecutionTimeInSeconds", 50); l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/SoccerClub")); l.init(); l.start(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/AsymmetricObjectPropertyAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -22,6 +22,8 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collections; +import java.util.SortedSet; +import java.util.TreeSet; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -29,12 +31,15 @@ import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.ObjectPropertyEditor; import org.dllearner.core.owl.AsymmetricObjectPropertyAxiom; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.core.owl.ObjectProperty; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; @@ -53,6 +58,9 @@ public AsymmetricObjectPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s ?p ?o. FILTER NOT EXISTS{?o ?p ?s}}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s ?p ?o. ?o ?p ?s}"); + } public ObjectProperty getPropertyToDescribe() { @@ -88,18 +96,18 @@ } private void runSPARQL1_0_Mode(){ - Model model = ModelFactory.createDefaultModel(); + workingModel = ModelFactory.createDefaultModel(); int limit = 1000; int offset = 0; String baseQuery = "CONSTRUCT {?s <%s> ?o.} WHERE {?s <%s> ?o} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); while(!terminationCriteriaSatisfied() && newModel.size() != 0){ - model.add(newModel); + workingModel.add(newModel); // get number of instances of s with <s p o> query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query, model); + ResultSet rs = executeSelectQuery(query, workingModel); QuerySolution qs; int total = 0; while(rs.hasNext()){ @@ -108,7 +116,7 @@ } query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query, model); + rs = executeSelectQuery(query, workingModel); int symmetric = 0; while(rs.hasNext()){ qs = rs.next(); @@ -127,26 +135,57 @@ } } - private void runSPARQL1_1_Mode(){ - String query = "SELECT (COUNT(*) AS ?total) WHERE {?s <%s> ?o.}"; - query = query.replace("%s", propertyToDescribe.getURI().toString()); - ResultSet rs = executeSelectQuery(query); - QuerySolution qs; - int total = 0; - while(rs.hasNext()){ - qs = rs.next(); - total = qs.getLiteral("total").getInt(); + @Override + public SortedSet<KBElement> getPositiveExamples(EvaluatedAxiom axiom) { + if(workingModel != null){ + SortedSet<KBElement> allExamples = new TreeSet<KBElement>(); + ParameterizedSparqlString query = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s ?p ?o.}"); + query.setIri("p", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query.toString(), workingModel); + while(rs.hasNext()){ + allExamples.add(new Individual(rs.next().get("s").asResource().getURI())); + } + SortedSet<KBElement> negExamples = getNegativeExamples(axiom); + + SortedSet<KBElement> posExamples = new TreeSet<KBElement>(allExamples); + posExamples.removeAll(negExamples); + + + return posExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); } - query = "SELECT (COUNT(*) AS ?symmetric) WHERE {?s <%s> ?o. ?o <%s> ?s.}"; - query = query.replace("%s", propertyToDescribe.getURI().toString()); - rs = executeSelectQuery(query); - int symmetric = 0; - while(rs.hasNext()){ - qs = rs.next(); - symmetric = qs.getLiteral("symmetric").getInt(); + } + + @Override + public SortedSet<KBElement> getNegativeExamples(EvaluatedAxiom axiom) { + if(workingModel != null){ + SortedSet<KBElement> negExamples = new TreeSet<KBElement>(); + ParameterizedSparqlString query = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s ?p ?o.?o ?p ?s}"); + query.setIri("p", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query.toString(), workingModel); + while(rs.hasNext()){ + negExamples.add(new Individual(rs.next().get("s").asResource().getURI())); + } + + return negExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); } - int asymmetric = total - symmetric; + } + + private void runSPARQL1_1_Mode(){ + int total = reasoner.getPopularity(propertyToDescribe); + if(total > 0){ + int asymmetric = 0; + String query = "SELECT (COUNT(*) AS ?asymmetric) WHERE {?s <%s> ?o. FILTER NOT EXISTS{?o <%s> ?s.}}"; + query = query.replace("%s", propertyToDescribe.getURI().toString()); + ResultSet rs = executeSelectQuery(query); + if(rs.hasNext()){ + asymmetric = rs.next().getLiteral("asymmetric").getInt(); + } + currentlyBestAxioms.add(new EvaluatedAxiom(new AsymmetricObjectPropertyAxiom(propertyToDescribe), computeScore(total, asymmetric), declaredAsymmetric)); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyDomainAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -20,14 +20,7 @@ package org.dllearner.algorithms.properties; import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; @@ -40,19 +33,26 @@ import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.DatatypePropertyDomainAxiom; import org.dllearner.core.owl.Description; -import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.core.owl.NamedClass; import org.dllearner.core.owl.Thing; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.reasoning.SPARQLReasoner; -import org.semanticweb.owlapi.model.IRI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.RDFNode; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.vocabulary.OWL; +import com.hp.hpl.jena.vocabulary.RDF; @ComponentAnn(name="dataproperty domain axiom learner", shortName="dpldomain", version=0.1) public class DataPropertyDomainAxiomLearner extends AbstractAxiomLearningAlgorithm { @@ -62,14 +62,10 @@ @ConfigOption(name="propertyToDescribe", description="", propertyEditorClass=DataPropertyEditor.class) private DatatypeProperty propertyToDescribe; - private static final ParameterizedSparqlString singleQueryTemplate = new ParameterizedSparqlString("SELECT ?type (COUNT(DISTINCT ?ind) AS ?cnt) WHERE {?ind <%s> ?o. ?ind a ?type.}"); - - private Map<Individual, SortedSet<Description>> individual2Types; - public DataPropertyDomainAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; - super.iterativeQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?ind ?type WHERE {?ind ?p ?o. ?ind a ?type.}"); - + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s a ?type}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s WHERE {?s ?p ?o. FILTER NOT EXISTS{?s a ?type}}"); } public DatatypeProperty getPropertyToDescribe() { @@ -82,7 +78,6 @@ @Override public void start() { - iterativeQueryTemplate.setIri("p", propertyToDescribe.getName()); logger.info("Start learning..."); startTime = System.currentTimeMillis(); fetchedRows = 0; @@ -104,81 +99,108 @@ } } } - - runIterativeQueryMode(); + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ + runSingleQueryMode(); + } else { + runSPARQL1_0_Mode(); + } logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } private void runSingleQueryMode(){ - } - - private void runIterativeQueryMode(){ - individual2Types = new HashMap<Individual, SortedSet<Description>>(); - while(!terminationCriteriaSatisfied() && !fullDataLoaded){ - ResultSet rs = fetchData(); - processData(rs); - buildEvaluatedAxioms(); + String query = String.format("SELECT (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s <%s> ?o.}", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + int nrOfSubjects = rs.next().getLiteral("cnt").getInt(); + + query = String.format("SELECT ?type (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s <%s> ?o. ?s a ?type.} GROUP BY ?type", propertyToDescribe.getName()); + rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + NamedClass domain = new NamedClass(qs.getResource("type").getURI()); + int cnt = qs.getLiteral("cnt").getInt(); + if(!domain.getURI().equals(Thing.uri)){ + currentlyBestAxioms.add(new EvaluatedAxiom(new DatatypePropertyDomainAxiom(propertyToDescribe, domain), computeScore(nrOfSubjects, cnt))); + } } } - private void processData(ResultSet rs){ - QuerySolution qs; - Individual ind; - Description type; - SortedSet<Description> types; - int cnt = 0; - while(rs.hasNext()){ - cnt++; - qs = rs.next(); - if(qs.get("type").isURIResource()){ - types = new TreeSet<Description>(); - ind = new Individual(qs.getResource("ind").getURI()); - type = new NamedClass(qs.getResource("type").getURI()); - types.add(type); - if(reasoner.isPrepared()){ - if(reasoner.getClassHierarchy().contains(type)){ - types.addAll(reasoner.getClassHierarchy().getSuperClasses(type)); + private void runSPARQL1_0_Mode() { + workingModel = ModelFactory.createDefaultModel(); + int limit = 1000; + int offset = 0; + String baseQuery = "CONSTRUCT {?s a ?type.} WHERE {?s <%s> ?o. ?s a ?type.} LIMIT %d OFFSET %d"; + String query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); + Model newModel = executeConstructQuery(query); + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ + workingModel.add(newModel); + // get number of distinct subjects + query = "SELECT (COUNT(DISTINCT ?s) AS ?all) WHERE {?s a ?type.}"; + ResultSet rs = executeSelectQuery(query, workingModel); + QuerySolution qs; + int all = 1; + while (rs.hasNext()) { + qs = rs.next(); + all = qs.getLiteral("all").getInt(); + } + + // get class and number of instances + query = "SELECT ?type (COUNT(DISTINCT ?s) AS ?cnt) WHERE {?s a ?type.} GROUP BY ?type ORDER BY DESC(?cnt)"; + rs = executeSelectQuery(query, workingModel); + + if (all > 0) { + currentlyBestAxioms.clear(); + while(rs.hasNext()){ + qs = rs.next(); + Resource type = qs.get("type").asResource(); + //omit owl:Thing as trivial domain + if(type.equals(OWL.Thing)){ + continue; } + currentlyBestAxioms.add(new EvaluatedAxiom( + new DatatypePropertyDomainAxiom(propertyToDescribe, new NamedClass(type.getURI())), + computeScore(all, qs.get("cnt").asLiteral().getInt()))); } - addToMap(individual2Types, ind, types); + } + offset += limit; + query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); + newModel = executeConstructQuery(query); + fillWithInference(newModel); } - lastRowCount = cnt; } - - private void buildEvaluatedAxioms(){ - List<EvaluatedAxiom> axioms = new ArrayList<EvaluatedAxiom>(); - Map<Description, Integer> result = new HashMap<Description, Integer>(); - for(Entry<Individual, SortedSet<Description>> entry : individual2Types.entrySet()){ - for(Description nc : entry.getValue()){ - Integer cnt = result.get(nc); - if(cnt == null){ - cnt = Integer.valueOf(1); - } else { - cnt = Integer.valueOf(cnt + 1); + + private void fillWithInference(Model model){ + Model additionalModel = ModelFactory.createDefaultModel(); + if(reasoner.isPrepared()){ + for(StmtIterator iter = model.listStatements(null, RDF.type, (RDFNode)null); iter.hasNext();){ + Statement st = iter.next(); + Description cls = new NamedClass(st.getObject().asResource().getURI()); + if(reasoner.getClassHierarchy().contains(cls)){ + for(Description sup : reasoner.getClassHierarchy().getSuperClasses(cls)){ + additionalModel.add(st.getSubject(), st.getPredicate(), model.createResource(sup.toString())); + } } - result.put(nc, cnt); } } - - //omit owl:Thing - result.remove(new NamedClass(Thing.instance.getURI())); - - EvaluatedAxiom evalAxiom; - int total = individual2Types.keySet().size(); - for(Entry<Description, Integer> entry : sortByValues(result)){ - evalAxiom = new EvaluatedAxiom(new DatatypePropertyDomainAxiom(propertyToDescribe, entry.getKey()), - computeScore(total, entry.getValue())); - if(existingAxioms.contains(evalAxiom.getAxiom())){ - evalAxiom.setAsserted(true); - } - axioms.add(evalAxiom); - } - - currentlyBestAxioms = axioms; + model.add(additionalModel); } + @Override + public Set<KBElement> getPositiveExamples(EvaluatedAxiom evAxiom) { + DatatypePropertyDomainAxiom axiom = (DatatypePropertyDomainAxiom) evAxiom.getAxiom(); + posExamplesQueryTemplate.setIri("type", axiom.getDomain().toString()); + return super.getPositiveExamples(evAxiom); + } + + @Override + public Set<KBElement> getNegativeExamples(EvaluatedAxiom evAxiom) { + DatatypePropertyDomainAxiom axiom = (DatatypePropertyDomainAxiom) evAxiom.getAxiom(); + negExamplesQueryTemplate.setIri("type", axiom.getDomain().toString()); + return super.getNegativeExamples(evAxiom); + } + public static void main(String[] args) throws Exception{ org.apache.log4j.Logger.getRootLogger().addAppender(new ConsoleAppender(new SimpleLayout())); org.apache.log4j.Logger.getRootLogger().setLevel(Level.INFO); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyRangeAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyRangeAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DataPropertyRangeAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -20,12 +20,7 @@ package org.dllearner.algorithms.properties; import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.SortedSet; -import java.util.TreeSet; +import java.util.Set; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -36,15 +31,19 @@ import org.dllearner.core.owl.Datatype; import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.DatatypePropertyRangeAxiom; -import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.reasoning.SPARQLReasoner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Resource; @ComponentAnn(name="dataproperty range learner", shortName="dblrange", version=0.1) public class DataPropertyRangeAxiomLearner extends AbstractAxiomLearningAlgorithm { @@ -56,6 +55,9 @@ public DataPropertyRangeAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT ?s WHERE {?o ?p ?s. FILTER (DATATYPE(?s) = ?dt)}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT ?s WHERE {?o ?p ?s. FILTER (DATATYPE(?s) != ?dt)}"); + } public DatatypeProperty getPropertyToDescribe() { @@ -72,84 +74,103 @@ startTime = System.currentTimeMillis(); fetchedRows = 0; currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); - //get existing range - DataRange existingRange = reasoner.getRange(propertyToDescribe); - if(existingRange != null){ - existingAxioms.add(new DatatypePropertyRangeAxiom(propertyToDescribe, existingRange)); - logger.debug("Existing range: " + existingRange); - } - //get objects with datatypes - Map<Individual, SortedSet<Datatype>> individual2Datatypes = new HashMap<Individual, SortedSet<Datatype>>(); - boolean repeat = true; - int limit = 1000; - while(!terminationCriteriaSatisfied() && repeat){ - int ret = addIndividualsWithTypes(individual2Datatypes, limit, fetchedRows); - currentlyBestAxioms = buildEvaluatedAxioms(individual2Datatypes); - fetchedRows += 1000; - repeat = (ret == limit); - } - logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); - } - - private List<EvaluatedAxiom> buildEvaluatedAxioms(Map<Individual, SortedSet<Datatype>> individual2Types){ - List<EvaluatedAxiom> axioms = new ArrayList<EvaluatedAxiom>(); - Map<Datatype, Integer> result = new HashMap<Datatype, Integer>(); - for(Entry<Individual, SortedSet<Datatype>> entry : individual2Types.entrySet()){ - for(Datatype nc : entry.getValue()){ - Integer cnt = result.get(nc); - if(cnt == null){ - cnt = Integer.valueOf(1); - } else { - cnt = Integer.valueOf(cnt + 1); - } - result.put(nc, cnt); + if(returnOnlyNewAxioms){ + //get existing ranges + DataRange existingRange = reasoner.getRange(propertyToDescribe); + if(existingRange != null){ + existingAxioms.add(new DatatypePropertyRangeAxiom(propertyToDescribe, existingRange)); } } - EvaluatedAxiom evalAxiom; - int total = individual2Types.keySet().size(); - for(Entry<Datatype, Integer> entry : sortByValues(result)){ - evalAxiom = new EvaluatedAxiom(new DatatypePropertyRangeAxiom(propertyToDescribe, entry.getKey()), - computeScore(total, entry.getValue())); - if(existingAxioms.contains(evalAxiom.getAxiom())){ - evalAxiom.setAsserted(true); - } - axioms.add(evalAxiom); + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ + runSingleQueryMode(); + } else { + runSPARQL1_0_Mode(); } - - return axioms; + logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } - - private int addIndividualsWithTypes(Map<Individual, SortedSet<Datatype>> ind2Datatypes, int limit, int offset){ - String query = String.format("SELECT ?ind (DATATYPE(?val) AS ?datatype) WHERE {?ind <%s> ?val.} LIMIT %d OFFSET %d", propertyToDescribe.getName(), limit, offset); + private void runSingleQueryMode(){ + String query = String.format("SELECT (COUNT(DISTINCT ?o) AS ?cnt) WHERE {?s <%s> ?o.}", propertyToDescribe.getName()); ResultSet rs = executeSelectQuery(query); - Individual ind; - Datatype newType; + int nrOfSubjects = rs.next().getLiteral("cnt").getInt(); + + query = String.format("SELECT (DATATYPE(?o) AS ?type) (COUNT(DISTINCT ?o) AS ?cnt) WHERE {?s <%s> ?o.} GROUP BY DATATYPE(?o)", propertyToDescribe.getName()); + rs = executeSelectQuery(query); QuerySolution qs; - SortedSet<Datatype> types; - int cnt = 0; while(rs.hasNext()){ - cnt++; - newType = null; qs = rs.next(); - ind = new Individual(qs.getResource("ind").getURI()); - if(qs.getResource("datatype") != null){ - newType = new Datatype(qs.getResource("datatype").getURI()); - types = ind2Datatypes.get(ind); - if(types == null){ - types = new TreeSet<Datatype>(); - ind2Datatypes.put(ind, types); + if(qs.get("type") != null){ + DataRange range = new Datatype(qs.get("type").asLiteral().getLexicalForm()); + int cnt = qs.getLiteral("cnt").getInt(); + currentlyBestAxioms.add(new EvaluatedAxiom(new DatatypePropertyRangeAxiom(propertyToDescribe, range), computeScore(nrOfSubjects, cnt))); + } + } + } + + private void runSPARQL1_0_Mode() { + workingModel = ModelFactory.createDefaultModel(); + int limit = 1000; + int offset = 0; + String baseQuery = "CONSTRUCT {?s <%s> ?o} WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d"; + String query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + Model newModel = executeConstructQuery(query); + while(!terminationCriteriaSatisfied() && newModel.size() != 0){ + workingModel.add(newModel); + // get number of distinct subjects + query = "SELECT (COUNT(?o) AS ?all) WHERE {?s ?p ?o.}"; + ResultSet rs = executeSelectQuery(query, workingModel); + QuerySolution qs; + int all = 1; + while (rs.hasNext()) { + qs = rs.next(); + all = qs.getLiteral("all").getInt(); + } + + // get class and number of instances +// query = "SELECT (DATATYPE(?o) AS ?dt) (COUNT(?o) AS ?cnt) WHERE{?s ?p ?o} GROUP BY DATATYPE(?o) ORDER BY DESC(?cnt)"; + query = "SELECT ?dt (COUNT(?o) AS ?cnt) " + + "WHERE {" + + "{" + + "SELECT (DATATYPE(?o) AS ?dt) ?o WHERE{?s ?p ?o}" + + "}" + + "}" + + "GROUP BY ?dt"; + rs = executeSelectQuery(query, workingModel); + + if (all > 0) { + currentlyBestAxioms.clear(); + while(rs.hasNext()){ + qs = rs.next(); + Resource type = qs.get("dt").asResource(); + currentlyBestAxioms.add(new EvaluatedAxiom( + new DatatypePropertyRangeAxiom(propertyToDescribe, new Datatype(type.getURI())), + computeScore(all, qs.get("cnt").asLiteral().getInt()))); } - types.add(newType); + } - + offset += limit; + query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + newModel = executeConstructQuery(query); } - return cnt; } + @Override + public Set<KBElement> getPositiveExamples(EvaluatedAxiom evAxiom) { + DatatypePropertyRangeAxiom axiom = (DatatypePropertyRangeAxiom) evAxiom.getAxiom(); + posExamplesQueryTemplate.setIri("dt", axiom.getRange().toString()); + return super.getPositiveExamples(evAxiom); + } + + @Override + public Set<KBElement> getNegativeExamples(EvaluatedAxiom evAxiom) { + DatatypePropertyRangeAxiom axiom = (DatatypePropertyRangeAxiom) evAxiom.getAxiom(); + negExamplesQueryTemplate.setIri("dt", axiom.getRange().toString()); + return super.getNegativeExamples(evAxiom); + } + public static void main(String[] args) throws Exception{ SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW()); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointDataPropertyAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -32,8 +33,13 @@ import org.dllearner.core.EvaluatedAxiom; import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.DataPropertyEditor; +import org.dllearner.core.owl.Datatype; import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.DisjointDatatypePropertyAxiom; +import org.dllearner.core.owl.GenericDatatypePropertyAssertion; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; +import org.dllearner.core.owl.ObjectProperty; import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SPARQLTasks; @@ -42,8 +48,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.RDFNode; @@ -64,6 +72,9 @@ public DisjointDataPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p1 ?o. FILTER NOT EXISTS{?s ?p ?o}}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p ?o. }"); } public DatatypeProperty getPropertyToDescribe() { @@ -94,7 +105,8 @@ allDataProperties.remove(propertyToDescribe); if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ - runSPARQL1_1_Mode(); +// runSPARQL1_1_Mode(); + runSingleQueryMode(); } else { runSPARQL1_0_Mode(); } @@ -102,21 +114,52 @@ logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } + private void runSingleQueryMode(){ + //compute the overlap if exist + Map<ObjectProperty, Integer> property2Overlap = new HashMap<ObjectProperty, Integer>(); + String query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?s ?p ?o.} GROUP BY ?p", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + ObjectProperty prop = new ObjectProperty(qs.getResource("p").getURI()); + int cnt = qs.getLiteral("cnt").getInt(); + property2Overlap.put(prop, cnt); + } + //for each property in knowledge base + for(DatatypeProperty p : allDataProperties){ + //get the popularity + int otherPopularity = reasoner.getPopularity(p); + if(otherPopularity == 0){//skip empty properties + continue; + } + //get the overlap + int overlap = property2Overlap.containsKey(p) ? property2Overlap.get(p) : 0; + //compute the estimated precision + double precision = accuracy(otherPopularity, overlap); + //compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the final score + double score = 1 - fMEasure(precision, recall); + + currentlyBestAxioms.add(new EvaluatedAxiom(new DisjointDatatypePropertyAxiom(propertyToDescribe, p), new AxiomScore(score))); + } + } + private void runSPARQL1_0_Mode() { - Model model = ModelFactory.createDefaultModel(); + workingModel = ModelFactory.createDefaultModel(); int limit = 1000; int offset = 0; String baseQuery = "CONSTRUCT {?s ?p ?o.} WHERE {?s <%s> ?o. ?s ?p ?o.} LIMIT %d OFFSET %d"; + String countQuery = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.} GROUP BY ?p"; String query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); Map<DatatypeProperty, Integer> result = new HashMap<DatatypeProperty, Integer>(); while(!terminationCriteriaSatisfied() && newModel.size() != 0){ - model.add(newModel); - query = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.} GROUP BY ?p"; - + workingModel.add(newModel); DatatypeProperty prop; Integer oldCnt; - ResultSet rs = executeSelectQuery(query, model); + ResultSet rs = executeSelectQuery(countQuery, workingModel); QuerySolution qs; while(rs.hasNext()){ qs = rs.next(); @@ -135,7 +178,7 @@ offset += limit; - query = String.format(baseQuery, propertyToDescribe.getName(), propertyToDescribe.getName(), limit, offset); + query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); } @@ -253,6 +296,56 @@ return axioms; } + @Override + public Set<KBElement> getPositiveExamples(EvaluatedAxiom evAxiom) { + DisjointDatatypePropertyAxiom axiom = (DisjointDatatypePropertyAxiom) evAxiom.getAxiom(); + posExamplesQueryTemplate.setIri("p", axiom.getDisjointRole().getName()); + if(workingModel != null){ + Set<KBElement> posExamples = new HashSet<KBElement>(); + + ResultSet rs = executeSelectQuery(posExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Literal object; + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + subject = new Individual(qs.getResource("s").getURI()); + object = qs.getLiteral("o"); + posExamples.add(new GenericDatatypePropertyAssertion( + propertyToDescribe, subject, object.getLexicalForm(), new Datatype(object.getDatatypeURI()))); + } + + return posExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); + } + } + + @Override + public Set<KBElement> getNegativeExamples(EvaluatedAxiom evAxiom) { + DisjointDatatypePropertyAxiom axiom = (DisjointDatatypePropertyAxiom) evAxiom.getAxiom(); + negExamplesQueryTemplate.setIri("p", axiom.getDisjointRole().getName()); + if(workingModel != null){ + Set<KBElement> negExamples = new TreeSet<KBElement>(); + + ResultSet rs = executeSelectQuery(negExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Literal object; + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + subject = new Individual(qs.getResource("s").getURI()); + object = qs.getLiteral("o"); + negExamples.add(new GenericDatatypePropertyAssertion( + propertyToDescribe, subject, object.getLexicalForm(), new Datatype(object.getDatatypeURI()))); + } + + return negExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); + } + } + public static void main(String[] args) throws Exception{ DisjointDataPropertyAxiomLearner l = new DisjointDataPropertyAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW())); l.setPropertyToDescribe(new DatatypeProperty("http://dbpedia.org/ontology/accessDate")); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/DisjointObjectPropertyAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -33,7 +34,10 @@ import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.ObjectPropertyEditor; import org.dllearner.core.owl.DisjointObjectPropertyAxiom; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.core.owl.ObjectProperty; +import org.dllearner.core.owl.ObjectPropertyAssertion; import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SPARQLTasks; @@ -42,6 +46,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; @@ -64,6 +69,9 @@ public DisjointObjectPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p1 ?o. FILTER NOT EXISTS{?s ?p ?o}}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p ?o. }"); } public ObjectProperty getPropertyToDescribe() { @@ -95,7 +103,8 @@ allObjectProperties.remove(propertyToDescribe); if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ - runSPARQL1_1_Mode(); +// runSPARQL1_1_Mode(); + runSingleQueryMode(); } else { runSPARQL1_0_Mode(); } @@ -103,21 +112,53 @@ logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } + private void runSingleQueryMode(){ + //compute the overlap if exist + Map<ObjectProperty, Integer> property2Overlap = new HashMap<ObjectProperty, Integer>(); + String query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?s ?p ?o.} GROUP BY ?p", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + ObjectProperty prop = new ObjectProperty(qs.getResource("p").getURI()); + int cnt = qs.getLiteral("cnt").getInt(); + property2Overlap.put(prop, cnt); + } + //for each property in knowledge base + for(ObjectProperty p : allObjectProperties){ + //get the popularity + int otherPopularity = reasoner.getPopularity(p); + if(otherPopularity == 0){//skip empty properties + continue; + } + //get the overlap + int overlap = property2Overlap.containsKey(p) ? property2Overlap.get(p) : 0; + //compute the estimated precision + double precision = accuracy(otherPopularity, overlap); + //compute the estimated recall + double recall = accuracy(popularity, overlap); + //compute the final score + double score = 1 - fMEasure(precision, recall); + + currentlyBestAxioms.add(new EvaluatedAxiom(new DisjointObjectPropertyAxiom(propertyToDescribe, p), new AxiomScore(score))); + } + } + private void runSPARQL1_0_Mode() { - Model model = ModelFactory.createDefaultModel(); + workingModel = ModelFactory.createDefaultModel(); int limit = 1000; int offset = 0; String baseQuery = "CONSTRUCT {?s ?p ?o.} WHERE {?s <%s> ?o. ?s ?p ?o.} LIMIT %d OFFSET %d"; + String countQuery = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.} GROUP BY ?p"; String query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); Map<ObjectProperty, Integer> result = new HashMap<ObjectProperty, Integer>(); while(!terminationCriteriaSatisfied() && newModel.size() != 0){ - model.add(newModel); - query = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.} GROUP BY ?p"; + workingModel.add(newModel); ObjectProperty prop; Integer oldCnt; - ResultSet rs = executeSelectQuery(query, model); + ResultSet rs = executeSelectQuery(countQuery, workingModel); QuerySolution qs; while(rs.hasNext()){ qs = rs.next(); @@ -134,7 +175,6 @@ currentlyBestAxioms = buildAxioms(result, allObjectProperties); } - offset += limit; query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); @@ -247,6 +287,54 @@ return axioms; } + @Override + public Set<KBElement> getPositiveExamples(EvaluatedAxiom evAxiom) { + DisjointObjectPropertyAxiom axiom = (DisjointObjectPropertyAxiom) evAxiom.getAxiom(); + posExamplesQueryTemplate.setIri("p", axiom.getDisjointRole().getName()); + if(workingModel != null){ + Set<KBElement> posExamples = new HashSet<KBElement>(); + + ResultSet rs = executeSelectQuery(posExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Individual object; + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + subject = new Individual(qs.getResource("s").getURI()); + object = new Individual(qs.getResource("o").getURI()); + posExamples.add(new ObjectPropertyAssertion(propertyToDescribe, subject, object)); + } + + return posExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); + } + } + + @Override + public Set<KBElement> getNegativeExamples(EvaluatedAxiom evAxiom) { + DisjointObjectPropertyAxiom axiom = (DisjointObjectPropertyAxiom) evAxiom.getAxiom(); + negExamplesQueryTemplate.setIri("p", axiom.getDisjointRole().getName()); + if(workingModel != null){ + Set<KBElement> negExamples = new TreeSet<KBElement>(); + + ResultSet rs = executeSelectQuery(negExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Individual object; + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + subject = new Individual(qs.getResource("s").getURI()); + object = new Individual(qs.getResource("o").getURI()); + negExamples.add(new ObjectPropertyAssertion(propertyToDescribe, subject, object)); + } + + return negExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); + } + } + public static void main(String[] args) throws Exception{ SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); // endpoint = new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList())); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentDataPropertyAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -20,10 +20,8 @@ package org.dllearner.algorithms.properties; import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import java.util.HashSet; +import java.util.Set; import java.util.SortedSet; import org.dllearner.core.AbstractAxiomLearningAlgorithm; @@ -31,16 +29,21 @@ import org.dllearner.core.EvaluatedAxiom; import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.DataPropertyEditor; +import org.dllearner.core.owl.Datatype; import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.EquivalentDatatypePropertiesAxiom; +import org.dllearner.core.owl.GenericDatatypePropertyAssertion; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; -import org.dllearner.learningproblems.AxiomScore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; @@ -54,6 +57,9 @@ public EquivalentDataPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p ?o}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p1 ?o. FILTER NOT EXISTS{?s ?p ?o}}"); + } public DatatypeProperty getPropertyToDescribe() { @@ -70,115 +76,131 @@ startTime = System.currentTimeMillis(); fetchedRows = 0; currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); - //get existing super properties - SortedSet<DatatypeProperty> existingSuperProperties = reasoner.getSuperProperties(propertyToDescribe); - logger.debug("Existing super properties: " + existingSuperProperties); + if(returnOnlyNewAxioms){ + //get existing domains + SortedSet<DatatypeProperty> existingSuperProperties = reasoner.getEquivalentProperties(propertyToDescribe); + if(existingSuperProperties != null && !existingSuperProperties.isEmpty()){ + for(DatatypeProperty supProp : existingSuperProperties){ + existingAxioms.add(new EquivalentDatatypePropertiesAxiom(propertyToDescribe, supProp)); + } + } + } + if(!forceSPARQL_1_0_Mode && ks.supportsSPARQL_1_1()){ - runSPARQL1_1_Mode(); + runSingleQueryMode(); } else { runSPARQL1_0_Mode(); } - logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } + private void runSingleQueryMode(){ + int total = reasoner.getPopularity(propertyToDescribe); + + if(total > 0){ + String query = String.format("SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s <%s> ?o. ?s ?p ?o.} GROUP BY ?p", propertyToDescribe.getName()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + DatatypeProperty prop = new DatatypeProperty(qs.getResource("p").getURI()); + int cnt = qs.getLiteral("cnt").getInt(); + if(!prop.equals(propertyToDescribe)){ + currentlyBestAxioms.add(new EvaluatedAxiom(new EquivalentDatatypePropertiesAxiom(propertyToDescribe, prop), computeScore(total, cnt))); + + } + } + } + } + private void runSPARQL1_0_Mode() { - Model model = ModelFactory.createDefaultModel(); + workingModel = ModelFactory.createDefaultModel(); int limit = 1000; int offset = 0; String baseQuery = "CONSTRUCT {?s ?p ?o.} WHERE {?s <%s> ?o. ?s ?p ?o.} LIMIT %d OFFSET %d"; String query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); Model newModel = executeConstructQuery(query); - Map<DatatypeProperty, Integer> result = new HashMap<DatatypeProperty, Integer>(); while(!terminationCriteriaSatisfied() && newModel.size() != 0){ - model.add(newModel); - query = "SELECT ?p (COUNT(?s) AS ?count) WHERE {?s ?p ?o.} GROUP BY ?p"; + workingModel.add(newModel); + // get number of triples + int all = (int)workingModel.size(); - DatatypeProperty prop; - Integer oldCnt; - ResultSet rs = executeSelectQuery(query, model); - QuerySolution qs; - while(rs.hasNext()){ - qs = rs.next(); - prop = new DatatypeProperty(qs.getResource("p").getURI()); - int newCnt = qs.getLiteral("count").getInt(); - oldCnt = result.get(prop); - if(oldCnt == null){ - oldCnt = Integer.valueOf(newCnt); + if (all > 0) { + // get class and number of instances + query = "SELECT ?p (COUNT(*) AS ?cnt) WHERE {?s ?p ?o.} GROUP BY ?p ORDER BY DESC(?cnt)"; + ResultSet rs = executeSelectQuery(query, workingModel); + + currentlyBestAxioms.clear(); + QuerySolution qs; + DatatypeProperty prop; + while(rs.hasNext()){ + qs = rs.next(); + prop = new DatatypeProperty(qs.get("p").asResource().getURI()); + //omit property to describe as it is trivial + if(prop.equals(propertyToDescribe)){ + continue; + } + currentlyBestAxioms.add(new EvaluatedAxiom( + new EquivalentDatatypePropertiesAxiom(propertyToDescribe, prop), + computeScore(all, qs.get("cnt").asLiteral().getInt()))); } - result.put(prop, oldCnt); - qs.getLiteral("count").getInt(); + } - if(!result.isEmpty()){ - currentlyBestAxioms = buildAxioms(result); - } - - offset += limit; query = String.format(baseQuery, propertyToDescribe.getName(), limit, offset); newModel = executeConstructQuery(query); } - } - private void runSPARQL1_1_Mode() { - // get subjects with types - int limit = 1000; - int offset = 0; - String queryTemplate = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT ?p COUNT(?s) AS ?count WHERE {?s ?p ?o.?p a owl:DatatypeProperty." - + "{SELECT ?s ?o WHERE {?s <%s> ?o.} LIMIT %d OFFSET %d}" + "}"; - String query; - Map<DatatypeProperty, Integer> result = new HashMap<DatatypeProperty, Integer>(); - DatatypeProperty prop; - Integer oldCnt; - boolean repeat = true; - - while (!terminationCriteriaSatisfied() && repeat) { - query = String.format(queryTemplate, propertyToDescribe, limit, - offset); - ResultSet rs = executeSelectQuery(query); + @Override + public Set<KBElement> getPositiveExamples(EvaluatedAxiom evAxiom) { + EquivalentDatatypePropertiesAxiom axiom = (EquivalentDatatypePropertiesAxiom) evAxiom.getAxiom(); + posExamplesQueryTemplate.setIri("p", axiom.getRole().toString()); + if(workingModel != null){ + Set<KBElement> posExamples = new HashSet<KBElement>(); + + ResultSet rs = executeSelectQuery(posExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Literal object; QuerySolution qs; - repeat = false; - while (rs.hasNext()) { + while(rs.hasNext()){ qs = rs.next(); - prop = new DatatypeProperty(qs.getResource("p").getURI()); - int newCnt = qs.getLiteral("count").getInt(); - oldCnt = result.get(prop); - if(oldCnt == null){ - oldCnt = Integer.valueOf(newCnt); - } else { - oldCnt += newCnt; - } - result.put(prop, oldCnt); - qs.getLiteral("count").getInt(); - repeat = true; + subject = new Individual(qs.getResource("s").getURI()); + object = qs.getLiteral("o"); + posExamples.add(new GenericDatatypePropertyAssertion( + propertyToDescribe, subject, object.getLexicalForm(), new Datatype(object.getDatatypeURI()))); } - if (!result.isEmpty()) { - currentlyBestAxioms = buildAxioms(result); - offset += 1000; - } - + + return posExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); } - } - - - private List<EvaluatedAxiom> buildAxioms(Map<DatatypeProperty, Integer> property2Count){ - List<EvaluatedAxiom> axioms = new ArrayList<EvaluatedAxiom>(); - Integer all = property2Count.get(propertyToDescribe); - property2Count.remove(propertyToDescribe); - - EvaluatedAxiom evalAxiom; - for(Entry<DatatypeProperty, Integer> entry : sortByValues(property2Count)){ - evalAxiom = new EvaluatedAxiom(new EquivalentDatatypePropertiesAxiom(propertyToDescribe, entry.getKey()), - new AxiomScore(entry.getValue() / (double)all)); - axioms.add(evalAxiom); + @Override + public Set<KBElement> getNegativeExamples(EvaluatedAxiom evAxiom) { + EquivalentDatatypePropertiesAxiom axiom = (EquivalentDatatypePropertiesAxiom) evAxiom.getAxiom(); + negExamplesQueryTemplate.setIri("p", axiom.getRole().toString()); + if(workingModel != null){ + Set<KBElement> negExamples = new HashSet<KBElement>(); + + ResultSet rs = executeSelectQuery(negExamplesQueryTemplate.toString(), workingModel); + Individual subject; + Literal object; + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + subject = new Individual(qs.getResource("s").getURI()); + object = qs.getLiteral("o"); + negExamples.add(new GenericDatatypePropertyAssertion( + propertyToDescribe, subject, object.getLexicalForm(), new Datatype(object.getDatatypeURI()))); + } + + return negExamples; + } else { + throw new UnsupportedOperationException("Getting positive examples is not possible."); } - - property2Count.put(propertyToDescribe, all); - return axioms; } public static void main(String[] args) throws Exception{ Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-09-27 16:33:12 UTC (rev 3853) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentObjectPropertyAxiomLearner.java 2012-10-05 13:27:40 UTC (rev 3854) @@ -22,27 +22,27 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.SortedSet; +import java.util.TreeSet; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; import org.dllearner.core.EvaluatedAxiom; -import org.dllearner.core.Score; import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.ObjectPropertyEditor; import org.dllearner.core.owl.EquivalentObjectPropertiesAxiom; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.KBElement; import org.dllearner.core.owl.ObjectProperty; +import org.dllearner.core.owl.ObjectPropertyAssertion; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; @@ -58,6 +58,9 @@ public EquivalentObjectPropertyAxiomLearner(SparqlEndpointKS ks){ this.ks = ks; + super.posExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p ?o}"); + super.negExamplesQueryTemplate = new ParameterizedSparqlString("SELECT DISTINCT ?s ?o WHERE {?s ?p1 ?o. FILTER NOT EXISTS{?s ?p ?o}}"); + } public ObjectProperty getPropertyToDescribe() { @@ -74,119 +77,128 @@ startTime = System.currentTimeMillis(); fetchedRows = 0; currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); - //get existing super properties - SortedSet<ObjectProperty> existingSuperProperties = reasoner.getSuperProperties(propertyToDescribe); - logger.debug("Existing super properties: " + existingSuperProperties); + if(returnOnlyNewAxioms){ + //get existing domains + SortedSet<ObjectProperty> existingEquivalentProperties = reasoner.getEquivalentProperties(propertyToDescribe); + if(existingEquivalentProperties != null && !existingEquivalentProperties.isEmpty()){ + for(Obje... [truncated message content] |
From: <lor...@us...> - 2013-01-22 12:44:54
|
Revision: 3886 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3886&view=rev Author: lorenz_b Date: 2013-01-22 12:44:46 +0000 (Tue, 22 Jan 2013) Log Message: ----------- Enabled config option to apply QTL on a local file. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL.java trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL.java 2013-01-22 11:27:57 UTC (rev 3885) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/QTL.java 2013-01-22 12:44:46 UTC (rev 3886) @@ -53,6 +53,7 @@ import org.dllearner.core.options.ConfigOption; import org.dllearner.core.options.IntegerConfigOption; import org.dllearner.core.owl.Individual; +import org.dllearner.kb.LocalModelBasedSparqlEndpointKS; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.CachingConciseBoundedDescriptionGenerator; import org.dllearner.kb.sparql.ConciseBoundedDescriptionGenerator; @@ -69,6 +70,7 @@ import com.hp.hpl.jena.query.ResultSetRewindable; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.util.iterator.Filter; /** @@ -112,6 +114,8 @@ private QueryTree<String> lgg; private SortedSet<String> lggInstances; + + private Set<String> objectNamespacesToIgnore = new HashSet<String>(); public static Collection<ConfigOption<?>> createConfigOptions() { Collection<ConfigOption<?>> options = new LinkedList<ConfigOption<?>>(); @@ -208,9 +212,13 @@ public void setMaxQueryTreeDepth(int maxQueryTreeDepth){ this.maxQueryTreeDepth = maxQueryTreeDepth; - cbdGenerator.setRecursionDepth(maxQueryTreeDepth); +// cbdGenerator.setRecursionDepth(maxQueryTreeDepth); } + public int getMaxQueryTreeDepth() { + return maxQueryTreeDepth; + } + public String getSPARQLQuery(){ if(lgg == null){ lgg = lggGenerator.getLGG(getQueryTrees(posExamples)); @@ -218,6 +226,10 @@ return lgg.toSPARQLQueryString(); } + public void setObjectNamespacesToIgnore(Set<String> namespacesToIgnore){ + this.objectNamespacesToIgnore = namespacesToIgnore; + } + public void setRestrictToNamespaces(List<String> namespaces){ cbdGenerator.setRestrictToNamespaces(namespaces); } @@ -237,12 +249,12 @@ Model model; QueryTree<String> tree; for(String resource : resources){ - if(logger.isDebugEnabled()){ - logger.debug("Tree for resource " + resource); - } + logger.info("Generating tree for " + resource); model = cbdGenerator.getConciseBoundedDescription(resource); + applyFilters(model); tree = treeCache.getQueryTree(resource, model); if(logger.isDebugEnabled()){ + logger.debug("Tree for resource " + resource); logger.debug(tree.getStringRepresentation()); } trees.add(tree); @@ -250,6 +262,19 @@ return trees; } + private void applyFilters(Model model){ + Statement st; + for(StmtIterator iter = model.listStatements(); iter.hasNext();){ + st = iter.next(); + for(String ns : objectNamespacesToIgnore){ + if(st.getObject().isURIResource() && st.getObject().asResource().getURI().startsWith(ns)){ + iter.remove(); + break; + } + } + } + } + private List<String> getKnownResources(){ return ListUtils.union(posExamples, negExamples); } @@ -305,7 +330,7 @@ if(logger.isDebugEnabled()){ logger.debug("LGG: \n" + lgg.getStringRepresentation()); } - + logger.info(lgg.toSPARQLQuery()); } @Override @@ -325,10 +350,14 @@ this.posExamples = convert(((PosNegLP)learningProblem).getPositiveExamples()); this.negExamples = convert(((PosNegLP)learningProblem).getNegativeExamples()); } - endpoint = endpointKS.getEndpoint(); + treeCache = new QueryTreeCache(); - treeCache = new QueryTreeCache(); - cbdGenerator = new CachingConciseBoundedDescriptionGenerator(new ConciseBoundedDescriptionGeneratorImpl(endpoint, cache)); + if(endpointKS instanceof LocalModelBasedSparqlEndpointKS){ + cbdGenerator = new CachingConciseBoundedDescriptionGenerator(new ConciseBoundedDescriptionGeneratorImpl(((LocalModelBasedSparqlEndpointKS) endpointKS).getModel())); + } else { + endpoint = endpointKS.getEndpoint(); + cbdGenerator = new CachingConciseBoundedDescriptionGenerator(new ConciseBoundedDescriptionGeneratorImpl(endpoint, cache)); + } cbdGenerator.setRecursionDepth(maxQueryTreeDepth); lggGenerator = new LGGGeneratorImpl<String>(); Modified: trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2013-01-22 11:27:57 UTC (rev 3885) +++ trunk/components-core/src/main/java/org/dllearner/core/AnnComponentManager.java 2013-01-22 12:44:46 UTC (rev 3886) @@ -74,10 +74,11 @@ "org.dllearner.algorithms.properties.SubDataPropertyOfAxiomLearner", "org.dllearner.algorithms.DisjointClassesLearner", "org.dllearner.algorithms.SimpleSubclassLearner", -// "org.dllearner.algorithm.qtl.QTL", + "org.dllearner.algorithms.qtl.QTL", "org.dllearner.kb.KBFile", "org.dllearner.kb.OWLFile", "org.dllearner.kb.SparqlEndpointKS", + "org.dllearner.kb.LocalModelBasedSparqlEndpointKS", "org.dllearner.kb.sparql.SparqlKnowledgeSource", "org.dllearner.kb.sparql.simple.SparqlSimpleExtractor", "org.dllearner.learningproblems.PosNegLPStandard", Modified: trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java 2013-01-22 11:27:57 UTC (rev 3885) +++ trunk/components-core/src/main/java/org/dllearner/kb/LocalModelBasedSparqlEndpointKS.java 2013-01-22 12:44:46 UTC (rev 3886) @@ -4,6 +4,7 @@ import java.net.MalformedURLException; import java.net.URL; +import org.dllearner.core.ComponentAnn; import org.dllearner.core.ComponentInitException; import com.hp.hpl.jena.ontology.OntModel; @@ -12,25 +13,43 @@ import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; +@ComponentAnn(name = "Local Endpoint", shortName = "local_sparql", version = 0.9) public class LocalModelBasedSparqlEndpointKS extends SparqlEndpointKS { private OntModel model; + private String fileName; - public LocalModelBasedSparqlEndpointKS(OntModel model) { - this.model = model; + public LocalModelBasedSparqlEndpointKS() { } public LocalModelBasedSparqlEndpointKS(String ontologyURL) throws MalformedURLException { this(new URL(ontologyURL)); } + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileName() { + return fileName; + } + public LocalModelBasedSparqlEndpointKS(URL ontologyURL) { + this.fileName = ontologyURL.toString(); + } + + public LocalModelBasedSparqlEndpointKS(OntModel model) { + this.model = model; + } + + @Override + public void init() throws ComponentInitException { Model baseModel = ModelFactory.createDefaultModel(); // use the FileManager to find the input file - InputStream in = FileManager.get().open(ontologyURL.toString()); + InputStream in = FileManager.get().open(fileName); if (in == null) { throw new IllegalArgumentException( - "File: " + ontologyURL + " not found"); + "File: " + fileName + " not found"); } // read the RDF/XML file baseModel.read(in, null); @@ -38,11 +57,6 @@ model = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF, baseModel); } - @Override - public void init() throws ComponentInitException { - - } - public OntModel getModel() { return model; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-02-06 17:59:29
|
Revision: 3894 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3894&view=rev Author: lorenz_b Date: 2013-02-06 17:59:21 +0000 (Wed, 06 Feb 2013) Log Message: ----------- Added short form provider for IRIs based on labels in KB. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/kb/sparql/ConciseBoundedDescriptionGeneratorImpl.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/ConciseBoundedDescriptionGeneratorImpl.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/ConciseBoundedDescriptionGeneratorImpl.java 2013-01-30 09:55:24 UTC (rev 3893) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/ConciseBoundedDescriptionGeneratorImpl.java 2013-02-06 17:59:21 UTC (rev 3894) @@ -11,7 +11,7 @@ import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; +//import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; public class ConciseBoundedDescriptionGeneratorImpl implements ConciseBoundedDescriptionGenerator{ @@ -166,7 +166,7 @@ } for (String ngu : endpoint.getNamedGraphURIs()) { queryExecution.addNamedGraph(ngu); - } + } model = queryExecution.execConstruct(); } else { model = cache.executeConstructQuery(endpoint, query); Added: trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java 2013-02-06 17:59:21 UTC (rev 3894) @@ -0,0 +1,535 @@ +package org.dllearner.kb.sparql; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.openjena.atlas.io.IO; +import org.openjena.riot.Lang; +import org.openjena.riot.RiotReader; +import org.openjena.riot.WebContent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.hp.hpl.jena.graph.Triple; +import com.hp.hpl.jena.query.ARQ; +import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.QueryException; +import com.hp.hpl.jena.query.QueryExecException; +import com.hp.hpl.jena.query.QueryExecution; +import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.query.ResultSetFactory; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.sparql.ARQException; +import com.hp.hpl.jena.sparql.engine.http.HttpParams; +import com.hp.hpl.jena.sparql.engine.http.HttpQuery; +import com.hp.hpl.jena.sparql.engine.http.Params; +import com.hp.hpl.jena.sparql.graph.GraphFactory; +import com.hp.hpl.jena.sparql.resultset.CSVInput; +import com.hp.hpl.jena.sparql.resultset.JSONInput; +import com.hp.hpl.jena.sparql.resultset.XMLInput; +import com.hp.hpl.jena.sparql.util.Context; +import com.hp.hpl.jena.util.FileManager; + + +public class QueryEngineHTTP implements QueryExecution +{ + private static Logger log = LoggerFactory.getLogger(QueryEngineHTTP.class) ; + + public static final String QUERY_MIME_TYPE = WebContent.contentTypeSPARQLQuery ; // "application/sparql-query" ; + private final Query query ; + private final String queryString ; + private final String service ; + private final Context context ; + + //Params + Params params = null ; + + // Protocol + List<String> defaultGraphURIs = new ArrayList<String>() ; + List<String> namedGraphURIs = new ArrayList<String>() ; + private String user = null ; + private char[] password = null ; + + private boolean finished = false ; + + //Timeouts + private long connectTimeout = 0; + private TimeUnit connectTimeoutUnit = TimeUnit.MILLISECONDS; + private long readTimeout = 0; + private TimeUnit readTimeoutUnit = TimeUnit.MILLISECONDS; + + //Compression Support + private boolean allowGZip = true ; + private boolean allowDeflate = true; + + //Content Types + private String selectContentType = WebContent.contentTypeResultsXML; + private String askContentType = WebContent.contentTypeResultsXML; + private String modelContentType = WebContent.contentTypeRDFXML; + public static String[] supportedSelectContentTypes = new String [] + { + WebContent.contentTypeResultsXML, + WebContent.contentTypeResultsJSON, + WebContent.contentTypeTextTSV, + WebContent.contentTypeTextCSV + }; + public static String[] supportedAskContentTypes = new String [] + { + WebContent.contentTypeResultsXML, + WebContent.contentTypeJSON + }; + + // Releasing HTTP input streams is important. We remember this for SELECT, + // and will close when the engine is closed + private InputStream retainedConnection = null; + + public QueryEngineHTTP(String serviceURI, Query query) + { + this(serviceURI, query, query.toString()) ; + } + + public QueryEngineHTTP(String serviceURI, String queryString) + { + this(serviceURI, null, queryString) ; + } + + private QueryEngineHTTP(String serviceURI, Query query, String queryString) + { + this.query = query ; + this.queryString = queryString ; + this.service = serviceURI ; + // Copy the global context to freeze it. + this.context = new Context(ARQ.getContext()) ; + } + +// public void setParams(Params params) +// { this.params = params ; } + + // Meaning-less + @Override + public void setFileManager(FileManager fm) + { throw new UnsupportedOperationException("FileManagers do not apply to remote query execution") ; } + + @Override + public void setInitialBinding(QuerySolution binding) + { throw new UnsupportedOperationException("Initial bindings not supported for remote queries, consider using a ParameterizedSparqlString to prepare a query for remote execution") ; } + + public void setInitialBindings(ResultSet table) + { throw new UnsupportedOperationException("Initial bindings not supported for remote queries, consider using a ParameterizedSparqlString to prepare a query for remote execution") ; } + + /** @param defaultGraphURIs The defaultGraphURIs to set. */ + public void setDefaultGraphURIs(List<String> defaultGraphURIs) + { + this.defaultGraphURIs = defaultGraphURIs ; + } + + /** @param namedGraphURIs The namedGraphURIs to set. */ + public void setNamedGraphURIs(List<String> namedGraphURIs) + { + this.namedGraphURIs = namedGraphURIs ; + } + + /** + * Sets whether the HTTP request will specify Accept-Encoding: gzip + */ + public void setAllowGZip(boolean allowed) + { + allowGZip = allowed; + } + + /** + * Sets whether the HTTP requests will specify Accept-Encoding: deflate + */ + public void setAllowDeflate(boolean allowed) + { + allowDeflate = allowed; + } + + public void addParam(String field, String value) + { + if ( params == null ) + params = new Params() ; + params.addParam(field, value) ; + } + + /** @param defaultGraph The defaultGraph to add. */ + public void addDefaultGraph(String defaultGraph) + { + if ( defaultGraphURIs == null ) + defaultGraphURIs = new ArrayList<String>() ; + defaultGraphURIs.add(defaultGraph) ; + } + + /** @param name The URI to add. */ + public void addNamedGraph(String name) + { + if ( namedGraphURIs == null ) + namedGraphURIs = new ArrayList<String>() ; + namedGraphURIs.add(name) ; + } + + /** Set user and password for basic authentication. + * After the request is made (one of the exec calls), the application + * can overwrite the password array to remove details of the secret. + * @param user + * @param password + */ + public void setBasicAuthentication(String user, char[] password) + { + this.user = user ; + this.password = password ; + } + + @Override + public ResultSet execSelect() + { + HttpQuery httpQuery = makeHttpQuery() ; + httpQuery.setAccept(selectContentType) ; + InputStream in = httpQuery.exec() ; + + if ( false ) + { + byte b[] = IO.readWholeFile(in) ; + String str = new String(b) ; + System.out.println(str) ; + in = new ByteArrayInputStream(b) ; + } + + retainedConnection = in; // This will be closed on close() + + //TODO: Find a way to auto-detect how to create the ResultSet based on the content type in use + + //Don't assume the endpoint actually gives back the content type we asked for + String actualContentType = httpQuery.getContentType(); + + //If the server fails to return a Content-Type then we will assume + //the server returned the type we asked for + if (actualContentType == null || actualContentType.equals("")) + { + actualContentType = selectContentType; + } + + if (actualContentType.equals(WebContent.contentTypeResultsXML)) + return ResultSetFactory.fromXML(in); + if (actualContentType.equals(WebContent.contentTypeResultsJSON)) + return ResultSetFactory.fromJSON(in); + if (actualContentType.equals(WebContent.contentTypeTextTSV)) + return ResultSetFactory.fromTSV(in); + if (actualContentType.equals(WebContent.contentTypeTextCSV)) + return CSVInput.fromCSV(in); + throw new QueryException("Endpoint returned Content-Type: " + actualContentType + " which is not currently supported for SELECT queries"); + } + + @Override + public Model execConstruct() { return execConstruct(GraphFactory.makeJenaDefaultModel()) ; } + + @Override + public Model execConstruct(Model model) { return execModel(model) ; } + + @Override + public Iterator<Triple> execConstructTriples() { return execTriples() ; } + + @Override + public Model execDescribe() { return execDescribe(GraphFactory.makeJenaDefaultModel()) ; } + + @Override + public Model execDescribe(Model model) { return execModel(model) ; } + + @Override + public Iterator<Triple> execDescribeTriples() { return execTriples() ; } + + private Model execModel(Model model) + { + HttpQuery httpQuery = makeHttpQuery() ; + httpQuery.setAccept(WebContent.contentTypeNTriples) ; + InputStream in = httpQuery.exec() ; + + //Don't assume the endpoint actually gives back the content type we asked for + String actualContentType = httpQuery.getContentType(); + + //If the server fails to return a Content-Type then we will assume + //the server returned the type we asked for + if (actualContentType == null || actualContentType.equals("")) + { + actualContentType = modelContentType; + } + + //Try to select language appropriately here based on the model content type + Lang lang = WebContent.contentTypeToLang(actualContentType); + if (!lang.isTriples()) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); + model.read(in, null, "N-TRIPLES") ; + + return model ; + } + + private Iterator<Triple> execTriples() + { + HttpQuery httpQuery = makeHttpQuery() ; + httpQuery.setAccept(modelContentType) ; + InputStream in = httpQuery.exec() ; + + //Don't assume the endpoint actually gives back the content type we asked for + String actualContentType = httpQuery.getContentType(); + + //If the server fails to return a Content-Type then we will assume + //the server returned the type we asked for + if (actualContentType == null || actualContentType.equals("")) + { + actualContentType = modelContentType; + } + + //Try to select language appropriately here based on the model content type + Lang lang = WebContent.contentTypeToLang(actualContentType); + if (!lang.isTriples()) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); + + return RiotReader.createIteratorTriples(in, lang, null); + } + + @Override + public boolean execAsk() + { + HttpQuery httpQuery = makeHttpQuery() ; + httpQuery.setAccept(askContentType) ; + InputStream in = httpQuery.exec() ; + + try { + //Don't assume the endpoint actually gives back the content type we asked for + String actualContentType = httpQuery.getContentType(); + + //If the server fails to return a Content-Type then we will assume + //the server returned the type we asked for + if (actualContentType == null || actualContentType.equals("")) + { + actualContentType = askContentType; + } + + //Parse the result appropriately depending on the selected content type + if (askContentType.equals(WebContent.contentTypeResultsXML)) + return XMLInput.booleanFromXML(in) ; + if (askContentType.equals(WebContent.contentTypeResultsJSON)) + return JSONInput.booleanFromJSON(in) ; + throw new QueryException("Endpoint returned Content-Type: " + actualContentType + " which is not currently supported for ASK queries"); + } finally { + // Ensure connection is released + try { in.close(); } + catch (java.io.IOException e) { log.warn("Failed to close connection", e); } + } + } + + @Override + public Context getContext() { return context ; } + + @Override public Dataset getDataset() { return null ; } + + // This may be null - if we were created form a query string, + // we don't guarantee to parse it so we let through non-SPARQL + // extensions to the far end. + @Override public Query getQuery() { return query ; } + + @Override + public void setTimeout(long readTimeout) + { + this.readTimeout = readTimeout; + this.readTimeoutUnit = TimeUnit.MILLISECONDS; + } + + @Override + public void setTimeout(long readTimeout, long connectTimeout) + { + this.readTimeout = readTimeout; + this.readTimeoutUnit = TimeUnit.MILLISECONDS; + this.connectTimeout = connectTimeout; + this.connectTimeoutUnit = TimeUnit.MILLISECONDS; + } + + + @Override + public void setTimeout(long readTimeout, TimeUnit timeoutUnits) + { + this.readTimeout = readTimeout; + this.readTimeoutUnit = timeoutUnits; + } + + @Override + public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) + { + this.readTimeout = timeout1; + this.readTimeoutUnit = timeUnit1; + this.connectTimeout = timeout2; + this.connectTimeoutUnit = timeUnit2; + } + + private HttpQuery makeHttpQuery() + { + // Also need to tie to ResultSet returned which is streamed back if StAX. + if ( finished ) + throw new ARQException("HTTP execution already closed") ; + + HttpQuery httpQuery = new HttpQuery(service) ; + httpQuery.merge(getServiceParams(service, context)) ; + httpQuery.addParam(HttpParams.pQuery, queryString ); + + for ( Iterator<String> iter = defaultGraphURIs.iterator() ; iter.hasNext() ; ) + { + String dft = iter.next() ; + httpQuery.addParam(HttpParams.pDefaultGraph, dft) ; + } + for ( Iterator<String> iter = namedGraphURIs.iterator() ; iter.hasNext() ; ) + { + String name = iter.next() ; + httpQuery.addParam(HttpParams.pNamedGraph, name) ; + } + + if ( params != null ) + httpQuery.merge(params) ; + + if (allowGZip) + httpQuery.setAllowGZip(true); + + if (allowDeflate) + httpQuery.setAllowDeflate(true); + + httpQuery.setBasicAuthentication(user, password) ; + + //Apply timeouts + if (connectTimeout > 0) + { + httpQuery.setConnectTimeout((int)connectTimeoutUnit.toMillis(connectTimeout)); + } + if (readTimeout > 0) + { + httpQuery.setReadTimeout((int)readTimeoutUnit.toMillis(readTimeout)); + } + + return httpQuery ; + } + + + // This is to allow setting additional/optional query parameters on a per SERVICE level, see: JENA-195 + protected static Params getServiceParams(String serviceURI, Context context) throws QueryExecException + { + Params params = new Params(); + @SuppressWarnings("unchecked") + Map<String, Map<String,List<String>>> serviceParams = (Map<String, Map<String,List<String>>>)context.get(ARQ.serviceParams) ; + if ( serviceParams != null ) + { + Map<String,List<String>> paramsMap = serviceParams.get(serviceURI) ; + if ( paramsMap != null ) + { + for (String param : paramsMap.keySet()) + { + if ( HttpParams.pQuery.equals(param) ) + throw new QueryExecException("ARQ serviceParams overrides the 'query' SPARQL protocol parameter") ; + + List<String> values = paramsMap.get(param) ; + for (String value : values) + params.addParam(param, value) ; + } + } + } + return params; + } + + public void cancel() { finished = true ; } + + @Override + public void abort() { try { close() ; } catch (Exception ex) {} } + + @Override + public void close() { + finished = false ; + if (retainedConnection != null) { + try { retainedConnection.close(); } + catch (java.io.IOException e) { log.warn("Failed to close connection", e); } + finally { retainedConnection = null; } + } + } + +// public boolean isActive() { return false ; } + + @Override + public String toString() + { + HttpQuery httpQuery = makeHttpQuery() ; + return "GET "+httpQuery.toString() ; + } + + /** + * Sets the Content Type for SELECT queries provided that the format is supported + * @param contentType + */ + public void setSelectContentType(String contentType) + { + boolean ok = false; + for (String supportedType : supportedSelectContentTypes) + { + if (supportedType.equals(contentType)) + { + ok = true; + break; + } + } + if (!ok) throw new IllegalArgumentException("Given Content Type '" + contentType + "' is not a supported SELECT results format"); + selectContentType = contentType; + } + + /** + * Sets the Content Type for ASK queries provided that the format is supported + * @param contentType + */ + public void setAskContentType(String contentType) + { + boolean ok = false; + for (String supportedType : supportedAskContentTypes) + { + if (supportedType.equals(contentType)) + { + ok = true; + break; + } + } + if (!ok) throw new IllegalArgumentException("Given Content Type '" + contentType + "' is not a supported ASK results format"); + askContentType = contentType; + } + + /** + * Sets the Content Type for CONSTRUCT/DESCRIBE queries provided that the format is supported + * @param contentType + */ + public void setModelContentType(String contentType) + { + //Check that this is a valid setting + Lang lang = WebContent.contentTypeToLang(contentType); + if (lang == null) throw new IllegalArgumentException("Given Content Type '" + contentType + "' is not supported by RIOT"); + if (!lang.isTriples()) throw new IllegalArgumentException("Given Content Type '" + contentType + " is not a RDF Graph format"); + + modelContentType = contentType; + } +} + Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-01-30 09:55:24 UTC (rev 3893) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-02-06 17:59:21 UTC (rev 3894) @@ -1107,7 +1107,7 @@ logger.debug("Sending query \n {}", query); ResultSet rs = null; if(ks.isRemote()){ - if(useCache){ + if(useCache && cache != null){ rs = SparqlQuery.convertJSONtoResultSet(cache.executeSelectQuery(ks.getEndpoint(), query)); } else { QueryEngineHTTP queryExecution = new QueryEngineHTTP(ks.getEndpoint().getURL().toString(), query); Added: trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java 2013-02-06 17:59:21 UTC (rev 3894) @@ -0,0 +1,76 @@ +package org.dllearner.utilities; + +import org.dllearner.kb.sparql.ExtractionDBCache; +import org.dllearner.kb.sparql.SparqlEndpoint; +import org.dllearner.kb.sparql.SparqlQuery; +import org.semanticweb.owlapi.model.OWLEntity; +import org.semanticweb.owlapi.util.ShortFormProvider; +import org.semanticweb.owlapi.util.SimpleIRIShortFormProvider; + +import com.hp.hpl.jena.query.ParameterizedSparqlString; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; +import com.hp.hpl.jena.vocabulary.RDFS; + +public class LabelShortFormProvider implements ShortFormProvider{ + + private final ParameterizedSparqlString queryTemplate = new ParameterizedSparqlString( + "SELECT ?label WHERE {?entity ?labelProperty ?label. FILTER(LANGMATCHES(LANG(?label),'en'))} LIMIT 1"); + private String labelProperty = RDFS.label.getURI(); + + private final SimpleIRIShortFormProvider fallback = new SimpleIRIShortFormProvider(); + + private ExtractionDBCache cache; + private SparqlEndpoint endpoint; + + public LabelShortFormProvider(SparqlEndpoint endpoint) { + this.endpoint = endpoint; + } + + public LabelShortFormProvider(SparqlEndpoint endpoint, ExtractionDBCache cache) { + this.endpoint = endpoint; + this.cache = cache; + } + + public void setLabelProperty(String labelProperty) { + this.labelProperty = labelProperty; + } + + @Override + public void dispose() { + } + + @Override + public String getShortForm(OWLEntity entity) { + queryTemplate.clearParams(); + queryTemplate.setIri("entity", entity.toStringID()); + queryTemplate.setIri("labelProperty", labelProperty); + Query query = queryTemplate.asQuery(); + ResultSet rs = executeSelect(query); + String label = null; + if(rs.hasNext()){ + label = rs.next().getLiteral("label").asLiteral().getLexicalForm(); + } else { + label = fallback.getShortForm(entity.getIRI()); + } + return label; + } + + protected ResultSet executeSelect(Query query){ + ResultSet rs = null; + if(cache != null){ + rs = SparqlQuery.convertJSONtoResultSet(cache.executeSelectQuery(endpoint, query.toString())); + } else { + QueryEngineHTTP qe = new QueryEngineHTTP(endpoint.getURL().toString(), query); + for(String uri : endpoint.getDefaultGraphURIs()){ + qe.addDefaultGraph(uri); + } + rs = qe.execSelect(); + } + return rs; + } + + + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-02-11 12:18:12
|
Revision: 3898 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3898&view=rev Author: lorenz_b Date: 2013-02-11 12:18:04 +0000 (Mon, 11 Feb 2013) Log Message: ----------- Changed datatype URI to IRI to avoid problems with special chars. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/core/owl/Datatype.java trunk/components-core/src/main/java/org/dllearner/core/owl/OWL2Datatype.java trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyOWLAPIReasoner.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIConverter.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIDescriptionConvertVisitor.java Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/Datatype.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/Datatype.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/Datatype.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -19,7 +19,6 @@ package org.dllearner.core.owl; -import java.net.URI; import java.util.Map; import org.semanticweb.owlapi.model.IRI; @@ -31,19 +30,19 @@ */ public class Datatype implements DataRange, Comparable<Datatype> { - private URI uri; + private IRI iri; - public Datatype(String uriString) { - uri = URI.create(uriString); + public Datatype(String iriString) { + iri = IRI.create(iriString); } - public URI getURI() { - return uri; + public IRI getIRI() { + return iri; } @Override public String toString() { - return uri.toString(); + return iri.toString(); } public int getLength() { @@ -55,11 +54,11 @@ } public String toString(String baseURI, Map<String, String> prefixes) { - return uri.toString(); + return iri.toString(); } public String toKBSyntaxString(String baseURI, Map<String, String> prefixes) { - return uri.toString(); + return iri.toString(); } /* (non-Javadoc) @@ -67,14 +66,14 @@ */ @Override public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) { - return uri.toString(); + return iri.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((uri == null) ? 0 : uri.hashCode()); + result = prime * result + ((iri == null) ? 0 : iri.hashCode()); return result; } @@ -87,16 +86,16 @@ if (getClass() != obj.getClass()) return false; Datatype other = (Datatype) obj; - if (uri == null) { - if (other.uri != null) + if (iri == null) { + if (other.iri != null) return false; - } else if (!uri.equals(other.uri)) + } else if (!iri.equals(other.iri)) return false; return true; } @Override public int compareTo(Datatype o) { - return this.getURI().compareTo(o.getURI()); + return this.getIRI().compareTo(o.getIRI()); } } Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/OWL2Datatype.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/OWL2Datatype.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/OWL2Datatype.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -19,7 +19,7 @@ package org.dllearner.core.owl; -import java.net.URI; +import org.semanticweb.owlapi.model.IRI; public enum OWL2Datatype { @@ -41,8 +41,8 @@ return datatype; } - public URI getURI() { - return datatype.getURI(); + public IRI getIRI() { + return datatype.getIRI(); } } 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 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/TypedConstant.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -99,7 +99,7 @@ */ public int compareTo(TypedConstant o) { // the first criteria is the datatype - int datatypeComparision = datatype.getURI().compareTo(datatype.getURI()); + int datatypeComparision = datatype.getIRI().compareTo(datatype.getIRI()); if(datatypeComparision == 0) { // the second criterion is the literal value return literal.compareTo(o.literal); Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -20,7 +20,6 @@ package org.dllearner.reasoning; import java.io.File; -import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -379,19 +378,23 @@ for (OWLDataProperty owlProperty : owlDatatypeProperties) { DatatypeProperty dtp = new DatatypeProperty(owlProperty.toStringID()); Set<OWLDataRange> ranges = owlProperty.getRanges(allImports); - Iterator<OWLDataRange> it = ranges.iterator(); - if (it.hasNext()) { - OWLDataRange range = it.next(); - if (range.isDatatype()) { - URI uri = ((OWLDatatype) range).getIRI().toURI(); - if (uri.equals(OWL2Datatype.BOOLEAN.getURI())) booleanDatatypeProperties.add(dtp); - else if (uri.equals(OWL2Datatype.DOUBLE.getURI())) doubleDatatypeProperties.add(dtp); - else if (uri.equals(OWL2Datatype.INT.getURI())) intDatatypeProperties.add(dtp); - else if (uri.equals(OWL2Datatype.STRING.getURI())) stringDatatypeProperties.add(dtp); - } - } else { - stringDatatypeProperties.add(dtp); - } + Iterator<OWLDataRange> it = ranges.iterator(); + if (it.hasNext()) { + OWLDataRange range = it.next(); + if (range.isDatatype()) { + IRI iri = ((OWLDatatype) range).getIRI(); + if (iri.equals(OWL2Datatype.BOOLEAN.getIRI())) + booleanDatatypeProperties.add(dtp); + else if (iri.equals(OWL2Datatype.DOUBLE.getIRI())) + doubleDatatypeProperties.add(dtp); + else if (iri.equals(OWL2Datatype.INT.getIRI())) + intDatatypeProperties.add(dtp); + else if (iri.equals(OWL2Datatype.STRING.getIRI())) + stringDatatypeProperties.add(dtp); + } + } else { + stringDatatypeProperties.add(dtp); + } datatypeProperties.add(dtp); } for (OWLNamedIndividual owlIndividual : owlIndividuals) { Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -20,7 +20,6 @@ package org.dllearner.reasoning; import java.io.File; -import java.net.URI; import java.net.URISyntaxException; import java.util.Collection; import java.util.Collections; @@ -255,14 +254,14 @@ if(it.hasNext()) { OWLDataRange range = it.next(); if(range.isDatatype()) { - URI uri = ((OWLDatatype)range).getIRI().toURI(); - if(uri.equals(OWL2Datatype.BOOLEAN.getURI())) + IRI iri = ((OWLDatatype)range).getIRI(); + if(iri.equals(OWL2Datatype.BOOLEAN.getIRI())) booleanDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.DOUBLE.getURI())) + else if(iri.equals(OWL2Datatype.DOUBLE.getIRI())) doubleDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.INT.getURI())) + else if(iri.equals(OWL2Datatype.INT.getIRI())) intDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.STRING.getURI())) + else if(iri.equals(OWL2Datatype.STRING.getIRI())) stringDatatypeProperties.add(dtp); } } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyOWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyOWLAPIReasoner.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyOWLAPIReasoner.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -21,7 +21,6 @@ import java.io.File; import java.net.MalformedURLException; -import java.net.URI; import java.net.URL; import java.util.Collection; import java.util.Collections; @@ -116,8 +115,6 @@ import org.semanticweb.owlapi.util.SimpleIRIMapper; import org.semanticweb.owlapi.vocab.PrefixOWLOntologyFormat; -import uk.ac.manchester.cs.factplusplus.owlapiv3.FaCTPlusPlusReasonerFactory; - import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory; /** @@ -385,14 +382,14 @@ if(it.hasNext()) { OWLDataRange range = it.next(); if(range.isDatatype()) { - URI uri = ((OWLDatatype)range).getIRI().toURI(); - if(uri.equals(OWL2Datatype.BOOLEAN.getURI())) + IRI iri = ((OWLDatatype)range).getIRI(); + if(iri.equals(OWL2Datatype.BOOLEAN.getIRI())) booleanDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.DOUBLE.getURI())) + else if(iri.equals(OWL2Datatype.DOUBLE.getIRI())) doubleDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.INT.getURI())) + else if(iri.equals(OWL2Datatype.INT.getIRI())) intDatatypeProperties.add(dtp); - else if(uri.equals(OWL2Datatype.STRING.getURI())) + else if(iri.equals(OWL2Datatype.STRING.getIRI())) stringDatatypeProperties.add(dtp); } } else { Modified: trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -346,7 +346,7 @@ public void visit(DatatypePropertyRangeAxiom axiom) { DataRange dr = axiom.getRange(); Datatype dt = (Datatype) dr; - OWLDatatype odt = factory.getOWLDatatype(IRI.create(dt.getURI())); + OWLDatatype odt = factory.getOWLDatatype(dt.getIRI()); OWLDataProperty dp = factory.getOWLDataProperty(IRI.create(axiom.getProperty().getName())); OWLAxiom axiomOWLAPI = factory.getOWLDataPropertyRangeAxiom(dp, odt); addAxiom(axiomOWLAPI); Modified: trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIConverter.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIConverter.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIConverter.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -19,7 +19,6 @@ package org.dllearner.utilities.owl; -import java.net.URI; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -177,20 +176,20 @@ } public static Datatype convertDatatype(OWLDatatype dataType) { - URI uri = dataType.getIRI().toURI(); - if(uri.equals(OWL2Datatype.BOOLEAN.getURI())) + IRI iri = dataType.getIRI(); + if(iri.equals(OWL2Datatype.BOOLEAN.getIRI())) return OWL2Datatype.BOOLEAN.getDatatype(); - else if(uri.equals(OWL2Datatype.DOUBLE.getURI())) + else if(iri.equals(OWL2Datatype.DOUBLE.getIRI())) return OWL2Datatype.DOUBLE.getDatatype(); - else if(uri.equals(OWL2Datatype.INT.getURI())) + else if(iri.equals(OWL2Datatype.INT.getIRI())) return OWL2Datatype.INT.getDatatype(); - else if(uri.equals(OWL2Datatype.INTEGER.getURI())) + else if(iri.equals(OWL2Datatype.INTEGER.getIRI())) return OWL2Datatype.INTEGER.getDatatype(); - else if(uri.equals(OWL2Datatype.STRING.getURI())) + else if(iri.equals(OWL2Datatype.STRING.getIRI())) return OWL2Datatype.STRING.getDatatype(); - else if(uri.equals(OWL2Datatype.DATE.getURI())) + else if(iri.equals(OWL2Datatype.DATE.getIRI())) return OWL2Datatype.DATE.getDatatype(); - else if(uri.equals(OWL2Datatype.DATETIME.getURI())) + else if(iri.equals(OWL2Datatype.DATETIME.getIRI())) return OWL2Datatype.DATETIME.getDatatype(); throw new Error("Unsupported datatype " + dataType + ". Please inform a DL-Learner developer to add it."); } Modified: trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIDescriptionConvertVisitor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIDescriptionConvertVisitor.java 2013-02-07 14:03:54 UTC (rev 3897) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIDescriptionConvertVisitor.java 2013-02-11 12:18:04 UTC (rev 3898) @@ -340,7 +340,7 @@ else if(datatype.equals(OWL2Datatype.DOUBLE.getDatatype())) return factory.getDoubleOWLDatatype(); else if(datatype.equals(OWL2Datatype.STRING.getDatatype())) - return factory.getOWLDatatype(IRI.create(OWL2Datatype.STRING.getURI())); + return factory.getOWLDatatype(OWL2Datatype.STRING.getIRI()); throw new Error("OWLAPIDescriptionConverter: datatype "+datatype+" not implemented"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-04-10 10:06:41
|
Revision: 3915 http://sourceforge.net/p/dl-learner/code/3915 Author: lorenz_b Date: 2013-04-10 10:06:38 +0000 (Wed, 10 Apr 2013) Log Message: ----------- Fixed bug. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/OWLAxiomRenamer.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/OWLAxiomRenamer.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/OWLAxiomRenamer.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/OWLAxiomRenamer.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -58,7 +58,7 @@ public class OWLAxiomRenamer implements OWLAxiomVisitor { private OWLDataFactory df; - private OWLClassExpressionRenamer renamer; + private OWLClassExpressionRenamer expressionRenamer; private OWLAxiom renamedAxiom; public OWLAxiomRenamer(OWLDataFactory df) { @@ -67,7 +67,7 @@ public OWLAxiom rename(OWLAxiom axiom){ Map<OWLEntity, OWLEntity> renaming = new HashMap<OWLEntity, OWLEntity>(); - renamer = new OWLClassExpressionRenamer(df, renaming); + expressionRenamer = new OWLClassExpressionRenamer(df, renaming); axiom.accept(this); return renamedAxiom; } @@ -75,9 +75,9 @@ @Override public void visit(OWLSubClassOfAxiom axiom) { OWLClassExpression subClass = axiom.getSubClass(); - subClass = renamer.rename(subClass); + subClass = expressionRenamer.rename(subClass); OWLClassExpression superClass = axiom.getSuperClass(); - superClass = renamer.rename(superClass); + superClass = expressionRenamer.rename(superClass); renamedAxiom = df.getOWLSubClassOfAxiom(subClass, superClass); } @@ -120,18 +120,18 @@ @Override public void visit(OWLDataPropertyDomainAxiom axiom) { OWLDataPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); OWLClassExpression domain = axiom.getDomain(); - domain = renamer.rename(domain); + domain = expressionRenamer.rename(domain); renamedAxiom = df.getOWLDataPropertyDomainAxiom(property, domain); } @Override public void visit(OWLObjectPropertyDomainAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); OWLClassExpression domain = axiom.getDomain(); - domain = renamer.rename(domain); + domain = expressionRenamer.rename(domain); renamedAxiom = df.getOWLObjectPropertyDomainAxiom(property, domain); } @@ -158,9 +158,9 @@ @Override public void visit(OWLObjectPropertyRangeAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); OWLClassExpression range = axiom.getRange(); - range = renamer.rename(range); + range = expressionRenamer.rename(range); renamedAxiom = df.getOWLObjectPropertyDomainAxiom(property, range); } @@ -171,7 +171,7 @@ @Override public void visit(OWLFunctionalObjectPropertyAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); renamedAxiom = df.getOWLFunctionalObjectPropertyAxiom(property); } @@ -186,23 +186,23 @@ @Override public void visit(OWLSymmetricObjectPropertyAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); renamedAxiom = df.getOWLSymmetricObjectPropertyAxiom(property); } @Override public void visit(OWLDataPropertyRangeAxiom axiom) { OWLDataPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); OWLDataRange range = axiom.getRange(); - range = renamer.rename(range); + range = expressionRenamer.rename(range); renamedAxiom = df.getOWLDataPropertyRangeAxiom(property, range); } @Override public void visit(OWLFunctionalDataPropertyAxiom axiom) { OWLDataPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); renamedAxiom = df.getOWLFunctionalDataPropertyAxiom(property); } @@ -213,9 +213,9 @@ @Override public void visit(OWLClassAssertionAxiom axiom) { OWLClassExpression classExpression = axiom.getClassExpression(); - classExpression = renamer.rename(classExpression); + classExpression = expressionRenamer.rename(classExpression); OWLIndividual individual = axiom.getIndividual(); - individual = renamer.rename(individual); + individual = expressionRenamer.rename(individual); renamedAxiom = df.getOWLClassAssertionAxiom(classExpression, individual); } @@ -224,7 +224,7 @@ List<OWLClassExpression> classExpressions = axiom.getClassExpressionsAsList(); List<OWLClassExpression> renamedClassExpressions = new ArrayList<OWLClassExpression>(); for (OWLClassExpression expr : classExpressions) { - renamedClassExpressions.add(renamer.rename(expr)); + renamedClassExpressions.add(expressionRenamer.rename(expr)); } renamedAxiom = df.getOWLEquivalentClassesAxiom(new TreeSet<OWLClassExpression>(renamedClassExpressions)); } @@ -236,14 +236,14 @@ @Override public void visit(OWLTransitiveObjectPropertyAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); renamedAxiom = df.getOWLTransitiveObjectPropertyAxiom(property); } @Override public void visit(OWLIrreflexiveObjectPropertyAxiom axiom) { OWLObjectPropertyExpression property = axiom.getProperty(); - property = renamer.rename(property); + property = expressionRenamer.rename(property); renamedAxiom = df.getOWLIrreflexiveObjectPropertyAxiom(property); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/FunctionalDataPropertyAxiomLearner.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -20,6 +20,7 @@ package org.dllearner.algorithms.properties; import java.util.ArrayList; +import java.util.List; import org.dllearner.core.AbstractAxiomLearningAlgorithm; import org.dllearner.core.ComponentAnn; @@ -29,6 +30,8 @@ import org.dllearner.core.owl.DatatypeProperty; import org.dllearner.core.owl.FunctionalDatatypePropertyAxiom; import org.dllearner.kb.SparqlEndpointKS; +import org.dllearner.kb.sparql.SparqlEndpoint; +import org.dllearner.learningproblems.AxiomScore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -109,7 +112,7 @@ all = qs.getLiteral("all").getInt(); } // get number of instances of s with <s p o> <s p o1> where o != o1 - query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; + query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o2)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); rs = executeSelectQuery(query, workingModel); int functional = 1; @@ -140,7 +143,7 @@ if (numberOfSubjects > 0) { int functional = 0; - String query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o1)} }"; + String query = "SELECT (COUNT(DISTINCT ?s) AS ?functional) WHERE {?s <%s> ?o1. FILTER NOT EXISTS {?s <%s> ?o2. FILTER(?o1 != ?o2)} }"; query = query.replace("%s", propertyToDescribe.getURI().toString()); ResultSet rs = executeSelectQuery(query); if (rs.hasNext()) { @@ -153,4 +156,23 @@ declaredAsFunctional)); } } + + public static void main(String[] args) throws Exception { + FunctionalDataPropertyAxiomLearner l = new FunctionalDataPropertyAxiomLearner(new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia())); + l.setPropertyToDescribe(new DatatypeProperty("http://dbpedia.org/ontology/birthDate")); + l.setMaxExecutionTimeInSeconds(10); + l.setForceSPARQL_1_0_Mode(true); + l.init(); + l.start(); + List<EvaluatedAxiom> axioms = l.getCurrentlyBestEvaluatedAxioms(5); + System.out.println(axioms); + + for(EvaluatedAxiom axiom : axioms){ + printSubset(l.getPositiveExamples(axiom), 10); + printSubset(l.getNegativeExamples(axiom), 10); + l.explainScore(axiom); + System.out.println(((AxiomScore)axiom.getScore()).getTotalNrOfExamples()); + System.out.println(((AxiomScore)axiom.getScore()).getNrOfPositiveExamples()); + } + } } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -198,22 +198,24 @@ org.apache.log4j.Logger.getRootLogger().setLevel(Level.INFO); org.apache.log4j.Logger.getLogger(DataPropertyDomainAxiomLearner.class).setLevel(Level.INFO); - SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpediaLiveAKSW()); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); + SPARQLReasoner reasoner = new SPARQLReasoner(ks); reasoner.prepareSubsumptionHierarchy(); ObjectPropertyDomainAxiomLearner l = new ObjectPropertyDomainAxiomLearner(ks); l.setReasoner(reasoner); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/anthem")); - l.setMaxExecutionTimeInSeconds(40); + l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/birthPlace")); + l.setMaxExecutionTimeInSeconds(10); // l.addFilterNamespace("http://dbpedia.org/ontology/"); // l.setReturnOnlyNewAxioms(true); + l.setForceSPARQL_1_0_Mode(true); l.init(); l.start(); - System.out.println(l.getCurrentlyBestEvaluatedAxioms()); + System.out.println(l.getCurrentlyBestEvaluatedAxioms(0.7)); } } Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -307,7 +307,7 @@ } protected ResultSet executeSelectQuery(String query) { - logger.debug("Sending query\n{} ...", query); + logger.info("Sending query\n{} ...", query); if(ks.isRemote()){ SparqlEndpoint endpoint = ((SparqlEndpointKS) ks).getEndpoint(); QueryEngineHTTP queryExecution = new QueryEngineHTTP(endpoint.getURL().toString(), Modified: trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/kb/sparql/QueryEngineHTTP.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -27,10 +27,11 @@ import java.util.Map; import java.util.concurrent.TimeUnit; -import org.openjena.atlas.io.IO; -import org.openjena.riot.Lang; -import org.openjena.riot.RiotReader; -import org.openjena.riot.WebContent; +import org.apache.jena.atlas.io.IO; +import org.apache.jena.riot.Lang; +import org.apache.jena.riot.RDFLanguages; +import org.apache.jena.riot.RiotReader; +import org.apache.jena.riot.WebContent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -267,7 +268,7 @@ private Model execModel(Model model) { HttpQuery httpQuery = makeHttpQuery() ; - httpQuery.setAccept(WebContent.contentTypeNTriples) ; + httpQuery.setAccept(WebContent.contentTypeNTriplesAlt) ; InputStream in = httpQuery.exec() ; //Don't assume the endpoint actually gives back the content type we asked for @@ -282,7 +283,7 @@ //Try to select language appropriately here based on the model content type Lang lang = WebContent.contentTypeToLang(actualContentType); - if (!lang.isTriples()) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); + if (! RDFLanguages.isTriples(lang)) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); model.read(in, null, "N-TRIPLES") ; return model ; @@ -306,7 +307,7 @@ //Try to select language appropriately here based on the model content type Lang lang = WebContent.contentTypeToLang(actualContentType); - if (!lang.isTriples()) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); + if (! RDFLanguages.isTriples(lang)) throw new QueryException("Endpoint returned Content Type: " + actualContentType + " which is not a valid RDF Graph syntax"); return RiotReader.createIteratorTriples(in, lang, null); } @@ -527,9 +528,20 @@ //Check that this is a valid setting Lang lang = WebContent.contentTypeToLang(contentType); if (lang == null) throw new IllegalArgumentException("Given Content Type '" + contentType + "' is not supported by RIOT"); - if (!lang.isTriples()) throw new IllegalArgumentException("Given Content Type '" + contentType + " is not a RDF Graph format"); + if (! RDFLanguages.isTriples(lang)) throw new IllegalArgumentException("Given Content Type '" + contentType + " is not a RDF Graph format"); modelContentType = contentType; } + + @Override + public long getTimeout1() { return asMillis(readTimeout, readTimeoutUnit) ; } + + @Override + public long getTimeout2() { return asMillis(connectTimeout, connectTimeoutUnit) ; } + + private static long asMillis(long duration, TimeUnit timeUnit) + { + return (duration < 0 ) ? duration : timeUnit.toMillis(duration) ; + } } Modified: trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/learningproblems/AxiomScore.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -61,7 +61,7 @@ return totalNrOfExamples; } - public int getNrOfpositiveExamples() { + public int getNrOfPositiveExamples() { return nrOfpositiveExamples; } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/PelletReasoner.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -451,7 +451,7 @@ // Comparator<OWLNamedObject> namedObjectComparator = new Comparator<OWLNamedObject>() { public int compare(OWLNamedObject o1, OWLNamedObject o2) { - return o1.getIRI().compareTo(o2.getIRI()); + return o1.compareTo(o2); } }; Set<OWLClass> classes = new TreeSet<OWLClass>(namedObjectComparator); Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -460,6 +460,39 @@ } return types; } + + public Set<NamedClass> getOWLClasses() { + Set<NamedClass> types = new HashSet<NamedClass>(); + String query = String.format("SELECT DISTINCT ?class WHERE {?class a <%s>.}",OWL.Class.getURI()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + types.add(new NamedClass(qs.getResource("class").getURI())); + } + return types; + } + + /** + * Returns a set of classes which are siblings, i.e. on the same level + * in the class hierarchy. + * @param cls + * @param limit + * @return + */ + public Set<NamedClass> getSiblingClasses(NamedClass cls) { + Set<NamedClass> siblings = new HashSet<NamedClass>(); + String query = "SELECT ?sub WHERE { <" + cls.getName() + "> <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?super ."; + query += "?sub <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?super ."; + query += "FILTER( !SAMETERM(?sub, <" + cls.getName() + ">)) . }"; + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + siblings.add(new NamedClass(qs.getResource("sub").getURI())); + } + return siblings; + } @Override public boolean hasType(Description description, Individual individual) { @@ -490,12 +523,14 @@ if(limit != 0) { query += " LIMIT " + limit; } - + System.out.println(query); ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ qs = rs.next(); - individuals.add(new Individual(qs.getResource("ind").getURI())); + if(qs.get("ind").isURIResource()){ + individuals.add(new Individual(qs.getResource("ind").getURI())); + } } return individuals; } Modified: trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java 2013-03-20 12:08:41 UTC (rev 3914) +++ trunk/components-core/src/main/java/org/dllearner/utilities/LabelShortFormProvider.java 2013-04-10 10:06:38 UTC (rev 3915) @@ -9,7 +9,9 @@ import com.hp.hpl.jena.query.ParameterizedSparqlString; import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; import com.hp.hpl.jena.vocabulary.RDFS; @@ -23,7 +25,12 @@ private ExtractionDBCache cache; private SparqlEndpoint endpoint; + private Model model; + public LabelShortFormProvider(Model model) { + this.model = model; + } + public LabelShortFormProvider(SparqlEndpoint endpoint) { this.endpoint = endpoint; } @@ -59,15 +66,20 @@ protected ResultSet executeSelect(Query query){ ResultSet rs = null; - if(cache != null){ - rs = SparqlQuery.convertJSONtoResultSet(cache.executeSelectQuery(endpoint, query.toString())); + if(endpoint != null){ + if(cache != null){ + rs = SparqlQuery.convertJSONtoResultSet(cache.executeSelectQuery(endpoint, query.toString())); + } else { + QueryEngineHTTP qe = new QueryEngineHTTP(endpoint.getURL().toString(), query); + for(String uri : endpoint.getDefaultGraphURIs()){ + qe.addDefaultGraph(uri); + } + rs = qe.execSelect(); + } } else { - QueryEngineHTTP qe = new QueryEngineHTTP(endpoint.getURL().toString(), query); - for(String uri : endpoint.getDefaultGraphURIs()){ - qe.addDefaultGraph(uri); - } - rs = qe.execSelect(); + rs = QueryExecutionFactory.create(query, model).execSelect(); } + return rs; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-04-21 11:20:29
|
Revision: 3925 http://sourceforge.net/p/dl-learner/code/3925 Author: lorenz_b Date: 2013-04-21 11:20:26 +0000 (Sun, 21 Apr 2013) Log Message: ----------- Continued OWL class expression to SPARQL converter. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-04-19 14:04:20 UTC (rev 3924) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-04-21 11:20:26 UTC (rev 3925) @@ -523,7 +523,6 @@ if(limit != 0) { query += " LIMIT " + limit; } - System.out.println(query); ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ Modified: trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java 2013-04-19 14:04:20 UTC (rev 3924) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java 2013-04-21 11:20:26 UTC (rev 3925) @@ -1,5 +1,6 @@ package org.dllearner.utilities.owl; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Stack; @@ -69,6 +70,8 @@ private OWLDataFactory df = new OWLDataFactoryImpl(); + private Map<Integer, Boolean> intersection; + public OWLClassExpressionToSPARQLConverter() { } @@ -89,7 +92,7 @@ public Query asQuery(String rootVariable, OWLClassExpression expr){ String queryString = "SELECT " + rootVariable + " WHERE {"; queryString += convert(rootVariable, expr); - queryString += "}";System.out.println(queryString); + queryString += "}"; return QueryFactory.create(queryString, Syntax.syntaxARQ); } @@ -99,6 +102,7 @@ propCnt = 0; indCnt = 0; sparql = ""; + intersection = new HashMap<Integer, Boolean>(); } private String getVariable(OWLEntity entity){ @@ -124,6 +128,18 @@ return variables.size(); } + private boolean inIntersection(){ + return intersection.containsKey(modalDepth()) ? intersection.get(modalDepth()) : false; + } + + private void enterIntersection(){ + intersection.put(modalDepth(), true); + } + + private void leaveIntersection(){ + intersection.remove(modalDepth()); + } + private String triple(String subject, String predicate, String object){ return (subject.startsWith("?") ? subject : "<" + subject + ">") + " " + (predicate.startsWith("?") || predicate.equals("a") ? predicate : "<" + predicate + ">") + " " + @@ -161,10 +177,12 @@ @Override public void visit(OWLObjectIntersectionOf ce) { + enterIntersection(); List<OWLClassExpression> operands = ce.getOperandsAsList(); for (OWLClassExpression operand : operands) { operand.accept(this); } + leaveIntersection(); } @Override @@ -183,6 +201,13 @@ @Override public void visit(OWLObjectComplementOf ce) { + String subject = variables.peek(); + if(!inIntersection() && modalDepth() == 1){ + sparql += triple(subject, "?p", "?o"); + } + sparql += "FILTER NOT EXISTS {"; + ce.getOperand().accept(this); + sparql += "}"; } @Override @@ -197,17 +222,9 @@ } OWLClassExpression filler = ce.getFiller(); if(filler.isAnonymous()){ - if(filler instanceof OWLObjectOneOf){ - variables.push(objectVariable); - filler.accept(this); - variables.pop(); - } else { - String var = buildIndividualVariable(); - variables.push(var); - sparql += triple(objectVariable, "a", var); - filler.accept(this); - variables.pop(); - } + variables.push(objectVariable); + filler.accept(this); + variables.pop(); } else { sparql += triple(objectVariable, "a", filler.asOWLClass().toStringID()); } @@ -378,6 +395,27 @@ @Override public void visit(OWLDataAllValuesFrom ce) { + String subject = variables.peek(); + String objectVariable = buildIndividualVariable(); + OWLDataPropertyExpression propertyExpression = ce.getProperty(); + String predicate = propertyExpression.asOWLDataProperty().toStringID(); + OWLDataRange filler = ce.getFiller(); + sparql += triple(variables.peek(), predicate, objectVariable); + + String var = buildIndividualVariable(); + sparql += "{SELECT " + subject + " (COUNT(" + var + ") AS ?cnt1) WHERE {"; + sparql += triple(subject, predicate, var); + variables.push(var); + filler.accept(this); + variables.pop(); + sparql += "} GROUP BY " + subject + "}"; + + var = buildIndividualVariable(); + sparql += "{SELECT " + subject + " (COUNT(" + var + ") AS ?cnt2) WHERE {"; + sparql += triple(subject, predicate, var); + sparql += "} GROUP BY " + subject + "}"; + + sparql += "FILTER(?cnt1=?cnt2)"; } @Override @@ -561,6 +599,27 @@ query = converter.asQuery(rootVar, expr).toString(); System.out.println(expr + "\n" + query); + expr = df.getOWLObjectComplementOf(clsB); + query = converter.asQuery(rootVar, expr).toString(); + System.out.println(expr + "\n" + query); + + expr = df.getOWLObjectIntersectionOf( + clsA, + df.getOWLObjectComplementOf(clsB)); + query = converter.asQuery(rootVar, expr).toString(); + System.out.println(expr + "\n" + query); + + expr = df.getOWLObjectSomeValuesFrom(propR, + df.getOWLObjectIntersectionOf( + clsA, + df.getOWLObjectComplementOf(clsB))); + query = converter.asQuery(rootVar, expr).toString(); + System.out.println(expr + "\n" + query); + + expr = df.getOWLDataAllValuesFrom(dpT, booleanRange); + query = converter.asQuery(rootVar, expr).toString(); + System.out.println(expr + "\n" + query); + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |