Re: non-empty default graphs

On Thu, Jun 02, 2005 at 11:01:51AM -0500, Dan Connolly wrote:
> 
> On Thu, 2005-06-02 at 11:06 -0400, Eric Prud'hommeaux wrote:
> > On Thu, Jun 02, 2005 at 09:29:09AM -0500, Dan Connolly wrote:
> > > Your example has two conflicting descriptions of
> > > the dataset. Pick one, please.
> 
> > Perhaps i over-abbreviated. This particular query service has no
> > innate data (unlike, say, a database of the CIA World Fact Book).
> > There are also two rdf files, lies and truth, out there on the web.
> 
> OK, now I understand which one you meant, but
> I think I've lost the point. Do you mean to argue
> for or against some design?
> 
> 
> > > > Thus, if the defualt database *may* be contiminated, you need to fall
> > > > back to the more verbose form of provenance constraint:
> > > >   SELECT ?stuff
> > > >   FROM <truth.rdf>
> > > >   FROM NAMED <lies.rdf>
> > > >   WHERE { GRAPH <truth.rdf> { <TheMoon> <isMadeOf> ?stuff } }
> 
> Is that intended to be an argument against the rq23 1.367 design?

Yes.

> It seems like just a neutral fact, from where I sit. If
> you're querying some service and you don't know what dataset(s)
> it uses, life is hard. That's what SADDLE is/was all about. I hope
> we get this round of specs done soon enough to get to that
> part of the design space.

Thesis: NamedGraphs provides a syntactic shorthand for one sort of
query (single trust model) on one sort of server (one with a
pre-existing default graph that matches the trust model of your
query). For other queries, NamedGraphs must fall back to the same
expressions used in Source (12-Oct) queries.


Named Graphs caters to the scenario where your default graph is
"trusted" and you have a set of sources that you want to query, but
you don't want their data in the default graph. For example, this
Trusted query in Named Graphs (rq23) with the default graph having a
trusted status:

  SELECT ?payee ?amount ?memo
    FROM bob:bills
    FROM NAMED bob:work
   WHERE {
	?check f:payTo ?payee .
	?check f:amount ?amount .
      GRAPH bob:work {
	?check f:reference ?ref .
	?ref f:description ?memo } }

With the Source (12-Oct) proposal, you must explicitly express your
trusted graphs in order to query isolated graphs:

  SELECT ?payee ?amount ?memo
    LOAD bob:bills bob:work
   WHERE {
      SOURCE d:bobsBills {
	?check f:payTo ?payee .
	?check f:amount ?amount } .
      SOURCE bob:work {
	?check f:reference ?ref .
	?ref f:description ?memo } }


When you introduce more trusted documents, the assumption of trusting
the default graph has a more terse syntax:

NamedGraphs (assumes bob:work is not in the default graph):
  SELECT ?payee ?amount ?memo
    FROM bob:bills bob:bank bob:credit
    FROM NAMED bob:work
   WHERE { ?check f:payTo ?payee .
	   ?check f:amount ?amount .
      GRAPH bob:work { ?check f:reference ?ref .
		       ?ref f:description ?memo } }

Source (works regardles of what's in the default graph):
  SELECT ?payee ?amount ?memo
    LOAD bob:bills bob:bank bob:credit bob:work
   WHERE {
      SOURCE ?g1 { ?check f:payTo ?payee } .
      SOURCE ?g2 { ?check f:amount ?amount } .
      SOURCE bob:work { ?check f:reference ?ref .
			?ref f:description ?memo } .
      FILTER ?g1=bob:bills || g1=bob:bank || g1=bob:credit .
      FILTER ?g2=bob:bills || g2=bob:bank || g2=bob:credit }

There is a form of NamedGraphs that works regardles of what's in the
default graph, but it behaves exactly as the Source query:
  SELECT ?payee ?amount ?memo
    FROM NAMED bob:bills bob:bank bob:credit bob:work
   WHERE {
      GRAPH ?g1 { ?check f:payTo ?payee } .
      GRAPH ?g2 { ?check f:amount ?amount } .
      GRAPH bob:work { ?check f:reference ?ref .
		       ?ref f:description ?memo } .
      FILTER ?g1=bob:bills || g1=bob:bank || g1=bob:credit .
      FILTER ?g2=bob:bills || g2=bob:bank || g2=bob:credit }

The NameGraphs trust of the default graph is only good for one trust
domain. The default trust pattern above:

   WHERE { ?check f:payTo ?payee .
	   ?check f:amount ?amount .
      GRAPH bob:work { ?check f:reference ?ref .
		       ?ref f:description ?memo } }

has two trust domains, (bob:bills bob:bank bob:credit) and
(bob:work). This query sensibly used the default graph as the merging
place for the larger set:

    FROM bob:bills bob:bank bob:credit
    FROM NAMED bob:work

If we introduce more trust domains, especially those where a merge is
expected, the syntactic advantage of the default graph diminishes:

  SELECT ?payee ?amount ?memo ?memories
    FROM bob:bills bob:bank bob:credit
    FROM NAMED bob:work bob:work-schedule bob:drinking-buddies
   WHERE { ?check f:payTo ?payee .		# default graph
	   ?check f:amount ?amount .
      GRAPH ?g1a { ?check f:reference ?ref } .	# g1* graph
      GRAPH ?g1b { ?ref f:description ?memo } .
      GRAPH bob:drinking-buddies { ?ref b:memories ?memories } .
      FILTER ?g1a=bob:work || g1a=bob:work-schedule .
      FILTER ?g1b=bob:work || g1b=bob:work-schedule }


-- 
-eric

office: +81.466.49.1170 W3C, Keio Research Institute at SFC,
                        Shonan Fujisawa Campus, Keio University,
                        5322 Endo, Fujisawa, Kanagawa 252-8520
                        JAPAN
        +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA
cell:   +81.90.6533.3882

(eric@w3.org)
Feel free to forward this message to any list for any purpose other than
email address distribution.

Received on Friday, 3 June 2005 09:53:45 UTC