RDF 1.2 · Triple Terms · Reifiers · SPARQL 1.2 · Virtuoso

RDF 1.2 in Virtuoso — Examples, Data & SPARQL Workbench

An executable companion to the OpenLink community post “Introducing RDF 1.2 Support in Virtuoso”: every modeling pattern and SPARQL example from the post, backed by a loadable RDF 1.2 dataset, plus supplementary examples from the RDF 1.2, RDF-star, and SPARQL 1.2 specifications — all runnable in the SPARQL Workbench section below.

By danielhm Publisher: OpenLink Software Published 2026-06-01 Source: community.openlinksw.com/t/6283 KG curated by kg-generator on behalf of Kingsley Uyi Idehen
RDF 1.2 Concepts SPARQL 1.2 Triple Terms Reifiers Annotation Syntax Verified examples 18 query recipes
Introduction

Statement Annotations & Provenance

With RDF 1.2 advancing through the W3C standards process, the Semantic Web community now has a standardized framework for annotating statements, tracking provenance, and representing metadata about relationships through triple terms and reifiers. Virtuoso now provides support for these capabilities, enabling developers to build graph applications using the latest RDF model and SPARQL 1.2 features.

For many applications it is not enough to simply assert facts. Organizations frequently need to know:

  • Where did this information come from?
  • When was it verified?
  • Who asserted it?
  • How trustworthy is it?
  • What evidence supports it?

RDF 1.2 standardizes statement annotations and provenance modeling through triple terms, reifiers, and annotation syntax, providing a cleaner and more interoperable solution than the historical techniques below.

The running example used throughout the post

PREFIX : <#> :alice :worksFor :AcmeCorp .

…with metadata attached such as :source :HRSystem and :verifiedOn "2025-01-15"^^xsd:date.

RDF 1.2 · Triple Term

Triple Terms

A triple represented directly as a value: << :alice :worksFor :AcmeCorp >>. Identifies the statement itself; referenced by one or more reifiers.

RDF 1.2 · Reifier

Reifiers

A resource that reifies a triple term via rdf:reifies and carries the annotations, e.g. :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >>.

RDF 1.2 · Syntax

Annotation Syntax

Concise {| … |} shorthand that asserts a triple and automatically creates an underlying reifier with the annotations.

Historical Approaches

How Metadata Was Attached Before RDF 1.2

Before RDF 1.2, several modeling patterns emerged for describing metadata about RDF statements — each solving specific problems while introducing complexity and interoperability challenges.

Pattern 1

Standard Reification

A resource of type rdf:Statement describes the statement via rdf:subject, rdf:predicate, rdf:object. Verbose, and does not clearly articulate the semantics of statements asserted by an observer.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :employmentStatement a rdf:Statement ; rdf:subject :alice ; rdf:predicate :worksFor ; rdf:object :AcmeCorp ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
Pattern 2

N-Ary Relations

Converts the relationship into a first-class entity. Works well when the relationship naturally represents an event with multiple participants — but the original triple no longer exists directly.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :employmentEvent1 a :EmploymentRelationship ; :employee :alice ; :employer :AcmeCorp ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
Pattern 3

Singleton Properties

Creates a unique predicate per occurrence, preserving a direct relationship while allowing metadata. The downside: large datasets may generate millions of one-off predicates.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :worksFor_123 a rdf:Property ; :singletonPropertyOf :worksFor ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date . :alice :worksFor_123 :AcmeCorp .

Pattern Head-to-Head

Aspect Standard Reification N-Ary Relations Singleton Properties RDF 1.2 Reifiers
Original triple preservedYes — statement added alongsideNo — replaced by event nodeYes — via one-off predicateYes — triple term + reifier
VerbosityHigh — 4+ triples per statementMedium — event entityHigh — one predicate per occurrenceLow — one reifier per record
Stable identifier for observationrdf:Statement IRIEvent entity IRIPredicate IRIReifier IRI
ScalabilityPoor — verbosity explodesFair — event-node explosionPoor — predicate explosionGood — shared triple terms
Query simplicityIndirect — subject/predicate/object joinsIndirect — traverse event nodeDirect — ?s :worksFor_123 ?oDirect — rdf:reifies pattern
Standards-basedW3C RDF 1.0/1.1Ad-hoc modeling patternAd-hoc (singleton-property pattern)W3C RDF 1.2
Annotation directnessStatement resourceEvent entityProperty instanceReifier of the triple term
RDF 1.2 in Virtuoso

