---
title: "Gemini-Driven Entity Disambiguation With Post-Creation Mislink Detection"
canonical_url: "https://cognilium.ai/blogs/gemini-entity-disambiguation-mislink-detection"
slug: "gemini-entity-disambiguation-mislink-detection"
section: "blogs"
date_published: "2026-05-05"
date_modified: "2026-05-05"
word_count: 1400
reading_time_minutes: 7
author: "Mudassir Marwat"
author_identifier: "0009-0008-1927-2598"
person_same_as:
  - "https://www.linkedin.com/in/mudassir-marwat/"
  - "https://orcid.org/0009-0008-1927-2598"
  - "https://github.com/mudassirmarwat"
  - "https://medium.com/@mudassir-marwat"
  - "https://www.youtube.com/@mudassir-marwat"
  - "https://dev.to/mudassirmarwat"
  - "https://hashnode.com/@mudassirmarwat"
  - "https://huggingface.co/mudassirmarwat"
  - "https://bsky.app/profile/mudassir-marwat.bsky.social"
  - "https://substack.com/@mudassirmarwat"
  - "https://topmate.io/mudassirmarwat"
  - "https://fueler.io/mudassirmarwat"
  - "https://www.instagram.com/mudassirmarwat/"
  - "https://www.facebook.com/mudassir.marwat"
  - "https://www.reddit.com/user/mudassirmarwat/"
  - "https://www.f6s.com/member/mudassir-marwat"
  - "https://cognilium.ai/founder"
entities: []
related:
  - "https://cognilium.ai/blogs/entity-resolution-knowledge-graph"
  - "https://cognilium.ai/blogs/graph-rot-knowledge-graph-quality"
  - "https://cognilium.ai/blogs/rag-vs-graphrag"
---
# Gemini-Driven Entity Disambiguation With Post-Creation Mislink Detection

Auto-merging "Acme Corp" with "Acme Corporation" is the easy half. Catching merges that should not have happened is what a high-precision pass earns.

Two PPMs reference "Acme Corp." A cap table references "Acme Corporation." A side letter references "Acme Holdings LLC." Are these the same entity? Probably the first two are. The third is more interesting — it might be the parent company. Getting this right matters because everything downstream (financial roll-ups, ownership tracking, compliance reporting) depends on the entity graph being correct.

## Why one-pass linking fails

Conservative linker: merges only when surface form is near-identical. Misses "Acme Corp" / "Acme Corporation" merges that should have happened. Low recall.

Aggressive linker: merges on partial-match heuristics. Merges "Acme Corp" with "Acme Capital" when they are different companies. Low precision.

There is no threshold that gets both. The two-pass approach — aggressive merge with a precision-recovery pass — gets both at the cost of a second pipeline stage.

## Pass 1: Gemini-driven disambiguation

At entity ingestion, the candidate entity is shown to Gemini with up to 10 graph neighbors that name-match. Gemini sees: surface form, jurisdiction, EIN if present, registered address, top relationships, source document type. Output: {action: "merge_with_X" | "create_new", confidence}.

Confident merges (>0.85) auto-merge. Uncertain ones (0.6-0.85) queue for human review with the model's reasoning attached. Below 0.6, default to create_new.

## Pass 2: post-creation mislink detection

After auto-merge, a check pass compares the merged entity's attributes across all source documents. If "Acme Corp" in document A has post-money valuation $50M and "Acme Corp" in document B has $52M, the merge is suspect — same entity should have the same valuation as of the same date.

- Numerical fields compared with tolerance (1% on valuations, exact on share counts).
- Legal-entity fields compared exact (jurisdiction, EIN, registered address).
- Relational structure compared loosely (≥80% officer overlap).

Disagreement above tolerance flags the merge. The flag goes to a human review queue with both source documents linked and the conflicting attributes highlighted.

## What this catches

- ~15% of auto-merges flagged by mislink check
- ~3% turn out to be actual mislinks (entities the aggressive linker over-merged)
- ~12% are tolerable inconsistencies (typos, time-shifted valuations) — human confirms the merge
- Net precision after mislink check: >99% of merges

## Cost

Pass 1 runs at ingestion: ~50 entities/second on cached inputs, ~$0.001 per entity. Pass 2 runs in batch overnight: ~5 entities/second (graph queries are the bottleneck), $0.005 per entity. The mislink check overhead is small relative to the document-extraction cost it backstops.

## Frequently asked questions

### Why a separate mislink-detection pass instead of stricter linking upfront?

Strict linking has high precision and low recall — it misses real merges that should happen. Loose linking merges aggressively then cleans up. The two-pass approach gets both: aggressive merge for recall, mislink check for precision.

### What attributes does mislink check compare?

Numerical fields (valuations, share counts, dates), legal-entity attributes (jurisdiction, EIN, registered address), and relational structure (same officers? same investors?). Any disagreement above a tolerance flags the merge.

### How big a deal is a mislink in production?

In a family-office or fund-management context, a mislinked entity means valuations, ownership percentages, and reporting roll up to the wrong parent. The downstream financial reports come out wrong. High blast radius — the mislink check earns its keep.

### Why use Gemini rather than a string-similarity library?

String similarity (Jaro-Winkler, edit distance) catches "Acme Corp" ↔ "Acme Corporation." It misses "Acme Holdings LLC" ↔ "Acme Capital Partners" where the legal-entity intuition requires understanding holding-co structures. Gemini handles the intuition; string similarity is a feature inside its prompt.

### What is the throughput?

Linker handles ~50 entities per second on cached inputs; mislink check is slower (~5 entities per second) since it queries the graph and re-fetches source documents.

---

Canonical HTML: https://cognilium.ai/blogs/gemini-entity-disambiguation-mislink-detection
