RDF 1.2: Reifying Propositions

Lotico event 10 June 2025

Niklas Lindström, National Library of Sweden | RDF & SPARQL WG

RDF 1.2

RDF: A Simple Triple

<Alice> :bought <LennyTheLion> .

Forms a logical proposition.

A Graph is a Set of Triples

When interpreted, these are the facts of the interpretation.

Challenging Use Cases

Expressing circumstantial information, like:

Labelled Property Graphs

Nodes with attributes; edges between nodes.

Edges can have properties too.

(:ALICE) -[:BOUGHT {date: "2014-06"}]-> (:LENNY_THE_LION)

RDF-star

Motivations: alignment with LPGs (properties on edges) & statements about statements.

LPGs from an RDF Point of View



Each edge, even those with the same label,
is unique!

Not encodable as sets of triples. Rather, "multisets" of triples.

(No model-theoretic semantics—no formal entailments).

(:ALICE)
  -[:BOUGHT {date: "2014-06"}]->
      (:LENNY_THE_LION)

(:ALICE)
  -[:BOUGHT {date: "2014-12"}]->
      (:LENNY_THE_LION)
<Alice> :bought <LennyTheLion>
      {| :date "2014-06" ;
         :seller <ToyStore> |} .

<Alice :bought <LennyTheLion>
      {| :date "2014-12" ;
         :seller <Market> |} .

Multisets~ Occurrences

<Alice> :bought <LennyTheLion>
      {| :date "2014-06" ;
         :seller <ToyStore> |} .
      {| :date "2014-12" ;
         :seller <Market> |} .

A Triple Is an Abstraction

<Florens> :connectedTo <Rome>
              {| a :Route ;
                :road <A1> ;
                :distance "276"^^:KM |}
              {| a :Route ;
                :road <RaccordoAutostradaleFirenze-Siena-A1> ;
                :distance "309"^^:KM |} . 

The Map is Not the Territory

Concepts & Semantics

RDF 1.2: Triples as Objects

[] rdf:reifies <<( <Alice> :bought <LennyTheLion> )>> .

Triples are now allowed as objects of other triples. (I.e., as terms alongside IRIs, bnodes and literals.)

Triple terms denote abstract logical propositions.

(Cf. how literals denote resources in the value space of the datatype.)

RDF 1.2: Propositions & Reifiers

A triple denotes an rdfs:Proposition.

(Transparent semantics. Its sense, not its "encoding".)

If the triple is in the graph, it encodes
a fact in the interpretation.

Other Designs Considered

RDF 1.2: Syntactic Sugar

Annotated Triples

<Alice> :bought <LennyTheLion>
      {| a rdfs:Resource |} .

A Reified Statement

Reifying Triples

<< :TheEarth :revolvesAround :TheSun >> a :Statement ;
  :source :Galileo ;
  :date 1610 .

Naming Reifiers

<< <Alice> :bought <LennyTheLion> ~ <r1> >> .

<r1> a :Transaction .



<Alice> :bought <LennyTheLion> ~ <r2> .

<r2> a :Purchase .

Metaphor: Marginalia

Fact: The earth revolves around the sun. [1] [2] [3]

  1. Galileo proposed that in 1610.
  2. The church of old opposed that in 1633, on dogmatic grounds.
  3. In a relativistic world, this depends on the frame of reference.

Modelling Patterns

Kinds of Reifiers

The rdf:type of the reifier determines its nature (may be implied by predicates).

Provenance

<Alice> :bought <LennyTheLion> {|
    a :Transaction ;
    :source :TXZ ;
    :tstamp "0x66e"
  |} .

Qualification

<Alice> :bought <LennyTheLion> {|
    a :Purchase ;
    :seller <ToyStore> ;
    :date "2024-06"
  |} .

Qualifications

<Alice> :bought <LennyTheLion> {|
    a :Purchase ;
    :seller <ToyStore> ;
    :date "2024-06"
  |} {|
    a :Purchase ;
    :seller <Market> ;
    :date "2024-12"
  |} .

Case: Wikidata

<Q59166653> a :Person ;
  :name "Malgorzata Domino"@en ;
  :alumniOf <Q681>
      {| :academicDegree <Q1862897> ;
         :startDate "2005-10-01" ;
         :endDate "2011-02-28" |}
      {| :academicDegree <Q950900> ;
         :startDate "2011-10-01" ;
         :endDate "2012-11-08" |}
      {| :academicDegree <Q752297> ;
         :startDate "2011-03-08" ;
         :endDate "2015-04-22" |} .

Advanced Patterns

Continued: Wikidata

<Q59166653> sdo:alumniOf <Q681> ~ <9220f5f6> ~ <ff2f0926> ~ <c495f198> .

