Skip to content
Permalink
Browse files
Documentation for RDF*
  • Loading branch information
afs committed May 19, 2020
1 parent cf94d57 commit d57a3e9734fa14b973fddfd5fafd0151a1767c1e
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 2 deletions.
@@ -2,6 +2,8 @@
/resources
target

.vscode

# IntelliJ generated
*.iml
.idea
@@ -72,17 +72,17 @@
<li><a href="/documentation/javadoc.html">Javadoc</a></li>
<li><a href="/documentation/rdf/index.html">RDF API</a></li>
<li><a href="/documentation/io/">RDF I/O</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki</a></li>
<li><a href="/documentation/query/index.html">ARQ (SPARQL)</a></li>
<li><a href="/documentation/rdfconnection/">RDF Connection - SPARQL API</a></li>
<li><a href="/documentation/tdb/index.html">TDB</a></li>
<li><a href="/documentation/tdb2/index.html">TDB2</a></li>
<li><a href="/documentation/query/text-query.html">Text Search</a></li>
<li><a href="/documentation/shacl/index.html">SHACL</a></li>
<li><a href="/documentation/geosparql/index.html">GeoSPARQL</a></li>
<li><a href="/documentation/rdfstar/index.html">RDF*</a></li>
<li><a href="/documentation/tools/index.html">Command-line tools</a></li>
<li><a href="/documentation/hadoop/index.html">Elephas - tools for RDF on Hadoop</a></li>
<li><a href="/documentation/jdbc/index.html">SPARQL over JDBC</a></li>
<li><a href="/documentation/fuseki2/index.html">Fuseki</a></li>
<li><a href="/documentation/permissions/index.html">Permissions</a></li>
<li><a href="/documentation/assembler/index.html">Assembler</a></li>
<li><a href="/documentation/ontology/">Ontology API</a></li>
@@ -0,0 +1,118 @@
---
title: Support of RDF*
slug: index
---
[RDF\*](https://arxiv.org/abs/1406.3399) is an extension to RDF that provides
a way for one triple to refer to another triple. Another resource about RDF\* is
[Olaf Hartig's blog entry](https://blog.liu.se/olafhartig/2019/01/10/position-statement-rdf-star-and-sparql-star/).

Example:

```turtle
<< :john foaf:name "John Smith" >> dct:source <http://example/directory> .
```

The part `<< :john foaf:name "John Smith" >>` is a triple term and refers to the triple with subject `:john`, property `foaf:name` and object `"John Smith"`.

Triple terms can be in the subject or object position.

Jena provides support for RDF\* and the related SPARQL\*.

Support for RDF* is experimentation in Jena 3.15.0 (released May 2020):

* Turtle, N-Triples, TriG and N-Quads extended for Triple Terms syntax. There is no output in RDF/XML.
* SPARQL extended with Triple Term syntax for graph matching (in code, use `Syntax.syntaxARQ`).
* SPARQL Result formats for JSON and XML extended to support Triple Terms in results.
* Support in memory-based storage (graphs and datasets).
* Support in the Model API.

All this is active by default in Fuseki.

This support is experimental and subject to change. The aim is to follow the definition of RDF* as well as emerging _de facto_ consensus in other implementations.

Later releases will extend support to persistent storage in [TDB1](/documentation/tdb) and [TDB2](/documentation/tdb2/).

## RDF\*

RDF\* syntax for triple terms is added to the parsers for Turtle, N-Triples, TriG and N-Quads.

Datasets may have graphs that have triple terms that refer to triples anywhere, not just in the same graph.

## SPARQL\*

Matches for triple terms:

```sparql
SELECT ?name { <<:john foaf:name ?name >> dct:source <http://example/directory> }
```

Insert triples terms into the default graph to record the graph source.

```sparql
INSERT { <<?s ?p ?o>> dct:source <http://example/directory> }
WHERE {
GRAPH <http://example/directory> {
?s ?p ?o
}
}
```

### SPARQL Functions related to triple terms

These functions cause an expression error if passed the wrong type of arguments. `afn:`
is a prefix for `<http://jena.apache.org/ARQ/function#>`.

| Function | Description |
| -------- | ----------- |
| `afn:subject(?t)` | Return the subject of the triple term |
| `afn:predicate(?t)` | Return the predicate (property) of the triple term |
| `afn:object(?t)` | Return the object of the triple term |
| `afn:triple(?s, ?p, ?o)` | Create a triple term from s/p/o |
| `afn:isTriple(?t)` | Return true if the argument value is a triple term |

### SPARQL results

The syntaxes for SPARQL results from a SELECT query, `application/sparql-results+json`,
`application/sparql-results+xml` are extended to include triple terms:

The triple term `<< _:b0 <http://example/p> 123 >>` is encoded, in
`application/sparql-results+json` as:

```json
{
"type": "triple" ,
"value": {
"subject": { "type": "bnode" , "value": "b0" } ,
"property": { "type": "uri" , "value": "http://example/p" } ,
"object": { "type": "literal" , "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "value": "123" }
}
```
and similarly in `application/sparql-results+xml`:
```xml
<triple>
<subject>
<bnode>b0</bnode>
</subject>
<property>
<uri>http://example/p</uri>
</property>
<object>
<literal datatype="http://www.w3.org/2001/XMLSchema#integer">123</literal>
</object>
</triple>
```
## Model API
RDF* triple terms are treated as `Resource` to preserve the typed Model API.
They occur in the subject and object positions.
A `Resource` contains a `Statement` object if the underlying RDF term is a RDF* triple term.
New methods include:
* `Statement Resource.getStatement()`
* `Resource Model.createResource(Statement)`
* `Resource ResourceFactory.createStatement`

0 comments on commit d57a3e9

Please sign in to comment.