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. |