# Strukturerad data

## Vad det är

Ett företags kontaktsida säger i en mening var kontoret ligger. Strukturerad
data säger samma sak en gång till, som en `PostalAddress` med gatuadress,
postnummer och land, så att ett program som läser sidan slipper gissa vilket ord
som är orten. Det är bruket att upprepa det som en sida säger i löptext som
typade påståenden i ett ordförråd som utgivare och läsande program är överens
om, så att sökmotorer och annan mjukvara kan läsa fakta utan att tolka layouten.
Ordet behandlas som en mängd och inte som något räknebart, och i bestämd form
heter det den strukturerade datan.

Ordförrådet är oftast schema.org, som enligt Googles dokumentation är det
ordförråd som merparten av den strukturerade datan för Googles sökning bygger
på. Google, Microsoft, Yahoo och Yandex grundade det, och sedan april 2015 är en
gemenskapsgrupp (community group) inom W3C dess huvudsakliga forum. Det
definierar typer, som `Organization`, `Person`, `Service`, `Review` eller
`DefinedTerm`, och de egenskaper som varje typ kan bära, som `name`, `address`,
`author` eller `price`.

Påståendena kan skrivas i tre syntaxer. Microdata och RDFa lägger attribut
direkt på de synliga HTML-elementen. JSON-LD håller påståendena åtskilda, som
ett block JSON i ett `script`-element av typen `application/ld+json`, och är i
version 1.1 en W3C-rekommendation, publicerad den 16 juli 2020. Google godtar
alla tre som likvärdiga och rekommenderar JSON-LD som den som är lättast att
underhålla i stor skala.

```html
<script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Organization",
        "@id": "https://example.com/#organization",
        "name": "Example Ltd",
        "url": "https://example.com/"
    }
</script>
```

Den viktigaste raden i blocket är `@id`. JSON-LD använder den för att
identifiera en nod, och en nod utan identifierare är en så kallad blank node,
som ingenting utanför det egna blocket kan peka på. Med en identifierare kan
vilket annat block som helst, på vilken annan sida som helst, skriva
`"publisher": {"@id": "https://example.com/#organization"}`, vilket
specifikationen kallar en nodreferens (node reference): en pekare till något som
beskrivs på annat håll, i stället för en ny beskrivning av det. Det är
identifierarna som gör en spridd samling block till en enda graf.

Närmaste grannterm är metadata. Titeln, beskrivningen och Open Graph-taggarna i
sidans `head` beskriver sidan som dokument, medan strukturerad data beskriver
det som sidan handlar om: företaget bakom den, personen som skrev den, tjänsten
den erbjuder eller ordet den definierar.

## Varför det spelar roll

Beslutet gäller hur mycket som ska sägas, och det ärliga svaret är oftast mindre
än ordförrådet tillåter, men komplett. Ingenting i syntaxen hindrar en utgivare
från att fylla i varje egenskap som schema.org erbjuder. Googles egna riktlinjer
pekar åt andra hållet: ange färre rekommenderade egenskaper, kompletta och
korrekta, hellre än alla tänkbara med ofullständiga eller felaktiga uppgifter,
och märk inte upp något som en läsare inte kan se på sidan, inte ens när det är
sant.

Skälet är att varje uppmärkt faktum är en andra kopia av något som sidan redan
säger, och en andra kopia kan glida isär från originalet. Ett pris som ändrats i
den synliga tabellen men glömts i JSON-blocket, ett betyg som bara maskiner ser,
en adress som skrivits lite olika på varje sida: var och en får sidan att säga
en sak till människor och en annan till program. Kostnaden för strukturerad data
ligger mindre i att skriva den än i att hålla den sann, så de användbara
frågorna är vilka påståenden sidan kan stå för och om de kommer från samma källa
som den synliga texten.

Vinsten är läsbarhet för maskiner. En sökmotor eller en agent som kan foga
samman hundra omnämnanden till ett enda företag vet mer än en som läser hundra
namn utan samband. Sidor som följer riktlinjerna kan bli berättigade till
utökade resultat (rich results), sökträffar med extra detaljer, men att vara
berättigad garanterar inga sådana. Det som förändras är hur väl en maskin
förstår vad sidan handlar om.

## Så ser det ut i praktiken

Webbplatsens kolofon
[lovar att bara märka upp det som är sant och synligt på sidan](/sv/credits/),
och historiken bakom webbplatsens strukturerade data visar varför den meningen
behövde skrivas ned.

Före omarbetningen
[beskrev 963 block företaget 1 671 gånger, utan en enda stabil identifierare](/sv/portfolio/replaced-963-structured-data-blocks-with-one-graph-138/),
så ingen som läste datan hade grund för att behandla organisationen på en sida
som organisationen på en annan. Grafen vilar nu på tre identifierare som skapas
utifrån webbplatsens ursprung, en för organisationen, en för webbplatsen och en
för grundaren, och varje annat block refererar till dem med `@id` i stället för
att beskriva dem igen. Identifierarna är desamma på alla språk: en kommentar i
mallen förklarar att en separat dansk identifierare skulle deklarera en andra
organisation med samma CVR-nummer. Sexton typer används, och listor nämner sina
poster enbart med URL, eftersom det skulle ha gjort den komprimerade indexsidan
för portföljen 52 % tyngre att skriva ut alla 107 poster.

