Semantica Entity Deduplication and Resolution at Scale: Architecture and Implementation
Semantica implements a deterministic, auditable pipeline for entity deduplication and resolution at scale through blocking, semantic clustering, and provenance-aware merging, enabling enterprise-grade entity resolution across billions of records.
Semantica is a graph-native infrastructure that sits beneath LLMs, vector stores, and agent frameworks to provide deterministic context and decision intelligence. The semantica-agi/semantica repository provides an end-to-end pipeline specifically architected to handle entity deduplication and resolution at scale, treating every merge operation as a traceable decision with full W3C PROV-O compliant lineage.
The Deduplication Pipeline Architecture
The deduplication subsystem follows a blocking → clustering → merging workflow implemented in semantica.deduplication. Unlike probabilistic black-box systems, Semantica exposes every stage as a configurable, auditable component.
The entry point is DuplicateDetector in semantica/deduplication/duplicate_detector.py, which performs candidate generation through blocking strategies, followed by semantic similarity scoring and optional clustering algorithms. The EntityMerger class then executes merge operations while preserving complete provenance metadata, ensuring downstream reasoning can trace the original source of every attribute.
from semantica.deduplication import DuplicateDetector, EntityMerger
entities = [
{"id": "e1", "name": "Acme Corporation", "domain": "acme.com"},
{"id": "e2", "name": "Acme Corp.", "domain": "acme.com"},
{"id": "e3", "name": "ACME Corp", "domain": "acme.co"},
{"id": "e4", "name": "Globex Industries", "domain": "globex.com"},
]
detector = DuplicateDetector(similarity_threshold=0.75, use_clustering=True)
candidates = detector.detect_duplicates(entities) # → candidate pairs
groups = detector.detect_duplicate_groups(entities) # → duplicate groups
merger = EntityMerger(preserve_provenance=True)
ops = merger.merge_duplicates(entities, strategy="keep_most_complete")
history = merger.get_merge_history() # audit log
Core Components for Entity Resolution
Blocking and Candidate Generation
The DuplicateDetector class implements configurable blocking strategies to reduce the quadratic complexity of pairwise comparisons. By defining blocking keys on high-cardinality attributes (such as email domains or phonetic name hashes), the system limits similarity computations to plausible candidate pairs only. The similarity_threshold parameter (defaulting to 0.75) controls the semantic distance cutoff for considering two entities as potential duplicates.
Semantic Clustering Strategies
When use_clustering=True, the detector applies graph-based clustering algorithms to candidate pairs, identifying transitive duplicate relationships. This resolves scenarios where entity_a matches entity_b, and entity_b matches entity_c, but entity_a and entity_c fall below the direct similarity threshold. The clustering module outputs disjoint duplicate groups ready for canonicalization.
Merge Strategies and Provenance Preservation
The EntityMerger in the deduplication module supports multiple resolution strategies, including "keep_most_complete" (which selects the record with the fewest null values) and custom rule-based approaches. Crucially, the preserve_provenance=True flag ensures that get_merge_history() returns a complete audit trail of which source records contributed to each field in the canonical entity. This metadata feeds directly into the ProvenanceManager (semantica/provenance/provenance_manager.py) for W3C PROV-O export.
Integration with the Knowledge Graph
Deduplication operations feed directly into the Context Graph construction via GraphBuilder in semantica/kg/graph_builder.py. When merge_entities=True is passed to the builder, resolved entities become single nodes in the knowledge graph, with temporal edges connecting historical variations. This enables bi-temporal fact storage, where the history of entity changes is queryable alongside current state.
The deduplication layer also interacts with ConflictDetector (semantica/conflicts/conflict_detector.py) to identify value, type, relational, and temporal conflicts before merging. This ensures that contradictory attributes (e.g., different incorporation dates for the same company) are flagged for human review or automated resolution policies rather than silently merged.
Decision Intelligence and Auditability
Every deduplication decision in Semantica is a first-class graph node. The ContextGraph.record_decision() method captures the rationale, confidence score, and outcome of merge operations, creating causal edges (CAUSED, INFLUENCED) between deduplication steps and downstream analytical decisions.
from semantica.context import ContextGraph
graph = ContextGraph(advanced_analytics=True)
merge_decision = graph.record_decision(
category="entity_resolution",
scenario="Merge duplicate supplier records from CRM and ERP",
reasoning="Shared domain, 85% name similarity, confirmed by VAT number match",
outcome="merged_supplier_entity",
confidence=0.93,
)
These decision nodes enable causal chain tracing via graph.trace_decision_chain() and compliance verification through check_decision_rules(), allowing enterprises to prove data lineage for GDPR Article 30 records or FDA 21 CFR Part 11 audit trails.
Polyglot Storage for Scalable Resolution
The deduplication pipeline abstracts storage through semantica.vector_store, supporting hybrid semantic search across multiple backends. For high-throughput entity resolution, you can configure:
- Vector indices: FAISS, Qdrant, pgVector, or AWS Neptune for embedding-based similarity search
- Graph stores: Neo4j, FalkorDB, Apache AGE, or RDF triple stores (Oxigraph, Blazegraph) for relationship-aware blocking
from semantica.vector_store import VectorStore
vs = VectorStore(backend="faiss", dimension=1536) # switch to "pgvector" for persistent storage
This polyglot approach allows the blocking stage to use approximate nearest neighbor (ANN) indices for scale, while the merge history persists to ACID-compliant graph databases for transactional integrity.
Summary
- Blocking → clustering → merging: The
DuplicateDetectorandEntityMergerclasses insemantica.deduplicationimplement a three-stage pipeline for scalable entity resolution. - Provenance-aware merges: Every merge operation preserves complete lineage compatible with W3C PROV-O standards, accessible via
get_merge_history(). - Graph-native integration: Resolved entities feed directly into
GraphBuilder(semantica/kg/graph_builder.py) to create canonical nodes in the Context Graph with bi-temporal tracking. - Decision auditability: Deduplication choices are recorded as decision objects with causal relationships, enabling full traceability via
ContextGraph.record_decision(). - Polyglot storage: The system supports FAISS, Qdrant, Neo4j, and RDF stores through
semantica.vector_store, allowing optimized backends for different scale requirements.
Frequently Asked Questions
How does Semantica handle entity deduplication at scale compared to traditional entity resolution systems?
Traditional entity resolution often relies on opaque probabilistic models or rigid deterministic rules. Semantica exposes explicit blocking, configurable similarity thresholds, and clustering algorithms while maintaining deterministic audit trails. The system scales through ANN vector indices for blocking and graph-based clustering for transitive resolution, processing billions of records without sacrificing explainability.
What provenance tracking is available for merge operations?
Every merge executed by EntityMerger with preserve_provenance=True generates a complete lineage record tracked by ProvenanceManager (semantica/provenance/provenance_manager.py). This includes the source identifier for every attribute value, the similarity scores that triggered the merge, and the decision rationale. The provenance graph exports to W3C PROV-O Turtle format via RDFExporter (semantica/export/rdf_exporter.py).
Which storage backends support high-throughput deduplication pipelines?
The VectorStore class (semantica/vector_store/vector_store.py) supports high-throughput similarity search via FAISS (in-memory), Qdrant (distributed), and pgVector (PostgreSQL). For transactional merge history and graph traversal, Semantica supports Neo4j, FalkorDB, Apache AGE, and AWS Neptune. RDF triple stores (Oxigraph, Blazegraph) are available for environments requiring SPARQL query capabilities.
How does the deduplication system integrate with LLM-based extraction pipelines?
The deduplication layer consumes entity streams from NamedEntityRecognizer and RelationExtractor (semantica/semantic_extract). After extraction, entities flow into DuplicateDetector for resolution, then into GraphBuilder for knowledge graph construction. This creates a closed loop where LLM-extracted entities are canonicalized before storage, preventing duplicate nodes from polluting the Context Graph used by downstream agents.
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 →