Weft

A vocabulary for evidence-backed career graphs.

Weft describes a person's career as a graph: the roles they held, what they studied, built and wrote, the credentials and awards they received, and the skills each of those involved. Every role, degree and project is its own node, linked to where it happened and to the skills it used, taught or certified, so a skill can always be traced back to the work behind it.

Weft builds on schema.org for the kinds of things (people, organisations, roles, credentials, creative works, defined terms) and adds the relations that schema.org doesn't have, or only has as plain text. Skills can be matched to shared concepts such as ESCO or Wikidata with SKOS mappings. CV and portfolio sites, talent tools and research datasets can all use it; Graph Resume is the first application.

The name comes from weaving: the warp is the timeline of roles, studies and projects, and the weft is the skills threaded through them.

IRI
https://w3id.org/weft
This version
https://w3id.org/weft/1.0 (version 1.0, published 2026-11-05)
Namespace
https://w3id.org/weft#, prefix weft:
Author
Rishi Rajani
Licence
CC BY 4.0: free to use and adapt, including commercially, with credit. Data you describe with Weft is yours.
Terms
2 classes, 22 relations, 4 value properties
Source
github.com/rishirajani/weft · Changes · Suggest a change

TurtleJSON-LDRDF/XMLN-TriplesJSON-LD contextSHACL shapesExample

How it fits together

The kinds of things come from schema.org: the person is a schema:Person, each job a schema:OrganizationRole, each degree or certificate a schema:EducationalOccupationalCredential, each project a schema:CreativeWork, each skill a schema:DefinedTerm, grouped into skill areas (schema:DefinedTermSet). Only awards and career breaks needed classes of their own.

The relations are Weft's. schema.org mostly links a person straight to an organisation (schema:worksFor, schema:alumniOf) and lists skills on the person as text. In Weft every job, degree and project is its own node, linked to where it happened and to the skills it used, trained or certified. That's the evidence layer: any skill can be traced back to the work behind it, and a skill nothing points to stands out.

Where a Weft relation is a special case of a schema.org property it says so (rdfs:subPropertyOf, owl:inverseOf), so data stays useful to tools that only know schema.org. Skills, languages and tools can be matched to shared concepts in ESCO or Wikidata with skos:exactMatch and skos:closeMatch.

Using it

In Turtle, declare the prefix and describe the career with schema.org types and Weft relations:

@prefix weft:   <https://w3id.org/weft#> .
@prefix schema: <https://schema.org/> .
@prefix ex:     <https://example.org/jordan#> .

ex:me a schema:Person ;
  schema:name "Jordan Example" ;
  weft:worksAs ex:r-senior .

ex:r-senior a schema:OrganizationRole ;
  schema:name "Senior Data Analyst" ;
  schema:startDate "2023-03" ;
  weft:at ex:o-lumen ;
  weft:used ex:s-sql .

ex:o-lumen a schema:Organization ; schema:name "Lumen Freight" .
ex:s-sql a schema:DefinedTerm ; schema:name "SQL" .

As JSON-LD, the context lets you write the same thing as plain JSON:

{
  "@context": "https://w3id.org/weft/context.jsonld",
  "id": "https://example.org/jordan#me",
  "type": "Person",
  "name": "Jordan Example",
  "worksAs": {
    "id": "https://example.org/jordan#r-senior",
    "type": "OrganizationRole",
    "name": "Senior Data Analyst",
    "startDate": "2023-03",
    "at": {
      "id": "https://example.org/jordan#o-lumen",
      "type": "Organization",
      "name": "Lumen Freight"
    },
    "used": [
      {
        "id": "https://example.org/jordan#s-sql",
        "type": "DefinedTerm",
        "name": "SQL"
      }
    ]
  }
}

Then ask the graph questions, for example in SPARQL:

PREFIX weft:   <https://w3id.org/weft#>
PREFIX schema: <https://schema.org/>

# Which roles, projects and courses back each skill?
SELECT ?skill ?evidence WHERE {
  ?x weft:used|weft:trainedIn|weft:shows ?s .
  ?s schema:name ?skill .
  ?x schema:name ?evidence .
} ORDER BY ?skill

