Network graph of Rose-Hulman Institute of Technology built from IPEDS data: the institution at the center, linked to its address, coordinates, identifiers and six measured facts.

One university, six syntaxes: does the format change the graph?

Does it matter whether you mark up a page in JSON-LD, Microdata or RDFa? The usual answer is no. Pick one, validate it and move on.

I wanted to test that answer instead of repeating it. This is the first experiment in a series that uses one public dataset, NCES IPEDS 2024, to show how languages and ontologies change what a knowledge graph says. The code, data and outputs are all on GitHub, so you can rerun every step.

What we tested

We took one institution, Rose-Hulman Institute of Technology, and modeled its IPEDS facts once: name, 11 aliases, website, address, coordinates, two federal identifiers and six measures, including fall 2024 enrollment (2,334) and admission rate (76.9%). That came to 66 RDF triples.

Then we wrote those facts six times, once per syntax, and parsed each file back with a standard parser. Each result was compared with the original graph.

FormatIdentical graph?Same facts?
JSON-LDYesYes
TurtleYesYes
N-TriplesYesYes
JSONLYesYes
MicrodataNoYes
RDFaNoYes

The same check passes for all 45 institutions in the sample.

See it: six files, one graph

The visualization below puts all six files beside the graph they describe. Click any node, such as #admit-rate, to highlight every line in every syntax that states it.

Open the visualization in a new tab

The same fact in each syntax

Here is one slice of the graph in all six syntaxes: the university’s name, its website and its fall 2024 admission rate. That’s 9 of the 66 triples. Each heading links to the full file on GitHub.

JSON-LD

JSON-LD is the format Google recommends for structured data. Note how the decimal is written as a typed value to keep it a decimal.

{
  "@context": {
    "@vocab": "https://schema.org/",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "url": { "@type": "@id" }
  },
  "@id": "https://knowledgegraphnavigator.com/id/ipeds/152318",
  "@type": "CollegeOrUniversity",
  "name": "Rose-Hulman Institute of Technology",
  "url": "https://www.rose-hulman.edu/",
  "additionalProperty": {
    "@id": "https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate",
    "@type": "PropertyValue",
    "name": "Admission rate, fall 2024",
    "value": { "@value": "76.9", "@type": "xsd:decimal" },
    "unitText": "percent",
    "description": "IPEDS ADM2024 (admits / applicants)"
  }
}

Microdata

Microdata adds attributes to visible HTML. The lang="en" on the page and the <data> element are where the two differences come from.

<html lang="en">
  ...
  <div itemscope itemtype="https://schema.org/CollegeOrUniversity"
       itemid="https://knowledgegraphnavigator.com/id/ipeds/152318">
    <span itemprop="name">Rose-Hulman Institute of Technology</span>
    <a itemprop="url" href="https://www.rose-hulman.edu/">https://www.rose-hulman.edu/</a>
    <div itemprop="additionalProperty" itemscope
         itemtype="https://schema.org/PropertyValue"
         itemid="https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate">
      <span itemprop="name">Admission rate, fall 2024</span>
      <data itemprop="value" value="76.9">76.9</data>
      <span itemprop="unitText">percent</span>
      <span itemprop="description">IPEDS ADM2024 (admits / applicants)</span>
    </div>
  </div>

RDFa

RDFa also adds attributes to HTML, but it can declare a datatype, so the decimal survives. The language tag still comes through.

<html lang="en">
  ...
  <div vocab="https://schema.org/" prefix="xsd: http://www.w3.org/2001/XMLSchema#">
    <div resource="https://knowledgegraphnavigator.com/id/ipeds/152318" typeof="CollegeOrUniversity">
      <span property="name">Rose-Hulman Institute of Technology</span>
      <a property="url" href="https://www.rose-hulman.edu/">https://www.rose-hulman.edu/</a>
      <div property="additionalProperty"
           resource="https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate" typeof="PropertyValue">
        <span property="name">Admission rate, fall 2024</span>
        <span property="value" content="76.9" datatype="xsd:decimal">76.9</span>
        <span property="unitText">percent</span>
        <span property="description">IPEDS ADM2024 (admits / applicants)</span>
      </div>
    </div>
  </div>

Turtle

Turtle is the most readable way to write RDF by hand. A bare 76.9 is a decimal in Turtle, with no extra syntax.

@prefix inst: <https://knowledgegraphnavigator.com/id/ipeds/152318#> .
@prefix schema: <https://schema.org/> .

