W3C home > Mailing lists > Public > public-rdf-dawg-comments@w3.org > July 2005

Re: Blank Nodes and SPARQL

From: Ron Alford <ronwalf@umd.edu>
Date: Fri, 01 Jul 2005 18:25:23 -0400
Message-ID: <42C5C2D3.2060503@umd.edu>
To: "Eric Prud'hommeaux" <eric@w3.org>
CC: Dan Connolly <connolly@w3.org>, public-rdf-dawg-comments@w3.org, Amy Alford <aloomis@glue.umd.edu>
Eric Prud'hommeaux wrote:
> To figure this out, I'd like to see a use case where you extend SPARQL
> to use session-persistent bNodes. Then I'd like to see if a client
> that doesn't know of this extension will get different answers than it
> expects.

How about this use case:

Ron, a horrible kitchen danger, is looking up recipes for buttermilk
cornbread.  Ron needs to retreive the order to add the ingredients
(represented as a list) so he doesn't add the baking soda straight into
the buttermilk.

Now for the split.

Assume bnodes are no longer being used as sugar for variables.  Suppose
they explicitly match nothing when used over the normal sparql protocol.
Or it could be unspecified.  At any rate, it means that straight sparql
protocol clients would not use bnodes.

Assume we have session support where labeled bnodes in the query can
match bnodes in the store.  Either that, or we're using a local store
with the same bnode matching ability (this might match up with
http://www.w3.org/TR/rdf-dawg-uc/#r3.5  ).

In this case, Ron requests a session from the server.
He queries the server for the recipe data, including the head of the
list, using a hand written query [1] with some values plugged in

If Ron doesn't get back the whole list of instructions, he takes his
generic list query template [2] and fills in the last part of the list
he received.  Rinse and repeat until all the instructions are downloaded.


Option 2) Either we don't have session support in our client, or bnodes
are still sugar for variables.

Ron queries the server for the basic recipe data.
Ron notes that there is a bnode response for :steps, and uses the
previous query as a context for the list query, binding what things he
can to make the query smaller [3].

Now repeat, using the previous query as the context for the next one
[4].  Before, binding parts of the query significantly reduced the size.
 Now we're starting to build up baggage.


Ok, we got a handle on this.  So move it to the general case.  We've got
complicated, hetrogenous bnode structures used for OWL complex classes,
Rule languages, and funny looking FOAF files.  Are we starting to feel
the pain yet?

So to implement this in an automated way on the client side, we have to
either:
a) Preclude hand written queries.  Generate queries using an api,
keeping track of the contexts which generate bnode responses.
b) Include query parsing and analysis on the client side, so that
queries can be rewritten to include the contexts without stomping on
anything.
c) <Insert your idea here>



This seems like quite a burden to implement on each client.



[0] Basic data:
PREFIX : <http://example.com/food#>.
PREFIX dc: <http://purl.org/dc/elements/1.1/>.

:CornBread a :Recipe;
  dc:description "A simple corn bread recipe";
  :steps ( :AddMix, :Shake, :Bake, :FingerCheckForDoneness, :VisitER,
           :ReturnHome, :EatStaleHalfCookedCornBread ).

[1]
PREFIX food <http://example.com/food#>
PREFIX dc <http://purl.org/dc/elements/1.1/>
SELECT ?recipe ?description ?step
WHERE {
  ?recipe a food:Recipe;
     dc:description ?description;
     food:steps ?steps.
}


[2]
PREFIX rdf <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?item1 ?item2 ?item3 ?item4 ?tail
WHERE {
  %HEAD rdf:first ?item1;
        rdf:next ?list2 .
  OPTIONAL {
    ?list2 rdf:first ?item2;
           rdf:next ?list3 .
    OPTIONAL {
      ?list3 rdf:first ?item3;
             rdf:next ?list4 .
      OPTIONAL {
          ?list4 rdf:first ?item4;
                 rdf:next ?tail
      }
    }
  }
}


[3]
PREFIX food <http://example.com/food#>
PREFIX dc <http://purl.org/dc/elements/1.1/>
SELECT ?item1 ?item2 ?item3 ?item4 ?tail
WHERE {
  :CornBread food:steps ?steps.
  ?steps rdf:first ?item1;
         rdf:next ?list2 .
  OPTIONAL {
    ?list2 rdf:first ?item2;
           rdf:next ?list3 .
    OPTIONAL {
      ?list3 rdf:first ?item3;
             rdf:next ?list4 .
      OPTIONAL {
          ?list4 rdf:first ?item4;
                 rdf:next ?tail
      }
    }
  }

}

[3]
PREFIX food <http://example.com/food#>
PREFIX dc <http://purl.org/dc/elements/1.1/>
SELECT ?item1 ?item2 ?item3 ?item4 ?tail
WHERE {
  :CornBread food:steps ?steps.
  ?steps rdf:next ?steps2.
  ?steps2 rdf:next ?steps3.
  ?steps3 rdf:next ?steps4.
  ?steps4 rdf:next ?head.

  ?head rdf:first ?item1;
         rdf:next ?list2 .
  OPTIONAL {
    ?list2 rdf:first ?item2;
           rdf:next ?list3 .
    OPTIONAL {
      ?list3 rdf:first ?item3;
             rdf:next ?list4 .
      OPTIONAL {
          ?list4 rdf:first ?item4;
                 rdf:next ?tail
      }
    }
  }

}

Received on Friday, 1 July 2005 22:29:08 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 8 January 2008 14:14:49 GMT