SPARQL 1.1 Grammar
QueryUnit ::= Query?
Query ::= Prologue
( SelectQuery | ConstructQuery | DescribeQuery | AskQuery )
UpdateUnit ::= Update
Prologue ::= ( BaseDecl | PrefixDecl )*
BaseDecl ::= 'BASE' IRIREF
PrefixDecl ::= 'PREFIX' PNAME_NS IRIREF
SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier ValuesClause
SubSelect ::= SelectClause WhereClause SolutionModifier ValuesClause
SelectClause ::= 'SELECT' ( 'DISTINCT' | 'REDUCED' )?
( ( Var | ( '(' Expression 'AS' Var ')' ) )+ | '*' )
ConstructQuery ::= 'CONSTRUCT'
( ConstructTemplate DatasetClause* WhereClause SolutionModifier
| DatasetClause* 'WHERE' '{' TriplesTemplate? '}' SolutionModifier )
ValuesClause
DescribeQuery ::= 'DESCRIBE' ( VarOrIri+ | '*' )
DatasetClause* WhereClause? SolutionModifier ValuesClause
AskQuery ::= 'ASK' DatasetClause* WhereClause ValuesClause
DatasetClause ::= 'FROM' ( DefaultGraphClause | NamedGraphClause )
DefaultGraphClause ::= SourceSelector
NamedGraphClause ::= 'NAMED' SourceSelector
SourceSelector ::= iri
WhereClause ::= 'WHERE'? GroupGraphPattern
SolutionModifier ::= GroupClause? HavingClause? OrderClause? LimitOffsetClauses?
GroupClause ::= 'GROUP' 'BY' GroupCondition+
GroupCondition ::= BuiltInCall | FunctionCall
| '(' Expression ( 'AS' Var )? ')' | Var
HavingClause ::= 'HAVING' HavingCondition+
HavingCondition ::= Constraint
OrderClause ::= 'ORDER' 'BY' OrderCondition+
OrderCondition ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression )
| ( Constraint | Var )
LimitOffsetClauses ::= LimitClause OffsetClause? | OffsetClause LimitClause?
LimitClause ::= 'LIMIT' INTEGER
OffsetClause ::= 'OFFSET' INTEGER
ValuesClause ::= ( 'VALUES' DataBlock )?
Update ::= Prologue ( Update1 ( ';' Update )? )?
Update1 ::= Load | Clear | Drop | Add | Move | Copy | Create | DeleteWhere | Modify
| InsertData | DeleteData
Load ::= 'LOAD' 'SILENT'? iri ( 'INTO' GraphRef )?
Clear ::= 'CLEAR' 'SILENT'? GraphRefAll
Drop ::= 'DROP' 'SILENT'? GraphRefAll
Create ::= 'CREATE' 'SILENT'? GraphRef
Add ::= 'ADD' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
Move ::= 'MOVE' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
Copy ::= 'COPY' 'SILENT'? GraphOrDefault 'TO' GraphOrDefault
InsertData ::= 'INSERT DATA' QuadData
DeleteData ::= 'DELETE DATA' QuadData
DeleteWhere ::= 'DELETE WHERE' QuadPattern
Modify ::= ( 'WITH' iri )?
( DeleteClause InsertClause? | InsertClause )
UsingClause* 'WHERE' GroupGraphPattern
DeleteClause ::= 'DELETE' QuadPattern
InsertClause ::= 'INSERT' QuadPattern
UsingClause ::= 'USING' ( iri | 'NAMED' iri )
GraphOrDefault ::= 'DEFAULT' | 'GRAPH'? iri
GraphRef ::= 'GRAPH' iri
GraphRefAll ::= GraphRef | 'DEFAULT' | 'NAMED' | 'ALL'
QuadPattern ::= '{' Quads '}'
QuadData ::= '{' Quads '}'
Quads ::= TriplesTemplate? ( QuadsNotTriples '.'? TriplesTemplate? )*
QuadsNotTriples ::= 'GRAPH' VarOrIri '{' TriplesTemplate? '}'
TriplesTemplate ::= TriplesSameSubject ( '.' TriplesTemplate? )?
GroupGraphPattern ::= '{' ( SubSelect | GroupGraphPatternSub ) '}'
GroupGraphPatternSub ::= TriplesBlock? ( GraphPatternNotTriples '.'? TriplesBlock? )*
TriplesBlock ::= TriplesSameSubjectPath ( '.' TriplesBlock? )?
GraphPatternNotTriples ::= GroupOrUnionGraphPattern | OptionalGraphPattern
| MinusGraphPattern | GraphGraphPattern
| ServiceGraphPattern | Filter | Bind | InlineData
OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern
GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern
ServiceGraphPattern ::= 'SERVICE' 'SILENT'? VarOrIri GroupGraphPattern
Bind ::= 'BIND' '(' Expression 'AS' Var ')'
InlineData ::= 'VALUES' DataBlock
DataBlock ::= InlineDataOneVar | InlineDataFull
InlineDataOneVar ::= Var '{' DataBlockValue* '}'
InlineDataFull ::= ( NIL | '(' Var* ')' )
'{' ( '(' DataBlockValue* ')' | NIL )* '}'
DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF'
MinusGraphPattern ::= 'MINUS' GroupGraphPattern
GroupOrUnionGraphPattern::= GroupGraphPattern ( 'UNION' GroupGraphPattern )*
Filter ::= 'FILTER' Constraint
Constraint ::= BrackettedExpression | BuiltInCall | FunctionCall
FunctionCall ::= iri ArgList
ArgList ::= NIL | '(' 'DISTINCT'? Expression ( ',' Expression )* ')'
ExpressionList ::= NIL | '(' Expression ( ',' Expression )* ')'
ConstructTemplate ::= '{' ConstructTriples? '}'
ConstructTriples ::= TriplesSameSubject ( '.' ConstructTriples? )?
TriplesSameSubject ::= VarOrTerm PropertyListNotEmpty
| TriplesNode PropertyList
PropertyList ::= PropertyListNotEmpty?
PropertyListNotEmpty ::= Verb ObjectList ( ';' ( Verb ObjectList )? )*
Verb ::= VarOrIri | 'a'
ObjectList ::= Object ( ',' Object )*
Object ::= GraphNode
TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty
| TriplesNodePath PropertyListPath
PropertyListPath ::= PropertyListPathNotEmpty?
PropertyListPathNotEmpty::= ( VerbPath | VerbSimple ) ObjectListPath
( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
VerbPath ::= Path
VerbSimple ::= Var
ObjectListPath ::= ObjectPath ( ',' ObjectPath )*
ObjectPath ::= GraphNodePath
Path ::= PathAlternative
PathAlternative ::= PathSequence ( '|' PathSequence )*
PathSequence ::= PathEltOrInverse ( '/' PathEltOrInverse )*
PathElt ::= PathPrimary PathMod?
PathEltOrInverse ::= PathElt | '^' PathElt
PathMod ::= '*' | '?' | '+' | '{' INTEGER? (',' INTEGER?)? '}'
PathPrimary ::= iri | 'a' | '!' PathNegatedPropertySet | '(' Path ')'
PathNegatedPropertySet ::= PathOneInPropertySet
| '(' ( PathOneInPropertySet ( '|' PathOneInPropertySet )* )? ')'
PathOneInPropertySet ::= iri | 'a' | '^' ( iri | 'a' )
Integer ::= INTEGER
TriplesNode ::= Collection | BlankNodePropertyList
BlankNodePropertyList ::= '[' PropertyListNotEmpty ']'
TriplesNodePath ::= CollectionPath | BlankNodePropertyListPath
BlankNodePropertyListPath::= '[' PropertyListPathNotEmpty ']'
Collection ::= '(' GraphNode+ ')'
CollectionPath ::= '(' GraphNodePath+ ')'
GraphNode ::= VarOrTerm | TriplesNode
GraphNodePath ::= VarOrTerm | TriplesNodePath
VarOrTerm ::= Var | GraphTerm
VarOrIri ::= Var | iri
Var ::= VAR1 | VAR2
GraphTerm ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral
| BlankNode | NIL
Expression ::= ConditionalOrExpression
ConditionalOrExpression ::= ConditionalAndExpression
( '||' ConditionalAndExpression )*
ConditionalAndExpression::= ValueLogical ( '&&' ValueLogical )*
ValueLogical ::= RelationalExpression
RelationalExpression ::= NumericExpression
( '=' NumericExpression
| '!=' NumericExpression
| '<' NumericExpression
| '>' NumericExpression
| '<=' NumericExpression
| '>=' NumericExpression
| 'IN' ExpressionList
| 'NOT' 'IN' ExpressionList )?
NumericExpression ::= AdditiveExpression
AdditiveExpression ::= MultiplicativeExpression
( '+' MultiplicativeExpression
| '-' MultiplicativeExpression
| ( NumericLiteralPositive | NumericLiteralNegative )
( ( '*' UnaryExpression ) | ( '/' UnaryExpression ) )? )*
MultiplicativeExpression::= UnaryExpression ( '*' UnaryExpression | '/' UnaryExpression )*
UnaryExpression ::= '!' PrimaryExpression
| '+' PrimaryExpression
| '-' PrimaryExpression
| PrimaryExpression
PrimaryExpression ::= BrackettedExpression | BuiltInCall | iriOrFunction
| RDFLiteral | NumericLiteral | BooleanLiteral
| Var
BrackettedExpression ::= '(' Expression ')'
BuiltInCall ::= Aggregate
| 'STR' '(' Expression ')'
| 'LANG' '(' Expression ')'
| 'LANGMATCHES' '(' Expression ',' Expression ')'
| 'DATATYPE' '(' Expression ')'
| 'BOUND' '(' Var ')'
| 'IRI' '(' Expression ')'
| 'URI' '(' Expression ')'
| 'BNODE' ( '(' Expression ')' | NIL )
| 'RAND' NIL
| 'ABS' '(' Expression ')'
| 'CEIL' '(' Expression ')'
| 'FLOOR' '(' Expression ')'
| 'ROUND' '(' Expression ')'
| 'CONCAT' ExpressionList
| SubstringExpression
| 'STRLEN' '(' Expression ')'
| StrReplaceExpression
| 'UCASE' '(' Expression ')'
| 'LCASE' '(' Expression ')'
| 'ENCODE_FOR_URI' '(' Expression ')'
| 'CONTAINS' '(' Expression ',' Expression ')'
| 'STRSTARTS' '(' Expression ',' Expression ')'
| 'STRENDS' '(' Expression ',' Expression ')'
| 'STRBEFORE' '(' Expression ',' Expression ')'
| 'STRAFTER' '(' Expression ',' Expression ')'
| 'YEAR' '(' Expression ')'
| 'MONTH' '(' Expression ')'
| 'DAY' '(' Expression ')'
| 'HOURS' '(' Expression ')'
| 'MINUTES' '(' Expression ')'
| 'SECONDS' '(' Expression ')'
| 'TIMEZONE' '(' Expression ')'
| 'TZ' '(' Expression ')'
| 'NOW' NIL
| 'UUID' NIL
| 'STRUUID' NIL
| 'MD5' '(' Expression ')'
| 'SHA1' '(' Expression ')'
| 'SHA224' '(' Expression ')'
| 'SHA256' '(' Expression ')'
| 'SHA384' '(' Expression ')'
| 'SHA512' '(' Expression ')'
| 'COALESCE' ExpressionList
| 'IF' '(' Expression ',' Expression ',' Expression ')'
| 'STRLANG' '(' Expression ',' Expression ')'
| 'STRDT' '(' Expression ',' Expression ')'
| 'sameTerm' '(' Expression ',' Expression ')'
| 'isIRI' '(' Expression ')'
| 'isURI' '(' Expression ')'
| 'isBLANK' '(' Expression ')'
| 'isLITERAL' '(' Expression ')'
| 'isNUMERIC' '(' Expression ')'
| 'ADJUST' '(' Expression ',' Expression ')'
| RegexExpression
| ExistsFunc
| NotExistsFunc
RegexExpression ::= 'REGEX' '(' Expression ',' Expression ( ',' Expression )? ')'
SubstringExpression ::= 'SUBSTR' '(' Expression ',' Expression ( ',' Expression )? ')'
StrReplaceExpression ::= 'REPLACE' '(' Expression ',' Expression ',' Expression ( ',' Expression )? ')'
ExistsFunc ::= 'EXISTS' GroupGraphPattern
NotExistsFunc ::= 'NOT' 'EXISTS' GroupGraphPattern
Aggregate ::= 'COUNT' '(' 'DISTINCT'? ( '*' | Expression ) ')'
| 'SUM' '(' 'DISTINCT'? Expression ')'
| 'MIN' '(' 'DISTINCT'? Expression ')'
| 'MAX' '(' 'DISTINCT'? Expression ')'
| 'AVG' '(' 'DISTINCT'? Expression ')'
| 'SAMPLE' '(' 'DISTINCT'? Expression ')'
| 'GROUP_CONCAT' '(' 'DISTINCT'? Expression
( ';' 'SEPARATOR' '=' String )? ')'
iriOrFunction ::= iri ArgList?
RDFLiteral ::= String ( LANGTAG | ( '^^' iri ) )?
NumericLiteral ::= NumericLiteralUnsigned | NumericLiteralPositive | NumericLiteralNegative
NumericLiteralUnsigned ::= INTEGER | DECIMAL | DOUBLE
NumericLiteralPositive ::= INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE
NumericLiteralNegative ::= INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE
BooleanLiteral ::= 'true' | 'false'
String ::= STRING_LITERAL1 | STRING_LITERAL2
| STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2
iri ::= IRIREF | PrefixedName
PrefixedName ::= PNAME_LN | PNAME_NS
BlankNode ::= BLANK_NODE_LABEL | ANON
DataValueTerm ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral
@terminals
IRIREF ::= '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
PNAME_NS ::= PN_PREFIX? ':'
PNAME_LN ::= PNAME_NS PN_LOCAL
BLANK_NODE_LABEL ::= '_:' ( PN_CHARS_U | [0-9] ) ((PN_CHARS|'.')* PN_CHARS)?
VAR1 ::= '?' VARNAME
VAR2 ::= '$' VARNAME
LANGTAG ::= '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*
INTEGER ::= [0-9]+
DECIMAL ::= [0-9]* '.' [0-9]+
DOUBLE ::= [0-9]+ '.' [0-9]* EXPONENT
| '.' ([0-9])+ EXPONENT | ([0-9])+ EXPONENT
INTEGER_POSITIVE ::= '+' INTEGER
DECIMAL_POSITIVE ::= '+' DECIMAL
DOUBLE_POSITIVE ::= '+' DOUBLE
INTEGER_NEGATIVE ::= '-' INTEGER
DECIMAL_NEGATIVE ::= '-' DECIMAL
DOUBLE_NEGATIVE ::= '-' DOUBLE
EXPONENT ::= [eE] [+-]? [0-9]+
STRING_LITERAL1 ::= "'" ( ([^#x27#x5C#xA#xD]) | ECHAR )* "'"
STRING_LITERAL2 ::= '"' ( ([^#x22#x5C#xA#xD]) | ECHAR )* '"'
STRING_LITERAL_LONG1 ::= "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR ) )* "'''"
STRING_LITERAL_LONG2 ::= '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR ) )* '"""'
ECHAR ::= '\' [tbnrf\"'] #
NIL ::= '(' WS* ')' #
WS ::= #x20 | #x9 | #xD | #xA
ANON ::= '[' WS* ']'
PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6]
| [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D]
| [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F]
| [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF]
| [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] #
PN_CHARS_U ::= PN_CHARS_BASE | '_'
VARNAME ::= ( PN_CHARS_U | [0-9] )
( PN_CHARS_U | [0-9]
| #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*
PN_CHARS ::= PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] #
PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS|'.')* PN_CHARS)?
PN_LOCAL ::= (PN_CHARS_U | ':' | [0-9] | PLX ) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX) )?
PLX ::= PERCENT | PN_LOCAL_ESC
PERCENT ::= '%' HEX HEX #
HEX ::= [0-9] | [A-F] | [a-f] #
PN_LOCAL_ESC ::= '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '='
| '/' | '?' | '