Sensemaking AI · Sub-module 1.3

The vocabulary landscape

FOAF, Dublin Core, SKOS, and schema.org — what each vocabulary does, when to choose it, and why ESCO/SKOS interop is the payoff for the Resume Graph.

The same predicate, everywhere.

RDF's power is that a predicate is a URI — globally identifiable. If two graphs use foaf:knows, they mean the same relationship. If you define your own :knows, you mean whatever you decide. Shared vocabularies are the convention layer that makes the first case work at scale.

Without shared vocabularies, every RDF graph is an island. With them, two organizations can independently describe a person using foaf:Person and the descriptions merge without configuration. A search engine encounters schema:name on a web page and knows what to do with it. A job seeker's resume links a skill to skos:exactMatch and the link resolves into a continent-wide occupational taxonomy. None of this works if every publisher invents their own predicates.

The cost of shared vocabularies is that you inherit their design decisions. FOAF is from 2000 — it shows its age. Dublin Core was designed for library metadata — some of its semantics do not map cleanly to digital resources. SKOS was built for thesauri — it captures concept relationships but not formal class hierarchies. schema.org is optimized for search engine consumption, not reasoning. Every vocabulary is a tradeoff, and the skill of ontology design is knowing which tradeoffs to accept and where to define something new.

The rule that matters most

Reuse before defining. Always check whether FOAF, schema.org, SKOS, dcterms, or PROV-O has an appropriate term before creating a new one in your custom namespace. New terms in a custom namespace are not shared — they are meaningful only to you until someone else adopts them.


For people, agents, and documents.

FOAF
Friend of a Friend · http://xmlns.com/foaf/0.1/ · prefix: foaf:

What it does

FOAF defines classes and properties for people, groups, organizations, and documents, plus the relationships between them. It was the first widely-adopted Linked Data vocabulary and remains the standard choice for representing human beings in RDF.

Key terms for a resume graph

  • foaf:Person — the class for a human being (the resume subject)
  • foaf:name, foaf:givenName, foaf:familyName — name components
  • foaf:mbox — email address (use the mailto: URI scheme)
  • foaf:primaryTopic — links a document to the thing it is primarily about
  • foaf:knows — a weak, symmetric social connection

When to use FOAF vs schema.org

Both FOAF and schema.org define person-related terms. Use foaf:Person as the class (it is more precisely human-specific than schema:Person, which also covers fictional characters). Use schema.org properties where FOAF lacks them — schema:jobTitle, schema:url, schema:telephone have no close FOAF equivalents. Mixing them on the same node is fine and common.

# A person node mixing FOAF and schema.org
:alex a foaf:Person ;
    foaf:name         "Alex Rivera" ;
    foaf:mbox         <mailto:alex@example.com> ;
    schema:jobTitle   "Data Scientist" .    # no FOAF equivalent

For documents, records, and metadata.

Dublin Core Terms
DCMI Metadata Terms · http://purl.org/dc/terms/ · prefix: dcterms:

What it does

Dublin Core was designed for library-style document metadata: authorship, dates, subjects, languages, rights. In an RDF graph, dcterms is the right vocabulary when you need to describe a record — a document, a dataset, a file — rather than the entity the document is about.

Key terms for a resume graph

  • dcterms:title — the document's name
  • dcterms:created — creation date (use xsd:date)
  • dcterms:modified — last-modified date
  • dcterms:language — the language of the document's content
  • dcterms:creator — who created the document (range: dcterms:Agent)
  • dcterms:subject — what the document is about

The dc: vs dcterms: distinction

