- From: Martynas Jusevičius <martynas@atomgraph.com>
- Date: Wed, 5 Feb 2020 22:46:58 +0100
- To: Olaf Hartig <olaf.hartig@liu.se>
- Cc: "public-rdf-star@w3.org" <public-rdf-star@w3.org>
So why not follow the named graph syntax, just restrict it to a single triple? For example ex:connection <<city:_Seattle city:isConnectedTo city:_SanFranciso>> And then in query form something like STATEMENT instead of GRAPH (to align with rdf:Statement): SELECT ?cityName ?distance WHERE { STATEMENT ?connection <<city:_Seattle city:isConnectedTo ?city>> . ?connection connection:hasDistanceMiles ?distance. ?city rdfs:label ?cityName. FILTER (?city != city:_Seattle) } ORDER BY ?distance That way the statement is both reified and addressable. On Wed, Feb 5, 2020 at 5:43 PM Olaf Hartig <olaf.hartig@liu.se> wrote: > > On onsdag 5 februari 2020 kl. 11:17:15 CET Martynas Jusevičius wrote: > > Olaf, > > > > how is RDF* reification different from a named graph with a single > > triple? In other words, how is <<:a :b :c>> better than :g { :a :b :c > > } ? The latter being URI-addressable and already standard and the > > former not. > > Within the context of a particular application, you can certainly use (single- > triple) Named Graphs as a vehicle to capture statement-level metadata / > annotations for individual triples. You simply have to decide that this is > what you use Named Graphs for in your application. > > The caveat is that, by making this decision, there is no straightforward way > anymore for your application to also store and query graph-level metadata (in > addition to the statement-level metadata). In contrast, if you were using > Named RDF* Graphs, you would not have this limitation. > > Additionally, you cannot rely on the fact that others have made the same > decision for their data. In other words, if you retrieve the following snippet > of TriG from someone else's server (prefix declarations omitted), > > ex:connection { city:_Seattle city:isConnectedTo city:_SanFranciso . } > > ...you cannot be sure that the URI ex:connection is meant to the denote the > triple within the graph. Instead, you have to assume that it denotes the graph > rather than the triple. > > Best, > Olaf > > > > Reusing data and queries from Kurt's post (I've added city labels), how is > > > > <<city:_Seattle city:isConnectedTo city:_SanFranciso>> > > a class:_Connection; > > rdfs:label "Seattle To San Francisco"^^xsd:string; > > connection:hasDistanceMiles "807.6"^^xsd:float; > > connection:hasObverse > > <<city:_SanFranciso city:isConnectedTo city:_Seattle>> > > . > > > > city:_Seattle rdfs:label "Seattle" . > > city:_SanFranciso rdfs:label "San Francisco" . > > > > and > > > > select ?cityName ?distance where { > > <<city:_Seattle city:isConnectedTo ?city>> > > connection:hasDistanceMiles ?distance. > > ?city rdfs:label ?cityName. > > filter (?city != city:_Seattle) > > } order by ?distance > > > > better than > > > > _:connection { city:_Seattle city:isConnectedTo city:_SanFranciso . } > > _:obverse { city:_SanFranciso city:isConnectedTo city:_Seattle . } > > > > _:connection a class:_Connection; > > rdfs:label "Seattle To San Francisco"^^xsd:string; > > connection:hasDistanceMiles "807.6"^^xsd:float; > > connection:hasObverse _:obverse . > > > > city:_Seattle rdfs:label "Seattle" . > > city:_SanFranciso rdfs:label "San Francisco" . > > > > and > > > > select ?cityName ?distance { > > GRAPH ?conn { city:_Seattle city:isConnectedTo ?city } . > > ?conn connection:hasDistanceMiles ?distance. > > ?city rdfs:label ?cityName. > > filter (?city != city:_Seattle) > > } order by ?distance > > > > ? > > > > We get the same results, except we can also identify the named graph. > > > > On Wed, Feb 5, 2020 at 10:15 AM Olaf Hartig <olaf.hartig@liu.se> wrote: > > > On onsdag 5 februari 2020 kl. 18:36:36 CET Holger Knublauch wrote: > > > > On 5/02/2020 17:46, Olaf Hartig wrote: > > > > > [...] > > > > > In contrast. An advantage of the RDF*/SPARQL* approach is that > > > > > supporting > > > > > the approach in a system does not require the system to be rewritten > > > > > such > > > > > that it covers the RDF* data model internally. Instead, a small > > > > > wrapper > > > > > component on top of the unchanged system internals can do the trick. > > > > > Such > > > > > a wrapper may map RDF* data and SPARQL* queries into RDF and SPARQL by > > > > > using, for instance, the RDF reification vocabulary (or any other > > > > > explicit reification approach). Alternatively, the wrapper may > > > > > implement > > > > > a mapping to the URI reification approach that you mention. > > > > > > > > Ok, granted. You are enumerating those two options at the end of > > > > > > > > http://blog.liu.se/olafhartig/2019/01/10/position-statement-rdf-star-and > > > > -spa rql-star/ > > > > > > > > I guess the second option - to change the data model and storage - is > > > > what Martynas was referring to, and what I agree doesn't easily work for > > > > our scenarios either. > > > > > > I see that. That's why, in addition to the RDF* data model, I also try to > > > promote the option to go with a purely syntactic layer first. > > > > > > > OTOH, I agree that using Turtle* and SPARQL* as a syntactic layer is > > > > quite feasible and is the approach we are taking too. Needless to say > > > > these mapping approaches imply some compromises, e.g. if SPARQL* maps to > > > > rdf:Statements then queries need to take care not to accidentally also > > > > bump into the "physical" triples (rdf:object etc) that SPARQL* was > > > > supposed to hide. > > > > > > That's correct indeed. > > > > > > -Olaf > >
Received on Wednesday, 5 February 2020 21:47:15 UTC