/*
* Copyright 2007 the original author or authors.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
* conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* Neither the name of the author or authors nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Simone Tripodi (simone.tripodi)
* @author Michele Mostarda (michele.mostarda)
* @author Juergen Pfundt (Juergen.Pfundt)
* @version $Id: Sparql.testsuite 25 2007-12-03 17:05:59Z simone.tripodi $
*/
gunit Sparql;
/* TEST 1 */
query:
<<
PREFIX cd:
SELECT ?titolo ?autore ?anno
FROM
WHERE {
?titolo ?autore ?autore.
?titolo ?anno ?ann .
}
>> OK
/* TEST 2 */
query:
<<
PREFIX cd:
SELECT ?titolo ?autore ?anno
FROM
WHERE {
?titolo cd:autore ?autore.
OPTIONAL {
?titolo cd:anno ?anno
}
}
>> OK
/* TEST 3 */
query:
<<
PREFIX cd:
SELECT ?titolo ?autore ?anno
FROM
WHERE {
{ ?titolo cd:autore ?autore }
UNION
{ ?titolo cd:anno ?anno }
}
>> OK
/* TEST 4 */
query:
<<
PREFIX cd:
SELECT ?titolo ?anno
FROM
WHERE {
?titolo cd:anno ?anno.
FILTER (?anno > 2000).
}
>> OK
/* TEST 5 */
query:
<<
PREFIX cd:
SELECT ?titolo ?autore
FROM
WHERE {
?titolo cd:autore ?autore .
FILTER REGEX(?autore, "^au", "i")
}
>> OK
/* TEST 6 */
query:
<<
PREFIX cd:
SELECT ?titolo ?autore ?anno
FROM
WHERE {
{ ?titolo cd:autore ?autore }
UNION
{ ?titolo cd:anno ?anno }
}
ORDER BY DESC(?autore)
LIMIT 10
OFFSET 10
>> OK
/* TEST 7 */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name
FILTER regex(?name, "^ali", "i") }
>> OK
/* TEST 8 */
query:
<<
PREFIX foaf:
PREFIX func:
SELECT ?name ?id
WHERE { ?x foaf:name ?name ;
func:empId ?id .
FILTER (func:even(?id)) }
>> OK
/* TEST 9 */
query:
<<
PREFIX dc:
SELECT ?title
WHERE { ?x dc:title ?title .
FILTER langMatches(lang(?title), "*" ) }
>> OK
/* TEST 10 */
query:
<<
PREFIX dc:
SELECT ?title
WHERE { ?x dc:title "That Seventies Show"@en ;
dc:title ?title .
FILTER langMatches(lang(?title), "FR" ) }
>> OK
/* TEST 11 */
query:
<<
PREFIX foaf:
SELECT ?name1 ?name2
WHERE { ?x foaf:name ?name1 ;
foaf:mbox ?mbox1 .
?y foaf:name ?name2 ;
foaf:mbox ?mbox2 .
FILTER (sameTerm(?mbox1, ?mbox2) && !sameTerm(?name1, ?name2))
}
>> OK
/* TEST 12 */
query:
<<
PREFIX a:
PREFIX dc:
PREFIX xsd:
SELECT ?annotates
WHERE { ?annot a:annotates ?annotates .
?annot dc:date ?date .
FILTER (?date = xsd:dateTime("2005-01-01T00:00:00Z") ) }
>> OK
/* TEST 13 */
query:
<<
# This is a test for comment
PREFIX foaf: # Comments are welcome
SELECT ?name1 ?name2
# Select or NOT select, that is here the question
WHERE { ?x foaf:name ?name1 ;
foaf:mbox ?mbox1 .
?y foaf:name ?name2 ;
foaf:mbox ?mbox2 .
FILTER (?mbox1 = ?mbox2 && ?name1 != ?name2)
} # Last words ...
>> OK
/* TEST 14 */
/* 4.2 Syntax for Triple Patterns */
query:
<<
PREFIX dc:
SELECT ?title
WHERE { dc:title ?title }
>> OK
/* TEST 15 */
/* 4.2 Syntax for Triple Patterns */
query:
<<
PREFIX dc:
PREFIX :
SELECT $title
WHERE { :book1 dc:title $title }
>> OK
/* TEST 16 */
/* 4.2 Syntax for Triple Patterns */
query:
<<
BASE
PREFIX dc:
SELECT $title
WHERE { dc:title ?title }
>> OK
/* TEST 17 */
/* 5.2 Group Graph Patterns */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE {
?x foaf:name ?name .
?x foaf:mbox ?mbox .
}
>> OK
/* TEST 18 */
/* 5.2 Group Graph Patterns */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { { ?x foaf:name ?name . }
{ ?x foaf:mbox ?mbox . }
}
>> OK
/* TEST 19 */
/* 5.2.1 Empty Group Pattern */
query:
<<
SELECT ?x
WHERE {}
>> OK
/* TEST 20 */
/* 6.1 Optional Pattern Matching */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name .
OPTIONAL { ?x foaf:mbox ?mbox }
}
>> OK
/* TEST 21 */
/* 6.2 Constraints in Optional Pattern Matching */
query:
<<
PREFIX dc:
PREFIX ns:
SELECT ?title ?price
WHERE { ?x dc:title ?title .
OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }
}
>> OK
/* TEST 22 */
/* 6.3 Multiple Optional Graph Patterns */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox ?hpage
WHERE { ?x foaf:name ?name .
OPTIONAL { ?x foaf:mbox ?mbox } .
OPTIONAL { ?x foaf:homepage ?hpage }
}
>> OK
/* TEST 23 */
/* 7 Matching Alternatives */
query:
<<
PREFIX dc10:
PREFIX dc11:
SELECT ?title
WHERE { { ?book dc10:title ?title } UNION { ?book dc11:title ?title } }
>> OK
/* TEST 24 */
/* 7 Matching Alternatives */
query:
<<
PREFIX dc10:
PREFIX dc11:
SELECT ?title ?author
WHERE { { ?book dc10:title ?title . ?book dc10:creator ?author }
UNION
{ ?book dc11:title ?title . ?book dc11:creator ?author }
}
>> OK
/* TEST 25 */
/* 8.2.1 Specifying the Default Graph */
query:
<<
PREFIX foaf:
SELECT ?name
FROM
WHERE { ?x foaf:name ?name }
>> OK
/* TEST 26 */
/* 8.2.3 Combining FROM and FROM NAMED */
query:
<<
PREFIX foaf:
PREFIX dc:
SELECT ?who ?g ?mbox
FROM
FROM NAMED
FROM NAMED
WHERE
{
?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox }
}
>> OK
/* TEST 27 */
/* 8.3.1 Accessing Graph Names */
query:
<<
PREFIX foaf:
SELECT ?src ?bobNick
FROM NAMED
FROM NAMED
WHERE
{
GRAPH ?src
{ ?x foaf:mbox .
?x foaf:nick ?bobNick
}
}
>> OK
/* TEST 28 */
/* 8.3.2 Restricting by Graph IRI */
query:
<<
PREFIX foaf:
PREFIX data:
SELECT ?nick
FROM NAMED
FROM NAMED
WHERE
{
GRAPH data:bobFoaf {
?x foaf:mbox .
?x foaf:nick ?nick }
}
>> OK
/* TEST 29 */
/* 8.3.3 Restricting Possible Graph IRIs */
query:
<<
PREFIX data:
PREFIX foaf:
PREFIX rdfs:
SELECT ?mbox ?nick ?ppd
FROM NAMED
FROM NAMED
WHERE
{
GRAPH data:aliceFoaf
{
?alice foaf:mbox ;
foaf:knows ?whom .
?whom foaf:mbox ?mbox ;
rdfs:seeAlso ?ppd .
?ppd a foaf:PersonalProfileDocument .
} .
GRAPH ?ppd
{
?w foaf:mbox ?mbox ;
foaf:nick ?nick
}
}
>> OK
/* TEST 30 */
/* 8.3.4 Named and Default Graphs */
query:
<<
PREFIX foaf:
PREFIX dc:
SELECT ?name ?mbox ?date
WHERE
{ ?g dc:publisher ?name ;
dc:date ?date .
GRAPH ?g
{ ?person foaf:name ?name ; foaf:mbox ?mbox }
}
>> OK
/* TEST 31 */
/* 9.1 ORDER BY */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
>> OK
/* TEST 32 */
/* 9.1 ORDER BY */
query:
<<
PREFIX :
PREFIX foaf:
PREFIX xsd:
SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY DESC(?emp)
>> OK
/* TEST 33 */
/* 9.1 ORDER BY */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY ?name DESC(?emp)
>> OK
/* TEST 34 */
/* 9.2 Projection */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE
{ ?x foaf:name ?name }
>> OK
/* TEST 35 */
/* Duplicate Solutions */
<<
PREFIX foaf:
SELECT ?name WHERE { ?x foaf:name ?name }
>> OK
/* TEST 36 */
/* 9.3.1 DISTINCT */
query:
<<
PREFIX foaf:
SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
>> OK
/* TEST 37 */
/* 9.3.2 REDUCED */
<< PREFIX foaf:
SELECT REDUCED ?name WHERE { ?x foaf:name ?name }
>> OK
/* TEST 38 */
/* 9.4 OFFSET */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
LIMIT 5
OFFSET 10
>> OK
/* TEST 39 */
/* 9.5 LIMIT */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name }
LIMIT 20
>> OK
/* TEST 40 */
/* 10.1 SELECT */
query:
<<
PREFIX foaf:
SELECT ?nameX ?nameY ?nickY
WHERE
{ ?x foaf:knows ?y ;
foaf:name ?nameX .
?y foaf:name ?nameY .
OPTIONAL { ?y foaf:nick ?nickY }
}
>> OK
/* TEST 41 */
/* 10.2 CONSTRUCT */
query:
<<
PREFIX foaf:
PREFIX vcard:
CONSTRUCT { vcard:FN ?name }
WHERE { ?x foaf:name ?name }
>> OK
/* TEST 42 */
/* 10.2.1 Templates with Blank Nodes */
query:
<<
PREFIX foaf:
PREFIX vcard:
CONSTRUCT { ?x vcard:N _:v .
_:v vcard:givenName ?gname .
_:v vcard:familyName ?fname }
WHERE
{
{ ?x foaf:firstname ?gname } UNION { ?x foaf:givenname ?gname } .
{ ?x foaf:surname ?fname } UNION { ?x foaf:family_name ?fname } .
}
>> OK
/* TEST 43 */
/* 10.2.2 Accessing Graphs in the RDF Dataset */
query:
<<
PREFIX dc:
PREFIX app:
CONSTRUCT { ?s ?p ?o } WHERE
{
GRAPH ?g { ?s ?p ?o } .
{ ?g dc:publisher } .
{ ?g dc:date ?date } .
FILTER ( app:customDate(?date) > "2005-02-28T00:00:00Z"^^xsd:dateTime ) .
}
>> OK
/* TEST 44 */
/* 10.2.3 Solution Modifiers and CONSTRUCT */
query:
<<
PREFIX foaf:
PREFIX site:
CONSTRUCT { [] foaf:name ?name }
WHERE
{ [] foaf:name ?name ;
site:hits ?hits .
}
ORDER BY desc(?hits)
LIMIT 2
>> OK
/* TEST 45 */
/* 10.3 ASK */
query:
<<
PREFIX foaf:
ASK { ?x foaf:name "Alice" }
>> OK
/* TEST 46 */
/* 10.3 ASK */
query:
<<
PREFIX foaf:
ASK { ?x foaf:name "Alice" ;
foaf:mbox }
>> OK
/* TEST 47 */
/* 10.4.2 Identifying Resources */
<<
PREFIX foaf:
DESCRIBE ?x
WHERE { ?x foaf:mbox }
>> OK
/* TEST 48 */
/* 10.4.2 Identifying Resources */
query:
<<
PREFIX foaf:
DESCRIBE ?x
WHERE { ?x foaf:name "Alice" }
>> OK
/* TEST 49 */
/* 10.4.2 Identifying Resources */
query:
<<
PREFIX foaf:
DESCRIBE ?x ?y
WHERE {?x foaf:knows ?y}
>> OK
/* TEST 50 */
/* 10.4.3 Descriptions of Resources */
query:
<<
PREFIX ent:
DESCRIBE ?x WHERE { ?x ent:employeeId "1234" }
>> OK
/* TEST 51 */
/* 11 Testing Values */
query:
<<
PREFIX a:
PREFIX dc:
PREFIX xsd:
SELECT ?annot
WHERE { ?annot a:annotates .
?annot dc:date ?date .
FILTER ( ?date > "2005-01-01T00:00:00Z"^^xsd:dateTime ) }
>> OK
/* TEST 52 */
/* 11.4.1 bound */
query:
<<
PREFIX foaf:
PREFIX dc:
PREFIX xsd:
SELECT ?name
WHERE { ?x foaf:givenName ?givenName .
OPTIONAL { ?x dc:date ?date } .
FILTER ( bound(?date) ) }
>> OK
/* TEST 53 */
/* 11.4.1 bound */
query:
<<
PREFIX foaf:
PREFIX dc:
SELECT ?name
WHERE { ?x foaf:givenName ?name .
OPTIONAL { ?x dc:date ?date } .
FILTER (!bound(?date)) }
>> OK
/* TEST 54 */
/* 11.4.2 isIRI */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name ;
foaf:mbox ?mbox .
FILTER isIRI(?mbox) }
>> OK
/* TEST 55 */
/* 11.4.3 isBlank */
query:
<<
PREFIX a:
PREFIX dc:
PREFIX foaf:
SELECT ?given ?family
WHERE { ?annot a:annotates .
?annot dc:creator ?c .
OPTIONAL { ?c foaf:given ?given ; foaf:family ?family } .
FILTER isBlank(?c)
}
>> OK
/* TEST 56 */
/* 11.4.4 isLiteral */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name ;
foaf:mbox ?mbox .
FILTER isLiteral(?mbox) }
>> OK
/* TEST 57 */
/* 11.4.5 str */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name ;
foaf:mbox ?mbox .
FILTER regex(str(?mbox), "@work.example") }
>> OK
/* TEST 58 */
/* 11.4.6 lang */
query:
<<
PREFIX foaf:
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name ;
foaf:mbox ?mbox .
FILTER ( lang(?name) = "ES" ) }
>> OK
/* TEST 59 */
query:
<<
PREFIX where:
SELECT ?select ?mbox
WHERE { ?from where:select ?select ;
where:mbox ?mbox .
FILTER ( lang ( ?select ) = "ES" ) }
>> OK
/* TEST 60 */
/* 11.4.7 datatype */
query:
<<
PREFIX foaf:
PREFIX xsd:
PREFIX eg:
SELECT ?name ?shoeSize
WHERE { ?x foaf:name ?name ; eg:shoeSize ?shoeSize .
FILTER ( datatype(?shoeSize) = xsd:integer ) }
>> OK
/* TEST 61 */
/* 11.4.10 RDFterm-equal */
query:
<<
PREFIX foaf:
SELECT ?name1 ?name2
WHERE { ?x foaf:name ?name1 ;
foaf:mbox ?mbox1 .
?y foaf:name ?name2 ;
foaf:mbox ?mbox2 .
FILTER (?mbox1 = ?mbox2 && ?name1 != ?name2)
}
>> OK
/* TEST 62 */
/* 11.4.10 RDFterm-equal */
query:
<<
PREFIX a:
PREFIX dc:
PREFIX xsd:
SELECT ?annotates
WHERE { ?annot a:annotates ?annotates .
?annot dc:date ?date .
FILTER ( ?date = xsd:dateTime("2005-01-01T00:00:00Z") ) }
>> OK
/* TEST 63 */
/* 11.4.11 sameTerm */
query:
<<
PREFIX foaf:
SELECT ?name1 ?name2
WHERE { ?x foaf:name ?name1 ;
foaf:mbox ?mbox1 .
?y foaf:name ?name2 ;
foaf:mbox ?mbox2 .
FILTER (sameTerm(?mbox1, ?mbox2) && !sameTerm(?name1, ?name2))
}
>> OK
/* TEST 64 */
/* 11.4.11 sameTerm */
query:
<<
PREFIX :
PREFIX t:
SELECT ?aLabel1 ?bLabel
WHERE { ?a :label ?aLabel .
?a :weight ?aWeight .
?a :displacement ?aDisp .
?b :label ?bLabel .
?b :weight ?bWeight .
?b :displacement ?bDisp .
FILTER ( sameTerm(?aWeight, ?bWeight) && !sameTerm(?aDisp, ?bDisp)) }
>> OK
/* TEST 65 */
/* 11.4.12 langMatches */
query:
<<
PREFIX dc:
SELECT ?title
WHERE { ?x dc:title "That Seventies Show"@en ;
dc:title ?title .
FILTER langMatches( lang(?title), "FR" ) }
>> OK
/* TEST 66 */
/* 11.4.12 langMatches */
query:
<<
PREFIX dc:
SELECT ?title
WHERE { ?x dc:title ?title .
FILTER langMatches( lang(?title), "*" ) }
>> OK
/* TEST 67 */
/* 11.4.13 regex */
query:
<<
PREFIX foaf:
SELECT ?name
WHERE { ?x foaf:name ?name
FILTER regex(?name, "^ali", "i") }
>> OK
/* TEST 68 */
/* 11.6 Extensible Value Testing */
query:
<<
PREFIX foaf:
PREFIX func:
SELECT ?name ?id
WHERE { ?x foaf:name ?name ;
func:empId ?id .
FILTER (func:even(?id)) }
>> OK
/* TEST 69 */
/* 11.6 Extensible Value Testing */
query:
<<
PREFIX aGeo:
SELECT ?neighbor
WHERE { ?a aGeo:placeName "Grenoble" .
?a aGeo:location ?axLoc .
?a aGeo:location ?ayLoc .
?b aGeo:placeName ?neighbor .
?b aGeo:location ?bxLoc .
?b aGeo:location ?byLoc .
FILTER ( aGeo:distance(?axLoc, ?ayLoc, ?bxLoc, ?byLoc) < 10 ) .
}
>> OK
/* TEST 70 */
/* 10.3 ASK (http://www.w3.org/TR/rdf-sparql-query/#ask) */
query:
<<
PREFIX foaf:
ASK { ?x foaf:name "Alice" }
>> OK
/* TEST 71 */
/* 10.3 ASK (http://www.w3.org/TR/rdf-sparql-query/#ask) */
query:
<<
PREFIX foaf:
ASK
FROM
WHERE { ?x foaf:name ?name }
>> OK
/* TEST 72 */
/* 10.3 ASK (http://www.w3.org/TR/rdf-sparql-query/#ask) */
query:
<<
PREFIX foaf:
ASK { ?x foaf:name "Alice" ;
foaf:mbox }
>> OK
/**/
/* TEST 73 */
/* 10.2 CONSTRUCT (http://www.w3.org/TR/rdf-sparql-query/#construct) */
query:
<<
# The CONSTRUCT form returns an RDF graph specified by either a
# graph template or by "*". If a graph template is supplied, then
# the RDF graph is formed by taking each query solution and substituting
# the variables into the graph template and merging the triples into a
# single RDF graph:
PREFIX foaf:
PREFIX vcard:
CONSTRUCT { ?x foaf:name ?name }
WHERE { ?x vcard:FN ?name }
>> OK
/* TEST 74 */
/* 10.2 CONSTRUCT (http://www.w3.org/TR/rdf-sparql-query/#construct) */
query:
<<
PREFIX foaf:
PREFIX vcard:
CONSTRUCT { vcard:FN ?name }
WHERE { ?x foaf:name ?name }
>> OK
/* TEST 75 */
/* 10.2.1 Templates with Blank Nodes (http://www.w3.org/TR/rdf-sparql-query/#construct) */
query:
<<
PREFIX foaf:
PREFIX vcard:
CONSTRUCT { ?x vcard:N _:v .
_:v vcard:givenName ?gname .
_:v vcard:familyName ?fname }
WHERE
{
{ ?x foaf:firstname ?gname } UNION { ?x foaf:givenname ?gname } .
{ ?x foaf:surname ?fname } UNION { ?x foaf:family_name ?fname } .
}
>> OK
/* TEST 76 */
/* 10.4.1 Explicit IRIs (http://www.w3.org/TR/rdf-sparql-query/#describe) */
query:
<<
DESCRIBE
>> OK
/* TEST 77 */
/* 10.4.2 Identifying Resources (http://www.w3.org/TR/rdf-sparql-query/#describe) */
query:
<<
PREFIX foaf:
DESCRIBE ?x
WHERE { ?x foaf:mbox }
>> OK
/* TEST 78 */
/* 10.4.2 Identifying Resources (http://www.w3.org/TR/rdf-sparql-query/#describe) */
query:
<<
PREFIX foaf:
DESCRIBE ?x
WHERE { ?x foaf:name "Alice" }
>> OK
/* TEST 79 */
/* 10.4.2 Identifying Resources (http://www.w3.org/TR/rdf-sparql-query/#describe) */
query:
<<
PREFIX foaf:
DESCRIBE ?x ?y
WHERE {?x foaf:knows ?y}
>> OK
/* TEST 80 */
/* 10.4.3 Descriptions of Resources (http://www.w3.org/TR/rdf-sparql-query/#describe) */
query:
<<
PREFIX ent:
DESCRIBE ?x WHERE { ?x ent:employeeId "1234" }
>> OK