Triple Terms, Reifiers & Annotation Syntax

RDF 1.2 introduces a standardized mechanism for treating RDF triples as first-class values. At the heart of this capability are Triple Terms, Reifiers, Annotation Syntax, and SPARQL 1.2 Query Support.

Form 1 · Explicit Reifier

Explicit Reifier Form

Useful when the observation itself requires a stable identifier that can be referenced elsewhere in the graph.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >> ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
Form 2 · Annotation Shorthand

Annotation Shorthand

Most users will prefer the concise RDF 1.2 annotation syntax — it automatically creates an underlying reifier while preserving readability.

PREFIX : <#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :alice :worksFor :AcmeCorp {| :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date |} .

Conceptually expands to the triple plus _:r rdf:reifies << :alice :worksFor :AcmeCorp >> ; :source :HRSystem ; :verifiedOn ….

Why RDF 1.2 Matters

Separation of Statement from Record

Multiple Sources

Multiple Sources Can Describe the Same Fact

Two independent systems both confirm that Alice works for Acme Corp; each keeps independent provenance through its own reifier of the same triple term.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> :alice :worksFor :AcmeCorp . :hrRecord rdf:reifies << :alice :worksFor :AcmeCorp >> ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date . :directoryRecord rdf:reifies << :alice :worksFor :AcmeCorp >> ; :source :CorporateDirectory ; :verifiedOn "2025-01-20"^^xsd:date .
Cleaner Models

Cleaner Data Models

The underlying relationship remains simple while metadata stays attached through reifiers — no artificial event nodes, no synthetic predicates.

PREFIX : <#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> :alice :worksFor :AcmeCorp . :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >> .
Provenance

Standards-Based Provenance

A common W3C framework for recording where information originated and how it was verified — portable across RDF systems instead of application-specific annotation models.

Interoperability

Improved Interoperability

Applications exchanging RDF 1.2 data rely on a common representation for statement annotations, provenance, confidence scores, temporal metadata, and evidence tracking.

RDF 1.2 SPARQL Examples in Virtuoso

The Post's SPARQL 1.2 INSERT DATA Examples

Many production systems organize data into named graphs to separate datasets, applications, or tenants. The post's examples insert an annotated relationship into GRAPH <urn:graph:employees> — using either the annotation syntax or explicit reifiers. Both are reproduced verbatim below and in the SPARQL Workbench as loadable recipes.

Example 1 — INSERT DATA using Annotation Syntax

PREFIX : <#> · PREFIX xsd: …

PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT DATA {
    GRAPH <urn:graph:employees> {
        :alice :worksFor :AcmeCorp {|
            :source :HRSystem ;
            :verifiedOn "2025-01-15"^^xsd:date ;
            :confidence 0.98
        |} .
    }
}
Expected result: 5 triples — the base triple :alice :worksFor :AcmeCorp, plus a reifier blank node with rdf:reifies, :source, :verifiedOn, and :confidence.
Verified live on URIBurner (Virtuoso, RDF 1.2).
Example 2 — INSERT DATA using Explicit Reifiers
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

INSERT DATA {
    GRAPH <urn:graph:employees> {
        :alice :worksFor :AcmeCorp .

        :employmentRecord1
            rdf:reifies << :alice :worksFor :AcmeCorp >> ;
            :source :HRSystem ;
            :verifiedOn "2025-01-15"^^xsd:date ;
            :confidence 0.98 .
    }
}
Expected result: 6 triples — the base triple plus :employmentRecord1 rdf:reifies << … >> with its three annotations.
Verified live on URIBurner (Virtuoso, RDF 1.2). The explicit form is useful when the reifier becomes part of the domain model.
Knowledge Graph Explorer

Explore the RDF 1.2 Collection Graph

Nodes and edges are RDF entities from the companion knowledge graphs. Drag nodes to pin them, double-click to unpin, click a node to open its resolver description, and use Controls for Basic/Advanced modes and filters.

0 nodes · 0 links

Graph Settings

Physics
Predicates
Nodes & Literals
Resolver & Arrows
FAQ

Frequently Asked Questions

What problem does RDF 1.2 solve?
RDF 1.2 standardizes statement annotations and provenance modeling through triple terms, reifiers, and annotation syntax, giving a cleaner and more interoperable solution than the ad-hoc techniques RDF developers previously used to attach metadata to statements.
What is a triple term?
A triple term is an RDF 1.2 triple used as a first-class value inside another triple, written << s p o >>, e.g. << :alice :worksFor :AcmeCorp >>. It identifies the statement itself and can be referenced by one or more reifiers.
What is a reifier?
A reifier is a resource that reifies a triple term via the rdf:reifies predicate, e.g. :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >>. Reifiers carry the annotations (source, verifiedOn, confidence) and can be the subject of other triples.
What is RDF 1.2 annotation syntax?
Annotation syntax is the concise {| … |} form, e.g. :alice :worksFor :AcmeCorp {| :source :HRSystem ; :verifiedOn "2025-01-15" |}. It automatically creates an underlying reifier while preserving readability.
How is standard reification different from RDF 1.2 reifiers?
Standard reification creates an rdf:Statement resource with rdf:subject, rdf:predicate, and rdf:object. RDF 1.2 reifiers attach to a triple term directly via rdf:reifies, are less verbose, and clearly separate the statement from the records that describe it.
What is the n-ary relations pattern?
The n-ary pattern converts a relationship into a first-class entity, e.g. :employmentEvent1 a :EmploymentRelationship ; :employee :alice ; :employer :AcmeCorp. It works well for events with multiple participants, but the original triple no longer exists directly.
What is the singleton properties pattern?
Singleton properties create a unique predicate per occurrence, e.g. :worksFor_123 with :singletonPropertyOf :worksFor, preserving a direct triple while allowing metadata. The downside: large datasets may generate millions of one-off predicates.
How do multiple sources describe the same fact in RDF 1.2?
Multiple reifiers can reference the same triple term, e.g. :hrRecord rdf:reifies << :alice :worksFor :AcmeCorp >> and :directoryRecord rdf:reifies << :alice :worksFor :AcmeCorp >>, each keeping independent provenance (source and verifiedOn).
How do I insert annotated data with SPARQL 1.2?
Use INSERT DATA with annotation syntax inside a GRAPH clause, e.g. INSERT DATA { GRAPH <urn:graph:employees> { :alice :worksFor :AcmeCorp {| :source :HRSystem ; :confidence 0.98 |} . } }.
When should I use the explicit reifier form instead of annotation syntax?
Use the explicit form when the observation itself requires a stable identifier that must be referenced elsewhere in the graph, or when the reifier becomes part of the domain model.
How do I query reifiers of a statement in SPARQL 1.2?
Bind the triple term as a value and match rdf:reifies: BIND( <<( :alice :worksFor :AcmeCorp )>> AS ?tt ) ?r rdf:reifies ?tt ; :source ?src. The annotation pattern ?s ?p ?o {| ?ap ?ao |} also exposes annotations directly.
What can RDF 1.2 annotations carry?
Provenance, confidence scores, temporal metadata, evidence, and verification details, e.g. :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date ; :confidence 0.98, with a common W3C representation portable across RDF systems.
Glossary

RDF 1.2 & SPARQL 1.2 Terms

The W3C RDF 1.2 suite of specifications extending RDF with triple terms, reifiers, and annotation syntax.

The original name of the W3C effort to reify RDF statements as first-class terms, now standardized as RDF 1.2 triple terms and reifiers.

