Primary reading
Allemang et al. — Ch 11–12
Chapter 11 covers n-ary relations and the reification patterns in depth. Chapter 12 covers named graphs and provenance. Read both before starting Exercise 3.3.
Four ways to say something about a triple. Classical RDF reification, n-ary relations, named graphs, and RDF-star — with Itachi's backstory as the canonical teaching example.
RDF's triple model is elegant: subject, predicate, object. But what happens when you need to say who claims this, in what source, at what confidence? A triple cannot have properties. You cannot write (Itachi, killed, UchihaClan) dcterms:source "manga chapter 401" — that would require the triple itself to be a subject, which plain RDF does not allow.
Reification is the set of patterns for working around this constraint. Each approach represents a different tradeoff between expressiveness, verbosity, query ergonomics, and tooling support. All four exist because none is optimal for all use cases. Choosing the right approach is a design decision — not a fact lookup.
Most knowledge graph teaching examples use clean, uncontested facts (Obama was born in Hawaii; Paris is the capital of France). The Naruto canon is deliberately messy: Itachi's motivation was presented one way for 130 chapters, then retconned in chapter 401. Different sources (manga, anime, databooks, movies, fan wikis) assert different and conflicting facts. This is exactly what real provenance-heavy systems deal with — medical literature that contradicts earlier studies, legal records that supersede earlier ones, intelligence assessments that are revised. Naruto is just more fun to work with than clinical trial metadata.
Itachi Uchiha killed his entire clan. That is stated in the Naruto manga. But why he did it differs radically between two sources:
A naive graph has: naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan. One triple. No source. No motivation. Both narratives would annotate this same triple differently. Without reification, the graph cannot represent the fact that this claim is disputed — or that its meaning changed between 2002 and 2007.
This is not a Naruto-specific problem. It is the general problem of provenance-aware knowledge graphs: the same triple may be asserted by multiple sources with different confidence, dates, or interpretations. Reification is how RDF represents that.
Load the reification exercise files from modules/03-reasoning/exercises/3-2-reification/:
approach-1-classical.ttl · approach-2-nary.ttl · approach-3-named-graphs.trig · approach-4-rdf-star.ttl.
The query lab below uses approach-1-classical.ttl as the primary example (classical reification is universally supported in Fuseki). Load all four into separate Fuseki datasets to compare query ergonomics.
Uses rdf:Statement with rdf:subject, rdf:predicate, rdf:object. Verbose — 4+ triples per annotated fact. Querying requires knowing the subject/predicate/object to locate the statement node. Universal support.
Promotes the relationship to a first-class event/situation class. The killing becomes a naruto:NarrativeEvent individual with actor, action, motivation, and source properties. Clean IRI, easy to query, no awkward triple replication. Good for complex relationships.
Uses TriG format. Assertions go inside a named graph; the graph IRI carries metadata. Annotates groups of assertions (whole chapters) rather than individual triples. Natural for source-level provenance. Good tooling support; SPARQL GRAPH pattern is well-understood.
Quoted triples: <<S P O>> becomes a subject. Cleanest syntax — annotation attaches directly to the triple. Requires RDF 1.2 / RDF-star support (Jena 4.x, Oxigraph, GraphDB). Not yet universal (2026).
| Approach | Annotates | Verbosity | Query ergonomics | Support |
|---|---|---|---|---|
| Classical | Individual triples | High (4+ triples/fact) | Requires S/P/O match to find statement node | Universal |
| N-ary | Relationships as events | Medium (new class + properties) | Query by event IRI directly | Universal |
| Named graphs | Groups of assertions | Low (TriG syntax) | GRAPH keyword; metadata in default graph | Good (TriG widely supported) |
| RDF-star | Individual triples | Very low (<<>> annotation) | SPARQL-star << >> in patterns | Partial (2026) |
# The base triple (still needed — reification does not replace it) naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan . # The reification: turn the triple into a named node naruto:ItachiKilledStatement a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate naruto:killedClan ; rdf:object naruto:UchihaClan ; dcterms:source "Naruto manga, vol. 43, ch. 401"^^xsd:string ; sensemaking:confidence sensemaking:CanonicalManga .
Pain points: the triple is repeated (subject/predicate/object appear both in the base triple AND in the rdf:Statement). SPARQL must match all three of rdf:subject, rdf:predicate, rdf:object to locate the statement node. If you have 1,000 annotated facts, that is 4,000+ triples of overhead. This verbosity is one of the most-cited reasons practitioners choose LPG over RDF — Neo4j lets you put the metadata directly on the edge.
# The relationship becomes a named event individual
naruto:ItachiClanMassacre
a naruto:NarrativeEvent ;
naruto:actor naruto:ItachiUchiha ;
naruto:action naruto:KilledClan ;
naruto:target naruto:UchihaClan ;
naruto:orderGivenBy naruto:DanzoShimura ;
dcterms:source "Naruto manga, vol. 43, ch. 401"^^xsd:string ;
sensemaking:confidence sensemaking:CanonicalManga .
The event node has a stable IRI — query it directly without knowing subject/predicate/object. Adding new properties (witnesses, aftermath, duration) is trivial. This is the same pattern as the sensemaking:Employment event class in the resume graph from Module 1. N-ary is the natural OWL pattern when a relationship needs its own attributes.
# TriG format: assertions inside the named graph naruto:MangaSource401 { naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan . naruto:ItachiUchiha naruto:actedUnderOrders naruto:DanzoShimura . } # Default graph: metadata about the named graph { naruto:MangaSource401 dcterms:date "2007-05-14"^^xsd:date ; sensemaking:confidence sensemaking:CanonicalManga . }
# SPARQL GRAPH pattern SELECT ?source ?confidence WHERE { GRAPH ?g { naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan . } ?g dcterms:date ?date ; sensemaking:confidence ?confidence ; dcterms:source ?source . }
# RDF-star (requires Jena 4.x, Oxigraph, or GraphDB) <<naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan>> dcterms:source "Naruto manga, vol. 43, ch. 401"^^xsd:string ; sensemaking:confidence sensemaking:CanonicalManga . # SPARQL-star query SELECT ?source ?confidence WHERE { <<naruto:ItachiUchiha naruto:killedClan naruto:UchihaClan>> dcterms:source ?source ; sensemaking:confidence ?confidence . }
The cleanest syntax. No intermediate node, no S/P/O repetition. The quoted triple is both the base fact and the subject of the annotation in one expression. The limitation is tooling support — verify your stack before committing to RDF-star in production. Fuseki 4.x (included in Jena 4.x) supports it; earlier versions do not.
PROV-O (Provenance Ontology) is the W3C standard vocabulary for describing provenance — who created what, when, from what sources. It is designed to work with any reification approach. Three core classes:
prov:Entity — anything that has provenance: a document, a dataset, a claim, a named graph.prov:Agent — who is responsible: a person, an organization, a software process.prov:Activity — what happened: the act of asserting, creating, deriving, or modifying an entity.@prefix prov: <http://www.w3.org/ns/prov#> . # The manga chapter is a prov:Entity naruto:MangaSource401 a prov:Entity ; prov:wasAttributedTo naruto:MasashiKishimoto ; # the author prov:generatedAtTime "2007-05-14"^^xsd:date ; dcterms:isPartOf naruto:NarutoMangaSeries . # The author is a prov:Agent naruto:MasashiKishimoto a prov:Agent , foaf:Person ; foaf:name "Masashi Kishimoto" . # A named graph is attributed to the source naruto:ItachiMassacreGraph a prov:Entity ; prov:wasDerivedFrom naruto:MangaSource401 ; prov:wasAttributedTo naruto:SensemakingAI .
PROV-O integrates naturally with named graphs: the named graph IRI is a prov:Entity, and the chapter or source document is what it prov:wasDerivedFrom. This is the recommended approach in the Module 3 README for Exercise 3.3: named graphs + PROV-O, with each graph's metadata including provenance chain back to the original source.
The Module 3 README specifies a custom sensemaking:confidence property with values like canonical-strong, anime-only, and fan-theory. PROV-O does not have a "confidence" concept out of the box — it describes provenance chains, not confidence levels. The custom property fills this gap. PROV-O handles who said what; the custom confidence vocabulary handles how much to trust it. Both are needed together for the Naruto use case.
Load approach-1-classical.ttl into Fuseki. In the SPARQL editor, run query q01 from the query lab below — retrieve the Itachi killing fact with its source. Confirm you get two rows (the chapter 401 version and the chapter 131 version).
Write in your notes: how many lines of SPARQL did the query require? How readable is the WHERE clause? How would you find all assertions about Itachi without knowing the predicate in advance?
Clear the dataset and load approach-2-nary.ttl. Write a SELECT query that returns the same information: actor, action, source, confidence. Compare to the classical query — is the pattern simpler? Is the IRI for the event node more convenient than the classical reification statement node?
Write in your notes: which approach felt more natural? Which produced a more readable Turtle file?
Create a new Fuseki dataset or clear the existing one. Upload approach-3-named-graphs.trig. Fuseki handles TriG natively — no format conversion needed.
Run a SPARQL query using the GRAPH keyword pattern shown in Section 3 above. Compare: how does querying named graphs for metadata feel compared to querying the statement node in classical reification?
Note: named graphs annotate all triples in the graph collectively, not individual triples. The two assertions in naruto:MangaSource401 share the same source metadata. This is an advantage when entire chapters need the same attribution, and a limitation when individual triples within a chapter have different confidence levels.
Load approach-4-rdf-star.ttl. In Fuseki 4.x (Jena 4), RDF-star is supported — attempt to load and run a SPARQL-star query using the <<>> syntax in the WHERE clause.
If your Fuseki version rejects the file, note the error and skip this step — the approach is not supported in your current setup. Document which version you have in notes/week-07-reasoner.md: this is a real production compatibility check.
If it works, compare the query ergonomics to classical reification. RDF-star's <<S P O>> pattern in SPARQL is significantly more readable than classical reification's three-way match on rdf:subject/predicate/object.
The Exercise 3.2 deliverable is four .ttl/.trig files — one per approach — plus SPARQL queries for each that retrieve the fact with its source. The starter files in the exercises folder give you the data; you write the queries.
Commit to exercises/3-2-reification/ alongside the starter files. Your synthesis notes for Week 7 should cover: which approach you would choose for Exercise 3.3 (the full Itachi project) and why. The Module 3 README recommends named graphs + PROV-O, but the choice is yours to make and defend.
Queries q01–q04 run against the classical reification file (approach-1-classical.ttl). Query q05 shows the named graphs GRAPH pattern. All five demonstrate the same information retrieval goal through different reification patterns.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX naruto: <https://sensemaking-ai.com/ns/naruto#> PREFIX sensemaking: <https://sensemaking-ai.com/ns/> SELECT ?source ?date ?confidence ?comment WHERE { ?stmt a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate naruto:killedClan ; rdf:object naruto:UchihaClan ; dcterms:source ?source ; dcterms:date ?date ; sensemaking:confidence ?confidence . OPTIONAL { ?stmt rdfs:comment ?comment . } } ORDER BY ?date
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX naruto: <https://sensemaking-ai.com/ns/naruto#> PREFIX sensemaking: <https://sensemaking-ai.com/ns/> SELECT ?predicate ?object ?source WHERE { ?stmt a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate ?predicate ; rdf:object ?object ; dcterms:source ?source ; sensemaking:confidence sensemaking:CanonicalManga . } ORDER BY ?predicate
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX naruto: <https://sensemaking-ai.com/ns/naruto#> PREFIX sensemaking: <https://sensemaking-ai.com/ns/> SELECT ?date ?predLabel ?confidence ?source WHERE { ?stmt a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate ?predicate ; rdf:object ?object ; dcterms:source ?source ; dcterms:date ?date ; sensemaking:confidence ?confidence . OPTIONAL { ?predicate rdfs:label ?predLabel . } } ORDER BY ?date
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX naruto: <https://sensemaking-ai.com/ns/naruto#> PREFIX sensemaking: <https://sensemaking-ai.com/ns/> SELECT DISTINCT ?predicate ?source1 ?source2 WHERE { ?s1 a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate ?predicate ; rdf:object naruto:UchihaClan ; dcterms:source ?source1 ; sensemaking:confidence ?conf1 . ?s2 a rdf:Statement ; rdf:subject naruto:ItachiUchiha ; rdf:predicate ?predicate ; rdf:object naruto:UchihaClan ; dcterms:source ?source2 ; sensemaking:confidence ?conf2 . FILTER (?s1 != ?s2 && ?conf1 != ?conf2) FILTER (STR(?s1) < STR(?s2)) } ORDER BY ?predicate
PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX schema: <https://schema.org/> PREFIX naruto: <https://sensemaking-ai.com/ns/naruto#> PREFIX sensemaking: <https://sensemaking-ai.com/ns/> # Load approach-3-named-graphs.trig into Fuseki before running this query. SELECT ?predicate ?object ?graphName ?date ?confidence WHERE { GRAPH ?g { naruto:ItachiUchiha ?predicate ?object . } ?g schema:name ?graphName ; dcterms:date ?date ; sensemaking:confidence ?confidence . } ORDER BY ?date ?predicate
Exercise 3.3 (primary project A) extends the Itachi example into a full 20-30 assertion provenance graph. The Module 3 README has the full steps. Two things to decide before starting:
Named graphs + PROV-O is the Module 3 README recommendation — it is well-supported, scales to many assertions, and integrates cleanly with PROV-O's provenance chain. If your Fuseki supports RDF-star, that is also defensible. Classical reification is the fallback if you need universal compatibility. Document your choice in the Exercise 3.3 artifact's README.md under "Design decisions."
Itachi is the canonical example (revelation in ch. 401). Other rich candidates for the 20-30 assertion dataset: Obito Uchiha (true identity revealed 300 chapters after introduction), Minato Namikaze (Naruto's father, revealed mid-series), Nagato/Pain (backstory retold from a different perspective in the Pain arc). Each has clearly identifiable source chapters and clear before/after narratives.
The artifact lives at modules/03-reasoning/artifacts/naruto-reification/ with a data.ttl (or data.trig), queries/ folder, README.md, and REFLECTION.md. The reflection — would Neo4j have been easier? — is the blog post seed.
Chapter 11 covers n-ary relations and the reification patterns in depth. Chapter 12 covers named graphs and provenance. Read both before starting Exercise 3.3.
The W3C provenance ontology. The primer (prov-primer) is more readable than the spec itself. Read the primer, then refer to the spec when implementing. Focus on prov:Entity, prov:Agent, prov:Activity, and wasDerivedFrom.
The candidate recommendation for RDF 1.2's quoted triple syntax. Check your triplestore's release notes for SPARQL-star support before using <<>> in production queries.
The four starter files: approach-1-classical.ttl, approach-2-nary.ttl, approach-3-named-graphs.trig, approach-4-rdf-star.ttl. Load into Fuseki and run the Exercise 3.2 comparison steps.
SHACL in depth, vocabulary alignment (owl:sameAs vs skos:exactMatch), and the Resume skill inference project — primary project B.
The four approaches side by side: sample Turtle, sample SPARQL query, verbosity rating, support matrix. Available when Module 3 materials are complete.