To check data, run tools/check.py from the repository (every relation connects the kinds of things it should) and validate it against the SHACL shapes, which also warn about skills nothing backs up.

All relations at a glance

FromRelationTo
schema:Personheld roleschema:OrganizationRole
schema:Personworked asschema:OrganizationRole
schema:Personworks asschema:OrganizationRole
schema:Personstudiedschema:EducationalOccupationalCredential
schema:Personholdsschema:EducationalOccupationalCredential
schema:Personbuiltschema:CreativeWork
schema:Personwroteschema:ScholarlyArticle
schema:Personspeaksschema:Language
schema:Personreceivedweft:Award
schema:Personspecialises inschema:DefinedTermSet
schema:Persontookweft:CareerBreak
schema:OrganizationRole or schema:EducationalOccupationalCredentialatschema:Organization
schema:OrganizationRolepromoted fromschema:OrganizationRole
schema:EducationalOccupationalCredentialled toschema:OrganizationRole
schema:EducationalOccupationalCredentialrun withschema:Organization
schema:CreativeWorkpart ofschema:EducationalOccupationalCredential or schema:CreativeWork
weft:CareerBreakincludedschema:OrganizationRole or schema:EducationalOccupationalCredential or schema:CreativeWork
weft:Awardawarded byschema:Organization
schema:OrganizationRole or schema:CreativeWork or weft:CareerBreak or weft:Awardusedschema:DefinedTerm or schema:Language
schema:EducationalOccupationalCredentialtrained inschema:DefinedTerm
schema:EducationalOccupationalCredentialshowsschema:DefinedTerm
schema:DefinedTermbelongs toschema:DefinedTermSet

Classes

Award weft:Award

A recognition given to the person, for example by an employer. schema.org only has award as a text property, so this makes awards nodes that can be linked to who gave them.

IRI
https://w3id.org/weft#Award
Subclass of
schema:Thing
Compare
schema:award

Career break weft:CareerBreak

A period between roles, with what happened during it. Lets a gap be described honestly instead of left blank.

IRI
https://w3id.org/weft#CareerBreak
Subclass of
schema:Thing

Relations

Examples are from the example, a made-up person.

held role weft:heldRole

The person held this role. Use the more specific worked as (finished) or works as (current).

IRI
https://w3id.org/weft#heldRole
From
schema:Person
To
schema:OrganizationRole
Broader than
weft:workedAs, weft:worksAs
Compare
schema:hasOccupation

Usually stated through weft:workedAs, weft:worksAs.

worked as weft:workedAs

The person held this role in the past; the role has an end date.

IRI
https://w3id.org/weft#workedAs
From
schema:Person
To
schema:OrganizationRole
Narrower than
weft:heldRole

works as weft:worksAs

The person holds this role now; the role has no end date.

IRI
https://w3id.org/weft#worksAs
From
schema:Person
To
schema:OrganizationRole
Narrower than
weft:heldRole

studied weft:studied

The person studied for this degree or certificate, finished or still in progress. (schema:hasCredential would claim the credential is already held.)

IRI
https://w3id.org/weft#studied
From
schema:Person
To
schema:EducationalOccupationalCredential
Compare
schema:hasCredential, schema:alumniOf

holds weft:holds

The person holds this certification.

IRI
https://w3id.org/weft#holds
From
schema:Person
To
schema:EducationalOccupationalCredential
Narrower than
schema:hasCredential

built weft:built

The person built or authored this project.

IRI
https://w3id.org/weft#built
From
schema:Person
To
schema:CreativeWork
Compare
schema:creator

wrote weft:wrote

The person is an author of this publication.

IRI
https://w3id.org/weft#wrote
From
schema:Person
To
schema:ScholarlyArticle
Inverse of
schema:author

speaks weft:speaks

The person speaks this language; how well is given by proficiency on the language.

IRI
https://w3id.org/weft#speaks
From
schema:Person
To
schema:Language
Narrower than
schema:knowsLanguage

received weft:received

The person received this award.

IRI
https://w3id.org/weft#received
From
schema:Person
To
weft:Award
Compare
schema:award

