So sieht die übliche Auszeichnung einer Person aus:
"knowsAbout": ["SEO", "Barrierefreiheit", "PHP"]
Gültig nach schema.org, und für eine Maschine trotzdem fast wertlos. „SEO“ ist eine Zeichenkette. Ob damit dasselbe gemeint ist wie im Profil nebenan, wo „Suchmaschinenoptimierung“ steht, kann kein auswertendes System entscheiden.
Dieselbe Angabe, aufgelöst
"knowsAbout": [{
"@type": "DefinedTerm",
"@id": "https://knowsabout.me/skills/suchmaschinenoptimierung#term",
"name": "Suchmaschinenoptimierung",
"url": "https://knowsabout.me/skills/suchmaschinenoptimierung",
"inDefinedTermSet": {"@id": "https://knowsabout.me/skills/#set"}
}]
Jetzt hat der Begriff eine Kennung, eine erreichbare Seite und eine Zugehörigkeit. Zwei Personen, die dasselbe können, verweisen auf dieselbe @id – und das ist der Punkt, an dem aus zwei Wortlisten ein Graph wird.
Wichtig dabei: Ein DefinedTerm ohne erreichbare Adresse bringt nichts. Deshalb erscheinen hier nur Fähigkeiten mit Artikel in der Auszeichnung; Vorschläge bleiben draußen.
Der Rückweg
Auf der Fähigkeitsseite steht der Begriff als DefinedTerm im DefinedTermSet des Portals, dazu eine ItemList mit den Personen – jede als @id-Verweis auf den Person-Knoten ihrer Profilseite. Beide Richtungen sind auflösbar, und kein Inhalt steht doppelt im Markup.
Ein Detail, das mehr aussagt, als es aussieht: itemListOrder. Reicht die Datengrundlage für eine Reihung nicht, steht dort ItemListUnordered – die ausdrückliche maschinenlesbare Aussage, dass Platz eins nichts bedeutet. Erst oberhalb der Schwelle wird daraus ItemListOrderDescending, mit dem Kriterium in der Beschreibung.
Was bewusst fehlt
Es wäre technisch möglich, die Bestätigungen einer Person als aggregateRating auszugeben – Sterne am Personenprofil. Das wäre erstens inhaltlich falsch, weil eine Bestätigung keine Bewertung auf einer Skala ist, und zweitens genau das Muster, das Suchmaschinen bei selbst erzeugten Bewertungen abwerten. Die Zahl steht deshalb als InteractionCounter, und die einzelnen Aussagen stehen als EndorseAction – aber nur die mit Begründungstext. Eine Bestätigung ohne Satz trägt im Markup nichts bei, was der Zähler nicht schon sagt.
Für „A bestätigt B für Fähigkeit C“ gibt es in schema.org keinen exakt passenden Typ. EndorseAction mit agent, endorsee und object kommt am nächsten. Das ist eine Auslegung, und sie steht hier, damit sie jemand widerlegen kann.