|
From: <lor...@us...> - 2011-08-05 09:05:32
|
Revision: 3003
http://dl-learner.svn.sourceforge.net/dl-learner/?rev=3003&view=rev
Author: lorenz_b
Date: 2011-08-05 09:05:26 +0000 (Fri, 05 Aug 2011)
Log Message:
-----------
Continued algorithms.
Modified Paths:
--------------
trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentPropertyAxiomLearner.java
trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubPropertyOfAxiomLearner.java
trunk/components-core/src/main/java/org/dllearner/core/owl/PropertyAxiomVisitor.java
trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java
Added Paths:
-----------
trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentDatatypePropertiesAxiom.java
trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentPropertyAxiomLearner.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentPropertyAxiomLearner.java 2011-08-04 17:51:53 UTC (rev 3002)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/EquivalentPropertyAxiomLearner.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -1,44 +1,150 @@
package org.dllearner.algorithms.properties;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.dllearner.core.AbstractComponent;
import org.dllearner.core.AxiomLearningAlgorithm;
-import org.dllearner.core.AbstractComponent;
import org.dllearner.core.ComponentAnn;
import org.dllearner.core.ComponentInitException;
import org.dllearner.core.EvaluatedAxiom;
+import org.dllearner.core.config.ConfigOption;
+import org.dllearner.core.config.IntegerEditor;
+import org.dllearner.core.config.ObjectPropertyEditor;
import org.dllearner.core.configurators.Configurator;
import org.dllearner.core.owl.Axiom;
+import org.dllearner.core.owl.EquivalentObjectPropertiesAxiom;
+import org.dllearner.core.owl.ObjectProperty;
import org.dllearner.kb.SparqlEndpointKS;
+import org.dllearner.learningproblems.AxiomScore;
+import org.dllearner.reasoning.SPARQLReasoner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP;
+
@ComponentAnn(name="equivalent property axiom learner")
public class EquivalentPropertyAxiomLearner extends AbstractComponent implements AxiomLearningAlgorithm {
- private String propertyToDescribe;
+ private static final Logger logger = LoggerFactory.getLogger(EquivalentPropertyAxiomLearner.class);
- public String getPropertyToDescribe() {
+ @ConfigOption(name="propertyToDescribe", description="", propertyEditorClass=ObjectPropertyEditor.class)
+ private ObjectProperty propertyToDescribe;
+ @ConfigOption(name="maxExecutionTimeInSeconds", description="", propertyEditorClass=IntegerEditor.class)
+ private int maxExecutionTimeInSeconds = 10;
+ @ConfigOption(name="maxFetchedRows", description="The maximum number of rows fetched from the endpoint to approximate the result.", propertyEditorClass=IntegerEditor.class)
+ private int maxFetchedRows = 0;
+
+ private SPARQLReasoner reasoner;
+ private SparqlEndpointKS ks;
+
+ private List<EvaluatedAxiom> currentlyBestAxioms;
+ private long startTime;
+ private int fetchedRows;
+
+ public EquivalentPropertyAxiomLearner(SparqlEndpointKS ks){
+ this.ks = ks;
+ }
+
+ public int getMaxExecutionTimeInSeconds() {
+ return maxExecutionTimeInSeconds;
+ }
+
+ public void setMaxExecutionTimeInSeconds(int maxExecutionTimeInSeconds) {
+ this.maxExecutionTimeInSeconds = maxExecutionTimeInSeconds;
+ }
+
+ public ObjectProperty getPropertyToDescribe() {
return propertyToDescribe;
}
- public void setPropertyToDescribe(String propertyToDescribe) {
+ public void setPropertyToDescribe(ObjectProperty propertyToDescribe) {
this.propertyToDescribe = propertyToDescribe;
}
+
+ public int getMaxFetchedRows() {
+ return maxFetchedRows;
+ }
- public EquivalentPropertyAxiomLearner(SparqlEndpointKS ks){
-
+ public void setMaxFetchedRows(int maxFetchedRows) {
+ this.maxFetchedRows = maxFetchedRows;
}
-
+
@Override
public void start() {
- // TODO Auto-generated method stub
-
+ logger.info("Start learning...");
+ 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);
+
+ //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}" +
+ "}";
+ String query;
+ Map<ObjectProperty, Integer> result = new HashMap<ObjectProperty, Integer>();
+ ObjectProperty prop;
+ Integer oldCnt;
+ boolean repeat = true;
+
+ while(!terminationCriteriaSatisfied() && repeat){
+ query = String.format(queryTemplate, propertyToDescribe, limit, offset);
+ ResultSet rs = executeQuery(query);
+ QuerySolution qs;
+ repeat = false;
+ while(rs.hasNext()){
+ qs = rs.next();
+ prop = new ObjectProperty(qs.getResource("p").getURI());
+ int newCnt = qs.getLiteral("count").getInt();
+ oldCnt = result.get(prop);
+ if(oldCnt == null){
+ oldCnt = Integer.valueOf(newCnt);
+ }
+ result.put(prop, oldCnt);
+ qs.getLiteral("count").getInt();
+ repeat = true;
+ }
+ currentlyBestAxioms = buildAxioms(result);
+ offset += 1000;
+ }
+
+ logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime));
}
@Override
public List<Axiom> getCurrentlyBestAxioms(int nrOfAxioms) {
- // TODO Auto-generated method stub
- return null;
+ List<Axiom> bestAxioms = new ArrayList<Axiom>();
+
+ Iterator<EvaluatedAxiom> it = currentlyBestAxioms.iterator();
+ while(bestAxioms.size() < nrOfAxioms && it.hasNext()){
+ bestAxioms.add(it.next().getAxiom());
+ }
+
+ return bestAxioms;
}
+
+ @Override
+ public List<EvaluatedAxiom> getCurrentlyBestEvaluatedAxioms(int nrOfAxioms) {
+ int max = Math.min(currentlyBestAxioms.size(), nrOfAxioms);
+
+ List<EvaluatedAxiom> bestAxioms = currentlyBestAxioms.subList(0, max);
+
+ return bestAxioms;
+ }
@Override
public Configurator getConfigurator() {
@@ -48,14 +154,65 @@
@Override
public void init() throws ComponentInitException {
- // TODO Auto-generated method stub
+ reasoner = new SPARQLReasoner(ks);
}
+
+ private boolean terminationCriteriaSatisfied(){
+ boolean timeLimitExceeded = maxExecutionTimeInSeconds == 0 ? false : (System.currentTimeMillis() - startTime) >= maxExecutionTimeInSeconds * 1000;
+ boolean resultLimitExceeded = maxFetchedRows == 0 ? false : fetchedRows >= maxFetchedRows;
+ return timeLimitExceeded || resultLimitExceeded;
+ }
+
+ private List<EvaluatedAxiom> buildAxioms(Map<ObjectProperty, Integer> property2Count){
+ List<EvaluatedAxiom> axioms = new ArrayList<EvaluatedAxiom>();
+
+ EvaluatedAxiom evalAxiom;
+ for(Entry<ObjectProperty, Integer> entry : sortByValues(property2Count)){
+ evalAxiom = new EvaluatedAxiom(new EquivalentObjectPropertiesAxiom(propertyToDescribe, entry.getKey()),
+ new AxiomScore(0));
+ axioms.add(evalAxiom);
+ }
+
+ return axioms;
+ }
+
+ /*
+ * Returns the entries of the map sorted by value.
+ */
+ private SortedSet<Entry<ObjectProperty, Integer>> sortByValues(Map<ObjectProperty, Integer> map){
+ SortedSet<Entry<ObjectProperty, Integer>> sortedSet = new TreeSet<Map.Entry<ObjectProperty,Integer>>(new Comparator<Entry<ObjectProperty, Integer>>() {
- @Override
- public List<EvaluatedAxiom> getCurrentlyBestEvaluatedAxioms(int nrOfAxioms) {
- // TODO Auto-generated method stub
- return null;
+ @Override
+ public int compare(Entry<ObjectProperty, Integer> value1, Entry<ObjectProperty, Integer> value2) {
+ if(value1.getValue() < value2.getValue()){
+ return 1;
+ } else if(value2.getValue() < value1.getValue()){
+ return -1;
+ } else {
+ return value1.getKey().compareTo(value2.getKey());
+ }
+ }
+ });
+ sortedSet.addAll(map.entrySet());
+ return sortedSet;
}
+
+ /*
+ * Executes a SELECT query and returns the result.
+ */
+ private ResultSet executeQuery(String query){
+ logger.info("Sending query \n {}", query);
+
+ QueryEngineHTTP queryExecution = new QueryEngineHTTP(ks.getEndpoint().getURL().toString(), query);
+ for (String dgu : ks.getEndpoint().getDefaultGraphURIs()) {
+ queryExecution.addDefaultGraph(dgu);
+ }
+ for (String ngu : ks.getEndpoint().getNamedGraphURIs()) {
+ queryExecution.addNamedGraph(ngu);
+ }
+ ResultSet resultSet = queryExecution.execSelect();
+ return resultSet;
+ }
}
Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubPropertyOfAxiomLearner.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubPropertyOfAxiomLearner.java 2011-08-04 17:51:53 UTC (rev 3002)
+++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/SubPropertyOfAxiomLearner.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -41,7 +41,7 @@
@ComponentAnn(name="subPropertyOf learner")
public class SubPropertyOfAxiomLearner extends AbstractComponent implements AxiomLearningAlgorithm {
-private static final Logger logger = LoggerFactory.getLogger(PropertyDomainAxiomLearner.class);
+ private static final Logger logger = LoggerFactory.getLogger(PropertyDomainAxiomLearner.class);
@ConfigOption(name="propertyToDescribe", description="", propertyEditorClass=ObjectPropertyEditor.class)
private ObjectProperty propertyToDescribe;
Added: trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentDatatypePropertiesAxiom.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentDatatypePropertiesAxiom.java (rev 0)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentDatatypePropertiesAxiom.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -0,0 +1,55 @@
+package org.dllearner.core.owl;
+
+import java.util.Map;
+
+public class EquivalentDatatypePropertiesAxiom extends PropertyAxiom {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1085651734702155330L;
+ private DatatypeProperty role;
+ private DatatypeProperty equivRole;
+
+ public EquivalentDatatypePropertiesAxiom(DatatypeProperty equivRole, DatatypeProperty role) {
+ this.role = role;
+ this.equivRole = equivRole;
+ }
+
+ public DatatypeProperty getRole() {
+ return role;
+ }
+
+ public DatatypeProperty getEquivalentRole() {
+ return equivRole;
+ }
+
+ public int getLength() {
+ return 1 + role.getLength() + equivRole.getLength();
+ }
+
+ public String toString(String baseURI, Map<String,String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toString(baseURI, prefixes) + "," + role.toString(baseURI, prefixes) + ")";
+ }
+
+ public String toKBSyntaxString(String baseURI, Map<String,String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toKBSyntaxString(baseURI, prefixes) + "," + role.toKBSyntaxString(baseURI, prefixes) + ")";
+ }
+
+ @Override
+ public void accept(AxiomVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ public void accept(KBElementVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.dllearner.core.owl.KBElement#toManchesterSyntaxString(java.lang.String, java.util.Map)
+ */
+ @Override
+ public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toString(baseURI, prefixes) + "," + role.toString(baseURI, prefixes) + ")";
+ }
+}
Added: trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java (rev 0)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/EquivalentObjectPropertiesAxiom.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -0,0 +1,55 @@
+package org.dllearner.core.owl;
+
+import java.util.Map;
+
+public class EquivalentObjectPropertiesAxiom extends PropertyAxiom {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1085651734702155330L;
+ private ObjectProperty role;
+ private ObjectProperty equivRole;
+
+ public EquivalentObjectPropertiesAxiom(ObjectProperty equivRole, ObjectProperty role) {
+ this.role = role;
+ this.equivRole = equivRole;
+ }
+
+ public ObjectProperty getRole() {
+ return role;
+ }
+
+ public ObjectProperty getEquivalentRole() {
+ return equivRole;
+ }
+
+ public int getLength() {
+ return 1 + role.getLength() + equivRole.getLength();
+ }
+
+ public String toString(String baseURI, Map<String,String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toString(baseURI, prefixes) + "," + role.toString(baseURI, prefixes) + ")";
+ }
+
+ public String toKBSyntaxString(String baseURI, Map<String,String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toKBSyntaxString(baseURI, prefixes) + "," + role.toKBSyntaxString(baseURI, prefixes) + ")";
+ }
+
+ @Override
+ public void accept(AxiomVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ public void accept(KBElementVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ /* (non-Javadoc)
+ * @see org.dllearner.core.owl.KBElement#toManchesterSyntaxString(java.lang.String, java.util.Map)
+ */
+ @Override
+ public String toManchesterSyntaxString(String baseURI, Map<String, String> prefixes) {
+ return "EquivalentObjectProperties(" + equivRole.toString(baseURI, prefixes) + "," + role.toString(baseURI, prefixes) + ")";
+ }
+}
Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/PropertyAxiomVisitor.java
===================================================================
--- trunk/components-core/src/main/java/org/dllearner/core/owl/PropertyAxiomVisitor.java 2011-08-04 17:51:53 UTC (rev 3002)
+++ trunk/components-core/src/main/java/org/dllearner/core/owl/PropertyAxiomVisitor.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -39,6 +39,10 @@
public void visit(SubObjectPropertyAxiom axiom);
+ public void visit(EquivalentObjectPropertiesAxiom axiom);
+
+ public void visit(EquivalentDatatypePropertiesAxiom axiom);
+
void visit(DatatypePropertyDomainAxiom axiom);
void visit(ObjectPropertyDomainAxiom axiom);
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 2011-08-04 17:51:53 UTC (rev 3002)
+++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLAPIAxiomConvertVisitor.java 2011-08-05 09:05:26 UTC (rev 3003)
@@ -37,6 +37,8 @@
import org.dllearner.core.owl.DisjointClassesAxiom;
import org.dllearner.core.owl.DoubleDatatypePropertyAssertion;
import org.dllearner.core.owl.EquivalentClassesAxiom;
+import org.dllearner.core.owl.EquivalentDatatypePropertiesAxiom;
+import org.dllearner.core.owl.EquivalentObjectPropertiesAxiom;
import org.dllearner.core.owl.FunctionalObjectPropertyAxiom;
import org.dllearner.core.owl.Individual;
import org.dllearner.core.owl.InverseObjectPropertyAxiom;
@@ -257,6 +259,28 @@
addAxiom(axiomOWLAPI);
}
+ @Override
+ public void visit(EquivalentObjectPropertiesAxiom axiom) {
+ OWLObjectProperty role = factory.getOWLObjectProperty(
+ IRI.create(axiom.getRole().getName()));
+ OWLObjectProperty equivRole = factory.getOWLObjectProperty(
+ IRI.create(axiom.getEquivalentRole().getName()));
+ OWLAxiom axiomOWLAPI = factory.getOWLEquivalentObjectPropertiesAxiom(equivRole, role);
+ addAxiom(axiomOWLAPI);
+
+ }
+
+ @Override
+ public void visit(EquivalentDatatypePropertiesAxiom axiom) {
+ OWLDataProperty role = factory.getOWLDataProperty(
+ IRI.create(axiom.getRole().getName()));
+ OWLDataProperty equivRole = factory.getOWLDataProperty(
+ IRI.create(axiom.getEquivalentRole().getName()));
+ OWLAxiom axiomOWLAPI = factory.getOWLEquivalentDataPropertiesAxiom(equivRole, role);
+ addAxiom(axiomOWLAPI);
+
+ }
+
/*
* (non-Javadoc)
*
@@ -369,4 +393,6 @@
+
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|