001: /******************************************************************
002: * File: MiniOWLReasonerFactory.java
003: * Created by: Dave Reynolds
004: * Created on: 19-Mar-2004
005: *
006: * (c) Copyright 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP, all rights reserved.
007: * [See end of file]
008: * $Id: OWLMiniReasonerFactory.java,v 1.10 2008/01/02 12:07:48 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys;
010:
011: import com.hp.hpl.jena.reasoner.*;
012: import com.hp.hpl.jena.reasoner.rulesys.Util;
013: import com.hp.hpl.jena.reasoner.transitiveReasoner.TransitiveReasoner;
014: import com.hp.hpl.jena.rdf.model.*;
015: import com.hp.hpl.jena.vocabulary.*;
016:
017: /**
018: * Reasoner factory for the OWL mini configuration. Key limitations over
019: * the normal OWL configuration are:
020: * <UL>
021: * <li>omits the someValuesFrom => bNode entailments</li>
022: * <li>avoids any guard clauses which would break the find() contract</li>
023: * <li>omits inheritance of range implications for XSD datatype ranges</li>
024: * </UL>
025: *
026: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
027: * @version $Revision: 1.10 $ on $Date: 2008/01/02 12:07:48 $
028: */
029: public class OWLMiniReasonerFactory implements ReasonerFactory {
030:
031: /** Single global instance of this factory */
032: private static ReasonerFactory theInstance = new OWLMiniReasonerFactory();
033:
034: /** Static URI for this reasoner type */
035: public static final String URI = "http://jena.hpl.hp.com/2003/OWLMiniFBRuleReasoner";
036:
037: /** Cache of the capabilities description */
038: protected Model capabilities;
039:
040: /**
041: * Return the single global instance of this factory
042: */
043: public static ReasonerFactory theInstance() {
044: return theInstance;
045: }
046:
047: /**
048: * Constructor method that builds an instance of the associated Reasoner
049: * @param configuration a set of arbitrary configuration information to be
050: * passed the reasoner encoded within an RDF graph
051: */
052: public Reasoner create(Resource configuration) {
053: OWLMiniReasoner reasoner = new OWLMiniReasoner(this );
054: if (configuration != null) {
055: Boolean doLog = Util.checkBinaryPredicate(
056: ReasonerVocabulary.PROPderivationLogging,
057: configuration);
058: if (doLog != null) {
059: reasoner.setDerivationLogging(doLog.booleanValue());
060: }
061: Boolean doTrace = Util.checkBinaryPredicate(
062: ReasonerVocabulary.PROPtraceOn, configuration);
063: if (doTrace != null) {
064: reasoner.setTraceOn(doTrace.booleanValue());
065: }
066: }
067: return reasoner;
068: }
069:
070: /**
071: * Return a description of the capabilities of this reasoner encoded in
072: * RDF. This method is normally called by the ReasonerRegistry which caches
073: * the resulting information so dynamically creating here is not really an overhead.
074: */
075: public Model getCapabilities() {
076: if (capabilities == null) {
077: capabilities = ModelFactory.createDefaultModel();
078: Resource base = capabilities.createResource(getURI());
079: base
080: .addProperty(ReasonerVocabulary.nameP,
081: "OWL Mini Reasoner")
082: .addProperty(
083: ReasonerVocabulary.descriptionP,
084: "Experimental mini OWL reasoner.\n"
085: + "Can separate tbox and abox data if desired to reuse tbox caching or mix them.")
086: .addProperty(ReasonerVocabulary.supportsP,
087: RDFS.subClassOf).addProperty(
088: ReasonerVocabulary.supportsP,
089: RDFS.subPropertyOf).addProperty(
090: ReasonerVocabulary.supportsP, RDFS.member)
091: .addProperty(ReasonerVocabulary.supportsP,
092: RDFS.range)
093: .addProperty(ReasonerVocabulary.supportsP,
094: RDFS.domain)
095: .addProperty(
096: ReasonerVocabulary.supportsP,
097: TransitiveReasoner.directSubClassOf
098: .toString())
099: // TODO -- typing
100: .addProperty(
101: ReasonerVocabulary.supportsP,
102: TransitiveReasoner.directSubPropertyOf
103: .toString())
104: // TODO -- typing
105: // TODO - add OWL elements supported
106: .addProperty(ReasonerVocabulary.supportsP,
107: ReasonerVocabulary.individualAsThingP)
108: .addProperty(ReasonerVocabulary.supportsP,
109: OWL.ObjectProperty).addProperty(
110: ReasonerVocabulary.supportsP,
111: OWL.DatatypeProperty).addProperty(
112: ReasonerVocabulary.supportsP,
113: OWL.FunctionalProperty).addProperty(
114: ReasonerVocabulary.supportsP,
115: OWL.SymmetricProperty).addProperty(
116: ReasonerVocabulary.supportsP,
117: OWL.TransitiveProperty).addProperty(
118: ReasonerVocabulary.supportsP,
119: OWL.InverseFunctionalProperty)
120:
121: .addProperty(ReasonerVocabulary.supportsP,
122: OWL.hasValue).addProperty(
123: ReasonerVocabulary.supportsP,
124: OWL.intersectionOf).addProperty(
125: ReasonerVocabulary.supportsP, OWL.unionOf) // Only partial
126: .addProperty(ReasonerVocabulary.supportsP,
127: OWL.maxCardinality) // Only partial
128: .addProperty(ReasonerVocabulary.supportsP,
129: OWL.cardinality) // Only partial
130: .addProperty(ReasonerVocabulary.supportsP,
131: OWL.allValuesFrom) // Only partial
132: .addProperty(ReasonerVocabulary.supportsP,
133: OWL.sameAs).addProperty(
134: ReasonerVocabulary.supportsP,
135: OWL.differentFrom).addProperty(
136: ReasonerVocabulary.supportsP,
137: OWL.disjointWith)
138:
139: .addProperty(ReasonerVocabulary.versionP, "0.1");
140: }
141: return capabilities;
142: }
143:
144: /**
145: * Return the URI labelling this type of reasoner
146: */
147: public String getURI() {
148: return URI;
149: }
150:
151: }
152:
153: /*
154: (c) Copyright 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
155: All rights reserved.
156:
157: Redistribution and use in source and binary forms, with or without
158: modification, are permitted provided that the following conditions
159: are met:
160:
161: 1. Redistributions of source code must retain the above copyright
162: notice, this list of conditions and the following disclaimer.
163:
164: 2. Redistributions in binary form must reproduce the above copyright
165: notice, this list of conditions and the following disclaimer in the
166: documentation and/or other materials provided with the distribution.
167:
168: 3. The name of the author may not be used to endorse or promote products
169: derived from this software without specific prior written permission.
170:
171: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
172: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
173: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
174: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
175: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
176: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
177: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
178: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
179: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
180: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
181: */
|