Skip to content

Investigative Journalism: Follow the Money Through the Entity Graph

The campaign denied taking the money. The filings, shell-company records, and ownership chain traced it anyway.

A fictional campaign-finance investigation inspired by documented patterns from closed real cases (Abramoff-era lobbying networks, FEC-disclosed shell-entity donor pathways, and dozens of ProPublica/OpenSecrets reconstructions). All names are invented. The reconstruction pattern is how real journalism works.

This is the investigative journalism showcase — demonstrating that YantrikDB surfaces contradictions not just from direct statement-vs-statement mismatches, but from entity resolution across a graph of ownership and funding.


Marcus Lanier, a fictional U.S. Senate candidate, is campaigning statewide. At a July 2026 town hall, asked about pharmaceutical campaign funding, he says:

“I have never taken a dollar from anyone connected to the pharmaceutical industry. Never have, never will.”

A reporter spends three months pulling records from public registries. The story: technically, the statement is defensible at every single hop. Collectively, it’s false.

SourceAuthorityWhat it contains
public.lanierDirect statementThe denial
fec.filingsFederal Election CommissionItemized contributions to campaign
fec.pac_disclosuresFECThe PACs’ own funding sources
delaware.registryDelaware Div. of CorporationsLLC ownership chains
propublica.profileNAICS + SEC EDGARIndustry classification
reporter.bank_recordsSource-reporter corroborationWire transfer records

Starting from Lanier_campaign, walking backwards through the claims ledger:

Hop 1 — direct donors:
Better_Tomorrow_Action_Fund -> Lanier_campaign [fec.filings]
Progressive_Health_Futures_PAC -> Lanier_campaign [fec.filings]
Hop 2 — who funded the donor PACs:
Meridian_Public_Affairs_Group -> Better_Tomorrow... [fec.pac_disclosures]
Windhaven_Strategies_LLC -> Progressive_Health... [fec.pac_disclosures]
Hop 3 — who owns the funding LLCs:
Carrington_Horizon_Holdings owns Meridian_Public_Affairs_Group [delaware.registry]
Carrington_Horizon_Holdings owns Windhaven_Strategies_LLC [delaware.registry]
Hop 4 — ultimate beneficial owner:
Kellner_Therapeutics_Group owns Carrington_Horizon_Holdings [delaware.registry]
Hop 5 — industry classification:
Kellner_Therapeutics_Group is a member of pharma_industry [propublica.profile]

Five hops across five independent public registries. Every hop is a structured claim with source attribution. YantrikDB walks the chain in one query.


Lanier_campaign --received_funds_from--> pharma_industry
(public.lanier) CLAIMS NO
(derived from entity chain) CLAIMS YES

Lanier’s statement is not contradicted by a single opposing assertion — no single source says “Lanier took pharma money.” The contradiction emerges from the composition of five claims across five sources. That’s what makes it an investigative-journalism showcase: the structured lie is only visible if your memory system can walk the entity graph and reason over ownership relations.


The temporal query shows belief changing with the reporting

Section titled “The temporal query shows belief changing with the reporting”

Before the town hall (2026-04-01): the public record shows only public.lanier’s denial (which doesn’t exist yet) and the fragments of donations that haven’t been connected. No single source contradicts him. The lie is defensible.

After the reporting (2026-08-01): the entity chain is assembled. The denial and the chain coexist in the ledger. The composition is the story.

Same database. Same claims. The journalistic question “what did the public record show on date X?” has a different answer at different points — because validity windows and source attribution are first-class.


Why couldn’t Postgres + embeddings + a dashboard do this?

Section titled “Why couldn’t Postgres + embeddings + a dashboard do this?”

A keyword search or vector database would not find this story. None of the source documents mention each other textually. The Delaware LLC filing does not name Lanier. The FEC Form 3 doesn’t name Kellner Therapeutics. The town hall quote doesn’t name any PAC. The connection is ownership, not linguistic similarity.

A graph database could model the ownership chain — but it has no notion of polarity or validity. It cannot represent Lanier’s “I never took pharma money” (polarity=-1) as a claim that contradicts the derived polarity=+1 fact that follows from the ownership graph.

YantrikDB stores the direct denial and every hop of the entity chain as structured claims with source attribution and polarity. Walking the chain is one query per hop. Surfacing the contradiction at the top is the query result.

That’s the category.


Any investigation where the contradiction lives in the composition of public records:

  • Campaign finance — the scenario above
  • Sanctions & beneficial ownership — stated non-exposure vs shell-entity chain evidence
  • Supply-chain traceability — vendor certifications vs audit-trail contradictions via subcontractors
  • Money-laundering investigations — ledger entries that individually pass but fail together
  • Medical ethics — stated independence vs cross-referenced affiliations via foundations and consulting
  • Regulatory capture — public lobbying disclosures vs the entity network they connect

Every one of these is an entity-graph problem with contradictions hiding at composition layers. Keyword and vector search miss them. YantrikDB surfaces them.


Terminal window
git clone https://github.com/yantrikos/yantrikdb-server
python yantrikdb-server/docs/showcase/journalism_engine.py \
ydb_your_token \
http://your-cluster:7438

Requires yantrikdb-server v0.7.2+ and yantrikdb v0.6.1+.

Full script: journalism_engine.py


The denial and the chain, in one database. Follow the money.