How to Implement Conflict Detection Across Overlapping Knowledge Sources in Semantica
Use the ConflictDetector class from semantica.conflicts to scan entities from multiple sources, group them by ID, and identify value, type, temporal, logical, and relationship conflicts while tracking full provenance via SourceTracker.
Implementing conflict detection across overlapping knowledge sources is essential when building knowledge graphs from heterogeneous data. The Semantica framework provides a complete pipeline for identifying, reporting, and resolving conflicts between sources that describe the same entities. This article walks through the core components, detection flow, and practical implementation using the actual source code from the semantica-agi/semantica repository.
Core Components of the Conflict Detection Pipeline
The Semantica conflict detection system consists of three primary classes working together:
| Component | Role | Key File |
|---|---|---|
ConflictDetector |
Scans entities and discovers conflicts across multiple dimensions | semantica/conflicts/conflict_detector.py |
SourceTracker |
Records provenance (document, confidence, timestamps) for traceability | semantica/conflicts/source_tracker.py |
ConflictResolver |
Applies resolution strategies (voting, weighted, recency) to conflicts | semantica/conflicts/conflict_resolver.py |
Data Model Requirements
Entities must be plain Python dictionaries with a unique identifier. Source metadata enables conflict detection across overlapping knowledge sources by preserving where each value originated:
{
"id": "company_123",
"name": "Acme Corp",
"revenue": 1500000,
"source": "financial_report_q1.pdf",
"confidence": 0.92,
"metadata": {"timestamp": "2024-03-01"},
}
The SourceTracker captures this provenance through track_property_source (lines 48-61 in source_tracker.py), storing document references, page numbers, confidence scores, and timestamps for every property value.
Step-by-Step Conflict Detection Flow
Step 1: Initialize Source Tracking
Create a SourceTracker instance to maintain provenance chains:
from semantica.conflicts import SourceTracker
tracker = SourceTracker()
Step 2: Create the Conflict Detector
Pass the tracker to ConflictDetector for integrated provenance capture:
from semantica.conflicts import ConflictDetector
detector = ConflictDetector(source_tracker=tracker)
Step 3: Run Detection on Combined Sources
Feed all entities from overlapping sources into detect_conflicts:
conflicts = detector.detect_conflicts(
entities=all_entities, # List[Dict] from all sources
method="all", # Detect every conflict type
)
Step 4: Internal Processing Pipeline
The ConflictDetector executes this sequence (see conflict_detector.py):
- Group by entity ID — builds
entity_groupsdictionary (lines 71-79) - Collect property values and sources — creates
SourceReferenceobjects for each value (lines 44-61 indetect_value_conflicts) - Identify conflicts — triggered when
unique_values > 1(lines 71-79) - Calculate confidence and severity — via
_calculate_conflict_confidence(lines 558-590) and_calculate_severity(lines 775-802) - Store
Conflictobjects — appended toself.detected_conflicts(lines 86-89)
Step 5: Generate Reports
Obtain a structured summary with counts, types, and detailed conflict listings:
report = detector.get_conflict_report()
Types of Conflicts Detected
| Conflict Type | Description | Detection Method Location |
|---|---|---|
| Value conflict | Same property holds different values across sources | detect_value_conflicts (lines 36-117) |
| Type conflict | Entity classified with different types | detect_type_conflicts (lines 555-610) |
| Temporal conflict | Dates or timestamps disagree | detect_temporal_conflicts (lines 818-887) |
| Logical conflict | Incompatible type combinations (e.g., Person vs. Organization) |
detect_logical_conflicts (lines 1002-1074) |
| Relationship conflict | Relationship properties differ | detect_relationship_conflicts (lines 361-423) |
| Entity-wide conflict | Value detection run across all entity properties | detect_entity_conflicts (lines 483-545) |
Practical Implementation Examples
Example 1: Detect Value Conflicts Across Two HR Systems
from semantica.conflicts import ConflictDetector, SourceTracker
# Source A: Internal HR system
source_a = [
{"id": "person_1", "name": "Alice", "age": 30,
"source": "HR_system_A.csv", "confidence": 0.9},
{"id": "person_2", "name": "Bob", "age": 45,
"source": "HR_system_A.csv", "confidence": 0.85},
]
# Source B: Contractor database
source_b = [
{"id": "person_1", "name": "Alicia", "age": 30,
"source": "HR_system_B.xlsx", "confidence": 0.95},
{"id": "person_2", "name": "Bob", "age": 46,
"source": "HR_system_B.xlsx", "confidence": 0.88},
]
# Combine and detect
all_entities = source_a + source_b
tracker = SourceTracker()
detector = ConflictDetector(source_tracker=tracker)
conflicts = detector.detect_conflicts(all_entities, method="value")
print(f"Detected {len(conflicts)} conflicts")
for c in conflicts:
print(f"- {c.entity_id}.{c.property_name}: {c.conflicting_values}")
# Generate report
report = detector.get_conflict_report()
print(report["by_type"])
Output:
Detected 2 conflicts
- person_1.name: ['Alice', 'Alicia']
- person_2.age: [45, 46]
Example 2: Automatic Conflict Resolution
from semantica.conflicts import ConflictResolver, ConflictDetector, SourceTracker
# Assume previous detection produced `conflicts`
tracker = SourceTracker()
detector = ConflictDetector(source_tracker=tracker)
conflicts = detector.detect_conflicts(all_entities, method="value")
resolver = ConflictResolver(default_strategy="voting")
resolution_results = resolver.resolve_conflicts(conflicts)
for r in resolution_results:
print(f"{r.conflict_id} → {r.resolved_value} "
f"({r.resolution_strategy}, confidence={r.confidence:.2f})")
Alternative strategies: credibility_weighted, most_recent, highest_confidence — see ResolutionStrategy enum in conflict_resolver.py.
Example 3: Traceability and Provenance Querying
conflict = conflicts[0] # e.g., person_1 name conflict
# Retrieve all sources for this specific property
prop_source = tracker.get_property_sources(
conflict.entity_id,
conflict.property_name
)
print("Conflicting sources:")
for src in prop_source.sources:
print(f"- {src.document} (page {src.page}, "
f"confidence={src.confidence}, time={src.timestamp})")
# Generate full traceability chain
chain = tracker.generate_traceability_chain(
entity_id=conflict.entity_id,
property_name=conflict.property_name
)
The generate_traceability_chain method (lines 437-528 in source_tracker.py) produces an auditable path showing exactly which documents contributed each value.
Provenance Architecture: How Source Tracking Works
The SourceTracker maintains a mapping structure that enables conflict detection across overlapping knowledge sources to remain fully auditable:
track_property_source(lines 48-61): Called automatically during detection to record origin metadataget_property_sources: Retrieves all contributing sources for any entity-property pairgenerate_traceability_chain(lines 437-528): Builds human-readable provenance chains
This architecture ensures that every detected conflict carries complete lineage information, supporting regulatory compliance and debugging.
Performance and Scalability Considerations
The ConflictDetector groups entities using dictionary lookups (O(1)) before performing pairwise value comparisons. For large datasets:
- Filter by entity type before detection using
entity_typeparameter - Use specific detection methods (
method="value"instead of"all") to reduce computation - Leverage confidence thresholds in
SourceTrackerto exclude low-credibility sources early
Key Source Files Reference
| File | Purpose | Key Lines |
|---|---|---|
semantica/conflicts/conflict_detector.py |
Core detection logic | 36-117 (value), 555-610 (type), 818-887 (temporal) |
semantica/conflicts/source_tracker.py |
Provenance and traceability | 48-61 (tracking), 437-528 (chains) |
semantica/conflicts/conflict_resolver.py |
Resolution strategies | Full ResolutionStrategy enum |
tests/conflicts/test_conflicts.py |
Usage patterns and validations | Complete test suite |
tests/kg/test_kg.py |
Knowledge graph integration | GraphBuilder integration examples |
Summary
- Use
ConflictDetectorwithSourceTrackerto implement conflict detection across overlapping knowledge sources with full provenance preservation - Initialize the pipeline in three steps: create tracker, instantiate detector, feed combined entity list
- Choose detection scope via
methodparameter:"value","type","temporal","logical","relationship", or"all" - Access six conflict types through dedicated methods in
conflict_detector.py, each with documented line ranges - Generate traceability chains using
SourceTracker.generate_traceability_chainfor audit requirements - Apply automatic resolution through
ConflictResolverwith pluggable strategies (voting, credibility-weighted, recency) - Reference test files in
tests/conflicts/for validated implementation patterns
Frequently Asked Questions
How does the ConflictDetector group entities from different sources?
The detector groups entities by their id or entity_id field using a dictionary structure (entity_groups) at lines 71-79 of conflict_detector.py. All entities sharing the same identifier are collected into a list, then their properties are compared pairwise to identify discrepancies.
What information does a Conflict object contain?
Each Conflict object stores: the entity ID, property name, conflicting values as a list, conflict type classification, severity score, confidence calculation, and a list of source dictionaries documenting where each value originated. This complete provenance enables both manual review and automated resolution.
Can I detect conflicts without using SourceTracker?
Yes, SourceTracker is optional—ConflictDetector will create a default tracker if none is provided. However, omitting explicit source tracking loses provenance information, making traceability chains unavailable and reducing resolution strategy options for credibility-weighted decisions.
How do I choose between resolution strategies?
Select based on your data characteristics: voting works well with many equivalent sources; credibility_weighted prioritizes high-confidence sources; most_recent resolves temporal data conflicts; highest_confidence selects single best source. Pass your choice to ConflictResolver(default_strategy="...") or per-call via strategy parameter.
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 →