SlideShare ist ein Scribd-Unternehmen logo
1 von 226
Downloaden Sie, um offline zu lesen
NET   2


 Transforming between RDF and
      XML with XSPARQL
           Net2 Tutorial
            Nuno Lopes
           December, 2010
Integration of Heterogeneous Sources




                           1 / 51
Integration of Heterogeneous Sources



                                       SPARQL




                           1 / 51
Integration of Heterogeneous Sources



                                       SPARQL




                           1 / 51
Integration of Heterogeneous Sources

      XSLT/XQuery

                                       SPARQL




                           1 / 51
Integration of Heterogeneous Sources

      XSLT/XQuery
                           Lowering
                                                         SPARQL




                             Lifting

   Transformations between XML and RDF are not easy, mainly
   due to the heterogeneity of RDF/XML serialisations




                               1 / 51
Integration of Heterogeneous Sources

      XSLT/XQuery

                                                         SPARQL




   Transformations between XML and RDF are not easy, mainly
   due to the heterogeneity of RDF/XML serialisations
   Objective: language capable of integrating heterogeneous
   sources for the Semantic Web


                               1 / 51
Why are such transformations needed? (I)

   Standards in Health Care and Life Sciences




                                  2 / 51
Why are such transformations needed? (I)

   Standards in Health Care and Life Sciences




                                  2 / 51
Why are such transformations needed? (I)

   Standards in Health Care and Life Sciences




   Possible solution for the heterogeneous message formats
       Store your data in RDF
       Convert it to the required XML format when necessary


                                  2 / 51
Why are such transformations needed? (II)

   Creating (X)HTML from an RDF backend (under development):
   http://musicpath.org/




                               3 / 51
Why are such transformations needed? (II)

   Creating (X)HTML from an RDF backend (under development):
   http://musicpath.org/




                               3 / 51
Why are such transformations needed? (II)

   Creating (X)HTML from an RDF backend (under development):
   http://musicpath.org/




                               3 / 51
Toy example for the tutorial




                knows                   knows




                        knows




                               4 / 51
Toy example for the tutorial




                knows                   knows




                        knows




                               4 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .                      <rdf:RDF xmlns:foaf="...foaf/0.1/">
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>
                                                        <foaf:knows>
      _:b1 rdf:type foaf:Person;                          <foaf:Person foaf:name="Bob"/>
           foaf:knows _:b2.                             </foaf:knows>
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>                <rdf:Description rdf:nodeID="x">
          <foaf:knows rdf:nodeID="b2"/>                  <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                             </rdf:Description>
        <rdf:Description rdf:nodeID="b2">              <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
              rdf:resource=".../Person"/>              </rdf:Description>
          <foaf:name>Bob</foaf:name>                   <rdf:Description rdf:nodeID="y">
        </rdf:Description>                               <rdf:type rdf:resource=".../Person"/>
      </rdf:RDF>                                       </rdf:Description>
                                                     </rdf:RDF>




                                            5 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .                      <rdf:RDF xmlns:foaf="...foaf/0.1/">
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>
                         rtle                           <foaf:knows>
                      Tu
      _:b1 rdf:type foaf:Person;
           foaf:knows _:b2.
                                                          <foaf:Person foaf:name="Bob"/>
                                                        </foaf:knows>
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>                <rdf:Description rdf:nodeID="x">
          <foaf:knows rdf:nodeID="b2"/>                  <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                             </rdf:Description>
        <rdf:Description rdf:nodeID="b2">              <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
              rdf:resource=".../Person"/>              </rdf:Description>
          <foaf:name>Bob</foaf:name>                   <rdf:Description rdf:nodeID="y">
        </rdf:Description>                               <rdf:type rdf:resource=".../Person"/>
      </rdf:RDF>                                       </rdf:Description>
                                                     </rdf:RDF>




                                            5 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .                      <rdf:RDF xmlns:foaf="...foaf/0.1/">
                     Tri
                         plele
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>

                        urt sto e
                                                        <foaf:knows>
      _:b1 rdf:type foaf:Person;r
                      T
           foaf:knows _:b2.
                                                          <foaf:Person foaf:name="Bob"/>
                                                        </foaf:knows>
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>                <rdf:Description rdf:nodeID="x">
          <foaf:knows rdf:nodeID="b2"/>                  <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                             </rdf:Description>
        <rdf:Description rdf:nodeID="b2">              <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
              rdf:resource=".../Person"/>              </rdf:Description>
          <foaf:name>Bob</foaf:name>                   <rdf:Description rdf:nodeID="y">
        </rdf:Description>                               <rdf:type rdf:resource=".../Person"/>
      </rdf:RDF>                                       </rdf:Description>
                                                     </rdf:RDF>




                                            5 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .
                     Tri                                           RD
                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/">
                         plele
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>
                                                                       F/
                                                                            XM
                        urt sto e
                                                        <foaf:knows>
      _:b1 rdf:type foaf:Person;r
                      T
           foaf:knows _:b2.
                                                          <foaf:Person foaf:name="Bob"/>
                                                        </foaf:knows>            L
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>
                  RDF/XML
          <foaf:knows rdf:nodeID="b2"/>                                 X   ML
                                                       <rdf:Description rdf:nodeID="x">
                                                         <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                                           F/
                                                       </rdf:Description>
        <rdf:Description rdf:nodeID="b2">                        RD
                                                       <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
              rdf:resource=".../Person"/>              </rdf:Description>
          <foaf:name>Bob</foaf:name>                   <rdf:Description rdf:nodeID="y">
        </rdf:Description>                               <rdf:type rdf:resource=".../Person"/>
      </rdf:RDF>                                       </rdf:Description>
                                                     </rdf:RDF>




                                            5 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .
                     Tri                                           RD
                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/">
                         plele
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>
                                                                       F/
                                                                            XM
                        urt sto e
                                                        <foaf:knows>
      _:b1 rdf:type foaf:Person;r
                      T
           foaf:knows _:b2.
                                                          <foaf:Person foaf:name="Bob"/>
                                                        </foaf:knows>            L
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>
                  RDF/XML
          <foaf:knows rdf:nodeID="b2"/>                                 X   ML
                                                       <rdf:Description rdf:nodeID="x">
                                                         <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                                           F/
                                                       </rdf:Description>
        <rdf:Description rdf:nodeID="b2">                        RD
                                                       <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
            Any transformation needs to take
              rdf:resource=".../Person"/>
          <foaf:name>Bob</foaf:name>
                                                       </rdf:Description>
                                                       <rdf:Description rdf:nodeID="y">
        </rdf:Description>                               <rdf:type rdf:resource=".../Person"/>
            into account the different RDF/XML
      </rdf:RDF>                                       </rdf:Description>
                                                     </rdf:RDF>

            representations
                                            5 / 51
Why XQuery/XSLT is not enough:

      Different syntaxes and serialisations for the same RDF graph:

      @prefix alice: <alice/> .
                     Tri                                           RD
                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/">
                         plele
      @prefix foaf: <...foaf/0.1/> .                   <foaf:Person>
                                                                       F/
                                                                            XM
                        urt sto e
                                                        <foaf:knows>
      _:b1 rdf:type foaf:Person;r
                      T
           foaf:knows _:b2.
                                                          <foaf:Person foaf:name="Bob"/>
                                                        </foaf:knows>            L
      _:b2 rdf:type foaf:Person;                       </foaf:Person>
           foaf:name "Bob".                          </rdf:RDF>

                                                     <rdf:RDF xmlns:foaf="...foaf/0.1/"
      <rdf:RDF xmlns:foaf="...foaf/0.1/"                    xmlns:rdf="...rdf-syntax-ns#">
        xmlns:rdf="...rdf-syntax-ns#">                   <rdf:Description rdf:nodeID="x">
        <rdf:Description rdf:nodeID="b1">                  <foaf:knows rdf:nodeID="y"/>
          <rdf:type                                    </rdf:Description>
            rdf:resource=".../Person"/>
                  RDF/XML
          <foaf:knows rdf:nodeID="b2"/>                                 X   ML
                                                       <rdf:Description rdf:nodeID="x">
                                                         <rdf:type rdf:resource=".../Person"/>
        </rdf:Description>                                           F/
                                                       </rdf:Description>
        <rdf:Description rdf:nodeID="b2">                        RD
                                                       <rdf:Description rdf:nodeID="y">
          <rdf:type                                      <foaf:name>Bob</foaf:name>
              rdf:resource=".../Person"/>              </rdf:Description>
          <foaf:name>Bob</foaf:name>                   <rdf:Description rdf:nodeID="y">
            Or: end up with different transfor-
        </rdf:Description>
      </rdf:RDF>
                                                         <rdf:type rdf:resource=".../Person"/>
                                                       </rdf:Description>
                                                     </rdf:RDF>
            mations for the same RDF data
                                            5 / 51
Why SPARQL is not enough:


         Great for querying RDF! Easy to output Turtle or
         SPARQL XML results format ...

  prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
  prefix foaf: <http://xmlns.com/foaf/0.1/>

  construct { $X foaf:name $FN.}
  from <vCard.rdf>
  where { $X vc:FN $FN .}


                                   ... but




                                     6 / 51
Why SPARQL is not enough:


         Great for querying RDF! Easy to output Turtle or
         SPARQL XML results format ...

  prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
  prefix foaf: <http://xmlns.com/foaf/0.1/>

  construct { $X foaf:name $FN.}
  from <vCard.rdf>
  where { $X vc:FN $FN .}


                                   ... but

               How to produce arbitrary XML???


                                     6 / 51
XSPARQL

          Transformation language
          XML and RDF formats (based on
          XQuery and SPARQL)




                7 / 51
XSPARQL

          Transformation language
          XML and RDF formats (based on
          XQuery and SPARQL)
          Lifting and Lowering in a single
          language




                7 / 51
Outline

   Overview
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
XPath

        XPath is used to locate nodes in XML trees
        An XPath expression is a sequence of steps separated by /.
        Each step evaluates to a sequence of nodes.

   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>

                   Full spec at http://www.w3.org/TR/xpath20/.
              Tutorial at http://www.w3schools.com/xpath/default.asp.


                                       8 / 51
XPath

        XPath is used to locate nodes in XML trees
        An XPath expression is a sequence of steps separated by /.
        Each step evaluates to a sequence of nodes.

   relations.xml
   <relations>                                       relations node
       <person name="Alice">                         is the root ele-
         <knows>Bob</knows>
         <knows>Charles</knows>                      ment
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>

                   Full spec at http://www.w3.org/TR/xpath20/.
              Tutorial at http://www.w3schools.com/xpath/default.asp.


                                       8 / 51
XPath

        XPath is used to locate nodes in XML trees
        An XPath expression is a sequence of steps separated by /.
        Each step evaluates to a sequence of nodes.

   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>                      3 child elements
       </person>
       <person name="Bob">                           person with at-
         <knows>Charles</knows>                      tribute name
       </person>
       <person name="Charles"/>
   </relations>

                   Full spec at http://www.w3.org/TR/xpath20/.
              Tutorial at http://www.w3schools.com/xpath/default.asp.


                                       8 / 51
XPath

        XPath is used to locate nodes in XML trees
        An XPath expression is a sequence of steps separated by /.
        Each step evaluates to a sequence of nodes.

   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
                                                     Each person el-
       </person>                                     ement can have
       <person name="Charles"/>                      knows childs
   </relations>

                   Full spec at http://www.w3.org/TR/xpath20/.
              Tutorial at http://www.w3schools.com/xpath/default.asp.


                                       8 / 51
XPath Steps

   Step examples
    /relations      Selects the root element relations




   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                      9 / 51
XPath Steps

   Step examples
    /relations          Selects the root element relations
    /relations/person   Selects all person elements that are children of relations




   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                          9 / 51
XPath Steps

   Step examples
    /relations          Selects the root element relations
    /relations/person   Selects all person elements that are children of relations
    //knows             Selects all knows elements (in all the document)



   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                          9 / 51
XPath Predicates

   Predicate examples
    /relations/person[3]          Selects the third person child of relations




   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                      10 / 51
XPath Predicates

   Predicate examples
    /relations/person[3]              Selects the third person child of relations
    /relations/person[position()<3]   Selects the first two person children of relations




   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                          10 / 51
XPath Predicates

   Predicate examples
    /relations/person[3]              Selects the third person child of relations
    /relations/person[position()<3]   Selects the first two person children of relations
    //person[@name=’Alice’]           Selects all person elements which the value of the
                                      name attribute is ’Alice’

   relations.xml
   <relations>
       <person name="Alice">
         <knows>Bob</knows>
         <knows>Charles</knows>
       </person>
       <person name="Bob">
         <knows>Charles</knows>
       </person>
       <person name="Charles"/>
   </relations>




                                          10 / 51
XQuery


  XQuery
       Query language for XML (different requirements than XSLT)
            functional language
            typed language
       Superset of XPath
       Overview of the formal semantics (Normalisation rules, Static
       Typing and Dynamic Evaluation)

                  XQuery spec: http://www.w3.org/TR/xquery/.
   XQuery and XPath Formal Semantics: http://www.w3.org/TR/xquery-semantics/.




                                      11 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

           Prolog:   P   declare namespace prefix="namespace-URI "
           Body:     F   for var in XPath-expression
                     L   let var := XPath-expression
                     W   where XPath-expression
                     O   order by XPath-expression
           Head:     R   return XML + nested XQuery

   Query Example: Convert our relations data into RDF/XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
     $nameA in $person/@name
   where $nameA = "Alice"
   return <foaf:Person>{$nameA,
     for $nameB in $person/knows
     let $friend := <foaf:Person name="{$nameB}"/>
     order by $nameB
     return <foaf:knows>{$friend}</foaf:knows>
   }</foaf:Person>


                                    12 / 51
