+ All Categories
Home > Technology > Implementation and Optimization of Queries in XSPARQL

Implementation and Optimization of Queries in XSPARQL

Date post: 20-Jan-2015
Category:
Upload: stefan-bischof
View: 3,452 times
Download: 0 times
Share this document with a friend
Description:
XSPARQL is a language for transforming data between XML and RDF. XML is a widely used format for data exchange. RDF is a data format based on directed graphs, primarily used to represent Semantic Web data. XSPARQL is built by combining the strengths of the two corresponding query languages XQuery for XML, and SPARQL for RDF. In this talk we will present two new XSPARQL enhancements called Constructed Dataset and Dataset Scoping, the XDEP dependent join optimization, and a new XSPARQL implementation. Constructed Dataset allows to create intermediary RDF graphs while querying data sources. The Dataset Scoping enhancement provides an optional fix for unintended results which may occur when evaluating complex XSPARQL queries containing nested SPARQL queries. The XSPARQL implementation works by first rewriting an XSPARQL to XQuery expressions containing interleaved calls to a SPARQL engine. The resulting query is then evaluated by standard XQuery and SPARQL engines. The dependent join optimization XDEP is designed to reduce query evaluation time for queries demanding repeated evaluation of embedded SPARQL query parts. XDEP minimizes the number of interactions between the XQuery and SPARQL engines by bundling similar queries and let XQuery engines select relevant data on their own. We did an experimental evaluation of our approach using an adapted version of the XQuery benchmark suite XMark. We will show that the XDEP optimization reduces the evaluation time of all compatible benchmark queries. Using this optimization we could evaluate certain XSPARQL queries by two orders of magnitude faster than with unoptimized XSPARQL. See also http://stefanbischof.at/masterthesis/ for the full text.
Popular Tags:
48
Towards XSPARQL 1.1: New Features and Optimization Master’s Thesis Presentation of Stefan Bischof October 1, 2010 XML RDF XSPARQL New Features and Faster Query Evaluation for XSPARQL
Transcript
Page 1: Implementation and Optimization of Queries in XSPARQL

Towards XSPARQL 1.1: New Features and Optimization

Master’s Thesis Presentation of Stefan BischofOctober 1, 2010

XML RDFXSPARQL

New Features and Faster Query Evaluation

for XSPARQL

Page 2: Implementation and Optimization of Queries in XSPARQL

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 RDFXSPARQL

Page 3: Implementation and Optimization of Queries in XSPARQL

Example Data

The ‘knows’ relation is directed; Charles knows nobody in this example.

knows knows

knows

Page 4: Implementation and Optimization of Queries in XSPARQL

RDF and XML

relations

person personperson

name knows knows name nameknows

CharlesBobAlice Bob CharlesCharles

_:b1

foaf:Person

Alice

foaf:name

_:b2foaf:knows

Bob

foaf:name

_:b3foaf:knows

Charles

foaf:name

foaf:knows

rdf:type

rdf:typerdf:type

@prefix foaf: <http://xmlns.com/foaf/0.1/> ._:b1 a foaf:Person; foaf:name "Alice"; foaf:knows _:b2; foaf:knows _:b3._:b2 a foaf:Person; foaf:name "Bob"; foaf:knows _:b3._:b3 a foaf:Person; foaf:name "Charles".

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

relations.xmlrelations.rdf

Page 5: Implementation and Optimization of Queries in XSPARQL

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 RDFXSPARQL

Page 6: Implementation and Optimization of Queries in XSPARQL

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 RDFXSPARQL

Page 7: Implementation and Optimization of Queries in XSPARQL

XSPARQL ExampleConvert from RDF to XML

For each person P:

Print P’s name

For each friend F of P:

Print F’s 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>

Page 8: Implementation and Optimization of Queries in XSPARQL

XSPARQL Summary

XML RDF

SPARQLXQuery

Page 9: Implementation and Optimization of Queries in XSPARQL

XSPARQL Summary

XML RDFXSPARQL

SPARQLXQuery

Page 10: Implementation and Optimization of Queries in XSPARQL

Implementation

XSPARQL query

XSPARQL rewriter

XQuery query

XQuery engine

SPARQL engine

RDFdata

XMLdata

XML or RDF

Query processing

Input

Output

HTTP

Page 11: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

Page 12: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $name FROM <people.rdf>WHERE { $person a foaf:Person . $person foaf:name $name . }

Page 13: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

# $name

1

2

3

“Alice”

“Bob”

“Charles”

SELECT $name FROM <people.rdf>WHERE { $person a foaf:Person . $person foaf:name $name . }

Page 14: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

Page 15: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Alice” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

Page 16: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

# $fname

1

2

“Bob”

“Charles”

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Alice” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

Page 17: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

Page 18: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Bob” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

Page 19: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Bob” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

# $fname

1 “Charles”

Page 20: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

Page 21: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Charles” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