Flera fakta läses från samma källa som den synliga sidan. Tjänstepriserna kommer
från samma datafil som priserna på skärmen, så en maskin och en läsare får samma
pris. Perioden som ett arbete omfattar kommer från den partial som skriver
meningen om det. Brödsmulorna följer den synliga stigen, och positionerna i
listor följer ordningen på skärmen, aldrig en rangordning som bara publiceras
för maskiner. Sidans egen nod använder samma adress som sidan anger som kanonisk
URL, så att märkningen och sidans `head` gör ett och samma påstående.

Det som lämnas bort är lika avsiktligt som det som sägs. Företagets egna
beskrivningar av sitt arbete märks inte upp som recensioner, eftersom det skulle
hitta på en författare till dess egna ord. Rekommendationer från namngivna
personer märks upp, men utan betyg, eftersom ingen har gett något. Varje sida i
ordlistan, den här inräknad, bär en `DefinedTerm` vars beskrivning är den
enradiga förklaringen som visas i listan, så att definitionen en maskin läser är
densamma som en läsare ser.

En kontroll över den byggda webbplatsen säkerställer att varje block går att
tolka, att varje identifierare går att slå upp och att varje URL som grafen
nämner faktiskt byggdes, så en graf som pekar på en sida som inte finns stoppas
i kvalitetsgrinden. Samma kolofon listar Schema Markup Validator för att läsa
datan och Googles Rich Results Test för att se vad en sökmotor gör med den.

## Var det går fel

**Sidan visas som en vanlig sökträff trots att varje validator godkänner den.**
Märkningen är giltig JSON-LD och använder riktiga typer från schema.org, men
sidan fortsätter att dyka upp utan extra detaljer. Datan beskriver sådant som en
läsare inte kan se, som ett betyg som ingen har gett, frågor som är dolda på
sidan eller ett pris som skiljer sig från det på skärmen, och Google varnar för
att märkning som bryter mot riktlinjerna kan göra att en sida inte är berättigad
till utökade resultat, hur ren syntaxen än är. Märk bara upp det som sidan
visar, och generera båda från en källa så att de inte kan glida isär.

**Hundratals block beskriver ett och samma företag, och inget fogar samman
dem.** Varje sida upprepar organisationens namn, logotyp och adress, ibland med
små skillnader, och att rätta en detalj innebär att leta upp alla. Noderna är
anonyma, eller så skapar varje sida och varje språk sin egen identifierare för
samma sak. Ge varje verklig sak ett `@id` byggt av en stabil URL med ett
fragment, beskriv den en gång och referera till den överallt annars.

**En ändring i en mall förstör märkningen på alla sidor på en gång.** Ett
citattecken på fel ställe, ett avslutande kommatecken eller ett tomt värde gör
varje block ogiltigt, och ingen som läser datan kan använda något av den.
Googles guide varnar för att mallar kan förstöra märkningen efter en
driftsättning. JSON-blocket sattes ihop som text, med värden inklistrade mellan
klammerparenteser, så ett fält som saknas lämnar en tom sträng eller en trasig
struktur. Bygg påståendet som en datastruktur och serialisera det, som den här
webbplatsens mallar gör med Hugos `jsonify`, utelämna egenskaper som saknar
värde i stället för att skriva ut dem tomma, och tolka varje block i det byggda
resultatet.

**Grafen nämner sidor som inte finns.** URL:erna i märkningen leder till en
404-sida, en testmiljö eller en speglad kopia. Adresserna skrevs för hand eller
byggdes efter en annan regel än länkarna och den kanoniska adressen. Härled
varje URL i märkningen från samma funktion som tar fram sidans kanoniska adress,
och kontrollera att var och en byggdes.

## Läs mer

- [schema.org](https://schema.org/)
  — det gemensamma ordförrådet av typer och egenskaper, med en sida för varje
  typ.
- [JSON-LD 1.1](https://www.w3.org/TR/json-ld11/)
  — W3C-rekommendationen för syntaxen, med nodidentifierare och nodreferenser.
- [schema.org: DefinedTerm](https://schema.org/DefinedTerm)
  — typen som varje sida i ordlistan använder för att beskriva ordet den
  förklarar.
- [Google Search Central: introduction to structured data](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)
  — de tre syntaxerna, regeln om synlighet och hur utökade resultat testas.
- [Schema Markup Validator](https://validator.schema.org/)
  — läser den strukturerade datan på vilken sida som helst mot ordförrådet i
  schema.org.

<https://engineer.company/sv/glossary/structured-data/>
