The knowledge graph
Who depends on whom, and how much of you sits with one account
The graph is where a column in a spreadsheet becomes a thing with a size and a set of relationships. It is built from facts, every fact carries the line it came from, and the resolution rules are deliberately boring, which means nothing surprising happens in them.
How files become factsWhat the graph turns into
Drawn from the invented example company. The largest account is eighteen percent of revenue and the top five are fifty four percent.
A summary tells you what your files said. A graph tells you what your files imply.
Nobody writes down that the largest customer is eighteen percent of revenue, that the top five are more than half, that one supplier is single sourced on the input that the marine grade work depends on, and that the account manager holding the largest relationship also holds three of the other five. All of that falls out of the same customer list and supplier file once they are nodes with sizes rather than rows in a table.
The build
From a fact to a node
- 1
Facts are grouped by subject and type
Every fact names a subject and what kind of thing it is: customer, competitor, supplier, department, product, salesperson, partner, regulator or investor. Facts about the company itself and about themes are handled elsewhere.
- 2
Names are normalised and merged
The normalised form is lower case with legal suffixes and punctuation stripped, so Adlerstahl Alloys GmbH, Adlerstahl Alloys and adlerstahl alloys are one node. Every spelling that was ever seen is kept as an alias.
- 3
Values are combined by what kind they are
Revenue, cost, quantity and price add up across rows, because three lines for one customer are three invoices. Ratings and scores average. Text values keep the last one seen and are held separately from numbers.
- 4
Importance is scored as a share
Each node gets a share of its own type. If nothing in that type carries a number, importance is split evenly and the model knows it is guessing.
- 5
Edges are wired
Customers buy from you, suppliers supply you, competitors compete with you, departments are part of you. Where a customer row names an owner and that name matches a salesperson, an account ownership edge is added too.
- 6
Gaps are filled on purpose
Any class with no nodes at all gets inferred ones, marked as inferred, and scored again so the shares still add up.
Extraction
Rules go first, and they go every time
The rule pass reads tables by their column headings. It knows that MRR, ARR, contract value, ACV, billing, invoiced, spend and amount are all revenue columns, that renewal, expiry and term end are contract dates, that NPS, CSAT, rating and stars are satisfaction, and that owner, rep and account manager are the person who holds the relationship. First match wins, so the order of those families is part of the design.
It reads prose by the shapes numbers take in business writing, and it parses the mess: a figure in brackets is negative, a percentage becomes a ratio, 1.2M becomes a number, and a currency symbol with thousand separators does not defeat it.
Every fact it writes carries the source, the chunk, the exact quote, and a marker saying it came from a rule. That is what lets the ledger show you the line under a number.
Extraction, second pass
A model reads only what the rules could not
If a key is configured, a second pass looks at chunks that produced no facts at all, largest first, capped per run. It is asked for structured facts only, told never to invent a number that is not in the text, and asked for the shortest span of the source that supports each one.
Everything it returns is written with its own marker and a lower confidence than a rule fact. In the ledger that becomes a wider band. In the confidence score it counts for half of what a document fact counts for.
With no key, this pass simply does not happen and the rest of the system is unaffected. Nothing in the graph, the agents, the ledger or the simulation requires it.
Resolution
Dull on purpose, because clever means surprising
There is no fuzzy matching, no embedding similarity and no model deciding whether two names are the same company. Two nodes merge when their normalised names are identical, and that is the whole rule.
The consequence is that the resolver sometimes leaves two nodes where you wanted one. Meridian Marine and Meridian Marine Systems will not merge, and they should not merge automatically, because one of them might genuinely be a different subsidiary buying on different terms.
The fix is a person looking at it. The graph screen lets you merge, rename and delete, and every alias is kept so you can see which spellings the node already answers to. A resolver that guesses is a resolver that has to be audited, and auditing a guess is harder than making a decision.
- Merge on the normalised name, keep every spelling as an alias
- Legal suffixes, articles and punctuation are stripped before comparison
- Source count is tracked per node, so a name that three files agree on looks different from one that appeared once
Importance
A share of its own type, not a score out of ten
Importance is the share a node contributes to its type. Customers, competitors, products, salespeople and partners are scored on revenue. Suppliers and departments are scored on cost, because that is the number those files actually carry.
A share is more useful than a rating because it is directly the thing you care about. The largest account's importance is the concentration number. The largest supplier's importance is the single sourcing risk. The largest department's importance is what you would be removing.
When nothing in a type carries a number, every node in it gets an equal share and the ledger records that the concentration figures are assumed rather than counted.
The gaps
A market with no competitors in it is not a market
If a class has no nodes at all, the graph creates them. This is the most opinionated decision in the product and it is worth defending: a model built only from what a company wrote down is a model of that company's own beliefs, and it will tell you a price rise is free.
Everything invented this way is marked inferred. It is drawn faded in the graph, it says on the agent card that it was inferred because no file mentioned it, and its numbers appear in the ledger as industry defaults sitting at the top of the list of things worth replacing.
- Two competitors when none were named: the nearest rival at your price level, and a cheap option sitting well below it
- A main supplier holding the industry cost share
- A channel partner with a small share of revenue
- The people funding this, with a patience measured in months
- A regulator with the exposure typical for your industry
- Three executive seats, because somebody has to be making the decisions
- A department set, and three customer segments, when no org chart or customer list was uploaded
Anatomy
What a node carries
| Field | What it holds |
|---|---|
| Type | Customer, competitor, supplier, department, product, salesperson, partner, investor, regulator, executive, segment or the company itself |
| Name and normalised name | What it is called, and the stripped form used for merging |
| Aliases | Every spelling seen across every file |
| Properties | Revenue, cost, quantity, price, rating, dates, status, segment and any text field the rules recognised |
| Importance | Its share of its own type |
| Source count | How many separate files mentioned it |
| Inferred flag | Whether the model created it to fill a gap |
| Edges | Its relationships, each with a weight |
The graph export caps at a size a browser can draw without struggling, ordered by importance, so the thing you are looking at is always the part that matters.
And then it learns
The graph is the input to a network
Everything above describes a structure. On its own a structure is a picture you can look at, and a picture of forty relationships is already more than most companies have written down.
Version two puts a small neural network on top of it. Every node becomes twenty four numbers, each node hears its neighbours twice, and three heads read the result: how fragile this thing is, what it costs if it breaks, and which other nodes are standing in the same place. It is trained on labels the engine produced by running your own twin with and without each node, so it learns your company rather than an industry.
That is what turns a diagram into a ranking you can act on.
- Risk and impact for everything the graph holds
- Similarity by position in your company rather than by name
- Every score taken apart into the inputs and the relationships behind it
- Trained on your own server, on your own data, and on nobody else's
See your own concentration on a screen
Most people know their largest customer is large. Rather fewer know what the top five add up to, or which account manager is holding most of it, or which supplier has no second source.