Page 22: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

SELECT $fname FROM <people.rdf>WHERE { $pers1 foaf:name “Charles” . $pers1 foaf:knows $friend . $friend foaf:name $fname . }

# $fname

Page 23: Implementation and Optimization of Queries in XSPARQL

Query EvaluationSPARQLXQuery

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>

Page 24: Implementation and Optimization of Queries in XSPARQL

RDF to XML

@prefix foaf: <http://xmlns.com/foaf/0.1/> ._:b1 a foaf:Person; foaf:name "Alice"; foaf:knows _:b2; foaf:knows _:b3._:b2 a foaf:Person; foaf:name "Bob"; foaf:knows _:b3._:b3 a foaf:Person; foaf:name "Charles".

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

relations.xmlrelations.rdf

Page 25: Implementation and Optimization of Queries in XSPARQL

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

Page 26: Implementation and Optimization of Queries in XSPARQL

XDEP Join OptimizationSPARQLXQuery

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>

Page 27: Implementation and Optimization of Queries in XSPARQL

XDEP Join OptimizationSPARQLXQuery

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>

Page 28: Implementation and Optimization of Queries in XSPARQL

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

Page 29: Implementation and Optimization of Queries in XSPARQL

XSPARQL Performance

1

10

100

1000

10000

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

Eva

luat

ion

time

(sec

)

XMark Query #

XQuery XSPARQL5 MB Dataset

Page 30: Implementation and Optimization of Queries in XSPARQL

XSPARQL Performance

1

10

100

1000

10000

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

Eva

luat

ion

time

(sec

)

XMark Query #

XQuery XSPARQL5 MB Dataset

Nested SPARQL parts

Page 31: Implementation and Optimization of Queries in XSPARQL

XDEP Performance Increase

1

10

100

1000

0 5 10 15 20

Per

form

ance

gai

n fa

ctor

Dataset size (MB)

Unoptimized timeoptimized time

Query 8

Query 9

Query 10

Page 32: Implementation and Optimization of Queries in XSPARQL

XDEP Performance Increase

1

10

100

1000

10 100 1000 10000

Per

form

ance

gai

n fa

ctor

Number of outer loop iterations

Query 8

Query 9

Query 10

= number of saved SPARQL calls

Page 33: Implementation and Optimization of Queries in XSPARQL

New Features

Dataset Scoping

Fixes unintended behavior of nested queries

Constructed Dataset

Create and query temporary data source

Page 34: Implementation and Optimization of Queries in XSPARQL

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 Dataset Scoping

Page 35: Implementation and Optimization of Queries in XSPARQL

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.

Page 36: Implementation and Optimization of Queries in XSPARQL

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

Page 37: Implementation and Optimization of Queries in XSPARQL

ReferencesAkhtar 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.

Page 38: Implementation and Optimization of Queries in XSPARQL

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>

Page 39: Implementation and Optimization of Queries in XSPARQL

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

Page 40: Implementation and Optimization of Queries in XSPARQL

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

Page 41: Implementation and Optimization of Queries in XSPARQL

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Page 42: Implementation and Optimization of Queries in XSPARQL

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Page 43: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Page 44: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Page 45: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

Problem:1. Blank nodes scoped to single SPARQL query2. Blank nodes in graph patterns are like variables➔ Variable bound to blank node behaves as free variable

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Page 46: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

Problem:1. Blank nodes scoped to single SPARQL query2. Blank nodes in graph patterns are like variables➔ Variable bound to blank node behaves as free variable

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Solution: Extend Scope of Blank node/

Dataset

Page 47: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

Problem:1. Blank nodes scoped to single SPARQL query2. Blank nodes in graph patterns are like variables➔ Variable bound to blank node behaves as free variable

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Solution: Extend Scope of Blank node/

Dataset

Page 48: Implementation and Optimization of Queries in XSPARQL

Example Dataset Scoping<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Bob”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person><person name=”Charles”> <friend name=”Bob” /> <friend name=”Charles” /> <friend name=”Charles” /></person>

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>

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

Problem:1. Blank nodes scoped to single SPARQL query2. Blank nodes in graph patterns are like variables➔ Variable bound to blank node behaves as free variable

# $fname

1

2

3

“Bob”

“Bob”

“Charles”

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 { $person foaf:knows $friend . $friend foaf:name $fname . } return <friend name=”{$fname}”/> } </person>

# $name $person

1

2

3

“Alice” _:b1

“Bob” _:b2

“Charles” _:b3

SELECT $fnameFROM <people.rdf>WHERE { _:b1 foaf:knows $friend. $friend foaf:name $fname.}

Solution: Extend Scope of Blank node/

Dataset<person name=”Alice”> <friend name=”Bob” /> <friend name=”Charles” />

</person><person name=”Bob”>

<friend name=”Charles” /></person><person name=”Charles”>

</person>


Recommended