SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Towards XSPARQL 1.1: New Features
         and Optimization

     XML          XSPARQL             RDF
             New Features and
          Faster Query Evaluation
               for XSPARQL

   Master’s Thesis Presentation of Stefan Bischof
                 October 1, 2010
Data Representation
XML (Extensible Markup Language) is a markup
language designed for data exchange over the internet.
Documents and other data are represented as trees.
RDF (Resource Description Framework) is a
framework for describing arbitrary resources.
Resources and their relations are represented as
directed graphs. Mainly used for Semantic Web data.




          XML        XSPARQL          RDF
Example Data


                 knows           knows




                         knows




The ‘knows’ relation is directed; Charles knows
nobody in this example.
RDF and XML
relations.xml                                              relations.rdf
      <relations>
         <person name="Alice">                             @prefix foaf: <http://xmlns.com/foaf/0.1/> .
           <knows>Bob</knows>                              _:b1 a foaf:Person;
           <knows>Charles</knows>                               foaf:name "Alice";
         </person>                                              foaf:knows _:b2;
         <person name="Bob">                                    foaf:knows _:b3.
           <knows>Charles</knows>                          _:b2 a foaf:Person; foaf:name "Bob";
         </person>                                              foaf:knows _:b3.
         <person name="Charles"/>                          _:b3 a foaf:Person; foaf:name "Charles".
      </relations>



                           relations
                                                                                              foaf:Person                            Charles
                                                                                                                        rdf:type
                                                                    Alice
        person                    person         person
                                                                                                rdf:type            Bob
                                                                                   rdf:type
                                                                                                                                      foaf:name
                                                              foaf:name
                                                                                                            foaf:name

name    knows    knows        name     knows     name        _:b1           foaf:knows                _:b2              foaf:knows        _:b3




Alice    Bob     Charles       Bob     Charles   Charles                                           foaf:knows
XQuery + SPARQL = XSPARQL
XQuery is a functional query language designed for
processing XML data. Large function library; superset of
XPath 2.0
SPARQL is a query language for RD. It uses graph
patterns to filter RDF data.




          XML        XSPARQL          RDF
What’s XSPARQL?
Simplifies data transformation by combining the
advantages of XQuery and SPARQL:
Provides RDF graph pattern matching to XQuery ➔
serialization format agnostic access to RDF data
SPARQL gains access to large XQuery function library
+ subqueries




          XML       XSPARQL          RDF
XSPARQL Example
Convert from RDF to
XML
                           for $name from <people.rdf>
                           where {
For each person P:           $person a foaf:Person .
                             $person foaf:name $name . }
 Print P’s name            return
                             <person name=”{$name}”> {
                             for $fname from <people.rdf>
 For each friend F of P:     where { $pers1 foaf:name $name.
                               $pers1 foaf:knows $friend .
                               $friend foaf:name $fname . }
   Print F’s name            return
                               <knows name=”{$fname}”/>
                             }
                             </person>
XSPARQL Summary


 XQuery   SPARQL



XML           RDF
XSPARQL Summary


 XQuery    SPARQL



XML   XSPARQL   RDF
Implementation

  Input
             XSPARQL               XML             RDF
               query               data            data


  Query      XSPARQL     XQuery   XQuery       SPARQL
processing    rewriter    query    engine       engine
                                            HTTP


 Output                           XML or
                                   RDF
Query Evaluation
XQuery    SPARQL



                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                   SELECT $name
XQuery    SPARQL   FROM <people.rdf>
                   WHERE {
                     $person a foaf:Person .
                     $person foaf:name $name . }


                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                       SELECT $name
XQuery    SPARQL       FROM <people.rdf>
                       WHERE {
                         $person a foaf:Person .
                         $person foaf:name $name . }


                      for $name from <people.rdf>
                      where {
                         $person a foaf:Person .
                         $person foaf:name $name . }
                      return
                         <person name=”{$name}”> {
                         for $fname from <people.rdf>
               #    $namewhere { $pers1 foaf:name $name.
                           $pers1 foaf:knows $friend .
               1    “Alice”$friend foaf:name $fname . }
                         return
               2    “Bob” <knows name=”{$fname}”/>
                         }
               3   “Charles”
                         </person>
Query Evaluation
XQuery    SPARQL



                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                   SELECT $fname
XQuery    SPARQL   FROM <people.rdf>
                   WHERE { $pers1 foaf:name “Alice” .
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }


                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                      SELECT $fname
