- From: Sandro Hawke <sandro@w3.org>
- Date: Thu, 26 Jan 2012 22:45:56 -0500
- To: Andy Seaborne <andy.seaborne@epimorphics.com>
- Cc: public-rdf-wg@w3.org
On Thu, 2012-01-05 at 11:09 +0000, Andy Seaborne wrote: > On 04/01/12 19:23, David Wood wrote: > > Thanks, Sandro. That's very helpful. > > > > It might be useful to consider augmenting TriG syntax to support your third solution (explicitly naming relations). I'd be quite happy with that. > > What would the data model be? I think: an RDF graph which can have other RDF graphs as values of its triples. All these graphs would be subgraphs of some greater graph, so they can share b-nodes. (This is what cwm has had implemented since 2001, I think.) > > We could also consider standardizing the existing TriG syntax to be a syntactic shorthand for TriG REST semantics; that is, a lack of explicitly declared relation infers log:semantics. > > I think we should not fix a semantics for undeclared relationships. > > Otherwise, it invalidates existing TriG documents which don't exactly > follow the TriG/ABC definition. > > Ditto N-Quads - in a quadstore/database dump or extract you don't > necessary know the semantics. Agreed. If we settle on a syntax that's compatible with TriG, I think we probable need the TriG subset to have the current TriG semantics -- roughly none. > - - - - - - - - - - > > I find the name TriG/REST confusing because, for me, identifying the > dereference action is modelling REST which is the other > > It's more like "TriG/WebCache" -- only one instance of the graph > containers state is possible. I don't follow your logic. My thinking in picking the name "TriG/REST" is that the implied relation is the relation that's kind of at the core of REST, the relationship between a thing and its 'state'. -- Sandro > Andy > > > > > Regards, > > Dave > > > > > > On Jan 4, 2012, at 1:45 PM, Sandro Hawke<sandro@w3.org> wrote: > > > >> While it's fresh in my mind, let me write down the view I came to during > >> today's telecon. (And, carry it a bit farther.) Guus, I don't know if > >> you still want to write up your understanding of it, or if this obviates > >> your action. > >> > >> > >> * Use Case 1: (presented by cygri at 21 Dec meeting) > >> > >> Several systems want to use the data gathered by one RDF crawler. They > >> don't need simultaneous access to older versions of the data. > >> > >> Solution A: use TriG or N-Quads with the fourth column (graph label) > >> being the URL the content was fetched from. > >> > >> <http://example.org> { ... triples recently fetched from there } > >> > >> * Use Case 2: (brought up in questions by sandro at 21 Dec meeting) > >> > >> Several systems want to use the data gathered by one RDF crawler. They > >> need simultaneous access to older versions of the data. > >> > >> Solution B: use TriG or N-Quads with the fourth column being some > >> identifier created at the time the retrieval was done. Then, some other > >> data connects that identifier with the URL the content was fetched from. > >> > >> <http://crawler.example.org/r8571> { ... triples fetched in retrieval 8671 } > >> { > >> <http://crawler.example.org/r8571> eg:source<http://example.org>; > >> eg:date "2011-01-04T00:03:11"^^xs:dateTime > >> } > >> > >> * Use Case 3: (suggested by sandro at 4 Jan meeting) > >> > >> A system wants to convey to another system in RDF that some person > >> agrees with or disagrees with certain RDF triples. > >> > >> Solution C: use TriG or N-Quads with the fourth column being an > >> identifier for an RDF Graph (g-snap), so that it can be referred to in > >> the default graph. > >> > >> { eg:sandro eg:endorses<g1> } > >> <g1> { ... the triples I'm endorsing ... } > >> > >> ==== > >> > >> So, here we have two different semantics for TriG clearly motivated and > >> expressed. The TriG document: > >> > >> g { s p o } > >> > >> is understood in Solution A to mean (in N3): > >> > >> g log:semantics { s p o }. # TriG "REST" semantics > >> > >> but in Solution C it means (in N3): > >> > >> g owl:sameAs { s p o }. # TriG "Equality" semantics > >> > >> ==== > >> > >> It looks like it's possible to solve all three uses cases with either > >> semantics, although it gets a bit tricky. > >> > >> With TriG/REST: > >> > >> UC1 -- as reported by Richard; the URL used by the crawler is > >> the fourth column URL > >> > >> UC2 -- as implemented in Sandro's semwalker code; the crawler > >> makes a new URL in its own web space, mirrors the content there, > >> and puts that URL in the fourth column > >> > >> UC3 -- rather than endorsing an RDF Graph, I endorse a Graph > >> Container on the condition that it never changes (or something > >> like that -- needs to be fleshed out more). > >> > >> { eg:sandro eg:endorses<g1>. > >> <g1> a rdf:StaticGraphContainer. > >> } > >> <g1> { ... the triples I'm endorsing ... } > >> > >> > >> With TriG/Equality: > >> > >> UC1 -- A layer of indirection is needed, as new URIs need to be > >> created for the different RDF Graphs. > >> > >> {<http://example.org> rdf:graphState<uuid:nnnnn> } > >> uuid:nnnnn { ... triples fetched from example.org } > >> > >> Maybe there's some clever way to do it without this, involving > >> URL mangling or something to eliminate the second lookup. > >> > >> I used uuid:nnnnn as a URI for the RDF Graph, but I could just > >> as easily have used a hash of the graph or graph serialization. > >> I *could* use an http URL, I think, but that's likely to lead to > >> confusion and breakage, especially when someone gets the bright > >> idea of changing what triples are served at that address. (I'm > >> sure it will have seemed like a good idea at the time.) > >> > >> UC2 -- Pretty straightforward, since we already have that layer of > >> indirection in UC1. We can't quite use the r8571 example as is, because graph > >> equality could smoosh the two retrieval operations together. So we > >> need something like this: > >> > >> <uuid:nnnnn> { ... triples fetched in operation 8671 } > >> { > >> [ a eg:Retrieval; > >> eg:gotGraph<uuid:nnnnn>; > >> eg:source<http://example.org>; > >> eg:date "2011-01-04T00:03:11"^^xs:dateTime; > >> ] > >> } > >> > >> UC3 -- easy: > >> > >> { eg:sandro eg:endorses<uuid:nnnnn>. } > >> <uuid:nnnnn> { ... the triples I'm endorsing ... } > >> > >> Here you can see why I want a blank node as the graph > >> label, rather than making up uuids. > >> > >> Between these two, I have a preference for TriG/REST over > >> TriG/Equality, I think. I think people are too likely to get the > >> semantics of TriG/Equality wrong in practice. Of course, spelling out > >> the semantics of TriG/REST will be a tricky given it has a some > >> contextual qualities, as we've discussed. > >> > >> MEANWHILE, we have a third solution, where we name the relation > >> explicitly. This is the one I prefer. > >> > >> UC1 > >> > >> <http://example.org> rdf:graphState { ... triples recently fetched from there } > >> > >> UC2 -- either of the styles given above, depending whether the > >> harvester wants to publish its copies on the web or not. > >> > >> UC3 > >> > >> eg:sandro eg:endorses<uuid:nnnnn>. > >> <uuid:nnnnn> owl:sameAs { ... the triples I'm endorsing ... } > >> > >> or, logically: > >> > >> eg:sandro eg:endorses { ... the triples I'm endorsing ... } > >> > >> (Then, I would probably get rid of the curly braces around the default > >> graph, so it becomes Turtle with Nesting.) > >> > >> Do those three solution designs make sense? Any strong preferences > >> among them? Are there more use cases that people think the group will > >> find compelling and which cannot be solved by all three of these > >> solutions? (I think the next use case I'd approach would be "Tracing > >> Inference Results", mostly because it motivates shared blank nodes. > >> But I'm out of time for today.) > >> > >> -- Sandro > >> > >> > >> > >> > >> > >> > >> > > > >
Received on Friday, 27 January 2012 03:46:11 UTC