スキーママークアップのネスト(@idと@graph)

@idと@graphでJSON-LDのエンティティを接続する方法を解説します。WebSiteからArticle、ProductからOfferへの標準パターン、グラフを壊す3つのミス、Googleの文書が確認している範囲を扱います。

初回公開:2026年7月2日 · 最終更新:2026年8月13日 · Advanced
言語

ネストは、JSON-LDのエンティティをばらばらに置かず、安定した一意の @id で接続する方法です。@graph は関連エンティティを1つのスクリプトにまとめます。安全な実装では、同じエンティティに一貫した @id を使い、必要な各ページに完全なグラフを置きます。標準パターンは WebSite → WebPage → Article → Author と Product → Offer → Organization です。不整合なID、孤立参照、完全な宣言の重複を避けてください。Googleはネストと個別項目の両方を理解しますが、ページ間の @id 解決は明言していません。これは順位施策ではなく、エンティティ理解と保守性のための仕組みです。

要点 — ネストは、安定した一意のURI(通常は正規URLと #fragment)である @id を介してJSON-LDエンティティを接続し、エンティティの再宣言を避けます。@graph は関連エンティティを1つのスクリプトにまとめるキーワードです。Googleはネストと個別項目の両方が機能し、関連項目を @id で結ぶことを確認しています。ただし、@idページをまたいで解決されるかは明言していません。安全な既定値は、一貫した @id と、それを必要とする各ページ上の完全なエンティティグラフです。覚えるべきパターンは、公開コンテンツの WebSite → WebPage → Article → Author と、ECの Product → Offer → Organization/seller の2つです。注意すべき障害は、不整合または一意でない @id孤立参照(参照されるが宣言されていない @id。JSON-LDとして無効ではないものの意味的に不完全)、同じエンティティの完全な宣言の重複です。最後のものは保守上の罠で、同一エンティティの反復はJSON-LDの規則で統合されますが、本当に異なるエンティティに同じ @id を使うと競合します。これは曖昧さと重複を減らすエンティティ理解の仕組みであり、単独で順位やリッチリザルトを生む施策ではありません。

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 guidelines

範囲:入門ではなく詳細解説

この記事は、JSON-LDとは何か、なぜ推奨形式なのかをすでに理解している前提です。スキーママークアップでは基礎と @id@graph の概要を説明しています。ここでは、実際の仕組み、標準的なノードパターン、グラフを静かに壊す具体的なミスまで掘り下げます。形式の基本や <script> ブロックの配置を知りたい場合は、関連ページのJSON-LDを参照してください。

@id — 取得可能なURLではなく、安定した識別子

@id はJSON-LDエンティティに一意のURIを割り当て、ほかのエンティティがそれを参照できるようにします。信頼できる資料に共通する慣例は、絶対形式の正規URLに意味の分かるフラグメントを加えることです。

"@id": "https://example.com/#organization"
"@id": "https://example.com/#website"
"@id": "https://example.com/team/jane-doe/#person"

ここでは、よくある誤解が2つあります。

  • 解決可能である必要はありません。 JSON-LD仕様によれば、@id の役割はノードの識別、つまりエンティティに一意で安定した「名前」を与えることであり、取得可能性ではありません。自社ドメインのURLにフラグメントを付けるのが標準的で、そのURLが独立したページとして読み込める必要はありません。Sitebulbのノード識別子ガイドは、ノード識別子を “a unique ‘name’ for an entity, which is publicly accessible and can be looked up or linked to.” (翻訳) 「公開され、検索やリンクが可能な、エンティティに対する一意の『名前』」と説明しています。
  • @idurl ではありません。 両者は別の役割を持つプロパティです。@idグラフ内のノードを識別し、url はエンティティについての実在し、取得可能なページを表します。Organization は、https://example.com/#organization という @idhttps://example.com/ という url の両方を持てますし、多くの場合そうすべきです。

また、@id の値は大文字・小文字を区別します。#Organization#organization は別のエンティティです。規則を1つ決め、そこから逸脱しないでください。

@graph — 関連エンティティを1つのブロックにまとめる

@graph は、複数のトップレベルエンティティを1つの <script type="application/ld+json"> ブロック内の配列に置き、@id で相互参照させるJSON-LDキーワードです。

{
  "@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コンテナであって必須要件ではありません。 個々の項目に別々の <script> ブロックを使っても問題なく、Googleの文書も両方の方法が機能すると確認しています。@graph を選ぶ理由は保守性です。相互参照するエンティティが3つ以上あれば、各ブロックで @context を繰り返さず先頭に一度だけ記述でき、関係するものを1か所で管理できます。Yoastも本番環境でこのパターンを使い、スキーマ設計の文書“avoid having to duplicate or repeat shared properties, and to reduce the amount of code/processing/overhead required.” (翻訳) 「共有プロパティの重複や反復を避け、必要なコード、処理、オーバーヘッドを減らせる」と説明しています。

なぜネストするのか、Googleは何を述べているか

Declare each entity once and connect the graph with stable `@id` references instead of repeating full blocks.

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は2つの構造を文書化し、どちらも理解できると確認しています。構造化データに関する一般的なガイドラインには、“Google Search understands multiple items on a page, whether you nest the items or specify each item individually.” (翻訳) 「Google検索は、項目をネストする場合でも個別に指定する場合でも、ページ上の複数の項目を理解します」とあります。さらに、ネスト“when there is one main item, and additional items are grouped under the main item” (翻訳) 「主要な項目が1つあり、追加項目がその下にまとめられている場合」、個別項目“when each item is a separate block on the same page.” (翻訳) 「各項目が同じページ上の別々のブロックである場合」と定義しています。

@id の公式な根拠に最も近い一節は次のものです。“…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.” (翻訳) 「レシピと動画の両方に @id を使用し、その動画がページ上のレシピについてのものだと指定します。項目を関連付けなければ、Google検索はその動画をレシピのリッチリザルトとして表示できることを認識できない場合があります」。つまりGoogle自身の説明でも、2つの項目が関連していると伝える仕組みが @id です。

正確さのために補足すると、Googleの文書はこの原則を文章で示していますが、@graph@id を組み合わせた実例コードは掲載していません。コード例はネストしたRecipeと2つの独立したトップレベル項目で、@id による相互参照は行っていません。以下の例はその空白を補います。

これは、スキーママークアップで説明したスキーマの2つの役割に直結します。適切なネストは、曖昧さや矛盾・重複したデータを減らすエンティティ理解の施策であり、それ自体がリッチリザルトを発生させるわけではありません。ArticleAuthor に明確に結び付けても新しい検索結果機能は解放されませんが、関係は明瞭になります。

パターン1 — WebSite → WebPage → Article → Author

公開サイトの標準パターンです。発行者である1つの Organization と1つの WebSite を置き、ページごとに WebPage とその上の Article を置きます。authorpublisher は再宣言せず @id で解決します。

{
  "@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" }
    }
  ]
}