specialises in weft:focusOn

One of the person's skill areas.

IRI
https://w3id.org/weft#focusOn
From
schema:Person
To
schema:DefinedTermSet

took weft:took

The person took this career break.

IRI
https://w3id.org/weft#took
From
schema:Person
To
weft:CareerBreak

at weft:at

Where a role was held (the employer) or where a degree or certificate was studied (the school).

IRI
https://w3id.org/weft#at
From
schema:OrganizationRole or schema:EducationalOccupationalCredential
To
schema:Organization
Compare
schema:worksFor, schema:alumniOf

promoted from weft:promotedFrom

This role followed the earlier role through a promotion at the same organisation.

IRI
https://w3id.org/weft#promotedFrom
From
schema:OrganizationRole
To
schema:OrganizationRole

led to weft:ledTo

A programme of study that led directly to this role, for example a certificate run with an employer.

IRI
https://w3id.org/weft#ledTo
From
schema:EducationalOccupationalCredential
To
schema:OrganizationRole

run with weft:runWith

An organisation that co-ran this programme with the school.

IRI
https://w3id.org/weft#runWith
From
schema:EducationalOccupationalCredential
To
schema:Organization

part of weft:partOf

This project was done as part of a degree or a larger work, for example a thesis within a master's.

IRI
https://w3id.org/weft#partOf
From
schema:CreativeWork
To
schema:EducationalOccupationalCredential or schema:CreativeWork
Compare
schema:isPartOf

included weft:included

Something done during a career break, such as freelance work or a certification.

IRI
https://w3id.org/weft#included
From
weft:CareerBreak
To
schema:OrganizationRole or schema:EducationalOccupationalCredential or schema:CreativeWork

awarded by weft:awardedBy

The organisation that gave the award.

IRI
https://w3id.org/weft#awardedBy
From
weft:Award
To
schema:Organization
Compare
schema:recognizedBy

used weft:used

A skill put to use in this role, project or career break, including a language used at work. Together with trained in and shows, it ties each skill to the work behind it.

IRI
https://w3id.org/weft#used
From
schema:OrganizationRole or schema:CreativeWork or weft:CareerBreak or weft:Award
To
schema:DefinedTerm or schema:Language
Compare
schema:skills

trained in weft:trainedIn

A skill taught or practised during this degree or course.

IRI
https://w3id.org/weft#trainedIn
From
schema:EducationalOccupationalCredential
To
schema:DefinedTerm
Compare
schema:teaches

shows weft:shows

A skill this certification is evidence of.

IRI
https://w3id.org/weft#shows
From
schema:EducationalOccupationalCredential
To
schema:DefinedTerm
Compare
schema:competencyRequired

belongs to weft:inGroup

The skill area this skill is grouped under. Weft doesn't limit how many; an application can (Graph Resume allows one).

IRI
https://w3id.org/weft#inGroup
From
schema:DefinedTerm
To
schema:DefinedTermSet
Narrower than
schema:inDefinedTermSet

Value properties

kind weft:kind

An application's own label for what kind of item this is (for example Role, Education, Certification, Project, Skill). Several kinds can share a schema.org type: a degree and a certification are both schema:EducationalOccupationalCredential, and kind keeps them apart without new classes.

IRI
https://w3id.org/weft#kind
To
xsd:string

highlight weft:highlight

One achievement or responsibility in a role, degree or project, as one short statement (like a bullet point on a CV). Order is not significant.

IRI
https://w3id.org/weft#highlight
To
xsd:string

location weft:location

Where it took place, as free text (city and country, or remote). Use schema:location for a structured place.

IRI
https://w3id.org/weft#location
To
xsd:string
Compare
schema:location

proficiency weft:proficiency

How well a language is spoken: a CEFR level (A1 to C2) or Native, Fluent or Basic.

IRI
https://w3id.org/weft#proficiency
From
schema:Language
To
xsd:string

Weft reuses or links to these rather than replacing them.

Used by

Using Weft somewhere? Open an issue to be listed.

Citing

Rishi Rajani (2026). Weft: a vocabulary for evidence-backed career graphs, version 1.0. https://w3id.org/weft/1.0