Build1 distinct publisher3 min readPublished
Multi-hop supply questions are cheap to ask in Cypher and awkward everywhere else. The traversal only holds if every article's name for a company lands on the same node. The post breaks off before that gets solved.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Run the pattern and Neo4j hands back path objects rather than tuples [1][2]. The load-bearing part is not the variable-length arrow, it is the two list comprehensions in the RETURN clause: `[r IN relationships(path) | r.article_id]` walks every edge of a matched path and pulls the article that established it, and its sibling does the same for `event_date` [1]. A four-hop result therefore arrives carrying four article IDs and four dates, one per link, instead of a single provenance stamp on the endpoint [2]. With the `LIMIT 30` in place, one run can return up to 120 article references for a human to check [5].
The two attempts that failed did so for unrelated reasons, which is easy to lose in the retelling. Elasticsearch was asked a question about text and answered it: fourteen documents matched the phrasing, and the NVIDIA articles were not among them because NVIDIA is not named in any of them [6][7]. The author is explicit that relevance tuning would not have closed that gap [7]. SQL failed on two counts. The visible one is hop count, two CTEs for two hops, three for three, depth fixed before the query runs [10]. The quieter one is arity: an article describing an event involving three or four companies does not reduce to one subject-object row without discarding something [13]. Worth noting that the Cypher pattern also runs company to company [1], so a four-participant event still has to be decomposed into pairwise edges or into an event node the post does not show. The graph relaxes the row shape, but modeling an event with four participants takes more structure than that alone provides [13].
The ratios are worth doing. 275,293 relationships over 9,414 articles is 29.2 edges per article [1]; 84,962 nodes over the same corpus is 9.0 nodes per article [2]; the graph averages 3.2 relationships per node [3]. That density is a claim about an extraction pipeline, not about Neo4j. For it to transfer, your articles would have to name companies at a similar rate and your extractor would have to be as willing to emit an edge. No precision figure is reported for any of the 275,293 [14], and a bad edge does not look bad in the output; it looks like a path with an article ID attached [2].
Latency is the figure missing here. Response time on the Cypher query is described as acceptable, but the post gives no number, no hardware detail, and no comparison against a deeper bound [15]. A benchmark table would at least be something to argue with. What the post does name as the unfinished dependency is entity resolution: the traversal only works if the same company maps to the same node however an article refers to it, and that did not happen automatically [17]. Filings say ASML Holding NV, a wire shortens it to ASML, and a blog post never names the company and calls it the Dutch lithography equipment maker [18]. Left unresolved those are three nodes, and the source text breaks off mid-sentence on exactly that failure [19].
The semantics of an empty result are stated carefully, and that carries more weight than it sounds: no path returned means the graph holds no evidence for the connection, not that the connection is absent in the world [16]. Combined with a depth bound tuned at query time [3], that supports an honest workflow. Ask at four hops, ask at six, and read both answers as statements about corpus coverage rather than about semiconductors. It also means the graph inherits every gap in the 9,414 articles [5], which is a fair trade for a research tool and a poor one for anything that has to be right before someone opens the cited articles.
Ranked by verification strength, evidence, and original report placement.
The working query is Cypher: MATCH path = (source:Company {name: "ASML"}) -[:SUPPLY_CUT|EXPORT_RESTRICTION|PRODUCTION_DELAY*1..4]-> (downstream:Company), returning downstream.name, length(path) as hops, [r IN relationships(path) | r.article_id] as evidence_articles and [r IN relationships(path) | r.event_date] as event_dates, ordered by hops and first event date, LIMIT 30. The pattern runs company node to company node.
The author states the query returns paths, not rows: each result is a chain from the source company to a downstream company with the article ID and event date at every link, not just at the endpoint.
The *1..4 depth bound is a parameter the author tunes at query time; checking four hops required no rewriting.
The author says he did not write the Cypher query first: it is where he ended up after trying two other things that did not work.
The article database sits in Elasticsearch, in an index called economic_news_articles_en, currently holding 9,414 documents.
An Elasticsearch bool query matching the text "chip packaging export restriction" with published_at >= 2023-01-01 and size 15 returned fourteen results; some were on the specific restriction and a few matched incidentally.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 28, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
invest
Nvidia's August 26 print: 92% of the quarter rides on one segment1 distinct publisher
build
Two buyers, one price: Patel says 2027's new compute is already half spoken for1 distinct publisher
build
The query a vector index cannot answer, whatever you embed it with1 distinct publisher
product
Mistral sold five years of compute it has not built yet, and used the money to ship endpoints1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Mechanism shown, magnitudes unchecked
The reproducible half is genuinely reproducible: the Cypher pattern, the Elasticsearch DSL and both SQL forms are printed in full, so a reader can judge the one-CTE-per-hop argument without trusting anyone. The other half is unfalsifiable as published — the document, node, relationship and resolved-entity counts, the fourteen search hits, and the extraction quality behind 275,293 edges all rest on one practitioner's word, and no accuracy figure exists to check.
One builder's project
The only usage anywhere in this story is the author's own graph, plus a Splink dependency he credits. Nobody else runs it, no team has adopted the pattern, and the counts describe a personal corpus of under ten thousand articles. That is a demonstration, not a deployment.
Headline outruns a careful post
"The query SQL can't answer" is a stronger claim than the body will support, and the body says so: recursive CTEs handle variable depth, the author simply judged he had left SQL territory without timing the alternative. Against that, this is an unusually self-limiting piece — it volunteers that entity resolution was the unexpected bottleneck, refuses to read an empty result as evidence that a connection does not exist, and reports no benchmark it did not run. The overstatement is in the framing, not the findings.
Series momentum, no product
This is part two of a numbered series that links back to part one and sells part three, so there is a reason for the SQL-versus-Cypher contrast to land cleanly and for the hardest problem to be the cliffhanger. What is absent matters more: no vendor, no sponsorship, nothing for sale, and the only third-party tool named — Splink — is credited rather than pitched. Reputation and readership are the stakes here.
Solid on method, blind past it
We can say with confidence what this post argues and how it argues it, because the code is on the page. We can say almost nothing about whether the graph is right, since a single publisher supplies every figure and no one has checked one of them. Our confidence took a further trim from an internal slip worth admitting: our summary line describes the post as breaking off before entity resolution is addressed, and it does not.