From: <lor...@us...> - 2013-09-04 13:58:46
|
Revision: 4058 http://sourceforge.net/p/dl-learner/code/4058 Author: lorenz_b Date: 2013-09-04 13:58:43 +0000 (Wed, 04 Sep 2013) Log Message: ----------- Added prefix trie from google. Modified Paths: -------------- trunk/components-core/pom.xml Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixMap.java trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-09-04 13:21:22 UTC (rev 4057) +++ trunk/components-core/pom.xml 2013-09-04 13:58:43 UTC (rev 4058) @@ -308,6 +308,11 @@ <artifactId>jwnl</artifactId> <version>1.4.1.RC2</version> </dependency> + <dependency> + <groupId>com.google.collections</groupId> + <artifactId>google-collections</artifactId> + <version>1.0</version> + </dependency> </dependencies> <dependencyManagement> <dependencies> Added: trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixMap.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixMap.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixMap.java 2013-09-04 13:58:43 UTC (rev 4058) @@ -0,0 +1,31 @@ +// Copyright 2006 Google Inc. All Rights Reserved. + +package org.dllearner.utilities.datastructures; + +/** + * Maps string prefixes to values. For example, if you {@code put("foo", 1)}, + * {@code get("foobar")} returns {@code 1}. Prohibits null values. + * + * <p>Use instead of iterating over a series of string prefixes calling + * {@code String.startsWith(prefix)}. + * + * @author cra...@go... (Bob Lee) + */ +public interface PrefixMap<T> { + /** + * Maps prefix to value. + * + * @return The previous value stored for this prefix, or null if none. + * @throws IllegalArgumentException if prefix is an empty string. + */ + T put(CharSequence prefix, T value); + + /** + * Finds a prefix that matches {@code s} and returns the mapped value. + * + * If multiple prefixes in the map match {@code s}, the longest match wins. + * + * @return value for prefix matching {@code s} or {@code null} if none match. + */ + T get(CharSequence s); +} \ No newline at end of file Added: trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java 2013-09-04 13:58:43 UTC (rev 4058) @@ -0,0 +1,154 @@ +// Copyright 2006 Google Inc. All Rights Reserved. + +package org.dllearner.utilities.datastructures; + +import java.util.Map; + +/** + * Trie implementation supporting CharSequences as prefixes. + * + * Prefixes are sequences of characters, and the set of allowed characters is + * specified as a range of sequential characters. By default, any seven-bit + * character may appear in a prefix, and so the trie is a 128-ary tree. + * + * @author cra...@go... (Bob Lee) + * @author mh...@go... (Matthew Harris) + */ +public class PrefixTrie<T> implements PrefixMap<T> { + // The set of allowed characters in prefixes is given by a range of + // consecutive characters. rangeOffset denotes the beginning of the range, + // and rangeSize gives the number of characters in the range, which is used as + // the number of children of each node. + private final char rangeOffset; + private final int rangeSize; + + private final Node<T> root; + + /** + * Constructs a trie for holding strings of seven-bit characters. + */ + public PrefixTrie() { + rangeOffset = '\0'; + rangeSize = 128; + root = new Node<T>(rangeSize); + } + + /** + * Constructs a trie for holding strings of characters. + * + * The set of characters allowed in prefixes is given by the range + * [rangeOffset, lastCharInRange], inclusive. + * + * @param firstCharInRange + * @param lastCharInRange + */ + public PrefixTrie(char firstCharInRange, char lastCharInRange) { + this.rangeOffset = firstCharInRange; + this.rangeSize = lastCharInRange - firstCharInRange + 1; + + if (rangeSize <= 0) { + throw new IllegalArgumentException("Char range must include some chars"); + } + + root = new Node<T>(rangeSize); + } + + /** + * {@inheritDoc} + * + * @throws IllegalArgumentException if prefix contains a character outside the + * range of legal prefix characters. + */ + public T put(CharSequence prefix, T value) { + if (value == null) { + throw new NullPointerException(); + } + + Node<T> current = root; + for (int i = 0; i < prefix.length(); i++) { + int nodeIndex = prefix.charAt(i) - rangeOffset; + try { + Node<T> next = current.next[nodeIndex]; + if (next == null) { + next = current.next[nodeIndex] = new Node<T>(rangeSize); + } + current = next; + } catch (ArrayIndexOutOfBoundsException e) { + throw new IllegalArgumentException( + "'" + prefix.charAt(i) + "' is not a legal prefix character."); + } + } + T oldValue = current.value; + current.value = value; + return oldValue; + } + + /** {@inheritDoc} */ + public T get(CharSequence s) { + Node<T> deepestWithValue = root; + Node<T> current = root; + for (int i = 0; i < s.length(); i++) { + int nodeIndex = s.charAt(i) - rangeOffset; + if (nodeIndex < 0 || rangeSize <= nodeIndex) { + return null; + } + current = current.next[nodeIndex]; + if (current == null) { + break; + } + if (current.value != null) { + deepestWithValue = current; + } + } + return deepestWithValue.value; + } + + /** + * Returns a Map containing the same data as this structure. + * + * This implementation constructs and populates an entirely new map rather + * than providing a map view on the trie, so this is mostly useful for + * debugging. + * + * @return A Map mapping each prefix to its corresponding value. + */ + public Map<String, T> toMap() { + Map<String, T> map = com.google.common.collect.Maps.newLinkedHashMap(); + addEntries(root, new StringBuilder(), map); + return map; + } + + /** + * Adds to the given map all entries at or below the given node. + * + * @param node + * @param builder A StringBuilder containing the prefix for the given node. + * @param map + */ + private void addEntries(Node<T> node, + StringBuilder builder, + Map<String, T> map) { + if (node.value != null) { + map.put(builder.toString(), node.value); + } + + for (int i = 0; i < node.next.length; i++) { + Node<T> next = node.next[i]; + if (next != null) { + builder.append((char) (i + rangeOffset)); + addEntries(next, builder, map); + builder.deleteCharAt(builder.length() - 1); + } + } + } + + private static class Node<T> { + T value; + final Node<T>[] next; + + @SuppressWarnings("unchecked") + Node(int numChildren) { + next = new Node[numChildren]; + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dfl...@us...> - 2013-09-04 15:04:42
|
Revision: 4065 http://sourceforge.net/p/dl-learner/code/4065 Author: dfleischhacker Date: 2013-09-04 15:04:37 +0000 (Wed, 04 Sep 2013) Log Message: ----------- Add lemmatizing to linguistic utils Modified Paths: -------------- trunk/components-core/pom.xml trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/LinguisticUtil.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-09-04 14:39:59 UTC (rev 4064) +++ trunk/components-core/pom.xml 2013-09-04 15:04:37 UTC (rev 4065) @@ -195,7 +195,13 @@ <version>1.0</version> </dependency> + <dependency> + <groupId>edu.northwestern.at</groupId> + <artifactId>morphadorner</artifactId> + <version>2009-04-30</version> + </dependency> + <!-- This module is a library module, so it needs only to have the slf api dependency to enable logging --> <dependency> <groupId>org.slf4j</groupId> Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/LinguisticUtil.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/LinguisticUtil.java 2013-09-04 14:39:59 UTC (rev 4064) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/LinguisticUtil.java 2013-09-04 15:04:37 UTC (rev 4065) @@ -1,9 +1,16 @@ package org.dllearner.algorithms.isle.index; +import edu.northwestern.at.utils.corpuslinguistics.lemmatizer.DefaultLemmatizer; +import edu.northwestern.at.utils.corpuslinguistics.lemmatizer.Lemmatizer; +import edu.stanford.nlp.ling.CoreAnnotations; +import edu.stanford.nlp.ling.CoreLabel; +import edu.stanford.nlp.pipeline.*; +import edu.stanford.nlp.util.CoreMap; import net.didion.jwnl.data.POS; import org.dllearner.algorithms.isle.WordNet; import java.util.ArrayList; +import java.util.Properties; /** * Provides shortcuts to commonly used linguistic operations @@ -12,7 +19,17 @@ public class LinguisticUtil { private static final WordNet wn = new WordNet(); private static POS[] RELEVANT_POS = new POS[]{POS.NOUN, POS.VERB}; + private static Lemmatizer lemmatizer; + static { + try { + lemmatizer = new DefaultLemmatizer(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + /** * Processes the given string and puts camelCased words into single words. * @param camelCase the word containing camelcase to split @@ -54,7 +71,13 @@ return underScored.split("_"); } - // get synonyms + /** + * Returns an array of all synonyms for the given word. Only synonyms for the POS in {@link #RELEVANT_POS} are + * returned. + * + * @param word the word to retrieve synonyms for + * @return synonyms for the given word + */ public static String[] getSynonymsForWord(String word) { ArrayList<String> synonyms = new ArrayList<String>(); @@ -64,7 +87,28 @@ return synonyms.toArray(new String[synonyms.size()]); } + /** + * Returns the normalized form of the given word. This method is only able to work with single words! If there is an + * error normalizing the given word, the word itself is returned. + * + * @param word the word to get normalized form for + * @return normalized form of the word or the word itself on an error + */ + public static String getNormalizedForm(String word) { + try { + if (lemmatizer == null) { + return word; + } + return lemmatizer.lemmatize(word); + } + catch (Exception e) { + e.printStackTrace(); + } + return word; + } + public static void main(String[] args) { + System.out.println(getNormalizedForm("going")); for (String s : getWordsFromCamelCase("thisIsAClassWith1Name123")) { System.out.println(s); for (String w : getSynonymsForWord(s)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-09-14 06:45:20
|
Revision: 4108 http://sourceforge.net/p/dl-learner/code/4108 Author: lorenz_b Date: 2013-09-14 06:45:10 +0000 (Sat, 14 Sep 2013) Log Message: ----------- Extended fragment extraction. Modified Paths: -------------- trunk/components-core/pom.xml trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/QueryTree.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl2.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/NBR.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/LGGGeneratorImpl.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/NoiseSensitiveLGG.java trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractionStrategy.java trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractor.java trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/IndividualBasedFragmentExtractor.java trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/MaximumModalDepthDetector.java trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/TimeBasedFragmentExtractor.java trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/NoiseSensitiveLGGMultithreaded.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/pom.xml 2013-09-14 06:45:10 UTC (rev 4108) @@ -314,6 +314,11 @@ <artifactId>jwnl</artifactId> <version>1.4.1.RC2</version> </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-math3</artifactId> + <version>3.1.1</version> + </dependency> </dependencies> <dependencyManagement> <dependencies> Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractionStrategy.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractionStrategy.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractionStrategy.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,20 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +/** + * @author Lorenz Buehmann + * + */ +public enum FragmentExtractionStrategy { + + /** + * Extract a fragment based on a given number of examples. + */ + INDIVIDUALS, + /** + * Extract as much information as possible in a given time. + */ + TIME +} Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractor.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/FragmentExtractor.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,23 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +import org.dllearner.core.owl.NamedClass; + +import com.hp.hpl.jena.rdf.model.Model; + +/** + * @author Lorenz Buehmann + * + */ +public interface FragmentExtractor { + + /** + * @param cls + * @param maxFragmentDepth + * @return + */ + Model extractFragment(NamedClass cls, int maxFragmentDepth); + +} Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/IndividualBasedFragmentExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/IndividualBasedFragmentExtractor.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/IndividualBasedFragmentExtractor.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,109 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.aksw.jena_sparql_api.cache.core.QueryExecutionFactoryCacheEx; +import org.aksw.jena_sparql_api.cache.extra.CacheCoreEx; +import org.aksw.jena_sparql_api.cache.extra.CacheCoreH2; +import org.aksw.jena_sparql_api.cache.extra.CacheEx; +import org.aksw.jena_sparql_api.cache.extra.CacheExImpl; +import org.aksw.jena_sparql_api.core.QueryExecutionFactory; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.NamedClass; +import org.dllearner.kb.SparqlEndpointKS; +import org.dllearner.kb.sparql.ConciseBoundedDescriptionGenerator; +import org.dllearner.kb.sparql.ConciseBoundedDescriptionGeneratorImpl; +import org.dllearner.kb.sparql.QueryExecutionFactoryHttp; +import org.dllearner.kb.sparql.SparqlEndpoint; + +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.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; + +/** + * @author Lorenz Buehmann + * + */ +public class IndividualBasedFragmentExtractor implements FragmentExtractor{ + + public static final FragmentExtractionStrategy extractionStrategy = FragmentExtractionStrategy.INDIVIDUALS; + private QueryExecutionFactory qef; + + private long maxNrOfIndividuals; + private long startTime; + + private ConciseBoundedDescriptionGenerator cbdGen; + + public IndividualBasedFragmentExtractor(SparqlEndpointKS ks, String cacheDir, int maxNrOfIndividuals) { + this.maxNrOfIndividuals = maxNrOfIndividuals; + + SparqlEndpoint endpoint = ks.getEndpoint(); + + qef = new QueryExecutionFactoryHttp(endpoint.getURL().toString(), endpoint.getDefaultGraphURIs()); + if(cacheDir != null){ + try { + long timeToLive = TimeUnit.DAYS.toMillis(30); + CacheCoreEx cacheBackend = CacheCoreH2.create(cacheDir, timeToLive, true); + CacheEx cacheFrontend = new CacheExImpl(cacheBackend); + qef = new QueryExecutionFactoryCacheEx(qef, cacheFrontend); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + cbdGen = new ConciseBoundedDescriptionGeneratorImpl(endpoint, cacheDir); + } + + public IndividualBasedFragmentExtractor(SparqlEndpointKS ks, int maxNrOfIndividuals) { + this(ks, null, maxNrOfIndividuals); + } + + /* (non-Javadoc) + * @see org.dllearner.algorithms.pattern.FragmentExtractor#extractFragment(org.dllearner.core.owl.NamedClass) + */ + @Override + public Model extractFragment(NamedClass cls, int maxFragmentDepth) { + startTime = System.currentTimeMillis(); + Model fragment = ModelFactory.createDefaultModel(); + + //get some random individuals + Set<Individual> individuals = getRandomIndividuals(cls); + + //get for each individual the CBD + Model cbd; + for (Individual ind : individuals) { + cbd = cbdGen.getConciseBoundedDescription(ind.getName(), maxFragmentDepth); + fragment.add(cbd); + } + return fragment; + } + + private Set<Individual> getRandomIndividuals(NamedClass cls){ + Set<Individual> individuals = new HashSet<Individual>(); + + String query = "SELECT ?s WHERE {?s a <" + cls.getName() + ">} LIMIT " + maxNrOfIndividuals; + QueryExecution qe = qef.createQueryExecution(query); + ResultSet rs = qe.execSelect(); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + if(qs.get("s").isURIResource()){ + individuals.add(new Individual(qs.getResource("s").getURI())); + } + + } + qe.close(); + + return individuals; + } +} Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/MaximumModalDepthDetector.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/MaximumModalDepthDetector.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/MaximumModalDepthDetector.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,503 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +import org.semanticweb.owlapi.model.OWLAnnotationAssertionAxiom; +import org.semanticweb.owlapi.model.OWLAnnotationPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLAnnotationPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLAsymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLAxiom; +import org.semanticweb.owlapi.model.OWLAxiomVisitor; +import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; +import org.semanticweb.owlapi.model.OWLClassExpression; +import org.semanticweb.owlapi.model.OWLClassExpressionVisitor; +import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; +import org.semanticweb.owlapi.model.OWLDataExactCardinality; +import org.semanticweb.owlapi.model.OWLDataHasValue; +import org.semanticweb.owlapi.model.OWLDataMaxCardinality; +import org.semanticweb.owlapi.model.OWLDataMinCardinality; +import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLDatatypeDefinitionAxiom; +import org.semanticweb.owlapi.model.OWLDeclarationAxiom; +import org.semanticweb.owlapi.model.OWLDifferentIndividualsAxiom; +import org.semanticweb.owlapi.model.OWLDisjointClassesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointDataPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointUnionAxiom; +import org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom; +import org.semanticweb.owlapi.model.OWLEquivalentDataPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLEquivalentObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLFunctionalDataPropertyAxiom; +import org.semanticweb.owlapi.model.OWLFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLHasKeyAxiom; +import org.semanticweb.owlapi.model.OWLInverseFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLInverseObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLIrreflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLNegativeDataPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; +import org.semanticweb.owlapi.model.OWLObjectComplementOf; +import org.semanticweb.owlapi.model.OWLObjectExactCardinality; +import org.semanticweb.owlapi.model.OWLObjectHasSelf; +import org.semanticweb.owlapi.model.OWLObjectHasValue; +import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; +import org.semanticweb.owlapi.model.OWLObjectMaxCardinality; +import org.semanticweb.owlapi.model.OWLObjectMinCardinality; +import org.semanticweb.owlapi.model.OWLObjectOneOf; +import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLObjectUnionOf; +import org.semanticweb.owlapi.model.OWLReflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLSameIndividualAxiom; +import org.semanticweb.owlapi.model.OWLSubAnnotationPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; +import org.semanticweb.owlapi.model.OWLSubDataPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; +import org.semanticweb.owlapi.model.OWLSymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.SWRLRule; + +import arq.cmdline.ModAlgebra; + +/** + * @author Lorenz Buehmann + * + */ +public class MaximumModalDepthDetector implements OWLAxiomVisitor, OWLClassExpressionVisitor{ + + int maxModalDepth; + + public static int getMaxModalDepth(OWLAxiom axiom){ + MaximumModalDepthDetector depthDetector = new MaximumModalDepthDetector(); + axiom.accept(depthDetector); + return depthDetector.maxModalDepth; + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAnnotationAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLAnnotationAssertionAxiom) + */ + @Override + public void visit(OWLAnnotationAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAnnotationAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSubAnnotationPropertyOfAxiom) + */ + @Override + public void visit(OWLSubAnnotationPropertyOfAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAnnotationAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLAnnotationPropertyDomainAxiom) + */ + @Override + public void visit(OWLAnnotationPropertyDomainAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAnnotationAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLAnnotationPropertyRangeAxiom) + */ + @Override + public void visit(OWLAnnotationPropertyRangeAxiom axiom) { + } + + + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDeclarationAxiom) + */ + @Override + public void visit(OWLDeclarationAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSubClassOfAxiom) + */ + @Override + public void visit(OWLSubClassOfAxiom axiom) { + OWLClassExpression subClass = axiom.getSubClass(); + subClass.accept(this); + int tmp = maxModalDepth; + maxModalDepth = 1; + OWLClassExpression superClass = axiom.getSuperClass(); + superClass.accept(this); + maxModalDepth = Math.max(tmp, maxModalDepth); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom) + */ + @Override + public void visit(OWLNegativeObjectPropertyAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLAsymmetricObjectPropertyAxiom) + */ + @Override + public void visit(OWLAsymmetricObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLReflexiveObjectPropertyAxiom) + */ + @Override + public void visit(OWLReflexiveObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDisjointClassesAxiom) + */ + @Override + public void visit(OWLDisjointClassesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom) + */ + @Override + public void visit(OWLDataPropertyDomainAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom) + */ + @Override + public void visit(OWLObjectPropertyDomainAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLEquivalentObjectPropertiesAxiom) + */ + @Override + public void visit(OWLEquivalentObjectPropertiesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLNegativeDataPropertyAssertionAxiom) + */ + @Override + public void visit(OWLNegativeDataPropertyAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDifferentIndividualsAxiom) + */ + @Override + public void visit(OWLDifferentIndividualsAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDisjointDataPropertiesAxiom) + */ + @Override + public void visit(OWLDisjointDataPropertiesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDisjointObjectPropertiesAxiom) + */ + @Override + public void visit(OWLDisjointObjectPropertiesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom) + */ + @Override + public void visit(OWLObjectPropertyRangeAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom) + */ + @Override + public void visit(OWLObjectPropertyAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLFunctionalObjectPropertyAxiom) + */ + @Override + public void visit(OWLFunctionalObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom) + */ + @Override + public void visit(OWLSubObjectPropertyOfAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDisjointUnionAxiom) + */ + @Override + public void visit(OWLDisjointUnionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSymmetricObjectPropertyAxiom) + */ + @Override + public void visit(OWLSymmetricObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDataPropertyRangeAxiom) + */ + @Override + public void visit(OWLDataPropertyRangeAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLFunctionalDataPropertyAxiom) + */ + @Override + public void visit(OWLFunctionalDataPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLEquivalentDataPropertiesAxiom) + */ + @Override + public void visit(OWLEquivalentDataPropertiesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLClassAssertionAxiom) + */ + @Override + public void visit(OWLClassAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom) + */ + @Override + public void visit(OWLEquivalentClassesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom) + */ + @Override + public void visit(OWLDataPropertyAssertionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom) + */ + @Override + public void visit(OWLTransitiveObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLIrreflexiveObjectPropertyAxiom) + */ + @Override + public void visit(OWLIrreflexiveObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSubDataPropertyOfAxiom) + */ + @Override + public void visit(OWLSubDataPropertyOfAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLInverseFunctionalObjectPropertyAxiom) + */ + @Override + public void visit(OWLInverseFunctionalObjectPropertyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSameIndividualAxiom) + */ + @Override + public void visit(OWLSameIndividualAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom) + */ + @Override + public void visit(OWLSubPropertyChainOfAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLInverseObjectPropertiesAxiom) + */ + @Override + public void visit(OWLInverseObjectPropertiesAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLHasKeyAxiom) + */ + @Override + public void visit(OWLHasKeyAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.OWLDatatypeDefinitionAxiom) + */ + @Override + public void visit(OWLDatatypeDefinitionAxiom axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLAxiomVisitor#visit(org.semanticweb.owlapi.model.SWRLRule) + */ + @Override + public void visit(SWRLRule axiom) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLClass) + */ + @Override + public void visit(OWLClass ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectIntersectionOf) + */ + @Override + public void visit(OWLObjectIntersectionOf ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectUnionOf) + */ + @Override + public void visit(OWLObjectUnionOf ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectComplementOf) + */ + @Override + public void visit(OWLObjectComplementOf ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom) + */ + @Override + public void visit(OWLObjectSomeValuesFrom ce) { + maxModalDepth++; + ce.getFiller().accept(this); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectAllValuesFrom) + */ + @Override + public void visit(OWLObjectAllValuesFrom ce) { + maxModalDepth++; + ce.getFiller().accept(this); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectHasValue) + */ + @Override + public void visit(OWLObjectHasValue ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectMinCardinality) + */ + @Override + public void visit(OWLObjectMinCardinality ce) { + maxModalDepth++; + ce.getFiller().accept(this); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectExactCardinality) + */ + @Override + public void visit(OWLObjectExactCardinality ce) { + maxModalDepth++; + ce.getFiller().accept(this); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectMaxCardinality) + */ + @Override + public void visit(OWLObjectMaxCardinality ce) { + maxModalDepth++; + ce.getFiller().accept(this); + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectHasSelf) + */ + @Override + public void visit(OWLObjectHasSelf ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectOneOf) + */ + @Override + public void visit(OWLObjectOneOf ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataSomeValuesFrom) + */ + @Override + public void visit(OWLDataSomeValuesFrom ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataAllValuesFrom) + */ + @Override + public void visit(OWLDataAllValuesFrom ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataHasValue) + */ + @Override + public void visit(OWLDataHasValue ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataMinCardinality) + */ + @Override + public void visit(OWLDataMinCardinality ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataExactCardinality) + */ + @Override + public void visit(OWLDataExactCardinality ce) { + } + + /* (non-Javadoc) + * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataMaxCardinality) + */ + @Override + public void visit(OWLDataMaxCardinality ce) { + } + + +} Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,273 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.dllearner.core.AbstractAxiomLearningAlgorithm; +import org.dllearner.core.Score; +import org.dllearner.core.owl.Axiom; +import org.dllearner.core.owl.NamedClass; +import org.dllearner.kb.SparqlEndpointKS; +import org.dllearner.kb.sparql.SparqlEndpoint; +import org.dllearner.utilities.owl.DLLearnerAxiomConvertVisitor; +import org.dllearner.utilities.owl.OWLAPIAxiomConvertVisitor; +import org.dllearner.utilities.owl.OWLClassExpressionToSPARQLConverter; +import org.semanticweb.owlapi.model.AxiomType; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLAnnotationProperty; +import org.semanticweb.owlapi.model.OWLAxiom; +import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLClassExpression; +import org.semanticweb.owlapi.model.OWLDataFactory; +import org.semanticweb.owlapi.model.OWLEntity; +import org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom; +import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; +import org.semanticweb.owlapi.model.PrefixManager; +import org.semanticweb.owlapi.util.DefaultPrefixManager; +import org.semanticweb.owlapi.util.OWLObjectDuplicator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl; + +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Multiset; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.query.QueryExecutionFactory; +import com.hp.hpl.jena.query.QuerySolution; +import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.query.ResultSetFormatter; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.vocabulary.RDF; + +/** + * @author Lorenz Buehmann + * + */ +public class PatternBasedAxiomLearningAlgorithm extends AbstractAxiomLearningAlgorithm{ + + private static final Logger logger = LoggerFactory.getLogger(PatternBasedAxiomLearningAlgorithm.class); + + + private Axiom pattern; + private NamedClass cls; + + private FragmentExtractor fragmentExtractor; + private OWLClassExpressionToSPARQLConverter converter = new OWLClassExpressionToSPARQLConverter(); + private OWLDataFactory dataFactory = new OWLDataFactoryImpl(); + + private OWLAnnotationProperty confidenceProperty = dataFactory.getOWLAnnotationProperty(IRI.create("http://dl-learner.org/pattern/confidence")); + + + private double threshold = 0.4; + + public PatternBasedAxiomLearningAlgorithm(SparqlEndpointKS ks, FragmentExtractionStrategy extractionStrategy) { + this(ks, null, extractionStrategy); + } + + public PatternBasedAxiomLearningAlgorithm(SparqlEndpointKS ks, String cacheDir, FragmentExtractionStrategy extractionStrategy) { + this.ks = ks; + + if(extractionStrategy == FragmentExtractionStrategy.TIME){ + fragmentExtractor = new TimeBasedFragmentExtractor(ks, cacheDir, 20, TimeUnit.SECONDS); + } else if(extractionStrategy == FragmentExtractionStrategy.INDIVIDUALS){ + fragmentExtractor = new IndividualBasedFragmentExtractor(ks, cacheDir, 20); + } + } + + /** + * @param pattern the pattern to set + */ + public void setPattern(Axiom pattern) { + this.pattern = pattern; + } + + /** + * @param cls the cls to set + */ + public void setClass(NamedClass cls) { + this.cls = cls; + } + + @Override + public void start() { + logger.info("Start learning..."); + + startTime = System.currentTimeMillis(); + + logger.info("Pattern: " + pattern); + + //get the maximum modal depth in the pattern axioms + int modalDepth = MaximumModalDepthDetector.getMaxModalDepth(OWLAPIAxiomConvertVisitor.convertAxiom(pattern)); + logger.info("Modal depth: " + modalDepth); + + //extract fragment + Model fragment = fragmentExtractor.extractFragment(cls, modalDepth); + + //try to find instantiation of the pattern with confidence above threshold + Set<OWLAxiom> instantiations = applyPattern(OWLAPIAxiomConvertVisitor.convertAxiom(pattern), dataFactory.getOWLClass(IRI.create(cls.getName())), fragment); + System.out.println(instantiations); + + logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); + } + + private Set<OWLAxiom> applyPattern(OWLAxiom pattern, OWLClass cls, Model fragment) { + Map<OWLAxiom, Score> axioms2Score = new HashMap<OWLAxiom, Score>(); + + OWLClassExpression patternSubClass = null; + OWLClassExpression patternSuperClass = null; + + if(pattern.isOfType(AxiomType.EQUIVALENT_CLASSES)){ + Set<OWLSubClassOfAxiom> subClassOfAxioms = ((OWLEquivalentClassesAxiom)pattern).asOWLSubClassOfAxioms(); + for (OWLSubClassOfAxiom axiom : subClassOfAxioms) { + if(!axiom.getSubClass().isAnonymous()){ + patternSubClass = axiom.getSubClass(); + patternSuperClass = axiom.getSuperClass(); + break; + } + } + } else if(pattern.isOfType(AxiomType.SUBCLASS_OF)){ + patternSubClass = ((OWLSubClassOfAxiom) pattern).getSubClass(); + patternSuperClass = ((OWLSubClassOfAxiom) pattern).getSuperClass(); + } else { + logger.warn("Pattern " + pattern + " not supported yet."); + return Collections.emptySet(); + } + + Set<OWLEntity> signature = patternSuperClass.getSignature(); + signature.remove(patternSubClass.asOWLClass()); + Query query = converter.asQuery("?x", dataFactory.getOWLObjectIntersectionOf(cls, patternSuperClass), signature); + logger.info("Running query\n" + query); + Map<OWLEntity, String> variablesMapping = converter.getVariablesMapping(); + com.hp.hpl.jena.query.ResultSet rs = QueryExecutionFactory.create(query, fragment).execSelect(); + QuerySolution qs; + Set<String> resources = new HashSet<String>(); + Multiset<OWLAxiom> instantiations = HashMultiset.create(); + while (rs.hasNext()) { + qs = rs.next(); + resources.add(qs.getResource("x").getURI()); + // get the IRIs for each variable + Map<OWLEntity, IRI> entity2IRIMap = new HashMap<OWLEntity, IRI>(); + entity2IRIMap.put(patternSubClass.asOWLClass(), cls.getIRI()); + boolean skip = false; + for (OWLEntity entity : signature) { + String var = variablesMapping.get(entity); + if(qs.get(var) == null){ + logger.warn("Variable " + var + " is not bound."); + skip = true; + break; + } + if(qs.get(var).isLiteral()){ + skip = true; + break; + } + Resource resource = qs.getResource(var); + if(entity.isOWLObjectProperty() && resource.hasURI(RDF.type.getURI())){ + skip = true; + break; + } + entity2IRIMap.put(entity, IRI.create(resource.getURI())); + } + if(!skip){ + // instantiate the pattern + OWLObjectDuplicator duplicator = new OWLObjectDuplicator(entity2IRIMap, dataFactory); + OWLAxiom patternInstantiation = duplicator.duplicateObject(pattern); + instantiations.add(patternInstantiation); + } + } + // compute the score + int total = resources.size(); + for (OWLAxiom axiom : instantiations.elementSet()) { + int frequency = instantiations.count(axiom); +// System.out.println(axiom + ":" + frequency); + Score score = computeScore(total, Math.min(total, frequency)); + axioms2Score.put(axiom, score); + } + + return asAnnotatedAxioms(axioms2Score); + } + + private Set<OWLAxiom> asAnnotatedAxioms(Map<OWLAxiom, Score> axioms2Score){ + Set<OWLAxiom> annotatedAxioms = new HashSet<OWLAxiom>(); + for (Entry<OWLAxiom, Score> entry : axioms2Score.entrySet()) { + OWLAxiom axiom = entry.getKey(); + Score score = entry.getValue(); + if(score.getAccuracy() >= threshold){ + annotatedAxioms.add(axiom.getAnnotatedAxiom( + Collections.singleton(dataFactory.getOWLAnnotation(confidenceProperty, dataFactory.getOWLLiteral(score.getAccuracy()))))); + + } + } + return annotatedAxioms; + } + + public static void main(String[] args) throws Exception { + OWLDataFactoryImpl df = new OWLDataFactoryImpl(); + PrefixManager pm = new DefaultPrefixManager("http://dllearner.org/pattern#"); + + Model model = ModelFactory.createDefaultModel(); + String triples = + "<http://ex.org/a> a <http://ex.org/A>."+ + "<http://ex.org/a> <http://ex.org/p> <http://ex.org/y1>."+ + "<http://ex.org/y1> a <http://ex.org/B>."+ + + "<http://ex.org/b> a <http://ex.org/A>."+ + "<http://ex.org/b> <http://ex.org/p> <http://ex.org/y2>."+ + "<http://ex.org/y2> a <http://ex.org/B>."+ + + "<http://ex.org/c> a <http://ex.org/A>." + ; + InputStream is = new ByteArrayInputStream( triples.getBytes("UTF-8")); + model.read(is, null, "TURTLE"); + + String query = "SELECT DISTINCT ?x WHERE { " + + "?x a <http://ex.org/A> .}"; + + ResultSet rs = QueryExecutionFactory.create(query, model).execSelect(); + System.out.println(ResultSetFormatter.asText(rs)); + + query = "SELECT DISTINCT ?p0 ?cls0 ?x WHERE { " + + "?x a <http://ex.org/A> ." + + "?x ?p0 ?s0 " + + " { SELECT ?x ?p0 ?cls0 (count(?s1) AS ?cnt1)" + + " WHERE" + + " { ?x ?p0 ?s1 ." + + " ?s1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?cls0" + + " }" + + " GROUP BY ?x ?cls0 ?p0" + + " }" + + " { SELECT ?x ?p0 (count(?s2) AS ?cnt2)" + + " WHERE" + + " { ?x ?p0 ?s2 }" + + " GROUP BY ?x ?p0" + + " }" + + " FILTER ( ?cnt1 = ?cnt2 ) }"; + + rs = QueryExecutionFactory.create(query, model).execSelect(); + System.out.println(ResultSetFormatter.asText(rs)); + + SparqlEndpoint endpoint = SparqlEndpoint.getEndpointDBpedia(); +// endpoint = SparqlEndpoint.getEndpointDBpediaLOD2Cloud(); +// endpoint = SparqlEndpoint.getEndpointDBpediaLiveAKSW(); + NamedClass cls = new NamedClass("http://dbpedia.org/ontology/SoccerPlayer"); + OWLAxiom pattern = df.getOWLSubClassOfAxiom(df.getOWLClass("A", pm), + df.getOWLObjectAllValuesFrom(df.getOWLObjectProperty("p", pm), df.getOWLClass("B", pm))); + + PatternBasedAxiomLearningAlgorithm la = new PatternBasedAxiomLearningAlgorithm(new SparqlEndpointKS(endpoint), "cache", FragmentExtractionStrategy.INDIVIDUALS); + la.setClass(cls); + la.setPattern(DLLearnerAxiomConvertVisitor.getDLLearnerAxiom(pattern)); + la.start(); + } +} Added: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/TimeBasedFragmentExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/TimeBasedFragmentExtractor.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/TimeBasedFragmentExtractor.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -0,0 +1,119 @@ +/** + * + */ +package org.dllearner.algorithms.pattern; + +import java.sql.SQLException; +import java.util.concurrent.TimeUnit; + +import org.aksw.jena_sparql_api.cache.core.QueryExecutionFactoryCacheEx; +import org.aksw.jena_sparql_api.cache.extra.CacheCoreEx; +import org.aksw.jena_sparql_api.cache.extra.CacheCoreH2; +import org.aksw.jena_sparql_api.cache.extra.CacheEx; +import org.aksw.jena_sparql_api.cache.extra.CacheExImpl; +import org.aksw.jena_sparql_api.core.QueryExecutionFactory; +import org.aksw.jena_sparql_api.pagination.core.PaginationUtils; +import org.dllearner.core.owl.NamedClass; +import org.dllearner.kb.SparqlEndpointKS; +import org.dllearner.kb.sparql.QueryExecutionFactoryHttp; +import org.dllearner.kb.sparql.SparqlEndpoint; + +import com.hp.hpl.jena.query.ParameterizedSparqlString; +import com.hp.hpl.jena.query.Query; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; + +/** + * @author Lorenz Buehmann + * + */ +public class TimeBasedFragmentExtractor implements FragmentExtractor{ + + public static final FragmentExtractionStrategy extractionStrategy = FragmentExtractionStrategy.TIME; + private SparqlEndpointKS ks; + private QueryExecutionFactory qef; + + private long maxExecutionTimeInMilliseconds; + private long startTime; + + public TimeBasedFragmentExtractor(SparqlEndpointKS ks, String cacheDir, int maxExecutionTimeInMilliseconds, TimeUnit timeUnit) { + this.ks = ks; + this.maxExecutionTimeInMilliseconds = timeUnit.toMillis(maxExecutionTimeInMilliseconds); + + SparqlEndpoint endpoint = ks.getEndpoint(); + + qef = new QueryExecutionFactoryHttp(endpoint.getURL().toString(), endpoint.getDefaultGraphURIs()); + if(cacheDir != null){ + try { + long timeToLive = TimeUnit.DAYS.toMillis(30); + CacheCoreEx cacheBackend = CacheCoreH2.create(cacheDir, timeToLive, true); + CacheEx cacheFrontend = new CacheExImpl(cacheBackend); + qef = new QueryExecutionFactoryCacheEx(qef, cacheFrontend); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + public TimeBasedFragmentExtractor(SparqlEndpointKS ks, int maxExecutionTimeInMilliseconds, TimeUnit timeUnit) { + this(ks, null, maxExecutionTimeInMilliseconds, timeUnit); + } + + /* (non-Javadoc) + * @see org.dllearner.algorithms.pattern.FragmentExtractor#extractFragment(org.dllearner.core.owl.NamedClass) + */ + @Override + public Model extractFragment(NamedClass cls, int maxFragmentDepth) { + startTime = System.currentTimeMillis(); + Model fragment = ModelFactory.createDefaultModel(); + + Query query = buildConstructQuery(cls, maxFragmentDepth); + + long pageSize = PaginationUtils.adjustPageSize(qef, 10000); + query.setLimit(pageSize); + int offset = 0; + while(getRemainingRuntime() > 0){ + query.setOffset(offset);System.out.println(query); + Model model = qef.createQueryExecution(query).execConstruct(); + fragment.add(model); + offset += pageSize; + } + return fragment; + } + + private Query buildConstructQuery(NamedClass cls, int depth){ + StringBuilder sb = new StringBuilder(); + int maxVarCnt = 0; + sb.append("CONSTRUCT {\n"); + sb.append("?s").append("?p0 ").append("?o0").append(".\n"); + for(int i = 1; i < depth-1; i++){ + sb.append("?o").append(i-1).append(" ").append("?p").append(i).append(" ").append("?o").append(i).append(".\n"); + maxVarCnt++; + } + sb.append("?o").append(maxVarCnt).append(" a ?type.\n"); + sb.append("}\n"); + sb.append("WHERE {\n"); + sb.append("?s a ?cls."); + sb.append("?s").append("?p0 ").append("?o0").append(".\n"); + for(int i = 1; i < depth-1; i++){ + sb.append("OPTIONAL{\n"); + sb.append("?o").append(i-1).append(" ").append("?p").append(i).append(" ").append("?o").append(i).append(".\n"); + } + sb.append("OPTIONAL{?o").append(maxVarCnt).append(" a ?type}.\n"); + for(int i = 1; i < depth-1; i++){ + sb.append("}"); + } + + sb.append("}\n"); + ParameterizedSparqlString template = new ParameterizedSparqlString(sb.toString()); + template.setIri("cls", cls.getName()); + return template.asQuery(); + } + + private long getRemainingRuntime(){ + return maxExecutionTimeInMilliseconds - (System.currentTimeMillis() - startTime); + } + +} Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/QueryTree.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/QueryTree.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/QueryTree.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -59,11 +59,11 @@ boolean isLiteralNode(); - void setLiteralNode(boolean isLiteralNode); + void setIsLiteralNode(boolean isLiteralNode); boolean isResourceNode(); - void setResourceNode(boolean isResourceNode); + void setIsResourceNode(boolean isResourceNode); boolean isVarNode(); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/datastructures/impl/QueryTreeImpl.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -70,6 +70,10 @@ */ public class QueryTreeImpl<N> implements QueryTree<N>{ + enum NodeType{ + RESOURCE, LITERAL, BLANK, VARIABLE; + } + private N userObject; private QueryTreeImpl<N> parent; @@ -119,8 +123,8 @@ for(QueryTree<N> child : tree.getChildren()){ subTree = new QueryTreeImpl<N>(child); subTree.setId(child.getId()); - subTree.setLiteralNode(child.isLiteralNode()); - subTree.setResourceNode(child.isResourceNode()); + subTree.setIsLiteralNode(child.isLiteralNode()); + subTree.setIsResourceNode(child.isResourceNode()); addChild(subTree, tree.getEdge(child)); } } @@ -175,11 +179,11 @@ } @Override - public void setLiteralNode(boolean isLiteralNode) { + public void setIsLiteralNode(boolean isLiteralNode) { this.isLiteralNode = isLiteralNode; } - public void setBlankNode(boolean isBlankNode) { + public void setIsBlankNode(boolean isBlankNode) { this.isBlankNode = isBlankNode; } @@ -193,7 +197,7 @@ } @Override - public void setResourceNode(boolean isResourceNode) { + public void setIsResourceNode(boolean isResourceNode) { this.isResourceNode = isResourceNode; } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -243,7 +243,7 @@ subTree = new QueryTreeImpl<String>(sb.toString()); // subTree = new QueryTreeImpl<String>(lit.toString()); subTree.setId(nodeId++); - subTree.setLiteralNode(true); + subTree.setIsLiteralNode(true); if(lit.getDatatype() == XSDDatatype.XSDinteger || lit.getDatatype() == XSDDatatype.XSDdouble || lit.getDatatype() == XSDDatatype.XSDdate @@ -258,13 +258,13 @@ } else if(objectFilter.isRelevantResource(object.asResource().getURI())){ if(!tree.getUserObjectPathToRoot().contains(st.getObject().toString())){ subTree = new QueryTreeImpl<String>(st.getObject().toString()); - subTree.setResourceNode(true); + subTree.setIsResourceNode(true); tree.addChild(subTree, st.getPredicate().toString()); if(depth < maxDepth){ fillTree(subTree, resource2Statements, depth); } if(object.isAnon()){ - subTree.setBlankNode(true); + subTree.setIsBlankNode(true); } } @@ -272,7 +272,7 @@ if(depth < maxDepth && !tree.getUserObjectPathToRoot().contains(st.getObject().toString())){ subTree = new QueryTreeImpl<String>(st.getObject().toString()); - subTree.setResourceNode(true); + subTree.setIsResourceNode(true); tree.addChild(subTree, st.getPredicate().toString()); fillTree(subTree, resource2Statements, depth); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl2.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl2.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/impl/QueryTreeFactoryImpl2.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -243,13 +243,13 @@ subTree = new QueryTreeImpl<String>(sb.toString()); // subTree = new QueryTreeImpl<String>(lit.toString()); subTree.setId(nodeId++); - subTree.setLiteralNode(true); + subTree.setIsLiteralNode(true); tree.addChild(subTree, st.getPredicate().toString()); } else if(objectFilter.isRelevantResource(object.asResource().getURI())){ if(tree.getUserObjectPathToRoot().size() < 3 && !tree.getUserObjectPathToRoot().contains(st.getObject().toString())){ subTree = new QueryTreeImpl<String>(st.getObject().toString()); - subTree.setResourceNode(true); + subTree.setIsResourceNode(true); tree.addChild(subTree, st.getPredicate().toString()); fillTree(subTree, resource2Statements); } Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/NBR.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/NBR.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/NBR.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -558,8 +558,8 @@ genTree.addChange(new QueryTreeChange(node.getId(), ChangeType.REPLACE_LABEL)); genTree2Sum.put(genTree, sum(matrix.get(node))); node.setUserObject(label); - node.setLiteralNode(isLiteralNode); - node.setResourceNode(!isLiteralNode); + node.setIsLiteralNode(isLiteralNode); + node.setIsResourceNode(!isLiteralNode); } } } @@ -636,8 +636,8 @@ genTree.addChange(new QueryTreeChange(child.getId(), ChangeType.REPLACE_LABEL)); gens.add(genTree); child.setUserObject(label); - child.setLiteralNode(isLiteralNode); - child.setResourceNode(!isLiteralNode); + child.setIsLiteralNode(isLiteralNode); + child.setIsResourceNode(!isLiteralNode); for(QueryTree<N> c : child.getChildren()){ N oldLabel = node2Label.get(c.getId()); if(oldLabel != null){ @@ -814,8 +814,8 @@ } this.nodeId++; subTree = createFilteredTree(child); - subTree.setLiteralNode(child.isLiteralNode()); - subTree.setResourceNode(child.isResourceNode()); + subTree.setIsLiteralNode(child.isLiteralNode()); + subTree.setIsResourceNode(child.isResourceNode()); filteredTree.addChild((QueryTreeImpl<N>)subTree, tree.getEdge(child)); } return filteredTree; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/EvaluatedQueryTree.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -7,12 +7,14 @@ public class EvaluatedQueryTree<N> implements Comparable<EvaluatedQueryTree<N>>{ private QueryTree<N> tree; - private Collection<QueryTree<N>> uncoveredExamples; + private Collection<QueryTree<N>> falseNegatives; + private Collection<QueryTree<N>> falsePositives; private double score; - public EvaluatedQueryTree(QueryTree<N> tree, Collection<QueryTree<N>> uncoveredExamples, double score) { + public EvaluatedQueryTree(QueryTree<N> tree, Collection<QueryTree<N>> falseNegatives, Collection<QueryTree<N>> falsePositives, double score) { this.tree = tree; - this.uncoveredExamples = uncoveredExamples; + this.falseNegatives = falseNegatives; + this.falsePositives = falsePositives; this.score = score; } @@ -20,10 +22,20 @@ return tree; } - public Collection<QueryTree<N>> getUncoveredExamples() { - return uncoveredExamples; + /** + * @return the falseNegatives + */ + public Collection<QueryTree<N>> getFalseNegatives() { + return falseNegatives; } + /** + * @return the falsePositives + */ + public Collection<QueryTree<N>> getFalsePositives() { + return falsePositives; + } + public double getScore() { return score; } @@ -39,4 +51,12 @@ return 1; } } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "QueryTree(Score:" + score + ")\n" + tree.getStringRepresentation(); + } } \ No newline at end of file Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/LGGGeneratorImpl.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/LGGGeneratorImpl.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/LGGGeneratorImpl.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -48,6 +48,8 @@ private Logger logger = Logger.getLogger(LGGGeneratorImpl.class); private int nodeId; + + private int calls = 0; @Override public QueryTree<N> getLGG(QueryTree<N> tree1, QueryTree<N> tree2) { @@ -58,11 +60,13 @@ public QueryTree<N> getLGG(QueryTree<N> tree1, QueryTree<N> tree2, boolean learnFilters) { nodeId = 0; + calls = 0; Monitor mon = MonitorFactory.getTimeMonitor("LGG"); mon.start(); QueryTree<N> lgg = computeLGG(tree1, tree2, learnFilters); mon.stop(); addNumbering(lgg); + System.out.println("Calls needed: " + calls); return lgg; } @@ -97,13 +101,13 @@ } Monitor mon = MonitorFactory.getTimeMonitor("LGG"); mon.start(); - QueryTree<N> lgg = computeLGG(treeList.get(0), treeList.get(1), learnFilters); + QueryTree<N> lgg = getLGG(treeList.get(0), treeList.get(1), learnFilters); if(logger.isDebugEnabled()){ logger.debug("LGG for 1 and 2:\n" + lgg.getStringRepresentation()); } for(int i = 2; i < treeList.size(); i++){ - lgg = computeLGG(lgg, treeList.get(i), learnFilters); + lgg = getLGG(lgg, treeList.get(i), learnFilters); if(logger.isDebugEnabled()){ logger.debug("LGG for 1-" + (i+1) + ":\n" + lgg.getStringRepresentation()); } @@ -118,7 +122,8 @@ return lgg; } - private QueryTree<N> computeLGG(QueryTree<N> tree1, QueryTree<N> tree2, boolean learnFilters){System.out.println("call"); + private QueryTree<N> computeLGG(QueryTree<N> tree1, QueryTree<N> tree2, boolean learnFilters){ + calls++; if(logger.isDebugEnabled()){ logger.debug("Computing LGG for"); logger.debug(tree1.getStringRepresentation()); @@ -126,9 +131,20 @@ logger.debug(tree2.getStringRepresentation()); } - QueryTree<N> lgg = new QueryTreeImpl<N>(tree1.getUserObject()); + + QueryTree<N> lgg; + //firstly, we check if both root nodes are resource nodes and have the same URI, i.e. the trees describe the same resource + //if YES all child nodes should be also the same and we can just return one of the two tree as LGG + if(tree1.isResourceNode() && tree2.isResourceNode() && tree1.getUserObject().equals(tree2.getUserObject())){ + if(logger.isDebugEnabled()){ + logger.debug("Early termination. Tree 1(" + tree1 + ") and tree 2(" + tree2 + ") describe the same resource."); + } + return tree1; + } + //if NO we have to create a new tree as LGG and compute the LGG for the all child node pairs having the same edge to the parent nodes + lgg = new QueryTreeImpl<N>(tree1.getUserObject()); if(tree1.isResourceNode() && tree2.isResourceNode()){ - lgg.setResourceNode(true); + lgg.setIsResourceNode(true); } @@ -153,8 +169,8 @@ // } if(!lgg.sameType(tree2) || !lgg.getUserObject().equals(tree2.getUserObject())){ lgg.setUserObject((N)"?"); - lgg.setLiteralNode(false); - lgg.setResourceNode(false); + lgg.setIsLiteralNode(false); + lgg.setIsResourceNode(false); } if(tree1.isLiteralNode() && tree2.isLiteralNode()){ @@ -165,14 +181,14 @@ ((QueryTreeImpl<N>)lgg).addLiterals(((QueryTreeImpl<N>)tree1).getLiterals()); ((QueryTreeImpl<N>)lgg).addLiterals(((QueryTreeImpl<N>)tree2).getLiterals()); } - lgg.setLiteralNode(true); + lgg.setIsLiteralNode(true); } Set<QueryTreeImpl<N>> addedChildren; QueryTreeImpl<N> lggChild; for(Object edge : new TreeSet<Object>(tree1.getEdges())){ if(logger.isTraceEnabled()){ - logger.trace("Regarding egde: " + edge); + logger.trace("Analyzing egde: " + edge); } addedChildren = new HashSet<QueryTreeImpl<N>>(); for(QueryTree<N> child1 : tree1.getChildren(edge)){ Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/NoiseSensitiveLGG.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/NoiseSensitiveLGG.java 2013-09-10 15:52:48 UTC (rev 4107) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/qtl/operations/lgg/NoiseSensitiveLGG.java 2013-09-14 06:45:10 UTC (rev 4108) @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; @@ -15,6 +16,8 @@ import com.jamonapi.Monitor; import com.jamonapi.MonitorFactory; +import edu.stanford.nlp.util.Sets; + public class NoiseSensitiveLGG<N> { @@ -25,31 +28,50 @@ private Queue<EvaluatedQueryTree<N>> todoList; private SortedSet<EvaluatedQueryTree<N>> solutions; + private double currentlyBestScore = 0d; + public NoiseSensitiveLGG() { } - public List<EvaluatedQueryTree<N>> computeLGG(List<QueryTree<N>> trees){ + public List<EvaluatedQueryTree<N>> computeLGG(List<QueryTree<N>> posExampleTrees){ + return computeLGG(posExampleTrees, Collections.<QueryTree<N>>emptyList()); + } + + public List<EvaluatedQueryTree<N>> computeLGG(List<QueryTree<N>> posExamples, List<QueryTree<N>> negExamples){ + currentlyBestScore = 0d; Monitor subMon = MonitorFactory.getTimeMonitor("subsumption-mon"); Monitor lggMon = MonitorFactory.getTimeMonitor("lgg-mon"); - init(trees); + init(posExamples, negExamples); EvaluatedQueryTree<N> currentElement; do{ logger.trace("TODO list size: " + todoList.size()); //pick best element from todo list currentElement = todoList.poll(); - for (QueryTree<N> example : currentElement.getUncoveredExamples()) { + for (QueryTree<N> example : currentElement.getFalseNegatives()) { QueryTree<N> tree = currentElement.getTree(); //compute the LGG lggMon.start(); QueryTree<N> lgg = lggGenerator.getLGG(tree, example); lggMon.stop(); - //compute examples which are not covered by LGG - Collection<QueryTree<N>> uncoveredExamples = getUncoveredTrees(lgg, trees); + //compute positive examples which are not covered by LGG + Collection<QueryTree<N>> uncoveredPositiveExamples = getUncoveredTrees(lgg, posExamples); + //compute negative examples which are covered by LGG + Collection<QueryTree<N>> coveredNegativeExamples = getCoveredTrees(lgg, negExamples); //compute score - double score = Heuristics.getConfidenceInterval95WaldAverage(trees.size(), trees.size() - uncoveredExamples.size()); - //add to todo list, if not already contained in todo list or solution list - EvaluatedQueryTree<N> solution = new EvaluatedQueryTree<N>(lgg, uncoveredExamples, score); - todo(solution); + int coveredPositiveExamples = posExamples.size() - uncoveredPositiveExamples.size(); + double recall = coveredPositiveExamples / (double)posExamples.size(); + double precision = (coveredNegativeExamples.size() + coveredPositiveExamples == 0) + ? 0 + : coveredPositiveExamples / (double)(coveredPositiveExamples + coveredNegativeExamples.size()); + + double score = Heuristics.getFScore(recall, precision); + if(score > currentlyBestScore){ + //add to todo list, if not already contained in todo list or solution list + EvaluatedQueryTree<N> solution = new EvaluatedQueryTree<N>(lgg, uncoveredPositiveExamples, coveredNegativeExamples, score); + todo(solution); + currentlyBestScore = score; + } + } solutions.add(currentElement); // todoList.remove(currentElement); @@ -63,6 +85,12 @@ return new ArrayList<EvaluatedQueryTree<N>>(solutions); } + /** + * Return all trees from the given list {@code allTrees} which are not already subsumed by {@code tree}. + * @param tree + * @param allTrees + * @return + */ private Collection<QueryTree<N>> getUncoveredTrees(QueryTree<N> tree, List<QueryTree<N>> allTrees){ Collection<QueryTree<N>> uncoveredTrees = new ArrayList<QueryTree<N>>(); for (QueryTree<N> queryTree : allTrees) { @@ -74,14 +102,36 @@ return uncoveredTrees; } - private void init(List<QueryTree<N>> trees){ + /** + * Return all trees from the given list {@code allTrees} which are not already subsumed by {@code tree}. + * @param tree + * @param allTrees + * @return + */ + private Collection<QueryTree<N>> getCoveredTrees(QueryTree<N> tree, List<QueryTree<N>> trees){ + Collection<QueryTree<N>> coveredTrees = new ArrayList<QueryTree<N>>(); + for (QueryTree<N> queryTree : trees) { + boolean subsumed = queryTree.isSubsumedBy(tree); + if(subsumed){ + coveredTrees.add(queryTree); + } + } + return coveredTrees; + } + + /** + * Initializes the todo list with all distinct trees contained in the given list {@code trees}. + * Firstly, distinct trees are computed and afterwards, for each tree a score is computed. + * @param trees + */ + private void init(List<QueryTree<N>> posExamples, List<QueryTree<N>> negExamples){ todoList = new PriorityQueue<EvaluatedQueryTree<N>>(); solutions = new TreeSet<EvaluatedQueryTree<N>>(); // EvaluatedQueryTree<N> dummy = new EvaluatedQueryTree<N>(new QueryTreeImpl<N>((N)"TOP"), trees, 0d); // todoList.add(dummy); //compute distinct trees Collection<QueryTree<N>> distinctTrees = new ArrayList<QueryTree<N>>(); - for (QueryTree<N> quer... [truncated message content] |
From: <lor...@us...> - 2013-10-03 08:51:00
|
Revision: 4113 http://sourceforge.net/p/dl-learner/code/4113 Author: lorenz_b Date: 2013-10-03 08:50:57 +0000 (Thu, 03 Oct 2013) Log Message: ----------- Minor bug fix in SPARQL reasoner. Modified Paths: -------------- trunk/components-core/pom.xml trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/SemanticAnnotator.java trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/SemanticIndex.java trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/simple/SimpleSemanticIndex.java trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java trunk/components-core/src/main/java/org/dllearner/parser/KBParser.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java trunk/components-core/src/main/java/org/dllearner/utilities/GreedyCohaerencyExtractor.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETest.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/pom.xml 2013-10-03 08:50:57 UTC (rev 4113) @@ -308,6 +308,23 @@ <artifactId>commons-math3</artifactId> <version>3.1.1</version> </dependency> + <dependency> + <groupId>org.aksw.commons</groupId> + <artifactId>collections</artifactId> + </dependency> + <dependency> + <groupId>org.aksw.commons</groupId> + <artifactId>util</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-compress</artifactId> + <version>1.4.1</version> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> </dependencies> <dependencyManagement> <dependencies> Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/DisjointClassesLearner.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -42,11 +42,15 @@ import org.dllearner.core.owl.ClassHierarchy; import org.dllearner.core.owl.Description; import org.dllearner.core.owl.DisjointClassesAxiom; +import org.dllearner.core.owl.Intersection; 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.reasoning.SPARQLReasoner; +import org.dllearner.utilities.owl.OWLClassExpressionToSPARQLConverter; +import org.semanticweb.owlapi.model.OWLClassExpression; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,6 +132,8 @@ return; } + computeAllDisjointClassAxiomsOptimized(); + //at first get all existing classes in knowledge base allClasses = getAllClasses(); allClasses.remove(classToDescribe); @@ -177,7 +183,7 @@ int cnt = qs.getLiteral("cnt").getInt(); class2Overlap.put(cls, cnt); } - //for each property in knowledge base + //for each class in knowledge base for(NamedClass cls : allClasses){if(!cls.toString().equals("http://dbpedia.org/ontology/MotorcycleRider"))continue; //get the popularity int otherPopularity = reasoner.getPopularity(cls); @@ -353,7 +359,7 @@ EvaluatedDescription evalDesc; - //firstly, create disjoint classexpressions which not occur and give score of 1 + //firstly, create disjoint classexpressions which do not occur and give score of 1 for(NamedClass cls : completeDisjointclasses){ if(useClassPopularity){ int overlap = 0; @@ -413,6 +419,7 @@ } else { evalDesc = new EvaluatedDescription(cls, new AxiomScore(1)); } + evalDescs.add(evalDesc); } class2Count.put(classToDescribe, total); @@ -450,16 +457,142 @@ } } + private void computeAllDisjointClassAxiomsOptimized(){ + //get number of instances of A + int instanceCountA = reasoner.getPopularity(classToDescribe); + + //firstly, we compute the disjointness to all sibling classes + Set<EvaluatedDescription> disjointessOfSiblings = computeDisjointessOfSiblings(classToDescribe); + System.out.println(disjointessOfSiblings); + + //we go the hierarchy up + SortedSet<Description> superClasses = reasoner.getSuperClasses(classToDescribe); + for (Description sup : superClasses) { + Set<EvaluatedDescription> disjointessOfSuperClass = computeDisjointessOfSiblings(sup.asNamedClass()); + System.out.println(disjointessOfSuperClass); + } + } + + private Set<EvaluatedDescription> computeDisjointessOfSiblings(NamedClass cls){ + Set<EvaluatedDescription> evaluatedDescriptions = new HashSet<EvaluatedDescription>(); + + //get number of instances of A + int instanceCountA = reasoner.getPopularity(cls); + + if(instanceCountA > 0){ + //we compute the disjointness to all sibling classes + Set<NamedClass> siblingClasses = reasoner.getSiblingClasses(cls); + + for (NamedClass sib : siblingClasses) { + //get number of instances of B + int instanceCountB = reasoner.getPopularity(sib); + + if(instanceCountB > 0){ + //get number of instances of (A and B) + int instanceCountAB = reasoner.getPopularity(new Intersection(cls, sib)); + + //we compute the estimated precision + double precision = accuracy(instanceCountB, instanceCountAB); + //we compute the estimated recall + double recall = accuracy(instanceCountA, instanceCountAB); + //compute the overall score + double score = 1 - fMEasure(precision, recall); + + EvaluatedDescription evalDesc = new EvaluatedDescription(sib, new AxiomScore(score)); + evaluatedDescriptions.add(evalDesc); + } + } + } + + return evaluatedDescriptions; + } + + private EvaluatedAxiom computeDisjointess(NamedClass clsA, NamedClass clsB){ + logger.debug("Computing disjointness between " + clsA + " and " + clsB + "..."); + + double scoreValue = 0; + + //get number of instances of A + int instanceCountA = reasoner.getPopularity(clsA); + + //get number of instances of B + int instanceCountB = reasoner.getPopularity(clsB); + + if(instanceCountA > 0 && instanceCountB > 0){ + //get number of instances of (A and B) + int instanceCountAB = reasoner.getPopularity(new Intersection(clsA, clsB)); + + //we compute the estimated precision + double precision = accuracy(instanceCountB, instanceCountAB); + + //we compute the estimated recall + double recall = accuracy(instanceCountA, instanceCountAB); + + //compute the overall score + scoreValue = 1 - fMEasure(precision, recall); + + } + + AxiomScore score = new AxiomScore(scoreValue); + + return new EvaluatedAxiom(new DisjointClassesAxiom(clsA, clsB), score); + } + + public Set<EvaluatedAxiom> computeSchemaDisjointness(){ + Set<EvaluatedAxiom> axioms = new HashSet<EvaluatedAxiom>(); + + Set<NamedClass> classes = reasoner.getOWLClasses("http://dbpedia.org/ontology/"); + computeDisjointness(classes); + + //start from the top level classes, i.e. the classes whose direct super class is owl:Thing + SortedSet<Description> topLevelClasses = reasoner.getMostGeneralClasses(); + axioms.addAll(computeDisjointness(asNamedClasses(topLevelClasses))); + + for (Description cls : topLevelClasses) { + + } + + return axioms; + } + + public Set<EvaluatedAxiom> computeDisjointness(Set<NamedClass> classes){ + Set<EvaluatedAxiom> axioms = new HashSet<EvaluatedAxiom>(); + + for (NamedClass clsA : classes) { + for (NamedClass clsB : classes) { + if(!clsA.equals(clsB)){ + axioms.add(computeDisjointess(clsA, clsB)); + } + } + } + + return axioms; + } + + public static Set<NamedClass> asNamedClasses(Set<Description> descriptions){ + Set<NamedClass> classes = new TreeSet<NamedClass>(); + for (Description description : descriptions) { + if(description.isNamedClass()){ + classes.add(description.asNamedClass()); + } + } + return classes; + } + 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.getEndpointDBpedia()); 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()); + ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); DisjointClassesLearner l = new DisjointClassesLearner(ks); - l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/Agent")); + SPARQLReasoner sparqlReasoner = new SPARQLReasoner(ks, "cache"); + sparqlReasoner.prepareSubsumptionHierarchy(); + sparqlReasoner.precomputeClassPopularity(); + l.setReasoner(sparqlReasoner); + l.setClassToDescribe(new NamedClass("http://dbpedia.org/ontology/Actor")); l.setMaxExecutionTimeInSeconds(60); l.init(); - l.getReasoner().prepareSubsumptionHierarchy(); - l.getReasoner().precomputeClassPopularity(); + l.computeSchemaDisjointness(); + // 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/algorithms/isle/index/SemanticAnnotator.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/SemanticAnnotator.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/SemanticAnnotator.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -5,7 +5,7 @@ import java.util.Set; import org.dllearner.algorithms.isle.EntityCandidateGenerator; -import org.dllearner.algorithms.isle.WordSenseDisambiguation; +import org.dllearner.algorithms.isle.wsd.WordSenseDisambiguation; import org.dllearner.core.owl.Entity; /** Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/SemanticIndex.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/SemanticIndex.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/SemanticIndex.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -7,12 +7,12 @@ import org.apache.log4j.Logger; import org.dllearner.algorithms.isle.EntityCandidateGenerator; -import org.dllearner.algorithms.isle.WordSenseDisambiguation; import org.dllearner.algorithms.isle.index.AnnotatedDocument; import org.dllearner.algorithms.isle.index.LinguisticAnnotator; import org.dllearner.algorithms.isle.index.SemanticAnnotator; import org.dllearner.algorithms.isle.index.TextDocument; import org.dllearner.algorithms.isle.index.syntactic.SyntacticIndex; +import org.dllearner.algorithms.isle.wsd.WordSenseDisambiguation; import org.dllearner.core.owl.Entity; import org.semanticweb.owlapi.model.OWLAnnotation; import org.semanticweb.owlapi.model.OWLAnnotationProperty; Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/simple/SimpleSemanticIndex.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/simple/SimpleSemanticIndex.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/isle/index/semantic/simple/SimpleSemanticIndex.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -3,7 +3,6 @@ */ package org.dllearner.algorithms.isle.index.semantic.simple; -import org.dllearner.algorithms.isle.SimpleWordSenseDisambiguation; import org.dllearner.algorithms.isle.index.SemanticAnnotator; import org.dllearner.algorithms.isle.index.SimpleEntityCandidatesTrie; import org.dllearner.algorithms.isle.index.TrieEntityCandidateGenerator; @@ -11,6 +10,7 @@ import org.dllearner.algorithms.isle.index.semantic.SemanticIndex; import org.dllearner.algorithms.isle.index.syntactic.SyntacticIndex; import org.dllearner.algorithms.isle.textretrieval.RDFSLabelEntityTextRetriever; +import org.dllearner.algorithms.isle.wsd.SimpleWordSenseDisambiguation; import org.semanticweb.owlapi.model.OWLOntology; /** Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -212,6 +212,14 @@ return toKBSyntaxString(null, null); } + public boolean isNamedClass(){ + return this instanceof NamedClass; + } + + public NamedClass asNamedClass(){ + return (NamedClass)this; + } + /** * Returns all named entities. * @return Modified: trunk/components-core/src/main/java/org/dllearner/parser/KBParser.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/parser/KBParser.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/parser/KBParser.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -36,7 +36,7 @@ return name; else return internalNamespace + name; - } + } public static Description parseConcept(String string) throws ParseException { // when just parsing the string as concept, we have no guarantee Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -42,6 +42,7 @@ import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.http.QueryExecutionFactoryHttp; import org.aksw.jena_sparql_api.model.QueryExecutionFactoryModel; +import org.aksw.jena_sparql_api.pagination.core.QueryExecutionFactoryPaginated; import org.dllearner.core.ComponentAnn; import org.dllearner.core.IndividualReasoner; import org.dllearner.core.SchemaReasoner; @@ -69,6 +70,7 @@ import org.dllearner.kb.sparql.SparqlEndpoint; import org.dllearner.utilities.datastructures.SortedSetTuple; import org.dllearner.utilities.owl.ConceptComparator; +import org.dllearner.utilities.owl.OWLClassExpressionToSPARQLConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -110,6 +112,7 @@ private boolean prepared = false; private ConceptComparator conceptComparator = new ConceptComparator(); + private OWLClassExpressionToSPARQLConverter converter = new OWLClassExpressionToSPARQLConverter(); public SPARQLReasoner(SparqlEndpointKS ks) { @@ -145,6 +148,10 @@ } public SPARQLReasoner(SparqlEndpointKS ks, CacheCoreEx cacheBackend) { + this(ks, new CacheExImpl(cacheBackend)); + } + + public SPARQLReasoner(SparqlEndpointKS ks, CacheEx cache) { this.ks = ks; classPopularityMap = new HashMap<NamedClass, Integer>(); @@ -153,8 +160,7 @@ if(ks.isRemote()){ SparqlEndpoint endpoint = ks.getEndpoint(); qef = new QueryExecutionFactoryHttp(endpoint.getURL().toString(), endpoint.getDefaultGraphURIs()); - CacheEx cacheFrontend = new CacheExImpl(cacheBackend); - qef = new QueryExecutionFactoryCacheEx(qef, cacheFrontend); + qef = new QueryExecutionFactoryCacheEx(qef, cache); // qef = new QueryExecutionFactoryPaginated(qef, 10000); } else { qef = new QueryExecutionFactoryModel(((LocalModelBasedSparqlEndpointKS)ks).getModel()); @@ -287,6 +293,17 @@ } } + + public int getPopularity(Description description){ + if(classPopularityMap != null && classPopularityMap.containsKey(description)){ + return classPopularityMap.get(description); + } else { + String query = converter.asCountQuery(description).toString(); + ResultSet rs = executeSelectQuery(query); + int cnt = rs.next().getLiteral("cnt").getInt(); + return cnt; + } + } public int getPopularity(ObjectProperty op){ if(objectPropertyPopularityMap != null && objectPropertyPopularityMap.containsKey(op)){ @@ -503,22 +520,25 @@ */ public Model loadOWLSchema(){ Model schema = ModelFactory.createDefaultModel(); + String prefixes = + "PREFIX owl:<http://www.w3.org/2002/07/owl#> " + + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> "; //axioms according to owl:Class entities - String query = + String query = prefixes + "CONSTRUCT {" + "?s a owl:Class." + "?s rdfs:subClassOf ?sup." + "?s owl:equivalentClass ?equiv." + - "?s owl:djsointWith ?disj." + + "?s owl:disjointWith ?disj." + "} WHERE {" + - "?s a owl:Class." + - "OPTIONAL{?s rdfs:subClassOf ?sup.}" + - "OPTIONAL{?s owl:equivalentClass ?equiv.}" + - "OPTIONAL{?s owl:djsointWith ?disj.}" + + "?s a owl:Class. " + + "OPTIONAL{?s rdfs:subClassOf ?sup.} " + + "OPTIONAL{?s owl:equivalentClass ?equiv.} " + + "OPTIONAL{?s owl:disjointWith ?disj.}" + "}"; schema.add(loadIncrementally(query)); //axioms according to owl:ObjectProperty entities - query = + query = prefixes + "CONSTRUCT {" + "?s a owl:ObjectProperty." + "?s a ?type." + @@ -526,14 +546,14 @@ "?s rdfs:range ?range." + "} WHERE {" + "?s a owl:ObjectProperty." + - "?s a ?type." + - "OPTIONAL{?s rdfs:domain ?domain.}" + + "?s a ?type. " + + "OPTIONAL{?s rdfs:domain ?domain.} " + "OPTIONAL{?s rdfs:range ?range.}" + "}"; schema.add(loadIncrementally(query)); //axioms according to owl:ObjectProperty entities - query = + query = prefixes + "CONSTRUCT {" + "?s a owl:DatatypeProperty." + "?s a ?type." + @@ -541,8 +561,8 @@ "?s rdfs:range ?range." + "} WHERE {" + "?s a owl:DatatypeProperty." + - "?s a ?type." + - "OPTIONAL{?s rdfs:domain ?domain.}" + + "?s a ?type. " + + "OPTIONAL{?s rdfs:domain ?domain.} " + "OPTIONAL{?s rdfs:range ?range.}" + "}"; schema.add(loadIncrementally(query)); @@ -550,11 +570,13 @@ return schema; } - private Model loadIncrementally(String query){ - System.out.println(query); + private Model loadIncrementally(String query){System.err.println(query); + QueryExecutionFactory old = qef; + qef = new QueryExecutionFactoryPaginated(qef, 10000); QueryExecution qe = qef.createQueryExecution(query); Model model = qe.execConstruct(); qe.close(); + qef = old; return model; } @@ -693,9 +715,13 @@ return types; } - public Set<NamedClass> getOWLClasses(String namespace) { - Set<NamedClass> types = new HashSet<NamedClass>(); - String query = String.format("SELECT DISTINCT ?class WHERE {?class a <%s>. FILTER(REGEX(?class,'%s'))}",OWL.Class.getURI(), namespace); + public SortedSet<NamedClass> getOWLClasses(String namespace) { + SortedSet<NamedClass> types = new TreeSet<NamedClass>(); + String query = "SELECT DISTINCT ?class WHERE {?class a <" + OWL.Class.getURI() + ">."; + if(namespace != null){ + query += "FILTER(REGEX(STR(?class),'" + namespace + "'))"; + } + query += "}"; ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ @@ -716,7 +742,7 @@ Set<NamedClass> siblings = new TreeSet<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() + ">)) . }";System.out.println(query); + query += "FILTER( !SAMETERM(?sub, <" + cls.getName() + ">)) . }"; ResultSet rs = executeSelectQuery(query); QuerySolution qs; while(rs.hasNext()){ @@ -1360,6 +1386,10 @@ public ClassHierarchy getClassHierarchy() { return hierarchy; } + + public SortedSet<Description> getMostGeneralClasses() { + return hierarchy.getMostGeneralClasses(); + } @Override public SortedSet<Description> getSuperClasses(Description description) { Modified: trunk/components-core/src/main/java/org/dllearner/utilities/GreedyCohaerencyExtractor.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/GreedyCohaerencyExtractor.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/utilities/GreedyCohaerencyExtractor.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -12,10 +12,10 @@ 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 java.util.Map.Entry; -import java.util.Set; import org.apache.commons.collections15.BidiMap; import org.apache.commons.collections15.bidimap.DualHashBidiMap; 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-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -11,7 +11,7 @@ import java.util.Stack; import java.util.TreeSet; -import org.aksw.commons.collections.diff.ModelDiff; +import org.dllearner.core.owl.Description; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.io.ToStringRenderer; import org.semanticweb.owlapi.model.OWLClass; @@ -63,7 +63,6 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryFactory; @@ -96,6 +95,10 @@ public VariablesMapping getVariablesMapping() { return mapping; } + + public String convert(String rootVariable, Description description){ + return convert(rootVariable, OWLAPIConverter.getOWLAPIDescription(description)); + } public String convert(String rootVariable, OWLClassExpression expr){ this.expr = expr; @@ -129,6 +132,23 @@ return QueryFactory.create(queryString, Syntax.syntaxARQ); } + public Query asCountQuery(OWLClassExpression expr){ + String rootVariable = "?s"; + String queryString = "SELECT (COUNT(DISTINCT " + rootVariable + ") AS ?cnt) WHERE {"; + String triplePattern = convert(rootVariable, expr); + queryString += triplePattern; + queryString += "}"; + return QueryFactory.create(queryString, Syntax.syntaxARQ); + } + + public Query asCountQuery(Description description){ + return asCountQuery(OWLAPIConverter.getOWLAPIDescription(description)); + } + + public Query asQuery(String rootVariable, Description desc, boolean countQuery){ + return asQuery(rootVariable, OWLAPIConverter.getOWLAPIDescription(desc), countQuery); + } + public Query asQuery(String rootVariable, OWLClassExpression expr, Set<? extends OWLEntity> variableEntities){ return asQuery(rootVariable, expr, variableEntities, false); } Modified: trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETest.java =================================================================== --- trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETest.java 2013-09-23 12:22:30 UTC (rev 4112) +++ trunk/components-core/src/test/java/org/dllearner/algorithms/isle/ISLETest.java 2013-10-03 08:50:57 UTC (rev 4113) @@ -6,6 +6,7 @@ import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.io.Files; + import org.dllearner.algorithms.celoe.CELOE; import org.dllearner.algorithms.isle.index.*; import org.dllearner.algorithms.isle.index.semantic.SemanticIndex; @@ -17,6 +18,8 @@ import org.dllearner.algorithms.isle.metrics.RelevanceUtils; import org.dllearner.algorithms.isle.textretrieval.EntityTextRetriever; import org.dllearner.algorithms.isle.textretrieval.RDFSLabelEntityTextRetriever; +import org.dllearner.algorithms.isle.wsd.SimpleWordSenseDisambiguation; +import org.dllearner.algorithms.isle.wsd.WordSenseDisambiguation; import org.dllearner.core.AbstractReasonerComponent; import org.dllearner.core.KnowledgeSource; import org.dllearner.core.owl.Entity; @@ -28,9 +31,12 @@ import org.junit.Before; import org.junit.Test; import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLDataFactory; +import org.semanticweb.owlapi.model.OWLEntity; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyManager; + import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl; import java.io.File; @@ -245,4 +251,14 @@ } + @Test + public void testWordSenseDisambiguation() throws Exception { + Set<OWLEntity> context = StructuralEntityContext.getContext(ontology, df.getOWLClass(IRI.create(cls.getName()))); + System.out.println(context); + + Set<String> contextNL = StructuralEntityContext.getContextInNaturalLanguage(ontology, df.getOWLClass(IRI.create(cls.getName()))); + System.out.println(contextNL); + } + + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-11-11 13:38:08
|
Revision: 4142 http://sourceforge.net/p/dl-learner/code/4142 Author: lorenz_b Date: 2013-11-11 13:38:04 +0000 (Mon, 11 Nov 2013) Log Message: ----------- isle. Modified Paths: -------------- trunk/components-core/pom.xml trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner2.java trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectPropertyDomainAxiom.java trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/CrossValidation.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/Experiment.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/SemanticBibleExperiment.java trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/pom.xml 2013-11-11 13:38:04 UTC (rev 4142) @@ -172,7 +172,7 @@ </dependency> <dependency> - <groupId>fuzzydll</groupId> + <groupId>org.fuzzy</groupId> <artifactId>fuzzydl</artifactId> <version>1.0</version> </dependency> Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/pattern/PatternBasedAxiomLearningAlgorithm.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -47,6 +47,7 @@ import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.ResultSetFormatter; +import com.hp.hpl.jena.rdf.arp.ARPOptions; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Resource; @@ -255,6 +256,8 @@ + " }" + " FILTER ( ?cnt1 = ?cnt2 ) }"; + query = "SELECT ?x WHERE {?x a <http://ex.org/A>. FILTER NOT EXISTS{?x <http://ex.org/p> ?s1. FILTER NOT EXISTS{?s1 a <http://ex.org/B>.}}} "; + rs = QueryExecutionFactory.create(query, model).execSelect(); System.out.println(ResultSetFormatter.asText(rs)); Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner2.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner2.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/properties/ObjectPropertyDomainAxiomLearner2.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -20,6 +20,7 @@ package org.dllearner.algorithms.properties; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -33,19 +34,28 @@ import org.dllearner.core.EvaluatedAxiom; import org.dllearner.core.config.ConfigOption; import org.dllearner.core.config.ObjectPropertyEditor; +import org.dllearner.core.owl.Axiom; import org.dllearner.core.owl.Description; import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.Intersection; import org.dllearner.core.owl.KBElement; import org.dllearner.core.owl.NamedClass; import org.dllearner.core.owl.ObjectProperty; import org.dllearner.core.owl.ObjectPropertyDomainAxiom; +import org.dllearner.core.owl.ObjectSomeRestriction; +import org.dllearner.core.owl.SubClassAxiom; +import org.dllearner.core.owl.Thing; import org.dllearner.kb.SparqlEndpointKS; import org.dllearner.kb.sparql.SparqlEndpoint; +import org.dllearner.learningproblems.AxiomScore; +import org.dllearner.learningproblems.Heuristics; import org.dllearner.reasoning.SPARQLReasoner; +import org.dllearner.utilities.owl.OWLClassExpressionToSPARQLConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.query.ParameterizedSparqlString; +import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; @@ -113,6 +123,113 @@ logger.info("...finished in {}ms.", (System.currentTimeMillis()-startTime)); } + private void buildSampleFragment(){ + workingModel = ModelFactory.createDefaultModel(); + int limit = 10000; + int offset = 0; + String filter = ""; + for (String ns : allowedNamespaces) { + filter += "FILTER(STRSTARTS(STR(?type), '" + ns + "'))"; + } + ParameterizedSparqlString queryTemplate = new ParameterizedSparqlString("CONSTRUCT {?s a ?type.} WHERE {?s ?p ?o. ?s a ?type. " + filter + "}"); + queryTemplate.setIri("p", propertyToDescribe.getName()); + Query query = queryTemplate.asQuery(); + query.setLimit(limit); + Model tmp = executeConstructQuery(query.toString()); + workingModel.add(tmp); + while(!tmp.isEmpty() && !terminationCriteriaSatisfied()){ + //increase offset by limit + offset += limit; + query.setOffset(offset); + //run query + tmp = executeConstructQuery(query.toString()); + workingModel.add(tmp); + } + } + + private void run(){ + //extract sample fragment from KB + buildSampleFragment(); + + //generate a set of axiom candidates + computeAxiomCandidates(); + + //compute evidence score on the whole KB + List<Axiom> axioms = getCurrentlyBestAxioms(); + currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); + //get total number of instances of A + int cntA = reasoner.getPopularity(propertyToDescribe); + OWLClassExpressionToSPARQLConverter converter = new OWLClassExpressionToSPARQLConverter(); + for (Axiom axiom : axioms) { + //get total number of instances of B + NamedClass domain = ((ObjectPropertyDomainAxiom)axiom).getDomain().asNamedClass(); + int cntB = reasoner.getPopularity(domain); + + //get number of instances of (A AND B) + Query query = converter.asCountQuery(new Intersection(domain, new ObjectSomeRestriction(propertyToDescribe, new Thing()))); +// System.out.println(query); + int cntAB = executeSelectQuery(query.toString()).next().getLiteral("cnt").getInt(); + + //precision (A AND B)/B + double precision = Heuristics.getConfidenceInterval95WaldAverage(cntB, cntAB); + + //recall (A AND B)/A + double recall = Heuristics.getConfidenceInterval95WaldAverage(cntA, cntAB); + + //beta + double beta = 3.0; + + //F score + double fscore = Heuristics.getFScore(recall, precision, beta); + System.out.println(axiom + ":" + fscore + "(P=" + precision + "|R=" + recall + ")"); + currentlyBestAxioms.add(new EvaluatedAxiom(axiom, new AxiomScore(fscore))); +// System.out.println(new EvaluatedAxiom(axiom, new AxiomScore(fscore))); + } + } + + private void computeAxiomCandidates() { + currentlyBestAxioms = new ArrayList<EvaluatedAxiom>(); + // get number of distinct subjects + String 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 ObjectPropertyDomainAxiom(propertyToDescribe, + new NamedClass(type.getURI())), computeScore(all, qs.get("cnt").asLiteral().getInt()))); + } + } + } + + private void computeLocalScore(){ + + } + + private void computeScore(Set<ObjectPropertyDomainAxiom> axioms){ + OWLClassExpressionToSPARQLConverter converter = new OWLClassExpressionToSPARQLConverter(); + for (ObjectPropertyDomainAxiom axiom : axioms) { + SubClassAxiom sub = axiom.asSubClassOfAxiom(); + String subClassQuery = converter.convert("?s", sub.getSubConcept()); + } + } + private void runSPARQL1_0_Mode() { workingModel = ModelFactory.createDefaultModel(); int limit = 1000; @@ -193,29 +310,34 @@ org.apache.log4j.Logger.getRootLogger().setLevel(Level.INFO); org.apache.log4j.Logger.getLogger(DataPropertyDomainAxiomLearner.class).setLevel(Level.INFO); - SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia()); + SparqlEndpointKS ks = new SparqlEndpointKS(SparqlEndpoint.getEndpointDBpedia(), "cache"); - SPARQLReasoner reasoner = new SPARQLReasoner(ks); + SPARQLReasoner reasoner = new SPARQLReasoner(ks, "cache"); reasoner.prepareSubsumptionHierarchy(); ObjectPropertyDomainAxiomLearner2 l = new ObjectPropertyDomainAxiomLearner2(ks); l.setReasoner(reasoner); - l.setPropertyToDescribe(new ObjectProperty("http://dbpedia.org/ontology/league")); - l.setMaxFetchedRows(20000); - l.setMaxExecutionTimeInSeconds(20); - l.addFilterNamespace("http://dbpedia.org/ontology/"); -// l.setReturnOnlyNewAxioms(true); - l.init(); - l.start(); + for (ObjectProperty p : reasoner.getOWLObjectProperties("http://dbpedia.org/ontology/")) { + System.out.println(p); + l.setPropertyToDescribe(p); + l.setMaxExecutionTimeInSeconds(10); + l.addFilterNamespace("http://dbpedia.org/ontology/"); +// l.setReturnOnlyNewAxioms(true); + l.init(); +// l.start(); + l.run(); + List<EvaluatedAxiom> axioms = l.getCurrentlyBestEvaluatedAxioms(10, 0.5); +// System.out.println(axioms); + System.out.println(l.getBestEvaluatedAxiom()); + } - List<EvaluatedAxiom> axioms = l.getCurrentlyBestEvaluatedAxioms(10, 0.3); - System.out.println(axioms); - for(EvaluatedAxiom axiom : axioms){ - printSubset(l.getPositiveExamples(axiom), 10); - printSubset(l.getNegativeExamples(axiom), 10); - l.explainScore(axiom); - } + +// for(EvaluatedAxiom axiom : axioms){ +// printSubset(l.getPositiveExamples(axiom), 10); +// printSubset(l.getNegativeExamples(axiom), 10); +// l.explainScore(axiom); +// } } } Modified: trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/core/AbstractAxiomLearningAlgorithm.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -118,7 +118,7 @@ protected boolean fullDataLoaded = false; - private List<String> filterNamespaces = new ArrayList<String>(); + protected List<String> allowedNamespaces = new ArrayList<String>(); protected ParameterizedSparqlString iterativeQueryTemplate; @@ -274,6 +274,13 @@ return returnList; } + public EvaluatedAxiom getBestEvaluatedAxiom(){ + if(!currentlyBestAxioms.isEmpty()){ + return new TreeSet<EvaluatedAxiom>(currentlyBestAxioms).last(); + } + return null; + } + protected Set<NamedClass> getAllClasses() { if(ks.isRemote()){ return new SPARQLTasks(((SparqlEndpointKS) ks).getEndpoint()).getAllClasses(); @@ -457,7 +464,7 @@ private Query buildQuery(){ Query query = iterativeQueryTemplate.asQuery(); - for(String ns : filterNamespaces){ + for(String ns : allowedNamespaces){ ((ElementGroup)query.getQueryPattern()).addElementFilter( new ElementFilter( new E_Regex( @@ -470,7 +477,7 @@ } public void addFilterNamespace(String namespace){ - filterNamespaces.add(namespace); + allowedNamespaces.add(namespace); } public Set<KBElement> getPositiveExamples(EvaluatedAxiom axiom){ Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/Description.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -239,8 +239,9 @@ } else if(propertyExpression instanceof DatatypeProperty){ entities.add((DatatypeProperty)propertyExpression); } - entities.addAll(getChild(0).getSignature()); - + if(!(this instanceof ObjectValueRestriction || this instanceof DatatypeValueRestriction) ){ + entities.addAll(getChild(0).getSignature()); + } } else { for (Description child : children) { entities.addAll(child.getSignature()); Modified: trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectPropertyDomainAxiom.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectPropertyDomainAxiom.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/core/owl/ObjectPropertyDomainAxiom.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -70,6 +70,12 @@ public void accept(KBElementVisitor visitor) { visitor.visit(this); } + + public SubClassAxiom asSubClassOfAxiom(){ + Description subClass = new ObjectSomeRestriction(getProperty(), new Thing()); + Description superClass = getDomain(); + return new SubClassAxiom(subClass, superClass); + } /* (non-Javadoc) * @see org.dllearner.core.owl.KBElement#toManchesterSyntaxString(java.lang.String, java.util.Map) Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/OWLAPIReasoner.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -357,6 +357,7 @@ if (!inconsistentOntology) { reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY, InferenceType.CLASS_ASSERTIONS); } else { + reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY); throw new ComponentInitException("Inconsistent ontologies."); } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/SPARQLReasoner.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -766,6 +766,34 @@ } return types; } + + public Set<ObjectProperty> getOWLObjectProperties() { + Set<ObjectProperty> types = new HashSet<ObjectProperty>(); + String query = String.format("SELECT DISTINCT ?p WHERE {?p a <%s>.}",OWL.ObjectProperty.getURI()); + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + types.add(new ObjectProperty(qs.getResource("p").getURI())); + } + return types; + } + + public SortedSet<ObjectProperty> getOWLObjectProperties(String namespace) { + SortedSet<ObjectProperty> types = new TreeSet<ObjectProperty>(); + String query = "SELECT DISTINCT ?p WHERE {?p a <" + OWL.ObjectProperty.getURI() + ">."; + if(namespace != null){ + query += "FILTER(REGEX(STR(?p),'" + namespace + "'))"; + } + query += "}"; + ResultSet rs = executeSelectQuery(query); + QuerySolution qs; + while(rs.hasNext()){ + qs = rs.next(); + types.add(new ObjectProperty(qs.getResource("p").getURI())); + } + return types; + } /** * Returns a set of classes which are siblings, i.e. on the same level Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -20,25 +20,17 @@ package org.dllearner.reasoning.fuzzydll; import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Scanner; import java.util.Set; -import java.util.TreeSet; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.semanticweb.owlapi.model.AxiomType; -import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLClass; import org.semanticweb.owlapi.model.OWLClassExpression; @@ -69,23 +61,25 @@ import org.semanticweb.owlapi.reasoner.UnsupportedEntailmentTypeException; import org.semanticweb.owlapi.reasoner.impl.DefaultNode; import org.semanticweb.owlapi.reasoner.impl.NodeFactory; -import org.semanticweb.owlapi.reasoner.impl.OWLClassNode; -import org.semanticweb.owlapi.reasoner.impl.OWLClassNodeSet; -import org.semanticweb.owlapi.reasoner.impl.OWLNamedIndividualNode; import org.semanticweb.owlapi.reasoner.impl.OWLNamedIndividualNodeSet; import org.semanticweb.owlapi.util.SimpleShortFormProvider; import org.semanticweb.owlapi.util.Version; -import uk.ac.manchester.cs.owl.owlapi.OWLNamedIndividualImpl; - import com.clarkparsia.pellet.owlapiv3.PelletReasoner; import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory; -import fuzzydl.*; +import fuzzydl.AllInstancesQuery; +import fuzzydl.Concept; +import fuzzydl.ConfigReader; +import fuzzydl.Individual; +import fuzzydl.KnowledgeBase; +import fuzzydl.MinInstanceQuery; +import fuzzydl.Query; import fuzzydl.exception.FuzzyOntologyException; import fuzzydl.milp.Solution; -import fuzzydl.parser.*; -import fuzzydll.fuzzyowl2fuzzydlparser.*; +import fuzzydl.parser.Parser; +import fuzzydll.fuzzyowl2fuzzydlparser.FuzzyOwl2toFuzzyDL; +import fuzzydll.fuzzyowl2fuzzydlparser.OWLAPI_fuzzyDLObjectParser; public class FuzzyDLReasonerManager implements OWLReasoner { @@ -182,10 +176,11 @@ Individual fIndividual = fuzzyKB.getIndividual(shortFormParser.getShortForm((OWLEntity) i)); Concept fConcept = OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(oce); - + try { + Query q = new MinInstanceQuery(fConcept, fIndividual); - try { + KnowledgeBase clonedFuzzyKB = fuzzyKB.clone(); // TODO: just for testing, remove @@ -368,8 +363,8 @@ } @Override - public NodeSet<OWLNamedIndividual> getInstances(OWLClassExpression arg0, - boolean arg1) throws InconsistentOntologyException, + public NodeSet<OWLNamedIndividual> getInstances(OWLClassExpression cls, + boolean direct) throws InconsistentOntologyException, ClassExpressionNotInProfileException, FreshEntitiesException, ReasonerInterruptedException, TimeOutException { @@ -379,34 +374,50 @@ // added by Josue in order to use fuzzyDL and not Pellet to answer this OWLAPI method boolean differentInstances = false; Solution localQuerySolution = null; - NodeSet<OWLNamedIndividual> owlApiOutput = crispReasoner.getInstances(arg0, arg1); + //get all instances using OWL API + NodeSet<OWLNamedIndividual> owlApiOutput = crispReasoner.getInstances(cls, direct); Set<OWLNamedIndividual> owlApiInstances = owlApiOutput.getFlattened(); - for (Individual fuzzyIndividual : fuzzyKB.individuals.values()) { - // TODO this "query process" is repeated several times --> create a (private) method - Query localQuery = new MinInstanceQuery(OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(arg0), fuzzyIndividual); - try { - KnowledgeBase clonedFuzzyKB = fuzzyKB.clone(); - localQuerySolution = localQuery.solve(clonedFuzzyKB); - if (!localQuerySolution.isConsistentKB()){ - System.err.println("Fuzzy KB is inconsistent."); - System.err.println("This may be a fuzzyDL reasoner bug. Press enter to continue."); - System.err.println("concept: " + arg0 + " individual: " + fuzzyIndividual); - Scanner sc = new Scanner(System.in); - sc.nextLine(); + //get all instances using FuzzyDL + try { + Concept fuzzyConcept = OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(cls); + AllInstancesQuery query = new AllInstancesQuery(fuzzyConcept); + Solution solution = query.solve(fuzzyKB); + if(solution.isConsistentKB() && solution.getSolution() == 0){ + List<Individual> individuals = query.getIndividuals(); + for (Individual individual : individuals) { + } - } catch (Exception e) { - e.printStackTrace(); } - if (localQuerySolution.getSolution() == 0) { - for (OWLNamedIndividual owlApiSingleInstance : owlApiOutput.getFlattened()) { - String a = baseURI.concat(fuzzyIndividual.toString()); - String b = owlApiSingleInstance.toStringID(); - if (a.equals(b)) { - owlApiInstances.remove(owlApiSingleInstance); - differentInstances = true; } - } - } + + } catch (FuzzyOntologyException e1) { + e1.printStackTrace(); } +// for (Individual fuzzyIndividual : fuzzyKB.) { +// // TODO this "query process" is repeated several times --> create a (private) method +// Query localQuery = new MinInstanceQuery(OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(cls), fuzzyIndividual); +// try { +// KnowledgeBase clonedFuzzyKB = fuzzyKB.clone(); +// localQuerySolution = localQuery.solve(clonedFuzzyKB); +// if (!localQuerySolution.isConsistentKB()){ +// System.err.println("Fuzzy KB is inconsistent."); +// System.err.println("This may be a fuzzyDL reasoner bug. Press enter to continue."); +// System.err.println("concept: " + cls + " individual: " + fuzzyIndividual); +// Scanner sc = new Scanner(System.in); +// sc.nextLine(); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// if (localQuerySolution.getSolution() == 0) { +// for (OWLNamedIndividual owlApiSingleInstance : owlApiOutput.getFlattened()) { +// String a = baseURI.concat(fuzzyIndividual.toString()); +// String b = owlApiSingleInstance.toStringID(); +// if (a.equals(b)) { +// owlApiInstances.remove(owlApiSingleInstance); +// differentInstances = true; } +// } +// } +// } if (differentInstances){ Set<Node<OWLNamedIndividual>> instances = new HashSet<Node<OWLNamedIndividual>>(); Modified: trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/utilities/datastructures/PrefixTrie.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -150,7 +150,7 @@ * @return A Map mapping each prefix to its corresponding value. */ public Map<String, T> toMap() { - Map<String, T> map = com.google.common.collect.Maps.newLinkedHashMap(); + Map<String, T> map = com.google.common.collect.Maps.newTreeMap(); addEntries(root, new StringBuilder(), map); return map; } 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-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/main/java/org/dllearner/utilities/owl/OWLClassExpressionToSPARQLConverter.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -348,13 +348,16 @@ sparql += triple(variables.peek(), propertyExpression.getNamedProperty(), objectVariable); } OWLClassExpression filler = ce.getFiller(); - if(filler.isAnonymous()){ - variables.push(objectVariable); - filler.accept(this); - variables.pop(); - } else { - sparql += triple(objectVariable, "a", filler.asOWLClass()); - } + variables.push(objectVariable); + filler.accept(this); + variables.pop(); +// if(filler.isAnonymous()){ +// variables.push(objectVariable); +// filler.accept(this); +// variables.pop(); +// } else { +// sparql += triple(objectVariable, "a", filler.asOWLClass()); +// } } Modified: trunk/components-core/src/test/java/org/dllearner/algorithms/isle/CrossValidation.java =================================================================== --- trunk/components-core/src/test/java/org/dllearner/algorithms/isle/CrossValidation.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/test/java/org/dllearner/algorithms/isle/CrossValidation.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -29,20 +29,25 @@ import java.util.Set; import java.util.TreeSet; +import org.dllearner.core.AbstractCELA; import org.dllearner.core.AbstractLearningProblem; +import org.dllearner.core.AbstractReasonerComponent; import org.dllearner.core.ComponentInitException; -import org.dllearner.core.AbstractCELA; -import org.dllearner.core.AbstractReasonerComponent; import org.dllearner.core.owl.Description; import org.dllearner.core.owl.Individual; import org.dllearner.learningproblems.Heuristics; import org.dllearner.learningproblems.PosNegLP; import org.dllearner.learningproblems.PosOnlyLP; +import org.dllearner.utilities.Files; import org.dllearner.utilities.Helper; import org.dllearner.utilities.datastructures.Datastructures; import org.dllearner.utilities.statistics.Stat; -import org.dllearner.utilities.Files; +import com.google.common.base.Charsets; +import com.google.common.hash.HashCode; +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; + /** * Performs cross validation for the given problem. Supports * k-fold cross-validation and leave-one-out cross-validation. @@ -69,6 +74,8 @@ protected Stat testingCompletenessStat = new Stat(); protected Stat testingCorrectnessStat = new Stat(); + static HashFunction hf = Hashing.crc32(); + public CrossValidation() { } @@ -90,7 +97,7 @@ posExamples = ((PosNegLP)lp).getPositiveExamples(); negExamples = ((PosNegLP)lp).getNegativeExamples(); } else if(lp instanceof PosOnlyLP){ - posExamples = ((PosNegLP)lp).getPositiveExamples(); + posExamples = ((PosOnlyLP)lp).getPositiveExamples(); negExamples = new HashSet<Individual>(); } else { throw new IllegalArgumentException("Only PosNeg and PosOnly learning problems are supported"); @@ -184,7 +191,7 @@ int trainingCorrectNegClassified = getCorrectNegClassified(rs, concept, trainingSetsNeg.get(currFold)); int trainingCorrectExamples = trainingCorrectPosClassified + trainingCorrectNegClassified; double trainingAccuracy = 100*((double)trainingCorrectExamples/(trainingSetsPos.get(currFold).size()+ - trainingSetsNeg.get(currFold).size())); + trainingSetsNeg.get(currFold).size())); HashFunction hf = Hashing.md5(); accuracyTraining.addNumber(trainingAccuracy); // calculate test accuracies int correctPosClassified = getCorrectPosClassified(rs, concept, testSetsPos.get(currFold)); @@ -308,5 +315,18 @@ public Stat getfMeasureTraining() { return fMeasureTraining; } - + + /** + * Returns for a given URI the fold number to which the URI is supposed to belong to. + * @param uri + * @param nrOfFolds + * @return + */ + public static int belongsToFoldNumber(String uri, int nrOfFolds){ + HashCode hc = hf.newHasher() + .putString(uri, Charsets.UTF_8) + .hash(); + int fold = hc.asInt() % nrOfFolds; + return fold; + } } Modified: trunk/components-core/src/test/java/org/dllearner/algorithms/isle/Experiment.java =================================================================== --- trunk/components-core/src/test/java/org/dllearner/algorithms/isle/Experiment.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/test/java/org/dllearner/algorithms/isle/Experiment.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -4,15 +4,15 @@ package org.dllearner.algorithms.isle; import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.text.DecimalFormat; +import java.util.Collections; import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.SortedSet; import org.dllearner.algorithms.celoe.CELOE; -import org.dllearner.algorithms.isle.index.RemoteDataProvider; import org.dllearner.algorithms.isle.index.TextDocument; import org.dllearner.algorithms.isle.index.semantic.SemanticIndex; import org.dllearner.algorithms.isle.index.semantic.simple.SimpleSemanticIndex; @@ -21,22 +21,28 @@ import org.dllearner.algorithms.isle.metrics.RelevanceUtils; import org.dllearner.core.AbstractReasonerComponent; import org.dllearner.core.ComponentInitException; +import org.dllearner.core.EvaluatedDescription; import org.dllearner.core.KnowledgeSource; +import org.dllearner.core.owl.Description; import org.dllearner.core.owl.Entity; +import org.dllearner.core.owl.Individual; +import org.dllearner.core.owl.Intersection; import org.dllearner.core.owl.NamedClass; +import org.dllearner.core.owl.Thing; import org.dllearner.kb.OWLAPIOntology; import org.dllearner.learningproblems.ClassLearningProblem; +import org.dllearner.learningproblems.PosOnlyLP; import org.dllearner.reasoning.FastInstanceChecker; -import org.dllearner.utilities.Helper; -import org.semanticweb.owlapi.apibinding.OWLManager; -import org.semanticweb.owlapi.model.IRI; +import org.dllearner.refinementoperators.CustomStartRefinementOperator; +import org.dllearner.refinementoperators.LengthLimitedRefinementOperator; +import org.dllearner.refinementoperators.OperatorInverter; +import org.dllearner.refinementoperators.ReasoningBasedRefinementOperator; +import org.dllearner.refinementoperators.RhoDRDown; import org.semanticweb.owlapi.model.OWLClass; import org.semanticweb.owlapi.model.OWLOntology; -import org.semanticweb.owlapi.model.OWLOntologyManager; -import com.google.common.base.Charsets; +import com.clarkparsia.sparqlowl.parser.antlr.SparqlOwlParser.whereClause_return; import com.google.common.collect.Sets; -import com.google.common.io.Files; /** * Experimental setup: @@ -55,7 +61,7 @@ */ private final boolean LEAVE_ONE_OUT = false; - private ClassLearningProblem lp; + private PosOnlyLP lp; private RelevanceMetric relevance; private AbstractReasonerComponent reasoner; @@ -65,6 +71,7 @@ private Set<TextDocument> documents; private boolean initialized = false; + private RhoDRDown operator; protected abstract OWLOntology getOntology(); @@ -87,7 +94,15 @@ reasoner = new FastInstanceChecker(ks); reasoner.init(); // set learning problem - lp = new ClassLearningProblem(reasoner); +// lp = new ClassLearningProblem(reasoner); + lp = new PosOnlyLP(reasoner); + + //refinement operator for getting a start class + operator = new RhoDRDown(); + if(operator instanceof ReasoningBasedRefinementOperator) { + ((ReasoningBasedRefinementOperator)operator).setReasoner(reasoner); + } + operator.init(); } catch (ComponentInitException e) { e.printStackTrace(); } @@ -124,6 +139,73 @@ } } + private Description getStartClass(NamedClass cls, boolean isEquivalenceProblem, boolean reuseExistingDescription){ + //get instances of class to describe + SortedSet<Individual> individuals = reasoner.getIndividuals(cls); + + //set start class to owl:Thing first + Description startClass = Thing.instance; + if(operator instanceof CustomStartRefinementOperator) { + ((CustomStartRefinementOperator)operator).setStartClass(startClass); + } + if(isEquivalenceProblem) { + Set<Description> existingDefinitions = reasoner.getAssertedDefinitions(cls); + if(reuseExistingDescription && (existingDefinitions.size() > 0)) { + // the existing definition is reused, which in the simplest case means to + // use it as a start class or, if it is already too specific, generalise it + + // pick the longest existing definition as candidate + Description existingDefinition = null; + int highestLength = 0; + for(Description exDef : existingDefinitions) { + if(exDef.getLength() > highestLength) { + existingDefinition = exDef; + highestLength = exDef.getLength(); + } + } + + LinkedList<Description> startClassCandidates = new LinkedList<Description>(); + startClassCandidates.add(existingDefinition); + // hack for RhoDRDown + if(operator instanceof RhoDRDown) { + ((RhoDRDown)operator).setDropDisjuncts(true); + } + LengthLimitedRefinementOperator upwardOperator = (LengthLimitedRefinementOperator) new OperatorInverter(operator); + + // use upward refinement until we find an appropriate start class + boolean startClassFound = false; + Description candidate; + do { + candidate = startClassCandidates.pollFirst(); + SortedSet<Individual> candidateIndividuals = reasoner.getIndividuals(candidate); + double recall = Sets.intersection(individuals, candidateIndividuals).size() / (double)individuals.size(); + if(recall < 1.0) { + // add upward refinements to list + Set<Description> refinements = upwardOperator.refine(candidate, candidate.getLength()); + LinkedList<Description> refinementList = new LinkedList<Description>(refinements); +// Collections.reverse(refinementList); +// System.out.println("list: " + refinementList); + startClassCandidates.addAll(refinementList); +// System.out.println("candidates: " + startClassCandidates); + } else { + startClassFound = true; + } + } while(!startClassFound); + startClass = candidate; + } else { + Set<Description> superClasses = reasoner.getClassHierarchy().getSuperClasses(cls); + if(superClasses.size() > 1) { + startClass = new Intersection(new LinkedList<Description>(superClasses)); + } else if(superClasses.size() == 1){ + startClass = (Description) superClasses.toArray()[0]; + } else { + startClass = Thing.instance; + } + } + } + return startClass; + } + /** * Run the experiment on the given class. * @param cls @@ -132,26 +214,56 @@ public void run(NamedClass cls) throws ComponentInitException { initIfNecessary(); - lp.setClassToDescribe(cls); +// lp.setClassToDescribe(cls); + //get the positive examples, here just the instances of the class to describe + SortedSet<Individual> individuals = reasoner.getIndividuals(cls); + lp.setPositiveExamples(individuals); lp.init(); + //get the start class for the learning algorithms + Description startClass = getStartClass(cls, true, true); + Map<Entity, Double> entityRelevance = RelevanceUtils.getRelevantEntities(cls, ontology, relevance); NLPHeuristic heuristic = new NLPHeuristic(entityRelevance); + heuristic.setStartNodeBonus(100); + ClassLearningProblem clp = new ClassLearningProblem(reasoner); + clp.setClassToDescribe(cls); + clp.init(); + + System.out.println(reasoner.getObjectProperties()); + + RhoDRDown rop = new RhoDRDown(); + rop.setReasoner(reasoner); + rop.setUseNegation(false); + rop.init(); + // perform cross validation with ISLE - ISLE isle = new ISLE(lp, reasoner); + ISLE isle = new ISLE(clp, reasoner); isle.setHeuristic(heuristic); -// isle.setSearchTreeFile(testFolder + "searchTreeISLE.txt"); -// isle.setWriteSearchTree(true); + isle.setMaxNrOfResults(30); + isle.setOperator(rop); +// isle.setStartClass(startClass); + new File(testFolder).mkdirs(); + isle.setSearchTreeFile(testFolder + "searchTreeISLE.txt"); + isle.setWriteSearchTree(true); // isle.setReplaceSearchTree(true); - isle.setTerminateOnNoiseReached(true); +// isle.setTerminateOnNoiseReached(true); + isle.setIgnoredConcepts(Collections.singleton(cls)); + isle.setReplaceSearchTree(true); isle.init(); + isle.start();System.exit(1); + List<? extends EvaluatedDescription> currentlyBestDescriptions = isle.getCurrentlyBestEvaluatedDescriptions(20); + for (EvaluatedDescription description : currentlyBestDescriptions) { + System.out.println(description); + } CrossValidation crossValidationISLE = new CrossValidation(isle, lp, reasoner, FOLDS, LEAVE_ONE_OUT); // perform cross validation with CELOE CELOE celoe = new CELOE(lp, reasoner); -// celoe.setSearchTreeFile(testFolder + "searchTreeCELOE.txt"); -// celoe.setWriteSearchTree(true); + celoe.setStartClass(startClass); + celoe.setSearchTreeFile(testFolder + "searchTreeCELOE.txt"); + celoe.setWriteSearchTree(true); // celoe.setReplaceSearchTree(true); celoe.setTerminateOnNoiseReached(true); celoe.init(); Modified: trunk/components-core/src/test/java/org/dllearner/algorithms/isle/SemanticBibleExperiment.java =================================================================== --- trunk/components-core/src/test/java/org/dllearner/algorithms/isle/SemanticBibleExperiment.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/test/java/org/dllearner/algorithms/isle/SemanticBibleExperiment.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -10,6 +10,7 @@ import java.util.HashSet; import java.util.Set; +import org.aksw.jena_sparql_api.model.QueryExecutionFactoryModel; import org.dllearner.algorithms.isle.index.RemoteDataProvider; import org.dllearner.algorithms.isle.index.TextDocument; import org.dllearner.core.owl.NamedClass; @@ -22,6 +23,9 @@ import com.google.common.base.Charsets; import com.google.common.collect.Sets; import com.google.common.io.Files; +import com.hp.hpl.jena.query.ResultSetFormatter; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; /** * @author Lorenz Buehmann @@ -41,6 +45,11 @@ OWLOntology mergedOntology = man.createOntology(IRI.create("http://semanticbible.com/merged.owl")); man.addAxioms(mergedOntology, schema.getAxioms()); man.addAxioms(mergedOntology, instances.getAxioms()); +// Model model = ModelFactory.createDefaultModel(); +// model.read("http://www.semanticbible.com/2006/11/NTNames.owl"); +// model.read("http://www.semanticbible.com/2006/11/NTN-individuals.owl"); +// QueryExecutionFactoryModel qef = new QueryExecutionFactoryModel(model); +// System.out.println(ResultSetFormatter.asText(qef.createQueryExecution("SELECT ?s ?p WHERE {?s a <http://semanticbible.org/ns/2006/NTNames#Woman>. ?s ?p ?o.}").execSelect())); return mergedOntology; } catch (OWLOntologyCreationException e) { e.printStackTrace(); Modified: trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java =================================================================== --- trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java 2013-11-08 09:29:40 UTC (rev 4141) +++ trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/LGGTest.java 2013-11-11 13:38:04 UTC (rev 4142) @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileInputStream; +import java.net.URL; import java.util.ArrayList; import java.util.List; @@ -34,6 +35,9 @@ import org.dllearner.algorithms.qtl.operations.lgg.LGGGenerator; import org.dllearner.algorithms.qtl.operations.lgg.LGGGeneratorImpl; import org.dllearner.algorithms.qtl.operations.lgg.NoiseSensitiveLGG; +import org.dllearner.kb.sparql.ConciseBoundedDescriptionGenerator; +import org.dllearner.kb.sparql.ConciseBoundedDescriptionGeneratorImpl; +import org.dllearner.kb.sparql.SparqlEndpoint; import org.junit.Assert; import org.junit.Test; @@ -427,6 +431,31 @@ System.out.println("Covered negatives:" + coveredNegatives); } } + + @Test + public void testTCGA() throws Exception{ + URL url = new URL("http://vmlion14.deri.ie/node43/8080/sparql"); + SparqlEndpoint endpoint = new SparqlEndpoint(url); + List<String> posExamples = Lists.newArrayList("http://tcga.deri.ie/TCGA-BI-A0VS","http://tcga.deri.ie/TCGA-BI-A20A"); + + ConciseBoundedDescriptionGenerator cbdGen = new ConciseBoundedDescriptionGeneratorImpl(endpoint); + + QueryTreeFactory<String> queryTreeFactory = new QueryTreeFactoryImpl(); + + List<QueryTree<String>> posExampleTrees = new ArrayList<QueryTree<String>>(); + for (String ex : posExamples) { + Model cbd = cbdGen.getConciseBoundedDescription(ex, 0); + System.out.println(cbd.size()); + QueryTreeImpl<String> tree = queryTreeFactory.getQueryTree(ex, cbd); + posExampleTrees.add(tree); + } + + NoiseSensitiveLGG<String> lggGenerator = new NoiseSensitiveLGG<String>(); + List<EvaluatedQueryTree<String>> lggs = lggGenerator.computeLGG(posExampleTrees); + for (EvaluatedQueryTree<String> lgg : lggs) { + System.out.println(lgg); + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lor...@us...> - 2013-11-19 12:04:02
|
Revision: 4152 http://sourceforge.net/p/dl-learner/code/4152 Author: lorenz_b Date: 2013-11-19 12:03:59 +0000 (Tue, 19 Nov 2013) Log Message: ----------- Updated fuzzy component. Modified Paths: -------------- trunk/components-core/pom.xml trunk/components-core/src/main/java/org/dllearner/algorithms/isle/textretrieval/RDFSLabelEntityTextRetriever.java trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/Experiment.java trunk/components-core/src/test/java/org/dllearner/algorithms/isle/SemanticBibleExperiment.java trunk/components-core/src/test/java/org/dllearner/algorithms/qtl/QALDExperiment.java Added Paths: ----------- trunk/components-core/src/main/java/org/dllearner/utilities/FuzzyOwl2.java trunk/components-core/src/main/java/org/dllearner/utilities/FuzzyOwl2toFuzzyDL.java Modified: trunk/components-core/pom.xml =================================================================== --- trunk/components-core/pom.xml 2013-11-18 09:42:55 UTC (rev 4151) +++ trunk/components-core/pom.xml 2013-11-19 12:03:59 UTC (rev 4152) @@ -177,11 +177,17 @@ <version>1.0</version> </dependency> +<!-- <dependency> --> +<!-- <groupId>fuzzydll</groupId> --> +<!-- <artifactId>fuzzyowl2fuzzydlparser</artifactId> --> +<!-- <version>1.0</version> --> +<!-- </dependency> --> + <dependency> - <groupId>fuzzydll</groupId> - <artifactId>fuzzyowl2fuzzydlparser</artifactId> - <version>1.0</version> - </dependency> + <groupId>org.fuzzy</groupId> + <artifactId>fuzzyowl</artifactId> + <version>1.0</version> + </dependency> <dependency> <groupId>edu.northwestern.at</groupId> Modified: trunk/components-core/src/main/java/org/dllearner/algorithms/isle/textretrieval/RDFSLabelEntityTextRetriever.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/algorithms/isle/textretrieval/RDFSLabelEntityTextRetriever.java 2013-11-18 09:42:55 UTC (rev 4151) +++ trunk/components-core/src/main/java/org/dllearner/algorithms/isle/textretrieval/RDFSLabelEntityTextRetriever.java 2013-11-19 12:03:59 UTC (rev 4152) @@ -3,13 +3,27 @@ */ package org.dllearner.algorithms.isle.textretrieval; +import java.io.File; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.dllearner.core.owl.Entity; import org.dllearner.kb.OWLAPIOntology; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyManager; import org.semanticweb.owlapi.vocab.OWLRDFVocabulary; import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl; +import com.google.common.base.Charsets; +import com.google.common.io.Files; + /** * @author Lorenz Buehmann * @@ -23,4 +37,27 @@ public RDFSLabelEntityTextRetriever(OWLAPIOntology ontology) { super(ontology, new OWLDataFactoryImpl().getOWLAnnotationProperty(OWLRDFVocabulary.RDFS_LABEL.getIRI())); } + + public static void main(String[] args) throws Exception { + OWLOntologyManager man = OWLManager.createOWLOntologyManager(); + OWLOntology ontology = man.loadOntology(IRI.create("http://www.semanticbible.com/2006/11/NTNames.owl")); + + RDFSLabelEntityTextRetriever labelRetriever = new RDFSLabelEntityTextRetriever(ontology); + Map<Entity, Set<String>> relevantText = labelRetriever.getRelevantText(ontology); + SortedMap<String, String> uri2Labels = new TreeMap<String, String>(); + + for (Entry<Entity, Set<String>> entry : relevantText.entrySet()) { + Entity key = entry.getKey(); + Set<String> value = entry.getValue(); + uri2Labels.put(key.getName(), value.iterator().next()); + } + + StringBuilder csv = new StringBuilder(); + for (Entry<String, String> entry : uri2Labels.entrySet()) { + String uri = entry.getKey(); + String label = entry.getValue(); + csv.append(uri).append(",").append(label).append("\n"); + } + Files.write(csv, new File("semantic-bible-labels.csv"), Charsets.UTF_8); + } } Modified: trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java 2013-11-18 09:42:55 UTC (rev 4151) +++ trunk/components-core/src/main/java/org/dllearner/reasoning/fuzzydll/FuzzyDLReasonerManager.java 2013-11-19 12:03:59 UTC (rev 4152) @@ -19,7 +19,9 @@ package org.dllearner.reasoning.fuzzydll; +import java.io.ByteArrayOutputStream; import java.io.FileInputStream; +import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashSet; @@ -30,6 +32,7 @@ import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.dllearner.utilities.FuzzyOwl2toFuzzyDL; import org.semanticweb.owlapi.model.AxiomType; import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLClass; @@ -37,7 +40,6 @@ import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLDataProperty; import org.semanticweb.owlapi.model.OWLDataPropertyExpression; -import org.semanticweb.owlapi.model.OWLEntity; import org.semanticweb.owlapi.model.OWLIndividual; import org.semanticweb.owlapi.model.OWLLiteral; import org.semanticweb.owlapi.model.OWLNamedIndividual; @@ -68,6 +70,7 @@ import com.clarkparsia.pellet.owlapiv3.PelletReasoner; import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory; +import edu.stanford.nlp.io.StringOutputStream; import fuzzydl.AllInstancesQuery; import fuzzydl.Concept; import fuzzydl.ConfigReader; @@ -78,8 +81,6 @@ import fuzzydl.exception.FuzzyOntologyException; import fuzzydl.milp.Solution; import fuzzydl.parser.Parser; -import fuzzydll.fuzzyowl2fuzzydlparser.FuzzyOwl2toFuzzyDL; -import fuzzydll.fuzzyowl2fuzzydlparser.OWLAPI_fuzzyDLObjectParser; public class FuzzyDLReasonerManager implements OWLReasoner { @@ -104,6 +105,8 @@ // private PrintStream out; // private int counter = 1; // private int counter2 = 1; + + private ByteArrayOutputStream baos; public FuzzyDLReasonerManager(String ontologyFile, OWLOntology ontology, OWLReasonerConfiguration conf, OWLDataFactory factory, String baseURI) throws Exception { @@ -132,12 +135,27 @@ fuzzyKB = parseOWLontologyToFuzzyDLsyntax(ontologyFile); // fuzzyFileParser.setBaseKB(fuzzyKB); - OWLAPI_fuzzyDLObjectParser.setParsingFuzzyKB(fuzzyFileParser, fuzzyKB); +// OWLAPI_fuzzyDLObjectParser.setParsingFuzzyKB(fuzzyFileParser, fuzzyKB); + baos = new ByteArrayOutputStream(); + fuzzyFileParser.setPrintStream(new PrintStream(baos)); + solveKB(); - // errorFile = new FileOutputStream("errorFile.txt"); + // errorFile = new FileOutputStream("errorFile.txt")name; } + + private Concept convert(OWLClassExpression classExpression){ + baos.reset(); + String name = fuzzyFileParser.getClassName(classExpression); + return fuzzyKB.getConcept(name); + } + + private Individual convert(OWLIndividual individual){ + baos.reset(); + String name = fuzzyFileParser.getIndividualName(individual); + return fuzzyKB.getIndividual(name); + } private void startPellet(OWLOntology ontology, OWLReasonerConfiguration conf) { // instantiate Pellet reasoner @@ -173,9 +191,10 @@ // added by Josue public double getFuzzyMembership(OWLClassExpression oce, OWLIndividual i) { - - Individual fIndividual = fuzzyKB.getIndividual(shortFormParser.getShortForm((OWLEntity) i)); - Concept fConcept = OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(oce); + + Individual fIndividual = convert(i); + Concept fConcept = convert(oce); + System.out.println(fConcept + "(" + fIndividual + ")?"); try { Query q = new MinInstanceQuery(fConcept, fIndividual); @@ -215,7 +234,6 @@ // Scanner sc = new Scanner(System.in); // sc.nextLine(); } - // return (1 - Math.abs(truthDegree - queryResult.getSolution())); return queryResult.getSolution(); } @@ -379,7 +397,7 @@ Set<OWLNamedIndividual> owlApiInstances = owlApiOutput.getFlattened(); //get all instances using FuzzyDL try { - Concept fuzzyConcept = OWLAPI_fuzzyDLObjectParser.getFuzzyDLExpresion(cls); + Concept fuzzyConcept = convert(cls); AllInstancesQuery query = new AllInstancesQuery(fuzzyConcept); Solution solution = query.solve(fuzzyKB); if(solution.isConsistentKB() && solution.getSolution() == 0){ Added: trunk/components-core/src/main/java/org/dllearner/utilities/FuzzyOwl2.java =================================================================== --- trunk/components-core/src/main/java/org/dllearner/utilities/FuzzyOwl2.java (rev 0) +++ trunk/components-core/src/main/java/org/dllearner/utilities/FuzzyOwl2.java 2013-11-19 12:03:59 UTC (rev 4152) @@ -0,0 +1,1929 @@ +package org.dllearner.utilities; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.AxiomType; +import org.semanticweb.owlapi.model.DataRangeType; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLAnnotation; +import org.semanticweb.owlapi.model.OWLAnnotationProperty; +import org.semanticweb.owlapi.model.OWLAnnotationValue; +import org.semanticweb.owlapi.model.OWLAsymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLAxiom; +import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; +import org.semanticweb.owlapi.model.OWLClassExpression; +import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; +import org.semanticweb.owlapi.model.OWLDataCardinalityRestriction; +import org.semanticweb.owlapi.model.OWLDataExactCardinality; +import org.semanticweb.owlapi.model.OWLDataFactory; +import org.semanticweb.owlapi.model.OWLDataHasValue; +import org.semanticweb.owlapi.model.OWLDataIntersectionOf; +import org.semanticweb.owlapi.model.OWLDataMaxCardinality; +import org.semanticweb.owlapi.model.OWLDataMinCardinality; +import org.semanticweb.owlapi.model.OWLDataProperty; +import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyExpression; +import org.semanticweb.owlapi.model.OWLDataPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLDataRange; +import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLDatatype; +import org.semanticweb.owlapi.model.OWLDatatypeDefinitionAxiom; +import org.semanticweb.owlapi.model.OWLDatatypeRestriction; +import org.semanticweb.owlapi.model.OWLDeclarationAxiom; +import org.semanticweb.owlapi.model.OWLDifferentIndividualsAxiom; +import org.semanticweb.owlapi.model.OWLDisjointClassesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointDataPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLDisjointUnionAxiom; +import org.semanticweb.owlapi.model.OWLEntity; +import org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom; +import org.semanticweb.owlapi.model.OWLEquivalentDataPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLEquivalentObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLFacetRestriction; +import org.semanticweb.owlapi.model.OWLFunctionalDataPropertyAxiom; +import org.semanticweb.owlapi.model.OWLFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLIndividual; +import org.semanticweb.owlapi.model.OWLInverseFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLInverseObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLIrreflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLLiteral; +import org.semanticweb.owlapi.model.OWLNegativeDataPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; +import org.semanticweb.owlapi.model.OWLObjectCardinalityRestriction; +import org.semanticweb.owlapi.model.OWLObjectComplementOf; +import org.semanticweb.owlapi.model.OWLObjectExactCardinality; +import org.semanticweb.owlapi.model.OWLObjectHasSelf; +import org.semanticweb.owlapi.model.OWLObjectHasValue; +import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; +import org.semanticweb.owlapi.model.OWLObjectMaxCardinality; +import org.semanticweb.owlapi.model.OWLObjectMinCardinality; +import org.semanticweb.owlapi.model.OWLObjectOneOf; +import org.semanticweb.owlapi.model.OWLObjectProperty; +import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyExpression; +import org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLObjectUnionOf; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyCreationException; +import org.semanticweb.owlapi.model.OWLOntologyManager; +import org.semanticweb.owlapi.model.OWLProperty; +import org.semanticweb.owlapi.model.OWLReflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLSameIndividualAxiom; +import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; +import org.semanticweb.owlapi.model.OWLSubDataPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; +import org.semanticweb.owlapi.model.OWLSymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; +import org.semanticweb.owlapi.util.SimpleShortFormProvider; +import org.semanticweb.owlapi.vocab.OWLFacet; + +import fuzzyowl2.ChoquetConcept; +import fuzzyowl2.ConceptDefinition; +import fuzzyowl2.FuzzyConcept; +import fuzzyowl2.FuzzyDatatype; +import fuzzyowl2.FuzzyLogic; +import fuzzyowl2.FuzzyModifier; +import fuzzyowl2.FuzzyNominalConcept; +import fuzzyowl2.FuzzyProperty; +import fuzzyowl2.LeftShoulderFunction; +import fuzzyowl2.LinearFunction; +import fuzzyowl2.LinearModifier; +import fuzzyowl2.ModifiedConcept; +import fuzzyowl2.ModifiedFunction; +import fuzzyowl2.ModifiedProperty; +import fuzzyowl2.OwaConcept; +import fuzzyowl2.PropertyDefinition; +import fuzzyowl2.QowaConcept; +import fuzzyowl2.QuasiSugenoConcept; +import fuzzyowl2.RightShoulderFunction; +import fuzzyowl2.SugenoConcept; +import fuzzyowl2.TrapezoidalFunction; +import fuzzyowl2.TriangularFunction; +import fuzzyowl2.TriangularModifier; +import fuzzyowl2.WeightedConcept; +import fuzzyowl2.WeightedMaxConcept; +import fuzzyowl2.WeightedMinConcept; +import fuzzyowl2.WeightedSumConcept; +import fuzzyowl2.parser.Parser; + + +/** + * General class translating from OWL 2 into some fuzzy Description Logic language. + * Subclasses of Owl2ToFuzzyDescriptionLogic translate it into specific + * languages, such as the language of fuzzyDL, the language of DeLorean... + * The user must override most of the following methods: + * + * <ul> + <li>protected String getAtomicConceptName(OWLClass c)</li> + <li>protected String getAtomicDataPropertyName(OWLDataProperty p)</li> + <li>protected String getAtomicObjectPropertyName(OWLObjectProperty p)</li> + <li>protected String getBottomConceptName()</li> + <li>protected String getBottomDataPropertyName()</li> + <li>protected String getBottomObjectPropertyName()</li> + <li>protected String getDataAllValuesFromName(OWLDataPropertyExpression p, OWLDataRange range)</li> + <li>protected String getDataExactCardinalityRestrictionName(int card, OWLDataPropertyExpression p)</li> + <li>protected String getDataExactCardinalityRestrictionName(int card, OWLDataPropertyExpression p, OWLDataRange range)</li> + <li>protected String getDataHasValueName(OWLDataPropertyExpression p, OWLLiteral lit)</li> + <li>protected String getDataMaxCardinalityRestrictionName(int card, OWLDataPropertyExpression p)</li> + <li>protected String getDataMaxCardinalityRestrictionName(int card, OWLDataPropertyExpression p, OWLDataRange range)</li> + <li>protected String getDataMinCardinalityRestrictionName(int card, OWLDataPropertyExpression p)</li> + <li>protected String getDataMinCardinalityRestrictionName(int card, OWLDataPropertyExpression p, OWLDataRange range)</li> + <li>protected String getDataSomeValuesFromName(OWLDataPropertyExpression p, OWLDataRange range)</li> + <li>protected String getIndividualName(OWLIndividual i)</li> + <li>protected String getObjectAllValuesFromName(OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected String getObjectComplementOfName(OWLClassExpression c)</li> + <li>protected String getObjectExactCardinalityRestrictionName(int card, OWLObjectPropertyExpression p)</li> + <li>protected String getObjectExactCardinalityRestrictionName(int card, OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected String getObjectHasSelfName(OWLObjectPropertyExpression p)</li> + <li>protected String getObjectHasValueName(OWLObjectPropertyExpression p, OWLIndividual i)</li> + <li>protected String getObjectIntersectionOfName(Set<OWLClassExpression> operands)</li> + <li>protected String getObjectMaxCardinalityRestrictionName(int card, OWLObjectPropertyExpression p)</li> + <li>protected String getObjectMaxCardinalityRestrictionName(int card, OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected String getObjectMinCardinalityRestrictionName(int card, OWLObjectPropertyExpression p)</li> + <li>protected String getObjectMinCardinalityRestrictionName(int card, OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected String getObjectOneOfName(Set<OWLIndividual> set)</li> + <li>protected String getObjectSomeValuesFromName(OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected String getObjectUnionOfName(Set<OWLClassExpression> operands)</li> + <li>protected String getShortName(OWLEntity e)</li> + <li>protected String getTopConceptName()</li> + <li>protected String getTopDataPropertyName()</li> + <li>protected String getTopObjectPropertyName()</li> + <li>protected void writeAsymmetricObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeChoquetConceptDefinition(String name, ChoquetConcept c)</li> + <li>protected void writeConceptAssertionAxiom(OWLIndividual i, OWLClassExpression c, double d)</li> + <li>protected void writeConceptDeclaration(OWLClassExpression c)</li> + <li>protected void writeDataPropertyAssertionAxiom(OWLIndividual i1, OWLLiteral i2, OWLDataPropertyExpression p, double d)</li> + <li>protected void writeDataPropertyDeclaration(OWLDataPropertyExpression dp)</li> + <li>protected void writeDataPropertyDomainAxiom(OWLDataPropertyExpression p, OWLClassExpression c)</li> + <li>protected void writeDataPropertyRangeAxiom(OWLDataPropertyExpression p, OWLDataRange c)</li> + <li>protected void writeDifferentIndividualsAxiom(Set<OWLIndividual> set)</li> + <li>protected void writeDisjointClassesAxiom(Set<OWLClassExpression> set)</li> + <li>protected void writeDisjointDataPropertiesAxiom(Set<OWLDataPropertyExpression> set)</li> + <li>protected void writeDisjointObjectPropertiesAxiom(Set<OWLObjectPropertyExpression> set)</li> + <li>protected void writeDisjointUnionAxiom(Set<OWLClassExpression> set)</li> + <li>protected void writeEquivalentClassesAxiom(Set<OWLClassExpression> set)</li> + <li>protected void writeEquivalentDataPropertiesAxiom(Set<OWLDataPropertyExpression> set)</li> + <li>protected void writeEquivalentObjectPropertiesAxiom(Set<OWLObjectPropertyExpression> set)</li> + <li>protected void writeFunctionalDataPropertyAxiom(OWLDataPropertyExpression p)</li> + <li>protected void writeFunctionalObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeFuzzyLogic(FuzzyLogic logic)</li> + <li>protected void writeFuzzyNominalConceptDefinition(String name, FuzzyNominalConcept c)</li> + <li>protected void writeInverseFunctionalObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeInverseObjectPropertiesAxiom(OWLObjectPropertyExpression p1, OWLObjectPropertyExpression p2)</li> + <li>protected void writeIrreflexiveObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeLeftShoulderFunctionDefinition(String name, LeftShoulderFunction dat)</li> + <li>protected void writeLinearFunctionDefinition(String name, LinearFunction dat)</li> + <li>protected void writeLinearModifierDefinition(String name, LinearModifier mod)</li> + <li>protected void writeModifiedConceptDefinition(String name, ModifiedConcept c)</li> + <li>protected void writeModifiedFunctionDefinition(String name, ModifiedFunction dat)</li> + <li>protected void writeModifiedPropertyDefinition(String name, ModifiedProperty c)</li> + <li>protected void writeNegativeDataPropertyAssertionAxiom(OWLIndividual i1, OWLLiteral i2, OWLDataPropertyExpression p, double d)</li> + <li>protected void writeNegativeObjectPropertyAssertionAxiom(OWLIndividual i1, OWLIndividual i2, OWLObjectPropertyExpression p, double d)</li> + <li>protected void writeObjectPropertyAssertionAxiom(OWLIndividual i1, OWLIndividual i2, OWLObjectPropertyExpression p, double d)</li> + <li>protected void writeObjectPropertyDeclaration(OWLObjectPropertyExpression op)</li> + <li>protected void writeObjectPropertyDomainAxiom(OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected void writeObjectPropertyRangeAxiom(OWLObjectPropertyExpression p, OWLClassExpression c)</li> + <li>protected void writeOwaConceptDefinition(String name, OwaConcept c)</li> + <li>protected void writeQowaConceptDefinition(String name, QowaConcept c)</li> + <li>protected void writeQuasiSugenoConceptDefinition(String name, QuasiSugenoConcept c)</li> + <li>protected void writeReflexiveObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeRightShoulderFunctionDefinition(String name, RightShoulderFunction dat)</li> + <li>protected void writeSameIndividualAxiom(Set<OWLIndividual> set)</li> + <li>protected void writeSubclassOfAxiom(OWLClassExpression subclass, OWLClassExpression superclass, double d)</li> + <li>protected void writeSubDataPropertyOfAxiom(OWLDataPropertyExpression subProperty, OWLDataPropertyExpression superProperty, double d)</li> + <li>protected void writeSubObjectPropertyOfAxiom(OWLObjectPropertyExpression subProperty, OWLObjectPropertyExpression superProperty, double d)</li> + <li>protected void writeSubPropertyChainOfAxiom(List<OWLObjectPropertyExpression> chain, OWLObjectPropertyExpression superProperty, double d)</li> + <li>protected void writeSugenoConceptDefinition(String name, SugenoConcept c)</li> + <li>protected void writeSymmetricObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeTransitiveObjectPropertyAxiom(OWLObjectPropertyExpression p)</li> + <li>protected void writeTrapezoidalFunctionDefinition(String name, TrapezoidalFunction dat)</li> + <li>protected void writeTriangularFunctionDefinition(String name, TriangularFunction dat)</li> + <li>protected void writeTriangularModifierDefinition(String name, TriangularModifier mod)</li> + <li>protected void writeWeightedConceptDefinition(String name, WeightedConcept c)</li> + <li>protected void writeWeightedMaxConceptDefinition(String name, WeightedMaxConcept c)</li> + <li>protected void writeWeightedMinConceptDefinition(String name, WeightedMinConcept c)</li> + <li>protected void writeWeightedSumConceptDefinition(String name, WeightedSumConcept c)</li> + * </ul> + * + * @author Fernando Bobillo + */ +public class FuzzyOwl2 +{ + + protected OWLDataFactory dataFactory; + protected Hashtable<String, FuzzyConcept> definedConcepts; + protected Hashtable<String, FuzzyProperty> definedProperties; + protected Hashtable<String, FuzzyDatatype> fuzzyDatatypes; + protected Hashtable<String, FuzzyModifier> fuzzyModifiers; + protected OWLAnnotationProperty label; + protected OWLOntologyManager manager; + protected String ontologyPath; + protected OWLOntology ontology; + protected Set<OWLOntology> ontologies; + protected SimpleShortFormProvider pm; + + protected final double NEG_INFINITY = -10000; + protected final double POS_INFINITY = 10000; + + /** + * Output (file, standard output...) + */ + protected static PrintStream out = System.out; + + + /** + * Constructor. + * @param input Path of the input ontology. + * @param output Path of the output file; null for the standard output. + */ + public FuzzyOwl2(String input, String output) + { + definedConcepts = new Hashtable<String, FuzzyConcept> (); + definedProperties = new Hashtable<String, FuzzyProperty> (); + fuzzyDatatypes = new Hashtable<String, FuzzyDatatype> (); + fuzzyModifiers = new Hashtable<String, FuzzyModifier> (); + manager = OWLManager.createOWLOntologyManager(); + ontologyPath = input; + + loadOntology(ontologyPath); + ontologies = new HashSet<OWLOntology>(); + ontologies.add(ontology); + + // Imported ontologies + Set<OWLOntology> imports = manager.getImportsClosure(ontology); + if (imports != null) + ontologies.addAll(imports); + + // If an output file is specified, try to open it. + // If not, or if there are problems opening it, we use the standard output. + if (output != null) + { + try { + out = new PrintStream(new FileOutputStream(output)); + } + catch (Exception ex) + { + printError("Could not load ontology: " + ex.getMessage()); + } + } + + dataFactory = manager.getOWLDataFactory(); + if (ontology.getOntologyID().getOntologyIRI() == null) + ontologyPath = ""; + else + ontologyPath = ontology.getOntologyID().getOntologyIRI().toString(); + pm = new SimpleShortFormProvider(); + + label = dataFactory.getOWLAnnotationProperty(IRI.create(ontologyPath + "#" + "fuzzyLabel")); + } + + public void setPrintStream(PrintStream ps){ + out = ps; + } + + protected void loadOntology(String ontologyPath) + { + try + { + // Try ontologyPath as the path of a local file + File f = new File(ontologyPath); + IRI iri = IRI.create(f); + ontology = manager.loadOntologyFromOntologyDocument(iri); + } + catch (Exception e) + { + // Try ontologyPath as an IRI + IRI iri = IRI.create(ontologyPath); + try { + ontology = manager.loadOntologyFromOntologyDocument(iri); + } + catch (OWLOntologyCreationException ex) + { + printError("Could not load ontology: " + ex.getMessage()); + } + } + } + + + /** + * Prints an error message in the standard output and finishes the execution. + * @param s An error message. + */ + protected static void exit(String s) + { + System.out.println(s); + System.exit(0); + } + + + /** + * Prints a string in the desired PrintStream, unless it contains a null value. + */ + protected static void print(String s) + { + try + { + if (s.contains(" null") == false) + out.println(s); + } + catch (NullPointerException ex) + { + + } + + } + + /** + * Prints an error string in the standard error. + * The parameter could be used in the future to write in the desired PrintStream. + */ + protected static void printError(String s) + { + System.err.println(s); + } + + + /** + * @param args Two arguments: the input OWL 2 ontology, and the output fuzzy ontology in fuzzyDL syntax. + */ + public static void main(String[] args) + { + String[] returnValue = processParameters(args); + FuzzyOwl2 f = new FuzzyOwl2(returnValue[0], returnValue[1]); + f.translateOwl2Ontology(); + } + + + /** + * Translates an OWL 2 ontology into a fuzzy one, processing the OWL 2 annotations. + */ + public void translateOwl2Ontology() + { + processOntologyAnnotations(); + processDatatypeAnnotations(); + processConceptAnnotations(); + processPropertyAnnotations(); + processOntologyAxioms(); + } + + + /** + * Write annotations on the ontology. + */ + protected void processOntologyAnnotations() + { + for(OWLOntology o : ontologies) + { + Set<OWLAnnotation> annotations = o.getAnnotations(); + + for (OWLAnnotation ax : annotations) + { + if (ax.getProperty().compareTo(label) != 0) + continue; + + OWLAnnotationValue value = ax.getValue(); + FuzzyLogic logic = Parser.getLogic(value.toString()); + writeFuzzyLogic(logic); + } + } + } + + + // We annotate left, right, triangular, and trapezoidal functions. + private void writeType1Datatypes(Object o, String name) + { + if (o instanceof LeftShoulderFunction) + { + LeftShoulderFunction dat = (LeftShoulderFunction) o; + double k[] = new double[2]; + getK1AndK2(name, k); + setK1AndK2(dat, k); + fuzzyDatatypes.put(name, dat); + writeLeftShoulderFunctionDefinition(name, dat); + } + else if (o instanceof RightShoulderFunction) + { + RightShoulderFunction dat = (RightShoulderFunction) o; + double k[] = new double[2]; + getK1AndK2(name, k); + setK1AndK2(dat, k); + fuzzyDatatypes.put(name, dat); + writeRightShoulderFunctionDefinition(name, dat); + } + else if (o instanceof TriangularFunction) + { + TriangularFunction dat = (TriangularFunction) o; + double k[] = new double[2]; + getK1AndK2(name, k); + setK1AndK2(dat, k); + fuzzyDatatypes.put(name, dat); + writeTriangularFunctionDefinition(name, dat); + } + else if (o instanceof TrapezoidalFunction) + { + TrapezoidalFunction dat = (TrapezoidalFunction) o; + double k[] = new double[2]; + getK1AndK2(name, k); + setK1AndK2(dat, k); + fuzzyDatatypes.put(name, dat); + writeTrapezoidalFunctionDefinition(name, dat); + } + else if (o instanceof LinearFunction) + { + LinearFunction dat = (LinearFunction) o; + double k[] = new double[2]; + getK1AndK2(name, k); + setK1AndK2(dat, k); + fuzzyDatatypes.put(name, dat); + writeLinearFunctionDefinition(name, dat); + } + } + + + // We annotate linear and triangular modifiers. + private void writeType2Datatypes(Object o, String name) + { + if (o instanceof TriangularModifier) + { + TriangularModifier mod = (TriangularModifier) o; + fuzzyModifiers.put(name, mod); + writeTriangularModifierDefinition(name, mod); + } + else if (o instanceof LinearModifier) + { + LinearModifier mod = (LinearModifier) o; + fuzzyModifiers.put(name, mod); + writeLinearModifierDefinition(name, mod); + } + } + + + // We annotate modified functions. + private void writeType3Datatypes(Object o, String name) + { + if (o instanceof ModifiedFunction) + { + ModifiedFunction dat = (ModifiedFunction) o; + fuzzyDatatypes.put(name, dat); + writeModifiedFunctionDefinition(name, dat); + } + } + + + /** + * Write fuzzy datatypes and modifiers definitions, defined with OWL 2 concept annotations. + */ + protected void processDatatypeAnnotations() + { + /* + * Step 1. We annotate left, right, triangular, trapezoidal, and linear functions. + * Step 2. We annotate linear and triangular modifiers. + * Step 3. We annotate modified functions. + */ + for(OWLOntology o : ontologies) + { + for (OWLDeclarationAxiom ax : o.getAxioms(AxiomType.DECLARATION)) + { + OWLEntity ent = ax.getEntity(); + if (ent.isOWLDatatype()) + { + OWLDatatype dt = ent.asOWLDatatype(); + Set<OWLAnnotation> annotations = dt.getAnnotations(o, label); + if (annotations != null) + { + if (annotations.size() > 1) + exit("Error: There are more than" + annotations.size() + " annotations for datatype " + dt + "."); + else if (annotations.size() == 1) + { + Iterator<OWLAnnotation> it = annotations.iterator(); + OWLAnnotation next = it.next(); + Object ob = Parser.getDatatype(next.getValue().toString()); + if (ob != null) + writeType1Datatypes(ob, getShortName(dt)); + } + } + } + } + + for (OWLDeclarationAxiom ax : o.getAxioms(AxiomType.DECLARATION)) + { + OWLEntity ent = ax.getEntity(); + if (ent.isOWLDatatype()) + { + OWLDatatype dt = ent.asOWLDatatype(); + Set<OWLAnnotation> annotations = dt.getAnnotations(o, label); + if (annotations != null) + { + if (annotations.size() == 1) + { + Iterator<OWLAnnotation> it = annotations.iterator(); + OWLAnnotation next = it.next(); + Object ob = Parser.getDatatype(next.getValue().toString()); + if (ob != null) + writeType2Datatypes(ob, getShortName(dt)); + } + } + } + } + + for (OWLDeclarationAxiom ax : o.getAxioms(AxiomType.DECLARATION)) + { + OWLEntity ent = ax.getEntity(); + if (ent.isOWLDatatype()) + { + OWLDatatype dt = ent.asOWLDatatype(); + Set<OWLAnnotation> annotations = dt.getAnnotations(o, label); + if (annotations != null) + { + if (annotations.size() == 1) + { + Iterator<OWLAnnotation> it = annotations.iterator(); + OWLAnnotation next = it.next(); + Object ob = Parser.getDatatype(next.getValue().toString()); + if (ob != null) + writeType3Datatypes(ob, getShortName(dt)); + } + } + } + } + } + } + + + /** + * Write fuzzy concept definitions, defined with OWL 2 concept annotations. + */ + protected void processConceptAnnotations() + { + for(OWLOntology o : ontologies) + { + for (OWLDeclarationAxiom ax : o.getAxioms(AxiomType.DECLARATION)) + { + OWLEntity ent = ax.getEntity(); + if (ent.isOWLClass()) + { + OWLClass cls = ent.asOWLClass(); + Set<OWLAnnotation> annotations = cls.getAnnotations(o, label); + + if (annotations.size() > 1) + exit("Error: There are " + annotations.size() + " class annotations for " + cls + "."); + else if (annotations.size() == 1) + { + String name = getShortName(cls); + + ConceptDefinition c = Parser.getDefinedConcept(annotations.iterator().next().getValue().toString()); + if (c != null) + { + switch (c.getType()) + { + case MODIFIED_CONCEPT: + String modName = c.getFuzzyModifier(); + if (fuzzyModifiers.containsKey(modName)) + { + ModifiedConcept md = new ModifiedConcept(modName, c.getFuzzyConcept()); + definedConcepts.put(name, md); + writeModifiedConceptDefinition(name, md); + } + else + exit("Error: Fuzzy modifier " + modName + " not defined."); + break; + + case FUZZY_NOMINAL: + FuzzyNominalConcept nc = new FuzzyNominalConcept(c.getNumber(), c.getIndividual()); + definedConcepts.put(name, nc); + writeFuzzyNominalConceptDefinition(name, nc); + break; + + case WEIGHTED_CONCEPT: + WeightedConcept wc = new WeightedConcept(c.getNumber(), c.getFuzzyConcept()); + definedConcepts.put(name, wc); + writeWeightedConceptDefinition(name, wc); + break; + + case WEIGHTED_MAX: + List<ConceptDefinition> sourceList = c.getWeightedConcepts(); + ArrayList<WeightedConcept> list = new ArrayList<WeightedConcept>(); + for(ConceptDefinition def : sourceList) + list.add(new WeightedConcept(def.getNumber(), def.getFuzzyConcept() ) ); + WeightedMaxConcept wmax = new WeightedMaxConcept(list); + definedConcepts.put(name, wmax); + writeWeightedMaxConceptDefinition(name, wmax); + break; + + case WEIGHTED_MIN: + sourceList = c.getWeightedConcepts(); + list = new ArrayList<WeightedConcept>(); + for(ConceptDefinition def : sourceList) + list.add(new WeightedConcept(def.getNumber(), def.getFuzzyConcept() ) ); + WeightedMinConcept wmin = new WeightedMinConcept(list); + definedConcepts.put(name, wmin); + writeWeightedMinConceptDefinition(name, wmin); + break; + + case WEIGHTED_SUM: + sourceList = c.getWeightedConcepts(); + list = new ArrayList<WeightedConcept>(); + for(ConceptDefinition def : sourceList) + list.add(new WeightedConcept(def.getNumber(), def.getFuzzyConcept() ) ); + WeightedSumConcept wsum = new WeightedSumConcept(list); + definedConcepts.put(name, wsum); + writeWeightedSumConceptDefinition(name, wsum); + break; + + case OWA: + List<Double> weights = c.getWeights(); + List<String> concepts = c.getConcepts(); + if (weights.size() != concepts.size()) + exit("Error: OWA concept " + name + " has different number of weights and concepts."); + else + { + OwaConcept owa = new OwaConcept(weights, concepts); + definedConcepts.put(name, owa); + writeOwaConceptDefinition(name, owa); + } + break; + + case CHOQUET: + weights = c.getWeights(); + concepts = c.getConcepts(); + if (weights.size() != concepts.size()) + exit("Error: Choquet concept " + name + " has different number of weights and concepts."); + else + { + ChoquetConcept owa = new ChoquetConcept(weights, concepts); + definedConcepts.put(name, owa); + writeChoquetConceptDefinition(name, owa); + } + break; + + case SUGENO: + weights = c.getWeights(); + concepts = c.getConcepts(); + if (weights.size() != concepts.size()) + exit("Error: Sugeno concept " + name + " has different number of weights and concepts."); + else + { + SugenoConcept owa = new SugenoConcept(weights, concepts); + definedConcepts.put(name, owa); + writeSugenoConceptDefinition(name, owa); + } + break; + + case QUASI_SUGENO: + weights = c.getWeights(); + concepts = c.getConcepts(); + if (weights.size() != concepts.size()) + exit("Error: QuasiSugeno concept " + name + " has different number of weights and concepts."); + else + { + QuasiSugenoConcept owa = new QuasiSugenoConcept(weights, concepts); + definedConcepts.put(name, owa); + writeQuasiSugenoConceptDefinition(name, owa); + } + break; + + case QUANTIFIER_OWA: + String q = c.getQuantifier(); + if (!fuzzyDatatypes.containsKey(q)) + exit("Error: Quantifier " + q + " not defined."); + else // if (fuzzyDatatypes.containsKey(q)) + { + FuzzyDatatype def = fuzzyDatatypes.get(q); + if (!(def instanceof RightShoulderFunction) && !(def instanceof LinearFunction)) + exit("Error: Quantifier " + q + " must be a right-shoulder or a linear function."); + else { + concepts = c.getConcepts(); + QowaConcept qowa = new QowaConcept(q, concepts); + definedConcepts.put(name, qowa); + writeQowaConceptDefinition(name, qowa); + } + } + break; + } + } + } + } + } + } + } + + + /** + * Write fuzzy property definitions, defined with OWL 2 concept annotations. + */ + protected void processPropertyAnnotations() + { + for(OWLOntology o : ontologies) + { + for (OWLDeclarationAxiom ax : o.getAxioms(AxiomType.DECLARATION)) + { + OWLEntity ent = ax.getEntity(); + + if (ent.isOWLObjectProperty() || ent.isOWLDataProperty()) + { + OWLProperty prop; + if (ent.isOWLObjectProperty() ) + prop = ent.asOWLObjectProperty(); + else // if (ent.isOWLDataProperty() ) + prop = ent.asOWLDataProperty(); + + Set<OWLAnnotation> annotations = prop.getAnnotations(o, label); + + if (annotations.size() > 1) + exit("Error: There are " + annotations.size() + " property annotations for " + prop + "."); + else if (annotations.size() == 1) + { + PropertyDefinition pro = Parser.getDefinedProperty(annotations.iterator().next().getValue().toString()); + if (pro != null) + { + if (pro.getType() == PropertyDefinition.PropertyType.MODIFIED_PROPERTY) + { + String name = getShortName(prop); + String modName = pro.getFuzzyModifier(); + if (fuzzyModifiers.containsKey(modName)) + { + ModifiedProperty mp = new ModifiedProperty(modName, pro.getProperty()); + definedProperties.put(name, mp); + writeModifiedPropertyDefinition(name, mp); + } + else + exit("Error: Fuzzy modifier " + modName + " not defined."); + } + } + } + } + } + } + } + + + /** + * Write the axioms of the OWL 2 ontology. They can have annotations or not. + */ + protected void processOntologyAxioms() + { + + for(OWLOntology o : ontologies) + { + + // ****** + // TBOx + // ****** + for (OWLDisjointClassesAxiom ax : o.getAxioms(AxiomType.DISJOINT_CLASSES)) + { + Set<OWLClassExpression> c = ax.getClassExpressions(); + writeDisjointClassesAxiom(c); + } + + for (OWLDisjointUnionAxiom ax : o.getAxioms(AxiomType.DISJOINT_UNION)) + { + Set<OWLClassExpression> c = ax.getClassExpressions(); + writeDisjointUnionAxiom(c); + } + + for (OWLSubClassOfAxiom ax : o.getAxioms(AxiomType.SUBCLASS_OF)) + { + OWLClassExpression subclass = ax.getSubClass(); + OWLClassExpression superclass = ax.getSuperClass(); + double d = getDegree(ax); + writeSubclassOfAxiom(subclass, superclass, d); + } + + for (OWLEquivalentClassesAxiom ax : o.getAxioms(AxiomType.EQUIVALENT_CLASSES)) + { + Set<OWLClassExpression> c = ax.getClassExpressions(); + writeEquivalentClassesAxiom(c); + } + + for (OWLClass c : o.getClassesInSignature()) + { + if (c.isTopEntity() == false) + writeConceptDeclaration(c); + } + + + // ****** + // RBOx + // ****** + + for (OWLSubObjectPropertyOfAxiom ax : o.getAxioms(AxiomType.SUB_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression subProperty = ax.getSubProperty(); + OWLObjectPropertyExpression superProperty = ax.getSuperProperty(); + double d = getDegree(ax); + writeSubObjectPropertyOfAxiom(subProperty, superProperty, d); + } + + for (OWLSubDataPropertyOfAxiom ax : o.getAxioms(AxiomType.SUB_DATA_PROPERTY)) + { + OWLDataPropertyExpression subProperty = ax.getSubProperty(); + OWLDataPropertyExpression superProperty = ax.getSuperProperty(); + double d = getDegree(ax); + writeSubDataPropertyOfAxiom(subProperty, superProperty, d); + } + + for (OWLSubPropertyChainOfAxiom ax : o.getAxioms(AxiomType.SUB_PROPERTY_CHAIN_OF)) + { + List<OWLObjectPropertyExpression> chain = ax.getPropertyChain(); + OWLObjectPropertyExpression superProperty = ax.getSuperProperty(); + double d = getDegree(ax); + writeSubPropertyChainOfAxiom(chain, superProperty, d); + } + + for (OWLEquivalentObjectPropertiesAxiom ax : o.getAxioms(AxiomType.EQUIVALENT_OBJECT_PROPERTIES)) + { + Set<OWLObjectPropertyExpression> set = ax.getProperties(); + writeEquivalentObjectPropertiesAxiom(set); + } + + for (OWLEquivalentDataPropertiesAxiom ax : o.getAxioms(AxiomType.EQUIVALENT_DATA_PROPERTIES)) + { + Set<OWLDataPropertyExpression> set = ax.getProperties(); + writeEquivalentDataPropertiesAxiom(set); + } + + for (OWLTransitiveObjectPropertyAxiom ax : o.getAxioms(AxiomType.TRANSITIVE_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeTransitiveObjectPropertyAxiom(p); + } + + for (OWLSymmetricObjectPropertyAxiom ax : o.getAxioms(AxiomType.SYMMETRIC_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeSymmetricObjectPropertyAxiom(p); + } + + for (OWLAsymmetricObjectPropertyAxiom ax : o.getAxioms(AxiomType.ASYMMETRIC_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeAsymmetricObjectPropertyAxiom(p); + } + + for (OWLReflexiveObjectPropertyAxiom ax : o.getAxioms(AxiomType.REFLEXIVE_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeReflexiveObjectPropertyAxiom(p); + } + + for (OWLIrreflexiveObjectPropertyAxiom ax : o.getAxioms(AxiomType.IRREFLEXIVE_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeIrreflexiveObjectPropertyAxiom(p); + } + + for (OWLFunctionalObjectPropertyAxiom ax : o.getAxioms(AxiomType.FUNCTIONAL_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeFunctionalObjectPropertyAxiom(p); + } + + for (OWLFunctionalDataPropertyAxiom ax : o.getAxioms(AxiomType.FUNCTIONAL_DATA_PROPERTY)) + { + OWLDataPropertyExpression p = ax.getProperty(); + writeFunctionalDataPropertyAxiom(p); + } + + for (OWLInverseObjectPropertiesAxiom ax : o.getAxioms(AxiomType.INVERSE_OBJECT_PROPERTIES)) + { + OWLObjectPropertyExpression p1 = ax.getFirstProperty(); + OWLObjectPropertyExpression p2 = ax.getSecondProperty(); + writeInverseObjectPropertiesAxiom(p1, p2); + } + + for (OWLInverseFunctionalObjectPropertyAxiom ax : o.getAxioms(AxiomType.INVERSE_FUNCTIONAL_OBJECT_PROPERTY)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + writeInverseFunctionalObjectPropertyAxiom(p); + } + + for (OWLObjectPropertyDomainAxiom ax : o.getAxioms(AxiomType.OBJECT_PROPERTY_DOMAIN)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + OWLClassExpression c = ax.getDomain(); + writeObjectPropertyDomainAxiom(p, c); + } + + for (OWLObjectPropertyRangeAxiom ax : o.getAxioms(AxiomType.OBJECT_PROPERTY_RANGE)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + OWLClassExpression c = ax.getRange(); + writeObjectPropertyRangeAxiom(p, c); + } + + for (OWLDataPropertyDomainAxiom ax : o.getAxioms(AxiomType.DATA_PROPERTY_DOMAIN)) + { + OWLDataPropertyExpression p = ax.getProperty(); + OWLClassExpression c = ax.getDomain(); + writeDataPropertyDomainAxiom(p, c); + } + + for (OWLDataPropertyRangeAxiom ax : o.getAxioms(AxiomType.DATA_PROPERTY_RANGE)) + { + OWLDataPropertyExpression p = ax.getProperty(); + OWLDataRange range = ax.getRange(); + writeDataPropertyRangeAxiom(p, range); + } + + for (OWLDisjointObjectPropertiesAxiom ax : o.getAxioms(AxiomType.DISJOINT_OBJECT_PROPERTIES)) + { + Set<OWLObjectPropertyExpression> properties = ax.getProperties(); + writeDisjointObjectPropertiesAxiom(properties); + } + + for (OWLDisjointDataPropertiesAxiom ax : o.getAxioms(AxiomType.DISJOINT_DATA_PROPERTIES)) + { + Set<OWLDataPropertyExpression> properties = ax.getProperties(); + writeDisjointDataPropertiesAxiom(properties); + } + +/* + for (OWLDataPropertyExpression dp : o.getDataPropertiesInSignature()) + { + writeDataPropertyDeclaration(dp); + } + + + for (OWLObjectPropertyExpression op : o.getObjectPropertiesInSignature()) + { + writeObjectPropertyDeclaration(op); + } +*/ + + // ****** + // ABOx + // ****** + + for (OWLClassAssertionAxiom ax : o.getAxioms(AxiomType.CLASS_ASSERTION)) + { + OWLClassExpression c = ax.getClassExpression(); + OWLIndividual i = ax.getIndividual(); + double d = getDegree(ax); + writeConceptAssertionAxiom(i, c, d); + } + + for (OWLObjectPropertyAssertionAxiom ax : o.getAxioms(AxiomType.OBJECT_PROPERTY_ASSERTION)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + OWLIndividual i1 = ax.getSubject(); + OWLIndividual i2 = ax.getObject(); + double d = getDegree(ax); + writeObjectPropertyAssertionAxiom(i1, i2, p, d); + } + + for (OWLDataPropertyAssertionAxiom ax : o.getAxioms(AxiomType.DATA_PROPERTY_ASSERTION)) + { + OWLDataPropertyExpression p = ax.getProperty(); + OWLIndividual i1 = ax.getSubject(); + OWLLiteral i2 = ax.getObject(); + double d = getDegree(ax); + writeDataPropertyAssertionAxiom(i1, i2, p, d); + } + + for (OWLNegativeObjectPropertyAssertionAxiom ax : o.getAxioms(AxiomType.NEGATIVE_OBJECT_PROPERTY_ASSERTION)) + { + OWLObjectPropertyExpression p = ax.getProperty(); + OWLIndividual i1 = ax.getSubject(); + OWLIndividual i2 = ax.getObject(); + double d = getDegree(ax); + writeNegativeObjectPropertyAssertionAxiom(i1, i2, p, d); + } + + for (OWLNegativeDataPropertyAssertionAxiom ax : o.getAxioms(AxiomType.NEGATIVE_DATA_PROPERTY_ASSERTION)) + { + OWLDataPropertyExpression p = ax.getProperty(); + OWLIndividual i1 = ax.getSubject(); + OWLLiteral i2 = ax.getObject(); + double d = getDegree(ax); + writeNegativeDataPropertyAssertionAxiom(i1, i2, p, d); + } + + for (OWLSameIndividualAxiom ax: o.getAxioms(AxiomType.SAME_INDIVIDUAL)) + { + Set<OWLIndividual> set = ax.getIndividuals(); + writeSameIndividualAxiom(set); + } + + for (OWLDifferentIndividualsAxiom ax: o.getAxioms(AxiomType.DIFFERENT_INDIVIDUALS)) + { + Set<OWLIndividual> set = ax.getIndividuals(); + writeDifferentIndividualsAxiom(set); + } + } + } + + + /** + * Gets a String representation of an OWL 2 class. + * + * @param c An OWL 2 class. + * @return A String representation of c. + */ + public String getClassName(OWLClassExpression c) + { + + switch (c.getClassExpressionType()) + { + case OWL_CLASS: + + OWLClass d = (OWLClass) c; + if (d.isOWLThing()) + return getTopConceptName(); + else if (d.isOWLNothing()) + return getBottomConceptName(); + else + // Atomic concept + return getAtomicConceptName(d); + + case OBJECT_INTERSECTION_OF: + + Set<OWLClassExpression> operands = ((OWLObjectIntersectionOf) c).getOperands(); + return getObjectIntersectionOfName(operands); + + case OBJECT_UNION_OF: + + operands = ((OWLObjectUnionOf) c).getOperands(); + return getObjectUnionOfName(operands); + + case OBJECT_SOME_VALUES_FROM: + + OWLObjectPropertyExpression p = ((OWLObjectSomeValuesFrom) c).getProperty(); + OWLClassExpression e = ((OWLObjectSomeValuesFrom) c).getFiller(); + return getObjectSomeValuesFromName(p, e); + + case OBJECT_ALL_VALUES_FROM: + + p = ((OWLObjectAllValuesFrom) c).getProperty(); + e = ((OWLObjectAllValuesFrom) c).getFiller(); + return getObjectAllValuesFromName(p, e); + + case DATA_SOME_VALUES_FROM: + + OWLDataPropertyExpression dp = ((OWLDataSomeValuesFrom) c).getProperty(); + OWLDataRange range = ((OWLDataSomeValuesFrom) c).getFiller(); + return getDataSomeValuesFromName(dp, range); + + case DATA_ALL_VALUES_FROM: + + dp = ((OWLDataAllValuesFrom) c).getProperty(); + range = ((OWLDataAllValuesFrom) c).getFiller(); + return getDataAllValuesFromName(dp, range); + + case OBJECT_COMPLEMENT_OF: + + e = ((OWLObjectComplementOf) c).getOperand(); + return getObjectComplementOfName(e); + + case OBJECT_HAS_SELF: + + p = ((OWLObjectHasSelf) c).getProperty(); + return getObjectHasSelfName(p); + + case OBJECT_ONE_OF: + + Set<OWLIndividual> set = ((OWLObjectOneOf) c).getIndividuals(); + return getObjectOneOfName(set); + + case OBJECT_HAS_VALUE: + + OWLObjectHasValue hasValue = (OWLObjectHasValue) c; + OWLIndividual i = hasValue.getValue(); + p = hasValue.getProperty(); + return getObjectHasValueName(p, i); + + case DATA_HAS_VALUE: + + OWLDataHasValue dataHasValue = (OWLDataHasValue) c; + OWLLiteral lit = dataHasValue.getValue(); + dp = dataHasValue.getProperty(); + return getDataHasValueName(dp, lit); + + case OBJECT_MAX_CARDINALITY: + + OWLObjectCardinalityRestriction q = (OWLObjectMaxCardinality) c; + p = q.getProperty(); + int card = q.getCardinality(); + if (q.isQualified()) + return getObjectMaxCardinalityRestrictionName(card, p, q.getFiller()); + else + return getObjectMaxCardinalityRestrictionName(card, p); + + case OBJECT_MIN_CARDINALITY: + + q = (OWLObjectMinCardinality) c; + p = q.getProperty(); + card = q.getCardinality(); + if (q.isQualified()) + return getObjectMinCardinalityRestrictionName(card, p, q.getFiller()); + else + return getObjectMinCardinalityRestrictionName(card, p); + + case OBJECT_EXACT_CARDINALITY: + + q = (OWLObjectExactCardinality) c; + p = q.getProperty(); + card = q.getCardinality(); + if (q.isQualified()) + return getObjectExactCardinalityRestrictionName(card, p, q.getFiller()); + else + return getObjectExactCardinalityRestrictionName(card, p); + + case DATA_MAX_CARDINALITY: + + OWLDataCardinalityRestriction dq = (OWLDataMaxCardinality) c; + dp = dq.getProperty(); + card = dq.getCardinality(); + if (dq.isQualified()) + return getDataMaxCardinalityRestrictionName(card, dp, dq.getFiller()); + else + return getDataMaxCardinalityRestrictionName(card, dp); + + case DATA_MIN_CARDINALITY: + + dq = (OWLDataMinCardinality) c; + dp = dq.getProperty(); + card = dq.getCardinality(); + if (dq.isQualified()) + return getDataMinCardinalityRestrictionName(card, dp, dq.getFiller()); + else + return getDataMinCardinalityRestrictionName(card, dp); + + case DATA_EXACT_CARDINALITY: + + dq = (OWLDataExactCardinality) c; + dp = dq.getProperty(); + card = dq.getCardinality(); + if (dq.isQualified()) + return getDataExactCardinalityRestrictionName(card, dp, dq.getFiller()); + else + return getDataExactCardinalityRestrictionName(card, dp); + + default: + print("Print class of type " + c.getClassExpressionType()); + return ""; + } + } + + + /** + * Gets a String representation of an OWL 2 object property. + * + * @param p An OWL 2 object property. + * @return A String representation of p. + */ + protected String getObjectPropertyName(OWLObjectPropertyExpression p) + { + if (p.isOWLTopObjectProperty()) + return getTopObjectPropertyName(); + else if (p.isOWLBottomObjectProperty()) + return getBottomObjectPropertyName(); + else + return getAtomicObjectPropertyName(p.asOWLObjectProperty()); + } + + + /** + * Gets a String representation of an OWL 2 data property. + * + * @param p An OWL 2 data property. + * @return A String representation of p. + */ + protected String getDataPropertyName(OWLDataPropertyExpression p) + { + if (p.isOWLTopDataProperty()) + return getTopDataPropertyName(); + else if (p.isOWLBottomDataProperty()) + return getBottomDataPropertyName(); + else + return getAtomicDataPropertyName(p.asOWLDataProperty()); + } + + + /** + * Returns the degree in the annotation of an axiom. + * @param axiom An OWLAxiom. + * @return The degree in the annotation of an axiom; 1 if it does not exist. + */ + protected double getDegree(OWLAxiom axiom) + { + Set<OWLAnnotation> annotations = axiom.getAnnotations(label); + + if (annotations.size() != 1) + { + if (annotations.size() > 1) + print("Error: There are " + annotations.size() + " annotations for axiom " + axiom + "."); + return 1; + } + else + return Parser.getDegree(annotations.iterator().next().getValue().toString()); + } + + + private void setK1AndK2(FuzzyDatatype dat, double[] k) + { + dat.setMinValue(k[0]); + dat.setMaxValue(k[1]); + } + + + private void getK1AndK2(String name, double[] k) + { + k[0] = NEG_INFINITY; + k[1] = POS_INFINITY; + + for (OWLOntology o : ontologies) + { + Set<OWLDatatypeDefinitionAxiom> set = o.getAxioms(AxiomType.DATATYPE_DEFINITION); + if (set != null) + { + Iterator<OWLDatatypeDefinitionAxiom> it2 = set.iterator(); + + String datatypeName = ""; + OWLDatatypeDefinitionAxiom def; + do + { + def = it2.next(); + datatypeName = pm.getShortForm(def.getDatatype()).replace(":", ""); + } while (it2.hasNext() && (datatypeName.compareTo(name) != 0)); + + if (datatypeName.compareTo(name) == 0) + { + if (def.getDataRange().getDataRangeType() == DataRangeType.DATA_INTERSECTION_OF) + { + OWLDataIntersectionOf inter = (OWLDataIntersectionOf) def.getDataRange(); + Set<OWLDataRange> operands = inter.getOperands(); + if ((operands != null) && (operands.size() == 2)) + { + Iterator<OWLDataRange> it3 = operands.iterator(); + OWLDataRange r1 = it3.next(); + OWLDataRange r2 = it3.next(); + if ( (r1.getDataRangeType() == DataRangeType.DATATYPE_RESTRICTION) && (r2.getDataRangeType() == DataRangeType.DATATYPE_RESTRICTION) ) + { + OWLDatatypeRestriction rest1 = (OWLDatatypeRestriction) r1; + OWLDatatypeRestriction rest2 = (OWLDatatypeRestriction) r2; + Set<OWLFacetRestriction> set1 = rest1.getFacetRestrictions(); + Set<OWLFacetRestriction> set2 = rest2.getFacetRestrictions(); + if ( (set1 != null) && (set2 != null) && (set1.size() == 1) && (set2.size() == 1) ) + { + OWLFacetRestriction f1 = rest1.getFacetRestrictions().iterator().next(); + OWLFacetRestriction f2 = rest2.getFacetRestrictions().iterator().next(); + if (f1.getFacet() == OWLFacet.MIN_INCLUSIVE) + k[0] = Double.parseDouble(f1.getFacetValue().getLiteral()); + else if (f1.getFacet() == OWLFacet.MAX_INCLUSIVE) + k[1] = Double.parseDouble(f1.getFacetValue().getLiteral()); + if (f2.getFacet() == OWLFacet.MIN_INCLUSIVE) + k[0] = Double.parseDouble(f2.getFacetValue().getLiteral()); + else if (f2.getFacet() == OWLFacet.MAX_INCLUSIVE) + k[1] = Double.parseDouble(f2.getFacetValue().getLiteral()); + } + } + } + } + } + } + } + } + + + protected static String[] processParameters(String[] args) + { + boolean versionRequested = false; + int numParams = args.length; + String[] returnValue = new String[2]; + + if ((args.length >= 1) && args[0].equals("--version")) + { + System.out.println(FuzzyOwl2.class.getSimpleName() + " version: " + 1.0); + versionRequested = true; + numParams--; + } + + if (numParams < 1) + exit("Error. Use: java " + FuzzyOwl2.class.getSimpleName() + " <Owl2Ontology> ( <outputFileName> ).\n" + + " Example: java " + FuzzyOwl2.class.getSimpleName() + " c:\\\\fuzzyWine.owl test.txt \n" + + " Example: java " + FuzzyOwl2.class.getSimpleName() + " http://www.co-ode.org/ontologies/pizza/pizza.owl c:\\ont\\test.txt \n"); + else + { + if (versionRequested) + { + returnValue[0] = args[1]; + if (numParams == 2) + returnValue[1] = args[2]; + } + else + { + returnValue[0] = args[0]; + returnValue[1] = args[1]; + } + } + return returnValue; + } + + + // ****************************************************** + // Methods that should be overwritten by the subclasses. + // ****************************************************** + + /** + * Gets the short name (without namespaces) of an OWL 2 entity. + * @param e An OWL 2 entity. + * @return Short name of e. + */ + protected String getShortName(OWLEntity e) + { + return pm.getShortForm(e); + } + + + /** + * Gets a String representation of an OWL 2 individual. + * + * @param i An OWL 2 individual. + * @return A String representation of i. + */ + public String getIndividualName(OWLIndividual i) + { + if (i.isAnonymous()) + { + print("Anonymous individual not supported"); + return null; + } + else + { + String name = getShortName(i.asOWLNamedIndividual()); + print("Print individual " + name); + return name; + } + } + + + protected String getTopConceptName() + { + print("Print Top concept"); + return ""; + } + + + protected String getBottomConceptName() + { + print("Print Bottom concept"); + return ""; + } + + + protected String getAtomicConceptName(OWLClass c) + { + String name = getShortName(c); + print("Print Atomic concept" + name); + return ""; + } + + + protected String getObjectIntersectionOfName(Set<OWLClassExpression> operands) + { + print("Print ObjectIntersectionOf" + operands); + return ""; + } + + + protected String getObjectUnionOfName(Set<OWLClassExpression> operands) + { + print("Print ObjectUnionOf" + operands); + return ""; + }... [truncated message content] |