Schematic view on XQuery

            Prolog:   P   declare namespace prefix="namespace-URI "
            Body:     F   for var in XPath-expression
                      L   let var := XPath-expression
                      W   where XPath-expression
                      O   order by XPath-expression
            Head:     R   return XML + nested XQuery




   Query result
   <foaf:Person xmlns:foaf="http://xmlns.com/foaf/0.1/" name="Alice">
      <foaf:knows>
         <foaf:Person name="Bob"/>
      </foaf:knows>
      <foaf:knows>
         <foaf:Person name="Charles"/>
      </foaf:knows>
   </foaf:Person>




                                     12 / 51
Positional variable at

   Query example: add an id attribute to the relations data
   for $person at $pos in doc("relations.xml")//person
   return <person id="{$pos}">
             {$person/@*, $person/*}
          </person>

   $pos refers to the position of $person in the for expression




                                     13 / 51
Positional variable at

   Query example: add an id attribute to the relations data
   for $person at $pos in doc("relations.xml")//person
   return <person id="{$pos}">
             {$person/@*, $person/*}
          </person>

   $pos refers to the position of $person in the for expression
   Query result
   <person id="1" name="Alice">
      <knows>Bob</knows>
      <knows>Charles</knows>
   </person>
   <person id="2" name="Bob">
      <knows>Charles</knows>
   </person>
   <person id="3" name="Charles"/>




                                     13 / 51
XQuery Formal semantics

   Normalisation rules
   Normalisation rules are rewriting rules that translate XQuery into a
   simplified version (XQuery Core).




                                   14 / 51
XQuery Formal semantics

   Normalisation rules
   Normalisation rules are rewriting rules that translate XQuery into a
   simplified version (XQuery Core).

   Rule application
     1   Static Analysis: Apply normalisation rules and static type
         analysis
     2   Dynamic Evaluation Rules: evaluate expressions




                                    14 / 51
XQuery Formal semantics

   Normalisation rules
   Normalisation rules are rewriting rules that translate XQuery into a
   simplified version (XQuery Core).

   Rule application
     1   Static Analysis: Apply normalisation rules and static type
         analysis
     2   Dynamic Evaluation Rules: evaluate expressions

   Environments
         statEnv contains information needed for performing static
                 type analysis. E.g. varType, funcType, . . .




                                    14 / 51
XQuery Formal semantics

   Normalisation rules
   Normalisation rules are rewriting rules that translate XQuery into a
   simplified version (XQuery Core).

   Rule application
     1   Static Analysis: Apply normalisation rules and static type
         analysis
     2   Dynamic Evaluation Rules: evaluate expressions

   Environments
         statEnv contains information needed for performing static
                 type analysis. E.g. varType, funcType, . . .
         dynEnv contains information needed for the evaluation of
                expressions. E.g. varValue, . . .

                                    14 / 51
Semantics - Normalisation rules example



   for Example
   for $i in (1, 2),
       $j in (3, 4)
   return
     <pair>{ ($i,$j) }</pair>




                                15 / 51
Semantics - Normalisation rules example



   for Example
   for $i in (1, 2),
       $j in (3, 4)
   return
     <pair>{ ($i,$j) }</pair>


   for Normalised example
   for $i in (1, 2) return
     for $j in (3, 4) return
         <pair>{ ($i,$j) }</pair>




                                    15 / 51
Semantics - Normalisation rules example



   For Normalisation
                                                        
                       for $VarName 1 in Expr 1 , · · · ,
                         $VarName n in Expr n           
                       ReturnClause                         Expr
                                    ==
               for $VarName 1 in [Expr 1]Expr return
               ···
               for $VarName n in [Expr n]Expr [ReturnClause]Expr
                                                           ]




                                      16 / 51
Semantics - Static typing example



    For Static Type Analysis
                         statEnv Expr 1 : Type 1
           statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2
                       for $Variable in Expr 1
            statEnv
                       return Expr 2 : Type 2 · quantifier(Type 1 )




                                  17 / 51
Semantics - Static typing example

                                                  : means Expr 1 is
                                                  of type Type 1

    For Static Type Analysis
                         statEnv Expr 1 : Type 1
           statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2
                       for $Variable in Expr 1
            statEnv
                       return Expr 2 : Type 2 · quantifier(Type 1 )




                                  17 / 51
Semantics - Static typing example

       + means extend                               : means Expr 1 is
       the environment                              of type Type 1

    For Static Type Analysis
                         statEnv Expr 1 : Type 1
           statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2
                         for $Variable in Expr 1
            statEnv
                         return Expr 2 : Type 2 · quantifier(Type 1 )




                                    17 / 51
Semantics - Static typing example

       + means extend                               : means Expr 1 is
       the environment                              of type Type 1

    For Static Type Analysis
                         statEnv Expr 1 : Type 1
           statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2
                         for $Variable in Expr 1
            statEnv
                         return Expr 2 : Type 2 · quantifier(Type 1 )


                                          quantifier estimates the
                                          number of solutions: *, +
                                          or ?



                                    17 / 51
Semantics - Dynamic evaluation rules


   Simple for example
   for $i in (1, 2) return $i+1




                                  18 / 51
Semantics - Dynamic evaluation rules
                                            For each result in
                                            the expression
   Simple for example
   for $i in (1, 2) return $i+1




                                  18 / 51
Semantics - Dynamic evaluation rules
                                            For each result in
                                            the expression
   Simple for example                       Variable $i is as-
   for $i in (1, 2) return $i+1
                                            signed the corre-
                                            sponding value




                                  18 / 51
Semantics - Dynamic evaluation rules
                                            For each result in
                                            the expression
   Simple for example                       Variable $i is as-
   for $i in (1, 2) return $i+1
                                            signed the corre-
                                            sponding value
                                            Return expresion
                                            is evaluated




                                  18 / 51
Semantics - Dynamic evaluation rules


   Simple for example
   for $i in (1, 2) return $i+1



   For Dynamic Evaluation (Simplified)

                   dynEnv Expr 1 ⇒ Item1 , . . . , Itemn
          dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1
                                  ···
          dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n
                           for $Variable in Expr 1
               dynEnv
                           return Expr 2 ⇒ Value 1 , · · · , Value n



                                     18 / 51
Semantics - Dynamic evaluation rules


   Simple for example
   for $i in (1, 2) return $i+1                ⇒ means Expr 1 eval-
                                               uates to the sequence
                                               Item1 , . . . , Itemn
   For Dynamic Evaluation (Simplified)

                   dynEnv Expr 1 ⇒ Item1 , . . . , Itemn
          dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1
                                  ···
          dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n
                           for $Variable in Expr 1
               dynEnv
                           return Expr 2 ⇒ Value 1 , · · · , Value n



                                     18 / 51
Semantics - Dynamic evaluation rules


   Simple for example
  For each Itemi2)add Variable
   for $i in (1, , return $i+1               ⇒ means Expr 1 eval-
  ⇒ Itemi to dynEnv and                      uates to the sequence
  evaluate Expr 2                            Item1 , . . . , Itemn
   For Dynamic Evaluation (Simplified)

                   dynEnv Expr 1 ⇒ Item1 , . . . , Itemn
          dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1
                                  ···
          dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n
                         for $Variable in Expr 1
              dynEnv
                         return Expr 2 ⇒ Value 1 , · · · , Value n



                                   18 / 51
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
SPARQL (in 3 slides)

   SPARQL
      Query language for RDF




             SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/.
                               SPARQL 1.1 Tutorial:
        http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf.



                                     19 / 51
SPARQL (in 3 slides)

   SPARQL
      Query language for RDF
      RDF represents data as triples: Subject, Predicate, Object.
      An RDF Graph is a set of triples.




             SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/.
                               SPARQL 1.1 Tutorial:
        http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf.



                                     19 / 51
SPARQL (in 3 slides)

   SPARQL
      Query language for RDF
      RDF represents data as triples: Subject, Predicate, Object.
      An RDF Graph is a set of triples.
      SPARQL queries RDF data by pattern matching: given a set
      of triple patterns, finds the corresponding triples in the input
      graph




             SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/.
                               SPARQL 1.1 Tutorial:
        http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf.



                                     19 / 51
SPARQL (in 3 slides)

   SPARQL
      Query language for RDF
      RDF represents data as triples: Subject, Predicate, Object.
      An RDF Graph is a set of triples.
      SPARQL queries RDF data by pattern matching: given a set
      of triple patterns, finds the corresponding triples in the input
      graph
      Actually, matched against the scoping graph: a graph
      equivalent to the input graph but does not share any blank
      nodes with it or the query.

             SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/.
                               SPARQL 1.1 Tutorial:
        http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf.



                                     19 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   construct { $X foaf:name $FN.}
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
Schematic view on SPARQL

                 Prolog:   P   prefix prefix: <namespace-URI >
                 Head:     C   construct { template }
                               select variableList
                 Body:     D   from / from named <dataset-URI >
                           W   where { pattern }
                           M   order by expression
                               limit integer > 0
                               offset integer > 0

  Query Example: Convert between different RDF vocabularies
   prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#>
   prefix foaf: <http://xmlns.com/foaf/0.1/>

   select $X $FN
   from <vCard.ttl>
   where { $X vc:FN $FN .}
   order by $FN
   limit 1 offset 1



                                     20 / 51
SPARQL select solutions

      Solutions for SPARQL select queries are substitutions for
      the variables present in the head (variableList)




                                21 / 51
SPARQL select solutions

       Solutions for SPARQL select queries are substitutions for
       the variables present in the head (variableList)
       Can be represented as XML

  SPARQL XML Results Format (previous query)
  <sparql xmlns="http://www.w3.org/2005/sparql-results#">
    <head>
      <variable name="X"/>
      <variable name="FN"/>
    </head>
    <results>
      <result>
        <binding name="X"><bnode>b0</bnode></binding>
        <binding name="FN"><literal>Nuno Lopes</literal></binding>
      </result>
    </results>
  </sparql>



                                    21 / 51
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
XSPARQL




          Transformation language
          Consume and generate XML and RDF




               22 / 51
XSPARQL




          Transformation language
          Consume and generate XML and RDF
          Syntactic extension of XQuery




                22 / 51
XSPARQL




          Transformation language
          Consume and generate XML and RDF
          Syntactic extension of XQuery
          With a formally defined semantics
          (based on the XQuery semantics)




                22 / 51
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
XSPARQL: Combining XQuery with SPARQL


             Prolog:   P    declare namespace prefix="namespace-URI "
                            or prefix prefix: <namespace-URI >
             Body:     F    for var in XPath-expression
                       L    let var := XPath-expression
                       W    where XPath-expression
                       O    order by expression                    or
                       F’   for varlist
                       D    from / from named <dataset-URI >
                       W    where {pattern }
                       M    order by expression
                            limit integer > 0
                            offset integer > 0
             Head:     C    construct
                              { template (with nested XSPARQL) }   or
                       R    return XML + nested XSPARQL




                              23 / 51
XSPARQL: Combining XQuery with SPARQL

 prefix         Prolog:   P    declare namespace prefix="namespace-URI "
 declarations                  or prefix prefix: <namespace-URI >
                Body:     F    for var in XPath-expression
                          L    let var := XPath-expression
                          W    where XPath-expression
                          O    order by expression                    or
                          F’   for varlist
                          D    from / from named <dataset-URI >
                          W    where {pattern }
                          M    order by expression
                               limit integer > 0
                               offset integer > 0
                Head:     C    construct
                                 { template (with nested XSPARQL) }   or
                          R    return XML + nested XSPARQL




                                 23 / 51
XSPARQL: Combining XQuery with SPARQL


               Prolog:   P    declare namespace prefix="namespace-URI "
                              or prefix prefix: <namespace-URI >
Data input     Body:     F    for var in XPath-expression
                         L    let var := XPath-expression
(XML or RDF)             W    where XPath-expression
                         O    order by expression                    or
                         F’   for varlist
                         D    from / from named <dataset-URI >
                         W    where {pattern }
                         M    order by expression
                              limit integer > 0
                              offset integer > 0
               Head:     C    construct
                                { template (with nested XSPARQL) }   or
                         R    return XML + nested XSPARQL




                                23 / 51
XSPARQL: Combining XQuery with SPARQL


               Prolog:   P    declare namespace prefix="namespace-URI "
                              or prefix prefix: <namespace-URI >
               Body:     F    for var in XPath-expression
                         L    let var := XPath-expression
                         W    where XPath-expression
                         O    order by expression                    or
                         F’   for varlist
                         D    from / from named <dataset-URI >
                         W    where {pattern }
                         M    order by expression
                              limit integer > 0
                              offset integer > 0

Data output    Head:     C    construct
                                { template (with nested XSPARQL) }   or
(XML or RDF)             R    return XML + nested XSPARQL




                                23 / 51
XSPARQL: Combining XQuery with SPARQL

 XQuery or      Prolog:   P    declare namespace prefix="namespace-URI "
 SPARQL                        or prefix prefix: <namespace-URI >
 prefix         Body:     F    for var in XPath-expression
                          L    let var := XPath-expression
 declarations             W    where XPath-expression
                          O    order by expression                    or
                          F’   for varlist
                          D    from / from named <dataset-URI >
                          W    where {pattern }
                          M    order by expression
                               limit integer > 0
                               offset integer > 0
                Head:     C    construct
                                 { template (with nested XSPARQL) }   or
                          R    return XML + nested XSPARQL




                                 23 / 51
XSPARQL: Combining XQuery with SPARQL


              Prolog:   P    declare namespace prefix="namespace-URI "
                             or prefix prefix: <namespace-URI >
 Any XQuery   Body:     F    for var in XPath-expression
                        L    let var := XPath-expression
 query                  W    where XPath-expression
                        O    order by expression                    or
                        F’   for varlist
                        D    from / from named <dataset-URI >
                        W    where {pattern }
                        M    order by expression
                             limit integer > 0
                             offset integer > 0
              Head:     C    construct
                               { template (with nested XSPARQL) }   or
                        R    return XML + nested XSPARQL




                               23 / 51
XSPARQL: Combining XQuery with SPARQL


               Prolog:   P    declare namespace prefix="namespace-URI "
                              or prefix prefix: <namespace-URI >
               Body:     F    for var in XPath-expression
                         L    let var := XPath-expression
                         W    where XPath-expression
                         O    order by expression                    or
 SPARQLForClause         F’   for varlist
                         D    from / from named <dataset-URI >
 represents a            W    where {pattern }
 SPARQL query            M    order by expression
                              limit integer > 0
                              offset integer > 0
               Head:     C    construct
                                { template (with nested XSPARQL) }   or
                         R    return XML + nested XSPARQL




                                23 / 51
XSPARQL: Combining XQuery with SPARQL


               Prolog:   P    declare namespace prefix="namespace-URI "
                              or prefix prefix: <namespace-URI >
               Body:     F    for var in XPath-expression
                         L    let var := XPath-expression
                         W    where XPath-expression
                         O    order by expression                    or
                         F’   for varlist
                         D    from / from named <dataset-URI >
                         W    where {pattern }
                         M    order by expression
                              limit integer > 0
 construct                    offset integer > 0
 creates RDF   Head:     C    construct
 output                         { template (with nested XSPARQL) }   or
                         R    return XML + nested XSPARQL




                                23 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
       $nameA in $person/@name,
       $nameB in $person/knows
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }




                                    24 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
                                                            XQuery for
   for $person in doc("relations.xml")//person,           data selec-
       $nameA in $person/@name,
       $nameB in $person/knows
                                                          tion
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }




                                    24 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
                                                            construct
   for $person in doc("relations.xml")//person,           clause gen-
       $nameA in $person/@name,                           erates RDF
       $nameB in $person/knows
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }




                                    24 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
       $nameA in $person/@name,
       $nameB in $person/knows
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }




                                    24 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
                                    Nesting produces
   for $person in doc("relations.xml")//person,
       $nameA in $person/@name,      an RDF literal
       $nameB in $person/knows
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }




                                    24 / 51
Query Example - Lifting

   Convert our relations data into RDF
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";

   for $person in doc("relations.xml")//person,
       $nameA in $person/@name,
       $nameB in $person/knows
   construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows
               [ foaf:name {data($nameB)}; a foaf:Person ]. }


   Query result
   @prefix foaf: <http://xmlns.com/foaf/0.1/> .
   [ foaf:name "Alice"; a foaf:Person; foaf:knows
     [ foaf:name "Bob"; a foaf:Person ] ].
   [ foaf:name "Alice"; a foaf:Person; foaf:knows
     [ foaf:name "Charles"; a foaf:Person ] ].
   [ foaf:name "Bob"; a foaf:Person; foaf:knows
     [ foaf:name "Charles"; a foaf:Person ] ].



                                     24 / 51
Nesting in construct clauses




   Nesting operators
       {Expr} The result of evaluating Expr will be an RDF literal




                                 25 / 51
Nesting in construct clauses




   Nesting operators
       {Expr} The result of evaluating Expr will be an RDF literal
      :{Expr} Same but for RDF blank nodes
     <{Expr}> and IRIs




                                 25 / 51
Query Example - Lifting (II)

   Convert our relations data into RDF
    declare namespace foaf="http://xmlns.com/foaf/0.1/";
    let $persons := doc("relations.xml")//person
    let $ids := data($persons/@name)
    for $p in $persons
      let $id := fn:index-of($ids, $p/@name)
      construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                  { for $k in $p/knows
                    let $kid := fn:index-of($ids, $k)
                    construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                     26 / 51
Query Example - Lifting (II)

   Convert our relations data into RDF
    declare namespace foaf="http://xmlns.com/foaf/0.1/";
    let $persons := doc("relations.xml")//person
    let $ids := data($persons/@name)                  Keep person iden-
    for $p in $persons
      let $id := fn:index-of($ids, $p/@name)          tifiers
      construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                  { for $k in $p/knows
                    let $kid := fn:index-of($ids, $k)
                    construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                    26 / 51
Query Example - Lifting (II)

   Convert our relations data into RDF
    declare namespace foaf="http://xmlns.com/foaf/0.1/";
    let $persons := doc("relations.xml")//person
    let $ids := data($persons/@name)                  For each person
    for $p in $persons
      let $id := fn:index-of($ids, $p/@name)          lookup their id
      construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                  { for $k in $p/knows
                    let $kid := fn:index-of($ids, $k)
                    construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                    26 / 51
Query Example - Lifting (II)

   Convert our relations data into RDF
    declare namespace foaf="http://xmlns.com/foaf/0.1/";
    let $persons := doc("relations.xml")//person
    let $ids := data($persons/@name)                  The same for each
    for $p in $persons
      let $id := fn:index-of($ids, $p/@name)          person then know
      construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                  { for $k in $p/knows
                    let $kid := fn:index-of($ids, $k)
                    construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                    26 / 51
Query Example - Lifting (II)

   Convert our relations data into RDF
    declare namespace foaf="http://xmlns.com/foaf/0.1/";
    let $persons := doc("relations.xml")//person
    let $ids := data($persons/@name)
    for $p in $persons
      let $id := fn:index-of($ids, $p/@name)
      construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                  { for $k in $p/knows
                    let $kid := fn:index-of($ids, $k)
                    construct { _:b{$id} foaf:knows _:b{$kid} } } }


   Query result (reformatted output)
   @prefix foaf: <http://xmlns.com/foaf/0.1/> .

   _:b1 a foaf:Person; foaf:name "Alice"; foaf:knows _:b2, _:b3 .
   _:b2 a foaf:Person; foaf:name "Bob"; foaf:knows _:b3 .
   _:b3 a foaf:Person; foaf:name "Charles" .



                                     26 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }
     order by $Name
     return <person name="{$Name}">
          { for $FName from <relations.rdf>
            where { $Person foaf:knows $Friend .
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                    27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }
     order by $Name                                     XML con-
     return <person name="{$Name}">
          { for $FName from <relations.rdf>             struction
            where { $Person foaf:knows $Friend .
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                   27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }              SPARQL for
     order by $Name                                 query: “Give me
     return <person name="{$Name}">
          { for $FName from <relations.rdf>         persons and their
            where { $Person foaf:knows $Friend .    names”
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                    27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }              SPARQL for
     order by $Name                                 query: “Give me
     return <person name="{$Name}">
          { for $FName from <relations.rdf>         persons and their
              SPARQL variables
            where { $Person foaf:knows $Friend .    names”
              are $-prefixedfoaf:name $Name.
                    $Person
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                    27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }
     order by $Name                                     XML con-
     return <person name="{$Name}">
          { for $FName from <relations.rdf>             struction
            where { $Person foaf:knows $Friend .
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                   27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>         SPARQL for
     where { $Person foaf:name $Name }              query: “Give me
     order by $Name
     return <person name="{$Name}">
                                                    the persons each
          { for $FName from <relations.rdf>         one knows”
            where { $Person foaf:knows $Friend .
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                   27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>         SPARQL for
     where { $Person foaf:name $Name }              query: “Give me
     order by $Name
     return <person name="{$Name}">
                                                    the persons each
          { for $FName from <relations.rdf>         one knows”
            where { $Person foaf:knows $Friend .    $Person and
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }     $Name instanti-
            return <knows> { $FName }</knows>}      ated by the outer
          </person>}
   </relations>                                     loop




                                   27 / 51
Query Example - Lowering


   Convert FOAF RDF data into XML
   declare namespace foaf = "http://xmlns.com/foaf/0.1/";
   <relations>
   { for $Person $Name from <relations.rdf>
     where { $Person foaf:name $Name }
     order by $Name                                     XML con-
     return <person name="{$Name}">
          { for $FName from <relations.rdf>             struction
            where { $Person foaf:knows $Friend .
                    $Person foaf:name $Name.
                    $Friend foaf:name $FName. }
            return <knows> { $FName }</knows>}
          </person>}
   </relations>




                                   27 / 51
Query Example - Lowering result



   Query result
   <relations>
      <person name="Alice">
         <knows>Charles</knows>
         <knows>Bob</knows>
      </person>
      <person name="Bob">
         <knows>Charles</knows>
      </person>
      <person name="Charles"/>
   </relations>




                                  28 / 51
Online Demo

         Online Demo at: http://xsparql.deri.org/demo/




                      Try it for yourself!



                              29 / 51
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
XSPARQL Formal Semantics




     Extend the XQuery semantics
     Adding the normalisation, static type and dynamic evaluation
     rules for the new expressions:
         SPARQL for clause
         construct clause




                               30 / 51
Formal semantics types



   Newly defined types
      RDFTerm is the type of SPARQL variables, with the subtypes:
                   uri
                   bnode
                   literal




                                31 / 51
Formal semantics types



   Newly defined types
      RDFTerm is the type of SPARQL variables, with the subtypes:
                   uri
                   bnode
                   literal
     RDFGraph will be the type of construct expressions




                                31 / 51
Formal semantics types



   Newly defined types
      RDFTerm is the type of SPARQL variables, with the subtypes:
                   uri
                   bnode
                   literal
     RDFGraph will be the type of construct expressions
   PatternSolution is a pair (variableName, RDFTerm)
              representing SPARQL variable bindings




                                31 / 51
SPARQL for - Static Type Analysis




              statEnv + varType(Variable 1 ⇒ RDFTerm;
                                ··· ;
                                Variable n ⇒ RDFTerm
                       ) ReturnExpr : Type 2
                   for $Variable 1 · · · $Variable n DatasetClause
         statEnv   where GroupGraphPattern SolutionModifier
                   return ReturnExpr : Type 2 ∗




                                32 / 51
SPARQL for - Static Type Analysis




                statEnv + varType(Variable 1 ⇒ RDFTerm;
       $Variable 1 · · · $Variable n
                                  ··· ;
       are of type RDFTerm        Variable n ⇒ RDFTerm
                         ) ReturnExpr : Type 2
                      for $Variable 1 · · · $Variable n DatasetClause
         statEnv      where GroupGraphPattern SolutionModifier
                      return ReturnExpr : Type 2 ∗




                                       32 / 51
SPARQL for - Static Type Analysis


                                               ∗ comes from
                                               the sequence of
              statEnv + varType(Variable 1 ⇒ RDFTerm; results
                                               SPARQL
                                  ··· ;
                                  Variable n ⇒ RDFTerm
                        )   ReturnExpr : Type 2
                   for $Variable 1 · · · $Variable n DatasetClause
         statEnv   where GroupGraphPattern SolutionModifier
                   return ReturnExpr : Type 2 ∗




                                32 / 51
Example: Simple SPARQL for




  Simple SPARQL for example
   for $s $p $o
   from <foaf.rdf> where { $s $p $o }
   return ($s, $p, $o)




                                    33 / 51
Example: Simple SPARQL for




                                              For each SPARQL
                                              result
  Simple SPARQL for example
   for $s $p $o
   from <foaf.rdf> where { $s $p $o }
   return ($s, $p, $o)




                                    33 / 51
Example: Simple SPARQL for




                                              For each SPARQL
                                              result
  Simple SPARQL for example
                                              Variables are as-
   for $s $p $o
   from <foaf.rdf> where { $s $p $o }         signed values
   return ($s, $p, $o)




                                    33 / 51
Example: Simple SPARQL for




                                              For each SPARQL
                                              result
  Simple SPARQL for example
                                              Variables are as-
   for $s $p $o
   from <foaf.rdf> where { $s $p $o }         signed values
   return ($s, $p, $o)
                                              Return expresion
                                              is evaluated




                                    33 / 51
SPARQL for - Dynamic Evaluation

         dynEnv   fs:sparql(DatasetClause, GroupGraphPattern,
                            SolutionModifier ) ⇒ PS 1 , . . . , PS m
        dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                            ...;
                            Variable n ⇒ fs:value(PS 1 , Variable n )
                       ) ReturnExpr ⇒ Value 1
                                    .
                                    .
                                    .
        dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
                          ...;
                          Variable n ⇒ fs:value(PS m , Variable n )
                     ) ReturnExpr ⇒ Value m
                     for $Variable 1 · · · $Variable n
        dynEnv       where GroupGraphPattern SolutionModifier
                     return ReturnExpr ⇒ Value 1 , . . . , Value m



                                  34 / 51
SPARQL for - Dynamic Evaluation

              dynEnv  fs:sparql(DatasetClause, GroupGraphPattern,
                                SolutionModifier ) ⇒ PS 1 , . . . , PS m
            dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                                ...;
 The results of
                                Variable n ⇒ fs:value(PS 1 , Variable n )
 the SPARQL                ) ReturnExpr ⇒ Value 1
 query                                  .
                                        .
                                        .
             dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
                               ...;
                               Variable n ⇒ fs:value(PS m , Variable n )
                          ) ReturnExpr ⇒ Value m
                          for $Variable 1 · · · $Variable n
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
SPARQL for - Dynamic Evaluation

              dynEnv  fs:sparql(DatasetClause, GroupGraphPattern,
                                SolutionModifier ) ⇒ PS 1 , . . . , PS m
            dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                                ...;
 The results of
                                Variable n ⇒ fs:value(PS 1 , Variable n )
 the SPARQL                ) ReturnExpr ⇒ Value 1
 query                                  .
                                        .
                                        .
            dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
                              ...;
    fs:sparql evaluates       Variable n ⇒ fs:value(PS m , Variable n )
    a SPARQL query       ) ReturnExpr ⇒ Value m
                          for $Variable 1 · · · $Variable n
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
SPARQL for - Dynamic Evaluation

              dynEnv  fs:sparql(DatasetClause, GroupGraphPattern,
                                SolutionModifier ) ⇒ PS 1 , . . . , PS m
            dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                                ...;
                                Variable n ⇒ fs:value(PS 1 , Variable n )
 For each PS               ) ReturnExpr ⇒ Value 1
 add the values                         .
                                        .
                                        .
 of the variables
             dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
 to dynEnv                     ...;
                                  Variable n ⇒ fs:value(PS m , Variable n )
                             )   ReturnExpr ⇒ Value m
                          for $Variable 1 · · · $Variable n
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
SPARQL for - Dynamic Evaluation

    fs:value selects
               dynEnv fs:sparql(DatasetClause, GroupGraphPattern,
    the value of                SolutionModifier ) ⇒ PS 1 , . . . , PS m
    VariabledynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
             i from
    the PS                      ...;
                                  Variable n ⇒ fs:value(PS 1 , Variable n )
 For each PS              ) ReturnExpr ⇒ Value 1
 add the values                        .
                                       .
                                       .
 of the variables
             dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
 to dynEnv                     ...;
                                  Variable n ⇒ fs:value(PS m , Variable n )
                             )   ReturnExpr ⇒ Value m
                          for $Variable 1 · · · $Variable n
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
SPARQL for - Dynamic Evaluation

              dynEnv  fs:sparql(DatasetClause, GroupGraphPattern,
                                SolutionModifier ) ⇒ PS 1 , . . . , PS m
            dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                                ...;
                                Variable n ⇒ fs:value(PS 1 , Variable n )
 For each PS               ) ReturnExpr ⇒ Value 1
 add the values                         .
                                        .
                                        .
 of the variables
             dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
 to dynEnv                     ...;
                                  Variable n ⇒ fs:value(PS m , Variable n )
                             )   ReturnExpr ⇒ Value m
                          for $Variable 1 · · · $Variable n
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
SPARQL for - Dynamic Evaluation

              dynEnv   fs:sparql(DatasetClause, GroupGraphPattern,
                                 SolutionModifier ) ⇒ PS 1 , . . . , PS m
             dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 );
                                 ...;
                                 Variable n ⇒ fs:value(PS 1 , Variable n )
                            ) ReturnExpr ⇒ Value 1
                                         .
                                         .
                                         .
 The result dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 );
            of
                              ...;
 the expression
                              Variable n ⇒ fs:value(PS m , Variable n )
 is the sequence         ) ReturnExpr ⇒ Value m
 of computed
                      for $Variable 1 · · · $Variable n
 Value s
             dynEnv       where GroupGraphPattern SolutionModifier
                          return ReturnExpr ⇒ Value 1 , . . . , Value m



                                       34 / 51
construct expressions




                   construct ConstructTemplate       Expr
                                ==
      return fs:evalTemplate [ConstructTemplate ]normaliseTemplate




                                  35 / 51
construct expressions



                                      [·]normaliseTemplate ex-
                                        ]
                                       pands any Turtle short-
                   construct ConstructTemplateits argument
                                       cuts in
                                                    Expr
                                  ==
      return fs:evalTemplate [ConstructTemplate ]normaliseTemplate




                                  35 / 51
construct expressions




      fs:evalTemplate vali-
      dates the created triples
                   construct ConstructTemplate       Expr
                                ==
      return fs:evalTemplate [ConstructTemplate ]normaliseTemplate




                                  35 / 51
Outline

   Overview

   XPath & XQuery
     XPath
     XQuery
     XQuery Semantics

   SPARQL

   XSPARQL
     Syntax
     Semantics
     Implementation
     XSPARQL Features
     Query examples
Implementation




                 36 / 51
Implementation




      Each XSPARQL query is rewritten into an XQuery




                              36 / 51
Implementation




      Each XSPARQL query is rewritten into an XQuery
      SPARQLForClauses are translated into SPARQL SELECT
      queries and executed using a SPARQL engine




                              36 / 51
Lifting: Rewriting to XQuery



   Convert our relations data into RDF
   declare namespace foaf="http://xmlns.com/foaf/0.1/";
   let $persons := doc("relations.xml")//person
   let $ids := data($persons/@name)
   for $p in $persons
     let $id := fn:index-of($ids, $p/@name)
     construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                 { for $k in $p/knows
                   let $kid := fn:index-of($ids, $k)
                   construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                    37 / 51
Lifting: Rewriting to XQuery



   Convert our relations data into RDF
   declare namespace foaf="http://xmlns.com/foaf/0.1/";
   let $persons := doc("relations.xml")//person
   let $ids := data($persons/@name)
   for $p in $persons
     let $id := fn:index-of($ids, $p/@name)
     construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}.
                 { for $k in $p/knows
                   let $kid := fn:index-of($ids, $k)
                   construct { _:b{$id} foaf:knows _:b{$kid} } } }




                                    37 / 51
Lifting: Rewriting to XQuery
   Convert our relations data into RDF (partial)
        { for $k in $p/knows
          let $kid := fn:index-of($ids, $k)
          construct { _:b{$id} foaf:knows _:b{$kid} } } }


   Rewritten XQuery (and re-rewritten for presentation purposes)
    for $k at $k_pos in $p/knows
    let $kid := fn:index-of( $ids, $k )
    return
      let $_rdf8 := _xsparql:_binding_term( "_:b", $id, "", "" )
      let $_rdf9 := _xsparql:_binding_term( "_:b", $kid, "", "" )
      return _xsparql:_serialize((
        if (_xsparql:_validSubject($_rdf8) and _xsparql:_validObject($_rdf9))
        then
           ($_rdf8, " foaf:knows ", _xsparql:_rdf_term( $_rdf9 ), " .&#xA;")
        else "")
     ) ) )




                                    37 / 51
Lifting: Rewriting to XQuery
   Convert our relations data into RDF (partial)
        { for $k in $p/knows
          let $kid := fn:index-of($ids, $k)
          construct { _:b{$id} foaf:knows _:b{$kid} } } }


   Rewritten XQuery (and re-rewritten for presentation purposes)
     for $k at $k_pos in $p/knows
     let $kid := fn:index-of( $ids, $k )
     return
       let $_rdf8 := _xsparql:_binding_term( "_:b", $id, "", "" )
       let $_rdf9 := _xsparql:_binding_term( "_:b", $kid, "", "" )
       return _xsparql:_serialize((
    Create (_xsparql:_validSubject($_rdf8) and _xsparql:_validObject($_rdf9))
         if variables of
         then
    type RDFTerm " foaf:knows ", _xsparql:_rdf_term( $_rdf9 ), " .&#xA;")
            ($_rdf8, for
    eachelse "")
          constructed
      ) ) )
    term


                                    37 / 51
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial
XSPARQL Tutorial

Weitere ähnliche Inhalte

Was ist angesagt?

RDF Tutorial - SPARQL 20091031
RDF Tutorial - SPARQL 20091031RDF Tutorial - SPARQL 20091031
RDF Tutorial - SPARQL 20091031kwangsub kim
 
RDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesRDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesMarin Dimitrov
 
Querying the Semantic Web with SPARQL
Querying the Semantic Web with SPARQLQuerying the Semantic Web with SPARQL
Querying the Semantic Web with SPARQLEmanuele Della Valle
 
OWL: Yet to arrive on the Web of Data?
OWL: Yet to arrive on the Web of Data?OWL: Yet to arrive on the Web of Data?
OWL: Yet to arrive on the Web of Data?Aidan Hogan
 
Ks2008 Semanticweb In Action
Ks2008 Semanticweb In ActionKs2008 Semanticweb In Action
Ks2008 Semanticweb In ActionRinke Hoekstra
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapesJose Emilio Labra Gayo
 
Saveface - Save your Facebook content as RDF data
Saveface - Save your Facebook content as RDF dataSaveface - Save your Facebook content as RDF data
Saveface - Save your Facebook content as RDF dataFuming Shih
 
Two graph data models : RDF and Property Graphs
Two graph data models : RDF and Property GraphsTwo graph data models : RDF and Property Graphs
Two graph data models : RDF and Property Graphsandyseaborne
 
Ontologies and Semantic in OpenSource projects
Ontologies and Semantic in OpenSource projectsOntologies and Semantic in OpenSource projects
Ontologies and Semantic in OpenSource projectsjgato
 
Mon norton tut_queryinglinkeddata02
Mon norton tut_queryinglinkeddata02Mon norton tut_queryinglinkeddata02
Mon norton tut_queryinglinkeddata02eswcsummerschool
 
"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul
"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul
"RDFa - what, why and how?" by Mike Hewett and Shamod LacoulShamod Lacoul
 
RDFa: introduction, comparison with microdata and microformats and how to use it
RDFa: introduction, comparison with microdata and microformats and how to use itRDFa: introduction, comparison with microdata and microformats and how to use it
RDFa: introduction, comparison with microdata and microformats and how to use itJose Luis Lopez Pino
 
An Introduction to RDF and the Web of Data
An Introduction to RDF and the Web of DataAn Introduction to RDF and the Web of Data
An Introduction to RDF and the Web of DataOlaf Hartig
 
Mapping Relational Databases to Linked Data
Mapping Relational Databases to Linked DataMapping Relational Databases to Linked Data
Mapping Relational Databases to Linked DataEUCLID project
 
Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)EUCLID project
 
SPARQL 1.1 Update (2013-03-05)
SPARQL 1.1 Update (2013-03-05)SPARQL 1.1 Update (2013-03-05)
SPARQL 1.1 Update (2013-03-05)andyseaborne
 

Was ist angesagt? (20)

RDF Tutorial - SPARQL 20091031
RDF Tutorial - SPARQL 20091031RDF Tutorial - SPARQL 20091031
RDF Tutorial - SPARQL 20091031
 
FOAF
FOAFFOAF
FOAF
 
RDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesRDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic Repositories
 
Ist16-04 An introduction to RDF
Ist16-04 An introduction to RDF Ist16-04 An introduction to RDF
Ist16-04 An introduction to RDF
 
Querying the Semantic Web with SPARQL
Querying the Semantic Web with SPARQLQuerying the Semantic Web with SPARQL
Querying the Semantic Web with SPARQL
 
OWL: Yet to arrive on the Web of Data?
OWL: Yet to arrive on the Web of Data?OWL: Yet to arrive on the Web of Data?
OWL: Yet to arrive on the Web of Data?
 
Ks2008 Semanticweb In Action
Ks2008 Semanticweb In ActionKs2008 Semanticweb In Action
Ks2008 Semanticweb In Action
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapes
 
Saveface - Save your Facebook content as RDF data
Saveface - Save your Facebook content as RDF dataSaveface - Save your Facebook content as RDF data
Saveface - Save your Facebook content as RDF data
 
Two graph data models : RDF and Property Graphs
Two graph data models : RDF and Property GraphsTwo graph data models : RDF and Property Graphs
Two graph data models : RDF and Property Graphs
 
Ontologies and Semantic in OpenSource projects
Ontologies and Semantic in OpenSource projectsOntologies and Semantic in OpenSource projects
Ontologies and Semantic in OpenSource projects
 
Mon norton tut_queryinglinkeddata02
Mon norton tut_queryinglinkeddata02Mon norton tut_queryinglinkeddata02
Mon norton tut_queryinglinkeddata02
 
"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul
"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul
"RDFa - what, why and how?" by Mike Hewett and Shamod Lacoul
 
ShEx by Example
ShEx by ExampleShEx by Example
ShEx by Example
 
RDFa: introduction, comparison with microdata and microformats and how to use it
RDFa: introduction, comparison with microdata and microformats and how to use itRDFa: introduction, comparison with microdata and microformats and how to use it
RDFa: introduction, comparison with microdata and microformats and how to use it
 
An Introduction to RDF and the Web of Data
An Introduction to RDF and the Web of DataAn Introduction to RDF and the Web of Data
An Introduction to RDF and the Web of Data
 
Mapping Relational Databases to Linked Data
Mapping Relational Databases to Linked DataMapping Relational Databases to Linked Data
Mapping Relational Databases to Linked Data
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)Relational Database to RDF (RDB2RDF)
Relational Database to RDF (RDB2RDF)
 
SPARQL 1.1 Update (2013-03-05)
SPARQL 1.1 Update (2013-03-05)SPARQL 1.1 Update (2013-03-05)
SPARQL 1.1 Update (2013-03-05)
 

Andere mochten auch

Random Manhattan Indexing
Random Manhattan IndexingRandom Manhattan Indexing
Random Manhattan Indexingnet2-project
 
Borders of Decidability in Verification of Data-Centric Dynamic Systems
Borders of Decidability in Verification of Data-Centric Dynamic SystemsBorders of Decidability in Verification of Data-Centric Dynamic Systems
Borders of Decidability in Verification of Data-Centric Dynamic Systemsnet2-project
 
Exchanging more than Complete Data
Exchanging more than Complete DataExchanging more than Complete Data
Exchanging more than Complete Datanet2-project
 
Extracting Information for Context-aware Meeting Preparation
Extracting Information for Context-aware Meeting PreparationExtracting Information for Context-aware Meeting Preparation
Extracting Information for Context-aware Meeting Preparationnet2-project
 
Extending DBpedia (LOD) using WikiTables
Extending DBpedia (LOD) using WikiTablesExtending DBpedia (LOD) using WikiTables
Extending DBpedia (LOD) using WikiTablesnet2-project
 
Exchanging OWL 2 QL Knowledge Bases
Exchanging OWL 2 QL Knowledge BasesExchanging OWL 2 QL Knowledge Bases
Exchanging OWL 2 QL Knowledge Basesnet2-project
 
Federation and Navigation in SPARQL 1.1
Federation and Navigation in SPARQL 1.1Federation and Navigation in SPARQL 1.1
Federation and Navigation in SPARQL 1.1net2-project
 

Andere mochten auch (7)

Random Manhattan Indexing
Random Manhattan IndexingRandom Manhattan Indexing
Random Manhattan Indexing
 
Borders of Decidability in Verification of Data-Centric Dynamic Systems
Borders of Decidability in Verification of Data-Centric Dynamic SystemsBorders of Decidability in Verification of Data-Centric Dynamic Systems
Borders of Decidability in Verification of Data-Centric Dynamic Systems
 
Exchanging more than Complete Data
Exchanging more than Complete DataExchanging more than Complete Data
Exchanging more than Complete Data
 
Extracting Information for Context-aware Meeting Preparation
Extracting Information for Context-aware Meeting PreparationExtracting Information for Context-aware Meeting Preparation
Extracting Information for Context-aware Meeting Preparation
 
Extending DBpedia (LOD) using WikiTables
Extending DBpedia (LOD) using WikiTablesExtending DBpedia (LOD) using WikiTables
Extending DBpedia (LOD) using WikiTables
 
Exchanging OWL 2 QL Knowledge Bases
Exchanging OWL 2 QL Knowledge BasesExchanging OWL 2 QL Knowledge Bases
Exchanging OWL 2 QL Knowledge Bases
 
Federation and Navigation in SPARQL 1.1
Federation and Navigation in SPARQL 1.1Federation and Navigation in SPARQL 1.1
Federation and Navigation in SPARQL 1.1
 

Ähnlich wie XSPARQL Tutorial

Semantic Web(Web 3.0) SPARQL
Semantic Web(Web 3.0) SPARQLSemantic Web(Web 3.0) SPARQL
Semantic Web(Web 3.0) SPARQLDaniel D.J. UM
 
Introduction to RDFa
Introduction to RDFaIntroduction to RDFa
Introduction to RDFaIvan Herman
 
The Semantic Web #5 - RDF (2)
The Semantic Web #5 - RDF (2)The Semantic Web #5 - RDF (2)
The Semantic Web #5 - RDF (2)Myungjin Lee
 
Ks2007 Semanticweb In Action
Ks2007 Semanticweb In ActionKs2007 Semanticweb In Action
Ks2007 Semanticweb In ActionRinke Hoekstra
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataAn introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataGabriela Agustini
 
W3C Tutorial on Semantic Web and Linked Data at WWW 2013
W3C Tutorial on Semantic Web and Linked Data at WWW 2013W3C Tutorial on Semantic Web and Linked Data at WWW 2013
W3C Tutorial on Semantic Web and Linked Data at WWW 2013Fabien Gandon
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic  Web and Linked DataAn introduction to Semantic  Web and Linked Data
An introduction to Semantic Web and Linked DataGabriela Agustini
 
Ruby semweb 2011-12-06
Ruby semweb 2011-12-06Ruby semweb 2011-12-06
Ruby semweb 2011-12-06Gregg Kellogg
 
Consuming linked data by machines
Consuming linked data by machinesConsuming linked data by machines
Consuming linked data by machinesPatrick Sinclair
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataAn introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataFabien Gandon
 
The Semantic Web #9 - Web Ontology Language (OWL)
The Semantic Web #9 - Web Ontology Language (OWL)The Semantic Web #9 - Web Ontology Language (OWL)
The Semantic Web #9 - Web Ontology Language (OWL)Myungjin Lee
 
A hands on overview of the semantic web
A hands on overview of the semantic webA hands on overview of the semantic web
A hands on overview of the semantic webMarakana Inc.
 
Shrinking the silo boundary: data and schema in the Semantic Web
Shrinking the silo boundary: data and schema in the Semantic WebShrinking the silo boundary: data and schema in the Semantic Web
Shrinking the silo boundary: data and schema in the Semantic WebGordon Dunsire
 
Publishing Data Using Semantic Web Technologies
Publishing Data Using Semantic Web TechnologiesPublishing Data Using Semantic Web Technologies
Publishing Data Using Semantic Web TechnologiesNikolaos Konstantinou
 

Ähnlich wie XSPARQL Tutorial (20)

Semantic Web(Web 3.0) SPARQL
Semantic Web(Web 3.0) SPARQLSemantic Web(Web 3.0) SPARQL
Semantic Web(Web 3.0) SPARQL
 
RDF briefing
RDF briefingRDF briefing
RDF briefing
 
Introduction to RDFa
Introduction to RDFaIntroduction to RDFa
Introduction to RDFa
 
The Semantic Web #5 - RDF (2)
The Semantic Web #5 - RDF (2)The Semantic Web #5 - RDF (2)
The Semantic Web #5 - RDF (2)
 
Semantic Web - RDF
Semantic Web - RDFSemantic Web - RDF
Semantic Web - RDF
 
Ks2007 Semanticweb In Action
Ks2007 Semanticweb In ActionKs2007 Semanticweb In Action
Ks2007 Semanticweb In Action
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataAn introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked Data
 
W3C Tutorial on Semantic Web and Linked Data at WWW 2013
W3C Tutorial on Semantic Web and Linked Data at WWW 2013W3C Tutorial on Semantic Web and Linked Data at WWW 2013
W3C Tutorial on Semantic Web and Linked Data at WWW 2013
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic  Web and Linked DataAn introduction to Semantic  Web and Linked Data
An introduction to Semantic Web and Linked Data
 
Ruby semweb 2011-12-06
Ruby semweb 2011-12-06Ruby semweb 2011-12-06
Ruby semweb 2011-12-06
 
RDF Transformations
RDF TransformationsRDF Transformations
RDF Transformations
 
Consuming linked data by machines
Consuming linked data by machinesConsuming linked data by machines
Consuming linked data by machines
 
An introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked DataAn introduction to Semantic Web and Linked Data
An introduction to Semantic Web and Linked Data
 
The Semantic Web #9 - Web Ontology Language (OWL)
The Semantic Web #9 - Web Ontology Language (OWL)The Semantic Web #9 - Web Ontology Language (OWL)
The Semantic Web #9 - Web Ontology Language (OWL)
 
Tutorial for RDF Graphs
Tutorial for RDF GraphsTutorial for RDF Graphs
Tutorial for RDF Graphs
 
XML Bible
XML BibleXML Bible
XML Bible
 
A hands on overview of the semantic web
A hands on overview of the semantic webA hands on overview of the semantic web
A hands on overview of the semantic web
 
Semantic Web - OWL
Semantic Web - OWLSemantic Web - OWL
Semantic Web - OWL
 
Shrinking the silo boundary: data and schema in the Semantic Web
Shrinking the silo boundary: data and schema in the Semantic WebShrinking the silo boundary: data and schema in the Semantic Web
Shrinking the silo boundary: data and schema in the Semantic Web
 
Publishing Data Using Semantic Web Technologies
Publishing Data Using Semantic Web TechnologiesPublishing Data Using Semantic Web Technologies
Publishing Data Using Semantic Web Technologies
 

Mehr von net2-project

Vector spaces for information extraction - Random Projection Example
Vector spaces for information extraction - Random Projection ExampleVector spaces for information extraction - Random Projection Example
Vector spaces for information extraction - Random Projection Examplenet2-project
 
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...net2-project
 
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...net2-project
 
Managing Social Communities
Managing Social CommunitiesManaging Social Communities
Managing Social Communitiesnet2-project
 
Data Exchange over RDF
Data Exchange over RDFData Exchange over RDF
Data Exchange over RDFnet2-project
 
Exchanging More than Complete Data
Exchanging More than Complete DataExchanging More than Complete Data
Exchanging More than Complete Datanet2-project
 
Exchanging More than Complete Data
Exchanging More than Complete DataExchanging More than Complete Data
Exchanging More than Complete Datanet2-project
 
Answer-set programming
Answer-set programmingAnswer-set programming
Answer-set programmingnet2-project
 
Evolving web, evolving search
Evolving web, evolving searchEvolving web, evolving search
Evolving web, evolving searchnet2-project
 
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)net2-project
 

Mehr von net2-project (10)

Vector spaces for information extraction - Random Projection Example
Vector spaces for information extraction - Random Projection ExampleVector spaces for information extraction - Random Projection Example
Vector spaces for information extraction - Random Projection Example
 
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...
Mining Semi-structured Data: Understanding Web-tables – Building a Taxonomy f...
 
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...
Tailoring Temporal Description Logics for Reasoning over Temporal Conceptual ...
 
Managing Social Communities
Managing Social CommunitiesManaging Social Communities
Managing Social Communities
 
Data Exchange over RDF
Data Exchange over RDFData Exchange over RDF
Data Exchange over RDF
 
Exchanging More than Complete Data
Exchanging More than Complete DataExchanging More than Complete Data
Exchanging More than Complete Data
 
Exchanging More than Complete Data
Exchanging More than Complete DataExchanging More than Complete Data
Exchanging More than Complete Data
 
Answer-set programming
Answer-set programmingAnswer-set programming
Answer-set programming
 
Evolving web, evolving search
Evolving web, evolving searchEvolving web, evolving search
Evolving web, evolving search
 
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)
SPARQL1.1 Tutorial, given in UChile by Axel Polleres (DERI)
 

Kürzlich hochgeladen

Congestive Cardiac Failure..presentation
Congestive Cardiac Failure..presentationCongestive Cardiac Failure..presentation
Congestive Cardiac Failure..presentationdeepaannamalai16
 
Textual Evidence in Reading and Writing of SHS
Textual Evidence in Reading and Writing of SHSTextual Evidence in Reading and Writing of SHS
Textual Evidence in Reading and Writing of SHSMae Pangan
 
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptx
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptxDecoding the Tweet _ Practical Criticism in the Age of Hashtag.pptx
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptxDhatriParmar
 
How to Fix XML SyntaxError in Odoo the 17
How to Fix XML SyntaxError in Odoo the 17How to Fix XML SyntaxError in Odoo the 17
How to Fix XML SyntaxError in Odoo the 17Celine George
 
Daily Lesson Plan in Mathematics Quarter 4
Daily Lesson Plan in Mathematics Quarter 4Daily Lesson Plan in Mathematics Quarter 4
Daily Lesson Plan in Mathematics Quarter 4JOYLYNSAMANIEGO
 
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfGrade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfJemuel Francisco
 
Expanded definition: technical and operational
Expanded definition: technical and operationalExpanded definition: technical and operational
Expanded definition: technical and operationalssuser3e220a
 
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...DhatriParmar
 
Grade Three -ELLNA-REVIEWER-ENGLISH.pptx
Grade Three -ELLNA-REVIEWER-ENGLISH.pptxGrade Three -ELLNA-REVIEWER-ENGLISH.pptx
Grade Three -ELLNA-REVIEWER-ENGLISH.pptxkarenfajardo43
 
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...DhatriParmar
 
4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptxmary850239
 
Scientific Writing :Research Discourse
Scientific  Writing :Research  DiscourseScientific  Writing :Research  Discourse
Scientific Writing :Research DiscourseAnita GoswamiGiri
 
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptx
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptxMan or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptx
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptxDhatriParmar
 
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxHumphrey A Beña
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Seán Kennedy
 
Reading and Writing Skills 11 quarter 4 melc 1
Reading and Writing Skills 11 quarter 4 melc 1Reading and Writing Skills 11 quarter 4 melc 1
Reading and Writing Skills 11 quarter 4 melc 1GloryAnnCastre1
 
ClimART Action | eTwinning Project
ClimART Action    |    eTwinning ProjectClimART Action    |    eTwinning Project
ClimART Action | eTwinning Projectjordimapav
 

Kürzlich hochgeladen (20)

Congestive Cardiac Failure..presentation
Congestive Cardiac Failure..presentationCongestive Cardiac Failure..presentation
Congestive Cardiac Failure..presentation
 
Textual Evidence in Reading and Writing of SHS
Textual Evidence in Reading and Writing of SHSTextual Evidence in Reading and Writing of SHS
Textual Evidence in Reading and Writing of SHS
 
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptx
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptxDecoding the Tweet _ Practical Criticism in the Age of Hashtag.pptx
Decoding the Tweet _ Practical Criticism in the Age of Hashtag.pptx
 
How to Fix XML SyntaxError in Odoo the 17
How to Fix XML SyntaxError in Odoo the 17How to Fix XML SyntaxError in Odoo the 17
How to Fix XML SyntaxError in Odoo the 17
 
Daily Lesson Plan in Mathematics Quarter 4
Daily Lesson Plan in Mathematics Quarter 4Daily Lesson Plan in Mathematics Quarter 4
Daily Lesson Plan in Mathematics Quarter 4
 
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdfGrade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
Grade 9 Quarter 4 Dll Grade 9 Quarter 4 DLL.pdf
 
Faculty Profile prashantha K EEE dept Sri Sairam college of Engineering
Faculty Profile prashantha K EEE dept Sri Sairam college of EngineeringFaculty Profile prashantha K EEE dept Sri Sairam college of Engineering
Faculty Profile prashantha K EEE dept Sri Sairam college of Engineering
 
Paradigm shift in nursing research by RS MEHTA
Paradigm shift in nursing research by RS MEHTAParadigm shift in nursing research by RS MEHTA
Paradigm shift in nursing research by RS MEHTA
 
Expanded definition: technical and operational
Expanded definition: technical and operationalExpanded definition: technical and operational
Expanded definition: technical and operational
 
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...
Blowin' in the Wind of Caste_ Bob Dylan's Song as a Catalyst for Social Justi...
 
Grade Three -ELLNA-REVIEWER-ENGLISH.pptx
Grade Three -ELLNA-REVIEWER-ENGLISH.pptxGrade Three -ELLNA-REVIEWER-ENGLISH.pptx
Grade Three -ELLNA-REVIEWER-ENGLISH.pptx
 
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...
Beauty Amidst the Bytes_ Unearthing Unexpected Advantages of the Digital Wast...
 
4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx4.16.24 21st Century Movements for Black Lives.pptx
4.16.24 21st Century Movements for Black Lives.pptx
 
Scientific Writing :Research Discourse
Scientific  Writing :Research  DiscourseScientific  Writing :Research  Discourse
Scientific Writing :Research Discourse
 
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptx
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptxMan or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptx
Man or Manufactured_ Redefining Humanity Through Biopunk Narratives.pptx
 
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptxINTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
INTRODUCTION TO CATHOLIC CHRISTOLOGY.pptx
 
Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...Student Profile Sample - We help schools to connect the data they have, with ...
Student Profile Sample - We help schools to connect the data they have, with ...
 
prashanth updated resume 2024 for Teaching Profession
prashanth updated resume 2024 for Teaching Professionprashanth updated resume 2024 for Teaching Profession
prashanth updated resume 2024 for Teaching Profession
 
Reading and Writing Skills 11 quarter 4 melc 1
Reading and Writing Skills 11 quarter 4 melc 1Reading and Writing Skills 11 quarter 4 melc 1
Reading and Writing Skills 11 quarter 4 melc 1
 
ClimART Action | eTwinning Project
ClimART Action    |    eTwinning ProjectClimART Action    |    eTwinning Project
ClimART Action | eTwinning Project
 

XSPARQL Tutorial

  • 1. NET 2 Transforming between RDF and XML with XSPARQL Net2 Tutorial Nuno Lopes December, 2010
  • 3. Integration of Heterogeneous Sources SPARQL 1 / 51
  • 4. Integration of Heterogeneous Sources SPARQL 1 / 51
  • 5. Integration of Heterogeneous Sources XSLT/XQuery SPARQL 1 / 51
  • 6. Integration of Heterogeneous Sources XSLT/XQuery Lowering SPARQL Lifting Transformations between XML and RDF are not easy, mainly due to the heterogeneity of RDF/XML serialisations 1 / 51
  • 7. Integration of Heterogeneous Sources XSLT/XQuery SPARQL Transformations between XML and RDF are not easy, mainly due to the heterogeneity of RDF/XML serialisations Objective: language capable of integrating heterogeneous sources for the Semantic Web 1 / 51
  • 8. Why are such transformations needed? (I) Standards in Health Care and Life Sciences 2 / 51
  • 9. Why are such transformations needed? (I) Standards in Health Care and Life Sciences 2 / 51
  • 10. Why are such transformations needed? (I) Standards in Health Care and Life Sciences Possible solution for the heterogeneous message formats Store your data in RDF Convert it to the required XML format when necessary 2 / 51
  • 11. Why are such transformations needed? (II) Creating (X)HTML from an RDF backend (under development): http://musicpath.org/ 3 / 51
  • 12. Why are such transformations needed? (II) Creating (X)HTML from an RDF backend (under development): http://musicpath.org/ 3 / 51
  • 13. Why are such transformations needed? (II) Creating (X)HTML from an RDF backend (under development): http://musicpath.org/ 3 / 51
  • 14. Toy example for the tutorial knows knows knows 4 / 51
  • 15. Toy example for the tutorial knows knows knows 4 / 51
  • 16. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . <rdf:RDF xmlns:foaf="...foaf/0.1/"> @prefix foaf: <...foaf/0.1/> . <foaf:Person> <foaf:knows> _:b1 rdf:type foaf:Person; <foaf:Person foaf:name="Bob"/> foaf:knows _:b2. </foaf:knows> _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> <rdf:Description rdf:nodeID="x"> <foaf:knows rdf:nodeID="b2"/> <rdf:type rdf:resource=".../Person"/> </rdf:Description> </rdf:Description> <rdf:Description rdf:nodeID="b2"> <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> rdf:resource=".../Person"/> </rdf:Description> <foaf:name>Bob</foaf:name> <rdf:Description rdf:nodeID="y"> </rdf:Description> <rdf:type rdf:resource=".../Person"/> </rdf:RDF> </rdf:Description> </rdf:RDF> 5 / 51
  • 17. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . <rdf:RDF xmlns:foaf="...foaf/0.1/"> @prefix foaf: <...foaf/0.1/> . <foaf:Person> rtle <foaf:knows> Tu _:b1 rdf:type foaf:Person; foaf:knows _:b2. <foaf:Person foaf:name="Bob"/> </foaf:knows> _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> <rdf:Description rdf:nodeID="x"> <foaf:knows rdf:nodeID="b2"/> <rdf:type rdf:resource=".../Person"/> </rdf:Description> </rdf:Description> <rdf:Description rdf:nodeID="b2"> <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> rdf:resource=".../Person"/> </rdf:Description> <foaf:name>Bob</foaf:name> <rdf:Description rdf:nodeID="y"> </rdf:Description> <rdf:type rdf:resource=".../Person"/> </rdf:RDF> </rdf:Description> </rdf:RDF> 5 / 51
  • 18. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . <rdf:RDF xmlns:foaf="...foaf/0.1/"> Tri plele @prefix foaf: <...foaf/0.1/> . <foaf:Person> urt sto e <foaf:knows> _:b1 rdf:type foaf:Person;r T foaf:knows _:b2. <foaf:Person foaf:name="Bob"/> </foaf:knows> _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> <rdf:Description rdf:nodeID="x"> <foaf:knows rdf:nodeID="b2"/> <rdf:type rdf:resource=".../Person"/> </rdf:Description> </rdf:Description> <rdf:Description rdf:nodeID="b2"> <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> rdf:resource=".../Person"/> </rdf:Description> <foaf:name>Bob</foaf:name> <rdf:Description rdf:nodeID="y"> </rdf:Description> <rdf:type rdf:resource=".../Person"/> </rdf:RDF> </rdf:Description> </rdf:RDF> 5 / 51
  • 19. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . Tri RD <rdf:RDF xmlns:foaf="...foaf/0.1/"> plele @prefix foaf: <...foaf/0.1/> . <foaf:Person> F/ XM urt sto e <foaf:knows> _:b1 rdf:type foaf:Person;r T foaf:knows _:b2. <foaf:Person foaf:name="Bob"/> </foaf:knows> L _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> RDF/XML <foaf:knows rdf:nodeID="b2"/> X ML <rdf:Description rdf:nodeID="x"> <rdf:type rdf:resource=".../Person"/> </rdf:Description> F/ </rdf:Description> <rdf:Description rdf:nodeID="b2"> RD <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> rdf:resource=".../Person"/> </rdf:Description> <foaf:name>Bob</foaf:name> <rdf:Description rdf:nodeID="y"> </rdf:Description> <rdf:type rdf:resource=".../Person"/> </rdf:RDF> </rdf:Description> </rdf:RDF> 5 / 51
  • 20. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . Tri RD <rdf:RDF xmlns:foaf="...foaf/0.1/"> plele @prefix foaf: <...foaf/0.1/> . <foaf:Person> F/ XM urt sto e <foaf:knows> _:b1 rdf:type foaf:Person;r T foaf:knows _:b2. <foaf:Person foaf:name="Bob"/> </foaf:knows> L _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> RDF/XML <foaf:knows rdf:nodeID="b2"/> X ML <rdf:Description rdf:nodeID="x"> <rdf:type rdf:resource=".../Person"/> </rdf:Description> F/ </rdf:Description> <rdf:Description rdf:nodeID="b2"> RD <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> Any transformation needs to take rdf:resource=".../Person"/> <foaf:name>Bob</foaf:name> </rdf:Description> <rdf:Description rdf:nodeID="y"> </rdf:Description> <rdf:type rdf:resource=".../Person"/> into account the different RDF/XML </rdf:RDF> </rdf:Description> </rdf:RDF> representations 5 / 51
  • 21. Why XQuery/XSLT is not enough: Different syntaxes and serialisations for the same RDF graph: @prefix alice: <alice/> . Tri RD <rdf:RDF xmlns:foaf="...foaf/0.1/"> plele @prefix foaf: <...foaf/0.1/> . <foaf:Person> F/ XM urt sto e <foaf:knows> _:b1 rdf:type foaf:Person;r T foaf:knows _:b2. <foaf:Person foaf:name="Bob"/> </foaf:knows> L _:b2 rdf:type foaf:Person; </foaf:Person> foaf:name "Bob". </rdf:RDF> <rdf:RDF xmlns:foaf="...foaf/0.1/" <rdf:RDF xmlns:foaf="...foaf/0.1/" xmlns:rdf="...rdf-syntax-ns#"> xmlns:rdf="...rdf-syntax-ns#"> <rdf:Description rdf:nodeID="x"> <rdf:Description rdf:nodeID="b1"> <foaf:knows rdf:nodeID="y"/> <rdf:type </rdf:Description> rdf:resource=".../Person"/> RDF/XML <foaf:knows rdf:nodeID="b2"/> X ML <rdf:Description rdf:nodeID="x"> <rdf:type rdf:resource=".../Person"/> </rdf:Description> F/ </rdf:Description> <rdf:Description rdf:nodeID="b2"> RD <rdf:Description rdf:nodeID="y"> <rdf:type <foaf:name>Bob</foaf:name> rdf:resource=".../Person"/> </rdf:Description> <foaf:name>Bob</foaf:name> <rdf:Description rdf:nodeID="y"> Or: end up with different transfor- </rdf:Description> </rdf:RDF> <rdf:type rdf:resource=".../Person"/> </rdf:Description> </rdf:RDF> mations for the same RDF data 5 / 51
  • 22. Why SPARQL is not enough: Great for querying RDF! Easy to output Turtle or SPARQL XML results format ... prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.rdf> where { $X vc:FN $FN .} ... but 6 / 51
  • 23. Why SPARQL is not enough: Great for querying RDF! Easy to output Turtle or SPARQL XML results format ... prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.rdf> where { $X vc:FN $FN .} ... but How to produce arbitrary XML??? 6 / 51
  • 24. XSPARQL Transformation language XML and RDF formats (based on XQuery and SPARQL) 7 / 51
  • 25. XSPARQL Transformation language XML and RDF formats (based on XQuery and SPARQL) Lifting and Lowering in a single language 7 / 51
  • 26. Outline Overview
  • 27. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics
  • 28. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL
  • 29. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 30. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 31. XPath XPath is used to locate nodes in XML trees An XPath expression is a sequence of steps separated by /. Each step evaluates to a sequence of nodes. relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> Full spec at http://www.w3.org/TR/xpath20/. Tutorial at http://www.w3schools.com/xpath/default.asp. 8 / 51
  • 32. XPath XPath is used to locate nodes in XML trees An XPath expression is a sequence of steps separated by /. Each step evaluates to a sequence of nodes. relations.xml <relations> relations node <person name="Alice"> is the root ele- <knows>Bob</knows> <knows>Charles</knows> ment </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> Full spec at http://www.w3.org/TR/xpath20/. Tutorial at http://www.w3schools.com/xpath/default.asp. 8 / 51
  • 33. XPath XPath is used to locate nodes in XML trees An XPath expression is a sequence of steps separated by /. Each step evaluates to a sequence of nodes. relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> 3 child elements </person> <person name="Bob"> person with at- <knows>Charles</knows> tribute name </person> <person name="Charles"/> </relations> Full spec at http://www.w3.org/TR/xpath20/. Tutorial at http://www.w3schools.com/xpath/default.asp. 8 / 51
  • 34. XPath XPath is used to locate nodes in XML trees An XPath expression is a sequence of steps separated by /. Each step evaluates to a sequence of nodes. relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> Each person el- </person> ement can have <person name="Charles"/> knows childs </relations> Full spec at http://www.w3.org/TR/xpath20/. Tutorial at http://www.w3schools.com/xpath/default.asp. 8 / 51
  • 35. XPath Steps Step examples /relations Selects the root element relations relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 9 / 51
  • 36. XPath Steps Step examples /relations Selects the root element relations /relations/person Selects all person elements that are children of relations relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 9 / 51
  • 37. XPath Steps Step examples /relations Selects the root element relations /relations/person Selects all person elements that are children of relations //knows Selects all knows elements (in all the document) relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 9 / 51
  • 38. XPath Predicates Predicate examples /relations/person[3] Selects the third person child of relations relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 10 / 51
  • 39. XPath Predicates Predicate examples /relations/person[3] Selects the third person child of relations /relations/person[position()<3] Selects the first two person children of relations relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 10 / 51
  • 40. XPath Predicates Predicate examples /relations/person[3] Selects the third person child of relations /relations/person[position()<3] Selects the first two person children of relations //person[@name=’Alice’] Selects all person elements which the value of the name attribute is ’Alice’ relations.xml <relations> <person name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 10 / 51
  • 41. XQuery XQuery Query language for XML (different requirements than XSLT) functional language typed language Superset of XPath Overview of the formal semantics (Normalisation rules, Static Typing and Dynamic Evaluation) XQuery spec: http://www.w3.org/TR/xquery/. XQuery and XPath Formal Semantics: http://www.w3.org/TR/xquery-semantics/. 11 / 51
  • 42. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 43. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 44. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 45. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 46. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 47. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 48. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 49. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 50. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query Example: Convert our relations data into RDF/XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name where $nameA = "Alice" return <foaf:Person>{$nameA, for $nameB in $person/knows let $friend := <foaf:Person name="{$nameB}"/> order by $nameB return <foaf:knows>{$friend}</foaf:knows> }</foaf:Person> 12 / 51
  • 51. Schematic view on XQuery Prolog: P declare namespace prefix="namespace-URI " Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by XPath-expression Head: R return XML + nested XQuery Query result <foaf:Person xmlns:foaf="http://xmlns.com/foaf/0.1/" name="Alice"> <foaf:knows> <foaf:Person name="Bob"/> </foaf:knows> <foaf:knows> <foaf:Person name="Charles"/> </foaf:knows> </foaf:Person> 12 / 51
  • 52. Positional variable at Query example: add an id attribute to the relations data for $person at $pos in doc("relations.xml")//person return <person id="{$pos}"> {$person/@*, $person/*} </person> $pos refers to the position of $person in the for expression 13 / 51
  • 53. Positional variable at Query example: add an id attribute to the relations data for $person at $pos in doc("relations.xml")//person return <person id="{$pos}"> {$person/@*, $person/*} </person> $pos refers to the position of $person in the for expression Query result <person id="1" name="Alice"> <knows>Bob</knows> <knows>Charles</knows> </person> <person id="2" name="Bob"> <knows>Charles</knows> </person> <person id="3" name="Charles"/> 13 / 51
  • 54. XQuery Formal semantics Normalisation rules Normalisation rules are rewriting rules that translate XQuery into a simplified version (XQuery Core). 14 / 51
  • 55. XQuery Formal semantics Normalisation rules Normalisation rules are rewriting rules that translate XQuery into a simplified version (XQuery Core). Rule application 1 Static Analysis: Apply normalisation rules and static type analysis 2 Dynamic Evaluation Rules: evaluate expressions 14 / 51
  • 56. XQuery Formal semantics Normalisation rules Normalisation rules are rewriting rules that translate XQuery into a simplified version (XQuery Core). Rule application 1 Static Analysis: Apply normalisation rules and static type analysis 2 Dynamic Evaluation Rules: evaluate expressions Environments statEnv contains information needed for performing static type analysis. E.g. varType, funcType, . . . 14 / 51
  • 57. XQuery Formal semantics Normalisation rules Normalisation rules are rewriting rules that translate XQuery into a simplified version (XQuery Core). Rule application 1 Static Analysis: Apply normalisation rules and static type analysis 2 Dynamic Evaluation Rules: evaluate expressions Environments statEnv contains information needed for performing static type analysis. E.g. varType, funcType, . . . dynEnv contains information needed for the evaluation of expressions. E.g. varValue, . . . 14 / 51
  • 58. Semantics - Normalisation rules example for Example for $i in (1, 2), $j in (3, 4) return <pair>{ ($i,$j) }</pair> 15 / 51
  • 59. Semantics - Normalisation rules example for Example for $i in (1, 2), $j in (3, 4) return <pair>{ ($i,$j) }</pair> for Normalised example for $i in (1, 2) return for $j in (3, 4) return <pair>{ ($i,$j) }</pair> 15 / 51
  • 60. Semantics - Normalisation rules example For Normalisation   for $VarName 1 in Expr 1 , · · · ,  $VarName n in Expr n  ReturnClause Expr == for $VarName 1 in [Expr 1]Expr return ··· for $VarName n in [Expr n]Expr [ReturnClause]Expr ] 16 / 51
  • 61. Semantics - Static typing example For Static Type Analysis statEnv Expr 1 : Type 1 statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2 for $Variable in Expr 1 statEnv return Expr 2 : Type 2 · quantifier(Type 1 ) 17 / 51
  • 62. Semantics - Static typing example : means Expr 1 is of type Type 1 For Static Type Analysis statEnv Expr 1 : Type 1 statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2 for $Variable in Expr 1 statEnv return Expr 2 : Type 2 · quantifier(Type 1 ) 17 / 51
  • 63. Semantics - Static typing example + means extend : means Expr 1 is the environment of type Type 1 For Static Type Analysis statEnv Expr 1 : Type 1 statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2 for $Variable in Expr 1 statEnv return Expr 2 : Type 2 · quantifier(Type 1 ) 17 / 51
  • 64. Semantics - Static typing example + means extend : means Expr 1 is the environment of type Type 1 For Static Type Analysis statEnv Expr 1 : Type 1 statEnv + varType(Variable ⇒ Type 1 ) Expr 2 : Type 2 for $Variable in Expr 1 statEnv return Expr 2 : Type 2 · quantifier(Type 1 ) quantifier estimates the number of solutions: *, + or ? 17 / 51
  • 65. Semantics - Dynamic evaluation rules Simple for example for $i in (1, 2) return $i+1 18 / 51
  • 66. Semantics - Dynamic evaluation rules For each result in the expression Simple for example for $i in (1, 2) return $i+1 18 / 51
  • 67. Semantics - Dynamic evaluation rules For each result in the expression Simple for example Variable $i is as- for $i in (1, 2) return $i+1 signed the corre- sponding value 18 / 51
  • 68. Semantics - Dynamic evaluation rules For each result in the expression Simple for example Variable $i is as- for $i in (1, 2) return $i+1 signed the corre- sponding value Return expresion is evaluated 18 / 51
  • 69. Semantics - Dynamic evaluation rules Simple for example for $i in (1, 2) return $i+1 For Dynamic Evaluation (Simplified) dynEnv Expr 1 ⇒ Item1 , . . . , Itemn dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1 ··· dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n for $Variable in Expr 1 dynEnv return Expr 2 ⇒ Value 1 , · · · , Value n 18 / 51
  • 70. Semantics - Dynamic evaluation rules Simple for example for $i in (1, 2) return $i+1 ⇒ means Expr 1 eval- uates to the sequence Item1 , . . . , Itemn For Dynamic Evaluation (Simplified) dynEnv Expr 1 ⇒ Item1 , . . . , Itemn dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1 ··· dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n for $Variable in Expr 1 dynEnv return Expr 2 ⇒ Value 1 , · · · , Value n 18 / 51
  • 71. Semantics - Dynamic evaluation rules Simple for example For each Itemi2)add Variable for $i in (1, , return $i+1 ⇒ means Expr 1 eval- ⇒ Itemi to dynEnv and uates to the sequence evaluate Expr 2 Item1 , . . . , Itemn For Dynamic Evaluation (Simplified) dynEnv Expr 1 ⇒ Item1 , . . . , Itemn dynEnv + varValue(Variable ⇒ Item1 ) Expr 2 ⇒ Value 1 ··· dynEnv + varValue(Variable ⇒ Itemn ) Expr 2 ⇒ Value n for $Variable in Expr 1 dynEnv return Expr 2 ⇒ Value 1 , · · · , Value n 18 / 51
  • 72. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 73. SPARQL (in 3 slides) SPARQL Query language for RDF SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/. SPARQL 1.1 Tutorial: http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf. 19 / 51
  • 74. SPARQL (in 3 slides) SPARQL Query language for RDF RDF represents data as triples: Subject, Predicate, Object. An RDF Graph is a set of triples. SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/. SPARQL 1.1 Tutorial: http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf. 19 / 51
  • 75. SPARQL (in 3 slides) SPARQL Query language for RDF RDF represents data as triples: Subject, Predicate, Object. An RDF Graph is a set of triples. SPARQL queries RDF data by pattern matching: given a set of triple patterns, finds the corresponding triples in the input graph SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/. SPARQL 1.1 Tutorial: http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf. 19 / 51
  • 76. SPARQL (in 3 slides) SPARQL Query language for RDF RDF represents data as triples: Subject, Predicate, Object. An RDF Graph is a set of triples. SPARQL queries RDF data by pattern matching: given a set of triple patterns, finds the corresponding triples in the input graph Actually, matched against the scoping graph: a graph equivalent to the input graph but does not share any blank nodes with it or the query. SPARQL spec: http://www.w3.org/TR/rdf-sparql-query/. SPARQL 1.1 Tutorial: http://polleres.net/presentations/20101019SPARQL1.1Tutorial.pdf. 19 / 51
  • 77. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 78. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 79. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 80. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 81. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 82. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 83. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 84. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> construct { $X foaf:name $FN.} from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 85. Schematic view on SPARQL Prolog: P prefix prefix: <namespace-URI > Head: C construct { template } select variableList Body: D from / from named <dataset-URI > W where { pattern } M order by expression limit integer > 0 offset integer > 0 Query Example: Convert between different RDF vocabularies prefix vc: <http://www.w3.org/2001/vcard-rdf/3.0#> prefix foaf: <http://xmlns.com/foaf/0.1/> select $X $FN from <vCard.ttl> where { $X vc:FN $FN .} order by $FN limit 1 offset 1 20 / 51
  • 86. SPARQL select solutions Solutions for SPARQL select queries are substitutions for the variables present in the head (variableList) 21 / 51
  • 87. SPARQL select solutions Solutions for SPARQL select queries are substitutions for the variables present in the head (variableList) Can be represented as XML SPARQL XML Results Format (previous query) <sparql xmlns="http://www.w3.org/2005/sparql-results#"> <head> <variable name="X"/> <variable name="FN"/> </head> <results> <result> <binding name="X"><bnode>b0</bnode></binding> <binding name="FN"><literal>Nuno Lopes</literal></binding> </result> </results> </sparql> 21 / 51
  • 88. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 89. XSPARQL Transformation language Consume and generate XML and RDF 22 / 51
  • 90. XSPARQL Transformation language Consume and generate XML and RDF Syntactic extension of XQuery 22 / 51
  • 91. XSPARQL Transformation language Consume and generate XML and RDF Syntactic extension of XQuery With a formally defined semantics (based on the XQuery semantics) 22 / 51
  • 92. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 93. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 94. XSPARQL: Combining XQuery with SPARQL prefix Prolog: P declare namespace prefix="namespace-URI " declarations or prefix prefix: <namespace-URI > Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 95. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Data input Body: F for var in XPath-expression L let var := XPath-expression (XML or RDF) W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 96. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Data output Head: C construct { template (with nested XSPARQL) } or (XML or RDF) R return XML + nested XSPARQL 23 / 51
  • 97. XSPARQL: Combining XQuery with SPARQL XQuery or Prolog: P declare namespace prefix="namespace-URI " SPARQL or prefix prefix: <namespace-URI > prefix Body: F for var in XPath-expression L let var := XPath-expression declarations W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 98. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Any XQuery Body: F for var in XPath-expression L let var := XPath-expression query W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 99. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by expression or SPARQLForClause F’ for varlist D from / from named <dataset-URI > represents a W where {pattern } SPARQL query M order by expression limit integer > 0 offset integer > 0 Head: C construct { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 100. XSPARQL: Combining XQuery with SPARQL Prolog: P declare namespace prefix="namespace-URI " or prefix prefix: <namespace-URI > Body: F for var in XPath-expression L let var := XPath-expression W where XPath-expression O order by expression or F’ for varlist D from / from named <dataset-URI > W where {pattern } M order by expression limit integer > 0 construct offset integer > 0 creates RDF Head: C construct output { template (with nested XSPARQL) } or R return XML + nested XSPARQL 23 / 51
  • 101. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name, $nameB in $person/knows construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } 24 / 51
  • 102. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; XQuery for for $person in doc("relations.xml")//person, data selec- $nameA in $person/@name, $nameB in $person/knows tion construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } 24 / 51
  • 103. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; construct for $person in doc("relations.xml")//person, clause gen- $nameA in $person/@name, erates RDF $nameB in $person/knows construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } 24 / 51
  • 104. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name, $nameB in $person/knows construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } 24 / 51
  • 105. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; Nesting produces for $person in doc("relations.xml")//person, $nameA in $person/@name, an RDF literal $nameB in $person/knows construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } 24 / 51
  • 106. Query Example - Lifting Convert our relations data into RDF declare namespace foaf = "http://xmlns.com/foaf/0.1/"; for $person in doc("relations.xml")//person, $nameA in $person/@name, $nameB in $person/knows construct { [ foaf:name {data($nameA)}; a foaf:Person ] foaf:knows [ foaf:name {data($nameB)}; a foaf:Person ]. } Query result @prefix foaf: <http://xmlns.com/foaf/0.1/> . [ foaf:name "Alice"; a foaf:Person; foaf:knows [ foaf:name "Bob"; a foaf:Person ] ]. [ foaf:name "Alice"; a foaf:Person; foaf:knows [ foaf:name "Charles"; a foaf:Person ] ]. [ foaf:name "Bob"; a foaf:Person; foaf:knows [ foaf:name "Charles"; a foaf:Person ] ]. 24 / 51
  • 107. Nesting in construct clauses Nesting operators {Expr} The result of evaluating Expr will be an RDF literal 25 / 51
  • 108. Nesting in construct clauses Nesting operators {Expr} The result of evaluating Expr will be an RDF literal :{Expr} Same but for RDF blank nodes <{Expr}> and IRIs 25 / 51
  • 109. Query Example - Lifting (II) Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) for $p in $persons let $id := fn:index-of($ids, $p/@name) construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 26 / 51
  • 110. Query Example - Lifting (II) Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) Keep person iden- for $p in $persons let $id := fn:index-of($ids, $p/@name) tifiers construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 26 / 51
  • 111. Query Example - Lifting (II) Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) For each person for $p in $persons let $id := fn:index-of($ids, $p/@name) lookup their id construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 26 / 51
  • 112. Query Example - Lifting (II) Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) The same for each for $p in $persons let $id := fn:index-of($ids, $p/@name) person then know construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 26 / 51
  • 113. Query Example - Lifting (II) Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) for $p in $persons let $id := fn:index-of($ids, $p/@name) construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } Query result (reformatted output) @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:b1 a foaf:Person; foaf:name "Alice"; foaf:knows _:b2, _:b3 . _:b2 a foaf:Person; foaf:name "Bob"; foaf:knows _:b3 . _:b3 a foaf:Person; foaf:name "Charles" . 26 / 51
  • 114. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } order by $Name return <person name="{$Name}"> { for $FName from <relations.rdf> where { $Person foaf:knows $Friend . $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 115. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } order by $Name XML con- return <person name="{$Name}"> { for $FName from <relations.rdf> struction where { $Person foaf:knows $Friend . $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 116. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } SPARQL for order by $Name query: “Give me return <person name="{$Name}"> { for $FName from <relations.rdf> persons and their where { $Person foaf:knows $Friend . names” $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 117. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } SPARQL for order by $Name query: “Give me return <person name="{$Name}"> { for $FName from <relations.rdf> persons and their SPARQL variables where { $Person foaf:knows $Friend . names” are $-prefixedfoaf:name $Name. $Person $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 118. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } order by $Name XML con- return <person name="{$Name}"> { for $FName from <relations.rdf> struction where { $Person foaf:knows $Friend . $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 119. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> SPARQL for where { $Person foaf:name $Name } query: “Give me order by $Name return <person name="{$Name}"> the persons each { for $FName from <relations.rdf> one knows” where { $Person foaf:knows $Friend . $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 120. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> SPARQL for where { $Person foaf:name $Name } query: “Give me order by $Name return <person name="{$Name}"> the persons each { for $FName from <relations.rdf> one knows” where { $Person foaf:knows $Friend . $Person and $Person foaf:name $Name. $Friend foaf:name $FName. } $Name instanti- return <knows> { $FName }</knows>} ated by the outer </person>} </relations> loop 27 / 51
  • 121. Query Example - Lowering Convert FOAF RDF data into XML declare namespace foaf = "http://xmlns.com/foaf/0.1/"; <relations> { for $Person $Name from <relations.rdf> where { $Person foaf:name $Name } order by $Name XML con- return <person name="{$Name}"> { for $FName from <relations.rdf> struction where { $Person foaf:knows $Friend . $Person foaf:name $Name. $Friend foaf:name $FName. } return <knows> { $FName }</knows>} </person>} </relations> 27 / 51
  • 122. Query Example - Lowering result Query result <relations> <person name="Alice"> <knows>Charles</knows> <knows>Bob</knows> </person> <person name="Bob"> <knows>Charles</knows> </person> <person name="Charles"/> </relations> 28 / 51
  • 123. Online Demo Online Demo at: http://xsparql.deri.org/demo/ Try it for yourself! 29 / 51
  • 124. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 125. XSPARQL Formal Semantics Extend the XQuery semantics Adding the normalisation, static type and dynamic evaluation rules for the new expressions: SPARQL for clause construct clause 30 / 51
  • 126. Formal semantics types Newly defined types RDFTerm is the type of SPARQL variables, with the subtypes: uri bnode literal 31 / 51
  • 127. Formal semantics types Newly defined types RDFTerm is the type of SPARQL variables, with the subtypes: uri bnode literal RDFGraph will be the type of construct expressions 31 / 51
  • 128. Formal semantics types Newly defined types RDFTerm is the type of SPARQL variables, with the subtypes: uri bnode literal RDFGraph will be the type of construct expressions PatternSolution is a pair (variableName, RDFTerm) representing SPARQL variable bindings 31 / 51
  • 129. SPARQL for - Static Type Analysis statEnv + varType(Variable 1 ⇒ RDFTerm; ··· ; Variable n ⇒ RDFTerm ) ReturnExpr : Type 2 for $Variable 1 · · · $Variable n DatasetClause statEnv where GroupGraphPattern SolutionModifier return ReturnExpr : Type 2 ∗ 32 / 51
  • 130. SPARQL for - Static Type Analysis statEnv + varType(Variable 1 ⇒ RDFTerm; $Variable 1 · · · $Variable n ··· ; are of type RDFTerm Variable n ⇒ RDFTerm ) ReturnExpr : Type 2 for $Variable 1 · · · $Variable n DatasetClause statEnv where GroupGraphPattern SolutionModifier return ReturnExpr : Type 2 ∗ 32 / 51
  • 131. SPARQL for - Static Type Analysis ∗ comes from the sequence of statEnv + varType(Variable 1 ⇒ RDFTerm; results SPARQL ··· ; Variable n ⇒ RDFTerm ) ReturnExpr : Type 2 for $Variable 1 · · · $Variable n DatasetClause statEnv where GroupGraphPattern SolutionModifier return ReturnExpr : Type 2 ∗ 32 / 51
  • 132. Example: Simple SPARQL for Simple SPARQL for example for $s $p $o from <foaf.rdf> where { $s $p $o } return ($s, $p, $o) 33 / 51
  • 133. Example: Simple SPARQL for For each SPARQL result Simple SPARQL for example for $s $p $o from <foaf.rdf> where { $s $p $o } return ($s, $p, $o) 33 / 51
  • 134. Example: Simple SPARQL for For each SPARQL result Simple SPARQL for example Variables are as- for $s $p $o from <foaf.rdf> where { $s $p $o } signed values return ($s, $p, $o) 33 / 51
  • 135. Example: Simple SPARQL for For each SPARQL result Simple SPARQL for example Variables are as- for $s $p $o from <foaf.rdf> where { $s $p $o } signed values return ($s, $p, $o) Return expresion is evaluated 33 / 51
  • 136. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; Variable n ⇒ fs:value(PS 1 , Variable n ) ) ReturnExpr ⇒ Value 1 . . . dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); ...; Variable n ⇒ fs:value(PS m , Variable n ) ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 137. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; The results of Variable n ⇒ fs:value(PS 1 , Variable n ) the SPARQL ) ReturnExpr ⇒ Value 1 query . . . dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); ...; Variable n ⇒ fs:value(PS m , Variable n ) ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 138. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; The results of Variable n ⇒ fs:value(PS 1 , Variable n ) the SPARQL ) ReturnExpr ⇒ Value 1 query . . . dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); ...; fs:sparql evaluates Variable n ⇒ fs:value(PS m , Variable n ) a SPARQL query ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 139. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; Variable n ⇒ fs:value(PS 1 , Variable n ) For each PS ) ReturnExpr ⇒ Value 1 add the values . . . of the variables dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); to dynEnv ...; Variable n ⇒ fs:value(PS m , Variable n ) ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 140. SPARQL for - Dynamic Evaluation fs:value selects dynEnv fs:sparql(DatasetClause, GroupGraphPattern, the value of SolutionModifier ) ⇒ PS 1 , . . . , PS m VariabledynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); i from the PS ...; Variable n ⇒ fs:value(PS 1 , Variable n ) For each PS ) ReturnExpr ⇒ Value 1 add the values . . . of the variables dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); to dynEnv ...; Variable n ⇒ fs:value(PS m , Variable n ) ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 141. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; Variable n ⇒ fs:value(PS 1 , Variable n ) For each PS ) ReturnExpr ⇒ Value 1 add the values . . . of the variables dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); to dynEnv ...; Variable n ⇒ fs:value(PS m , Variable n ) ) ReturnExpr ⇒ Value m for $Variable 1 · · · $Variable n dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 142. SPARQL for - Dynamic Evaluation dynEnv fs:sparql(DatasetClause, GroupGraphPattern, SolutionModifier ) ⇒ PS 1 , . . . , PS m dynEnv + varValue(Variable 1 ⇒ fs:value(PS 1 , Variable 1 ); ...; Variable n ⇒ fs:value(PS 1 , Variable n ) ) ReturnExpr ⇒ Value 1 . . . The result dynEnv + varValue(Variable 1 ⇒ fs:value(PS m , Variable 1 ); of ...; the expression Variable n ⇒ fs:value(PS m , Variable n ) is the sequence ) ReturnExpr ⇒ Value m of computed for $Variable 1 · · · $Variable n Value s dynEnv where GroupGraphPattern SolutionModifier return ReturnExpr ⇒ Value 1 , . . . , Value m 34 / 51
  • 143. construct expressions construct ConstructTemplate Expr == return fs:evalTemplate [ConstructTemplate ]normaliseTemplate 35 / 51
  • 144. construct expressions [·]normaliseTemplate ex- ] pands any Turtle short- construct ConstructTemplateits argument cuts in Expr == return fs:evalTemplate [ConstructTemplate ]normaliseTemplate 35 / 51
  • 145. construct expressions fs:evalTemplate vali- dates the created triples construct ConstructTemplate Expr == return fs:evalTemplate [ConstructTemplate ]normaliseTemplate 35 / 51
  • 146. Outline Overview XPath & XQuery XPath XQuery XQuery Semantics SPARQL XSPARQL Syntax Semantics Implementation XSPARQL Features Query examples
  • 147. Implementation 36 / 51
  • 148. Implementation Each XSPARQL query is rewritten into an XQuery 36 / 51
  • 149. Implementation Each XSPARQL query is rewritten into an XQuery SPARQLForClauses are translated into SPARQL SELECT queries and executed using a SPARQL engine 36 / 51
  • 150. Lifting: Rewriting to XQuery Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) for $p in $persons let $id := fn:index-of($ids, $p/@name) construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 37 / 51
  • 151. Lifting: Rewriting to XQuery Convert our relations data into RDF declare namespace foaf="http://xmlns.com/foaf/0.1/"; let $persons := doc("relations.xml")//person let $ids := data($persons/@name) for $p in $persons let $id := fn:index-of($ids, $p/@name) construct { _:b{$id} a foaf:Person; foaf:name {data($p/@name)}. { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } 37 / 51
  • 152. Lifting: Rewriting to XQuery Convert our relations data into RDF (partial) { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } Rewritten XQuery (and re-rewritten for presentation purposes) for $k at $k_pos in $p/knows let $kid := fn:index-of( $ids, $k ) return let $_rdf8 := _xsparql:_binding_term( "_:b", $id, "", "" ) let $_rdf9 := _xsparql:_binding_term( "_:b", $kid, "", "" ) return _xsparql:_serialize(( if (_xsparql:_validSubject($_rdf8) and _xsparql:_validObject($_rdf9)) then ($_rdf8, " foaf:knows ", _xsparql:_rdf_term( $_rdf9 ), " .&#xA;") else "") ) ) ) 37 / 51
  • 153. Lifting: Rewriting to XQuery Convert our relations data into RDF (partial) { for $k in $p/knows let $kid := fn:index-of($ids, $k) construct { _:b{$id} foaf:knows _:b{$kid} } } } Rewritten XQuery (and re-rewritten for presentation purposes) for $k at $k_pos in $p/knows let $kid := fn:index-of( $ids, $k ) return let $_rdf8 := _xsparql:_binding_term( "_:b", $id, "", "" ) let $_rdf9 := _xsparql:_binding_term( "_:b", $kid, "", "" ) return _xsparql:_serialize(( Create (_xsparql:_validSubject($_rdf8) and _xsparql:_validObject($_rdf9)) if variables of then type RDFTerm " foaf:knows ", _xsparql:_rdf_term( $_rdf9 ), " .&#xA;") ($_rdf8, for eachelse "") constructed ) ) ) term 37 / 51