/* * 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