GraphCentric developer view

/blog/link-relations

https://graphcentric.com/blog/link-relations

Navigation

Methods

MethodStatusBasis
GETavailablerepresentation candidates are configured
HEADavailableGET representation headers
OPTIONSavailableHTTP capability discovery

Resource Details

URI
https://graphcentric.com/blog/link-relations
Graph
https://graphcentric.com/graphs/public-resources
Query
s3://graphcentric.com/blog-article.sparql

Resource Configuration Model

Turtle

Server rendered
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX gcs:     <https://graphcentric.com/schema/>
PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema:  <https://schema.org/>
PREFIX sh:      <http://www.w3.org/ns/shacl#>
PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>

<https://graphcentric.com/blog/link-relations.md>
        rdf:type         gcs:WebResource;
        gcs:contentType  "text/markdown";
        gcs:graph        <https://graphcentric.com/graphs/public-resources>;
        gcs:template     <s3://graphcentric.com/templates/blog-article.md> .

<https://graphcentric.com/blog/link-relations/.links/alternate-markdown>
        rdf:type     gcs:Link;
        gcs:rel      "alternate";
        gcs:target   <https://graphcentric.com/blog/link-relations.md>;
        schema:name  "Link Relations Article Markdown" .

<https://graphcentric.com/blog/link-relations/.links/resource-configuration-html>
        rdf:type     gcs:Link;
        gcs:rel      "https://graphcentric.info/link-relations/resource-configuration";
        gcs:target   <https://graphcentric.com/blog/link-relations.resource-configuration.html>;
        schema:name  "Link Relations Resource Configuration HTML" .

<https://graphcentric.com/blog/link-relations/.links/alternate-html>
        rdf:type     gcs:Link;
        gcs:rel      "alternate";
        gcs:target   <https://graphcentric.com/blog/link-relations.html>;
        schema:name  "Link Relations Article HTML" .

<https://graphcentric.com/blog/link-relations/.links/author>
        rdf:type    gcs:Link;
        gcs:rel     "author";
        gcs:target  <https://graphcentric.com/people/22d4c93006d76289b4b7> .

<https://graphcentric.com/blog/link-relations.ttl>
        rdf:type         gcs:WebResource;
        gcs:contentType  "text/turtle";
        gcs:graph        <https://graphcentric.com/graphs/public-resources> .

<https://graphcentric.com/blog/link-relations/.links/alternate-turtle>
        rdf:type     gcs:Link;
        gcs:rel      "alternate";
        gcs:target   <https://graphcentric.com/blog/link-relations.ttl>;
        schema:name  "Link Relations Article Turtle" .

<https://graphcentric.com/blog/link-relations.resource-configuration.html>
        rdf:type         gcs:WebResource;
        gcs:contentType  "text/html;charset=utf-8";
        gcs:graph        <https://graphcentric.com/graphs/public-resources> .

<https://graphcentric.com/blog/link-relations.html>
        rdf:type           gcs:WebResource;
        gcs:contentType    "text/html;charset=utf-8";
        gcs:graph          <https://graphcentric.com/graphs/public-resources>;
        gcs:outerTemplate  <s3://graphcentric.com/templates/public.html>;
        gcs:template       <s3://graphcentric.com/templates/blog-article.html> .

<https://graphcentric.com/blog/link-relations>
        rdf:type   gcs:WebResource;
        gcs:frame  <s3://graphcentric.com/blog-article-frame.jsonld>;
        gcs:graph  <https://graphcentric.com/graphs/public-resources>;
        gcs:link   <https://graphcentric.com/blog/link-relations/.links/alternate-html> , <https://graphcentric.com/blog/link-relations/.links/alternate-markdown> , <https://graphcentric.com/blog/link-relations/.links/alternate-turtle> , <https://graphcentric.com/blog/link-relations/.links/author> , <https://graphcentric.com/blog/link-relations/.links/resource-configuration-html>;
        gcs:query  <s3://graphcentric.com/blog-article.sparql> .

SPARQL Query

s3://graphcentric.com/blog-article.sparql
BASE <https://graphcentric.com/>
PREFIX schema: <https://schema.org/>
PREFIX gcs: <https://graphcentric.com/schema/>
PREFIX dcterms: <http://purl.org/dc/terms/>

