- From: Olaf Hartig <olaf.hartig@liu.se>
- Date: Tue, 3 Sep 2019 16:36:39 +0000
- To: "public-rdf-star@w3.org" <public-rdf-star@w3.org>
- CC: William Waites <wwaites@inf.ed.ac.uk>
Hi William,
On tisdag 3 september 2019 kl. 10:37:28 CEST William Waites wrote:
> > I explicitly said "semantically equivalent" rather than just "equivalent."
> > Hence, what I meant is that the given RDF* triple should be interpreted to
> > have the same meaning as the the given set of five RDF triples (i.e., they
> > represents the same information).
> >
> > > > :Alice :asserts << :Bob foaf:age"23"^^xsd:integer >> .
>
> Does that imply a rule that says,
>
> { ?s ?p << ?ss ?pp ??oo >> } <=>
> { ?s ?p [ rdf:subject ?ss; rdf:predicate ?pp rdf:object ?oo ] }.
Kind of.
What I said in my earlier email is only half of the story.
Currently, I am considering the option of having two different "modes" in
which RDF*/SPARQL* may be used. I call these modes i) the "Property Graph
mode" (PG mode, for short) and ii) the "separate-assertions mode" (SA mode). I
have introduced the intuition behind these modes in the first email of this
thread; see:
https://lists.w3.org/Archives/Public/public-rdf-star/2019Aug/0001.html
For PG mode I have defined a direct mapping from RDF* to RDF and a
corresponding mapping from SPARQL* to SPARQL [1]. The idea of the RDF*-to-RDF
mapping is to recursively unnest the nested RDF* triples in an RDF* graph by
using the RDF reification vocabulary and by also adding explicitly the triples
that are contained in the nested triples. For instance, the nested RDF* triple
( (:s, :p, :o), :pp, :oo )
would be mapped to the following set of six triples (where _:b denotes a fresh
blank node):
( :s, :p, :o )
( _:b, rdf:type, rdf:Statement )
( _:b, rdf:subject, :s )
( _:b, rdf:predicate, :p )
( _:b, rdf:object, :o )
( _:b, :pp, :oo ) .
Note that the very first of these triples is an artifact that is specific to the
PG mode. Now, for this mapping I have shown that it is information preserving
[1]; that is, given any RDF graph resulting from this mapping, it is possible
to convert this graph back into the exact same RDF* graph to which the mapping
was applied (i.e., formally, there exists an inverse mapping that is
computable). Additionally, for the corresponding SPARQL*-to-SPARQL mapping
(which employs the same idea as the RDF*-to-RDF mapping), I have shown that it
is query-result preserving [1], which essentially means that evaluating a
SPARQL* query over an RDF* graph gives you the same query result as if you map
the SPARQL* query to a SPARQL query and the RDF* graph to an RDF graph, and
the evaluate the resulting SPARQL query over the resulting RDF graph.
Having said all that, my earlier responses to Kingsley and you assumed SA mode
(instead of PG mode). I have not published anything about SA mode yet, but I
think it is not difficult to see that for SA mode it is possible to define
similar direct mappings (RDF* to RDF and SPARQL* to SPARQL) and to show that
these mappings posses the same properties (information preservation and query
result preservation) as I have done in the context of PG mode. In particular,
the RDF*-to-RDF mapping for SA mode would be defined such that the
aforementioned RDF* triple
( (:s, :p, :o), :pp, :oo )
would be mapped to the following set of five triples (again, _:b denotes a
fresh blank node):
( _:b, rdf:type, rdf:Statement )
( _:b, rdf:subject, :s )
( _:b, rdf:predicate, :p )
( _:b, rdf:object, :o )
( _:b, :pp, :oo ) .
Notice that, in this case, the triple ( :s, :p, :o ) is *not* part of the
output of the mapping, which highlights the main conceptual difference between
the two modes.
Notice also that, in both cases, the mappings are defined from RDF* to RDF (and
SPARQL* to SPARQL) but not the other way around. While it would be possible to
define mappings for the other direction by employing the same idea of the
aforementioned mappings (essentially, recursively nesting all RDF
reifications), the resulting RDF-to-RDF* mappings would not be information
preserving. The issue can be illustrated with a simple example. Consider two
RDF graphs, G1 and G2, where G1 consists of the following five RDF triples:
( _:b1, rdf:type, rdf:Statement )
( _:b1, rdf:subject, :s )
( _:b1, rdf:predicate, :p )
( _:b1, rdf:object, :o )
( _:b1, :pp, :oo ) ,
and G2 also contains these triples, plus the following five:
( _:b2, rdf:type, rdf:Statement )
( _:b2, rdf:subject, :s )
( _:b2, rdf:predicate, :p )
( _:b2, rdf:object, :o )
( _:b2, :pp, :oo ) .
Now, the possible RDF-to-RDF* mapping (using SA mode) would map the first five
triples to the nested RDF* triple
( (:s, :p, :o), :pp, :oo ) ,
and the last five triples would also be mapped to the very same RDF* triple.
Hence, the RDF* graph (which, by definition, are sets of RDF* triples) that
would be obtained from G1 and the RDF* graph obtained from G2 are in fact the
same RDF* graph (which contains only the aforementioned RDF* triple). Then,
given this RDF* graph, it is impossible to figure out whether the input to the
mapping was G1 or G2.
Let me know whether this clarifies your question.
Thanks,
Olaf
[1] Olaf Hartig: Foundations of RDF* and SPARQL* - An Alternative Approach to
Statement-Level Metadata in RDF. In Proceedings of the 11th Alberto Mendelzon
International Workshop on Foundations of Data Management (AMW), 2017.
http://olafhartig.de/files/Hartig_AMW2017_RDFStar.pdf
Received on Tuesday, 3 September 2019 16:37:07 UTC