Dublin Core has two namespaces: the original dc: (http://purl.org/dc/elements/1.1/) and the refined dcterms:. Always use dcterms:. The original dc: properties have unspecified ranges; dcterms: properties have formal semantics and are more compatible with OWL reasoning.

# The resume document node — what dcterms describes
<https://sensemaking-ai.com/resume/alex-rivera/001>
    a sensemaking:Resume ;
    dcterms:title    "Alex Rivera — Resume" ;
    dcterms:created  "2024-11-01"^^xsd:date ;
    dcterms:language "en" ;
    foaf:primaryTopic :alex .     # link to the person (FOAF)
Document vs entity

The resume document and the person the resume describes are two distinct nodes. dcterms describes the document; FOAF and schema.org describe the person. foaf:primaryTopic connects them. This distinction — document vs. thing — becomes important in Module 3 when provenance tracking requires you to say who asserted a fact, in which source, at what time.


For controlled vocabularies and taxonomies.

SKOS
Simple Knowledge Organization System · http://www.w3.org/2004/02/skos/core# · prefix: skos:

What it does

SKOS represents concepts in a controlled vocabulary — a taxonomy, thesaurus, or classification scheme. A SKOS concept is a unit of meaning with preferred labels, alternative labels, and relationships to other concepts. SKOS does not make logical inferences; it organizes and navigates.

Key terms for a resume graph

  • skos:Concept — a unit in a vocabulary (a skill, a job category, a subject area)
  • skos:ConceptScheme — the vocabulary or classification system itself
  • skos:prefLabel — the preferred name (one per language)
  • skos:altLabel — synonyms and abbreviations
  • skos:broader — the parent concept in a hierarchy
  • skos:narrower — child concepts
  • skos:related — non-hierarchical conceptual association
  • skos:exactMatch — this concept is the same as a concept in another vocabulary
  • skos:closeMatch — similar but not identical to a concept in another vocabulary

SKOS vs OWL class hierarchy

skos:broader is not rdfs:subClassOf. In SKOS, "Machine learning is broader than Deep learning" is an organizational statement about two vocabulary concepts — not an assertion that every deep-learning instance is also a machine-learning instance in a formal reasoning sense. Use SKOS for concepts in a controlled vocabulary. Use rdfs:subClassOf for class hierarchies you want a reasoner to act on. The distinction matters in Module 2.

# A skill typed as a SKOS concept — not an OWL class
:skill_python
    a skos:Concept ;
    skos:prefLabel  "Python (programming language)"@en ;
    skos:altLabel   "Python"@en ;
    skos:exactMatch <esco_python> ;           # links into ESCO
    sensemaking:skillLevel "advanced" .       # local property

# ESCO concept stub showing the broader hierarchy
<esco_python>
    a skos:Concept ;
    skos:prefLabel "use a scripting language: Python"@en ;
    skos:broader   <esco_programming_languages> .

<esco_programming_languages>
    a skos:Concept ;
    skos:prefLabel "programming languages and scripting"@en ;
    skos:broader   <esco_ict_skills> .

For web-readable, broadly applicable entities.

schema.org
https://schema.org/ · prefix: schema: · Note: use https://, not http://

What it does

Schema.org is a joint vocabulary maintained by Google, Microsoft, Yahoo, and Yandex for annotating web pages so search engines can understand their content. It has extremely broad coverage — thousands of types and properties — with a deliberate emphasis on practical usability over formal precision. An organization with a name, a product with a price, a job posting with a salary range: schema.org has a type for it.

Key terms for a resume graph

  • schema:Organization — a company, institution, or group
  • schema:CollegeOrUniversity — subclass of Organization
  • schema:name — name of a thing (more permissive than foaf:name)
  • schema:jobTitle — a person's current or most recent role
  • schema:description — freetext description of anything
  • schema:url — a web address
  • schema:DateTime — datetime value type (used with xsd:date)

When schema.org earns its keep

Schema.org is excellent when FOAF or dcterms lacks a property you need — which is often. Its weakness is loose semantics: ranges are very permissive, and the vocabulary is not well-suited to OWL reasoning. Use it for things you want to be web-readable and broadly understood. Avoid it as your primary design surface if you need formal inference or tight constraint validation.


Why SKOS in a resume graph is not a toy example.

ESCO — the European Skills, Competences, Qualifications and Occupations framework — is published as RDF using SKOS and OWL. Approximately 3,000 occupation concepts and 14,000 skill concepts, linked into a structured hierarchy, available as Linked Open Data.

This is the interop story from Sub-module 1.1, made concrete. When a resume graph types skills as skos:Concept and links them to ESCO via skos:exactMatch, those skills are no longer isolated string values — they are nodes in a graph that connects to a continent-wide occupational taxonomy maintained by the European Commission.

What that makes possible:

None of this works in a property graph where ESCO codes are string properties. The ESCO string "ccd0a1d9" is opaque — the database does not know it points to anything. The RDF version is a live connection.

# The query that demonstrates the payoff
SELECT ?skillLabel ?domainLabel WHERE {
  <person> sensemaking:hasSkill ?skill .
  ?skill skos:prefLabel ?skillLabel ;
         skos:exactMatch/skos:broader ?domain .
  ?domain skos:prefLabel ?domainLabel .
  FILTER (LANG(?skillLabel) = "en")
  FILTER (LANG(?domainLabel) = "en")
}

With the ESCO stubs in resume-001.ttl, this query works locally and returns the broader domain for each of Alex's three skills. With the full ESCO dataset loaded or federated, the same query reaches the entire occupational hierarchy.

skos:exactMatch vs owl:sameAs

Do not use owl:sameAs to link a resume skill to an ESCO concept. owl:sameAs asserts full identity — a reasoner will merge all properties from both nodes, which causes unintended entailments (your sensemaking:skillLevel property would transfer to the ESCO concept). Use skos:exactMatch, which asserts semantic equivalence for the purposes of vocabulary alignment without triggering property inheritance. This distinction matters in Module 3. Know it now.


Which vocabulary, when.

What you are modelingStart hereThen add
A personfoaf:Personschema: properties FOAF lacks (jobTitle, telephone)
A document or recorddcterms: metadatafoaf:primaryTopic to link to the subject
A skill, subject area, or categoryskos:Conceptskos:exactMatch to ESCO or another published vocabulary
An organization or institutionschema:Organization (or subclass)Custom properties if schema.org lacks them
An event (employment, education)Custom class (sensemaking:Employment)schema:Event or schema:EducationEvent as rdfs:subClassOf
A class hierarchy you want to reason overrdfs:subClassOf / OWLNot SKOS broader — SKOS is for vocabulary navigation, not logical inference

The decision is not always clean. A skill could be modeled as a skos:Concept (appropriate for a controlled vocabulary) or as an OWL class (appropriate if you want to reason about subskills). The resume graph uses SKOS because skills here are navigation targets into ESCO — not concepts you plan to build a class hierarchy around. If Module 2's Naruto ontology needed "skill" as a class (to declare that every ninja who has the Sharingan is also a member of the Uchiha clan), OWL classes would be right. Context determines which model serves the actual use case.


Where this landscape bites.


What to do with this.

If you are working through the curriculum

The Sub-module 1.3 workbook (1-3-workbook-resume.html) queries Alex Rivera's resume against Fuseki. Load artifacts/resume-graph/ttl/resume-001.ttl into the Fuseki mythology dataset first. The five queries apply every vocabulary covered in this synthesis — FOAF for person facts, dcterms for document metadata, sensemaking for employment events, schema.org for organizations, and SKOS for the ESCO interop query. Exercise 1.3 then asks you to build your own resume slice using the same vocabulary choices.

Before starting Exercise 1.3

Re-read the Module 1 README's primary project hook. The exercise asks for one resume, ~30–50 nodes, side-by-side Cypher and SPARQL queries. Use resume-001.ttl as a structural template — you will replace Alex Rivera's employment history with your own, but the vocabulary choices (which terms come from FOAF vs schema.org vs sensemaking vs SKOS) are the same decisions you will have to make.


Curated links.

  1. FOAF specification — xmlns.com/foaf/spec/ The canonical reference. Short and readable — the whole spec is one page. Read it once to understand what FOAF was designed for and what it is not.
  2. DCMI Metadata Terms — dublincore.org/specifications/dublin-core/dcmi-terms/ Definitive reference for dcterms: properties, classes, and their formal semantics. Bookmark the terms list for quick lookup while writing Turtle.
  3. W3C SKOS Reference — w3.org/TR/skos-reference/ Exhaustive specification for every SKOS term and its intended semantics. Section 8 (mapping properties) covers exactMatch, closeMatch, broadMatch — the terms that matter most for connecting resume skills to external vocabularies.
  4. schema.org — schema.org Browse types and properties. The search box is the fastest way to check whether schema.org has a term for what you need. The "more specific types" panel at the bottom of each type page shows the subclass hierarchy.
  5. ESCO API and Linked Data — esco.ec.europa.eu The EU's ESCO portal. The Linked Data section provides the full ESCO dataset as downloadable RDF (SKOS + OWL) and as a browsable hierarchy. Download the skills dataset and load it into Fuseki to replace the stubs in resume-001.ttl with live ESCO concept IRIs.
  6. Allemang, Hendler & Gandon — Semantic Web for the Working Ontologist, Chapters 1–3. Chapter 3 ("The basic tools of RDFS") and the sections on modeling with SKOS provide the conceptual grounding behind the vocabulary decisions in this sub-module.