An RDF triple used as an RDF term within another triple, written << s p o >>; a first-class value that identifies a statement.

The concrete syntax for a triple term: << s p o >> in Turtle, <<( s p o )>> (TripleTerm) in SPARQL 1.2.

A resource that reifies a triple term through the rdf:reifies predicate; reifiers (not triple terms) are expected to be used in further statements.

The general technique of making statements about statements; in RDF 1.2, standardized via reifiers and triple terms.

RDF 1.2 shorthand {| … |} that asserts a triple and attaches annotations through an automatically created reifier.

The RDF predicate relating a reifier to the triple term it reifies: reifier rdf:reifies << s p o >>.

The RDF class used by standard reification, with rdf:subject, rdf:predicate, and rdf:object properties.

The W3C SPARQL 1.2 suite: query and update support for RDF 1.2 triple terms, reifiers, and annotation patterns.

An RDF graph identified by an IRI in a quad store; used in the post to separate datasets, e.g. GRAPH <urn:graph:employees>.

Where information originated and how it was verified; a canonical RDF 1.2 annotation use case carried by reifiers.

A numeric annotation (e.g. :confidence 0.98) expressing how trustworthy a statement is, attached via a reifier.

Historical modeling pattern converting a relationship into a first-class entity, e.g. :employmentEvent1 a :EmploymentRelationship.

Historical modeling pattern creating a unique predicate per relationship occurrence, e.g. :worksFor_123 with :singletonPropertyOf :worksFor.

How To

Work with RDF 1.2 in Virtuoso

1

Identify the fact to annotate

Choose the base statement, e.g. :alice :worksFor :AcmeCorp, and decide what metadata matters: source, verification date, confidence, temporal validity, or evidence.

2

Pick a modeling form

Use the annotation shorthand for concise, readable data; use the explicit reifier form when the observation needs a stable identifier referenced elsewhere in the graph.

3

Write the SPARQL 1.2 INSERT DATA

Insert into a named graph with annotation syntax: INSERT DATA { GRAPH <urn:graph:employees> { :alice :worksFor :AcmeCorp {| :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date ; :confidence 0.98 |} . } }.

4

Query the reifiers

Bind the triple term as a value and match rdf:reifies: BIND( <<( :alice :worksFor :AcmeCorp )>> AS ?tt ) ?r rdf:reifies ?tt ; :source ?src. Use the annotation pattern ?s ?p ?o {| ?ap ?ao |} to read annotations directly.

5

Model multiple sources for the same fact

Let each system reify the same triple term independently, e.g. :hrRecord and :directoryRecord both rdf:reifies << :alice :worksFor :AcmeCorp >> with their own :source and :verifiedOn.

6

Attach confidence and temporal metadata

Add :confidence, :validFrom, :validTo, :evidence, and :verifiedBy annotations to reifiers; aggregate and filter them in SPARQL with FILTER, COUNT, and AVG.

7

Verify with DESCRIBE and CONSTRUCT

Inspect reifiers with DESCRIBE ?r WHERE { ?r rdf:reifies << :alice :worksFor :AcmeCorp >> } and export reification graphs with CONSTRUCT.

SPARQL Workbench

Run Every Example from the Post

This workbench exposes the loader recipes (the post's two SPARQL 1.2 INSERT DATA statements plus the full example dataset) and query recipes (18 verified SPARQL 1.2 SELECT / CONSTRUCT / DESCRIBE queries against that data). The example dataset is uploaded to the DAV contract graph https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl, and every read recipe is scoped to it with FROM <graph> at load and run time. Hit Run query to execute the selected recipe in-page against the URIBurner endpoint (Virtuoso, RDF 1.2) and see live results; the expected results shown for each recipe were verified live on this URIBurner (Virtuoso, RDF 1.2) instance, which itself functions as the verifier.

Expected results (verified)

How it works: Run query executes the textarea contents in-page against the endpoint above — the example dataset is uploaded to the DAV graph selected above. Read recipes (R1–R18) are automatically scoped with FROM <{selected graph}>: the textarea always shows the exact scoped query that runs. INSERT DATA loader recipes (L1–L3) require write access, so they execute against your own Virtuoso instance; on public endpoints you will get a permission error, and Open in new tab still gives you the live query URL.

Loader Recipes

L1 · INSERT DATA with Annotation Syntax (post §5.1)
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT DATA {
    GRAPH <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> {
        :alice :worksFor :AcmeCorp {|
            :source :HRSystem ;
            :verifiedOn "2025-01-15"^^xsd:date ;
            :confidence 0.98
        |} .
    }
}
Expected result: 5 triples — base triple + reifier blank node with rdf:reifies, :source, :verifiedOn, :confidence.
Verified live on URIBurner (Virtuoso, RDF 1.2).
L2 · INSERT DATA with Explicit Reifiers (post §5.2)
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

INSERT DATA {
    GRAPH <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> {
        :alice :worksFor :AcmeCorp .

        :employmentRecord1
            rdf:reifies << :alice :worksFor :AcmeCorp >> ;
            :source :HRSystem ;
            :verifiedOn "2025-01-15"^^xsd:date ;
            :confidence 0.98 .
    }
}
Expected result: 6 triples — base triple + :employmentRecord1 reifier with rdf:reifies and three annotations.
Verified live on URIBurner (Virtuoso, RDF 1.2).
L3 · Load the full example dataset (all post examples + spec extras)

Prefer loading rdf/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl directly (TTLP_MT / rdf_loader_run / LOAD <file>). Equivalent single-statement INSERT DATA for workbench use:

PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT DATA {
  GRAPH <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> {
    # Running example + explicit reifier (post)
    :alice :worksFor :AcmeCorp .
    :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >> ;
        :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date ; :confidence 0.98 .

    # Multiple sources, same fact (post)
    :hrRecord rdf:reifies << :alice :worksFor :AcmeCorp >> ;
        :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
    :directoryRecord rdf:reifies << :alice :worksFor :AcmeCorp >> ;
        :source :CorporateDirectory ; :verifiedOn "2025-01-20"^^xsd:date .

    # Spec extras: annotation syntax, nested triple terms, reifier-of-reifier,
    # temporal validity, evidence, conflicting evidence, extra facts
    :bob :worksFor :AcmeCorp {| :source :HRSystem ; :verifiedOn "2025-02-01"^^xsd:date ; :confidence 0.95 |} .
    :carol :worksFor :Globex {| :source :HRSystem ; :validFrom "2024-06-01"^^xsd:date ; :validTo "2026-05-31"^^xsd:date ; :confidence 0.99 |} .
    :dave :worksFor :Initech {| :source :ContractFile ; :evidence :contractFile2025 ; :verifiedBy :hrManager ; :verifiedOn "2025-04-10"^^xsd:date ; :confidence 0.97 |} .
    :alice :worksFor :Globex {| :source :LinkedInProfile ; :verifiedOn "2025-06-01"^^xsd:date ; :confidence 0.6 |} .
    :claim1 :asserts << :alice :worksFor :AcmeCorp >> .
    :metaClaim :states << :bob :worksFor << :alice :worksFor :AcmeCorp >> >> .
    :auditRecord rdf:reifies << :hrRecord rdf:reifies << :alice :worksFor :AcmeCorp >> >> ;
        :source :AuditLog ; :verifiedOn "2025-03-01"^^xsd:date .
    :bob :worksFor :AcmeCorp . :alice :knows :bob . :bob :knows :carol . :carol :knows :dave .

    # Historical patterns for comparison
    :employmentStatement a rdf:Statement ; rdf:subject :alice ; rdf:predicate :worksFor ;
        rdf:object :AcmeCorp ; :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
    :employmentEvent1 a :EmploymentRelationship ; :employee :alice ; :employer :AcmeCorp ;
        :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
    :worksFor_123 a rdf:Property ; :singletonPropertyOf :worksFor ;
        :source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date .
    :alice :worksFor_123 :AcmeCorp .
  }
}
Expected result: ~60 triples in the DAV contract graph covering every example in the post plus RDF 1.2 / RDF-star / SPARQL 1.2 spec extras.
Verified live on URIBurner (Virtuoso, RDF 1.2).

Query Recipes

R1 · Reifiers of the running-example fact
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?r ?src FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << :alice :worksFor :AcmeCorp >> ;
       :source ?src
} ORDER BY ?r
Expected result: 3 rows: directoryRecord → CorporateDirectory; employmentRecord1 → HRSystem; hrRecord → HRSystem. Verified live on URIBurner (Virtuoso, RDF 1.2).
R2 · Full annotations of a triple term (BIND form)
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?r ?ap ?ao FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    BIND( <<( :alice :worksFor :AcmeCorp )>> AS ?tt )
    ?r rdf:reifies ?tt ;
       ?ap ?ao
} ORDER BY ?ap ?ao
Expected result: Every annotation triple (source, verifiedOn, confidence, rdf:reifies) of each reifier of << :alice :worksFor :AcmeCorp >> — 6 reifiers, 10+ rows. Verified live on URIBurner (Virtuoso, RDF 1.2).
R3 · Facts behind reifiers
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT DISTINCT ?s ?p ?o FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << ?s ?p ?o >>
} ORDER BY ?s ?p ?o
Expected result: Distinct triple terms that are reified, including the nested reifier-of-reifier term. Verified live on URIBurner (Virtuoso, RDF 1.2).
R4 · Facts with provenance (annotation pattern)
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?p ?o ?src FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s ?p ?o {| :source ?src |}
} ORDER BY ?s
Expected result: 4 rows: alice/Globex→LinkedInProfile; bob/AcmeCorp→HRSystem; carol/Globex→HRSystem; dave/Initech→ContractFile. Verified live on URIBurner (Virtuoso, RDF 1.2).
R5 · High-confidence facts (FILTER over annotations)
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?p ?o ?c FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s ?p ?o {| :confidence ?c |} .
    FILTER(?c > 0.9)
} ORDER BY DESC(?c)
Expected result: 3 rows: carol/Globex 0.99; dave/Initech 0.97; bob/AcmeCorp 0.95. Verified live on URIBurner (Virtuoso, RDF 1.2).
R6 · Temporal validity intervals
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?org ?from ?to FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s :worksFor ?org {| :validFrom ?from ; :validTo ?to |}
}
Expected result: 1 row: carol worksFor Globex, validFrom 2024-06-01, validTo 2026-05-31. Verified live on URIBurner (Virtuoso, RDF 1.2).
R7 · Conflicting evidence for Alice
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?org ?src ?c FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s :worksFor ?org {| :source ?src ; :confidence ?c |} .
    FILTER(?s = :alice)
} ORDER BY DESC(?c)
Expected result: Two sources disagree: Globex ← LinkedInProfile (0.6) vs AcmeCorp ← HRSystem (0.98 via employmentRecord1). Verified live on URIBurner (Virtuoso, RDF 1.2): the annotation pattern returns the Globex row; the AcmeCorp row is reachable via the explicit-reifier lookup (R1).
R8 · Sources per fact (aggregation)
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?p ?o (COUNT(?r) AS ?n) FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << ?s ?p ?o >>
} GROUP BY ?s ?p ?o ORDER BY DESC(?n)
Expected result: alice/worksFor/AcmeCorp has 3 reifiers; the nested reifier-of-reifier term has 1. On Virtuoso the annotation reifiers (bob/carol/dave/alice-Globex) each count 1 as well. Verified live on URIBurner (Virtuoso, RDF 1.2).
R9 · Reifier of a reifier (reification of reification)
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?r ?src FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << :hrRecord rdf:reifies << :alice :worksFor :AcmeCorp >> >> ;
       :source ?src
}
Expected result: 1 row: auditRecord → AuditLog. Verified live on URIBurner (Virtuoso, RDF 1.2).
R10 · Triple term as a first-class value
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?tt FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    BIND( <<( :alice :worksFor :AcmeCorp )>> AS ?tt )
}
Expected result: 1 row: the triple term <<( :alice :worksFor :AcmeCorp )>>. Verified live on URIBurner (Virtuoso, RDF 1.2) — returns "type":"triple" bindings.
R11 · Triple terms occurring in the graph (isTRIPLE)
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?p ?o FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s ?p ?o .
    FILTER(isTRIPLE(?o))
} ORDER BY ?s ?p
Expected result: 12 triples whose object is a triple term — all rdf:reifies objects including nested terms. Verified live on URIBurner (Virtuoso, RDF 1.2).
R12 · Historical pattern — standard reification
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?r ?src FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r a rdf:Statement ;
       rdf:subject :alice ; rdf:predicate :worksFor ; rdf:object :AcmeCorp ;
       :source ?src
}
Expected result: 1 row: employmentStatement → HRSystem. Verified live on URIBurner (Virtuoso, RDF 1.2).
R13 · Historical pattern — n-ary relations
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?ev FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?ev a :EmploymentRelationship ;
        :employee :alice ; :employer :AcmeCorp ;
        :source ?src
}
Expected result: 1 row: employmentEvent1. Verified live on URIBurner (Virtuoso, RDF 1.2).
R14 · Historical pattern — singleton properties
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?p ?src FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?p :singletonPropertyOf :worksFor ;
       :source ?src .
    ?s ?p :AcmeCorp
}
Expected result: 1 row: worksFor_123 → HRSystem. Verified live on URIBurner (Virtuoso, RDF 1.2).
R15 · CONSTRUCT the reification graph
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

CONSTRUCT {
    ?r rdf:reifies << :alice :worksFor :AcmeCorp >> ;
       :source ?src
} FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << :alice :worksFor :AcmeCorp >> ;
       :source ?src
}
Expected result: Reification graph with the 3 named reifiers and their sources. Verified live on URIBurner (Virtuoso, RDF 1.2) — 6 triples. Result format: text/x-html-nice-turtle.
R16 · DESCRIBE the reifiers
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

DESCRIBE ?r FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?r rdf:reifies << :alice :worksFor :AcmeCorp >>
}
Expected result: Full descriptions of employmentRecord1, hrRecord, directoryRecord (rdf:reifies, :source, :verifiedOn, :confidence). Result format: text/x-html-nice-turtle. Verified live on URIBurner (Virtuoso, RDF 1.2).
R17 · The knows graph
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?a ?b FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE { ?a :knows ?b } ORDER BY ?a
Expected result: 3 rows: alice→bob, bob→carol, carol→dave. Verified live on URIBurner (Virtuoso, RDF 1.2).
R18 · Everything annotated (full annotation pattern)
PREFIX : <https://community.openlinksw.com/t/introducing-rdf-1-2-support-in-virtuoso/6283#>

SELECT ?s ?p ?o ?ap ?ao FROM <https://linkeddata.uriburner.com/DAV/demos/daas/rdf12-virtuoso-examples-deepseek_v4flash-1.ttl> WHERE {
    ?s ?p ?o {| ?ap ?ao |}
} ORDER BY ?s LIMIT 15
Expected result: Every asserted triple with all annotations (source, confidence, verifiedOn, validFrom, validTo, evidence, rdf:reifies) — 15 rows (of 18+). Verified live on URIBurner (Virtuoso, RDF 1.2).
About

About This Page

This collection was generated from the OpenLink community post Introducing RDF 1.2 Support in Virtuoso (fetched via the Discourse JSON API). The post was transformed into an RDF knowledge graph using kg-generator, and an executable RDF 1.2 dataset was authored to support every example in the post plus supplementary examples from the RDF 1.2, RDF-star, and SPARQL 1.2 specifications. The dataset and every example query were verified live on the URIBurner endpoint (Virtuoso, RDF 1.2), which itself functions as the verifier. The HTML infographic was rendered using rdf-infographic-skill powered by DeepSeek V4 Flash and running on Virtuoso.

Technology Stack: