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
…with metadata attached such as :source :HRSystem and :verifiedOn "2025-01-15"^^xsd:date.
Triple Terms
A triple represented directly as a value: << :alice :worksFor :AcmeCorp >>. Identifies the statement itself; referenced by one or more reifiers.
Reifiers
A resource that reifies a triple term via rdf:reifies and carries the annotations, e.g. :employmentRecord1 rdf:reifies << :alice :worksFor :AcmeCorp >>.
Annotation Syntax
Concise {| … |} shorthand that asserts a triple and automatically creates an underlying reifier with the annotations.
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.
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.
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.
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.
Pattern Head-to-Head
| Aspect | Standard Reification | N-Ary Relations | Singleton Properties | RDF 1.2 Reifiers |
|---|---|---|---|---|
| Original triple preserved | Yes — statement added alongside | No — replaced by event node | Yes — via one-off predicate | Yes — triple term + reifier |
| Verbosity | High — 4+ triples per statement | Medium — event entity | High — one predicate per occurrence | Low — one reifier per record |
| Stable identifier for observation | rdf:Statement IRI | Event entity IRI | Predicate IRI | Reifier IRI |
| Scalability | Poor — verbosity explodes | Fair — event-node explosion | Poor — predicate explosion | Good — shared triple terms |
| Query simplicity | Indirect — subject/predicate/object joins | Indirect — traverse event node | Direct — ?s :worksFor_123 ?o | Direct — rdf:reifies pattern |
| Standards-based | W3C RDF 1.0/1.1 | Ad-hoc modeling pattern | Ad-hoc (singleton-property pattern) | W3C RDF 1.2 |
| Annotation directness | Statement resource | Event entity | Property instance | Reifier of the triple term |
N-Ary Relations
Singleton Properties
?s :worksFor_123 ?oRDF 1.2 Reifiers
rdf:reifies patternTriple 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.
Explicit Reifier Form
Useful when the observation itself requires a stable identifier that can be referenced elsewhere in the graph.
Annotation Shorthand
Most users will prefer the concise RDF 1.2 annotation syntax — it automatically creates an underlying reifier while preserving readability.
Conceptually expands to the triple plus _:r rdf:reifies << :alice :worksFor :AcmeCorp >> ; :source :HRSystem ; :verifiedOn ….
Separation of Statement from Record
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.
Cleaner Data Models
The underlying relationship remains simple while metadata stays attached through reifiers — no artificial event nodes, no synthetic predicates.
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.
Improved Interoperability
Applications exchanging RDF 1.2 data rely on a common representation for statement annotations, provenance, confidence scores, temporal metadata, and evidence tracking.
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
|} .
}
}
:alice :worksFor :AcmeCorp, plus a reifier blank node with rdf:reifies, :source, :verifiedOn, and :confidence.
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 .
}
}
:employmentRecord1 rdf:reifies << … >> with its three annotations.
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.
Graph Settings
Physics
Predicates
Nodes & Literals
Resolver & Arrows
Frequently Asked Questions
What problem does RDF 1.2 solve?
What is a triple term?
<< 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?
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?
{| … |} 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?
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?
: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?
: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?
: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?
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?
How do I query reifiers of a statement in SPARQL 1.2?
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?
:source :HRSystem ; :verifiedOn "2025-01-15"^^xsd:date ; :confidence 0.98, with a common W3C representation portable across RDF systems.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.
Work with RDF 1.2 in Virtuoso
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.
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.
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 |} . } }.
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.
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.
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.
Verify with DESCRIBE and CONSTRUCT
Inspect reifiers with DESCRIBE ?r WHERE { ?r rdf:reifies << :alice :worksFor :AcmeCorp >> } and export reification graphs with CONSTRUCT.
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)
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
|} .
}
}
rdf:reifies, :source, :verifiedOn, :confidence.
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 .
}
}
:employmentRecord1 reifier with rdf:reifies and three annotations.
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 .
}
}
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
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
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
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
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)
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 |}
}
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)
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)
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
}
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 )
}
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
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
}
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
}
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
}
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
}
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 >>
}
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
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
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:
- AI Agent: DeepSeek Harness (DSH)
- Skills: kg-generator, rdf-infographic-skill
- Language Model: DeepSeek V4 Flash
- Server Platform: Virtuoso
- Knowledge Graph: URIBurner