Niklas Lindström, National Library of Sweden | RDF & SPARQL WG
rdf:JSON
datatype.
rdf:dirLangString
).
<Alice> :bought <LennyTheLion> .
Forms a logical proposition.
When interpreted, these are the facts of the interpretation.
Expressing circumstantial information, like:
More granular remodelling. (Classic reification. The PROV ontology.)
Nodes with attributes; edges between nodes.
Edges can have properties too.
(:ALICE) -[:BOUGHT {date: "2014-06"}]-> (:LENNY_THE_LION)
Motivations: alignment with LPGs (properties on edges) & statements about statements.
<< <Alice> :bought <LennyTheLion> >> :date "2014-06" .
<Alice> :bought <LennyTheLion> {| :date "2014-06" |} .
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> |} .
<Alice> :bought <LennyTheLion> {| :date "2014-06" ; :seller <ToyStore> |} . {| :date "2014-12" ; :seller <Market> |} .
<Florens> :connectedTo <Rome> {| a :Route ; :road <A1> ; :distance "276"^^:KM |} {| a :Route ; :road <RaccordoAutostradaleFirenze-Siena-A1> ; :distance "309"^^:KM |} .
Source: OpenStreetMap & Rome.info
[] 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.)
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.
IPR(I) = { RE(x, y, z)| x ∈ IR, y ∈ IP, z ∈ IR }The set of facts:
F(I) = { RE(x, y, z)| <x, z> ∈ IEXT(y) }
A reifier is anything relating to a proposition using rdf:reifies
.
The reifier can be a data token, an event, circumstance, situation, context, etc.
rdf:Statement
"tokens of triples"; now conceptually a subset of new-style reifiers)
<Alice> :bought <LennyTheLion> {| a rdfs:Resource |} .
Expands to:
<Alice> :bought <LennyTheLion> . _:b1 a rdfs:Resource . _:b1 rdf:reifies <<( <Alice> :bought <LennyTheLion> )>> .
<< :TheEarth :revolvesAround :TheSun >> a :Statement ; :source :Galileo ; :date 1610 .
Expands to:
_:b2 rdf:reifies <<( :TheEarth :revolvesAround :TheSun )>> . _:b2 a :Statement . _:b2 :source :Galileo . _:b2 :date 1610 .
<< <Alice> :bought <LennyTheLion> ~ <r1> >> . <r1> a :Transaction .
<Alice> :bought <LennyTheLion> ~ <r2> .
<r2> a :Purchase .
Fact: The earth revolves around the sun. [1] [2] [3]
:TheEarth :revolvesAround :TheSun ~ <#1> ~ <#2> ~ <#3> . <#1> a :Statement ; :source :Galileo ; :date 1610 . <#2> a :DogmaticDenial ; :source :ChurchOfOld ; :date 1633 . <#3> a :ReferenceFrame ; :gravitationalSystemBoundary "..." .
The rdf:type
of the reifier determines its nature (may be implied by predicates).
Instances seen in the wild:
rdf:Statement
,
prov:Influence
,
prov:Attribution
,
sdo:Role
,
bf:Publication
,
bf:Contribution
...
<Alice> :bought <LennyTheLion> {| a :Transaction ; :source :TXZ ; :tstamp "0x66e" |} .
<Alice> :bought <LennyTheLion> {| a :Purchase ; :seller <ToyStore> ; :date "2024-06" |} .
<Alice> :bought <LennyTheLion> {| a :Purchase ; :seller <ToyStore> ; :date "2024-06" |} {| a :Purchase ; :seller <Market> ; :date "2024-12" |} .
<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" |} .
<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 .
Use cases show reifiers of varying type, granularity and scope.
Examples include:
Different modelling choices lead to different perspectives.
In many cases single propositions need to be reified.
But some may be of multiple propositions at once.
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" .
<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 .
<< <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".
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.
<Alice> :bought <LennyTheLion> ~ _:r1 . <ToyStore> :sold <LennyTheLion> ~ _:r1 . _:r1 a :Purchase ; :date "2024-06".
_:r1 a :Purchase ; :buyer <Alice> ; :seller <ToyStore> ; :item <LennyTheLion> ; :date "2024-06".
: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.)
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).
You can partition data into named graphs according to different schemes. Whether you bundle reifiers in the same named graph as the triples they reify, or partition them separately, is an orthogonal concern.
<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 <Lenny>, <Bob> .
<Alice> :knows <Lenny> . <Alice> :knows <Bob> .
<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.)
Provenance on the inside (the interpretation) or the outside (the dataset).
rdf:reifies
is but one relationship relating to propositions.
<<( :s :p :o )>>
.
rdf:reifies
.
:s :p :o {| a :Q |} .
| :s :p :o ~ :r .
<< s :p :o >> a :Q .
| << s :p :o ~ :r >> .
rdf:type
s, for qualification and provenance:
rdf:Statement
,
prov:Attribution
,
prov:Influence
,
sdo:Role
,
bf:Publication
,
bf:Contribution
...