Type-ARQuE example transformation: test/ssws2010/variable-alternatives.rq (simple-inline)
SPARQL Query
SELECT DISTINCT ?a ?d
WHERE {
?a ?b ?c
OPTIONAL {
?a <http://test1.aql-testdata/p/title> ?d
}
OPTIONAL {
?a <http://test1.aql-testdata/p/lastname> ?d
}
}
Query translated into AQL
(aql-query ("triple_1_1")
(distinct)
(select "a" (property (string IRI double integer boolean datetime)
"triple_1_1" subject))
(select "d" (function"builtin:coalesce" (string IRI double integer boolean datetime)
(property (string IRI double integer boolean datetime)
"triple_2_1" object)
(property (string IRI double integer boolean datetime)
"triple_3_1" object)))
(join left ("triple_2_1")
(and (comp-eq (property (string IRI double integer boolean datetime)
"triple_2_1" subject)
(property (string IRI double integer boolean datetime)
"triple_1_1" subject))
(comp-eq (property (string IRI double integer boolean datetime)
"triple_2_1" predicate)
(literal IRI "http://test1.aql-testdata/p/title"))))
(join left ("triple_3_1")
(and (comp-eq (property (string IRI double integer boolean datetime)
"triple_3_1" subject)
(property (string IRI double integer boolean datetime)
"triple_1_1" subject))
(comp-eq (property (string IRI double integer boolean datetime)
"triple_3_1" predicate)
(literal IRI "http://test1.aql-testdata/p/lastname"))
(or (function"builtin:is-null" (string IRI double integer boolean datetime)
(property (string IRI double integer boolean datetime)
"triple_2_1" object))
(comp-eq (property (string IRI double integer boolean datetime)
"triple_3_1" object)
(property (string IRI double integer boolean datetime)
"triple_2_1" object)))))
(criterion))
Lowered and optimized AQL
(aql-query ("triple_1_1")
(distinct)
(select "a" (custom (IRI)
FlexibleSQLLayout::SQLAccessExpr INLINE subj_value USING JOIN triple_1_1))
(select "d" (function"builtin:coalesce" (string) ### variant [(string) (string)] : (string)
(custom (string)
FlexibleSQLLayout::SQLAccessExpr INLINE obj_value USING JOIN triple_2_1)
(custom (string)
FlexibleSQLLayout::SQLAccessExpr INLINE obj_value USING JOIN triple_3_1)))
(join left ("triple_2_1")
(function"builtin:and" (boolean) ### variant [(boolean) (boolean)] : (boolean)
(function"builtin:comp-eq" (boolean) ### variant [(reference) (reference)] : (boolean)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE subj_value USING JOIN triple_2_1)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE subj_value USING JOIN triple_1_1))
(function"builtin:comp-eq" (boolean) ### variant [(IRI) (IRI)] : (boolean)
(custom (IRI)
FlexibleSQLLayout::SQLAccessExpr INLINE pred_value USING JOIN triple_2_1)
(literal IRI "http://test1.aql-testdata/p/title")))
# Inference map = {
# triple_2_1.subject: (IRI)
# triple_2_1.predicate: (IRI)
# triple_2_1.object: (string IRI double integer boolean datetime)
)
(join left ("triple_3_1")
(function"builtin:and" (boolean) ### variant [(boolean) (boolean) (boolean)] : (boolean)
(function"builtin:comp-eq" (boolean) ### variant [(reference) (reference)] : (boolean)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE subj_value USING JOIN triple_3_1)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE subj_value USING JOIN triple_1_1))
(function"builtin:comp-eq" (boolean) ### variant [(IRI) (IRI)] : (boolean)
(custom (IRI)
FlexibleSQLLayout::SQLAccessExpr INLINE pred_value USING JOIN triple_3_1)
(literal IRI "http://test1.aql-testdata/p/lastname"))
(function"builtin:or" (boolean) ### variant [(boolean) (boolean)] : (boolean)
(function"builtin:is-null" (boolean) ### variant [(string IRI double integer boolean datetime)] : (boolean)
(custom (string)
FlexibleSQLLayout::SQLAccessExpr INLINE obj_value USING JOIN triple_2_1))
(function"builtin:comp-eq" (boolean) ### variant [(reference) (reference)] : (boolean)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE obj_value USING JOIN triple_3_1)
(custom (integer)
FlexibleSQLLayout::SQLAccessExpr INLINE obj_value USING JOIN triple_2_1))))
# Inference map = {
# triple_3_1.subject: (IRI)
# triple_3_1.predicate: (IRI)
# triple_3_1.object: (string IRI double integer boolean datetime)
)
(criterion (literal boolean true))
# Inference map = {
# triple_1_1.subject: (IRI)
# triple_1_1.predicate: (IRI)
# triple_1_1.object: (string IRI double integer boolean datetime)
)
SQL
SELECT DISTINCT triple_1_1.subj_value AS c0,
COALESCE(triple_2_1.obj_value,triple_3_1.obj_value) AS c1
FROM InlinedTriples AS triple_1_1
LEFT JOIN InlinedTriples AS triple_2_1 ON triple_2_1.subj_value=triple_1_1.subj_value AND triple_2_1.pred_value='http://test1.aql-testdata/p/title'
LEFT JOIN InlinedTriples AS triple_3_1 ON triple_3_1.subj_value=triple_1_1.subj_value AND triple_3_1.pred_value='http://test1.aql-testdata/p/lastname' AND (triple_2_1.obj_value IS NULL OR triple_3_1.obj_value=triple_2_1.obj_value)
WHERE TRUE
Execution result
| a | d |
==================================================================
| http://test1.aql-testdata/author2 | Beowulf |
| http://test1.aql-testdata/book5 | Bar-Master (bootleg) |
| http://test1.aql-testdata/book2 | The Book of Blah |
| http://test1.aql-testdata/book1 | The Great Book of Nonsense |
| http://test1.aql-testdata/book4 | Bar-Master |
| http://test1.aql-testdata/author3 | Chorris |
| http://test1.aql-testdata/author1 | Aadolfson |
| http://test1.aql-testdata/book3 | The Art of Foo |
| http://test1.aql-testdata/author4 | Daft |
9 rows