How to Implement Change Management and Conflict Resolution Workflows for Knowledge Graphs in Semantica
Semantica provides a built-in pipeline for building, versioning, and reconciling knowledge graphs through GraphBuilder, ConflictDetector, and SourceTracker components.
Knowledge graphs derived from multiple data sources inevitably face schema drift, entity duplication, and conflicting property values. The Semantica framework treats change management and conflict resolution as first-class architectural concerns, enabling teams to track graph evolution, detect inconsistencies automatically, and resolve disputes with full audit trails.
Core Components for Graph Change Management
Semantica's workflow orchestration centers on four interconnected modules:
| Component | Primary Role | Source Path |
|---|---|---|
GraphBuilder |
Orchestrates extraction, entity resolution, temporal graph construction, and snapshotting | semantica/kg/graph_builder.py |
ConflictDetector |
Analyzes entities and relationships for four conflict categories | semantica/conflicts/conflict_detector.py |
SourceTracker |
Maintains provenance for every property value contributing to conflicts | semantica/provenance/manager.py |
ProgressTracker |
Emits fine-grained progress events for monitoring long-running jobs | semantica/utils/progress_tracker.py |
These modules enable end-to-end change management workflows that preserve historical states while surfacing data quality issues for resolution.
Configuring Change Management in GraphBuilder
The GraphBuilder class in semantica/kg/graph_builder.py centralizes all change-management capabilities. Enable temporal support, versioning, and history tracking through constructor parameters:
from semantica.kg import GraphBuilder
builder = GraphBuilder(
merge_entities=True,
resolve_conflicts=True,
enable_temporal=True,
track_history=True,
version_snapshots=True,
temporal_granularity="day",
)
Key parameters for change management workflows:
enable_temporal– Activates time-aware graph constructionversion_snapshots– Enables point-in-time graph capturestrack_history– Preserves modification history for auditabilitytemporal_granularity– Defines resolution ("day", "hour", "minute")
Creating and Querying Temporal Snapshots
After building your graph, create immutable snapshots for version control:
from datetime import datetime
# Build from source data
graph = builder.build(sources=my_sources)
# Create a point-in-time snapshot
snapshot = builder.create_temporal_snapshot(timestamp=datetime.utcnow())
# Query historical state
historic_graph = builder.query_temporal(at=datetime(2024, 5, 1))
Snapshots integrate with any GraphStore implementation. Configure persistence via the graph_store attribute:
builder.graph_store = MyNeo4jStore(uri="bolt://localhost:7687")
builder.graph_store.save(graph)
Conflict Detection Categories
The ConflictDetector class in semantica/conflicts/conflict_detector.py implements four distinct conflict resolution workflows:
| Category | Detection Method | Trigger Scenario |
|---|---|---|
| Value conflicts | detect_value_conflicts() |
Same property holds different values across sources |
| Type conflicts | detect_type_conflicts() |
Entity identifier annotated with incompatible types |
| Temporal conflicts | detect_temporal_conflicts() |
Inconsistent timestamps (e.g., two founded_year values) |
| Logical conflicts | detect_logical_conflicts() |
Semantically incompatible type combinations |
Each detection method returns structured Conflict objects containing severity levels, confidence scores, and source provenance.
Step-by-Step Conflict Resolution Workflow
Step 1: Access the Detector
The conflict detector initializes automatically when resolve_conflicts=True:
conflict_detector = builder.conflict_detector
Step 2: Run Targeted Detection
Execute blanket scans or targeted queries:
# Detect all conflict types across entities
all_conflicts = conflict_detector.detect_conflicts(entities)
# Detect only value conflicts for specific property
name_conflicts = conflict_detector.detect_conflicts(
entities, method="value", property_name="name"
)
Step 3: Inspect Conflict Metadata
Each Conflict object exposes diagnostic fields:
for c in all_conflicts:
print(f"{c.conflict_id}: {c.severity} – {c.recommended_action}")
print(f" Confidence: {c.confidence}")
print(f" Sources: {[s.document_id for s in c.sources]}")
Step 4: Choose Resolution Strategy
Automatic resolution applies heuristics (e.g., most-recent-source-wins):
conflict_detector = ConflictDetector(auto_resolve=True)
Manual review surfaces conflicts to domain experts via the sources list:
critical = [c for c in all_conflicts if c.severity == "critical"]
# Present c.sources in analyst UI for confirmation
Step 5: Integrate Resolved Data
Filter or reconcile entities before rebuilding:
critical_ids = {c.entity_id for c in critical}
clean_entities = [
e for e in raw_entities
if e["id"] not in critical_ids
]
graph = builder.build(sources=[{
"entities": clean_entities,
"relationships": raw_rels
}])
Provenance Tracking with SourceTracker
Every conflict links to its origin through SourceTracker (accessed via conflicts.source_tracker and implemented in semantica/provenance/manager.py). This enables audit trails for regulatory compliance and debugging:
- Original document identifier
- Page or section location
- Extraction confidence score
- Timestamp of ingestion
The provenance graph is queryable for impact analysis—identify which source documents contributed to specific entity properties.
Complete Implementation Example
The following demonstrates end-to-end change management and conflict resolution:
from datetime import datetime
from semantica.kg import GraphBuilder
# ----------------------------------------------------------------------
# 1. Configure builder with full change management
# ----------------------------------------------------------------------
builder = GraphBuilder(
merge_entities=True,
resolve_conflicts=True,
enable_temporal=True,
track_history=True,
version_snapshots=True,
temporal_granularity="day",
conflict_detection={"auto_resolve": False}, # manual review
)
# ----------------------------------------------------------------------
# 2. Supply raw sources with intentional conflicts
# ----------------------------------------------------------------------
sources = [
{
"entities": [
{"id": "E1", "name": "Acme Corp", "type": "Organization", "source": "docA"},
{"id": "E1", "name": "Acme Corp.", "type": "Company", "source": "docB"},
],
"relationships": [
{"source": "E1", "target": "E2", "type": "EMPLOYS"},
],
},
]
# ----------------------------------------------------------------------
# 3. Build with automatic conflict detection
# ----------------------------------------------------------------------
graph = builder.build(sources=sources)
# ----------------------------------------------------------------------
# 4. Review generated conflict report
# ----------------------------------------------------------------------
conflicts = builder.conflict_detector.get_conflict_report()
for c in conflicts["conflicts"]:
print(
f"{c['conflict_id']} – {c['severity']} – "
f"{c['recommended_action']} – sources: {c['sources']}"
)
# ----------------------------------------------------------------------
# 5. Create versioned snapshot
# ----------------------------------------------------------------------
snapshot = builder.create_temporal_snapshot(timestamp=datetime.utcnow())
This workflow emits progress events through ProgressTracker, enabling real-time monitoring in CI pipelines or dashboard UIs.
Key Source Files Reference
| File | Responsibility |
|---|---|
semantica/kg/graph_builder.py |
Orchestration, temporal construction, snapshotting |
semantica/conflicts/conflict_detector.py |
Detection algorithms and conflict object generation |
semantica/provenance/manager.py |
Provenance tracking and audit trails |
semantica/utils/progress_tracker.py |
Progress event emission for monitoring |
semantica/kg/graph_store/neo4j_store.py |
Example persistence backend |
Summary
- Change management in Semantica relies on
GraphBuilderflags (enable_temporal,version_snapshots,track_history) to preserve graph evolution - Conflict resolution workflows use
ConflictDetectorto categorize and surface value, type, temporal, and logical inconsistencies - Provenance tracking via
SourceTrackerensures every conflict is traceable to source documents - Flexible resolution supports both automatic heuristics and manual analyst review
- Progress monitoring through
ProgressTrackerintegrates with operational tooling
Frequently Asked Questions
What conflict types does Semantica detect automatically?
Semantica detects four conflict categories: value conflicts (differing property values), type conflicts (incompatible entity types), temporal conflicts (inconsistent timestamps), and logical conflicts (semantically impossible type combinations). Each category has a dedicated detection method in conflict_detector.py.
How does Semantica track which source documents caused a conflict?
The SourceTracker class in semantica/provenance/manager.py records provenance for every property value, including document identifier, location, confidence score, and ingestion timestamp. This metadata attaches directly to Conflict objects for auditability.
Can I disable automatic conflict resolution and require manual review?
Yes. Set conflict_detection={"auto_resolve": False} in GraphBuilder or instantiate ConflictDetector(auto_resolve=False). This surfaces all conflicts through get_conflict_report() for analyst review rather than applying resolution heuristics.
What storage backends support temporal snapshots?
Any GraphStore implementation can persist snapshots. Semantica provides reference implementations including Neo4jStore in semantica/kg/graph_store/neo4j_store.py. The snapshot mechanism is storage-agnostic—backends receive the serialized graph state at the specified timestamp.
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 →