📄 genericrulereasoner.java
字号:
/******************************************************************
* File: GenericRuleReasoner.java
* Created by: Dave Reynolds
* Created on: 08-Jun-2003
*
* (c) Copyright 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
* [See end of file]
* $Id: GenericRuleReasoner.java,v 1.30 2007/01/02 11:50:58 andy_seaborne Exp $
*****************************************************************/
package com.hp.hpl.jena.reasoner.rulesys;
import com.hp.hpl.jena.mem.GraphMem;
import com.hp.hpl.jena.reasoner.*;
import com.hp.hpl.jena.reasoner.rulesys.impl.*;
import com.hp.hpl.jena.vocabulary.*;
import com.hp.hpl.jena.vocabulary.ReasonerVocabulary;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.rdf.model.*;
import java.util.*;
/**
* A reasoner interface that is able to invoke any of the useful
* rule engine combinations. The rule set can be set after the reasoner
* instance is created. The mode can be set to forward, backward or hybrid.
* The OWL-specific rule augmentation can be included. Each of these settings
* can be controlled using the configuration graph, specific methods calls or
* generic setParameter calls.
*
* @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
* @version $Revision: 1.30 $ on $Date: 2007/01/02 11:50:58 $
*/
public class GenericRuleReasoner extends FBRuleReasoner {
/** Prepared set of rules used for Backward-only mode */
protected LPRuleStore bRuleStore;
/** the current rule mode */
protected RuleMode mode = HYBRID;
/** Flag, if true we cache the closure of the pure rule set with its axioms */
protected static final boolean cachePreload = true;
/** Flag, if true then subClass and subProperty lattices will be optimized using TGCs, only applicable to HYBRID reasoners */
protected boolean enableTGCCaching = false;
/** Flag, if true then rules will be augmented by OWL translations of the schema */
protected boolean enableOWLTranslation = false;
/** Optional set of preprocessing hooks to be run in sequence during preparation time, only applicable to HYBRID modes */
protected HashSet preprocessorHooks;
/** Flag, if true then find results will be filtered to remove functors and illegal RDF */
public boolean filterFunctors = true;
/** A prebuilt copy of the OWL translation hook */
private static final OWLRuleTranslationHook owlTranslator = new OWLRuleTranslationHook();
/** Constant - the mode description for pure forward chaining */
public static final RuleMode FORWARD = new RuleMode("forward");
/** Constant - the mode description for pure forward chaining, using RETE engine */
public static final RuleMode FORWARD_RETE = new RuleMode("forwardRETE");
/** Constant - the mode description for pure backward chaining */
public static final RuleMode BACKWARD = new RuleMode("backward");
/** Constant - the mode description for mixed forward/backward, this is the default mode */
public static final RuleMode HYBRID = new RuleMode("hybrid");
// =======================================================================
// Constructors
/**
* 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 GenericRuleReasoner(List rules) {
super(rules);
}
/**
* 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 GenericRuleReasoner(ReasonerFactory factory, Resource configuration) {
super(factory);
this.configuration = configuration;
if (configuration != null) loadConfiguration( configuration );
}
/**
* 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 GenericRuleReasoner(List rules, ReasonerFactory factory) {
super(rules, factory);
}
/**
* Internal constructor, used to generated a partial binding of a schema
* to a rule reasoner instance.
*/
protected GenericRuleReasoner(List rules, Graph schemaGraph, ReasonerFactory factory, RuleMode mode) {
this(rules, factory);
this.schemaGraph = schemaGraph;
this.mode = mode;
}
// =======================================================================
// Parameter control
/**
* Set the direction of rule inference desired.
* If set to a pure mode (FORWARD, BACKWARD) then the rules will be
* interpreted as operating in that direction which ever direction
* they were written in. In HYBRID mode then the direction of the rule
* itself which control whether it is used in forward or backward mode.
* In addition, HYBRID mode allows forward rules to generate addition
* backward rules.
*/
public void setMode(RuleMode mode) {
if (schemaGraph != null) {
throw new ReasonerException("Can't change mode of a reasoner bound to a schema");
}
this.mode = mode;
preload = null;
bRuleStore = null;
}
/**
* Set (or change) the rule set that this reasoner should execute.
* This will not affect inference models already created from this reasoner.
* @param rules a list of Rule objects
*/
public void setRules(List rules) {
// Currently redunant but it will differ from the inherited
// version in the future
super.setRules(rules);
}
/**
* Set to true to enable translation of selected parts of an OWL schema
* to additional rules. At present only intersction statements are handled this way.
* The translation is only applicable in HYBRID mode.
*/
public void setOWLTranslation(boolean enableOWLTranslation) {
if (enableOWLTranslation && (mode != HYBRID)) {
throw new ReasonerException("Can only enable OWL rule translation in HYBRID mode");
}
this.enableOWLTranslation = enableOWLTranslation;
if (enableOWLTranslation) {
addPreprocessingHook(owlTranslator);
} else {
removePreprocessingHook(owlTranslator);
}
}
/**
* Set to true to enable caching of subclass/subproperty lattices in a
* specialized cache rather than using the rule systems. This has substantially
* higher performance but it is done as a separate initialization pass and so
* can only work correct with some rule sets. This is only guaranteed to be implemented
* for the HYBRID mode.
*/
public void setTransitiveClosureCaching(boolean enableTGCCaching) {
this.enableTGCCaching = enableTGCCaching;
}
/**
* Set to true to cause functor-valued literals to be dropped from rule output.
* Default is true.
*/
public void setFunctorFiltering(boolean param) {
filterFunctors = param;
}
/**
* Add a new preprocessing hook defining an operation that
* should be run when the inference graph is being prepared. This can be
* used to generate additional data-dependent rules or translations.
* This is only guaranted to be implemented for the HYBRID mode.
*/
public void addPreprocessingHook(RulePreprocessHook hook) {
if (preprocessorHooks == null) {
preprocessorHooks = new HashSet();
}
preprocessorHooks.add(hook);
}
/**
* Remove a preprocessing hook. defining an operation that
*/
public void removePreprocessingHook(RulePreprocessHook hook) {
if (preprocessorHooks != null) {
preprocessorHooks.remove(hook);
}
}
protected boolean doSetResourceParameter( Property parameter, Resource value )
{
if (parameter.equals( JenaModelSpec.ruleSetURL ))
{
addRules( Rule.rulesFromURL( value.getURI() ) );
}
else if (parameter.equals( JenaModelSpec.ruleSet ))
{
StmtIterator that = value.listProperties( JenaModelSpec.ruleSetURL );
while (that.hasNext())
{
addRules( Rule.rulesFromURL( that.nextStatement().getResource().getURI() ) );
}
StmtIterator it = value.listProperties( JenaModelSpec.hasRule );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -