# Grafo de producto: cómo se enlazan Product, Offer y Brand

> Qué es el grafo de producto de una ficha: los nodos Product, Offer, Organization, Brand y Review enlazados por @id, y cómo comprobar que están conectados.

URL: https://clione.ai/es/glosario/grafo-de-producto/
Lang: es

Una [ficha de producto](/es/glosario/ficha-de-producto/) no se describe con un solo nodo de [datos estructurados](/es/glosario/datos-estructurados/). Está el producto, pero también la oferta con su precio, la tienda que lo vende, la marca que lo fabrica y las opiniones de quienes lo han comprado. Llamamos grafo de producto a ese conjunto y, sobre todo, a **los enlaces que lo unen**. No es un término de ninguna especificación ni un tipo de [Schema.org](/es/glosario/schema-org/): es la forma de mirar el marcado de una ficha como lo que es, una red de cosas relacionadas. Tampoco es el [Knowledge Graph](/es/glosario/knowledge-graph/) de Google, que es la base de datos del buscador sobre el mundo. Te importa porque un producto con precio pero sin vendedor, o con una marca escrita como texto suelto, dice menos de lo que crees.

## Cómo funciona

La especificación [JSON-LD](/es/glosario/json-ld/) del W3C describe sus datos como **un grafo dirigido y etiquetado**: los nodos son recursos, y las propiedades son los arcos que los unen.[^w3c-json-ld11] Cada nodo puede llevar un identificador con `@id`, y otro nodo puede citarlo con una referencia, un objeto que solo lleva ese `@id`.[^w3c-json-ld11] La especificación distingue dos maneras de relacionar nodos: **anidar** uno dentro de una propiedad de otro, que crea una relación de padre e hijo, o **referenciarlo** por su identificador.[^w3c-json-ld11]

En una tienda, los nodos y sus enlaces salen del vocabulario de Schema.org. Estos son los que forman el grafo de un producto:

| Desde                                   | Propiedad                 | Hacia                                                                                   | Qué dice el enlace                                                                                     |
| --------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| [Product](/es/glosario/schema-product/) | `offers`                  | [Offer](/es/glosario/schema-offer/)                                                     | Que existe una oferta para vender o proporcionar ese producto.[^schemaorg-product]                     |
| Offer                                   | `seller`                  | [Organization](/es/glosario/schema-organization/) o Person                              | Quién vende, alquila o presta el producto.[^schemaorg-offer]                                           |
| Product                                 | `brand`                   | [Brand](/es/glosario/schema-brand/) u [Organization](/es/glosario/schema-organization/) | La marca o marcas asociadas al producto.[^schemaorg-product]                                           |
| Product                                 | `review`                  | [Review](/es/glosario/schema-review/)                                                   | Una reseña del producto.[^schemaorg-product]                                                           |
| Product                                 | `aggregateRating`         | [AggregateRating](/es/glosario/aggregaterating/)                                        | La valoración global, calculada a partir de un conjunto de reseñas o valoraciones.[^schemaorg-product] |
| Offer                                   | `hasMerchantReturnPolicy` | [MerchantReturnPolicy](/es/glosario/merchantreturnpolicy/)                              | La [política de devoluciones](/es/glosario/politica-de-devoluciones/) que se aplica.[^schemaorg-offer] |
| Offer                                   | `shippingDetails`         | [OfferShippingDetails](/es/glosario/offershippingdetails/)                              | Las condiciones y opciones de envío de esa oferta.[^schemaorg-offer]                                   |
| Product                                 | `isVariantOf`             | [ProductGroup](/es/glosario/productgroup/)                                              | El producto base del que esta variante deriva.[^schemaorg-product]                                     |

Que dos nodos estén en la misma página no los une. Google explica que entiende varios elementos en una página tanto si van anidados, con un elemento principal y los demás agrupados bajo él, como si van por separado; y para los que se entienden mejor juntos pide **usar `@id` en los dos** y así indicar la relación.[^google-sd-policies] Por eso, en un grafo bien hecho, lo que solo tiene sentido dentro del producto va anidado (su oferta, sus reseñas), y lo que se repite en todo el sitio, como la tienda, se describe una vez con un `@id` estable y se cita desde donde haga falta.

### Lo que Google hace con él

Google tiene dos funciones para productos: los fragmentos de producto, para páginas donde no se puede comprar directamente, y las [fichas de comerciante](/es/glosario/fichas-de-comerciante/), para páginas donde el cliente puede comprarte el producto. Si una página lleva las propiedades obligatorias de las fichas de comerciante, también puede optar a los fragmentos de producto, y **cuantas más propiedades añades, a más mejoras puede optar**.[^google-product] Google recomienda además que la política de devoluciones de la tienda y su programa de fidelización vayan en un nodo Organization anidado.[^google-product] Es decir: parte del grafo no cuelga del producto, sino de la tienda.

## En una tienda

Un **ejemplo ficticio**: la ficha de una lámpara de una tienda inventada, con el grafo completo y recortado a lo esencial.

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://www.example.com/#organization",
      "name": "Luz de Arnes",
      "url": "https://www.example.com/"
    },
    {
      "@type": "Product",
      "@id": "https://www.example.com/lampara-sobremesa-oria#product",
      "name": "Lámpara de sobremesa Oria",
      "brand": { "@type": "Brand", "name": "Oria Studio" },
      "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "4.6",
        "reviewCount": "38"
      },
      "offers": {
        "@type": "Offer",
        "price": "89.00",
        "priceCurrency": "EUR",
        "availability": "https://schema.org/InStock",
        "seller": { "@id": "https://www.example.com/#organization" }
      }
    }
  ]
}
```

Dibujado, el grafo queda así:

```text
Product (#product)
  +-- brand ----------> Brand "Oria Studio"
  +-- aggregateRating -> AggregateRating 4,6 (38 reseñas)
  +-- offers ---------> Offer 89,00 EUR
                          +-- seller --> Organization (#organization)
```

Se lee de arriba abajo. El producto tiene su `@id`, así que otra página o la misma página pueden citarlo. La marca, la valoración y la oferta van anidadas porque solo tienen sentido dentro de este producto. La tienda, en cambio, está descrita una vez, fuera del producto, y la oferta la cita por su `@id`: ese enlace es el que dice **quién vende**. Quita el `seller` y el marcado ya no dice quién vende; cambia una letra del `@id` y la referencia apunta a un nodo que no existe. Con el [identificador `@id`](/es/glosario/id-json-ld/) bien elegido, el mismo nodo de la tienda sirve para todas las fichas.

Una ficha publicada con Clione lleva un solo `@graph` con Organization, [WebSite](/es/glosario/schema-website/), BreadcrumbList y [Product](/es/glosario/schema-product/), con una oferta por producto, y su nodo Product tiene un `@id` estable que convive con el del tema en lugar de duplicarlo.


Creer que, como el producto está en tu web, el marcado ya dice que lo vendes tú. No lo dice: la especificación JSON-LD trata cada relación como una propiedad que hay que escribir,[^w3c-json-ld11] y la que dice quién vende una oferta es `seller`.[^schemaorg-offer] Un Product y un Organization en la misma página, sin esa referencia, son dos nodos sin relación, y Google avisa de que debes enlazar con `@id` lo que se entiende mejor junto.[^google-sd-policies]


## Cómo comprobarlo

1. **Abre el código fuente de una ficha y localiza el nodo Product.** Apunta su `@id`; si no tiene, el producto es anónimo y nadie puede citarlo.[^w3c-json-ld11]
2. **Sigue `offers`.** Tiene que haber una Offer, y su `seller` tiene que apuntar a un `@id` que exista en la página, letra por letra.
3. **Mira `brand`.** La marca tendría que ser un nodo Brand u Organization con su nombre,[^schemaorg-product] y coincidir con la marca que se ve en la ficha.
4. **Comprueba que las reseñas y la valoración del marcado se ven en la página.** Google pide no marcar lo que el visitante no ve.[^google-sd-policies]
5. **Dibújalo en un papel.** Un recuadro por nodo y una flecha por propiedad. Todo nodo al que no llega ni del que sale ninguna flecha es una isla.

## Concepto cercano: @graph

El [`@graph`](/es/glosario/graph/) es una palabra clave de JSON-LD: la lista que reúne varios nodos en un mismo bloque, con un único contexto. El grafo de producto es otra cosa: **la red de enlaces que rodea a un producto, esté escrita como esté**. Se puede escribir un grafo de producto completo sin `@graph`, con todos los nodos anidados dentro del Product, y se puede tener un `@graph` con cuatro nodos que no forman ningún grafo, porque la especificación permite que un `@graph` de nivel superior contenga nodos que no estén conectados.[^w3c-json-ld11] **El `@graph` dice qué nodos hay; el grafo de producto, cómo se relacionan.**

Para seguir, la guía para [auditar los datos estructurados de una ficha](/es/guias/auditar-ficha-de-producto/) aplica estas comprobaciones paso a paso, y la [ruta de lectura de datos estructurados](/es/aprender/datos-estructurados/) ordena el resto de tipos.
