Executive summary

Entity resolution is the problem of deciding when records from different sources refer to the same real-world entity. This lab documents a genericized approach to blocking, scoring, and graph clustering — the kinds of patterns used on knowledge-graph data platforms — without exposing proprietary data, code, or employer-specific outcomes.

TODO: Replace architecture diagrams and any quantitative notes with public-safe materials you own. Do not publish confidential pipeline metrics.

Problem

Multiple systems emit partially overlapping identifiers, attributes, and relationships. Naive joins either miss true matches or over-merge distinct entities. The goal is a repeatable pipeline that:

  1. Reduces pairwise comparison cost via blocking
  2. Scores candidate pairs with interpretable features
  3. Clusters linked pairs into entity components
  4. Writes a durable identity graph for downstream consumers

Context

Knowledge-graph platforms often sit between operational data stores and analytical consumers. Latency, auditability, and lineage matter as much as raw match rate. This write-up stays at the level of patterns and tradeoffs, not a specific deployment.

Role

Design and implementation of resolution stages, evaluation harness ideas, and graph modeling choices — framed as personal technical notes.

Constraints

  • Scale: pairwise all-to-all is infeasible at interesting volumes
  • Noise: missing fields, inconsistent formatting, temporal drift
  • Operability: pipelines must be replayable and observable
  • Privacy: no real PII or confidential firm data in this public case study

Approach

  1. Normalize inputs into a common record model
  2. Block on high-recall keys (e.g., normalized name tokens + geography proxies)
  3. Score candidates with a small set of features (string similarity, shared identifiers, structural hints)
  4. Cluster above-threshold links into connected components
  5. Materialize entities and provenance edges in a graph store
Sources → Normalize → Block → Score → Cluster → Graph (entities + evidence)

           Lineage / run metadata

Architecture notes

  • Batch orientation: Spark-style distributed stages for heavy joins and scoring
  • Graph store: Neo4j-style entity and evidence relationships for traversal and investigation
  • Orchestration: Dagster-style assets for lineage between raw, blocked, scored, and resolved layers

Difficult problems

  • Threshold choice: Precision/recall tradeoffs are domain-specific; a single global cut rarely survives contact with reality
  • Transitivity: A–B and B–C links can force A–C merges that are wrong without additional constraints
  • Evaluation: Ground truth is expensive; weak labels and sampled audits are usually what you actually get

Tradeoffs

Option Benefit Cost
Aggressive blocking Cheap candidates Missed true pairs
Soft blocking / multi-pass Higher recall More compute
Pairwise ML classifier Flexible scoring Label demand, drift
Rules + similarities Debuggable Harder edge cases

Outcome

TODO: Document only results you can verify and publish. Example placeholder: “Internal experiments improved candidate reduction versus naïve comparison; public metrics withheld.”

This case study intentionally stops short of claiming production KPIs.

What I learned

  • Entity resolution is as much about evaluation design and operability as about similarity functions
  • Graph structure helps investigation even when the “best” match score is ambiguous
  • Genericizing production work for a portfolio requires discipline: patterns yes, secrets no

What I would change

  • Invest earlier in a reproducible evaluation set
  • Separate “investigation UI queries” from “batch resolution” contracts more cleanly
  • Explore incremental re-resolution strategies for high-churn sources
  • Related notes: Writing index — filter for knowledge graphs
  • TODO: Add public repo URL if/when sanitized code is available