001: /******************************************************************
002: * File: PropertyBRWRule.java
003: * Created by: Dave Reynolds
004: * Created on: 28-Jan-03
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: PropertyBRWRule.java,v 1.14 2008/01/02 12:06:44 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rdfsReasoner1;
010:
011: import com.hp.hpl.jena.reasoner.*;
012: import com.hp.hpl.jena.graph.*;
013: import com.hp.hpl.jena.vocabulary.*;
014: import com.hp.hpl.jena.util.iterator.*;
015:
016: import java.util.*;
017:
018: /**
019: * A special case of a backchaing rule to handle the nasty case
020: * of "anything mentioned in predicated position is a Property".
021: *
022: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
023: * @version $Revision: 1.14 $ on $Date: 2008/01/02 12:06:44 $
024: */
025: public class PropertyBRWRule extends BRWRule {
026:
027: /**
028: * Constructor
029: */
030: public PropertyBRWRule() {
031: super (new TriplePattern(Node.createVariable("p"), RDF.type
032: .asNode(), RDF.Property.asNode()), new TriplePattern(
033: null, Node.createVariable("s"), null));
034: }
035:
036: /**
037: * Use the rule to implement the given query. This will
038: * instantiate the rule against the query, run the new query
039: * against the whole reasoner+rawdata again and then rewrite the
040: * results from that query according the rule.
041: * @param query the query being processed
042: * @param infGraph the parent InfGraph that invoked us, will be called recursively
043: * @param data the raw data graph which gets passed back to the reasoner as part of the recursive invocation
044: * @param firedRules set of rules which have already been fired and should now be blocked
045: * @return a ExtendedIterator which aggregates the matches and rewrites them
046: * according to the rule
047: */
048: public ExtendedIterator execute(TriplePattern query,
049: InfGraph infGraph, Finder data, HashSet firedRules) {
050: RDFSInfGraph bRr = (RDFSInfGraph) infGraph;
051: Node prop = query.getSubject();
052: if (bRr.getScanProperties()) {
053: // All properties are cached in the subProperty graph
054: // That in turn will be accessed via the rules generated by the subPropertyOf domain/range
055: // rules do don't need to do anything here
056: return NullIterator.instance;
057: } else {
058: // Have to scan all the raw data for property usage
059: TriplePattern pattern = instantiate(body, query);
060: return new RewriteIterator(bRr.findRawWithContinuation(
061: body, data), this );
062: }
063: }
064:
065: /**
066: * Inner class. Rewrites property node lists in to (p, type, Property)
067: * assertions.
068: */
069: static class PropertyNodeIterator extends UniqueExtendedIterator {
070:
071: /**
072: * Constructor
073: * @param underlying the iterator whose results are to be rewritten
074: * @param rule the BRWRule which defines the rewrite
075: */
076: public PropertyNodeIterator(Iterator underlying) {
077: super (underlying);
078: }
079:
080: /**
081: * Fetch the next object to be returned, only if not already seen.
082: * Filters on the property rather than the generated triple.
083: *
084: * @return the object to be returned or null if the object has been filtered.
085: */
086: protected Object nextIfNew() {
087: Node prop = (Node) super .next();
088: if (seen.add(prop)) {
089: return new Triple(prop, RDF.type.asNode(), RDF.Property
090: .asNode());
091: } else {
092: return null;
093: }
094: }
095:
096: } // End of inner class - ResourceRewriteIterator
097:
098: }
099:
100: /*
101: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
102: All rights reserved.
103:
104: Redistribution and use in source and binary forms, with or without
105: modification, are permitted provided that the following conditions
106: are met:
107:
108: 1. Redistributions of source code must retain the above copyright
109: notice, this list of conditions and the following disclaimer.
110:
111: 2. Redistributions in binary form must reproduce the above copyright
112: notice, this list of conditions and the following disclaimer in the
113: documentation and/or other materials provided with the distribution.
114:
115: 3. The name of the author may not be used to endorse or promote products
116: derived from this software without specific prior written permission.
117:
118: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
119: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
120: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
121: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
122: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
123: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
124: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
125: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
126: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
127: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
128: */
|