CONSTRUCT {
  ?_subject
    a schema:Article;
    dcterms:title ?headline;
    dcterms:description ?description;
    schema:headline ?headline;
    schema:alternativeHeadline ?alternativeHeadline;
    schema:description ?description;
    schema:datePublished ?datePublished;
    schema:dateModified ?dateModified;
    schema:keywords ?keywords;
    schema:articleBody ?articleBodyHtml;
    schema:url ?url;
    schema:author ?author;
    schema:image ?image;
    schema:citation ?citation;
    schema:quotation ?quote;
    gcs:furtherReading ?reading.

  ?author
    a schema:Person;
    schema:name ?authorName;
    schema:jobTitle ?authorRole.

  ?image
    a schema:ImageObject;
    schema:name ?imageName;
    schema:contentUrl ?imageContentUrl;
    schema:encodingFormat ?imageEncodingFormat;
    schema:width ?imageWidth;
    schema:height ?imageHeight;
    schema:contentSize ?imageContentSize;
    schema:caption ?imageCaption;
    schema:description ?imageAltText;
    gcs:genAiPrompt ?imageGenAiPrompt;
    gcs:genAiModel ?imageGenAiModel;
    gcs:genAiProvider ?imageGenAiProvider.

  ?citation
    a schema:CreativeWork;
    schema:name ?citationName;
    schema:url ?citationUrl;
    schema:description ?citationDescription;
    schema:text ?citationText;
    schema:position ?citationPosition.

  ?quote
    a schema:Quotation;
    schema:text ?quoteText;
    schema:citation ?quoteCitation;
    schema:position ?quotePosition.

  ?reading
    a schema:CreativeWork;
    schema:name ?readingName;
    schema:url ?readingUrl;
    schema:description ?readingDescription;
    schema:position ?readingPosition.
}
WHERE {
  GRAPH <graphs/cms> {
    ?_subject a schema:Article;
      schema:headline ?headline;
      schema:description ?description;
      schema:datePublished ?datePublished;
      schema:url ?url;
      schema:author ?author.

    OPTIONAL { ?_subject schema:alternativeHeadline ?alternativeHeadline. }
    OPTIONAL { ?_subject schema:dateModified ?dateModified. }
    OPTIONAL { ?_subject schema:keywords ?keywords. }
    OPTIONAL { ?_subject schema:articleBody ?articleBodyHtml. }

    OPTIONAL {
      ?_subject schema:image ?image.
      ?image schema:name ?imageName;
        schema:contentUrl ?imageContentUrl.
      OPTIONAL { ?image schema:encodingFormat ?imageEncodingFormat. }
      OPTIONAL { ?image schema:width ?imageWidth. }
      OPTIONAL { ?image schema:height ?imageHeight. }
      OPTIONAL { ?image schema:contentSize ?imageContentSize. }
      OPTIONAL { ?image schema:caption ?imageCaption. }
      OPTIONAL { ?image schema:description ?imageAltText. }
      OPTIONAL { ?image gcs:genAiPrompt ?imageGenAiPrompt. }
      OPTIONAL { ?image gcs:genAiModel ?imageGenAiModel. }
      OPTIONAL { ?image gcs:genAiProvider ?imageGenAiProvider. }
    }

    OPTIONAL {
      ?_subject schema:citation ?citation.
      ?citation schema:name ?citationName.
      OPTIONAL { ?citation schema:url ?citationUrl. }
      OPTIONAL { ?citation schema:description ?citationDescription. }
      OPTIONAL { ?citation schema:text ?citationText. }
      OPTIONAL { ?citation schema:position ?citationPosition. }
    }

    OPTIONAL {
      ?_subject schema:quotation ?quote.
      ?quote schema:text ?quoteText.
      OPTIONAL { ?quote schema:citation ?quoteCitation. }
      OPTIONAL { ?quote schema:position ?quotePosition. }
    }

    OPTIONAL {
      ?_subject gcs:furtherReading ?reading.
      ?reading schema:name ?readingName.
      OPTIONAL { ?reading schema:url ?readingUrl. }
      OPTIONAL { ?reading schema:description ?readingDescription. }
      OPTIONAL { ?reading schema:position ?readingPosition. }
    }
  }

  OPTIONAL {
    GRAPH <graphs/public-staff-information> {
      ?author schema:name ?authorName.
      OPTIONAL { ?author schema:jobTitle ?authorRole. }
    }
  }
}

Query Scope

Named Graphs

6 graphs

Resource State

Turtle

Server rendered
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX gcs:     <https://graphcentric.com/schema/>
PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema:  <https://schema.org/>
PREFIX sh:      <http://www.w3.org/ns/shacl#>
PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>

<https://graphcentric.com/blog/link-relations#quote-data-centric-manifesto-1>
        rdf:type         schema:Quotation;
        schema:citation  <https://graphcentric.com/references/data-centric-manifesto>;
        schema:position  1;
        schema:text      "Applications visit the data - Reactive UIs, autonomous agents, and services query and update the graph rather than owning data silos." .

<https://graphcentric.com/references/iana-link-relations>
        rdf:type            schema:CreativeWork;
        schema:description  "The Internet Assigned Numbers Authority registry of standard link relation types.";
        schema:name         "IANA Link Relations Registry";
        schema:position     1;
        schema:text         "IANA maintains the canonical registry of standard link relations used by web resources and agents.";
        schema:url          <https://www.iana.org/assignments/link-relations/link-relations.xhtml> .

<https://graphcentric.com/references/rfc-8288>
        rdf:type            schema:CreativeWork;
        schema:description  "The Web Linking RFC that defines typed links and their use in HTTP headers.";
        schema:name         "RFC 8288: Web Linking";
        schema:position     2;
        schema:text         "RFC 8288 formalizes web links and link relation types for HTTP resources.";
        schema:url          <https://www.rfc-editor.org/rfc/rfc8288> .

<https://graphcentric.com/people/22d4c93006d76289b4b7>
        rdf:type  schema:Person .

<https://graphcentric.com/references/data-centric-manifesto>
        rdf:type            schema:CreativeWork;
        schema:description  "A manifesto for treating data as a durable, self-describing asset independent of application silos.";
        schema:name         "The Data-Centric Manifesto";
        schema:position     1;
        schema:url          <https://www.datacentricmanifesto.org/> .

<https://graphcentric.com/blog/link-relations>
        rdf:type                    schema:Article;
        dcterms:description         "Link relations give machines explicit cues for how to move through a website without relying on brittle, hardcoded APIs. This article explains why the original web model was already agent-friendly and why that matters again in the age of AI agents.";
        dcterms:title               "Link Relations: Why the Original Web Already Knew About AI Agents";
        gcs:furtherReading          <https://graphcentric.com/references/data-centric-manifesto>;
        schema:alternativeHeadline  "The web was designed for agents from the beginning.";
        schema:articleBody          "<p>Welcome to the second edition of <strong>GraphCentric Weekly</strong>. This week we are exploring a key mechanism from the original World Wide Web that has new relevance in the age of AI: <strong>link relations</strong>.</p><h2>Agents, Agents Everywhere</h2><p>The word agent is having its moment. Yet the term agent was already central to the designers of the web as far back as 1990. The original vision always included non-human clients, most notably spiders and crawlers. Without those agents we would never have had search engines.</p><p>The designers of the web long anticipated what we now call the rise of the robots. They built the web to serve clients capable of making decisions, not just rendering pages for humans.</p><h2>Humans and Machines Navigate Differently</h2><p>Humans respond to visual design cues. AI agents can now do something similar, but it is expensive. They must consume large amounts of HTML, interpret visual semantics, and guess which links to follow. Machine-readable formats are far more efficient.</p><p>Link relations provide explicit, labeled cues. A link relation is a standardized keyword that describes the purpose of a link. Humans use visual design to choose their path. Machines follow these labeled relations instead.</p><h2>Static APIs versus Dynamic Web Navigation</h2><p>The dominant approach today is static: fixed API endpoints with known URIs, query parameters, and contracts. If the API changes, the client breaks. The alternative is dynamic: the machine interacts with the same resources a human would, following labeled links just as we do.</p><p>This dynamic philosophy is at the heart of REST. HATEOAS means the server tells the client what it can do next through links and their relations, rather than the client relying on hardcoded knowledge.</p><h2>Final Thoughts</h2><p>The web was designed for agents from the beginning. Link relations, HATEOAS, and dynamic clients close the loop. We have an opportunity to move beyond static interfaces and finish what the early web pioneers started.</p>";
        schema:author               <https://graphcentric.com/people/22d4c93006d76289b4b7>;
        schema:citation             <https://graphcentric.com/references/iana-link-relations> , <https://graphcentric.com/references/rfc-8288>;
        schema:dateModified         "2026-05-04"^^xsd:date;
        schema:datePublished        "2026-05-04"^^xsd:date;
        schema:description          "Link relations give machines explicit cues for how to move through a website without relying on brittle, hardcoded APIs. This article explains why the original web model was already agent-friendly and why that matters again in the age of AI agents.";
        schema:headline             "Link Relations: Why the Original Web Already Knew About AI Agents";
        schema:image                <https://graphcentric.com/media/blog/link-relations/graphcentric-ai-first-foundation>;
        schema:keywords             "link relations, HATEOAS, REST, AI agents, semantic web, RDF";
        schema:quotation            <https://graphcentric.com/blog/link-relations#quote-data-centric-manifesto-1>;
        schema:url                  <https://graphcentric.com/blog/link-relations.html> .

<https://graphcentric.com/media/blog/link-relations/graphcentric-ai-first-foundation>
        rdf:type               schema:ImageObject;
        gcs:genAiModel         "TODO";
        gcs:genAiPrompt        "TODO: original generation prompt";
        gcs:genAiProvider      "TODO";
        schema:caption         "A GenAI illustration to depict how Link Relations enable agents to discover more about the context of a resource.";
        schema:contentSize     567302;
        schema:contentUrl      <https://graphcentric.com/media/blog/link-relations/graphcentric-ai-first-foundation.jpg>;
        schema:description     "Illustrated diagram titled GraphCentric AI-First Foundation, with an RDF graph at the center and surrounding access-control and web-application concepts.";
        schema:encodingFormat  "image/jpeg";
        schema:height          832;
        schema:name            "GraphCentric AI-First Foundation";
        schema:width           1248 .

SSE Status

Stream link relations
streamstatussubscriberslast idstate
No stream resources are linked from this resource.

Cache Status

Placeholder: configuration cache/runtime query cache status is not exposed to this renderer yet.

Cache-Control

Placeholder: response cache-control policy is not exposed yet.

ETag

Placeholder: source representation ETag calculation is representation-specific and not exposed here yet.

Content-Security-Policy

Placeholder: CSP headers are not exposed to this renderer yet.