From: <lor...@us...> - 2011-11-16 20:22:49
|
Revision: 3411 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3411&view=rev Author: lorenz_b Date: 2011-11-16 20:22:43 +0000 (Wed, 16 Nov 2011) Log Message: ----------- Improved algorithm to be aware of asserted subclasses. Modified Paths: -------------- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.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 2011-11-16 18:36:22 UTC (rev 3410) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2011-11-16 20:22:43 UTC (rev 3411) @@ -68,6 +68,7 @@ private NamedClass classToDescribe; private List<EvaluatedDescription> currentlyBestEvaluatedDescriptions; + private SortedSet<Description> subClasses; public DisjointClassesLearner(SparqlEndpointKS ks){ this.ks = ks; @@ -94,6 +95,13 @@ Set<NamedClass> classes = new SPARQLTasks(ks.getEndpoint()).getAllClasses(); classes.remove(classToDescribe); + //get the subclasses + if(reasoner.isPrepared()){ + subClasses = reasoner.getClassHierarchy().getSubClasses(classToDescribe, false); + } else { + subClasses = reasoner.getSubClasses(classToDescribe, true); + } + //get classes and how often they occur int limit = 1000; int offset = 0; @@ -188,11 +196,10 @@ Set<NamedClass> completeDisjointclasses = new TreeSet<NamedClass>(allClasses); completeDisjointclasses.removeAll(class2Count.keySet()); - //we remove the asserted sublcasses here - if(reasoner.isPrepared()){ - completeDisjointclasses.removeAll(reasoner.getClassHierarchy().getSubClasses(classToDescribe)); - } else { - completeDisjointclasses.removeAll(reasoner.getSubClasses(classToDescribe)); + //we remove the asserted subclasses here + completeDisjointclasses.removeAll(subClasses); + for(Description subClass : subClasses){ + class2Count.remove(subClass); } @@ -220,8 +227,10 @@ public static void main(String[] args) throws Exception{ DisjointClassesLearner l = new DisjointClassesLearner(new SparqlEndpointKS(new SparqlEndpoint(new URL("http://dbpedia.aksw.org:8902/sparql"), Collections.singletonList("http://dbpedia.org"), Collections.<String>emptyList()))); - l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/ChemicalSubstance")); + l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/Person")); l.init(); + l.getReasoner().prepareSubsumptionHierarchy(); +// 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.75)){ Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2011-11-16 18:36:22 UTC (rev 3410) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2011-11-16 20:22:43 UTC (rev 3411) @@ -682,6 +682,10 @@ @Override public SortedSet<Description> getSubClasses(Description description) { + return getSubClasses(description, false); + } + + public SortedSet<Description> getSubClasses(Description description, boolean useVirtuoso) { if(!(description instanceof NamedClass || description instanceof Thing)){ throw new IllegalArgumentException("Only named classes are supported."); } @@ -689,11 +693,16 @@ description = new NamedClass(Thing.instance.getURI()); } SortedSet<Description> subClasses = new TreeSet<Description>(); - String query = String.format("SELECT ?sub {?sub <%s> <%s>. FILTER(isIRI(?sub))}", - RDFS.subClassOf.getURI(), - ((NamedClass)description).getURI().toString() - - ); + String query; + if(useVirtuoso){ + query = getAllSubClassesVirtuosoQuery(description); + } else { + query = String.format("SELECT ?sub {?sub <%s> <%s>. FILTER(isIRI(?sub))}", + RDFS.subClassOf.getURI(), + ((NamedClass)description).getURI().toString() + + ); + } ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ @@ -702,6 +711,15 @@ } return subClasses; } + + private String getAllSubClassesVirtuosoQuery(Description description){ + String query = String.format( + "SELECT DISTINCT ?sub WHERE {"+ + "{SELECT ?sub ?o where {?sub rdfs:subClassOf ?o.}}"+ + "OPTION ( TRANSITIVE, t_distinct, t_in(?sub), t_out(?o), t_min (1), t_max (8), t_step ('step_no') as ?dist ) ."+ + "FILTER(?o = <%s>)}", description.toString()); + return query; + } @Override public ObjectPropertyHierarchy getObjectPropertyHierarchy() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |