Article · Entity resolution
What is entity resolution?
Entity resolution decides which records describe the same real thing, such as a part, a supplier or an aircraft, and joins them into one entity. It matches records on a shared key where one exists, and on similar names and fields where none does. Done well, a question about a supplier finds every record about it, and none about its neighbor.
In short
Entity resolution finds the records that describe the same real thing and joins them into one entity. The entity keeps a link to every record it came from. The thing can be a part, a supplier, a customer or an aircraft. The records can sit in one system or in ten.
The idea goes by many names. A tutorial by Lise Getoor and Ashwin Machanavajjhala defines it as “the problem of extracting, matching and resolving entity mentions in structured and unstructured data”. It lists record linkage, deduplication and reference reconciliation among the names other fields use for it.
Two neighbors are easy to confuse with it. Search finds records that look like a question; entity resolution decides that two records are the same thing. Entity linking connects a mention in text, such as a part number in a ticket, to an entity that already exists. Resolution decides what the entities are in the first place.
Why a graph needs it
A graph answers a question by following edges from one record to the next, and every edge hangs off an identity. Say the parts list writes P-220 rev C and the ticket system writes P220-C. The graph then holds two parts where there is one. A question that starts at the ticket never reaches the supplier notice filed against the part.
Duplicates also break counts. William Winkler of the U.S. Census Bureau notes in his overview of record linkage that duplicates in a list of businesses inflate the estimates for each industry. In a plant the same error makes one supplier look like three small ones, and spreads its open quality issues thin.
What is a knowledge graph? explains why identity matters to a graph. This article is about getting identity right when the systems disagree.
How it resolves
Four records, two suppliers
Four systems name a supplier four ways. A shared key joins two records, a standardized name joins a third, and a similar name stays apart. Pick a step to stop the drawing and read it.
- 01
Four records, four systems
The ERP, a supplier notice, a ticket and a quality report each name a supplier in their own way.
- 02
An exact key
The ERP record and the notice carry the same vendor number, 40117. They join with no scoring.
- 03
Standardize, then compare
The ticket has no vendor number. Its name, one letter short, and its city agree, so it joins as a scored match.
- 04
A similar name stays apart
Hartmann Hydraulik shares a word, not a city or a key. It becomes a supplier of its own.
- 05
One supplier, three records
Supplier S-12 links to all three of its records. A question about it now finds every one.
How a match is made
Most entity resolution runs in four steps.
- Standardize. Bring each field to one form: case, spacing, separators, legal forms such as GmbH, units and dates. P220-C and P-220 rev C become one value once both are written the same way.
- Block. Compare only the pairs that could match, such as records with the same postcode or the same part family. The Splink documentation gives the reason: “a dataset of 1 million input records would generate around 500 billion pairwise record comparisons.”
- Compare and score. Check each field of a candidate pair and add up the evidence. Fellegi and Sunter published the classic model for this in 1969, and Winkler’s overview describes it. Each pattern of agreement is weighed by how often it occurs among true matches and among non-matches. Two suppliers in the same city say little. Two with the same tax number say a lot.
- Decide and merge. Join the pairs that clear a cutoff into one entity, choose its canonical name and fields, and keep a link to each source record.
Matching keys and fuzzy matching
The cheapest match is a shared key: a vendor number, a serial number, a tax number. When two systems carry the same key for the same thing, the match is exact and needs no score. Start with keys, and only score what they leave unmatched.
Keys fail in their own ways. Each system tends to have its own: the ERP knows vendor 40117, the ticket system only a name. Some keys move. An aircraft’s registration can change when it is sold abroad, while the manufacturer’s serial number stays with the airframe. Choose the key that stays with the thing.
Where no key is shared, fuzzy matching compares what is left: names, addresses, descriptions. It counts how many characters differ, so it absorbs typos and spelling variants. That suits names and does not suit identifiers. Our text search documentation makes the point for ticket numbers: a ticket one character away from T-9182 is a different ticket, not a typo. Part numbers and revisions behave the same way. Standardize an identifier, then match it exactly.
False merges and missed matches
Every cutoff trades two errors. A missed match leaves apart two records that describe one thing, and the graph has a gap: a question about the supplier misses a third of its notices. A false merge joins two different things. That error spreads, because every edge of one now looks like an edge of the other.
The two errors do not cost the same. A missed match costs completeness, and someone who knows the supplier usually notices. A false merge produces confident wrong answers: revision C of a part inherits the deviation raised against revision D, and an assistant cites it. In regulated work, count a false merge as the more expensive error and set the cutoffs for it.
The classic answer is a third zone between the two cutoffs. Winkler’s decision rule for a pair there reads: “designate pair as a possible match and hold for clerical review.” A person decides those pairs, and the rule decides the rest.
Where to draw the line
Two cutoffs, three zones
Each square is a scored pair of records. The cutoffs decide which pairs are merged, which stay apart, and which wait for a person.
- 01
Score every pair
Each square is a candidate pair, placed by its score. Ink pairs are the same thing, stone pairs are not.
- 02
Merge above the upper cutoff
Pairs that score this high are merged with nobody looking.
- 03
Keep apart below the lower cutoff
Pairs that score this low stay separate records.
- 04
A person decides the rest
Pairs between the cutoffs wait for review, one at a time.
- 05
The errors that get through
A stone pair above the upper cutoff is a false merge. An ink pair below the lower one is a missed match.
How it goes wrong
- Matching on a field that is not an identity. Two suppliers in different countries can share a name, and two parts can share a description.
- Merges with no way back. A merge that discards the old ids cannot be undone, and an answer can no longer be traced to the record it came from.
- Blocking that hides matches. A block on postcode never compares a supplier with the same supplier at its new address.
- One pass, then never again. New records arrive every day. Resolution that ran once, at load time, drifts away from the sources.
- Merged fields that ignore access. An entity that copies fields from a restricted record can show them to people who may not open that record.
How to evaluate it
Five questions, asked of a sample of your own records rather than a demo set:
- Which key identifies each type in each system, and does that key stay with the thing?
- Check 100 resolved entities by hand. How many are false merges, and how many matches were missed?
- Where are the cutoffs, and who reviews the pairs between them?
- Can every entity list the records it was built from, and can a merge be undone?
- When a new record arrives, how long until it is resolved against the rest?
How Curiosity does it
In Curiosity Studio every node type has a key. The graph model documentation explains that the key decides whether a record updates an existing node or creates a new one. Connectors from more than 70 systems write records by their key. Loading the same record again updates its node instead of adding a second one.
Where a record names an entity in its text, entity linking connects the mention to an existing node with a _Mentions edge. Spotters match a list of canonical names and their aliases. Pattern spotters match identifiers such as ticket numbers. A node can also carry aliases of its own, so it is found under its other names.
When two nodes turn out to be one, code can merge them. The edges move to the node you keep, and the merged node’s key can stay on it as a searchable alias. An administrator can do the same from the data views. Access is synced from the source systems and checked per record at query time. The knowledge graph and data enrichment pages cover the developer side.
References
Sources and further reading
Entity Resolution: Theory, Practice & Open Challenges
Lise Getoor, Ashwin Machanavajjhala · VLDB tutorial, 2012
A definition of entity resolution, its other names, and the families of methods: rules, pairwise classification, clustering.
ReadOverview of Record Linkage and Current Research Directions
William E. Winkler, U.S. Census Bureau · February 2006
The Fellegi and Sunter model, matching weights, and the clerical review zone between two cutoffs.
ReadWhat are Blocking Rules?
Splink documentation, UK Ministry of Justice
Why record linkage compares only some pairs, and the tension between strict and loose blocking.
ReadGraph model
Curiosity documentation
Keys as the identity of a node in Curiosity Studio, and how they decide between an update and a new node.
ReadEntity linking
Curiosity documentation
Connecting extracted mentions to existing nodes with _Mentions and _AppearsIn edges.
ReadGraph: merging nodes
Curiosity documentation
Merging two nodes that are one entity, and keeping the merged key as an alias.
ReadText search
Curiosity documentation
Fuzzy matching by edit distance, and why it should be off for identifiers.
ReadFAQ
Questions people ask
Is entity resolution the same as deduplication?
Deduplication is one case of it: finding records that describe the same thing within one list. Entity resolution also matches records across systems that use different keys, names and formats, and keeps a link from the resolved entity to each source record.
Should fuzzy matching be used on part numbers?
Rarely. A part number one character away is usually a different part or revision, not a typo. Standardize identifiers first, such as case and separators, and then match them exactly. Keep fuzzy matching for names, addresses and descriptions.
What happens to a record’s id when it is merged in Curiosity Studio?
When code merges two nodes as aliases, the edges of the merged node move to the node you keep and the merged node is deleted. Its key, or another field you name, stays on the kept node as a searchable alias, so a search for the old id still finds it.
Who decides a match the rules cannot settle?
A person. The usual design has two cutoffs: pairs above the upper one are merged, pairs below the lower one stay apart, and the pairs between them are held for review. Moving the cutoffs apart lets fewer errors through and sends more pairs to review.
Articles
Read next
What is a knowledge graph?
Knowledge graphs
Entities, typed relationships and a schema. How a knowledge graph differs from a table and a search index, and how to tell a useful one from a diagram.
ReadWhat is a context graph?
Context graphs
Two meanings of a new term, decision traces and a permission-aware graph of records, where they meet, and where a knowledge graph ends.
ReadWhat is enterprise search?
Enterprise search
How search inside a company differs from web search, how it works, where it goes wrong, and how to test one before you trust it.
ReadYour data. Your infrastructure.