<https://knowledgegraphnavigator.com/id/ipeds/152318> a schema:CollegeOrUniversity ;
    schema:name "Rose-Hulman Institute of Technology" ;
    schema:url <https://www.rose-hulman.edu/> ;
    schema:additionalProperty inst:admit-rate .

inst:admit-rate a schema:PropertyValue ;
    schema:name "Admission rate, fall 2024" ;
    schema:value 76.9 ;
    schema:unitText "percent" ;
    schema:description "IPEDS ADM2024 (admits / applicants)" .

N-Triples

One complete triple per line, with no shortcuts. Verbose, but easy for machines to stream, sort and compare.

<https://knowledgegraphnavigator.com/id/ipeds/152318> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/CollegeOrUniversity> .
<https://knowledgegraphnavigator.com/id/ipeds/152318> <https://schema.org/name> "Rose-Hulman Institute of Technology" .
<https://knowledgegraphnavigator.com/id/ipeds/152318> <https://schema.org/url> <https://www.rose-hulman.edu/> .
<https://knowledgegraphnavigator.com/id/ipeds/152318> <https://schema.org/additionalProperty> <https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> .
<https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/PropertyValue> .
<https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> <https://schema.org/name> "Admission rate, fall 2024" .
<https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> <https://schema.org/value> "76.9"^^<http://www.w3.org/2001/XMLSchema#decimal> .
<https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> <https://schema.org/unitText> "percent" .
<https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate> <https://schema.org/description> "IPEDS ADM2024 (admits / applicants)" .

JSONL

JSONL is the same JSON-LD with the whitespace removed, one complete document per line. The full file holds all 45 institutions, one per line, which is how batch pipelines and LLM workflows tend to move records.

{"@context": {"@vocab": "https://schema.org/", "xsd": "http://www.w3.org/2001/XMLSchema#", "url": {"@type": "@id"}}, "@id": "https://knowledgegraphnavigator.com/id/ipeds/152318", "@type": "CollegeOrUniversity", "name": "Rose-Hulman Institute of Technology", "url": "https://www.rose-hulman.edu/", "additionalProperty": {"@id": "https://knowledgegraphnavigator.com/id/ipeds/152318#admit-rate", "@type": "PropertyValue", "name": "Admission rate, fall 2024", "value": {"@value": "76.9", "@type": "xsd:decimal"}, "unitText": "percent", "description": "IPEDS ADM2024 (admits / applicants)"}}

Same facts, slightly different graphs

All six files say the same thing about Rose-Hulman. The two HTML formats say it a little differently, for three reasons.

  • The page language leaks into the data. Both HTML pages declare lang="en", like nearly every real page. Microdata and RDFa apply that language to text values, so 37 plain strings such as “Terre Haute” come back tagged as English. The JSON-LD file declares no language, so its strings stay plain.
  • Microdata can’t say “decimal.” Under the W3C Microdata-to-RDF rules, a numeric value like 76.9 becomes a double. Whole numbers survive as integers, but the admission rate, graduation rate, latitude and longitude all change type.
  • RDFa parsers add a note about themselves. The RDFa processor adds one triple recording the vocabulary the page used. It’s metadata about the parse, not a fact about the university.

JSON-LD has a decimal trap of its own. A bare 76.9 in JSON also becomes a double. The JSON-LD file only matched exactly because it wrote decimals as typed values: {"@value": "76.9", "@type": "xsd:decimal"}.

What this means for your structured data

None of these differences is an error. All six files parse cleanly, and a search engine reading any one of them gets the same facts.

The differences start to matter when structured data stops being a single page’s markup and becomes a dataset: when facts from several pages, or several formats, get merged, compared or loaded into a knowledge graph. That’s where “76.9” the double and “76.9” the decimal stop matching.

A few practical takeaways:

  • Publish each fact in one format. If a page carries the same facts in JSON-LD and Microdata, it’s publishing two slightly different graphs.
  • Be deliberate about numbers. Decide whether a value is an integer, a decimal or a string. Identifiers like the OPE ID “00183000” have to stay strings, or the leading zeros disappear.
  • Know what your page’s language attribute does. In HTML-based markup, it changes your data as well as your text.

Pro tip: If you validate structured data only in a rich results tester, you won’t see any of this. Parse your markup into triples at least once to see the graph you’re actually publishing.

Simply put, syntax is packaging, not meaning. The model you choose decides what you’re saying. The format decides how faithfully it arrives.

Run it yourself

Everything behind this post is on GitHub in the Experiment 1 folder: the script that builds all six files from IPEDS data, the script that parses them back and compares the graphs, the full verification report and the visualization. You can rerun it for any of the 45 institutions in the sample.

Next in the series: one question, asked in four query languages.