Semantica Reasoning Engines: Complete Guide to 9 Built-in Inference Strategies
Semantica provides nine distinct reasoning engines—including ReteEngine, SPARQLReasoner, TemporalReasoningEngine, and DatalogReasoner—that implement specialized inference strategies ranging from forward-chaining rules to abductive hypothesis generation, all accessible via a unified Python interface and CLI.
The semantica-agi/semantica repository ships with a modular collection of purpose-built reasoning engines designed for different inference paradigms. Each engine implements a consistent contract defined in the core framework, accepting Facts as atomic data units and exposing standardized methods such as match_patterns() and execute_matches(), while the CLI validates engine selections against the registry defined in semantica/cli/commands/reason.py.
Available Reasoning Engines in Semantica
ReteEngine: High-Performance Forward Chaining
The ReteEngine implements the Rete algorithm for efficient forward-chaining rule matching. Located in semantica/reasoning/rete_engine.py, this engine maintains a network of alpha, beta, and terminal nodes to minimize repeated rule condition evaluations, making it ideal for high-throughput scenarios with large fact bases.
Use this engine when you need to evaluate many facts against extensive rule sets repeatedly.
from semantica.reasoning.rete_engine import ReteEngine, Fact, Rule
engine = ReteEngine()
engine.build_network([Rule(...), ...]) # load your rule set
engine.add_fact(Fact("f1", "Person", ["John"]))
matches = engine.match_patterns()
print(matches) # → list of Rule activations
SPARQLReasoner: Declarative Graph Queries
The SPARQLReasoner (semantica/reasoning/sparql_reasoner.py) executes SPARQL queries over external triple stores, translating query results into logical conclusions. This engine connects to SPARQL-compatible endpoints such as Blazegraph or GraphDB, allowing you to leverage existing graph infrastructure for declarative reasoning.
from semantica.reasoning.sparql_reasoner import SPARQLReasoner
engine = SPARQLReasoner(endpoint="http://my-graph:7200/repositories/myrepo")
results = engine.query("SELECT ?s WHERE { ?s a <http://example.org/Person> }")
print(results)
TemporalReasoningEngine: Time-Aware Inference
For domains where temporal validity matters, the TemporalReasoningEngine (semantica/kg/temporal_reasoning.py) provides temporal operators including at_time, since, and before. This engine performs consistency validation on time-annotated graphs and supports versioned data modeling.
from semantica.kg.temporal_reasoning import TemporalReasoningEngine
engine = TemporalReasoningEngine()
engine.add_fact(Fact("f1", "Employment", ["Alice", "Acme", "2020-01-01"]))
# Query facts that were true at a specific timestamp
past_facts = engine.at_time("2020-06-01")
print(past_facts)
OntologyEngine: SKOS Vocabulary Management
The OntologyEngine (semantica/ontology/engine.py) supplies SKOS-style ontology utilities for managing concept hierarchies, broader/narrower relationships, and synonym resolution. This engine excels at building controlled vocabularies and semantic enrichments.
from semantica.ontology.engine import OntologyEngine
onto = OntologyEngine()
onto.load_vocab("my_skos.ttl")
broader = onto.broader("http://example.org/ConceptA")
print(broader)
GraphReasoner: Generic Graph Traversal
GraphReasoner (semantica/reasoning/graph_reasoner.py) offers lightweight graph-traversal capabilities including path finding, reachability analysis, and sub-graph extraction. Use this engine when you need custom graph analyses without deploying a full SPARQL stack.
from semantica.reasoning.graph_reasoner import GraphReasoner
g = GraphReasoner()
g.add_edge("A", "B")
g.add_edge("B", "C")
paths = g.reachable("A", "C")
print(paths) # → [['A', 'B', 'C']]
DatalogReasoner: Recursive Logic Programming
The DatalogReasoner (semantica/reasoning/datalog_reasoner.py) implements a Datalog-style bottom-up inference engine supporting recursive rules and stratified negation. This engine fits logic programming tasks that require declarative, rule-based recursive querying.
from semantica.reasoning.datalog_reasoner import DatalogReasoner
engine = DatalogReasoner()
engine.add_rule("ancestor(X,Y) :- parent(X,Y).")
engine.add_rule("ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).")
engine.add_fact(Fact("f1", "parent", ["Bob", "Carol"]))
engine.add_fact(Fact("f2", "parent", ["Carol", "Dave"]))
print(engine.query("ancestor(Bob, Dave)")) # → True
AbductiveReasoner: Hypothesis Generation
The AbductiveReasoner (semantica/reasoning/abductive_reasoner.py) generates plausible hypotheses to explain observed facts. This engine performs abductive inference, making it suitable for diagnostic workflows and explanation-oriented tasks where you need to identify probable causes.
from semantica.reasoning.abductive_reasoner import AbductiveReasoner
engine = AbductiveReasoner()
engine.add_fact(Fact("symptom1", "HasSymptom", ["Fever"]))
hypotheses = engine.abduct(target="DiseaseX")
print(hypotheses) # → possible causes explaining the observed symptom
DeductiveReasoner: Classic Forward Chaining
DeductiveReasoner (semantica/reasoning/deductive_reasoner.py) performs classic forward-chain deduction using rule bodies to derive new facts. Unlike the ReteEngine, this implementation does not use network optimization, making it suitable for straightforward production-rule systems with moderate complexity.
from semantica.reasoning.deductive_reasoner import DeductiveReasoner
engine = DeductiveReasoner()
engine.add_rule(Rule(conditions=["Person(?x)"], conclusion="Mortal(?x)"))
engine.add_fact(Fact("f1", "Person", ["Socrates"]))
engine.run()
print(engine.facts) # includes the derived Mortal(Socrates) fact
ReasoningEngineWithProvenance: Audit-Ready Inference
The ReasoningEngineWithProvenance (semantica/reasoning/reasoning_provenance.py) wraps any base engine to capture detailed provenance information including activation keys and rule lineage. This wrapper is essential for auditing, reproducibility requirements, or scenarios where you must trace why a specific inference occurred.
from semantica.reasoning.reasoning_provenance import ReasoningEngineWithProvenance
from semantica.reasoning.rete_engine import ReteEngine
base_engine = ReteEngine()
engine = ReasoningEngineWithProvenance(base_engine)
engine.build_network([...])
engine.add_fact(...)
matches = engine.match_patterns()
engine.execute_matches(matches) # provenance recorded internally
print(engine.provenance_report())
Unified Interface and CLI Integration
All Semantica reasoning engines share a common contract defined in the framework's core interfaces. Each engine accepts collections of Facts and exposes methods including match_patterns(), execute_matches(), and reset(). This standardization allows you to swap engines without changing your application logic.
The CLI command semantica reason run --engine <name> validates the supplied engine name against the internal registry in semantica/cli/commands/reason.py, raising clear errors for unsupported selections.
Summary
- Semantica provides nine reasoning engines covering rule-based (Rete, Datalog, Deductive), graph-based (SPARQL, GraphReasoner), temporal (TemporalReasoningEngine), ontological (OntologyEngine), and abductive inference (AbductiveReasoner) paradigms.
- All engines implement a unified interface accepting Facts and exposing
match_patterns()andexecute_matches()methods. - ReasoningEngineWithProvenance wraps any engine to capture activation keys and rule lineage for audit trails.
- Engine selection is validated through the CLI in
semantica/cli/commands/reason.pyusing the--engineflag.
Frequently Asked Questions
How do I choose between ReteEngine and DeductiveReasoner?
ReteEngine uses the Rete algorithm with network optimization to handle large rule sets and high fact volumes efficiently, while DeductiveReasoner provides a simpler forward-chaining implementation without the memory overhead of network maintenance. Choose ReteEngine for production systems with complex rule bases; use DeductiveReasoner for simpler logic or when memory constraints prevent network construction.
Can I combine multiple reasoning engines in a single Semantica pipeline?
Yes. Since all engines share the common Fact-based interface, you can chain them by feeding the output Facts from one engine into another. For audit requirements, wrap any combination using ReasoningEngineWithProvenance to maintain traceability across the entire pipeline.
Does the TemporalReasoningEngine support custom time formats?
The TemporalReasoningEngine (semantica/kg/temporal_reasoning.py) expects ISO-formatted timestamps by default for its at_time, since, and before operators. You should normalize custom time formats to ISO-8601 strings before adding facts to ensure consistent temporal comparisons and consistency validation.
What is the difference between SPARQLReasoner and GraphReasoner?
SPARQLReasoner requires an external SPARQL endpoint (such as GraphDB or Blazegraph) and executes declarative queries over remote triple stores, while GraphReasoner operates on in-memory graphs with lightweight traversal methods like reachable() and add_edge(). Use SPARQLReasoner for enterprise linked-data integration; use GraphReasoner for embedded graph analysis without external dependencies.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →