GraphCentric developer view

https://graphcentric.one/jobs

https://graphcentric.one/jobs

Navigation

Methods

MethodStatusBasis
GETavailablerepresentation candidates are configured
HEADavailableGET representation headers
OPTIONSavailableHTTP capability discovery

Resource Details

URI
https://graphcentric.one/jobs
Graph
https://graphcentric.one/graphs/public-resources
Query
s3://graphcentric.one/jobs.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.one/jobs>
        rdf:type     gcs:WebResource;
        gcs:graph    <https://graphcentric.one/graphs/public-resources>;
        gcs:link     <https://graphcentric.one/jobs/.links/related-candidates> , <https://graphcentric.one/jobs/.links/related-interviews> , <https://graphcentric.one/jobs/.links/datastar-html-patch-stream> , <https://graphcentric.one/jobs/.links/related-hiring-reports> , <https://graphcentric.one/jobs/.links/alternate-jsonld> , <https://graphcentric.one/jobs/.links/alternate-html> , <https://graphcentric.one/jobs/.links/jsonld-state-stream>;
        gcs:query    <s3://graphcentric.one/jobs.sparql>;
        schema:name  "Jobs" .

<https://graphcentric.one/jobs/.links/jsonld-state-stream>
        rdf:type     gcs:Link;
        gcs:rel      "https://graphcentric.info/link-relations/jsonld-state-stream";
        gcs:target   <https://graphcentric.one/jobs.jsonld.stream>;
        gcs:type     "text/event-stream";
        schema:name  "Jobs JSON-LD Stream" .

<https://graphcentric.one/interviews.html>
        rdf:type           gcs:WebResource;
        gcs:contentType    "text/html;charset=utf-8";
        gcs:frame          <s3://graphcentric.one/interviews-frame.jsonld>;
        gcs:graph          <https://graphcentric.one/graphs/public-resources>;
        gcs:outerTemplate  <s3://graphcentric.one/templates/one-root-v2.html>;
        gcs:template       <s3://graphcentric.one/interviews.html>;
        schema:name        "Interviews HTML" .

<https://graphcentric.one/jobs/.links/related-candidates>
        rdf:type     gcs:Link;
        gcs:rel      "related";
        gcs:target   <https://graphcentric.one/candidates.html>;
        gcs:type     "text/html";
        schema:name  "Candidates" .

<https://graphcentric.one/candidates.html>
        rdf:type           gcs:WebResource;
        gcs:contentType    "text/html;charset=utf-8";
        gcs:frame          <s3://graphcentric.one/candidates-frame.jsonld>;
        gcs:graph          <https://graphcentric.one/graphs/public-resources>;
        gcs:outerTemplate  <s3://graphcentric.one/templates/one-root-v2.html>;
        gcs:template       <s3://graphcentric.one/candidates.html>;
        schema:name        "Candidates HTML" .

<https://graphcentric.one/jobs/.links/alternate-html>
        rdf:type     gcs:Link;
        gcs:rel      "alternate";
        gcs:target   <https://graphcentric.one/jobs.html>;
        gcs:type     "text/html";
        schema:name  "HTML" .

<https://graphcentric.one/jobs/.links/datastar-html-patch-stream>
        rdf:type     gcs:Link;
        gcs:rel      "https://graphcentric.info/link-relations/datastar-html-patch-stream";
        gcs:target   <https://graphcentric.one/jobs.html.stream>;
        gcs:type     "text/event-stream";
        schema:name  "Jobs HTML Patch Stream" .

<https://graphcentric.one/jobs.jsonld>
        rdf:type             gcs:WebResource;
        gcs:contentType      "application/ld+json;charset=utf-8";
        gcs:frame            <s3://graphcentric.one/jobs-frame.jsonld>;
        gcs:graph            <https://graphcentric.one/graphs/public-resources>;
        gcs:qualityOfSource  "0.9"^^xsd:float;
        schema:name          "Jobs JSON-LD" .

<https://graphcentric.one/jobs/.links/alternate-jsonld>
        rdf:type     gcs:Link;
        gcs:rel      "alternate";
        gcs:target   <https://graphcentric.one/jobs.jsonld>;
        gcs:type     "application/ld+json";
        schema:name  "JSON-LD" .

<https://graphcentric.one/jobs/.links/related-interviews>
        rdf:type     gcs:Link;
        gcs:rel      "related";
        gcs:target   <https://graphcentric.one/interviews.html>;
        gcs:type     "text/html";
        schema:name  "Interviews" .

<https://graphcentric.one/hiring/reports.html>
        rdf:type           gcs:WebResource;
        gcs:contentType    "text/html;charset=utf-8";
        gcs:frame          <s3://graphcentric.one/hiring/reports-frame.jsonld>;
        gcs:graph          <https://graphcentric.one/graphs/public-resources>;
        gcs:outerTemplate  <s3://graphcentric.one/templates/one-root-v2.html>;
        gcs:template       <s3://graphcentric.one/hiring/reports.html>;
        schema:name        "Hiring Reports HTML" .

<https://graphcentric.one/jobs.html>
        rdf:type           gcs:WebResource;
        gcs:contentType    "text/html;charset=utf-8";
        gcs:frame          <s3://graphcentric.one/jobs-frame.jsonld>;
        gcs:graph          <https://graphcentric.one/graphs/public-resources>;
        gcs:outerTemplate  <s3://graphcentric.one/templates/one-root-v2.html>;
        gcs:template       <s3://graphcentric.one/jobs.html>;
        schema:name        "Jobs HTML" .

<https://graphcentric.one/jobs/.links/related-hiring-reports>
        rdf:type     gcs:Link;
        gcs:rel      "related";
        gcs:target   <https://graphcentric.one/hiring/reports.html>;
        gcs:type     "text/html";
        schema:name  "Hiring reports" .

SPARQL Query

s3://graphcentric.one/jobs.sparql
BASE <https://graphcentric.one/>

PREFIX schema: <https://schema.org/>
PREFIX one: <https://graphcentric.info/ns/one#>
PREFIX gcs: <https://graphcentric.com/schema/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

# Hiring โ†’ Jobs (plan 30 Stage 6, LIVE). Company-visible job postings in
# /graphs/one-jobs (NO candidate data โ€” that is the private one-hiring
# compartment). One row per schema:JobPosting; the count backs the design's
# Hiring panel "Jobs" badge (4c). Open-role count is derived here for the header.

CONSTRUCT {
  ?_subject a one:JobList ;
    schema:name "Jobs" ;
    one:kicker ?kicker ;
    one:description ?pageDesc ;
    one:isPublic "true" ;
    one:canManage ?canManage ;
    one:jobCount ?jobCount ;
    one:openCount ?openCount ;
    one:jobRow ?job .

  ?job a one:JobRow ;
    schema:name ?title ;
    one:jobIri ?jobIriStr ;
    one:jobKey ?jobKey ;
    one:statusName ?statusName ;
    one:statusSlug ?statusSlug ;
    one:department ?department ;
    one:jobLocation ?location ;
    one:workplaceType ?workplaceType ; schema:employmentType ?employmentType ; one:contractType ?contractType ;
    one:detailUrl ?detailUrl ;
    schema:description ?description ;
    one:openings ?openings ;
    schema:datePosted ?datePosted ;
    one:sortKey ?sortKey .
}
WHERE {
  # Caller role โ†’ server-side shell rail trim + panel footer (plan 30).
  BIND(IF(EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-admins> } }, "Admin",
       IF(EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-managers> } }, "Manager",
       IF(EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-recruiters> } }, "Recruiter",
       IF(EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-employees> } }, "Employee", "")))) AS ?userRole)
       # Display-only role label (plan 37 walkthrough): contractors read "Contractor" in
       # the shell footer; ?userRole keeps its trim semantics untouched.
       BIND(IF(EXISTS { GRAPH </graphs/one-org> { ?_user one:workerType </worker-types/contractor> } }, "Contractor", ?userRole) AS ?userRoleLabel)

  # Force /graphs/org-chart into this query's dataset (platform quirk, DEVLOG #90):
  # mothership builds a query's dataset from graphs referenced in POSITIVE patterns
  # only, so org-chart referenced solely inside the userRole BIND's EXISTS is never
  # loaded and every such EXISTS silently returns false -> userRole collapses to ""
  # (a trimmed shell rail). This scalar sub-SELECT reads it positively (one row, no
  # fan-out) so the userRole/board EXISTS above see the real memberships.
  { SELECT (COUNT(*) AS ?orgChartLoaded) WHERE { GRAPH </graphs/org-chart> { ?ocS ?ocP ?ocO } } }

  # Scalar sub-SELECTs (no GROUP BY) always yield one row, so the page root emits
  # even before any posting is visible.
  { SELECT (COUNT(DISTINCT ?j) AS ?jobCountRaw) WHERE {
      GRAPH </graphs/one-jobs> { ?j a schema:JobPosting . }
  } }
  { SELECT (COUNT(DISTINCT ?jo) AS ?openCountRaw) WHERE {
      GRAPH </graphs/one-jobs> { ?jo a schema:JobPosting ; one:jobStatus </job-statuses/open> . }
  } }
  BIND(STR(?openCountRaw) AS ?openCount)
  BIND(STR(IF(?userRole = "", ?openCountRaw, ?jobCountRaw)) AS ?jobCount)

  BIND(IF(
    EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-admins> } } ||
    EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-recruiters> } } ||
    EXISTS { GRAPH </graphs/org-chart> { ?_user gcs:memberOf </teams/one-managers> } },
    "true", "") AS ?canManage)
  BIND(IF(?userRole = "", "Careers", "Hiring") AS ?kicker)
  BIND(IF(?userRole = "", "Open roles.", "Open and in-flight roles.") AS ?pageDesc)

  OPTIONAL {
    GRAPH </graphs/one-jobs> {
      ?job a schema:JobPosting ;
        schema:title ?title ;
        one:jobKey ?jobKey ;
        one:jobStatus ?status .
      OPTIONAL { ?job one:department ?department . }
      OPTIONAL { ?job one:jobLocation ?location . }
      OPTIONAL { ?job one:workplaceType ?workplaceType }
      OPTIONAL { ?job schema:employmentType ?employmentType }
      OPTIONAL { ?job one:contractType ?contractType }
      # For aggregators reading the JSON-LD (DOC-192 ยง9.1 J): the description
      # a requisition published, the openings and the posting date.
      OPTIONAL { ?job schema:description ?description . }
      OPTIONAL { ?job one:openings ?openings . }
      OPTIONAL { ?job schema:datePosted ?datePosted . }
    }
    # A visitor sees only open postings. A signed-in workspace member sees
    # every posting they can read (drafts and filled stay on the hiring list).
    FILTER(?userRole != "" || ?status = </job-statuses/open>)

    # Status label from the shared controlled vocabulary (SKOS concept).
    # Anonymous callers cannot read one-internal: fall back to the IRI tail.
    OPTIONAL { GRAPH </graphs/one-internal> { ?status schema:name ?statusNameRaw ; schema:identifier ?statusSlugRaw . } }
    BIND(COALESCE(?statusNameRaw, REPLACE(STR(?status), "^.*/", "")) AS ?statusName)
    BIND(COALESCE(?statusSlugRaw, REPLACE(STR(?status), "^.*/", "")) AS ?statusSlug)
    BIND(STR(?job) AS ?jobIriStr)
    BIND(STR(?job) AS ?detailUrl)
    BIND(?jobKey AS ?sortKey)
  }
}

Query Scope

Named Graphs

17 graphs

Resource State

Turtle

Server rendered
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX gcs:     <https://graphcentric.com/schema/>
PREFIX one:     <https://graphcentric.info/ns/one#>
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.one/jobs/JOB-1>
        rdf:type           one:JobRow;
        one:department     "";
        one:detailUrl      "https://graphcentric.one/jobs/JOB-1";
        one:jobIri         "https://graphcentric.one/jobs/JOB-1";
        one:jobKey         "JOB-1";
        one:jobLocation    "";
        one:sortKey        "JOB-1";
        one:statusName     "open";
        one:statusSlug     "open";
        schema:datePosted  "2026-09-08"^^xsd:date;
        schema:name        "Junior Developer" .

<https://graphcentric.one/jobs>
        rdf:type         one:JobList;
        one:canManage    "";
        one:description  "Open roles.";
        one:isPublic     "true";
        one:jobCount     "2";
        one:jobRow       <https://graphcentric.one/JB-1> , <https://graphcentric.one/jobs/JOB-1>;
        one:kicker       "Careers";
        one:openCount    "2";
        schema:name      "Jobs" .

<https://graphcentric.one/JB-1>
        rdf:type               one:JobRow;
        one:contractType       "Permanent employment";
        one:detailUrl          "https://graphcentric.one/JB-1";
        one:jobIri             "https://graphcentric.one/JB-1";
        one:jobKey             "JB-1";
        one:jobLocation        "London";
        one:openings           2;
        one:sortKey            "JB-1";
        one:statusName         "open";
        one:statusSlug         "open";
        one:workplaceType      "On-site working";
        schema:datePosted      "2026-10-20"^^xsd:date;
        schema:description     "\\- designing and developing an integrated stack of enterprise applications for various corporate back-office functions\n\n\\- using Semantic Web technologies such as SPARQL and RDF, web technologies such as HTML, CSS and JavaScript\n\n\\- working with a Graph database (Apache Fuseki), and helping to improve its performance\n\n\\- working with security technologies such as OAuth2 and OpenID Connect\n\n\\- working with AI models, from the leading frontier labs such as OpenAI, xAI and Anthropic\n\n\\- doing various front-end and back-end development tasks\n\n\\- ontology modelling with RDF";
        schema:employmentType  "Full-time employment";
        schema:name            "Junior Developer" .

SSE Status

Stream link relations
streamstatussubscriberslast idstate
https://graphcentric.one/jobs.html.streaminactive0
https://graphcentric.one/jobs.jsonld.streaminactive0