Nesting Balisage de données structurées (@id and @graph)
Le deep-dive on connecting JSON-LD entities avec @id et @graph — stable identifiers, le deux canonical node patterns (Site web→Article→Author, Produit→Offer→Organization), le three mistakes que break le graph, et le honest limites de ce que Google's docs confirmer.
«Nesting connects your JSON-LD entities instead of dumping them as disconnected blocks. @id is a stable, unique URI (usually a canonical URL plus a #fragment) that names an entity so other entities can reference it — an Article's author pointing at a Person node, a Product's Offer pointing at an Organization/seller — rather than re-declaring the full entity everywhere. @graph is a keyword that bundles those connected entities into one script block. Google's docs confirm both nesting and individual items work, and that @id is how you tell Google two items are linked, but they never confirm whether @id resolves across pages — so the safe default is consistent @id values plus the complete entity graph on every page that needs it. Two patterns to learn: WebSite → WebPage → Article → Author for publishing, Product → Offer → Organization for ecommerce. Three ways it breaks or costs you: inconsistent/non-unique @id values, orphaned references (an @id cited but never declared — a semantic gap, not invalid JSON-LD), and duplicating a full entity's declaration everywhere instead of referencing it (a maintenance trap; same-entity repeats merge rather than literally break, but a genuinely conflicting reused @id is a real break). It's an entity-understanding tool, not a ranking or rich-result lever by itself.» _(Traduction)_ (Résumé en français du champ tldr : le texte source est conservé pour relecture francophone.)
«> TL;DR — Nesting is how you connect your schema markup instead of leaving it
Preuve à l’appui de cette affirmation JSON-LD supports connected nodes via nesting or @id references, allowing multiple related entities to form one graph. Portée : JSON-LD graph model. Niveau de confiance : élevé · Vérifié : W3C JSON-LD 1.1 Preuve à l’appui de cette affirmation 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. Portée : Current Google structured-data general guidelines. Niveau de confiance : élevé · Vérifié : Google Search Central: Structured data general guidelinesas a pile of disconnected blocks.
@idis a unique name (usually your page URL plus a#tag) you give an entity — your organization, an author — so other entities can point at it instead of repeating all its details.@graphlets you put several connected entities in one code block. The payoff: declare your organization once, reference it everywhere, and don’t copy-paste the same block onto every page.
» (Traduction) (Résumé en français de la section trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## The problem nesting solves » (Traduction) (Résumé en français de la section quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Dire votre site a an Organization — a nom, a logo, liens à votre social
profiles. Et chaque blog post a an Article avec an author et a publisher.
Sans nesting, vous fin up writing out votre complet organization details — nom,
logo, chaque social lien — à l’intérieur chaque unique post’s markup. Modifier votre logo,
et maintenant vous ont à mettre à jour il dans forty places.
Nesting corrections que. Vous declare le organization une fois, donner il a stable nom, et everywhere sinon vous simplement référence que nom. Ce assumes vous déjà know ce que balisage de données structurées et JSON-LD sont — si vous ne pas, commencer avec le 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" est maintenant le entity’s nom.
Anywhere sinon vous devez dire “the publisher is Example Co,” vous ne pas rewrite tout
de que — vous simplement point à le nom:
{
"@type": "Article",
"publisher": { "@id": "https://example.com/#organization" }
}Un petit mais important chose: @id est an maillage interne mechanism, pas une page
vous êtes publishing. Il ne fait pas ont à être a réel, fetchable URL — en utilisant a fragment
on votre propre domain est standard, et que exact fragment ne fait pas besoin à charger as a
page. (c’est différent depuis le 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 à le top, et le entities à l’intérieur référence chaque autre
par @id. c’est tidier et easier à maintain une fois vous ont a quelques connected pieces.
The chose to obtenir correct
Two rules cover la plupart of it:
- Être consistent. Utiliser le même
@idstring pour le même entity everywhere. Si votre organization est#organizationon un page et#orgon un autre, recherche moteurs ne peut pas tell ils sont le même chose. - ne pas point à rien. Si an
Article’s author références{"@id": "#author-jane"}, assurez-vous#author-janeest en réalité declared somewhere avec a@typeet details. A référence à an entity vous jamais défini simplement fails silently.
Et garder votre expectations honest: nesting bien aide moteur de recherches comprendre votre entities et avoids duplicated données — il ne fait pas, par itself, faire vous classer plus élevé or unlock a rich résultat.
Vouloir le complet comment-à — le deux standard patterns avec copy-paste exemples, le three mistakes que break le graph, et ce que Google’s docs en réalité confirmer (et laisser silent)? Switch à le 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 comparaison, provide deux rendu graphs et demander le model à liste
IDs que modifier unexpectedly entre les. Stable entities tel as le publisher
devrait retain le même case-sensitive @id; page-spécifique entities devrait remain
unique à leur canonical page.
Trouver orphaned and duplicate IDs in rendered JSON-LD
Exécuter ce dans DevTools Console. Il parses chaque JSON-LD bloquer, walks arrays et
@graph, et separates complet declarations depuis reference-seulement @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 tableau est utile, mais il ne fait pas prove le graph est semantically correct. Examiner case-sensitive IDs, entity types, URL canoniques, et si le complet graph nécessaire par ce page est en réalité présent.
Preuve à l’appui de cette affirmation JSON-LD supports connected nodes via nesting or @id references, allowing multiple related entities to form one graph. Portée : JSON-LD graph model. Niveau de confiance : élevé · Vérifié : W3C JSON-LD 1.1 Preuve à l’appui de cette affirmation 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. Portée : Current Google structured-data general guidelines. Niveau de confiance : élevé · Vérifié : Google Search Central: Structured data general guidelinesTL;DR — Nesting connects JSON-LD entities via
@id(a stable, unique URI — généralement une URL canonique plus a#fragment) donc vous référence an entity au lieu de re-declaring il, et@graph(a mot-clé bundling connected entities dans un script bloquer). Google’s docs confirmer les deux nesting et individual éléments fonctionner, et que vous utiliser@idà lien connexe éléments — mais ils jamais confirmer si@idresolves à travers pages, donc le sûr par défaut est consistent@idvaleurs plus le complet entity graph on chaque page que nécessite il. Apprendre deux patterns:WebSite → WebPage → Article → Author(publishing) etProduct → Offer → Organization/seller(ecommerce). Three échec modes à watch pour: inconsistent/non-unique@idvaleurs, orphaned références (an@idcited mais jamais declared — semantically incomplete, pas invalide JSON-LD), et duplicate complet declarations de le même entity (a maintenance trap; même-entity repeats merge sous JSON-LD’s node règles, mais reusing un@idpour genuinely différent entities est a réel conflict). c’est an entity-understanding outil — disambiguation et de-duplication — pas a classement or rich-résultat lever par itself.
Scope: ce is the deep-dive, pas the intro
Ce article assumes vous déjà know ce que JSON-LD est et pourquoi c’est le recommended
format — le balisage de données structurées
page covers que, et il introduces @id/@graph En un coup d’œil. Ce page est le
deferred deep-dive: le réel mechanics, le standard node patterns, et le
spécifique mistakes que quietly break le graph. Si vous vouloir le format basics or
où à placer le <script> bloquer, JSON-LD
est le 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:
- Il ne fait pas ont à resolve. Per le JSON-LD spec,
@id’s job est node identification — a unique, stable “name” pour an entity — pas fetchability. En utilisant a fragment on votre propre domain est standard pratique et ne fait pas exiger que fragment URL à independently charger as une page. Sitebulb’s node-identifiers guide frames il bien: a node identifier est “a unique ‘nom’ pour an entity, qui est publicly accessible et peut être looked up or lié à.” @idn’est pasurl. ils sont différent properties doing différent jobs.@ididentifies le node dans le graph;urldécrit a réel, fetchable page à propos de le entity. AnOrganizationpeut (et souvent devrait) ont les deux — an@iddehttps://example.com/#organizationet aurldehttps://example.com/.
Et @id valeurs sont case-sensitive — #Organization et #organization sont
deux différent entities. Pick a convention et jamais drift depuis il.
@graph — bundling connected entities into un block
@graph est a JSON-LD mot-clé que lets vous put plusieurs top-level entities dans un
array à l’intérieur a unique <script type="application/ld+json"> bloquer, avec entities
cross-referencing chaque autre par @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 est a container, pas a requirement. Vous pouvez absolutely utiliser séparé
<script> bloque pour individual éléments — Google’s docs confirmer les deux approaches
fonctionner. Le raison à reach pour @graph est maintainability: une fois vous ont three or
plus cross-referencing entities, vous écrire @context une fois à le top au lieu de
repeating il dans chaque bloquer, et tout que références tout sinon lives dans
un placer. Ce est le modèle Yoast utilise dans production — son
schema architecture docs
expliquer que a shared graph lets les “éviter having à duplicate or repeat shared
properties, et à reduce le amount de code/processing/overhead requis.”
Pourquoi nest at tout — and ce que Google en réalité dit
Un Organization identified as hash organization est referenced as publisher par le Site web et Article. Le WebPage belongs à le Site web et est connected à le Article. Chaque entity est declared une fois, et le même stable à-id string est reused pour chaque référence.
«Google documents two structural options and confirms it understands both. From the General Structured Data Guidelines: “Google Search understands multiple items on a page, whether you nest the items or specify each item individually.” It defines them plainly — nesting is “when there is one main item, and additional items are grouped under the main item”, and individual items is “when each item is a separate block on the same page.” » (Traduction) (Résumé en français de la section cinquante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The one paragraph that’s the closest thing to an official rationale for @id is
this: “If there are items that are more helpful when they are linked together (for
example, a recipe and a video), use @id in 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.” That’s the mechanism in Google’s own words — @id is how you tell Google
two items belong together.
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Worth an honest remarque: Google’s docs state ce principle dans prose mais ne pas ship a
worked @graph+@id code sample demonstrating il — leur code exemples montrer a
nested Recipe et deux individual top-level éléments, aucun de qui en réalité
cross-references par @id. Le exemples ci-dessous fill que gap.
Ce connects directement à schema’s deux jobs (le framing depuis le
balisage de données structurées page):
nesting bien est squarely an entity-understanding déplacer — disambiguation et
avoiding contradictory/duplicated données — pas a rich-résultat trigger on son propre.
Linking votre Article cleanly à son Author ne fait pas unlock a nouveau SERP fonctionnalité; il
simplement rend le relationships unambiguous.
Modèle 1 — Site web → WebPage → Article → Author
Le canonical publishing modèle. Un Organization (le publisher), un WebSite,
alors per-page a WebPage et le Article on il, avec author et publisher
resolved par @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 qu’est-ce que happening: author et publisher sont un-line références. Le
Person et Organization sont declared une fois chaque. Le Article hangs off le
WebPage (mainEntityOfPage), qui est isPartOf le WebSite, qui est
publisher-ed par le Organization. c’est a connected graph, pas five islands.
Modèle 2 — Produit → Offer → Organization (seller)
Le ecommerce equivalent, et où nesting earns son garder à scale: au lieu de
re-declaring votre merchant Organization on chaque un de thousands de produit
pages, declare il une fois et référence il as le 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" }
}
}
]
}Le Offer’s seller points à le shared Organization node. Même seller
entity, un declaration, referenced depuis chaque produit. (Pour very grand
variant sets, le même shared-@id idea extends à a ProductGroup avec variant
Products — c’est a specialization de ce modèle, 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
Le même entity donné différent @id strings à travers pages (or à travers a
replatform/migration), donc moteur de recherches et validators voir les as unrelated
entities au lieu de un. Or le opposite — reusing un @id pour deux genuinely
différent entities. Le corriger est 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 est referenced mais jamais declared. Vous écrire
"author": {"@id": "https://example.com/#person-jane"}, mais aucun node anywhere dans le
testé document en réalité declares que @id avec a @type et properties. Worth
étant precise ici: a bare {"@id": "..."} object — ce que le
JSON-LD spec calls a node référence (“a node
object utilisé à référence a node having seulement le @id clé”) — est valide JSON-LD syntax
on son propre; il n’est pas a parse erreur. Le problème est semantic et consumer-spécifique:
le prévu connection — “ce Article’s author est ce Person” — jamais resolves à
n’importe quoi utile, donc quelconque fonctionnalité or lecteur que nécessaire le author’s réel nom, URL,
or sameAs données comes up vide. Ce est le sneaky un: validators souvent encore parse
chaque declared élément sans erroring, donc rien screams à vous. Vous ship an
incomplete graph et jamais notice. Momentic’s
@id guide
catalogs ce as un de le la plupart courant real-world nesting échecs.
3. Duplicate complet declarations of the même entity
Le opposite de orphaning: re-declaring le complet Organization/Person object
inline on chaque page au lieu de referencing il une fois. Deux différent choses peut se produire
ici, et c’est worth telling les apart:
- Repeated declarations de le genuinely même entity. Per le
JSON-LD spec, “le properties de a
node dans a graph peut être spread parmi différent node objects dans a document. Quand
que se produit, le keys de le différent node objects besoin à être merged à créer le
properties de le résultating node.” Donc repeating le même
@idavec le même (or compatible) données n’est pas a parse échec — processors merge il. Que ne fait pas faire il a bon idea: c’est encore ce que nesting exists à empêcher, et il bloats markup et crée a maintenance trap — mettre à jour votre adresse or logo dans un template, forget le autre forty, et le entity maintenant contradicts itself à travers le site. Les deux Ahrefs’ schema coverage et Schema App independently faire le même “modifier un et forget le others” point. - Le même
@idreused pour deux en réalité différent entities. Ce est le réel break: deux node objects share an identifier mais décrire conflicting choses (a différent nom, a différent logo, a différent@type). c’est a semantic conflict, pas a harmless merge — pick a distinct@idpour chaque genuinely séparé entity.
Declare une fois, référence everywhere — le maintenance cas pour doing donc holds soit
façon, même though a même-entity repeat ne va pas technically break le graph le façon an
orphaned référence or a genuinely conflicting @id va.
The unresolved question: fait @id resolve à travers pages?
Ici’s le honest limite que separates a réel réponse depuis le confident-mais-wrong
version. Google’s documentation jamais explicitly states si @id références
resolve à travers pages — e.g., a produit page’s Offer.seller pointing à an
Organization node c’est declared seulement on le homepage. Aucun Recherche Google Central
document utilise “cross-page” or “across pages” dans relation à @id.
«The one nearby signal points toward self-contained pages: Google recommends, for
duplicate content, “placing the same structured data on all page duplicates, not
just on the canonical page” — which implies structured data is evaluated per page,
not fetched from elsewhere. And there’s no on-the-record statement from a named
Google or Bing rep (Mueller, Illyes, Splitt) specifically resolving the cross-page
@id question that I could verify. Bing, for its part, has
JSON-LD validation in Webmaster Tools
but no published @id/@graph-specific guidance at all — a genuine documentation
gap, not a position I’m going to invent for them.
» (Traduction) (Résumé en français de la section soixante-quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Donc, as de July 2026, treat “Google suit @id liens dans pages” as an
industry inference, pas a confirmed behavior. Le sûr par défaut — qui Yoast, Momentic, et Schema App tout
converge on independently — est: garder @id valeurs consistent pour le même entity
everywhere, mais encore sortie le complet entity graph on chaque page que nécessite il.
ne pas assume Google va récupérer a referenced entity depuis a différent URL. Yoast’s
production choice est exactly ce: il emits le complet graph on chaque page plutôt que
relying on cross-page resolution.
Comment valider nested schema
Two outils:
- Résultats enrichis Tester — dans
practitioner testing as de July 2026, il parses
@grapharrays et resolves@idréférences dans le testé document: quand entity A références B par@idet B est declared dans le même graph, ils montrer as connected; quand le referenced@idest jamais declared dans le testé markup, le outil encore parses le declared éléments individually sans erroring, mais ne peut pas montrer le connection. Google ne fait pas document ce UI behavior explicitly anywhere Je pourrait trouver, donc treat il as observed, reproducible outil behavior plutôt que an official specification — et re-vérifier il si le outil’s UI changements. Que behavior est exactly pourquoi orphaned références slip via — aucun erreur, 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-résultat types.
Tester le rendu page, pas simplement votre template source — si JSON-LD est injected via JavaScript, confirmer c’est en réalité présent. Google documents reading JSON-LD c’est dynamically injected par JavaScript, mais c’est spécifique à Google — JavaScript-execution behavior varies par robot d’exploration et produit, et il y a aucun blanket règle que chaque AI robot d’exploration renders JS le même façon (or à tout). Shipping JSON-LD dans le initial HTML plutôt que assuming il’ll être executed est le conservative choice — c’est a schema-markup-pour-AI concern.
Myths worth killing
- “
@idnécessite à être a real, actif, fetchable URL.” Aucun — par convention c’est a URL canonique plus a fragment, mais son function est identification, pas fetchability. Le fragment ne fait pas besoin à resolve à son propre page. - “Même
@idon différent pages auto-merges ceux entities dans Google’s indexer, comme a balise canonical consolidates pages.” Pas confirmed par quelconque Google doc. Consistent@idest bon hygiene, pas a proven cross-page consolidation mechanism. - “Vous doit utiliser
@graph; séparé script bloque sont wrong.” Faux. Google understands les deux.@graphest a maintainability choice. - “More nesting always improves entity understanding.” Seulement si le entities sont
genuinely connexe. Nesting unrelated éléments (Schema App’s exemple: an unrelated
Eventsous aRecipe) ne fait pas aider et peut muddy signaux. - “
@id/@graphstructure est a classement or rich-résultat factor.” Aucun. Son valeur est disambiguation et reduced duplication — consistent avec schema pas étant a classement factor à tout. - “An undeclared
@idest harmless; moteurs simplement ignore il.” c’est le orphaned-reference échec — le prévu connection silently ne fait pas formulaire, et outils souvent ne pas erreur, donc vous ship il unnoticed.
Où ce sits
Ce est le comment-à couche sous le
données structurées hub, a deeper sibling de
balisage de données structurées (qui
introduces @id/@graph) et JSON-LD
(le format). Il leans on le même entity-understanding thinking as
entities et
balisage de données structurées pour AI — a well-built
graph est entity infrastructure, si le consumer est Google’s Knowledge Graph or
an LLM. Le entier sub-cluster lives à l’intérieur sur la 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
bloque.
@id= a stable, unique URI (généralement URL canonique +#fragment) que noms an entity donc others référence il par@idau lieu de re-declaring il.@graph= a mot-clé bundling connected entities dans un<script>bloquer, cross-referencing via@id. @id≠url, et@idneedn’t resolve. Per le JSON-LD spec,@idest node identification, pas fetchability;urldécrit a réel page.@idest case-sensitive.- Google’s confirmed position: il understands les deux nesting et individual
éléments, et vous utiliser
@idà tell Google deux éléments sont lié. Il fait pas document cross-page@idresolution — treat “Google suit@iddans pages” as an industry inference, pas confirmed. Nearest signal (“duplicate le même schema on tout duplicate pages”) points toward per-page/self-contained evaluation. - Deux patterns:
WebSite → WebPage → Article → Author(publishing, avecauthor/publisherpar@id) etProduct → Offer → Organization/seller(ecommerce, un seller node referenced depuis chaque produit). - Three échec modes: (1) inconsistent/non-unique
@idvaleurs; (2) orphaned références — an@idcited mais jamais declared (semantically incomplete, pas invalide JSON-LD; silent échec since validators souvent ne pas erreur); (3) duplicate complet declarations de le même entity (maintenance trap — même-entity repeats merge sous JSON-LD’s node règles, mais reusing un@idpour genuinely différent entities est a réel conflict). - Sûr par défaut: consistent
@ideverywhere plus le complet entity graph on chaque page que nécessite il — ne pas rely on cross-page fetching. (Yoast, Momentic, Schema App tout converge ici.) - Valider avec le Résultats enrichis Tester (resolves
@iddans le testé doc) et le schema.org validator; tester le rendu page. - Pas a classement or rich-résultat lever par itself — c’est entity understanding (disambiguation + de-duplication).
«## Official documentation » (Traduction) (Résumé en français de la section quatre-vingt-onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation and specs. » (Traduction) (Résumé en français de la section quatre-vingt-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google
» (Traduction) (Résumé en français de la section quatre-vingt-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- General Structured Data Guidelines — the one page where Google documents nesting vs. individual items and the @id-linking principle (last updated July 10, 2026, confirmed live). Also the “duplicate the same structured data on all page duplicates” guidance.
» (Traduction) (Résumé en français de la section quatre-vingt-treize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Intro to How Structured Data Markup Works — format context and the completeness/accuracy rules.
» (Traduction) (Résumé en français de la section quatre-vingt-treize, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Rich Results Test — parses @graph and resolves @id references within the tested document.
» (Traduction) (Résumé en français de la section quatre-vingt-treize, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«schema.org / W3C
» (Traduction) (Résumé en français de la section quatre-vingt-quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- W3C JSON-LD 1.1 Recommendation — the spec that defines @id, @graph, node objects, and graph objects.
» (Traduction) (Résumé en français de la section quatre-vingt-quatorze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Schema Markup Validator — schema.org’s vocabulary validator (less tied to Google’s rich-result support list).
» (Traduction) (Résumé en français de la section quatre-vingt-quatorze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«Bing / Microsoft
» (Traduction) (Résumé en français de la section quatre-vingt-quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Introducing JSON-LD Support in Bing Webmaster Tools — Bing’s Markup Validator supports JSON-LD; note there is no published Bing guidance specific to @id/@graph nesting mechanics.
» (Traduction) (Résumé en français de la section quatre-vingt-quinze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section quatre-vingt-dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record statements depuis Google. Chaque lien est a deep lien que jumps à le quoted passage.
Google — nesting vs. individual éléments
- “Google Search understands plusieurs éléments on a page, si vous nest le éléments or specify chaque élément individually.” — Recherche Google Central, General Données structurées Guidelines. Jump à citation
Google — pourquoi @id exists (the linking principle)
«- “…use @id in 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.”
— same page.
Jump to quote
» (Traduction) (Résumé en français de la section cent trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Google — treat chaque page as self-contained (le 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.” — same page. Jump to quote » (Traduction) (Résumé en français de la section cent cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On what’s pas on the record
«Google’s docs never explicitly confirm whether @id references resolve across
pages, and I couldn’t verify any on-the-record statement from a named Google or Bing
rep resolving that question. Where this article says “the safe default is consistent
@id plus the full graph per page,” that’s practitioner consensus (Yoast, Momentic,
Schema App converging independently), not a Google quote — I’ve labeled it as such
in the Advanced tab rather than dressing it up as official.
» (Traduction) (Résumé en français de la section cent sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
@id/@graph n’est pas a facteur de classement suit depuis Google’s
broader, repeatedly-stated position que données structurées n’est pas a direct classement
signal — il n’est pas a verbatim @id-spécifique citation. Nested schema — cheat sheet
@id vs. url vs. @graph
| Chose | Ce que c’est | Doit il resolve à une page? |
|---|---|---|
@id | Unique identifier pour an entity (node dans le graph) | Aucun — identification, pas fetchability |
url | Le entity’s réel, fetchable page | Oui — c’est an réel URL |
@graph | Array bundling connected entities dans un <script> bloquer | N/A — c’est a container mot-clé |
@id conventions
«- Absolute URL + descriptive fragment: https://example.com/#organization.
» (Traduction) (Résumé en français de la section cent quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Case-sensitive — #Author ≠ #author. Pick one, never drift.
» (Traduction) (Résumé en français de la section cent quinze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Same entity → same @id everywhere. Different entities → different @id.
» (Traduction) (Résumé en français de la section cent quinze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Never a bare arbitrary string ("id1").
» (Traduction) (Résumé en français de la section cent quinze, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«The two patterns » (Traduction) (Résumé en français de la section cent seize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Pattern | Chain | Reference by @id |
| --- | --- | --- |
| Publishing | WebSite → WebPage → Article | author → Person, publisher → Organization |
| Ecommerce | Product → Offer | seller → Organization |
» (Traduction) (Résumé en français de la section cent dix-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Three things to watch for » (Traduction) (Résumé en français de la section cent dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
| Mistake | Ce que se produit |
|---|---|
Inconsistent / non-unique @id | Même entity vu as deux (or deux entities collapsed dans un) |
| Orphaned référence | @id cited mais jamais declared → connection silently fails (valide JSON-LD, mais semantically incomplete; souvent aucun validator erreur) |
| Duplicate complet declarations | Bloat + maintenance trap (même-entity repeats merge sous JSON-LD’s règles; reusing un @id pour différent entities est le réel conflict) |
Fast facts
- Google confirms les deux nesting et individual éléments fonctionner;
@graphest optional. - Google fait pas document cross-page
@idresolution — assume per-page. - Sûr par défaut: consistent
@id+ complet graph on chaque page que nécessite il. - Pas a classement or rich-résultat lever — c’est entity understanding.
- Valider avec le Résultats enrichis Tester (resolves
@iddans-document) et le schema.org validator; tester le rendu page.
Nesting anti-patterns
Le spécifique façons nested schema goes incorrect — et le corriger pour chaque.
Drifting @id conventions à travers templates
Votre blog template emits #organization, votre produit template emits #org, et a
migrated section emits #company. Three strings, un réel entity — maintenant vu as
three. Corriger: un documented convention, applied mechanically (ideally generated
depuis a unique config, le façon plugins faire il).
Referencing an entity vous jamais declared (orphan)
"author": {"@id": "#person-jane"} avec aucun #person-jane node anywhere dans le
document. Le lien resolves à rien et le connection fails — et le Rich
Résultats Tester généralement ne va pas erreur, il simplement ne va pas montrer le connection. Corriger: chaque
@id vous référence doit être declared une fois, dans le testé markup, avec a @type.
Re-declaring le complet entity on chaque page
Copy-pasting le complet Organization (nom, logo, chaque sameAs) inline dans
chaque article et produit. Fonctionne, mais c’est a maintenance trap: modifier le logo une fois,
forget forty pages, et votre entity maintenant contradicts itself. Corriger: declare une fois,
référence par @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 le homepage et referencing il par @id depuis
produit pages, expecting Google à récupérer il. Google’s docs ne pas confirmer ce fonctionne.
Corriger: garder @id consistent, mais inclure le complet entity on chaque page que
références il.
@id c’est vraiment meant à être url (or vice versa)
En utilisant @id où vous besoin a fetchable page référence, or expecting url à lien
graph nodes. ils sont différent jobs. Corriger: @id pour graph identity, url pour le
réel page; an entity peut ont 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 le deux patterns et a correct référence.
Publishing: Site web → 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: Produit → 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 et applied everywhere (e.g.{base}/#organization,{page}/#webpage,{profile}/#person). - Même entity → même
@idà travers chaque page et template (aucun#orgvs.#organizationdrift; cas et trailing slashes normalized). - Aucun orphaned références — chaque
@idvous référence est en réalité declared, dans le testé document, avec a@typeet properties. - Aucun duplicate complet declarations — shared entities (
Organization,Person) sont declared une fois et referenced par@id, pas re-pasted inline. -
@idvs.urlutilisé correctement —@ididentifies le node;urlpoints à le réel page; an entity peut ont les deux. - Seulement genuinely connexe entities sont connected — aucun unrelated éléments bundled simplement à ajouter markup.
- Complet graph on chaque page que nécessite il — ne pas rely on cross-page
@idresolution; inclure le referenced entities par page. - Validated dans le Résultats enrichis Tester (connections montrer as lié) et le schema.org validator.
- Testé on le rendu page, pas simplement template source (confirmer JS-injected JSON-LD est en réalité présent; serveur-rendre 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, et le mistakes que break a nested graph.
Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon connexe writing
- Données structurées: Ce que c’est et Comment utiliser Il — mon Ahrefs guide à schema types, implementation méthodes, validation outils, et le
sameAsentity-disambiguation risque (le entity-understanding job@id/@graphsert). - Le Beginner’s Guide à SEO technique — où données structurées sits dans le bigger technique picture.
«My speaking » (Traduction) (Résumé en français de la section cent soixante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- How Search Works (SlideShare) — my walkthrough of crawling, rendering, indexing, and ranking, for the context structured data feeds into. (My standing disclaimer applies: “This is my understanding of systems… not going to be 100% complete or accurate.”) » (Traduction) (Résumé en français de la section cent soixante, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
Official
- Google’s General Données structurées Guidelines — nesting vs. individual éléments et le
@id-linking principle. - W3C JSON-LD 1,1 Recommendation — le spec defining
@id,@graph, et node/graph objects. - Résultats enrichis Tester et le schema.org validator — le deux outils pour checking a nested graph.
Depuis autour le industry
- Nous Tracked 1 885 Pages Ajout Schema. AI Citations Barely Déplacé. (Louise Linehan & Xibeijia Guan, Ahrefs) — an Ahrefs study on schema et AI citations, utile pour calibrating expectations que clean markup, notamment nesting, est entity infrastructure plutôt que a citation cheat code.
- Node Identifiers: Depuis Données structurées à Lié Données (Patrick Hathaway, Sitebulb) — le clearest “what a node identifier actually is” explainer, avec a worked distinct-
@idexemple et le case-sensitivity warning. - Ce que est an @id dans Données structurées? (Mark van Berkel, Schema App) — cites le JSON-LD spec definition et le utile “entity home” framing (lune page où an entity’s complet definition lives).
- Ce que est Nesting dans Balisage de données structurées? (Jasmine Drudge-Willson, Schema App) — nesting-pour-hierarchy vs. -convenience, et pourquoi nesting unrelated entities est a mistake.
- Schema: Technology et approche (Yoast developer docs) — a réel production
@grapharchitecture, son@idtemplate, et le candid “nous sortie le complet graph on chaque page plutôt que rely on cross-page resolution” choice. - En utilisant @id dans Schema.org Markup pour le SEO, LLMs & Knowledge Graphs (Tyler Einberger, Momentic) — a clean catalog de 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.