Nesting Balisage de données structurées (@id and @graph)
The deep-dive on connecting JSON-LD entities with @id and @graph — stable identifiers, the two canonical node patterns (WebSite→Article→Author, Product→Offer→Organization), the three mistakes que break the graph, and the honest limites of ce que Google's docs confirmer.
Langues
Nesting connects votre JSON-LD entities au lieu de dumping les as disconnected blocks. @id is a stable, unique URI (usually une URL canonique plus a #fragment) que noms an entity so autre entities peut référence it — an Article's author pointing at a Person node, a Product's Offer pointing at an Organization/seller — plutôt que re-declaring the complet entity everywhere. @graph is a keyword que bundles ceux connected entities into un script block. Google's docs confirmer les deux nesting and individual items fonctionner, and que @id is how vous tell Google two items are lié, but ils jamais confirmer si @id resolves à travers pages — so the safe par défaut is consistent @id valeurs plus the complet entity graph on every page que nécessite it. Two patterns to apprendre: WebSite → WebPage → Article → Author pour publishing, Product → Offer → Organization pour ecommerce. Three façons it breaks or costs vous: inconsistent/non-unique @id valeurs, orphaned références (an @id cited but jamais declared — a semantic gap, pas invalid JSON-LD), and duplicating a complet entity's declaration everywhere au lieu de referencing it (a maintenance trap; same-entity repeats merge plutôt que literally break, but a genuinely conflicting reused @id is a réel break). It's an entity-understanding outil, pas a ranking or rich-result lever by itself.
Evidence for this claim JSON-LD supports connected nodes via nesting or @id references, allowing multiple related entities to form one graph. Scope: JSON-LD graph model. Confidence: high · Verified: W3C JSON-LD 1.1 Evidence for this claim Google requires structured data to represent visible page content and follow each feature's specific nesting and property guidelines; extra valid nodes do not create eligibility by themselves. Scope: Current Google structured-data general guidelines. Confidence: high · Verified: Google Search Central: Structured data general guidelinesTL;DR — Nesting is how vous connecter votre balisage de données structurées au lieu de leaving it as a pile of disconnected blocks.
@idis a unique nom (usually votre page URL plus a#tag) vous give an entity — votre organization, an author — so autre entities peut point at it au lieu de repeating tout its details.@graphlets vous put several connected entities in un code block. The payoff: declare votre organization une fois, référence it everywhere, and don’t copy-paste the même block onto every page.
The problem nesting solves
Dire votre site has an Organization — a nom, a logo, liens to votre social
profiles. And every blog post has an Article with an author and a publisher.
Sans nesting, vous fin up writing out votre complet organization details — nom,
logo, every social lien — à l’intérieur every unique post’s markup. Modifier votre logo,
and now vous have to mettre à jour it in forty places.
Nesting fixes que. Vous declare the organization une fois, give it a stable nom, and everywhere sinon vous simplement référence que nom. Ce assumes vous déjà know ce que balisage de données structurées and JSON-LD are — si vous don’t, commencer with the données structurées hub premier, alors come back ici.
@id — a nom vous give an entity
@id is simplement a unique identifier pour un entity. The convention is to utiliser votre
réel page URL plus a fragment, comme ce:
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Co",
"logo": "https://example.com/logo.png"
}Que "@id": "https://example.com/#organization" is now the entity’s nom.
Anywhere sinon vous devez dire “the publisher is Example Co,” vous don’t rewrite tout
of que — vous simplement point at the nom:
{
"@type": "Article",
"publisher": { "@id": "https://example.com/#organization" }
}Un petit but important chose: @id is an maillage interne mechanism, pas une page
you’re publishing. It doesn’t have to be a réel, fetchable URL — en utilisant a fragment
on votre propre domain is standard, and que exact fragment doesn’t besoin to charger as a
page. (That’s différent from the url property, qui fait décrire a réel
page.)
@graph — putting connected entities ensemble
@graph lets vous liste several entities in un code block au lieu de scattering
les à travers nombreux. Plutôt que three separate <script> blocks, vous écrire un:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Co" },
{ "@type": "WebSite", "@id": "https://example.com/#website", "publisher": { "@id": "https://example.com/#organization" } }
]
}Vous écrire @context une fois at the top, and the entities à l’intérieur référence chaque autre
by @id. It’s tidier and easier to maintain une fois vous have a few connected pieces.
The chose to obtenir correct
Two rules cover la plupart of it:
- Be consistent. Utiliser the même
@idstring pour the même entity everywhere. Si votre organization is#organizationon un page and#orgon un autre, search engines can’t tell they’re the même chose. - Don’t point at nothing. Si an
Article’s author références{"@id": "#author-jane"}, assurez-vous#author-janeis en réalité declared somewhere with a@typeand details. A référence to an entity vous jamais défini simplement fails silently.
And garder votre expectations honest: nesting bien helps moteur de recherches comprendre votre entities and avoids duplicated données — it doesn’t, by itself, faire vous rank plus élevé or unlock a rich result.
Vouloir the complet how-to — the two standard patterns with copy-paste exemples, the three mistakes que break the graph, and ce que Google’s docs en réalité confirmer (and leave silent)? Switch to the Avancé tab.
Audit a JSON-LD graph sans inventing entities
Audit the JSON-LD below as a graph.
1. Inventory every declared node: @id, @type, and where it is declared.
2. Inventory every @id reference made by another node.
3. Flag exact orphan references, duplicate full declarations, case/fragment drift,
unstable-looking IDs, and relationships that point at the wrong entity type.
4. Distinguish a reference-only object ({"@id":"..."}) from a full declaration.
5. Do not assume an @id resolves across pages and do not invent missing facts.
6. Return (a) a findings table, (b) a minimal corrected graph using the existing
facts only, and (c) questions for facts that cannot be verified from the input.
JSON-LD:
[PASTE SCRIPT CONTENT]Pour a template comparison, provide two rendered graphs and demander the model to liste
IDs que modifier unexpectedly entre les. Stable entities tel as the publisher
devrait retain the même case-sensitive @id; page-specific entities devrait remain
unique to leur canonical page.
Trouver orphaned and duplicate IDs in rendered JSON-LD
Run ce in DevTools Console. It parses every JSON-LD block, walks arrays and
@graph, and separates complet declarations from reference-only @id objects.
const documents = [...document.querySelectorAll('script[type="application/ld+json"]')]
.flatMap((script, scriptIndex) => {
try {
return [{ scriptIndex, value: JSON.parse(script.textContent) }];
} catch (error) {
console.warn(`Invalid JSON-LD in script ${scriptIndex + 1}`, error);
return [];
}
});
const declarations = new Map();
const references = [];
function walk(value, path, scriptIndex) {
if (Array.isArray(value)) {
value.forEach((item, i) => walk(item, `${path}[${i}]`, scriptIndex));
return;
}
if (!value || typeof value !== 'object') return;
if (typeof value['@id'] === 'string') {
const keys = Object.keys(value).filter((key) => key !== '@id');
if (keys.length) {
const rows = declarations.get(value['@id']) ?? [];
rows.push({ script: scriptIndex + 1, path, keys: keys.join(', ') });
declarations.set(value['@id'], rows);
} else {
references.push({ id: value['@id'], script: scriptIndex + 1, path });
}
}
Object.entries(value).forEach(([key, child]) =>
walk(child, `${path}.${key}`, scriptIndex));
}
documents.forEach(({ value, scriptIndex }) => walk(value, '$', scriptIndex));
console.table(references.filter(({ id }) => !declarations.has(id)));
console.table([...declarations.entries()]
.filter(([, rows]) => rows.length > 1)
.map(([id, rows]) => ({ id, declarations: rows.length, locations: rows })));An vide orphan table is utile, but it ne fait pas prove the graph is semantically correct. Examiner case-sensitive IDs, entity types, URL canoniques, and si the complet graph nécessaire by ce page is en réalité présent.
Evidence for this claim JSON-LD supports connected nodes via nesting or @id references, allowing multiple related entities to form one graph. Scope: JSON-LD graph model. Confidence: high · Verified: W3C JSON-LD 1.1 Evidence for this claim Google requires structured data to represent visible page content and follow each feature's specific nesting and property guidelines; extra valid nodes do not create eligibility by themselves. Scope: Current Google structured-data general guidelines. Confidence: high · Verified: Google Search Central: Structured data general guidelinesTL;DR — Nesting connects JSON-LD entities via
@id(a stable, unique URI — usually une URL canonique plus a#fragment) so vous référence an entity au lieu de re-declaring it, and@graph(a keyword bundling connected entities into un script block). Google’s docs confirmer les deux nesting and individual items fonctionner, and que vous utiliser@idto lien connexe items — but ils jamais confirmer si@idresolves à travers pages, so the safe par défaut is consistent@idvaleurs plus the complet entity graph on every page que nécessite it. Apprendre two patterns:WebSite → WebPage → Article → Author(publishing) andProduct → Offer → Organization/seller(ecommerce). Three échec modes to watch pour: inconsistent/non-unique@idvaleurs, orphaned références (an@idcited but jamais declared — semantically incomplete, pas invalid JSON-LD), and duplicate complet declarations of the même entity (a maintenance trap; same-entity repeats merge sous JSON-LD’s node rules, but reusing un@idpour genuinely différent entities is a réel conflict). It’s an entity-understanding outil — disambiguation and de-duplication — pas a ranking or rich-result lever by itself.
Scope: ce is the deep-dive, pas the intro
Ce article assumes vous déjà know ce que JSON-LD is and pourquoi it’s the recommended
format — the balisage de données structurées
page covers que, and it introduces @id/@graph En un coup d’œil. Ce page is the
deferred deep-dive: the réel mechanics, the standard node patterns, and the
spécifique mistakes que quietly break the graph. Si vous vouloir the format basics or
où to placer the <script> block, JSON-LD
is the sibling pour que.
@id — a stable identifier, pas a fetchable URL
@id assigns a unique URI to a JSON-LD entity so autre entities peut point at it by
référence. The convention — consistent à travers every credible source I’ve vérifié —
is an absolute URL canonique plus a descriptive fragment:
"@id": "https://example.com/#organization"
"@id": "https://example.com/#website"
"@id": "https://example.com/team/jane-doe/#person"Two choses personnes obtenir incorrect ici:
- It doesn’t have to resolve. Per the JSON-LD spec,
@id’s job is node identification — a unique, stable “name” pour an entity — pas fetchability. En utilisant a fragment on votre propre domain is standard pratique and doesn’t exiger que fragment URL to independently charger as une page. Sitebulb’s node-identifiers guide frames it bien: a node identifier is “a unique ‘nom’ pour an entity, qui is publicly accessible and peut be looked up or lié to.” @idn’est pasurl. They’re différent properties doing différent jobs.@ididentifies the node in the graph;urldescribes a réel, fetchable page à propos de the entity. AnOrganizationpeut (and souvent devrait) have les deux — an@idofhttps://example.com/#organizationand aurlofhttps://example.com/.
And @id valeurs are case-sensitive — #Organization and #organization are
two différent entities. Pick a convention and jamais drift from it.
@graph — bundling connected entities into un block
@graph is a JSON-LD keyword que lets vous put multiple top-level entities into un
array à l’intérieur a unique <script type="application/ld+json"> block, with entities
cross-referencing chaque autre by @id:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Organization", "@id": "https://example.com/#organization", "...": "..." },
{ "@type": "WebSite", "@id": "https://example.com/#website", "...": "..." },
{ "@type": "WebPage", "@id": "https://example.com/post/#webpage", "...": "..." }
]
}@graph is a container, pas a requirement. Vous pouvez absolutely utiliser separate
<script> blocks pour individual items — Google’s docs confirmer les deux approaches
fonctionner. The raison to reach pour @graph is maintainability: une fois vous have three or
plus cross-referencing entities, vous écrire @context une fois at the top au lieu de
repeating it in every block, and everything que références everything sinon lives in
un placer. Ce is the pattern Yoast uses in production — its
schema architecture docs
expliquer que a shared graph lets les “éviter having to duplicate or repeat shared
properties, and to reduce the amount of code/processing/overhead requis.”
Pourquoi nest at tout — and ce que Google en réalité dit
One Organization identified as hash organization is referenced as publisher by the WebSite and Article. The WebPage belongs to the WebSite and is connected to the Article. Each entity is declared once, and the same stable at-id string is reused for every reference.
Google documents two structural options and confirms it understands les deux. From the General Données structurées Guidelines: “Recherche Google understands multiple items on une page, si vous nest the items or specify chaque item individually.” It defines them plainly — nesting is “quand là is un principal item, and additional items are grouped sous the principal item”, and individual items is “when each item is a separate block on the same page.”
The un paragraph that’s the closest chose to an official rationale pour @id is
ce: “Si là are items que are plus utile quand ils are lié ensemble (pour
exemple, a recipe and a video), utiliser @id in les deux the recipe and the video items to
specify que the video is à propos de the recipe on lune page. Si vous didn’t lien the items
ensemble, Recherche Google may pas know que it peut montrer the video as a Recipe rich
result.” That’s the mechanism in Google’s propre words — @id is how vous tell Google
two items belong ensemble.
Worth an honest remarque: Google’s docs state ce principle in prose but don’t ship a
worked @graph+@id code sample demonstrating it — leur code exemples montrer a
nested Recipe and two individual top-level items, neither of qui en réalité
cross-references by @id. The exemples ci-dessous fill que gap.
Ce connects directement to schema’s two jobs (the framing from the
balisage de données structurées page):
nesting bien is squarely an entity-understanding déplacer — disambiguation and
avoiding contradictory/duplicated données — pas a rich-result trigger on its propre.
Linking votre Article cleanly to its Author doesn’t unlock a nouveau SERP fonctionnalité; it
simplement rend the relationships unambiguous.
Pattern 1 — WebSite → WebPage → Article → Author
The canonical publishing pattern. Un Organization (the publisher), un WebSite,
alors per-page a WebPage and the Article on it, with author and publisher
resolved by @id au lieu de re-declared:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Media",
"url": "https://example.com/",
"logo": "https://example.com/logo.png",
"sameAs": [
"https://www.linkedin.com/company/example-media/",
"https://en.wikipedia.org/wiki/Example_Media"
]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"name": "Example Media",
"publisher": { "@id": "https://example.com/#organization" }
},
{
"@type": "WebPage",
"@id": "https://example.com/nesting-schema/#webpage",
"url": "https://example.com/nesting-schema/",
"name": "Nesting Schema Markup",
"isPartOf": { "@id": "https://example.com/#website" }
},
{
"@type": "Person",
"@id": "https://example.com/team/jane-doe/#person",
"name": "Jane Doe",
"url": "https://example.com/team/jane-doe/",
"sameAs": ["https://www.linkedin.com/in/jane-doe/"]
},
{
"@type": "Article",
"@id": "https://example.com/nesting-schema/#article",
"mainEntityOfPage": { "@id": "https://example.com/nesting-schema/#webpage" },
"headline": "Nesting Schema Markup",
"author": { "@id": "https://example.com/team/jane-doe/#person" },
"publisher": { "@id": "https://example.com/#organization" }
}
]
}Remarque what’s happening: author and publisher are one-line références. The
Person and Organization are declared une fois chaque. The Article hangs off the
WebPage (mainEntityOfPage), qui is isPartOf the WebSite, qui is
publisher-ed by the Organization. That’s a connected graph, pas five islands.
Pattern 2 — Product → Offer → Organization (seller)
The ecommerce equivalent, and où nesting earns its garder at scale: au lieu de
re-declaring votre merchant Organization on every un of thousands of product
pages, declare it une fois and référence it as the seller:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://shop.example.com/#organization",
"name": "Example Shop",
"url": "https://shop.example.com/",
"logo": "https://shop.example.com/logo.png"
},
{
"@type": "Product",
"@id": "https://shop.example.com/widget/#product",
"name": "Deluxe Widget",
"sku": "WIDGET-001",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": { "@id": "https://shop.example.com/#organization" }
}
}
]
}The Offer’s seller points at the shared Organization node. Même seller
entity, un declaration, referenced from every product. (Pour very grand
variant sets, the même shared-@id idea extends to a ProductGroup with variant
Products — that’s a specialization of ce pattern, pas a différent mechanism.)
The three mistakes que break the graph
Ce is the practical heart of an audit. Quand nesting “doesn’t work,” it’s almost toujours un of ces three.
1. Inconsistent or non-unique @id valeurs
The même entity donné différent @id strings à travers pages (or à travers a
replatform/migration), so moteur de recherches and validators voir les as unrelated
entities au lieu de un. Or the opposite — reusing un @id pour two genuinely
différent entities. The fix is a strict, documented convention (e.g.
{base-url}/#organization, {page-url}/#webpage, {profile-url}/#person) applied
mechanically. Cas counts; #author ≠ #Author.
2. Orphaned références
An @id is referenced but jamais declared. Vous écrire
"author": {"@id": "https://example.com/#person-jane"}, but aucun node anywhere in the
testé document en réalité declares que @id with a @type and properties. Worth
being precise ici: a bare {"@id": "..."} object — ce que the
JSON-LD spec calls a node référence (“a node
object utilisé to référence a node having seulement the @id clé”) — is valid JSON-LD syntax
on its propre; it isn’t a parse error. The problem is semantic and consumer-specific:
the intended connection — “this Article’s author is that Person” — jamais resolves to
anything utile, so quelconque fonctionnalité or reader que nécessaire the author’s réel nom, URL,
or sameAs données comes up vide. Ce is the sneaky un: validators souvent encore parse
chaque declared item sans erroring, so nothing screams at vous. Vous ship an
incomplete graph and jamais notice. Momentic’s
@id guide
catalogs ce as un of the la plupart courant real-world nesting échecs.
3. Duplicate complet declarations of the même entity
The opposite of orphaning: re-declaring the complet Organization/Person object
inline on every page au lieu de referencing it une fois. Two différent choses peut se produire
ici, and it’s worth telling les apart:
- Repeated declarations of the genuinely même entity. Per the
JSON-LD spec, “the properties of a
node in a graph may be spread among différent node objects dans a document. Quand
que se produit, the keys of the différent node objects besoin to be merged to créer the
properties of le résultating node.” So repeating the même
@idwith the même (or compatible) données isn’t a parse échec — processors merge it. Que doesn’t faire it a bon idea: it’s encore ce que nesting exists to prevent, and it bloats markup and creates a maintenance trap — mettre à jour votre adresse or logo in un template, forget the autre forty, and the entity now contradicts itself à travers le site. Les deux Ahrefs’ schema coverage and Schema App independently faire the même “modifier un and forget the others” point. - The même
@idreused pour two en réalité différent entities. Ce is the réel break: two node objects share an identifier but décrire conflicting choses (a différent nom, a différent logo, a différent@type). That’s a semantic conflict, pas a harmless merge — pick a distinct@idpour chaque genuinely separate entity.
Declare une fois, référence everywhere — the maintenance cas pour doing so holds soit
façon, même though a same-entity repeat won’t technically break the graph the façon an
orphaned référence or a genuinely conflicting @id va.
The unresolved question: fait @id resolve à travers pages?
Here’s the honest limite que separates a réel réponse from the confident-but-wrong
version. Google’s documentation jamais explicitly states si @id références
resolve à travers pages — e.g., a product page’s Offer.seller pointing at an
Organization node that’s declared seulement on the homepage. Aucun Recherche Google Central
document uses “cross-page” or “across pages” in relation to @id.
The un nearby signal points toward self-contained pages: Google recommends, pour
contenu dupliqué, “placing the même données structurées on tout page duplicates, pas
simplement on the canonical page” — qui implies données structurées is evaluated par page,
pas récupéré from elsewhere. And there’s aucun on-the-record statement from a named
Google or Bing rep (Mueller, Illyes, Splitt) specifically resolving the cross-page
@id question que I pourrait vérifier. Bing, pour its partie, has
JSON-LD validation in Webmaster Outils
but aucun publié @id/@graph-spécifique guidance at tout — a genuine documentation
gap, pas a position I’m going to invent pour les.
So, as of July 2026, treat “Google follows @id links across pages” as an
industry inference, pas a confirmed behavior. The safe par défaut — qui Yoast, Momentic, and Schema App tout
converge on independently — is: garder @id valeurs consistent pour the même entity
everywhere, but encore output the complet entity graph on every page que nécessite it.
Don’t assume Google va récupérer a referenced entity from a différent URL. Yoast’s
production choice is exactly ce: it emits the complet graph on every page plutôt que
relying on cross-page resolution.
Comment valider nested schema
Two outils:
- Résultats enrichis Tester — in
practitioner testing as of July 2026, it parses
@grapharrays and resolves@idréférences dans the testé document: quand entity A références B by@idand B is declared in the même graph, ils montrer as connected; quand the referenced@idis jamais declared in the testé markup, the outil encore parses the declared items individually sans erroring, but can’t montrer the connection. Google doesn’t document ce UI behavior explicitly anywhere I pourrait trouver, so treat it as observed, reproducible outil behavior plutôt que an official specification — and re-check it si the tool’s UI changements. Que behavior is exactly pourquoi orphaned références slip via — aucun error, simplement a manquant lien. - Balisage de données structurées Validator — schema.org’s propre vocabulary validator, moins opinionated à propos de Google’s pris en charge rich-result types.
Tester the rendered page, pas simplement votre template source — si JSON-LD is injected via JavaScript, confirmer it’s en réalité présent. Google documents reading JSON-LD that’s dynamically injected by JavaScript, but that’s spécifique to Google — JavaScript-execution behavior varies by robot d’exploration and product, and there’s aucun blanket rule que every AI robot d’exploration renders JS the même façon (or at tout). Shipping JSON-LD in the initial HTML plutôt que assuming it’ll be executed is the conservative choice — that’s a schema-markup-for-AI concern.
Myths worth killing
- “
@idneeds to be a real, live, fetchable URL.” Aucun — by convention it’s a URL canonique plus a fragment, but its function is identification, pas fetchability. The fragment doesn’t besoin to resolve to its propre page. - “Même
@idon différent pages auto-merges ceux entities in Google’s index, comme a balise canonical consolidates pages.” Pas confirmed by quelconque Google doc. Consistent@idis bon hygiene, pas a proven cross-page consolidation mechanism. - “You must use
@graph; separate script blocks are wrong.” Faux. Google understands les deux.@graphis a maintainability choice. - “More nesting always improves entity understanding.” Seulement si the entities are
genuinely connexe. Nesting unrelated items (Schema App’s exemple: an unrelated
Eventsous aRecipe) doesn’t aider and peut muddy signals. - “
@id/@graphstructure is a ranking or rich-result factor.” Aucun. Its valeur is disambiguation and reduced duplication — consistent with schema pas being a ranking factor at tout. - “An undeclared
@idis harmless; engines just ignore it.” That’s the orphaned-reference échec — the intended connection silently doesn’t formulaire, and outils souvent don’t error, so vous ship it unnoticed.
Où ce sits
Ce is the how-to couche sous the
données structurées hub, a deeper sibling of
balisage de données structurées (qui
introduces @id/@graph) and JSON-LD
(the format). It leans on the même entity-understanding thinking as
entities and
balisage de données structurées pour AI — a well-built
graph is entity infrastructure, si the consumer is Google’s Knowledge Graph or
an LLM. The whole sub-cluster lives à l’intérieur on-page SEO.
AI summary
A condensed prendre on the Avancé version:
- Ce que c’est. Nesting connects JSON-LD entities au lieu de leaving disconnected
blocks.
@id= a stable, unique URI (usually URL canonique +#fragment) que noms an entity so others référence it by@idau lieu de re-declaring it.@graph= a keyword bundling connected entities into un<script>block, cross-referencing via@id. @id≠url, and@idneedn’t resolve. Per the JSON-LD spec,@idis node identification, pas fetchability;urldescribes a réel page.@idis case-sensitive.- Google’s confirmed position: it understands les deux nesting and individual
items, and vous utiliser
@idto tell Google two items are lié. It fait pas document cross-page@idresolution — treat “Google follows@idacross pages” as an industry inference, pas confirmed. Nearest signal (“duplicate the même schema on tout duplicate pages”) points toward per-page/self-contained evaluation. - Two patterns:
WebSite → WebPage → Article → Author(publishing, withauthor/publisherby@id) andProduct → Offer → Organization/seller(ecommerce, un seller node referenced from every product). - Three échec modes: (1) inconsistent/non-unique
@idvaleurs; (2) orphaned références — an@idcited but jamais declared (semantically incomplete, pas invalid JSON-LD; silent échec since validators souvent don’t error); (3) duplicate complet declarations of the même entity (maintenance trap — same-entity repeats merge sous JSON-LD’s node rules, but reusing un@idpour genuinely différent entities is a réel conflict). - Safe par défaut: consistent
@ideverywhere plus the complet entity graph on every page que nécessite it — don’t rely on cross-page fetching. (Yoast, Momentic, Schema App tout converge ici.) - Validate with the Résultats enrichis Tester (resolves
@iddans the testé doc) and the schema.org validator; tester the rendered page. - Pas a ranking or rich-result lever by itself — it’s entity understanding (disambiguation + de-duplication).
Documentation officielle
Primary-source documentation and specs.
- General Données structurées Guidelines — the un page où Google documents nesting vs. individual items and the
@id-linking principle (dernier mis à jour July 10, 2026, confirmed live). Aussi the “duplicate the same structured data on all page duplicates” guidance. - Intro to How Données structurées Markup Fonctionne — format context and the completeness/accuracy rules.
- Résultats enrichis Tester — parses
@graphand resolves@idréférences dans the testé document.
schema.org / W3C
- W3C JSON-LD 1,1 Recommendation — the spec que defines
@id,@graph, node objects, and graph objects. - Balisage de données structurées Validator — schema.org’s vocabulary validator (moins tied to Google’s rich-result prise en charge liste).
Bing / Microsoft
- Introducing JSON-LD Prise en charge in Bing Webmaster Outils — Bing’s Markup Validator supports JSON-LD; remarque là is aucun publié Bing guidance spécifique to
@id/@graphnesting mechanics.
Quotes from the source
On-the-record statements from Google. Chaque lien is a deep lien que jumps to the quoted passage.
Google — nesting vs. individual items
- “Google Search understands multiple items on a page, whether you nest the items or specify each item individually.” — Recherche Google Central, General Données structurées Guidelines. Jump to quote
Google — pourquoi @id exists (the linking principle)
- “…use
@idin both the recipe and the video items to specify that the video is about the recipe on the page. If you didn’t link the items together, Google Search may not know that it can show the video as a Recipe rich result.” — même page. Jump to quote
Google — treat chaque page as self-contained (the nearest cross-page signal)
- “If you have duplicate pages for the same content, we recommend placing the same structured data on all page duplicates, not just on the canonical page.” — même page. Jump to quote
On what’s pas on the record
Google’s docs jamais explicitly confirmer si @id références resolve à travers
pages, and I couldn’t vérifier quelconque on-the-record statement from a named Google or Bing
rep resolving que question. Où ce article dit “the safe par défaut is consistent
@id plus the complet graph par page,” that’s practitioner consensus (Yoast, Momentic,
Schema App converging independently), pas a Google quote — I’ve labeled it as tel
in the Avancé tab plutôt que dressing it up as official.
@id/@graph n’est pas a ranking factor follows from Google’s
broader, repeatedly-stated position que données structurées isn’t a direct ranking
signal — it n’est pas a verbatim @id-spécifique quote. Nested schema — cheat sheet
@id vs. url vs. @graph
| Chose | Ce que c’est | Doit it resolve to une page? |
|---|---|---|
@id | Unique identifier pour an entity (node in the graph) | Aucun — identification, pas fetchability |
url | The entity’s réel, fetchable page | Yes — it’s an réel URL |
@graph | Array bundling connected entities in un <script> block | N/A — it’s a container keyword |
@id conventions
- Absolute URL + descriptive fragment:
https://example.com/#organization. - Case-sensitive —
#Author≠#author. Pick un, jamais drift. - Même entity → même
@ideverywhere. Différent entities → différent@id. - Jamais a bare arbitrary string (
"id1").
The two patterns
| Pattern | Chain | Référence by @id |
|---|---|---|
| Publishing | WebSite → WebPage → Article | author → Person, publisher → Organization |
| Ecommerce | Product → Offer | seller → Organization |
Three choses to watch pour
| Mistake | Ce que se produit |
|---|---|
Inconsistent / non-unique @id | Même entity seen as two (or two entities collapsed into un) |
| Orphaned référence | @id cited but jamais declared → connection silently fails (valid JSON-LD, but semantically incomplete; souvent aucun validator error) |
| Duplicate complet declarations | Bloat + maintenance trap (same-entity repeats merge sous JSON-LD’s rules; reusing un @id pour différent entities is the réel conflict) |
Fast facts
- Google confirms les deux nesting and individual items fonctionner;
@graphis optional. - Google fait pas document cross-page
@idresolution — assume per-page. - Safe par défaut: consistent
@id+ complet graph on every page que nécessite it. - Pas a ranking or rich-result lever — it’s entity understanding.
- Validate with the Résultats enrichis Tester (resolves
@idin-document) and the schema.org validator; tester the rendered page.
Nesting anti-patterns
The spécifique façons nested schema goes incorrect — and the fix pour chaque.
Drifting @id conventions à travers templates
Votre blog template emits #organization, votre product template emits #org, and a
migrated section emits #company. Three strings, un réel entity — now seen as
three. Fix: un documented convention, applied mechanically (ideally generated
from a unique config, the façon plugins do it).
Referencing an entity vous jamais declared (orphan)
"author": {"@id": "#person-jane"} with aucun #person-jane node anywhere in the
document. The lien resolves to nothing and the connection fails — and the Rich
Results Tester usually won’t error, it simplement won’t montrer the connection. Fix: every
@id vous référence doit be declared une fois, in the testé markup, with a @type.
Re-declaring the complet entity on every page
Copy-pasting the complet Organization (nom, logo, every sameAs) inline into
every article and product. Fonctionne, but it’s a maintenance trap: modifier the logo une fois,
forget forty pages, and votre entity now contradicts itself. Fix: declare une fois,
référence by @id everywhere sinon.
Nesting unrelated entities to “add more schema”
Bundling a Recipe, an unrelated Event, and a JobPosting sous un graph
parce que “more markup is better.” Relatedness has to be réel — co-location isn’t a
relationship. Fix: seulement connecter entities que genuinely relate.
Assuming cross-page @id resolution
Declaring Organization seulement on the homepage and referencing it by @id from
product pages, expecting Google to récupérer it. Google’s docs don’t confirmer ce fonctionne.
Fix: garder @id consistent, but inclure the complet entity on every page que
références it.
@id that’s really meant to be url (or vice versa)
En utilisant @id où vous besoin a fetchable page référence, or expecting url to lien
graph nodes. They’re différent jobs. Fix: @id pour graph identity, url pour the
réel page; an entity peut have les deux.
Cas and trailing-slash inconsistency
https://example.com/#Org on un page, https://example.com/#org on un autre, or
.../post/#article vs .../post#article. Tout treated as distinct. Fix: normalize
exactly — cas, slashes, protocol, host.
Worked exemples
Copy-paste starting points pour the two patterns and a correct référence.
Publishing: WebSite → WebPage → Article → Author
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Media",
"url": "https://example.com/",
"logo": "https://example.com/logo.png",
"sameAs": ["https://www.linkedin.com/company/example-media/"]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"name": "Example Media",
"publisher": { "@id": "https://example.com/#organization" }
},
{
"@type": "WebPage",
"@id": "https://example.com/post/#webpage",
"url": "https://example.com/post/",
"isPartOf": { "@id": "https://example.com/#website" }
},
{
"@type": "Person",
"@id": "https://example.com/team/jane-doe/#person",
"name": "Jane Doe",
"url": "https://example.com/team/jane-doe/"
},
{
"@type": "Article",
"@id": "https://example.com/post/#article",
"mainEntityOfPage": { "@id": "https://example.com/post/#webpage" },
"headline": "Example headline",
"author": { "@id": "https://example.com/team/jane-doe/#person" },
"publisher": { "@id": "https://example.com/#organization" }
}
]
}Ecommerce: Product → Offer → Organization (seller)
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://shop.example.com/#organization",
"name": "Example Shop",
"url": "https://shop.example.com/"
},
{
"@type": "Product",
"@id": "https://shop.example.com/widget/#product",
"name": "Deluxe Widget",
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": { "@id": "https://shop.example.com/#organization" }
}
}
]
}Correct référence vs. orphaned référence
Correct — the referenced node is declared in the même graph:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Person", "@id": "https://example.com/#jane", "name": "Jane Doe" },
{ "@type": "Article", "author": { "@id": "https://example.com/#jane" } }
]
}Broken (orphan) — #jane is referenced but jamais declared, so author resolves to
nothing:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Article", "author": { "@id": "https://example.com/#jane" } }
]
} Nested schema audit — checklist
A réussir to confirmer votre graph is connected, consistent, and self-contained:
- Un
@idconvention, documented and applied everywhere (e.g.{base}/#organization,{page}/#webpage,{profile}/#person). - Même entity → même
@idà travers every page and template (aucun#orgvs.#organizationdrift; cas and trailing slashes normalized). - Aucun orphaned références — every
@idvous référence is en réalité declared, in the testé document, with a@typeand properties. - Aucun duplicate complet declarations — shared entities (
Organization,Person) are declared une fois and referenced by@id, pas re-pasted inline. -
@idvs.urlutilisé correctement —@ididentifies the node;urlpoints at the réel page; an entity may have les deux. - Seulement genuinely connexe entities are connected — aucun unrelated items bundled simplement to ajouter markup.
- Complet graph on every page que nécessite it — don’t rely on cross-page
@idresolution; inclure the referenced entities par page. - Validated in the Résultats enrichis Tester (connections montrer as lié) and the schema.org validator.
- Testé on the rendered page, pas simplement template source (confirmer JS-injected JSON-LD is en réalité présent; server-render pour AI robots d’exploration).
- Consistent markup à travers canonical + duplicate pages — même structured données on tout versions.
Testez vos connaissances: Nesting Balisage de données structurées
Five rapide questions on @id, @graph, and the mistakes que break a nested graph.
Pick an réponse pour chaque, alors vérifier.
Ressources utiles
My connexe writing
- Données structurées: Ce que c’est and Comment utiliser It — my Ahrefs guide to schema types, implementation méthodes, validation outils, and the
sameAsentity-disambiguation risk (the entity-understanding job@id/@graphsert). - The Beginner’s Guide to SEO technique — où données structurées sits in the bigger technical picture.
My speaking
- How Search Fonctionne (SlideShare) — my walkthrough of exploration, rendering, indexation, and ranking, pour the context données structurées feeds into. (My standing disclaimer s’applique: “This is my understanding of systems… not going to be 100% complete or accurate.”)
Official
- Google’s General Données structurées Guidelines — nesting vs. individual items and the
@id-linking principle. - W3C JSON-LD 1,1 Recommendation — the spec defining
@id,@graph, and node/graph objects. - Résultats enrichis Tester and the schema.org validator — the two outils pour checking a nested graph.
From autour the industry
- We Tracked 1 885 Pages Ajout Schema. AI Citations Barely Déplacé. (Louise Linehan & Xibeijia Guan, Ahrefs) — an Ahrefs study on schema and AI citations, utile pour calibrating expectations que clean markup, notamment nesting, is entity infrastructure plutôt que a citation cheat code.
- Node Identifiers: From Données structurées to Lié Données (Patrick Hathaway, Sitebulb) — the clearest “what a node identifier actually is” explainer, with a worked distinct-
@idexemple and the case-sensitivity warning. - Ce que is an @id in Données structurées? (Mark van Berkel, Schema App) — cites the JSON-LD spec definition and the utile “entity home” framing (lune page où an entity’s complet definition lives).
- Ce que is Nesting in Balisage de données structurées? (Jasmine Drudge-Willson, Schema App) — nesting-for-hierarchy vs. -convenience, and pourquoi nesting unrelated entities is a mistake.
- Schema: Technology and approach (Yoast developer docs) — a réel production
@grapharchitecture, its@idtemplate, and the candid “we output the full graph on every page rather than rely on cross-page resolution” choice. - En utilisant @id in Schema.org Markup pour le SEO, LLMs & Knowledge Graphs (Tyler Einberger, Momentic) — a clean catalog of courant
@idmistakes (orphaned références, unstable IDs, inconsistent valeurs).
Journal des modifications
Mis à jour le 21 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.