- From: Richard Cyganiak <richard@cyganiak.de>
- Date: Fri, 29 Jul 2011 15:07:28 +0100
- To: Juan Sequeda <juanfederico@gmail.com>
- Cc: public-rdb2rdf-wg@w3.org
Juan, I'd solve this like so: <#LinkMap_1_2> rr:logicalTable [ rr:tableName "enrolled" ]; rr:subjectMap [ rr:template "http://data.example.com/student/{s_id}" ]; rr:predicateObjectMap [ rr:predicateMap [ rr:predicate ex:isEnrolled ]; rr:objectMap [ rr:template "http://data.example.com/course/{c_id}" ]; ]. If you had made the subjectMap and objectMap reusable by giving them IRIs, then this could be written even shorter: <#LinkMap_1_2> rr:logicalTable [ rr:tableName "enrolled" ]; rr:subjectMap :studentMap; rr:predicateObjectMap [ rr:predicateMap [ rr:predicate ex:isEnrolled ]; rr:objectMap :courseMap; ]. There's ISSUE-54 about simplifying constant-valued term maps, which would simplify the predicate map further: http://www.w3.org/2001/sw/rdb2rdf/track/issues/54 <#LinkMap_1_2> rr:logicalTable [ rr:tableName "enrolled" ]; rr:subjectMap :studentMap; rr:predicateObjectMap [ rr:predicate ex:isEnrolled; rr:objectMap :courseMap; ]. A case can be made for further syntactic sugar in the case where a triples map only has a single predicate-object map: <#LinkMap_1_2> rr:logicalTable [ rr:tableName "enrolled" ]; rr:subjectMap :studentMap; rr:predicate ex:isEnrolled; rr:objectMap :courseMap. A case can be made for further syntactic sugar in the case where one doesn't need a logical table to be re-usable. In that case it would be simpler to just stick rr:tableName, rr:sqlQuery and so on directly onto the triples map: <#LinkMap_1_2> rr:tableName "enrolled"; rr:subjectMap :studentMap; rr:predicate ex:isEnrolled; rr:objectMap :courseMap. And that's really about as short as one can get. Best, Richard On 29 Jul 2011, at 14:10, Juan Sequeda wrote: > Richard, all > > > This may be a dumb question, but I haven't been able to figure out how to represent a many-to-many relationship in r2rml. For example: > > Student(s_id, name) > Course(c_id, title) > Enrolled(s_id, c_id) > > Where Enrolled is the many-to-many relationship. > > These are the TripleMaps for the Student and Course table: > > <#TriplesMap1> > rr:logicalTable [ rr:tableName "student"; ] > rr:subjectMap [ > rr:template "http://data.example.com/student/{s_id}"; > rr:class ex:Student; > ]; > rr:predicateObjectMap [ > rr:predicateMap [ rr:predicate ex:name; ]; > rr:objectMap [ rr:column "name" ]; > ]. > > <#TriplesMap2> > rr:logicalTable [ rr:tableName "course"; ] > rr:subjectMap [ > rr:template "http://data.example.com/course/{c_id}"; > rr:class ex:Course; > ]; > rr:predicateObjectMap [ > rr:predicateMap [ rr:predicate ex:title; ]; > rr:objectMap [ rr:column "title" ]; > ]. > > I assume that I should add a predicateObjectMap to TriplesMap1 (student) which is going to connect to TriplesMap2 (course), but the joinCondition is on the enrolled table. > > <#TriplesMap1> > rr:predicateObjectMap [ > rr:predicateMap [ rr:predicate ex:isEnrolled; ]; > rr:objectMap [ > rr:parentTriplesMap <#TriplesMap2>; > rr:joinCondition [ > rr:child "?????"; > rr:parent "???"; > ]; > ]. > > How is this suppose to be done? And could you add an example in the specs. > > Thanks! > > Juan Sequeda > +1-575-SEQ-UEDA > www.juansequeda.com
Received on Friday, 29 July 2011 14:08:08 UTC