ここでは、authorpublisher が1行の参照になっています。PersonOrganization はそれぞれ一度だけ宣言されます。ArticleWebPagemainEntityOfPage で結び付き、その WebPageWebSiteisPartOf、さらに WebSiteOrganizationpublisher として参照します。5つの孤島ではなく、接続されたグラフです。

パターン2 — Product → Offer → Organization(販売者)

これはEC版のパターンで、大規模になるほどネストが効きます。何千もの商品ページで販売者の Organization を再宣言する代わりに、一度だけ宣言し、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" }
      }
    }
  ]
}

Offerseller は共有の Organization ノードを指します。同じ販売者エンティティを一度だけ宣言し、すべての商品から参照できます。バリエーションが非常に多い場合も、共有 @id の考え方を ProductGroup と各バリエーションの Product に拡張できます。これは別の仕組みではなく、このパターンの応用です。

グラフを壊す3つのミス

ここが監査の実務上の核心です。ネストが「機能しない」ときは、ほぼ必ず次の3つのどれかに該当します。

1. 不整合または一意でない @id の値

同じエンティティにページ間(または移行の前後)で異なる @id を与えると、検索エンジンや検証ツールは1つではなく無関係な別エンティティと見なします。逆に、本当に異なる2つのエンティティに同じ @id を使うのも問題です。修正方法は、{base-url}/#organization{page-url}/#webpage{profile-url}/#person などの厳密な規則を文書化し、機械的に適用することです。大文字・小文字は区別され、#author#Author は同じではありません。