XQuery    SPARQL      FROM <people.rdf>
                      WHERE { $pers1 foaf:name “Alice” .
                          $pers1 foaf:knows $friend .
                          $friend foaf:name $fname . }


                      for $name from <people.rdf>
                      where {
                        $person a foaf:Person .
                        $person foaf:name $name . }
                      return
                        <person name=”{$name}”> {
                        for $fname from <people.rdf>
                        where { $pers1 foaf:name $name.
                          $pers1 foaf:knows $friend .
               #   $fname $friend foaf:name $fname . }
                        return
               1    “Bob” <knows name=”{$fname}”/>
                        }
               2        </person>
                   “Charles”
Query Evaluation
XQuery    SPARQL



                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                   SELECT $fname
XQuery    SPARQL   FROM <people.rdf>
                   WHERE { $pers1 foaf:name “Bob” .
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }


                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                      SELECT $fname
XQuery    SPARQL      FROM <people.rdf>
                      WHERE { $pers1 foaf:name “Bob” .
                          $pers1 foaf:knows $friend .
                          $friend foaf:name $fname . }


                      for $name from <people.rdf>
                      where {
                        $person a foaf:Person .
                        $person foaf:name $name . }
                      return
                        <person name=”{$name}”> {
                        for $fname from <people.rdf>
                        where { $pers1 foaf:name $name.
                          $pers1 foaf:knows $friend .
                          $friend foaf:name $fname . }
                        return
               #   $fname
                        }
                          <knows name=”{$fname}”/>

                        </person>
               1   “Charles”
Query Evaluation
XQuery    SPARQL



                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                   SELECT $fname
XQuery    SPARQL   FROM <people.rdf>
                   WHERE { $pers1 foaf:name “Charles” .
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }

                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
Query Evaluation
                     SELECT $fname
XQuery    SPARQL     FROM <people.rdf>
                     WHERE { $pers1 foaf:name “Charles” .
                         $pers1 foaf:knows $friend .
                         $friend foaf:name $fname . }

                     for $name from <people.rdf>
                     where {
                       $person a foaf:Person .
                       $person foaf:name $name . }
                     return
                       <person name=”{$name}”> {
                       for $fname from <people.rdf>
                       where { $pers1 foaf:name $name.
                         $pers1 foaf:knows $friend .
                         $friend foaf:name $fname . }
                       return
                         <knows name=”{$fname}”/>
                       }
               #   $fname
                       </person>
Query Evaluation
XQuery    SPARQL



                   for $name from <people.rdf>
                   where {
                     $person a foaf:Person .
                     $person foaf:name $name . }
                   return
                     <person name=”{$name}”> {
                     for $fname from <people.rdf>
                     where { $pers1 foaf:name $name.
                       $pers1 foaf:knows $friend .
                       $friend foaf:name $fname . }
                     return
                       <knows name=”{$fname}”/>
                     }
                     </person>
RDF to XML


relations.xml                       relations.rdf
      <relations>
         <person name="Alice">      @prefix foaf: <http://xmlns.com/foaf/0.1/> .
           <knows>Bob</knows>       _:b1 a foaf:Person;
           <knows>Charles</knows>        foaf:name "Alice";
         </person>                       foaf:knows _:b2;
         <person name="Bob">             foaf:knows _:b3.
           <knows>Charles</knows>   _:b2 a foaf:Person; foaf:name "Bob";
         </person>                       foaf:knows _:b3.
         <person name="Charles"/>   _:b3 a foaf:Person; foaf:name "Charles".
      </relations>
XDEP Join Optimization
Goal: Improve performance for nested queries
Reduce number of SPARQL calls: N ➔ 1
    only one single SPARQL call for the inner loop
    join is performed later using XQuery
Constraint: applicable only for dependent joins
    join variable always bound
Saves communication and repeated evaluation time
XDEP Join Optimization
XQuery   SPARQL



                  for $name from <people.rdf>
                  where {
                    $person a foaf:Person .
                    $person foaf:name $name . }
                  return
                    <person name=”{$name}”> {
                    for $fname from <people.rdf>
                    where { $pers1 foaf:name $name.
                      $pers1 foaf:knows $friend .
                      $friend foaf:name $fname . }
                    return
                      <friend name=”{$fname}”/>
                    }
                    </person>
XDEP Join Optimization
XQuery   SPARQL



                  for $name from <people.rdf>
                  where {
                    $person a foaf:Person .
                    $person foaf:name $name . }
                  return
                    <person name=”{$name}”> {
                    for $fname from <people.rdf>
                    where { $pers1 foaf:name $name.
                      $pers1 foaf:knows $friend .
                      $friend foaf:name $fname . }
                    return
                      <friend name=”{$fname}”/>
                    }
                    </person>
Practical Performance Evaluation
Use common XQuery benchmark suite XMark
Generate test documents of different sizes (5-100MB)
Automatically translate test documents to RDF
Manually translate queries from XQuery to XSPARQL
Compare standard XSPARQL with optimized
XSPARQL
XSPARQL Performance
                         10000



                         1000
 Evaluation time (sec)




                           100



                            10



                             1
                                 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
                                                    XMark Query #

5 MB Dataset                             XQuery              XSPARQL
XSPARQL Performance
                         10000

                                                               Nested SPARQL parts
                         1000
 Evaluation time (sec)




                           100



                            10



                             1
                                 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
                                                    XMark Query #

5 MB Dataset                             XQuery              XSPARQL
XDEP Performance Increase
                          1000
Performance gain factor




                                      Query 9
                          100
                                      Query 8

                                                                        Unoptimized time
                            10
                                                                         optimized time

                                     Query 10

                             1
                                 0              5          10              15       20
                                                    Dataset size (MB)
XDEP Performance Increase
                          1000
Performance gain factor




                                                                    Query 9
                          100
                                                                    Query 8



                            10


                                      Query 10

                             1
                                 10                 100                  1000       10000
                                                  Number of outer loop iterations
                                                 = number of saved SPARQL calls
New Features
Dataset Scoping
 Fixes unintended behavior of nested queries
Constructed Dataset
 Create and query temporary data source
New Features Dataset Scoping
Fixes unintended behavior of nested SPARQL parts
   Reuse variable bound to blank node in inner query
   Variable behaves as free/unbound variable again
   because
         Scope of blank node is limited to one
         dataset/SPARQL query
         Blank nodes in graph patterns are similar to
         unbound variables
Dataset Scoping extends the scope of a dataset
over subqueries and allows blank node joins
New Features Constructed Dataset
 Create intermediary RDF graphs to be used in
 the same query as data source
 Use cases
  Query aggregated data using XQuery’s built-in
  functions.
  Manually optimize queries by preselecting relevant
  parts of a data source.
Conclusions
Enhance XSPARQL Capabilities
   Constructed Dataset and Dataset Scoping features are
   valuable additions to XSPARQL
Increase Evaluation Performance
   Dependent join optimization XDEP offers a
   confirmed performance increase for nested
   XSPARQL queries
More info and demo http://xsparql.deri.org
References
Akhtar W., Kopecký J., Krennwallner T., and Pollers A. XSPARQL:Traveling between the
XML and RDF worlds - and Avoiding the XSLT pilgrimage. In 5th European Semantic
Web Conference (ESWC2008), pages 432–447, 2008.
Bischof S. Implementation and Optimization of Queries in XSPARQL. Master’s Thesis,
Vienna University of Technology, 2010.
Bray T., Paoli J., Sperberg-McQueen C. M., Maler E., and Yergeau F. Extensible Markup
Language (XML) 1.0 (Fifth Edition). http:// www.w3.org/TR/xml/, November 2008.
W3C Recommendation.
Boag S., Chamberlin D., Fernández M. F., Florescu D., Robie J., and Siméon J. XQuery
1.0: An XML Query Language. http://www.w3.org/TR/xquery/, January 2007.	

W3C
Recommendation.
Manola F. and Miller E. RDF Primer. http://www.w3.org/TR/rdf-primer/, February
2004. W3C Recommendation.
Prud’hommeaux E. and Seaborne A. SPARQL Query Language for RDF. http://
www.w3.org/TR/rdf-sparql-query/, January 2008. W3C Recommendation.
Example Dataset Scoping



          for $name $person from <people.rdf>
          where {
            $person a foaf:Person .
            $person foaf:name $name . }
          return
            <person name=”{$name}”> {
            for $fname from <people.rdf>
            where { $pers1 foaf:name $name.
              $person foaf:knows $friend .
              $friend foaf:name $fname . }
            return
              <friend name=”{$fname}”/>
            }
            </person>
Example Dataset Scoping



          for $name $person from <people.rdf>
          where {
            $person a foaf:Person .
            $person foaf:name $name . }
          return
            <person name=”{$name}”> {
            for $fname from <people.rdf>
            where { $pers1 foaf:name $name.
              $person foaf:knows $friend .
              $friend foaf:name $fname . }
            return
              <friend name=”{$fname}”/>
            }
            </person>
Example Dataset Scoping
                           #    $name $person
                           1    “Alice”  _:b1
                           2    “Bob”    _:b2
                           3   “Charles” _:b3

          for $name $person from <people.rdf>
          where {
            $person a foaf:Person .
            $person foaf:name $name . }
          return
            <person name=”{$name}”> {
            for $fname from <people.rdf>
            where { $pers1 foaf:name $name.
              $person foaf:knows $friend .
              $friend foaf:name $fname . }
            return
              <friend name=”{$fname}”/>
            }
            </person>
Example Dataset Scoping
                                                #    $name $person
                                                1    “Alice”  _:b1
                                                2    “Bob”    _:b2
                                                3   “Charles” _:b3

                               for $name $person from <people.rdf>
                               where {
                                 $person a foaf:Person .
                                 $person foaf:name $name . }
                               return
                                 <person name=”{$name}”> {
                                 for $fname from <people.rdf>
                                 where { $pers1 foaf:name $name.
                                   $person foaf:knows $friend .
                                   $friend foaf:name $fname . }
SELECT $fname                    return
FROM <people.rdf>                  <friend name=”{$fname}”/>
WHERE {                          }
  _:b1 foaf:knows $friend.       </person>
  $friend foaf:name $fname.}
Example Dataset Scoping
                                                 #    $name $person
                                                 1    “Alice”  _:b1
                                                 2    “Bob”    _:b2
                                                 3   “Charles” _:b3

                               for $name $person from <people.rdf>
                               where {
                                 $person a foaf:Person .
                                 $person foaf:name $name . }
                               return
                                 <person name=”{$name}”> {
                                 for $fname from <people.rdf>
                                 where { $pers1 foaf:name $name.
                                   $person foaf:knows $friend .
                                   $friend foaf:name $fname . }
SELECT $fname                    return
FROM <people.rdf>                  <friend name=”{$fname}”/> $fname
                                                           #
WHERE {                          }                         1   “Bob”
  _:b1 foaf:knows $friend.       </person>                 2   “Bob”
  $friend foaf:name $fname.}
                                                           3 “Charles”
Example Dataset Scoping
<person name=”Alice”>                             #    $name $person
  <friend name=”Bob” />
  <friend name=”Charles”   />                     1    “Alice”  _:b1
  <friend name=”Charles”   />                     2    “Bob”    _:b2
</person>                                         3   “Charles” _:b3
<person name=”Bob”>
  <friend name=”Bob” />
                                for $name $person from <people.rdf>
  <friend name=”Charles”   />
                                where {
  <friend name=”Charles”   />
                                  $person a foaf:Person .
</person>
                                  $person foaf:name $name . }
<person name=”Charles”>
                                return
  <friend name=”Bob” />
                                  <person name=”{$name}”> {
  <friend name=”Charles”   />
                                  for $fname from <people.rdf>
  <friend name=”Charles”   />
                                  where { $pers1 foaf:name $name.
</person>
                                    $person foaf:knows $friend .
                                    $friend foaf:name $fname . }
SELECT $fname                     return
FROM <people.rdf>                   <friend name=”{$fname}”/> $fname
                                                            #
WHERE {                           }                         1   “Bob”
  _:b1 foaf:knows $friend.        </person>                 2   “Bob”
  $friend foaf:name $fname.}
                                                            3 “Charles”
Example Dataset Scoping
<person name=”Alice”>                             #    $name $person
  <friend name=”Bob” />
  <friend name=”Charles”   />                     1    “Alice”  _:b1
  <friend name=”Charles”   />                     2    “Bob”    _:b2
</person>                                         3   “Charles” _:b3
<person name=”Bob”>
  <friend name=”Bob” />
                                for $name $person from <people.rdf>
  <friend name=”Charles”   />
                                where {
  <friend name=”Charles”   />
                                  $person a foaf:Person .
</person>
                                  $person foaf:name $name . }
<person name=”Charles”>
                                return
  <friend name=”Bob” />
                                  <person name=”{$name}”> {
  <friend name=”Charles”   />
                                  for $fname from <people.rdf>
  <friend name=”Charles”   />
                                  where { $pers1 foaf:name $name.
</person>
                                    $person foaf:knows $friend .
                                    $friend foaf:name $fname . }
SELECT $fname                     return
FROM <people.rdf>                   <friend name=”{$fname}”/> $fname
                                                            #
WHERE {                           }                         1   “Bob”
  _:b1 foaf:knows $friend.        </person>                 2   “Bob”
  $friend foaf:name $fname.}
                                                            3 “Charles”
Example Dataset Scoping
<person name=”Alice”>                              #   $name $person
  <friend name=”Bob” />
  <friend name=”Charles” />                        1  “Alice”    _:b1
        Problem:
  <friend name=”Charles” />                        2   “Bob”     _:b2
</person> Blank nodes scoped to
        1.                                         3 “Charles”   _:b3
<person name=”Bob”>
  <friend name=”Bob” /> query
        single SPARQL            for $name $person from <people.rdf>
        2. name=”Charles” />
           Blank nodes in graphwhere {
  <friend name=”Charles” />
  <friend
        patterns are like variables$person a foaf:Person . . }
</person>
                                   $person foaf:name $name
<person ➔ Variable bound to blank
        name=”Charles”>
                                 return
  <friend name=”Bob” />
                                   <person name=”{$name}”> {
  <friend name=”Charles” free
        node behaves as />         for $fname from <people.rdf>
  <friend name=”Charles” />
        variable
</person>
                                   where { $pers1 foaf:name $name.
                                     $person foaf:knows $friend .
                                     $friend foaf:name $fname . }
SELECT $fname                      return
FROM <people.rdf>                    <friend name=”{$fname}”/> $fname
                                                               #
WHERE {                            }                           1    “Bob”
  _:b1 foaf:knows $friend.         </person>                   2    “Bob”
  $friend foaf:name $fname.}
                                                               3 “Charles”
Example Dataset Scoping
<person name=”Alice”>              Solution:       #   $name $person
  <friend name=”Bob” />         Extend Scope       1  “Alice”    _:b1
  <friend name=”Charles” />
        Problem:
  <friend name=”Charles” />    of Blank node/      2   “Bob”     _:b2
</person> Blank nodes scoped to
        1.
<person name=”Bob”>
                                   Dataset         3 “Charles”   _:b3

  <friend name=”Bob” /> query
        single SPARQL            for $name $person from <people.rdf>
        2. name=”Charles” />
           Blank nodes in graphwhere {
  <friend name=”Charles” />
  <friend
        patterns are like variables$person a foaf:Person . . }
</person>
                                   $person foaf:name $name
<person ➔ Variable bound to blank
        name=”Charles”>
                                 return
  <friend name=”Bob” />
                                   <person name=”{$name}”> {
  <friend name=”Charles” free
        node behaves as />         for $fname from <people.rdf>
  <friend name=”Charles” />
        variable
</person>
                                   where { $pers1 foaf:name $name.
                                     $person foaf:knows $friend .
                                     $friend foaf:name $fname . }
SELECT $fname                      return
FROM <people.rdf>                    <friend name=”{$fname}”/> $fname
                                                               #
WHERE {                            }                           1    “Bob”
  _:b1 foaf:knows $friend.         </person>                   2    “Bob”
  $friend foaf:name $fname.}
                                                               3 “Charles”
Example Dataset Scoping
<person name=”Alice”>              Solution:       #   $name $person
  <friend name=”Bob” />         Extend Scope       1  “Alice”    _:b1
  <friend name=”Charles” />
        Problem:
  <friend name=”Charles” />    of Blank node/      2   “Bob”     _:b2
</person> Blank nodes scoped to
        1.
<person name=”Bob”>
                                   Dataset         3 “Charles”   _:b3

  <friend name=”Bob” /> query
        single SPARQL            for $name $person from <people.rdf>
        2. name=”Charles” />
           Blank nodes in graphwhere {
  <friend name=”Charles” />
  <friend
        patterns are like variables$person a foaf:Person . . }
</person>
                                   $person foaf:name $name
<person ➔ Variable bound to blank
        name=”Charles”>
                                 return
  <friend name=”Bob” />
                                   <person name=”{$name}”> {
  <friend name=”Charles” free
        node behaves as />         for $fname from <people.rdf>
  <friend name=”Charles” />
        variable
</person>
                                   where { $pers1 foaf:name $name.
                                     $person foaf:knows $friend .
                                     $friend foaf:name $fname . }
SELECT $fname                      return
FROM <people.rdf>                    <friend name=”{$fname}”/> $fname
                                                               #
WHERE {                            }                           1    “Bob”
  _:b1 foaf:knows $friend.         </person>                   2    “Bob”
  $friend foaf:name $fname.}
                                                               3 “Charles”
Example Dataset Scoping
<person name=”Alice”>              Solution:       #   $name $person
  <friend name=”Bob” />         Extend Scope       1  “Alice”  _:b1
  <friend name=”Charles” />
        Problem:
  <friend name=”Charles” />    of Blank node/      2   “Bob”   _:b2
</person> Blank nodes scoped to
<person 1.
        name=”Alice”>
<person name=”Bob”> />
                                   Dataset         3 “Charles” _:b3
  <friend name=”Bob”
  <friend name=”Bob” /> query
        single SPARQL />
           name=”Charles”        for $name $person from <people.rdf>
        2. name=”Charles” />
           Blank nodes in graphwhere {
  <friend name=”Charles” />
  <friend
</person>
        patterns are like variables$person a foaf:Person . . }
</person>
<person name=”Bob”>                $person foaf:name $name
<person ➔ Variable bound to blank
        name=”Charles”>
                                 return
  <friend name=”Bob” />
                                   <person name=”{$name}”> {
  <friend name=”Charles” free
        node behaves as />         for $fname from <people.rdf>
  <friend name=”Charles” />
        variable
</person>
</person>
<person name=”Charles”>
                                   where { $pers1 foaf:name $name.
                                     $person foaf:knows $friend .
                                    $friend foaf:name $fname . }
SELECT $fname                     return
FROM <people.rdf>                   <friend name=”{$fname}”/> $fname
                                                           #
</person>
WHERE {                           }                        1   “Bob”
  _:b1 foaf:knows $friend.        </person>                2   “Bob”
  $friend foaf:name $fname.}
                                                           3 “Charles”

Contenu connexe

En vedette

Interactive Analytics using Apache Spark
Interactive Analytics using Apache SparkInteractive Analytics using Apache Spark
Interactive Analytics using Apache SparkSachin Aggarwal
 
Apache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault ToleranceApache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault ToleranceSachin Aggarwal
 
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
codecentric AG: CQRS and Event Sourcing Applications with Cassandracodecentric AG: CQRS and Event Sourcing Applications with Cassandra
codecentric AG: CQRS and Event Sourcing Applications with CassandraDataStax Academy
 
Microservices, DevOps, and Continuous Delivery
Microservices, DevOps, and Continuous DeliveryMicroservices, DevOps, and Continuous Delivery
Microservices, DevOps, and Continuous DeliveryKhalid Salama
 

En vedette (7)

Interactive Analytics using Apache Spark
Interactive Analytics using Apache SparkInteractive Analytics using Apache Spark
Interactive Analytics using Apache Spark
 
Apache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault ToleranceApache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault Tolerance
 
Graph Analytics
Graph AnalyticsGraph Analytics
Graph Analytics
 
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
codecentric AG: CQRS and Event Sourcing Applications with Cassandracodecentric AG: CQRS and Event Sourcing Applications with Cassandra
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
 
Microservices, DevOps, and Continuous Delivery
Microservices, DevOps, and Continuous DeliveryMicroservices, DevOps, and Continuous Delivery
Microservices, DevOps, and Continuous Delivery
 
What's new in Hadoop Common and HDFS
What's new in Hadoop Common and HDFS What's new in Hadoop Common and HDFS
What's new in Hadoop Common and HDFS
 
Apache Hadoop 3.0 What's new in YARN and MapReduce
Apache Hadoop 3.0 What's new in YARN and MapReduceApache Hadoop 3.0 What's new in YARN and MapReduce
Apache Hadoop 3.0 What's new in YARN and MapReduce
 

Dernier

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 

Dernier (20)

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 

Implementation and Optimization of Queries in XSPARQL

  • 1. Towards XSPARQL 1.1: New Features and Optimization XML XSPARQL RDF New Features and Faster Query Evaluation for XSPARQL Master’s Thesis Presentation of Stefan Bischof October 1, 2010
  • 2. Data Representation XML (Extensible Markup Language) is a markup language designed for data exchange over the internet. Documents and other data are represented as trees. RDF (Resource Description Framework) is a framework for describing arbitrary resources. Resources and their relations are represented as directed graphs. Mainly used for Semantic Web data. XML XSPARQL RDF
  • 3. Example Data knows knows knows The ‘knows’ relation is directed; Charles knows nobody in this example.
  • 4. RDF and XML relations.xml relations.rdf <relations> <person name="Alice"> @prefix foaf: <http://xmlns.com/foaf/0.1/> . <knows>Bob</knows> _:b1 a foaf:Person; <knows>Charles</knows> foaf:name "Alice"; </person> foaf:knows _:b2; <person name="Bob"> foaf:knows _:b3. <knows>Charles</knows> _:b2 a foaf:Person; foaf:name "Bob"; </person> foaf:knows _:b3. <person name="Charles"/> _:b3 a foaf:Person; foaf:name "Charles". </relations> relations foaf:Person Charles rdf:type Alice person person person rdf:type Bob rdf:type foaf:name foaf:name foaf:name name knows knows name knows name _:b1 foaf:knows _:b2 foaf:knows _:b3 Alice Bob Charles Bob Charles Charles foaf:knows
  • 5. XQuery + SPARQL = XSPARQL XQuery is a functional query language designed for processing XML data. Large function library; superset of XPath 2.0 SPARQL is a query language for RD. It uses graph patterns to filter RDF data. XML XSPARQL RDF
  • 6. What’s XSPARQL? Simplifies data transformation by combining the advantages of XQuery and SPARQL: Provides RDF graph pattern matching to XQuery ➔ serialization format agnostic access to RDF data SPARQL gains access to large XQuery function library + subqueries XML XSPARQL RDF
  • 7. XSPARQL Example Convert from RDF to XML for $name from <people.rdf> where { For each person P: $person a foaf:Person . $person foaf:name $name . } Print P’s name return <person name=”{$name}”> { for $fname from <people.rdf> For each friend F of P: where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } Print F’s name return <knows name=”{$fname}”/> } </person>
  • 8. XSPARQL Summary XQuery SPARQL XML RDF
  • 9. XSPARQL Summary XQuery SPARQL XML XSPARQL RDF
  • 10. Implementation Input XSPARQL XML RDF query data data Query XSPARQL XQuery XQuery SPARQL processing rewriter query engine engine HTTP Output XML or RDF
  • 11. Query Evaluation XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 12. Query Evaluation SELECT $name XQuery SPARQL FROM <people.rdf> WHERE { $person a foaf:Person . $person foaf:name $name . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 13. Query Evaluation SELECT $name XQuery SPARQL FROM <people.rdf> WHERE { $person a foaf:Person . $person foaf:name $name . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> # $namewhere { $pers1 foaf:name $name. $pers1 foaf:knows $friend . 1 “Alice”$friend foaf:name $fname . } return 2 “Bob” <knows name=”{$fname}”/> } 3 “Charles” </person>
  • 14. Query Evaluation XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 15. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Alice” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 16. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Alice” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . # $fname $friend foaf:name $fname . } return 1 “Bob” <knows name=”{$fname}”/> } 2 </person> “Charles”
  • 17. Query Evaluation XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 18. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Bob” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 19. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Bob” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return # $fname } <knows name=”{$fname}”/> </person> 1 “Charles”
  • 20. Query Evaluation XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 21. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Charles” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 22. Query Evaluation SELECT $fname XQuery SPARQL FROM <people.rdf> WHERE { $pers1 foaf:name “Charles” . $pers1 foaf:knows $friend . $friend foaf:name $fname . } for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } # $fname </person>
  • 23. Query Evaluation XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <knows name=”{$fname}”/> } </person>
  • 24. RDF to XML relations.xml relations.rdf <relations> <person name="Alice"> @prefix foaf: <http://xmlns.com/foaf/0.1/> . <knows>Bob</knows> _:b1 a foaf:Person; <knows>Charles</knows> foaf:name "Alice"; </person> foaf:knows _:b2; <person name="Bob"> foaf:knows _:b3. <knows>Charles</knows> _:b2 a foaf:Person; foaf:name "Bob"; </person> foaf:knows _:b3. <person name="Charles"/> _:b3 a foaf:Person; foaf:name "Charles". </relations>
  • 25. XDEP Join Optimization Goal: Improve performance for nested queries Reduce number of SPARQL calls: N ➔ 1 only one single SPARQL call for the inner loop join is performed later using XQuery Constraint: applicable only for dependent joins join variable always bound Saves communication and repeated evaluation time
  • 26. XDEP Join Optimization XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>
  • 27. XDEP Join Optimization XQuery SPARQL for $name from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $pers1 foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>
  • 28. Practical Performance Evaluation Use common XQuery benchmark suite XMark Generate test documents of different sizes (5-100MB) Automatically translate test documents to RDF Manually translate queries from XQuery to XSPARQL Compare standard XSPARQL with optimized XSPARQL
  • 29. XSPARQL Performance 10000 1000 Evaluation time (sec) 100 10 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 XMark Query # 5 MB Dataset XQuery XSPARQL
  • 30. XSPARQL Performance 10000 Nested SPARQL parts 1000 Evaluation time (sec) 100 10 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 XMark Query # 5 MB Dataset XQuery XSPARQL
  • 31. XDEP Performance Increase 1000 Performance gain factor Query 9 100 Query 8 Unoptimized time 10 optimized time Query 10 1 0 5 10 15 20 Dataset size (MB)
  • 32. XDEP Performance Increase 1000 Performance gain factor Query 9 100 Query 8 10 Query 10 1 10 100 1000 10000 Number of outer loop iterations = number of saved SPARQL calls
  • 33. New Features Dataset Scoping Fixes unintended behavior of nested queries Constructed Dataset Create and query temporary data source
  • 34. New Features Dataset Scoping Fixes unintended behavior of nested SPARQL parts Reuse variable bound to blank node in inner query Variable behaves as free/unbound variable again because Scope of blank node is limited to one dataset/SPARQL query Blank nodes in graph patterns are similar to unbound variables Dataset Scoping extends the scope of a dataset over subqueries and allows blank node joins
  • 35. New Features Constructed Dataset Create intermediary RDF graphs to be used in the same query as data source Use cases Query aggregated data using XQuery’s built-in functions. Manually optimize queries by preselecting relevant parts of a data source.
  • 36. Conclusions Enhance XSPARQL Capabilities Constructed Dataset and Dataset Scoping features are valuable additions to XSPARQL Increase Evaluation Performance Dependent join optimization XDEP offers a confirmed performance increase for nested XSPARQL queries More info and demo http://xsparql.deri.org
  • 37. References Akhtar W., Kopecký J., Krennwallner T., and Pollers A. XSPARQL:Traveling between the XML and RDF worlds - and Avoiding the XSLT pilgrimage. In 5th European Semantic Web Conference (ESWC2008), pages 432–447, 2008. Bischof S. Implementation and Optimization of Queries in XSPARQL. Master’s Thesis, Vienna University of Technology, 2010. Bray T., Paoli J., Sperberg-McQueen C. M., Maler E., and Yergeau F. Extensible Markup Language (XML) 1.0 (Fifth Edition). http:// www.w3.org/TR/xml/, November 2008. W3C Recommendation. Boag S., Chamberlin D., Fernández M. F., Florescu D., Robie J., and Siméon J. XQuery 1.0: An XML Query Language. http://www.w3.org/TR/xquery/, January 2007. W3C Recommendation. Manola F. and Miller E. RDF Primer. http://www.w3.org/TR/rdf-primer/, February 2004. W3C Recommendation. Prud’hommeaux E. and Seaborne A. SPARQL Query Language for RDF. http:// www.w3.org/TR/rdf-sparql-query/, January 2008. W3C Recommendation.
  • 38. Example Dataset Scoping for $name $person from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>
  • 39. Example Dataset Scoping for $name $person from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>
  • 40. Example Dataset Scoping # $name $person 1 “Alice” _:b1 2 “Bob” _:b2 3 “Charles” _:b3 for $name $person from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>
  • 41. Example Dataset Scoping # $name $person 1 “Alice” _:b1 2 “Bob” _:b2 3 “Charles” _:b3 for $name $person from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> WHERE { } _:b1 foaf:knows $friend. </person> $friend foaf:name $fname.}
  • 42. Example Dataset Scoping # $name $person 1 “Alice” _:b1 2 “Bob” _:b2 3 “Charles” _:b3 for $name $person from <people.rdf> where { $person a foaf:Person . $person foaf:name $name . } return <person name=”{$name}”> { for $fname from <people.rdf> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 43. Example Dataset Scoping <person name=”Alice”> # $name $person <friend name=”Bob” /> <friend name=”Charles” /> 1 “Alice” _:b1 <friend name=”Charles” /> 2 “Bob” _:b2 </person> 3 “Charles” _:b3 <person name=”Bob”> <friend name=”Bob” /> for $name $person from <people.rdf> <friend name=”Charles” /> where { <friend name=”Charles” /> $person a foaf:Person . </person> $person foaf:name $name . } <person name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” /> for $fname from <people.rdf> <friend name=”Charles” /> where { $pers1 foaf:name $name. </person> $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 44. Example Dataset Scoping <person name=”Alice”> # $name $person <friend name=”Bob” /> <friend name=”Charles” /> 1 “Alice” _:b1 <friend name=”Charles” /> 2 “Bob” _:b2 </person> 3 “Charles” _:b3 <person name=”Bob”> <friend name=”Bob” /> for $name $person from <people.rdf> <friend name=”Charles” /> where { <friend name=”Charles” /> $person a foaf:Person . </person> $person foaf:name $name . } <person name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” /> for $fname from <people.rdf> <friend name=”Charles” /> where { $pers1 foaf:name $name. </person> $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 45. Example Dataset Scoping <person name=”Alice”> # $name $person <friend name=”Bob” /> <friend name=”Charles” /> 1 “Alice” _:b1 Problem: <friend name=”Charles” /> 2 “Bob” _:b2 </person> Blank nodes scoped to 1. 3 “Charles” _:b3 <person name=”Bob”> <friend name=”Bob” /> query single SPARQL for $name $person from <people.rdf> 2. name=”Charles” /> Blank nodes in graphwhere { <friend name=”Charles” /> <friend patterns are like variables$person a foaf:Person . . } </person> $person foaf:name $name <person ➔ Variable bound to blank name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” free node behaves as /> for $fname from <people.rdf> <friend name=”Charles” /> variable </person> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 46. Example Dataset Scoping <person name=”Alice”> Solution: # $name $person <friend name=”Bob” /> Extend Scope 1 “Alice” _:b1 <friend name=”Charles” /> Problem: <friend name=”Charles” /> of Blank node/ 2 “Bob” _:b2 </person> Blank nodes scoped to 1. <person name=”Bob”> Dataset 3 “Charles” _:b3 <friend name=”Bob” /> query single SPARQL for $name $person from <people.rdf> 2. name=”Charles” /> Blank nodes in graphwhere { <friend name=”Charles” /> <friend patterns are like variables$person a foaf:Person . . } </person> $person foaf:name $name <person ➔ Variable bound to blank name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” free node behaves as /> for $fname from <people.rdf> <friend name=”Charles” /> variable </person> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 47. Example Dataset Scoping <person name=”Alice”> Solution: # $name $person <friend name=”Bob” /> Extend Scope 1 “Alice” _:b1 <friend name=”Charles” /> Problem: <friend name=”Charles” /> of Blank node/ 2 “Bob” _:b2 </person> Blank nodes scoped to 1. <person name=”Bob”> Dataset 3 “Charles” _:b3 <friend name=”Bob” /> query single SPARQL for $name $person from <people.rdf> 2. name=”Charles” /> Blank nodes in graphwhere { <friend name=”Charles” /> <friend patterns are like variables$person a foaf:Person . . } </person> $person foaf:name $name <person ➔ Variable bound to blank name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” free node behaves as /> for $fname from <people.rdf> <friend name=”Charles” /> variable </person> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”
  • 48. Example Dataset Scoping <person name=”Alice”> Solution: # $name $person <friend name=”Bob” /> Extend Scope 1 “Alice” _:b1 <friend name=”Charles” /> Problem: <friend name=”Charles” /> of Blank node/ 2 “Bob” _:b2 </person> Blank nodes scoped to <person 1. name=”Alice”> <person name=”Bob”> /> Dataset 3 “Charles” _:b3 <friend name=”Bob” <friend name=”Bob” /> query single SPARQL /> name=”Charles” for $name $person from <people.rdf> 2. name=”Charles” /> Blank nodes in graphwhere { <friend name=”Charles” /> <friend </person> patterns are like variables$person a foaf:Person . . } </person> <person name=”Bob”> $person foaf:name $name <person ➔ Variable bound to blank name=”Charles”> return <friend name=”Bob” /> <person name=”{$name}”> { <friend name=”Charles” free node behaves as /> for $fname from <people.rdf> <friend name=”Charles” /> variable </person> </person> <person name=”Charles”> where { $pers1 foaf:name $name. $person foaf:knows $friend . $friend foaf:name $fname . } SELECT $fname return FROM <people.rdf> <friend name=”{$fname}”/> $fname # </person> WHERE { } 1 “Bob” _:b1 foaf:knows $friend. </person> 2 “Bob” $friend foaf:name $fname.} 3 “Charles”

Notes de l'éditeur

  1. Explain layers Rewrite XSPARQL query to an XQuery query, then evaluate XQuery. if the original query contains SPARQL graph patterns, sparql engine is used for evaluation. rely on standard XQuery and SPARQL engines Communication over HTTP optimization