<9220f5f6> :academicDegree <Q1862897> ;
  :describedBy <https://pub.orcid.org/v3.0/0000-0001-9436-1074/education/6610842>
      ~ <379d8fe5> .
<ff2f0926> :academicDegree <Q950900> ;
  :describedBy <https://pub.orcid.org/v3.0/0000-0001-9436-1074/education/6610859>
      ~ <379d8fe5> .
<c495f198> :academicDegree <Q752297> ;
  :describedBy <https://pub.orcid.org/v3.0/0000-0001-9436-1074/education/6610892>
      ~ <379d8fe5> .

<379d8fe5> a :DataExtraction ;
  :statedIn <ORCIDPublicDataFile2021> ;
  :retrieved "+2021-11-05"^^xsd:date .

Varying Granularity

Use cases show reifiers of varying type, granularity and scope.

Examples include:

Name Forms

A simple example is the different models of person names.

Some define just name. Others, givenName and familyName. Etc.

A NameRecord may thus reify a single or multiple triples, depending on the modelling choice.



  <Alice> :name "Alice Liddell" ~ <nrx> .

  <nrx> a :NameRecord ;
    :date "1852" .
  <Alice> :givenName "Alice" ~ <nrx> ;
    :familyName "Liddell" ~ <nrx> .

  <nrx> a :NameRecord ;
    :date "1852" .

Case: Affiliated Author

<OnTheStateOfThings> a :Text ;
  :author <Alice> ;
  :dateCreated "2025-05".

<Alice> a :Person ;
  :affiliation <HardknockSchool> .
<OnTheStateOfThings> a :Text ;
  :contribution [ a :Contribution ;
      :agent <Alice> ;
      :affiliation <HardknockSchool> ;
      :date "2025-05" ] .

<Alice> a :Person .
<OnTheStateOfThings> a :Text ;
  :author <Alice> {| :affiliation <HardknockSchool> |} ;
  :dateCreated "2025-05".

<Alice> a :Person .

Continued: Annotated Affiliations

<< <Alice>
  :affiliation <HardknockSchool> ~ <ctb1> ,
    <TranscendentUniversity> ~ <ctb2> .

<Alice> a :Person ;
  :affiliation
    <TranscendentUniversity> ~ <ctb2> .

<OnTheStateOfThings> a :Text ;
  :author <Alice> ~ <ctb1> .

<OnTheChangeOfPatterns> a :Text ;
  :author <Alice> ~ <ctb2> ,
    <Lenny> ~ <ctb3> .
<ctb1> a :Contribution ;
  :date "2025-05".

<ctb2> a :Contribution ;
  :date "2036-10".

<ctb3> a :Contribution ;
  :role rel:win, rel:wst ;
  :date "2036-11".

Augmented Simplicity?

Previously, a bought relationship was qualified as a Purchase with a seller.

But the initial data might have been modelled differently, with a ("too") simple sold relation already present.

Compound Reifier

<Alice>
  :bought <LennyTheLion> ~ _:r1 .

<ToyStore>
  :sold <LennyTheLion> ~ _:r1 .

_:r1 a :Purchase ;
  :date "2024-06".

N-ary Relationship?

_:r1 a :Purchase ;
  :buyer <Alice> ;
  :seller <ToyStore> ;
  :item <LennyTheLion> ;
  :date "2024-06".

www.w3.org/TR/swbp-n-aryRelations

(OWL Doesn't Force This Choice)

:bought owl:propertyChainAxiom ([owl:inverseOf :buyer] :item) .
:sold owl:propertyChainAxiom ([owl:inverseOf :seller] :item) .

If you can afford to use OWL...

(There may be a path through the form of basic encoding. Watch this space.)

Named Graphs?

Datasets

There are no defined semantics for datasets.
The name does not (necessarily) denote the graph (set of triples).

A dataset is one default graph and a set of name, graph pairs (where the names are unique).

Looks Like a Graph?

<Alice> :bought
    <LennyTheLion> ~ _:r1 .

:ToyStore :sold
    <LennyTheLion> ~ _:r1 .

_:r1 a :Purchase ;
  :date "2024-06".

(Note that a graph is a set of triples.)

Alice Knows a Set?

<Alice> :knows <Lenny>, <Bob> .

No, Alice knows each person.

<Alice> :knows <Lenny> .
<Alice> :knows <Bob> .

Reifies Each Proposition

<Alice> :bought
    <LennyTheLion> ~ _:r1 .

:ToyStore :sold
    <LennyTheLion> ~ _:r1 .

_:r1 a :Purchase ;
  :date "2024-06".

(Note also that a set of one triple is not a proposition.)

Practical Graph Store Management

Different Use Cases

Provenance on the inside (the interpretation) or the outside (the dataset).

Summary

RDF 1.2