2. 孤立参照

@id参照しているのに、どこにも宣言していない状態です。たとえば "author": {"@id": "https://example.com/#person-jane"} を書いたものの、テスト対象文書内にその @id@type とプロパティ付きで宣言したノードがありません。正確には、JSON-LD仕様ノード参照、すなわち “a node object used to reference a node having only the @id key” (翻訳)@id キーだけを持ち、ノードを参照するために使われるノードオブジェクト」と呼ぶ {"@id": "..."} は、それ単体でも有効なJSON-LD構文であり、解析エラーではありません。問題は意味と利用者側にあります。「この記事の著者はこの人物」という関係が有用な情報へ解決されず、著者名、URL、sameAs が必要な機能や読者には何も届きません。検証ツールは宣言済みの各項目をエラーなしで解析することが多いため、特に見落としやすい問題です。不完全なグラフのまま公開しても気づけません。Momenticの@idガイドも、実環境でよくあるネストの失敗として挙げています。

3. 同じエンティティの完全な宣言を重複させる

孤立参照とは逆に、完全な OrganizationPerson オブジェクトを一度参照するのではなく、各ページのインラインに再宣言する状態です。ここでは2つの異なる事態を区別する必要があります。

  • 本当に同じエンティティの宣言を繰り返す場合。 JSON-LD仕様には、“the properties of a node in a graph may be spread among different node objects within a document. When that happens, the keys of the different node objects need to be merged to create the properties of the resulting node.” (翻訳) 「グラフ内のノードのプロパティは、文書内の複数のノードオブジェクトに分散してよく、その場合は各ノードオブジェクトのキーを統合して結果のノードのプロパティを作る必要がある」とあります。したがって、同じ @id と同一または互換性のあるデータの反復は解析失敗ではなく、処理系によって統合されます。ただし推奨できるわけではありません。マークアップを肥大化させ、あるテンプレートの住所やロゴだけ更新して残り40件を忘れるような保守上の罠になります。AhrefsとSchema Appも「1か所を変更して他を忘れる」という同じ問題を指摘しています。
  • 実際には異なる2つのエンティティに同じ @id を再利用する場合。 こちらは本当の破損です。2つのノードオブジェクトが同じ識別子を共有しながら、異なる名前、ロゴ、@type など競合する内容を表します。無害な統合ではなく意味的な競合なので、別エンティティごとに異なる @id を選びます。

一度宣言し、どこでも参照するという保守上の原則は変わりません。同一エンティティの反復は、孤立参照や競合する @id と同じ形で技術的にグラフを壊すわけではありませんが、避けるべきです。

未解決の問い:@id はページをまたいで解決されるか

ここには、もっともらしい断言と正確な回答を分ける限界があります。Googleの文書は、商品ページの Offer.seller がホームページだけで宣言された Organization を指す例のように、@id 参照がページをまたいで解決されるかを明示していません。Google検索セントラルの文書も、@id との関連で「cross-page」や「across pages」という表現を使っていません。

近い手掛かりは自己完結したページを支持します。Googleは重複コンテンツについて “placing the same structured data on all page duplicates, not just on the canonical page” (翻訳) 「正規ページだけでなく、重複するすべてのページに同じ構造化データを配置する」ことを推奨しています。これは構造化データが別の場所から取得されるのではなく、ページ単位で評価されることを示唆します。また、GoogleやBingの担当者(Mueller、Illyes、Splitt)がページ間の @id 問題に明確に答えた記録も確認できませんでした。BingにはWebmaster ToolsのJSON-LD検証がありますが、@id@graph 固有の公開ガイダンスはありません。これは立場を推測すべき材料ではなく、文書上の空白です。

したがって、2026年7月時点では「Googleがページをまたいで @id リンクをたどる」という見方を、確認済みの動作ではなく業界の推測として扱うべきです。Yoast、Momentic、Schema Appが独立に一致している安全な既定値は、同じエンティティの @id をどこでも一貫させつつ、必要な各ページに完全なエンティティグラフを出力することです。Googleが別URLから参照先エンティティを取得すると仮定してはいけません。Yoastも本番ではページ間解決に頼らず、各ページに完全なグラフを出力しています。

ネストしたスキーマの検証方法

使うツールは2つです。

  • リッチリザルト テスト — 2026年7月時点の実務者による検証では、@graph 配列を解析し、テスト対象文書内の @id 参照を解決します。エンティティAがBを @id で参照し、Bが同じグラフ内に宣言されていれば接続された状態で表示されます。参照先が未宣言でも、宣言済み項目は個別にエラーなく解析される一方、接続は表示できません。このUI挙動をGoogleが明示した文書は見つからないため、公式仕様ではなく再現可能な観察結果として扱い、UIが変われば再確認してください。孤立参照がエラーではなく接続欠落として見逃される理由でもあります。
  • Schema Markup Validator — schema.org自身の語彙検証ツールで、Googleが対応するリッチリザルト種別への依存が少ないものです。

テンプレートのソースだけでなく、レンダリング後のページをテストしてください。JavaScriptでJSON-LDを挿入するなら、実際に存在することを確認します。GoogleはJavaScriptで 動的に挿入されたJSON-LDの読み取りを文書化していますが、これはGoogle固有です。JavaScriptの実行動作はクローラーや製品ごとに異なり、すべてのAIクローラーが同じようにJSをレンダリングする(あるいは一切レンダリングしない)という一律の規則はありません。実行を前提にせず、最初のHTMLでJSON-LDを配信するのが保守的な選択です。これはAI向けスキーママークアップにも関わります。

打ち消しておきたい誤解

  • @id は実在し、読み込めるURLでなければならない」 いいえ。慣例では正規URLとフラグメントを使いますが、目的は取得ではなく識別です。フラグメントが独立したページに解決される必要はありません。
  • 「別ページで同じ @id を使えば、canonicalタグのようにGoogleのインデックス内でエンティティが自動統合される」 Googleの文書では確認されていません。一貫した @id は適切な運用ですが、ページ間統合が証明された仕組みではありません。
  • @graph は必須で、別々のscriptブロックは誤り」 誤りです。Googleは両方を理解します。@graph は保守性のための選択です。
  • 「ネストを増やすほどエンティティ理解が必ず向上する」 本当に関係するエンティティに限ります。Schema Appの例にある、無関係な EventRecipe の下に置くようなネストは役立たず、シグナルを曖昧にします。
  • @id@graph の構造は順位やリッチリザルトの要因」 いいえ。価値は曖昧さと重複の削減で、スキーマ自体がランキング要因ではないこととも整合します。
  • 「宣言されていない @id は無害で、エンジンが無視するだけ」 それが孤立参照です。意図した接続が形成されず、ツールもエラーを出さないことが多いため、見落としたまま公開することになります。

このトピックの位置付け

これは構造化データのハブ配下の実践層で、@id@graph を紹介するスキーママークアップと、形式を扱うJSON-LDの詳細な関連ページです。エンティティAI向けスキーママークアップと同じエンティティ理解の考え方に基づきます。利用者がGoogleのナレッジグラフでもLLMでも、適切なグラフはエンティティ基盤です。このサブクラスター全体はオンページSEOに属します。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.