package au.com.langdale.kena; import java.util.HashSet; import java.util.Iterator; import au.com.langdale.kena.filters.Buffer; import au.com.langdale.kena.filters.LiteralObjects; import au.com.langdale.kena.filters.NamedSubjects; import au.com.langdale.kena.filters.Objects; import au.com.langdale.kena.filters.ResourceObjects; import au.com.langdale.kena.filters.Subjects; import au.com.langdale.kena.filters.UniqueObjects; import au.com.langdale.kena.filters.UniqueSubjects; import au.com.langdale.kena.filters.UnnamedObjects; import au.com.langdale.kena.filters.Wrapper; import com.hp.hpl.jena.graph.FrontsNode; import com.hp.hpl.jena.graph.Graph; import com.hp.hpl.jena.graph.Node; import com.hp.hpl.jena.graph.Triple; import com.hp.hpl.jena.graph.impl.LiteralLabelFactory; import com.hp.hpl.jena.shared.PrefixMapping; import com.hp.hpl.jena.vocabulary.DC_11; import com.hp.hpl.jena.vocabulary.OWL2; import com.hp.hpl.jena.vocabulary.RDF; import com.hp.hpl.jena.vocabulary.RDFS; import com.hp.hpl.jena.vocabulary.XSD; public class OntModel { /** A PrefixMapping that contains the "standard" prefixes we know about. */ public static final PrefixMapping Standard = PrefixMapping.Factory.create() .setNsPrefix( "rdfs", RDFS.getURI() ) .setNsPrefix( "rdf", RDF.getURI() ) .setNsPrefix( "dc", DC_11.getURI() ) .setNsPrefix( "owl", OWL2.getURI() ) .setNsPrefix( "xsd", XSD.getURI() ) .setNsPrefix( "uml", "http://langdale.com.au/2005/UML#") .setNsPrefix( "msg", "http://langdale.com.au/2005/Message#") .lock() ; private final Graph graph; private PrefixMapping prefixes = Standard; OntModel(Graph graph) { this.graph = graph; } public void setNsPrefix(String prefix, String uri) { if(prefixes == Standard) { prefixes = PrefixMapping.Factory.create(); prefixes.setNsPrefixes(Standard); } prefixes.setNsPrefix(prefix, uri); } public PrefixMapping getNsPrefixMap() { return prefixes; } public Graph getGraph() { return graph; } public int size() { return graph.size(); } public OntResource getValidOntology() { ResIterator it = listSubjectsWithProperty(RDF.type, OWL2.Ontology); if( it.hasNext()) { OntResource ont = it.nextResource(); if( ! it.hasNext() && ont.isURIResource() && ! ont.getURI().contains("#")) return ont; } return null; } public ResIterator listSubjectsWithNoProperty(FrontsNode prop) { HashSet universe = new HashSet(); HashSet excluded = new HashSet(); Iterator it = graph.find(Triple.ANY); while( it.hasNext()) { Triple t = (Triple) it.next(); universe.add(t.getSubject()); if( ! t.getObject().isLiteral()) universe.add(t.getObject()); if( t.getPredicate().equals(prop.asNode())) excluded.add(t.getSubject()); } universe.removeAll(excluded); return new Wrapper( this, universe.iterator()); } public ResIterator listSubjectsWithProperty(FrontsNode prop) { return new Wrapper( this, new UniqueSubjects(graph.find(Node.ANY, prop.asNode(), Node.ANY))); } public ResIterator listSubjectsWithProperty(FrontsNode prop, Node value) { return new Wrapper( this, new Subjects(graph.find(Node.ANY, prop.asNode(), value))); } public ResIterator listSubjectsWithProperty(FrontsNode prop, FrontsNode value) { return listSubjectsWithProperty(prop, value.asNode()); } public ResIterator listSubjectsWithProperty(FrontsNode prop, String value) { return listSubjectsWithProperty(prop, Node.createLiteral(value, null, false)); } public ResIterator listSubjectsBuffered(FrontsNode prop, FrontsNode value) { return new Wrapper( this, new Buffer(new Subjects(graph.find(Node.ANY, prop.asNode(), value.asNode())))); } public NodeIterator listObjectsOfProperty(FrontsNode subject, FrontsNode prop) { return new Objects(graph.find(subject.asNode(), prop.asNode(), Node.ANY)); } public ResIterator listResourceObjectsOfProperty(FrontsNode subject, FrontsNode prop) { return new Wrapper(this, new ResourceObjects(graph.find(subject.asNode(), prop.asNode(), Node.ANY))); } public ResIterator listUnnamedObjects(FrontsNode subject) { return new Wrapper(this, new UnnamedObjects(graph.find(subject.asNode(), Node.ANY, Node.ANY))); } public NodeIterator listLiteralObjectsOfProperty(FrontsNode subject, FrontsNode prop) { return new LiteralObjects(graph.find(subject.asNode(), prop.asNode(), Node.ANY)); } public ResIterator listSubjects() { return new Wrapper( this, new UniqueSubjects(graph.find(Triple.ANY))); } public NodeIterator listObjects() { return new UniqueObjects( graph.find(Triple.ANY)); } public ResIterator listIndividuals(FrontsNode type) { return listSubjectsWithProperty( RDF.type, type ); } public ResIterator listObjectProperties() { return listIndividuals(OWL2.ObjectProperty); } public ResIterator listDatatypeProperties() { return listIndividuals(OWL2.DatatypeProperty); } public ResIterator listAnnotationProperties() { return listIndividuals(OWL2.AnnotationProperty); } public ResIterator listNamedClasses() { return new Wrapper( this, new NamedSubjects(graph.find(Node.ANY, RDF.type.asNode(), OWL2.Class.asNode()))); } public boolean contains(FrontsNode subject, FrontsNode prop, FrontsNode value) { return graph.contains(subject.asNode(), prop.asNode(), value.asNode()); } public boolean contains(FrontsNode subject, FrontsNode prop, Node value) { return graph.contains(subject.asNode(), prop.asNode(), value); } public boolean contains(FrontsNode subject, FrontsNode prop, String value) { return graph.contains(subject.asNode(), prop.asNode(), Node.createLiteral(value, null, false)); } public boolean contains(FrontsNode subject, FrontsNode prop, String value, String lang) { return graph.contains(subject.asNode(), prop.asNode(), Node.createLiteral(value, lang, false)); } public boolean contains(FrontsNode subject, FrontsNode prop) { return graph.contains(subject.asNode(), prop.asNode(), Node.ANY); } public boolean contains(FrontsNode subject) { return graph.contains(subject.asNode(), Node.ANY, Node.ANY); } public OntResource createList() { return new OntResource(RDF.nil.asNode(), this); } public OntResource createList(ResIterator it) { OntResource result = new OntResource(RDF.nil.asNode(), this); while( it.hasNext()) result = result.cons(it.nextResource()); return result; } public OntResource createList(Node[] elements) { return createList(elements, 0, elements.length); } public OntResource createList(Node[] elements, int offset1, int offset2) { OntResource result = new OntResource(RDF.nil.asNode(), this); for( int ix = offset2 - 1; ix >= offset1; ix-- ) result = result.cons(elements[ix]); return result; } public OntResource createResource() { return new OntResource(Node.createAnon(), this); } public OntResource createResource(String uri) { return new OntResource(Node.createURI(uri), this); } public OntResource createResource(Node node) { return new OntResource(node, this); } public OntResource createIndividual( FrontsNode type) { OntResource result = new OntResource(Node.createAnon(), this); add(result, RDF.type, type); return result; } public OntResource createIndividual( String uri, FrontsNode type) { OntResource result = new OntResource(uri == null ? Node.createAnon():Node.createURI(uri), this); add(result, RDF.type, type); return result; } public OntResource createAllValuesFromRestriction(String uri, FrontsNode prop, FrontsNode type) { OntResource result = createIndividual(uri, OWL2.Restriction); result.addProperty(OWL2.onProperty, prop); result.addProperty(OWL2.allValuesFrom, type); return result; } public OntResource createSomeValuesFromRestriction(String uri, FrontsNode prop, FrontsNode type) { OntResource result = createIndividual(uri, OWL2.Restriction); result.addProperty(OWL2.onProperty, prop); result.addProperty(OWL2.someValuesFrom, type); return result; } public OntResource createCardinalityRestriction(String uri, FrontsNode prop, int card) { OntResource result = createIndividual(uri, OWL2.Restriction); result.addProperty(OWL2.onProperty, prop); result.addProperty(OWL2.cardinality, card); return result; } public OntResource createMaxCardinalityRestriction(String uri, FrontsNode prop, int card) { OntResource result = createIndividual(uri, OWL2.Restriction); result.addProperty(OWL2.onProperty, prop); result.addProperty(OWL2.maxCardinality, card); return result; } public OntResource createMinCardinalityRestriction(String uri, FrontsNode prop, int card) { OntResource result = createIndividual(uri, OWL2.Restriction); result.addProperty(OWL2.onProperty, prop); result.addProperty(OWL2.minCardinality, card); return result; } public OntResource createClass(String uri) { return createIndividual(uri, OWL2.Class); } public OntResource createClass() { return createIndividual(OWL2.Class); } public OntResource createOntProperty(String uri) { return createIndividual(uri, RDF.Property); } public OntResource createObjectProperty(String uri) { return createIndividual(uri, OWL2.ObjectProperty); } public OntResource createDatatypeProperty(String uri) { return createIndividual(uri, OWL2.DatatypeProperty); } public OntResource createAnnotationProperty(String uri) { return createIndividual(uri, OWL2.AnnotationProperty); } public void add(OntModel other) { graph.getBulkUpdateHandler().add(other.graph, false); } public void add(OntModel other, boolean excludeReifications) { graph.getBulkUpdateHandler().add(other.graph, ! excludeReifications); } public void add(FrontsNode subject, FrontsNode prop, FrontsNode value) { add(subject, prop, value.asNode()); } public void add(FrontsNode subject, FrontsNode prop, String value) { add(subject, prop, Node.createLiteral(value, null, false)); } public void add(FrontsNode subject, FrontsNode prop, String value, String lang) { add(subject, prop, Node.createLiteral(value, lang, false)); } public void add(FrontsNode subject, FrontsNode prop, Node value) { graph.add(Triple.create(subject.asNode(), prop.asNode(), value)); } public void add(FrontsNode subject, FrontsNode prop, int value) { graph.add(Triple.create(subject.asNode(), prop.asNode(), Node.createLiteral(LiteralLabelFactory.create(new Integer(value))))); } public void remove(FrontsNode subject, FrontsNode prop, Node value) { graph.delete(Triple.create(subject.asNode(), prop.asNode(), value)); } public void remove(FrontsNode subject, FrontsNode prop, FrontsNode value) { graph.delete(Triple.create(subject.asNode(), prop.asNode(), value.asNode())); } public void remove(FrontsNode subject, FrontsNode prop) { graph.getBulkUpdateHandler().remove(subject.asNode(), prop.asNode(), Node.ANY); } public void removeSubject(FrontsNode subject) { graph.getBulkUpdateHandler().remove(subject.asNode(), Node.ANY, Node.ANY); } public void removeObject(FrontsNode value) { graph.getBulkUpdateHandler().remove(Node.ANY, Node.ANY, value.asNode()); } }