- From: Juan Sequeda <juanfederico@gmail.com>
- Date: Tue, 24 Apr 2012 22:47:40 +0200
- To: Richard Cyganiak <richard@cyganiak.de>
- Cc: W3C RDB2RDF <public-rdb2rdf-wg@w3.org>
- Message-ID: <CAMVTWDy_2WjfG265LXhBh1+W=ZcUUTgQVMLU4uvnUc=dTbmTRA@mail.gmail.com>
Before going into this, how about creating a skolem constant URI.
This is better than creating a blank node.
Juan Sequeda
+1-575-SEQ-UEDA
www.juansequeda.com
On Tue, Apr 24, 2012 at 10:15 PM, Richard Cyganiak <richard@cyganiak.de>wrote:
> So, Eric challenged me to present an example of a query over a
> direct-mapped PK-less table that I believe cannot be evaluated in standard
> SQL without materializing the entire table outside of the DB.
>
> First let me say that I've puzzled over this non-PK issue for more than a
> day, trying to come up with some scheme based on cursors or ROWNUM or local
> variables to make it work, and failed. Now, making a leap from “I couldn't
> do it in a day” to “It's impossible” is certainly not quite appropriate,
> but after that experience I felt justified to send an implementation
> experience report to the WG, stating my belief that the cost of
> implementing this scheme are not worth the benefits. Hence my proposal to
> let implementers choose whether they want to implement the lean or non-lean
> direct mapping.
>
> So here we go.
>
> IOU
> BORROWER | AMOUNT
> ---------+-------
> Alice | 10
> Bob | 5
> Charlie | 10
> Charlie | 10
>
> The equivalent non-lean direct mapping graph (minus rdf:type triples):
>
> _:1 <IOU#BORROWER> "Alice".
> _:1 <IOU#AMOUNT> 10.
> _:2 <IOU#BORROWER> "Bob".
> _:2 <IOU#AMOUNT> 5.
> _:3 <IOU#BORROWER> "Charlie".
> _:3 <IOU#AMOUNT> 10.
> _:4 <IOU#BORROWER> "Charlie".
> _:4 <IOU#AMOUNT> 10.
>
> Now here's a simple SPARQL query:
>
> SELECT * {
> {
> ?x <IOU#BORROWER> "Charlie".
> ?x ?property ?value.
> } UNION {
> ?x <IOU#AMOUNT> 10.
> }
> }
>
> The solution should be:
>
> ?x | ?property | ?value
> ----+----------------+----------
> _:3 | <IOU#BORROWER> | "Charlie"
> _:4 | <IOU#BORROWER> | "Charlie"
> _:3 | <IOU#AMOUNT> | 10
> _:4 | <IOU#AMOUNT> | 10
> _:1 | |
> _:3 | |
> _:4 | |
>
> Can you outline an algorithm that produces this result without
> materializing the table? (Ordering, the difference between
> literals/IRIs/bNodes, and the specific labels for the bNodes don't matter.)
>
> Bonus points if the algorithm is expressed as an R2RML mapping. We can
> assume that we already have an algorithm for evaluating any SPARQL query
> over an R2RML mapping.
>
> Here's my non-standard solution using ROWID, which only works on Oracle:
>
> SELECT ROWID x, '<IOU#BORROWER>' property, BORROWER value
> FROM IOU
> WHERE BORROWER='Charlie'
> UNION
> SELECT ROWID x, '<IOU#AMOUNT>' property, AMOUNT value
> FROM IOU
> WHERE BORROWER='Charlie'
> UNION
> SELECT ROWID x, NULL, NULL
> FROM IOU
> WHERE AMOUNT=10
>
> Earning the R2RML bonus points:
>
> <#map> a rr:TriplesMap;
> rr:logicalTable [
> rr:sqlQuery "SELECT ROWID, BORROWER, AMOUNT FROM IOU";
> ];
> rr:subjectMap [
> rr:column "ROWID";
> rr:termType rr:BlankNode
> ];
> rr:predicateObjectMap [
> rr:predicate <IOU#BORROWER>;
> rr:objectMap [ rr:column "BORROWER" ];
> ];
> rr:predicateObjectMap [
> rr:predicate <IOU#AMOUNT>;
> rr:objectMap [ rr:column "AMOUNT" ];
> ].
>
> Now, how to do this without the ROWID vendor extension???
>
>
> ----
>
> For the record. With a lean direct mapping, the desired output graph would
> be:
>
> _:1 <IOU#BORROWER> "Alice".
> _:1 <IOU#AMOUNT> 10.
> _:2 <IOU#BORROWER> "Bob".
> _:2 <IOU#AMOUNT> 5.
> _:3 <IOU#BORROWER> "Charlie".
> _:3 <IOU#AMOUNT> 10.
>
> The query result would be:
>
> ?x | ?property | ?value
> ----+----------------+----------
> _:3 | <IOU#BORROWER> | "Charlie"
> _:3 | <IOU#AMOUNT> | 10
> _:1 | |
> _:3 | |
>
> The standard-compliant SQL query would be as above, but replace ROWID with
> something like (BORROWER || '@@@separator@@@' || AMOUNT), and add
> DISTINCT to each SELECT.
>
> The R2RML query would be the same as above with the following changes:
>
> rr:logicalTable [
> rr:tableName "IOU";
> ];
> rr:subjectMap [
> rr:template "{BORROWER}@@@separator@@@{AMOUNT}";
> rr:termType rr:BlankNode;
> ];
>
> So, implementing the lean direct mapping is not hard using just standard
> SQL.
>
> Best,
> Richard
>
Received on Tuesday, 24 April 2012 20:48:31 UTC