📄 fbrulereasoner.java
字号:
/******************************************************************
* File: FBRuleReasoner.java
* Created by: Dave Reynolds
* Created on: 29-May-2003
*
* (c) Copyright 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
* [See end of file]
* $Id: FBRuleReasoner.java,v 1.24 2007/01/12 14:13:51 chris-dollin Exp $
*****************************************************************/
package com.hp.hpl.jena.reasoner.rulesys;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.*;
import com.hp.hpl.jena.shared.*;
import com.hp.hpl.jena.vocabulary.ReasonerVocabulary;
import com.hp.hpl.jena.graph.*;
import java.util.*;
/**
* Rule-based reasoner interface. This is the default rule reasoner to use.
* It supports both forward reasoning and backward reasoning, including use
* of forward rules to generate and instantiate backward rules.
*
* @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
* @version $Revision: 1.24 $ on $Date: 2007/01/12 14:13:51 $
*/
public class FBRuleReasoner implements RuleReasoner {
/** The parent reasoner factory which is consulted to answer capability questions */
protected ReasonerFactory factory;
/** The rules to be used by this instance of the forward engine */
protected List rules = new ArrayList();
/** A precomputed set of schema deductions */
protected Graph schemaGraph;
/** Flag to set whether the inference class should record derivations */
protected boolean recordDerivations = false;
/** Flag which, if true, enables tracing of rule actions to logger.info */
boolean traceOn = false;
// boolean traceOn = true;
/** Flag, if true we cache the closure of the pure rule set with its axioms */
protected static final boolean cachePreload = true;
/** The cached empty closure, if wanted */
protected InfGraph preload;
/** The original configuration properties, if any */
protected Resource configuration;
/** The graph capabilities of the infgraphs generated by this reasoner */
protected Capabilities capabilities;
/**
* Constructor. This is the raw version that does not reference a ReasonerFactory
* and so has no capabilities description.
* @param rules a list of Rule instances which defines the ruleset to process
*/
public FBRuleReasoner(List rules) {
if (rules == null) throw new NullPointerException( "null rules" );
this.rules = rules;
}
/**
* Constructor
* @param factory the parent reasoner factory which is consulted to answer capability questions
*/
public FBRuleReasoner(ReasonerFactory factory) {
this( new ArrayList(), factory);
}
/**
* Constructor
* @param factory the parent reasoner factory which is consulted to answer capability questions
* @param configuration RDF node to configure the rule set and mode, can be null
*/
public FBRuleReasoner(ReasonerFactory factory, Resource configuration) {
this( new ArrayList(), factory);
this.configuration = configuration;
if (configuration != null) loadConfiguration( configuration );
}
/**
load the configuration from the configuring Resource (in its Model).
*/
protected void loadConfiguration( Resource configuration )
{
StmtIterator i = configuration.listProperties();
while (i.hasNext()) {
Statement st = i.nextStatement();
doSetRDFNodeParameter( st.getPredicate(), st.getObject() );
}
}
/**
* Constructor
* @param rules a list of Rule instances which defines the ruleset to process
* @param factory the parent reasoner factory which is consulted to answer capability questions
*/
public FBRuleReasoner(List rules, ReasonerFactory factory) {
this(rules);
this.factory = factory;
}
/**
* Internal constructor, used to generated a partial binding of a schema
* to a rule reasoner instance.
*/
protected FBRuleReasoner(List rules, Graph schemaGraph, ReasonerFactory factory) {
this(rules, factory);
this.schemaGraph = schemaGraph;
}
/**
Add the given rules to the current set and answer this Reasoner. Provided
so that the Factory can deal out reasoners with specified rulesets.
There may well be a better way to arrange this.
TODO review & revise
*/
public FBRuleReasoner addRules(List rules) {
List combined = new ArrayList( this.rules );
combined.addAll( rules );
setRules( combined );
return this;
}
/**
* Return a description of the capabilities of this reasoner encoded in
* RDF. These capabilities may be static or may depend on configuration
* information supplied at construction time. May be null if there are
* no useful capabilities registered.
*/
public Model getReasonerCapabilities() {
if (factory != null) {
return factory.getCapabilities();
} else {
return null;
}
}
/**
* Add a configuration description for this reasoner into a partial
* configuration specification model.
* @param configSpec a Model into which the configuration information should be placed
* @param base the Resource to which the configuration parameters should be added.
*/
public void addDescription(Model configSpec, Resource base) {
if (configuration != null) {
StmtIterator i = configuration.listProperties();
while (i.hasNext()) {
Statement st = i.nextStatement();
configSpec.add(base, st.getPredicate(), st.getObject());
}
}
}
/**
* Determine whether the given property is recognized and treated specially
* by this reasoner. This is a convenience packaging of a special case of getCapabilities.
* @param property the property which we want to ask the reasoner about, given as a Node since
* this is part of the SPI rather than API
* @return true if the given property is handled specially by the reasoner.
*/
public boolean supportsProperty(Property property) {
if (factory == null) return false;
Model caps = factory.getCapabilities();
Resource root = caps.getResource(factory.getURI());
return caps.contains(root, ReasonerVocabulary.supportsP, property);
}
/**
* Precompute the implications of a schema graph. The statements in the graph
* will be combined with the data when the final InfGraph is created.
*/
public Reasoner bindSchema(Graph tbox) throws ReasonerException {
if (schemaGraph != null) {
throw new ReasonerException("Can only bind one schema at a time to an OWLRuleReasoner");
}
FBRuleInfGraph graph = new FBRuleInfGraph(this, rules, getPreload(), tbox);
graph.prepare();
FBRuleReasoner fbr = new FBRuleReasoner(rules, graph, factory);
fbr.setDerivationLogging(recordDerivations);
fbr.setTraceOn(traceOn);
return fbr;
}
/**
* Precompute the implications of a schema Model. The statements in the graph
* will be combined with the data when the final InfGraph is created.
*/
public Reasoner bindSchema(Model tbox) throws ReasonerException {
return bindSchema(tbox.getGraph());
}
/**
* Attach the reasoner to a set of RDF data to process.
* The reasoner may already have been bound to specific rules or ontology
* axioms (encoded in RDF) through earlier bindRuleset calls.
*
* @param data the RDF data to be processed, some reasoners may restrict
* the range of RDF which is legal here (e.g. syntactic restrictions in OWL).
* @return an inference graph through which the data+reasoner can be queried.
* @throws ReasonerException if the data is ill-formed according to the
* constraints imposed by this reasoner.
*/
public InfGraph bind( Graph data ) throws ReasonerException {
ReificationStyle style = data.getReifier().getStyle();
Graph schemaArg = schemaGraph == null ? getPreload() : (FBRuleInfGraph) schemaGraph;
FBRuleInfGraph graph = new FBRuleInfGraph( this, rules, schemaArg, style );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -