A worked case Illustrative scenario

“Which clients buy one service when they could buy five — and who here already has the relationship?”

A partner asked it before annual planning. Four weeks later a list came back that everyone in the room agreed was wrong. Not because the data was missing. Every fact needed to answer it was already sitting in systems the firm owned.

Five systems each held part of the answer

CRM

Knows the accounts and the pipeline. The same client group appears four times, under four names.

Time & Billing

Knows what was actually delivered and by whom — organised by matter code, not by client.

Delivery

Knows the scope of each engagement. Its service names predate the last two reorganisations.

Contracts

Knows which legal entity signed, which is rarely the entity that received the work.

Directory

Knows who works here and who worked on what. Not who actually knows whom.

None of them agrees on who the client is. None of them holds the relationship at all. That is the four weeks.

Organizations spend between 40% and 60% of their IT budget reconciling meaning across systems — the cost of operating and integrating data silos that were never designed to agree.

Dave McComb, Semantic Arts — who named this problem
The work

One question, carried the whole distance

Stage 1 The need

We do not begin with your systems. We begin with what the business needs to know and cannot find out. Where the unworked revenue already is — in accounts that already trust you — is the cheapest growth a firm has, and almost nobody can name it on demand.

It is hard for a specific and instructive reason. Both sides of it are hierarchies. Your clients roll up — divisions, subsidiaries, a parent that buys under its own name. Your services roll up too — offerings inside service lines inside practices. Neither tree lives in the system that records the revenue, so the gap hides between them.

What you want to know comes first. The architecture follows it.

Stage 2 The competency question

The need is written down precisely enough to be tested. This is a competency question, and it becomes the specification and the acceptance criterion at the same time. Nothing gets built that does not serve it.

For each client group, list every service line it has not bought at any depth of ownership, ranked by what comparable client groups buy alongside what it already has — and for each gap, name the person here with the strongest delivery relationship into that group.

Agreed and signed before a line of code is written. If we cannot answer it at the end, the engagement has not succeeded, and that is a judgment you make rather than one we get to narrate.

Stage 3 The schema

The question tells us exactly what the model must contain. Not a warehouse, not a lake — seven node types and six relationships. Everything the five systems disagreed about is resolved once, here, into a single explicit structure.

Client Group Client Org Contact Engagement Person Service Service Line Practice PART_OF * PART_OF * WORKS_AT WORKED_WITH DELIVERED PART_OF LED * traversed to any depth — client groups and service taxonomies both nest, and a reorganisation adds edges, not columns

The two edges marked * are the ones that matter. They are recursive — walked to whatever depth the ownership and the taxonomy happen to go. Reorganise the practices next year and that is new edges, not a rebuilt report.

Schema design is the part that cannot be delegated to a tool. It is led by Ryan Chandler, PhD — knowledge graph architect — working directly with the people who know what the words mean in your business.

Stage 4 The traversal

Answering the question is a walk through the structure — six hops, two of them to arbitrary depth. There is no reconciliation step, because the reconciling was done once, in the model.

01Start at a client group.
02Walk PART_OF* down to every organisation that buys under it — four names in the CRM, in this case, one of them acquired.
03Collect every engagement delivered to any of them.
04Collect the services those engagements delivered, and roll each up PART_OF* to its service line.
05Subtract from the catalogue. What remains is the gap — ranked by what comparable groups buy together.
06Walk back through the people who led those engagements to the contacts they worked with inside the group. That is the warmest route in.

The same six hops, written two ways. The difference is not syntax. It is that one of them has to be maintained by a person who remembers why it looks like that.

Relational Two recursive CTEs, five systems
WITH RECURSIVE grp AS (
  SELECT org_id FROM crm_account
   WHERE org_id = :client_group
  UNION ALL
  SELECT a.org_id FROM crm_account a
    JOIN grp g ON a.parent_org_id = g.org_id
),
svc AS (
  SELECT svc_id, parent_svc_id FROM service_cat
  UNION ALL
  SELECT s.svc_id, s.parent_svc_id FROM service_cat s
    JOIN svc x ON s.parent_svc_id = x.svc_id
)
SELECT DISTINCT sl.line_name, p.person_name
  FROM grp g
  JOIN client_xref cx ON cx.crm_org_id = g.org_id
  JOIN billing_matter m ON m.client_code = cx.billing_code
  JOIN delivery_eng   e ON e.matter_ref  = m.matter_ref
  JOIN svc            s ON s.svc_id      = e.service_id
  JOIN service_line  sl ON sl.line_id    = s.root_line_id
  JOIN eng_staffing  st ON st.eng_id     = e.eng_id
  JOIN directory      p ON p.person_id   = st.person_id
 WHERE ...

client_xref maps CRM accounts to billing codes. It is maintained by hand. It is the four weeks — and the relationship question is not answered here at all, because no table records who knows whom.

Graph One pattern
MATCH (g:ClientGroup {name: $group})
      <-[:PART_OF*]-(o:ClientOrg)
      <-[:FOR]-(e:Engagement)
      -[:DELIVERED]->(:Service)
      -[:PART_OF*]->(line:ServiceLine)
MATCH (p:Person)-[:LED]->(e)
RETURN collect(DISTINCT line.name) AS bought,
       collect(DISTINCT p.name)    AS whoKnowsThem

No reconciliation, because identity was resolved once in the model. And the relationship falls out of the same walk — it is an edge, not a separate project.

Stage 5 The validation

The graph is loaded and the competency question is put to it. It either answers correctly or it does not, and that is settled before go-live rather than discovered afterward. Every subsequent question is added to the same test and kept there.

You know it works before you go live.

Stage 6 The answer

Eleven client groups buy from one service line and nothing else. In nine of the eleven, somebody here already has the relationship.

Three of those groups had been counted as separate accounts for years, because each division signed its own contract. The largest of them is already a top-twenty client and nobody had ever seen it that way.

Why the answer holds

Computed, not composed

No model read those five systems and summarised them. It walked an explicit structure, and the list above was computed by traversal.

Determinate

Run it again at the next planning cycle and the same walk returns the same groups. It is a computation, not a composition.

Defensible

Every hop is a fact somebody asserted — a contract, a timesheet, a delivered engagement. Show the path, point at the record.

Documented

What counts as one client, where a service line begins — decided once, written down, versioned, and yours.

Not a black box — a derivation you can put your name to. Why we separate computation from language →

Why it keeps paying

The next question is cheap

Nothing above was built for this question alone.

The model is single, simple, explicit and extensible, and the data and the description of the data sit in the same place. Which partners are single-threaded into a client? Which services never sell together? Who left, and what relationships left with them? Those are the same kind of walk — and an agent turned loose on this graph can follow relationships nobody anticipated and still arrive somewhere determinate, defensible, and documented. More on the data-centric approach →

That was one question. What is yours?

Tell me what your organization needs to know and cannot currently find out. If it is a good competency question I will say so, and show you the shape of the graph that would answer it. If it is not, I will tell you that too.

Or write directly — ryan@harmonygraph.com

Thank you — it arrived.

Your question is with me.

Ryan Chandler, founder and principal architect of HarmonyGraph

Ryan Chandler, PhD

Founder and principal architect. Knowledge graphs, natural language processing, and AI systems. What gets modelled is your conceptualization of the business — your domain, your distinctions, your terms — made explicit. Your agents then behave according to that structure instead of guessing at it.

Engagements
Fixed bid wherever possible. Scope signed before work begins.
Where
211 W Wacker Drive, Chicago, Illinois