From: <ku...@us...> - 2008-09-25 13:40:49
|
Revision: 1256 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=1256&view=rev Author: kurzum Date: 2008-09-25 13:40:25 +0000 (Thu, 25 Sep 2008) Log Message: ----------- finished blanknode support for sparql extration. it might still be buggy, but basically works. added two new options in SparqlknowledgeSource: "dissolveBlankNodes", "determines whether Blanknodes are dissolved. This is a costly function." default true; "useImprovedSparqlTupelAquisitor", "uses deeply nested SparqlQueries, according to recursion depth, still EXPERIMENTAL" default false; added missing package.html Modified Paths: -------------- trunk/src/dl-learner/org/dllearner/core/configurators/SparqlKnowledgeSourceConfigurator.java trunk/src/dl-learner/org/dllearner/core/configurators/package.html trunk/src/dl-learner/org/dllearner/kb/aquisitors/BlankNodeCollector.java trunk/src/dl-learner/org/dllearner/kb/aquisitors/LinkedDataTupleAquisitor.java trunk/src/dl-learner/org/dllearner/kb/aquisitors/RDFBlankNode.java trunk/src/dl-learner/org/dllearner/kb/aquisitors/SparqlTupleAquisitor.java trunk/src/dl-learner/org/dllearner/kb/aquisitors/TupleAquisitor.java trunk/src/dl-learner/org/dllearner/kb/extraction/BlankNode.java trunk/src/dl-learner/org/dllearner/kb/extraction/ClassNode.java trunk/src/dl-learner/org/dllearner/kb/extraction/ExtractionAlgorithm.java trunk/src/dl-learner/org/dllearner/kb/extraction/InstanceNode.java trunk/src/dl-learner/org/dllearner/kb/extraction/Manager.java trunk/src/dl-learner/org/dllearner/kb/extraction/ObjectPropertyNode.java trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java trunk/src/dl-learner/org/dllearner/scripts/ConfigJavaGenerator.java trunk/src/dl-learner/org/dllearner/scripts/DumbLPFinder.java trunk/src/dl-learner/org/dllearner/utilities/examples/ExampleContainer.java trunk/src/dl-learner/org/dllearner/utilities/owl/OWLVocabulary.java Added Paths: ----------- trunk/src/dl-learner/org/dllearner/scripts/improveWikipedia/package.html Removed Paths: ------------- trunk/src/dl-learner/org/dllearner/scripts/semanticbible/ Modified: trunk/src/dl-learner/org/dllearner/core/configurators/SparqlKnowledgeSourceConfigurator.java =================================================================== --- trunk/src/dl-learner/org/dllearner/core/configurators/SparqlKnowledgeSourceConfigurator.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/core/configurators/SparqlKnowledgeSourceConfigurator.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -225,6 +225,24 @@ return (Boolean) ComponentManager.getInstance().getConfigOptionValue(sparqlKnowledgeSource, "getPropertyInformation") ; } /** +* dissolveBlankNodes determines whether Blanknodes are dissolved. This is a costly function.. +* mandatory: false| reinit necessary: true +* default value: true +* @return boolean +**/ +public boolean getDissolveBlankNodes() { +return (Boolean) ComponentManager.getInstance().getConfigOptionValue(sparqlKnowledgeSource, "dissolveBlankNodes") ; +} +/** +* useImprovedSparqlTupelAquisitor uses deeply nested SparqlQueries, according to recursion depth, still EXPERIMENTAL. +* mandatory: false| reinit necessary: true +* default value: false +* @return boolean +**/ +public boolean getUseImprovedSparqlTupelAquisitor() { +return (Boolean) ComponentManager.getInstance().getConfigOptionValue(sparqlKnowledgeSource, "useImprovedSparqlTupelAquisitor") ; +} +/** * verbosity control verbosity of output for this component. * mandatory: false| reinit necessary: true * default value: warning @@ -417,6 +435,24 @@ reinitNecessary = true; } /** +* @param dissolveBlankNodes determines whether Blanknodes are dissolved. This is a costly function.. +* mandatory: false| reinit necessary: true +* default value: true +**/ +public void setDissolveBlankNodes(boolean dissolveBlankNodes) { +ComponentManager.getInstance().applyConfigEntry(sparqlKnowledgeSource, "dissolveBlankNodes", dissolveBlankNodes); +reinitNecessary = true; +} +/** +* @param useImprovedSparqlTupelAquisitor uses deeply nested SparqlQueries, according to recursion depth, still EXPERIMENTAL. +* mandatory: false| reinit necessary: true +* default value: false +**/ +public void setUseImprovedSparqlTupelAquisitor(boolean useImprovedSparqlTupelAquisitor) { +ComponentManager.getInstance().applyConfigEntry(sparqlKnowledgeSource, "useImprovedSparqlTupelAquisitor", useImprovedSparqlTupelAquisitor); +reinitNecessary = true; +} +/** * @param verbosity control verbosity of output for this component. * mandatory: false| reinit necessary: true * default value: warning Modified: trunk/src/dl-learner/org/dllearner/core/configurators/package.html =================================================================== --- trunk/src/dl-learner/org/dllearner/core/configurators/package.html 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/core/configurators/package.html 2008-09-25 13:40:25 UTC (rev 1256) @@ -1,8 +1 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> -<html> -<head></head> -<body bgcolor="white"> -<p>Automatically generated classes, which enable programmatically setting -and getting configuration options of components.</p> -</body> -</html> \ No newline at end of file +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html><head></head><body bgcolor="white"><p>Automatically generated classes, which enable programmatically settingand getting configuration options of components.</p></body></html> \ No newline at end of file Modified: trunk/src/dl-learner/org/dllearner/kb/aquisitors/BlankNodeCollector.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/aquisitors/BlankNodeCollector.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/aquisitors/BlankNodeCollector.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -28,6 +28,8 @@ blankNodes.put(id, new TreeSet<RDFNodeTuple>()); } blankNodes.get(id).add(t); + //System.out.println("added: "+id+" "+t); + //System.out.println(); } public static SortedSet<RDFNodeTuple> getBlankNode(int id){ Modified: trunk/src/dl-learner/org/dllearner/kb/aquisitors/LinkedDataTupleAquisitor.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/aquisitors/LinkedDataTupleAquisitor.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/aquisitors/LinkedDataTupleAquisitor.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -56,9 +56,16 @@ public SortedSet<RDFNodeTuple> retrieveTuplesForClassesOnly(String uri){ throw new RuntimeException("Not Implemented yet"); } + @Override + protected void disambiguateBlankNodes(String uri, SortedSet<RDFNodeTuple> resultSet){ + throw new RuntimeException("Not Implemented yet"); + } + @Override + public SortedSet<RDFNodeTuple> getBlankNode(int id){ + throw new RuntimeException("Not Implemented yet"); + } - } Modified: trunk/src/dl-learner/org/dllearner/kb/aquisitors/RDFBlankNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/aquisitors/RDFBlankNode.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/aquisitors/RDFBlankNode.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -50,7 +50,7 @@ @Override public String toString(){ //RBC - return "I'm a blank node with id: "+bNodeId+"||"+blankNode; + return "bnodeid: "+bNodeId+" ||"+blankNode; } // overidden Functions Modified: trunk/src/dl-learner/org/dllearner/kb/aquisitors/SparqlTupleAquisitor.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/aquisitors/SparqlTupleAquisitor.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/aquisitors/SparqlTupleAquisitor.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -20,17 +20,21 @@ package org.dllearner.kb.aquisitors; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.SortedSet; import org.apache.log4j.Logger; import org.dllearner.kb.sparql.SPARQLTasks; import org.dllearner.kb.sparql.SparqlQueryMaker; +import org.dllearner.utilities.JamonMonitorLogger; import org.dllearner.utilities.datastructures.RDFNodeTuple; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSetRewindable; import com.hp.hpl.jena.rdf.model.RDFNode; +import com.jamonapi.Monitor; /** * Can execute different queries. @@ -48,9 +52,10 @@ protected SparqlQueryMaker sparqlQueryMaker; protected SPARQLTasks sparqlTasks; - //RBC + + public SparqlTupleAquisitor(SparqlQueryMaker sparqlQueryMaker, SPARQLTasks sparqlTasks) { @@ -64,6 +69,7 @@ String sparqlQueryString = sparqlQueryMaker.makeSubjectQueryUsingFilters(uri); SortedSet<RDFNodeTuple> ret = sparqlTasks.queryAsRDFNodeTuple(sparqlQueryString, PREDICATE, OBJECT); disambiguateBlankNodes(uri, ret); + return ret; } @Override @@ -71,22 +77,45 @@ // getQuery String sparqlQueryString = sparqlQueryMaker.makeClassQueryUsingFilters(uri); SortedSet<RDFNodeTuple> ret = sparqlTasks.queryAsRDFNodeTuple(sparqlQueryString, PREDICATE, OBJECT); + disambiguateBlankNodes(uri, ret); return ret; } @Override public SortedSet<RDFNodeTuple> retrieveTuplesForClassesOnly(String uri){ SortedSet<RDFNodeTuple> ret = retrieveTupel(uri); + disambiguateBlankNodes(uri, ret); return ret; } - private void disambiguateBlankNodes(String uri, SortedSet<RDFNodeTuple> resultSet){ + @Override + public SortedSet<RDFNodeTuple> getBlankNode(int id){ + return BlankNodeCollector.getBlankNode(id); + } + + public void printHM(){ + + for (int j = 0; j < BlankNodeCollector.getBlankNodeMap().size(); j++) { + System.out.println(j); + for(RDFNodeTuple t :BlankNodeCollector.getBlankNodeMap().get(j)){ + System.out.println(t); + } + } + + } + + // main function for resolving blanknodes + @Override + protected void disambiguateBlankNodes(String uri, SortedSet<RDFNodeTuple> resultSet){ + Monitor bnodeMonitor = JamonMonitorLogger.getTimeMonitor(SparqlTupleAquisitor.class, "blanknode time").start(); try{ for (RDFNodeTuple tuple : resultSet) { + if(tuple.b.isAnon()){ int currentId = BlankNodeCollector.getNextGlobalBNodeId(); + // replace the blanknode tuple.b = new RDFBlankNode(currentId, tuple.b); - System.out.println(uri+" replaced blanknode "+tuple.b); + //System.out.println(uri+" replaced blanknode "+tuple.b); dissolveBlankNodes(currentId, uri, tuple); //System.out.println(BlankNodeCollector.getBlankNodeMap()); @@ -95,15 +124,20 @@ }catch (Exception e) { e.printStackTrace(); System.exit(0); + }finally{ + bnodeMonitor.stop(); } + } + // extends a sparql query as long as there are undissolved blanknodes private void dissolveBlankNodes(int currentId, String uri, RDFNodeTuple tuple){ int currentDepth = 1; int lastDepth = 1; ResultSetRewindable rsw=null; do{ String q = BlankNodeCollector.makeQuery(uri, tuple.a.toString(), currentDepth); + //System.out.println(q); rsw = sparqlTasks.queryAsResultSet(q); lastDepth = currentDepth; @@ -113,7 +147,9 @@ } + //takes the resultset and assigns internal ids private void assignIds(int currentId, ResultSetRewindable rsw, int lastDepth){ + //prepare variables according to last depth List<String> vars = new ArrayList<String>(); vars.add("o0"); for (int i = 1; i <= lastDepth; i++) { @@ -123,16 +159,24 @@ final List<String> tmpVars = new ArrayList<String>(); + Map<String, Integer> lastNodes = new HashMap<String, Integer>(); + // the resultset first variable is o0 + // iteration over each tuple of the set while (rsw.hasNext()){ tmpVars.clear(); tmpVars.addAll(vars); QuerySolution q = rsw.nextSolution(); + //skip all that do not start with a blanknode + // could be two different blank nodes here, but unlikely if(!q.get("o0").isAnon()){ + lastNodes.put(q.get("o0").toString(), currentId); continue; }else{ + + // remove the first node tmpVars.remove(0); - assignIdRec(currentId, q, tmpVars); + assignIdRec(currentId, q, tmpVars,lastNodes); } @@ -141,17 +185,25 @@ } - private void assignIdRec(int currentId, QuerySolution q, List<String> vars ){ + private void assignIdRec(int currentId, QuerySolution q, List<String> vars, Map<String, Integer> lastNodes ){ if(vars.isEmpty()){return;} String pvar = vars.remove(0); String ovar = vars.remove(0); + // the next node RDFNode n = q.get(ovar); if(n.isAnon()){ - int nextId = BlankNodeCollector.getNextGlobalBNodeId(); + int nextId; + if(lastNodes.get(n.toString())==null){ + nextId = BlankNodeCollector.getNextGlobalBNodeId(); + lastNodes.put(n.toString(), nextId); + //System.out.println(n.toString()); + }else{ + nextId = lastNodes.get(n.toString()); + } RDFNodeTuple tuple = new RDFNodeTuple(q.get(pvar), new RDFBlankNode(nextId,n)); BlankNodeCollector.addBlankNode(currentId, tuple); - assignIdRec(nextId, q, vars); + assignIdRec(nextId, q, vars, lastNodes); }else{ BlankNodeCollector.addBlankNode(currentId, new RDFNodeTuple(q.get(pvar), n)); } Modified: trunk/src/dl-learner/org/dllearner/kb/aquisitors/TupleAquisitor.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/aquisitors/TupleAquisitor.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/aquisitors/TupleAquisitor.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -44,7 +44,8 @@ protected final int CLASS_INFORMATION = 2; protected int mode = 0; - private boolean uriDebugCheck = true; + protected boolean uriDebugCheck = true; + protected boolean dissolveBlankNodes = true; public final SortedSet<RDFNodeTuple> getTupelForResource(String uri){ checkURIforValidity(uri); @@ -68,6 +69,8 @@ public abstract SortedSet<RDFNodeTuple> retrieveTupel(String uri); public abstract SortedSet<RDFNodeTuple> retrieveClassesForInstances(String uri); public abstract SortedSet<RDFNodeTuple> retrieveTuplesForClassesOnly(String uri); + protected abstract void disambiguateBlankNodes(String uri, SortedSet<RDFNodeTuple> resultSet); + public abstract SortedSet<RDFNodeTuple> getBlankNode(int id); /*private void setMode(int mode) { this.mode = mode; @@ -91,6 +94,12 @@ } return true; } + public boolean isDissolveBlankNodes() { + return dissolveBlankNodes; + } + public void setDissolveBlankNodes(boolean dissolveBlankNodes) { + this.dissolveBlankNodes = dissolveBlankNodes; + } } Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/BlankNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/BlankNode.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/BlankNode.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -8,25 +8,32 @@ import java.util.SortedSet; import java.util.TreeSet; -import org.dllearner.kb.aquisitors.BlankNodeCollector; +import org.apache.log4j.Logger; import org.dllearner.kb.aquisitors.RDFBlankNode; import org.dllearner.kb.aquisitors.TupleAquisitor; import org.dllearner.kb.manipulator.Manipulator; import org.dllearner.utilities.datastructures.RDFNodeTuple; +import org.dllearner.utilities.datastructures.StringTuple; import org.dllearner.utilities.owl.OWLVocabulary; import org.semanticweb.owl.model.OWLDataFactory; import org.semanticweb.owl.model.OWLDescription; +import org.semanticweb.owl.model.OWLObjectProperty; public class BlankNode extends Node { - + private static Logger logger = Logger + .getLogger(BlankNode.class); + RDFBlankNode bNode; String inboundEdge; - private List<Node> connectedNodes =new ArrayList<Node>(); - private List<ObjectPropertyNode> objectProperties = new ArrayList<ObjectPropertyNode>(); + private List<BlankNode> blankNodes =new ArrayList<BlankNode>(); + private SortedSet<StringTuple> otherNodes = new TreeSet<StringTuple> (); private List<DatatypePropertyNode> datatypeProperties = new ArrayList<DatatypePropertyNode>(); + + //private List<ObjectPropertyNode> objectProperties = new ArrayList<ObjectPropertyNode>(); + //private List<DatatypePropertyNode> datatypeProperties = new ArrayList<DatatypePropertyNode>(); public BlankNode(RDFBlankNode bNode, String inboundEdge){ @@ -38,25 +45,35 @@ @Override - public List<Node> expand(TupleAquisitor TupelAquisitor, + public List<Node> expand(TupleAquisitor tupleAquisitor, Manipulator manipulator) { List<Node> newNodes = new ArrayList<Node>(); - SortedSet<RDFNodeTuple> s = BlankNodeCollector.getBlankNode(bNode.getBNodeId()); + SortedSet<RDFNodeTuple> s = tupleAquisitor.getBlankNode(bNode.getBNodeId()); + //System.out.println("entering "+bNode.getBNodeId()); + + for (RDFNodeTuple tuple : s) { if(tuple.b.isLiteral()) { + //System.out.println("adding dtype: "+tuple); datatypeProperties.add(new DatatypePropertyNode(tuple.a.toString(), this, new LiteralNode(tuple.b) )); - connectedNodes.add(new DatatypePropertyNode(tuple.a.toString(), this, new LiteralNode(tuple.b) )); + //connectedNodes.add(new DatatypePropertyNode(tuple.a.toString(), this, new LiteralNode(tuple.b) )); }else if(tuple.b.isAnon()){ - + //System.out.println("adding bnode: "+tuple); BlankNode tmp = new BlankNode( (RDFBlankNode)tuple.b, tuple.a.toString()); - objectProperties.add(new ObjectPropertyNode(tuple.a.toString(), this, tmp )); - connectedNodes.add(new BlankNode( (RDFBlankNode)tuple.b, tuple.a.toString())); + //objectProperties.add(new ObjectPropertyNode(tuple.a.toString(), this, tmp )); + //connectedNodes.add(new BlankNode( (RDFBlankNode)tuple.b, tuple.a.toString())); + blankNodes.add(tmp); newNodes.add(tmp); }else{ - objectProperties.add(new ObjectPropertyNode(tuple.a.toString(), this, new ClassNode(tuple.b.toString()) )); - connectedNodes.add(new ObjectPropertyNode(tuple.a.toString(), this, new ClassNode(tuple.b.toString()) )); + //System.out.println("adding other: "+tuple); + otherNodes.add(new StringTuple(tuple.a.toString(), tuple.b.toString())); + //objectProperties.add(new ObjectPropertyNode(tuple.a.toString(), this, new ClassNode(tuple.b.toString()) )); + //connectedNodes.add(new ObjectPropertyNode(tuple.a.toString(), this, new ClassNode(tuple.b.toString()) )); } } + + //System.out.println("finished"); + return newNodes; } @@ -69,11 +86,11 @@ @Override public SortedSet<String> toNTriple() { SortedSet<String> returnSet = new TreeSet<String>(); - String subject = getNTripleForm(); - for (ObjectPropertyNode one : objectProperties) { + //String subject = getNTripleForm(); + /*for (ObjectPropertyNode one : objectProperties) { returnSet.add(subject + one.getNTripleForm() + one.getBPart().getNTripleForm()+" . "); returnSet.addAll(one.getBPart().toNTriple()); - } + }*/ return returnSet; } @@ -83,6 +100,12 @@ } @Override + public String toString(){ + return "id: "+bNode.getBNodeId()+" inbound: "+getInBoundEdge(); + + } + + @Override public URI getURI(){ return URI.create("http://www.empty.org/empty#empty"); } @@ -95,44 +118,167 @@ public String getInBoundEdge(){ return inboundEdge; } - + public OWLDescription getAnonymousClass(OWLAPIOntologyCollector owlAPIOntologyCollector){ OWLDataFactory factory = owlAPIOntologyCollector.getFactory(); OWLDescription ret = factory.getOWLClass(URI.create("http://dummy.org/dummy")); - for (Node n : connectedNodes) { - System.out.println(n.toString()); + //System.out.println(inboundEdge); + + if( + (inboundEdge.equals(OWLVocabulary.OWL_intersectionOf))|| + (inboundEdge.equals(OWLVocabulary.OWL_complementOf))|| + (inboundEdge.equals(OWLVocabulary.OWL_unionOf)) + ){ + Set<OWLDescription> target = new HashSet<OWLDescription>(); + List<BlankNode> tmp = new ArrayList<BlankNode>(); + tmp.add(this); + while(!tmp.isEmpty()){ + BlankNode next = tmp.remove(0); + //next.printAll(); + + if(next.otherNodes.contains(new StringTuple(OWLVocabulary.RDF_REST, OWLVocabulary.RDF_NIL))){ + for(StringTuple t : next.otherNodes){ + if(t.a.equals(OWLVocabulary.RDF_FIRST)){ + target.add(factory.getOWLClass(URI.create(t.b))); + //System.out.println("added "+t.b); + } + } + //System.out.println("nil found"); + //do nothing + }else{ + if(next.otherNodes.first().a.equals(OWLVocabulary.RDF_FIRST)){ + target.add(factory.getOWLClass(URI.create(next.otherNodes.first().b))); + tmp.add(next.blankNodes.get(0)); + //System.out.println("bnode added"); + }else{ + System.out.println("double nesting not supported yet"); + System.exit(0); + } + } + }//end while + + if(inboundEdge.equals(OWLVocabulary.OWL_intersectionOf)){ + return factory.getOWLObjectIntersectionOf(target); + }else if(inboundEdge.equals(OWLVocabulary.OWL_unionOf)){ + return factory.getOWLObjectUnionOf(target); + }else if(inboundEdge.equals(OWLVocabulary.OWL_complementOf)){ + if(target.size()>1) { + logger.warn("more than one complement"+target); + System.exit(0); + }else{ + return factory.getOWLObjectComplementOf(new ArrayList<OWLDescription>(target).remove(0)); + } + }else{ + printAll(); + tail("wrong type: " +inboundEdge+ this); + } } - if(containsDataTypeProperties()){ - //do nothing right now, add a return here; + // restriction + if(otherNodes.contains( + new StringTuple(OWLVocabulary.RDF_TYPE, OWLVocabulary.OWL_RESTRICTION))){ + return getRestriction( owlAPIOntologyCollector); + } - Set<OWLDescription> l = new HashSet<OWLDescription>(); - for (Node n : connectedNodes) { - if(n instanceof BlankNode){ - l.add(((BlankNode)n).getAnonymousClass(owlAPIOntologyCollector)); - }else{ - l.add(factory.getOWLClass(n.getURI())); + if(!blankNodes.isEmpty()){ + return blankNodes.get(0).getAnonymousClass(owlAPIOntologyCollector); + } + + + return ret; + + } + + public void printAll(){ + System.out.println(this); + + System.out.println("otherNodes"); + for (StringTuple t : otherNodes) { + System.out.println(""+t); + } + System.out.println("***************"); + System.out.println("dtype "); + for (DatatypePropertyNode d : datatypeProperties) { + System.out.println(d.getURIString()+" "+d.getNTripleFormOfB()); + } + System.out.println("***************"); + System.out.println("other bnodes"); + for (BlankNode b : blankNodes) { + System.out.println(b); + } + System.out.println("***************"); + + } + + private OWLDescription getRestriction(OWLAPIOntologyCollector owlAPIOntologyCollector){ + OWLDataFactory factory = owlAPIOntologyCollector.getFactory(); + OWLObjectProperty property = null; + OWLDescription concept = null; + OWLDescription dummy = factory.getOWLClass(URI.create("http://dummy.org/dummy")); + + int total = otherNodes.size()+blankNodes.size()+datatypeProperties.size(); + if(total >=4 ){ + System.out.println("qualified p restrictions not supported currently"); + } + + // get Objectproperty + for(StringTuple n : otherNodes) { + if(n.a.equals(OWLVocabulary.OWL_ON_PROPERTY)){ + property = factory.getOWLObjectProperty(URI.create(n.b)); } } - if(isOfType(OWLVocabulary.OWL_intersectionOf)){ - ret = factory.getOWLObjectIntersectionOf(l); - System.out.println("aaa"); - }else if(isOfType(OWLVocabulary.OWL_unionOf)){ - ret = factory.getOWLObjectUnionOf(l); - System.out.println("aaa"); - }else if(isOfType(OWLVocabulary.OWL_complementOf)){ - ret = factory.getOWLObjectComplementOf(new ArrayList<OWLDescription>(l).remove(0)); - System.out.println("aaa"); + // has an Integer value + if(!datatypeProperties.isEmpty()){ + DatatypePropertyNode d = datatypeProperties.get(0); + String p = d.getURIString(); + if( p.equals(OWLVocabulary.OWL_cardinality)){ + return factory.getOWLObjectExactCardinalityRestriction(property, d.getBPart().getLiteral().getInt()); + }else if(p.equals(OWLVocabulary.OWL_maxCardinality)){ + return factory.getOWLObjectMaxCardinalityRestriction(property, d.getBPart().getLiteral().getInt()); + }else if(p.equals(OWLVocabulary.OWL_minCardinality)){ + return factory.getOWLObjectMinCardinalityRestriction(property, d.getBPart().getLiteral().getInt()); + }else { + tail(p+d+" in "+this); + } } - return ret; + + if(!blankNodes.isEmpty()){ + concept = blankNodes.get(0).getAnonymousClass(owlAPIOntologyCollector); + }else{ + for(StringTuple n : otherNodes) { + String p = n.a; + String o = n.b; + if( + (p.equals(OWLVocabulary.OWL_ALL_VALUES_FROM)) || + (p.equals(OWLVocabulary.OWL_SOME_VALUES_FROM)) || + (p.equals(OWLVocabulary.OWL_HAS_VALUE)) + ){ + concept = factory.getOWLClass(URI.create(o)); + } + } + } + + for(StringTuple n : otherNodes) { + String p = n.a; + if(p.equals(OWLVocabulary.OWL_ALL_VALUES_FROM)){ + return factory.getOWLObjectAllRestriction(property, concept); + }else if(p.equals(OWLVocabulary.OWL_SOME_VALUES_FROM)){ + return factory.getOWLObjectSomeRestriction(property, concept); + }else if(p.equals(OWLVocabulary.OWL_HAS_VALUE)){ + logger.warn("OWL_hasValue not implemented yet"); + return dummy; + } + } + return dummy; } - private boolean isOfType(String type){ + + /*private boolean isOfType(String type){ for (Node n : connectedNodes) { if((n instanceof BlankNode ) && @@ -154,6 +300,6 @@ } } return false; - } + }*/ } Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/ClassNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/ClassNode.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/ClassNode.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -33,6 +33,7 @@ import org.semanticweb.owl.model.OWLClass; import org.semanticweb.owl.model.OWLCommentAnnotation; import org.semanticweb.owl.model.OWLDataFactory; +import org.semanticweb.owl.model.OWLDescription; import org.semanticweb.owl.model.OWLLabelAnnotation; /** @@ -65,28 +66,31 @@ List<Node> newNodes = new ArrayList<Node>(); Node tmp; for (RDFNodeTuple tuple : newTuples) { - if((tmp = processTuple(tuple))!= null) { + if((tmp = processTuple(tuple,tupelAquisitor.isDissolveBlankNodes()))!= null) { newNodes.add(tmp); } } return newNodes; } - private Node processTuple( RDFNodeTuple tuple) { + private Node processTuple( RDFNodeTuple tuple, boolean dissolveBlankNodes) { try { String property = tuple.a.toString(); if(tuple.b.isLiteral()) { datatypeProperties.add(new DatatypePropertyNode(tuple.a.toString(), this, new LiteralNode(tuple.b) )); return null; }else if(tuple.b.isAnon()){ - logger.warn("blanknodes not supported as of now "+ this +" in tuple" + tuple); - RDFBlankNode n = (RDFBlankNode) tuple.b; - - BlankNode tmp = new BlankNode( n, tuple.a.toString()); - //add it to the graph - blankNodes.add(tmp); - //return tmp; - return tmp; + if(dissolveBlankNodes){ + RDFBlankNode n = (RDFBlankNode) tuple.b; + BlankNode tmp = new BlankNode( n, tuple.a.toString()); + //add it to the graph + blankNodes.add(tmp); + //return tmp; + return tmp; + }else{ + //do nothing + return null; + } // substitute rdf:type with owl:subclassof }else if (property.equals(OWLVocabulary.RDF_TYPE) || OWLVocabulary.isStringSubClassVocab(property)) { @@ -173,7 +177,18 @@ } for (BlankNode bn : blankNodes) { - System.out.println(bn.getAnonymousClass(owlAPIOntologyCollector).toString()); + OWLDescription target = bn.getAnonymousClass(owlAPIOntologyCollector); + + if(OWLVocabulary.isStringSubClassVocab(bn.getInBoundEdge())){ + owlAPIOntologyCollector.addAxiom(factory.getOWLSubClassAxiom(me, target)); + }else if(bn.getInBoundEdge().equals(OWLVocabulary.OWL_DISJOINT_WITH)){ + owlAPIOntologyCollector.addAxiom(factory.getOWLDisjointClassesAxiom(me, target)); + }else if(bn.getInBoundEdge().equals(OWLVocabulary.OWL_EQUIVALENT_CLASS)){ + owlAPIOntologyCollector.addAxiom(factory.getOWLEquivalentClassesAxiom(me, target)); + }else { + tail( getURIString()+"||"+bn.getInBoundEdge()); + } + } }catch (Exception e) { System.out.println("aaa"+getURIString()); Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/ExtractionAlgorithm.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/ExtractionAlgorithm.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/ExtractionAlgorithm.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -130,15 +130,17 @@ if(configuration.isGetPropertyInformation() ){ - + Monitor m = JamonMonitorLogger.getTimeMonitor(ExtractionAlgorithm.class, "TimeGetPropertyInformation").start(); List<ObjectPropertyNode> l = getObjectPropertyNodes(collectNodes); for (ObjectPropertyNode node : l) { - //FIXME has to be transported to the next step - node.expandProperties(tupleAquisitor, configuration.getManipulator()); + collectNodes.addAll(node.expandProperties(tupleAquisitor, configuration.getManipulator())); } + m.stop(); } + Monitor m = JamonMonitorLogger.getTimeMonitor(ExtractionAlgorithm.class, "TimeBlankNode").start(); expandBlankNodes(getBlankNodes(collectNodes),tupleAquisitor); + m.stop(); return seedNode; Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/InstanceNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/InstanceNode.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/InstanceNode.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -87,6 +87,7 @@ return null; }else if(tuple.b.isAnon()){ RDFBlankNode n = (RDFBlankNode) tuple.b; + //RBC System.out.println(n.getBNodeId()); System.exit(0); logger.warn("blanknodes not supported as of now"+ this +"in tuple" + tuple); Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/Manager.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/Manager.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/Manager.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -28,8 +28,11 @@ import java.util.TreeSet; import org.apache.log4j.Logger; +import org.dllearner.utilities.JamonMonitorLogger; import org.semanticweb.owl.model.OWLOntology; +import com.jamonapi.Monitor; + /** * An object of this class encapsulates everything. * @@ -80,17 +83,24 @@ } } + //((SparqlTupleAquisitor) configuration.getTupelAquisitor()).printHM(); + //System.exit(0); logger.info("Finished extraction"); return allExtractedNodes; } public OWLOntology getOWLAPIOntologyForNodes(List<Node> nodes, boolean saveOntology){ + Monitor m1 = JamonMonitorLogger.getTimeMonitor(Manager.class, "Time conversion to OWL Ontology").start(); for (Node n : nodes) { n.toOWLOntology(configuration.getOwlAPIOntologyCollector()); } + m1.stop(); + if(saveOntology){ - configuration.getOwlAPIOntologyCollector().saveOntology(); + Monitor m2 = JamonMonitorLogger.getTimeMonitor(Manager.class, "Time saving Ontology").start(); + configuration.getOwlAPIOntologyCollector().saveOntology(); + m2.stop(); } return configuration.getOwlAPIOntologyCollector().getCurrentOntology(); Modified: trunk/src/dl-learner/org/dllearner/kb/extraction/ObjectPropertyNode.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/extraction/ObjectPropertyNode.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/extraction/ObjectPropertyNode.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -34,6 +34,7 @@ import org.dllearner.utilities.owl.OWLVocabulary; import org.semanticweb.owl.model.OWLClass; import org.semanticweb.owl.model.OWLDataFactory; +import org.semanticweb.owl.model.OWLDescription; import org.semanticweb.owl.model.OWLLabelAnnotation; import org.semanticweb.owl.model.OWLObjectProperty; @@ -80,13 +81,15 @@ specialTypes.add(tuple.b.toString()); } }else if(tuple.b.isAnon()){ - logger.warn("blanknodes currently not implemented in this tuple aquisitor"); - RDFBlankNode n = (RDFBlankNode) tuple.b; + + if(tupelAquisitor.isDissolveBlankNodes()){ + RDFBlankNode n = (RDFBlankNode) tuple.b; + BlankNode tmp = new BlankNode( n, tuple.a.toString()); + //add it to the graph + blankNodes.add(tmp); + ret.add( tmp); + } - BlankNode tmp = new BlankNode( n, tuple.a.toString()); - //add it to the graph - blankNodes.add(tmp); - ret.add( tmp); }else{ propertyInformation.add(tuple); @@ -128,19 +131,18 @@ OWLObjectProperty me =factory.getOWLObjectProperty(getURI()); for (RDFNodeTuple one : propertyInformation) { + OWLClass c = factory.getOWLClass(URI.create(one.a.toString())); + if(one.aPartContains(OWLVocabulary.RDFS_range)){ - OWLClass c = factory.getOWLClass(URI.create(one.a.toString())); owlAPIOntologyCollector.addAxiom(factory.getOWLObjectPropertyRangeAxiom(me, c)); }else if(one.aPartContains(OWLVocabulary.RDFS_domain)){ - OWLClass c = factory.getOWLClass(URI.create(one.a.toString())); owlAPIOntologyCollector.addAxiom(factory.getOWLObjectPropertyDomainAxiom(me, c)); }else if(one.aPartContains(OWLVocabulary.RDFS_SUB_PROPERTY_OF)){ OWLObjectProperty p = factory.getOWLObjectProperty(URI.create(one.b.toString())); owlAPIOntologyCollector.addAxiom(factory.getOWLSubObjectPropertyAxiom(me, p)); - }else if(one.aPartContains(OWLVocabulary.OWL_inverseOf)){ OWLObjectProperty p = factory.getOWLObjectProperty(URI.create(one.b.toString())); - owlAPIOntologyCollector.addAxiom(factory.getOWLInverseObjectPropertiesAxiom(me, p)); + owlAPIOntologyCollector.addAxiom(factory.getOWLInverseObjectPropertiesAxiom(me, p)); }else if(one.aPartContains(OWLVocabulary.OWL_equivalentProperty)){ OWLObjectProperty p = factory.getOWLObjectProperty(URI.create(one.b.toString())); Set<OWLObjectProperty> tmp = new HashSet<OWLObjectProperty>(); @@ -174,7 +176,13 @@ } } for (BlankNode bn : blankNodes) { - System.out.println(bn.getAnonymousClass(owlAPIOntologyCollector).toString()); + OWLDescription target = bn.getAnonymousClass(owlAPIOntologyCollector); + if(bn.getInBoundEdge().equals(OWLVocabulary.RDFS_range)){ + owlAPIOntologyCollector.addAxiom(factory.getOWLObjectPropertyRangeAxiom(me, target)); + }else if(bn.getInBoundEdge().equals(OWLVocabulary.RDFS_domain)){ + owlAPIOntologyCollector.addAxiom(factory.getOWLObjectPropertyDomainAxiom(me, target)); + } + //System.out.println(bn.getAnonymousClass(owlAPIOntologyCollector).toString()); } } Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -76,7 +76,7 @@ private static final boolean debug = false; // tupleaquisitor - private static final boolean debugUseImprovedTupleAquisitor = debug && false; // switches + //private static final boolean debugUseImprovedTupleAquisitor = debug && false; // switches // sysex private static final boolean debugExitAfterExtraction = debug && false; // switches @@ -192,6 +192,12 @@ options.add(new BooleanConfigOption("getPropertyInformation", "gets all types for extracted ObjectProperties", false, false, true)); + options.add(new BooleanConfigOption("dissolveBlankNodes", + "determines whether Blanknodes are dissolved. This is a costly function.", true, false, + true)); + options.add(new BooleanConfigOption("useImprovedSparqlTupelAquisitor", + "uses deeply nested SparqlQueries, according to recursion depth, still EXPERIMENTAL", false, false, + true)); options.add(CommonConfigOptions.getVerbosityOption()); options.add(new StringSetConfigOption("defaultGraphURIs", @@ -389,13 +395,16 @@ } public TupleAquisitor getTupleAquisitor() { - if (debugUseImprovedTupleAquisitor) { - return new SparqlTupleAquisitorImproved(getSparqlQueryMaker(), + TupleAquisitor ret = null; + if (configurator.getUseImprovedSparqlTupelAquisitor()) { + ret = new SparqlTupleAquisitorImproved(getSparqlQueryMaker(), getSPARQLTasks(), configurator.getRecursionDepth()); } else { - return new SparqlTupleAquisitor(getSparqlQueryMaker(), + ret = new SparqlTupleAquisitor(getSparqlQueryMaker(), getSPARQLTasks()); } + ret.setDissolveBlankNodes(configurator.getDissolveBlankNodes()); + return ret; } Modified: trunk/src/dl-learner/org/dllearner/scripts/ConfigJavaGenerator.java =================================================================== --- trunk/src/dl-learner/org/dllearner/scripts/ConfigJavaGenerator.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/scripts/ConfigJavaGenerator.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -197,6 +197,7 @@ makeComponentFactory(); makeInterface(); + writePackageHTML(); System.out.println("Done"); } @@ -503,6 +504,21 @@ } + private static void writePackageHTML(){ + String c = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">"+ + "<html>"+ + "<head></head>"+ + "<body bgcolor=\"white\">"+ + "<p>Automatically generated classes, which enable programmatically setting"+ + "and getting configuration options of components.</p>"+ + "</body>"+ + "</html>"; + try{ + Files.createFile(new File(TARGET_DIR+File.separator+"package.html"), c); + }catch (Exception e) { + e.printStackTrace(); + } + } private static String expandCollection(Collection<String> col, @@ -545,6 +561,7 @@ } + private static String checkstyleAdjust(String type) { type = type.replaceAll("<", "("); type = type.replaceAll(">", ")"); Modified: trunk/src/dl-learner/org/dllearner/scripts/DumbLPFinder.java =================================================================== --- trunk/src/dl-learner/org/dllearner/scripts/DumbLPFinder.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/scripts/DumbLPFinder.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -56,6 +56,9 @@ //private static Class usedReasoner = FastInstanceChecker.class; private static Class<? extends ReasonerComponent> usedReasoner = OWLAPIReasoner.class; + + private static int numberOfLearningProblems = 100; + private static boolean allOrExists = true; private static boolean tenORthirty = true; @@ -88,8 +91,8 @@ reasoningService = null; ComponentManager.getInstance().freeAllComponents(); - int count = 1; - while(count<10000){ + int count = 0; + while(count<numberOfLearningProblems){ /*if((count%5)==0){ //System.out.println(count+" "+allOrExists+"::"+tenORthirty); Added: trunk/src/dl-learner/org/dllearner/scripts/improveWikipedia/package.html =================================================================== --- trunk/src/dl-learner/org/dllearner/scripts/improveWikipedia/package.html (rev 0) +++ trunk/src/dl-learner/org/dllearner/scripts/improveWikipedia/package.html 2008-09-25 13:40:25 UTC (rev 1256) @@ -0,0 +1,7 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<html> +<head></head> +<body bgcolor="white"> +<p>Classes for the WikipediaCategoryCleaner script</p> +</body> +</html> Modified: trunk/src/dl-learner/org/dllearner/utilities/examples/ExampleContainer.java =================================================================== --- trunk/src/dl-learner/org/dllearner/utilities/examples/ExampleContainer.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/utilities/examples/ExampleContainer.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -1,5 +1,5 @@ /** - * Copyright (C) 2007, Jens Lehmann + * Copyright (C) 2007-2008, Jens Lehmann * * This file is part of DL-Learner. * @@ -24,6 +24,17 @@ import org.dllearner.core.owl.Individual; + + +/** + * A simple container for storing pos and negexamples, + * basically a more simple parameter or return value. + * + * It also contains static functions to test if all example sets are different. + * + * @author Sebastian Hellmann + * + */ public class ExampleContainer implements Comparable<ExampleContainer>{ Modified: trunk/src/dl-learner/org/dllearner/utilities/owl/OWLVocabulary.java =================================================================== --- trunk/src/dl-learner/org/dllearner/utilities/owl/OWLVocabulary.java 2008-09-24 15:33:30 UTC (rev 1255) +++ trunk/src/dl-learner/org/dllearner/utilities/owl/OWLVocabulary.java 2008-09-25 13:40:25 UTC (rev 1256) @@ -23,6 +23,10 @@ public static final String RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; + public static final String RDF_FIRST = "http://www.w3.org/1999/02/22-rdf-syntax-ns#first"; + public static final String RDF_REST = "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest"; + public static final String RDF_NIL = "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"; + public static final String RDFS_SUBCLASS_OF = "http://www.w3.org/2000/01/rdf-schema#subClassOf"; public static final String RDFS_CLASS = "http://www.w3.org/2000/01/rdf-schema#Class"; @@ -35,6 +39,7 @@ public static final String RDFS_range = "http://www.w3.org/2000/01/rdf-schema#range"; + public static final String OWL_SAME_AS = "http://www.w3.org/2002/07/owl#sameAs"; public static final String OWL_OBJECTPROPERTY = "http://www.w3.org/2002/07/owl#ObjectProperty"; public static final String OWL_DATATYPPROPERTY = "http://www.w3.org/2002/07/owl#DataTypeProperty"; @@ -48,8 +53,17 @@ public static final String OWL_unionOf = "http://www.w3.org/2002/07/owl#unionOf"; public static final String OWL_complementOf = "http://www.w3.org/2002/07/owl#complementOf"; + public static final String OWL_RESTRICTION = "http://www.w3.org/2002/07/owl#Restriction"; + public static final String OWL_ON_PROPERTY = "http://www.w3.org/2002/07/owl#onProperty"; + public static final String OWL_ALL_VALUES_FROM = "http://www.w3.org/2002/07/owl#allValuesFrom"; + public static final String OWL_SOME_VALUES_FROM = "http://www.w3.org/2002/07/owl#allValuesFrom"; + public static final String OWL_HAS_VALUE = "http://www.w3.org/2002/07/owl#hasValue"; + public static final String OWL_maxCardinality = "http://www.w3.org/2002/07/owl#maxCardinality"; + public static final String OWL_minCardinality = "http://www.w3.org/2002/07/owl#minCardinality"; + public static final String OWL_cardinality = "http://www.w3.org/2002/07/owl#cardinality"; + public static final String OWL_FunctionalProperty = "http://www.w3.org/2002/07/owl#FunctionalProperty"; public static final String OWL_InverseFunctionalProperty = "http://www.w3.org/2002/07/owl#InverseFunctionalProperty"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |