@prefix sps: <https://w3id.org/sparql-syntax#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dct: <http://purl.org/dc/terms/> .

#
# SPARQL Syntax Vocabulary
#
# A vocabulary for representing the syntax of SPARQL 1.2 queries and updates
# as RDF, modeled on the grammar of the SPARQL 1.2 Query Language
# (https://www.w3.org/TR/sparql12-query/#sparqlGrammar) and SPARQL 1.2 Update.
#
# Modeling decisions:
# - IRIs and literals occurring in a query appear as themselves (native RDF
#   terms); prefixed names and relative IRIs are resolved against the prologue.
#   Prefix and base declarations are not reified.
# - Variables are blank nodes typed sps:Variable with sps:varName; one node is
#   shared per distinct variable name per query.
# - Blank nodes written in query syntax are nodes typed sps:BlankNode (with
#   sps:label when labeled), distinct from the structural blank nodes that
#   make up the representation itself.
# - Ordered constructs (pattern elements, projections, templates, arguments,
#   path elements, VALUES rows, update operation sequences) use rdf:List.
#   Unordered repeatable clauses (FROM, USING) use repeated properties.
# - Syntactic sugar is desugared the way the SPARQL 1.2 spec does: collections
#   and blank node property lists expand to triple patterns; reified triples
#   and annotation blocks expand to rdf:reifies triple patterns. Triple terms
#   are represented structurally as sps:TripleTerm nodes because their
#   components may be variables.
#

<https://w3id.org/sparql-syntax> a owl:Ontology ;
    dct:title "SPARQL Syntax Vocabulary"@en ;
    rdfs:comment "A vocabulary for representing the syntax of SPARQL 1.2 queries and updates as RDF."@en ;
    rdfs:seeAlso <https://www.w3.org/TR/sparql12-query/> , <https://www.w3.org/TR/sparql12-update/> ;
    owl:versionInfo "1.0.0" .

# ==========================================
# Query forms
# ==========================================

sps:Query a rdfs:Class ;
    rdfs:label "Query"@en ;
    rdfs:comment "Abstract superclass of the four SPARQL query forms."@en .

sps:SelectQuery a rdfs:Class ;
    rdfs:subClassOf sps:Query ;
    rdfs:label "SELECT query"@en ;
    rdfs:comment "A SELECT query. SPARQL 1.2 grammar production [9]."@en .

sps:ConstructQuery a rdfs:Class ;
    rdfs:subClassOf sps:Query ;
    rdfs:label "CONSTRUCT query"@en ;
    rdfs:comment "A CONSTRUCT query. SPARQL 1.2 grammar production [12]."@en .

sps:DescribeQuery a rdfs:Class ;
    rdfs:subClassOf sps:Query ;
    rdfs:label "DESCRIBE query"@en ;
    rdfs:comment "A DESCRIBE query. SPARQL 1.2 grammar production [13]."@en .

sps:AskQuery a rdfs:Class ;
    rdfs:subClassOf sps:Query ;
    rdfs:label "ASK query"@en ;
    rdfs:comment "An ASK query. SPARQL 1.2 grammar production [14]."@en .

sps:SubSelect a rdfs:Class ;
    rdfs:label "Sub-select"@en ;
    rdfs:comment "A sub-select appearing as a group graph pattern element. SPARQL 1.2 grammar production [10]."@en .

# ==========================================
# Update operations
# ==========================================

sps:Update a rdfs:Class ;
    rdfs:label "Update request"@en ;
    rdfs:comment "The root node of a SPARQL update request; holds the ordered sequence of update operations. SPARQL 1.2 Update grammar production [31]."@en .

sps:Load a rdfs:Class ;
    rdfs:label "LOAD"@en ;
    rdfs:comment "A LOAD operation. SPARQL 1.2 Update grammar production [33]."@en .

sps:Clear a rdfs:Class ;
    rdfs:label "CLEAR"@en ;
    rdfs:comment "A CLEAR operation. SPARQL 1.2 Update grammar production [34]."@en .

sps:Drop a rdfs:Class ;
    rdfs:label "DROP"@en ;
    rdfs:comment "A DROP operation. SPARQL 1.2 Update grammar production [35]."@en .

sps:Create a rdfs:Class ;
    rdfs:label "CREATE"@en ;
    rdfs:comment "A CREATE operation. SPARQL 1.2 Update grammar production [36]."@en .

sps:Add a rdfs:Class ;
    rdfs:label "ADD"@en ;
    rdfs:comment "An ADD operation. SPARQL 1.2 Update grammar production [37]."@en .

sps:Move a rdfs:Class ;
    rdfs:label "MOVE"@en ;
    rdfs:comment "A MOVE operation. SPARQL 1.2 Update grammar production [38]."@en .

sps:Copy a rdfs:Class ;
    rdfs:label "COPY"@en ;
    rdfs:comment "A COPY operation. SPARQL 1.2 Update grammar production [39]."@en .

sps:InsertData a rdfs:Class ;
    rdfs:label "INSERT DATA"@en ;
    rdfs:comment "An INSERT DATA operation. SPARQL 1.2 Update grammar production [40]."@en .

sps:DeleteData a rdfs:Class ;
    rdfs:label "DELETE DATA"@en ;
    rdfs:comment "A DELETE DATA operation. SPARQL 1.2 Update grammar production [41]."@en .

sps:DeleteWhere a rdfs:Class ;
    rdfs:label "DELETE WHERE"@en ;
    rdfs:comment "A DELETE WHERE operation. SPARQL 1.2 Update grammar production [42]."@en .

sps:Modify a rdfs:Class ;
    rdfs:label "DELETE/INSERT"@en ;
    rdfs:comment "A DELETE/INSERT operation with a WHERE clause. SPARQL 1.2 Update grammar production [43]."@en .

# ==========================================
# Terms
# ==========================================

sps:Variable a rdfs:Class ;
    rdfs:label "Variable"@en ;
    rdfs:comment "A SPARQL variable (?name or $name). One node is shared per distinct variable name within a query."@en .

sps:BlankNode a rdfs:Class ;
    rdfs:label "Blank node"@en ;
    rdfs:comment "A blank node written in query syntax (_:label, [], [...] or a collection cell), as opposed to the structural blank nodes of the representation itself."@en .

sps:TripleTerm a rdfs:Class ;
    rdfs:label "Triple term"@en ;
    rdfs:comment "An RDF 1.2 triple term <<( s p o )>>. Represented structurally because its components may be variables. SPARQL 1.2 grammar production [113]."@en .

# ==========================================
# Graph pattern elements
# ==========================================

sps:TriplePattern a rdfs:Class ;
    rdfs:label "Triple pattern"@en ;
    rdfs:comment "A single subject-predicate-object pattern or template triple."@en .

sps:Group a rdfs:Class ;
    rdfs:label "Group"@en ;
    rdfs:comment "An explicit nested group graph pattern { ... }, including the branches of a UNION. SPARQL 1.2 grammar production [55]."@en .

sps:Optional a rdfs:Class ;
    rdfs:label "OPTIONAL"@en ;
    rdfs:comment "An OPTIONAL graph pattern. SPARQL 1.2 grammar production [60]."@en .

sps:Union a rdfs:Class ;
    rdfs:label "UNION"@en ;
    rdfs:comment "A UNION of two or more group graph patterns. SPARQL 1.2 grammar production [70]."@en .

sps:Minus a rdfs:Class ;
    rdfs:label "MINUS"@en ;
    rdfs:comment "A MINUS graph pattern. SPARQL 1.2 grammar production [69]."@en .

sps:Graph a rdfs:Class ;
    rdfs:label "GRAPH"@en ;
    rdfs:comment "A GRAPH graph pattern, also used for GRAPH blocks inside update quad templates. SPARQL 1.2 grammar production [61]."@en .

sps:Service a rdfs:Class ;
    rdfs:label "SERVICE"@en ;
    rdfs:comment "A SERVICE graph pattern. SPARQL 1.2 grammar production [62]."@en .

sps:Filter a rdfs:Class ;
    rdfs:label "FILTER"@en ;
    rdfs:comment "A FILTER constraint. SPARQL 1.2 grammar production [71]."@en .

sps:Bind a rdfs:Class ;
    rdfs:label "BIND"@en ;
    rdfs:comment "A BIND assignment. SPARQL 1.2 grammar production [63]."@en .

sps:Values a rdfs:Class ;
    rdfs:label "VALUES"@en ;
    rdfs:comment "An inline data block (VALUES), either inside a group graph pattern or trailing a query. SPARQL 1.2 grammar productions [64]-[67]."@en .

sps:Exists a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "EXISTS"@en ;
    rdfs:comment "An EXISTS expression with an embedded graph pattern. SPARQL 1.2 grammar production [135]."@en .

sps:NotExists a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "NOT EXISTS"@en ;
    rdfs:comment "A NOT EXISTS expression with an embedded graph pattern. SPARQL 1.2 grammar production [136]."@en .

# ==========================================
# Property paths
# ==========================================

sps:SeqPath a rdfs:Class ;
    rdfs:label "Sequence path"@en ;
    rdfs:comment "A property path sequence (elt1 / elt2). SPARQL 1.2 grammar production [93]."@en .

sps:AltPath a rdfs:Class ;
    rdfs:label "Alternative path"@en ;
    rdfs:comment "A property path alternative (elt1 | elt2). SPARQL 1.2 grammar production [92]."@en .

sps:InversePath a rdfs:Class ;
    rdfs:label "Inverse path"@en ;
    rdfs:comment "An inverse property path (^elt). SPARQL 1.2 grammar production [95]."@en .

sps:ZeroOrMorePath a rdfs:Class ;
    rdfs:label "Zero-or-more path"@en ;
    rdfs:comment "A property path with the * modifier. SPARQL 1.2 grammar production [96]."@en .

sps:OneOrMorePath a rdfs:Class ;
    rdfs:label "One-or-more path"@en ;
    rdfs:comment "A property path with the + modifier. SPARQL 1.2 grammar production [96]."@en .

sps:ZeroOrOnePath a rdfs:Class ;
    rdfs:label "Zero-or-one path"@en ;
    rdfs:comment "A property path with the ? modifier. SPARQL 1.2 grammar production [96]."@en .

sps:NegatedPath a rdfs:Class ;
    rdfs:label "Negated property set"@en ;
    rdfs:comment "A negated property set (!iri or !(iri1 | ^iri2 | ...)). SPARQL 1.2 grammar production [98]."@en .

# ==========================================
# Expressions
# ==========================================

sps:Expression a rdfs:Class ;
    rdfs:label "Expression"@en ;
    rdfs:comment "Abstract superclass of all compound SPARQL expressions. Atomic expressions (variables, IRIs, literals) appear directly as terms."@en .

sps:Or a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Logical or"@en ;
    rdfs:comment "A logical || expression."@en .

sps:And a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Logical and"@en ;
    rdfs:comment "A logical && expression."@en .

sps:Eq a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Equal"@en ;
    rdfs:comment "An = comparison."@en .

sps:Neq a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Not equal"@en ;
    rdfs:comment "A != comparison."@en .

sps:Lt a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Less than"@en ;
    rdfs:comment "A < comparison."@en .

sps:Gt a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Greater than"@en ;
    rdfs:comment "A > comparison."@en .

sps:Leq a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Less than or equal"@en ;
    rdfs:comment "A <= comparison."@en .

sps:Geq a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Greater than or equal"@en ;
    rdfs:comment "A >= comparison."@en .

sps:In a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "IN"@en ;
    rdfs:comment "An IN expression; sps:arg1 holds the tested expression, sps:args the list of candidates."@en .

sps:NotIn a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "NOT IN"@en ;
    rdfs:comment "A NOT IN expression; sps:arg1 holds the tested expression, sps:args the list of candidates."@en .

sps:Addition a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Addition"@en ;
    rdfs:comment "An arithmetic + expression."@en .

sps:Subtraction a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Subtraction"@en ;
    rdfs:comment "An arithmetic - expression."@en .

sps:Multiplication a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Multiplication"@en ;
    rdfs:comment "An arithmetic * expression."@en .

sps:Division a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Division"@en ;
    rdfs:comment "An arithmetic / expression."@en .

sps:UnaryNot a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Unary not"@en ;
    rdfs:comment "A unary ! expression."@en .

sps:UnaryPlus a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Unary plus"@en ;
    rdfs:comment "A unary + expression."@en .

sps:UnaryMinus a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Unary minus"@en ;
    rdfs:comment "A unary - expression."@en .

sps:FunctionCall a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Function call"@en ;
    rdfs:comment "A call of a custom function identified by IRI. SPARQL 1.2 grammar production [73]."@en .

sps:BuiltInCall a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Built-in call"@en ;
    rdfs:comment "A call of a SPARQL built-in function; sps:function points to the built-in function individual. SPARQL 1.2 grammar production [131]."@en .

sps:BuiltInFunction a rdfs:Class ;
    rdfs:label "Built-in function"@en ;
    rdfs:comment "The class of SPARQL built-in function individuals."@en .

# ==========================================
# Aggregates
# ==========================================

sps:Aggregate a rdfs:Class ;
    rdfs:subClassOf sps:Expression ;
    rdfs:label "Aggregate"@en ;
    rdfs:comment "Abstract superclass of the SPARQL aggregates. SPARQL 1.2 grammar production [137]."@en .

sps:Count a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "COUNT"@en .

sps:Sum a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "SUM"@en .

sps:Min a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "MIN"@en .

sps:Max a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "MAX"@en .

sps:Avg a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "AVG"@en .

sps:Sample a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "SAMPLE"@en .

sps:GroupConcat a rdfs:Class ;
    rdfs:subClassOf sps:Aggregate ;
    rdfs:label "GROUP_CONCAT"@en .

# ==========================================
# Miscellaneous structure
# ==========================================

sps:Alias a rdfs:Class ;
    rdfs:label "Alias"@en ;
    rdfs:comment "An (expression AS ?variable) alias in a SELECT clause or GROUP BY condition."@en .

sps:Asc a rdfs:Class ;
    rdfs:label "Ascending"@en ;
    rdfs:comment "An explicit ASC(...) order condition."@en .

sps:Desc a rdfs:Class ;
    rdfs:label "Descending"@en ;
    rdfs:comment "A DESC(...) order condition."@en .

# ==========================================
# Named individuals
# ==========================================

sps:undef a rdfs:Resource ;
    rdfs:label "UNDEF"@en ;
    rdfs:comment "The UNDEF marker in a VALUES binding row."@en .

sps:DefaultGraph a rdfs:Resource ;
    rdfs:label "DEFAULT"@en ;
    rdfs:comment "The default graph as target of an update operation (DEFAULT keyword)."@en .

sps:NamedGraphs a rdfs:Resource ;
    rdfs:label "NAMED"@en ;
    rdfs:comment "All named graphs as target of CLEAR or DROP (NAMED keyword)."@en .

sps:AllGraphs a rdfs:Resource ;
    rdfs:label "ALL"@en ;
    rdfs:comment "All graphs as target of CLEAR or DROP (ALL keyword)."@en .

# ==========================================
# Properties
# ==========================================

sps:version a rdf:Property ;
    rdfs:label "version"@en ;
    rdfs:comment "The version string of a VERSION declaration. SPARQL 1.2 grammar production [7]."@en ;
    rdfs:range xsd:string .

sps:where a rdf:Property ;
    rdfs:label "where"@en ;
    rdfs:comment "The WHERE clause of a query, sub-select, DELETE/INSERT or DELETE WHERE operation: an rdf:List of graph pattern elements."@en ;
    rdfs:range rdf:List .

sps:projection a rdf:Property ;
    rdfs:label "projection"@en ;
    rdfs:comment "The projection of a SELECT query: an rdf:List of sps:Variable or sps:Alias nodes."@en ;
    rdfs:range rdf:List .

sps:star a rdf:Property ;
    rdfs:label "star"@en ;
    rdfs:comment "True if the query uses SELECT * or DESCRIBE *."@en ;
    rdfs:range xsd:boolean .

sps:distinct a rdf:Property ;
    rdfs:label "distinct"@en ;
    rdfs:comment "True if the SELECT clause, aggregate or argument list carries the DISTINCT modifier."@en ;
    rdfs:range xsd:boolean .

sps:reduced a rdf:Property ;
    rdfs:label "reduced"@en ;
    rdfs:comment "True if the SELECT clause carries the REDUCED modifier."@en ;
    rdfs:domain sps:SelectQuery ;
    rdfs:range xsd:boolean .

sps:template a rdf:Property ;
    rdfs:label "template"@en ;
    rdfs:comment "The template of a CONSTRUCT query: an rdf:List of sps:TriplePattern nodes."@en ;
    rdfs:domain sps:ConstructQuery ;
    rdfs:range rdf:List .

sps:describeTargets a rdf:Property ;
    rdfs:label "describe targets"@en ;
    rdfs:comment "The targets of a DESCRIBE query: an rdf:List of sps:Variable nodes or IRIs."@en ;
    rdfs:domain sps:DescribeQuery ;
    rdfs:range rdf:List .

sps:from a rdf:Property ;
    rdfs:label "from"@en ;
    rdfs:comment "A FROM dataset clause IRI (repeated for multiple clauses)."@en .

sps:fromNamed a rdf:Property ;
    rdfs:label "from named"@en ;
    rdfs:comment "A FROM NAMED dataset clause IRI (repeated for multiple clauses)."@en .

sps:subject a rdf:Property ;
    rdfs:label "subject"@en ;
    rdfs:comment "The subject of a triple pattern or triple term."@en .

sps:predicate a rdf:Property ;
    rdfs:label "predicate"@en ;
    rdfs:comment "The predicate of a triple pattern or triple term: an IRI, sps:Variable, or property path node."@en .

sps:object a rdf:Property ;
    rdfs:label "object"@en ;
    rdfs:comment "The object of a triple pattern or triple term."@en .

sps:elements a rdf:Property ;
    rdfs:label "elements"@en ;
    rdfs:comment "The ordered elements of a group, OPTIONAL, MINUS, GRAPH, SERVICE, EXISTS, NOT EXISTS or UNION: an rdf:List."@en ;
    rdfs:range rdf:List .

sps:graph a rdf:Property ;
    rdfs:label "graph"@en ;
    rdfs:comment "The graph name (variable or IRI) of a GRAPH pattern or graph block, or the IRI of a CREATE or GRAPH reference."@en .

sps:endpoint a rdf:Property ;
    rdfs:label "endpoint"@en ;
    rdfs:comment "The endpoint (variable or IRI) of a SERVICE pattern."@en ;
    rdfs:domain sps:Service .

sps:silent a rdf:Property ;
    rdfs:label "silent"@en ;
    rdfs:comment "True if the operation or SERVICE pattern carries the SILENT modifier."@en ;
    rdfs:range xsd:boolean .

sps:expression a rdf:Property ;
    rdfs:label "expression"@en ;
    rdfs:comment "The expression of a FILTER, BIND, alias, order condition or aggregate."@en .

sps:variable a rdf:Property ;
    rdfs:label "variable"@en ;
    rdfs:comment "The target variable of a BIND or alias."@en ;
    rdfs:range sps:Variable .

sps:varName a rdf:Property ;
    rdfs:label "variable name"@en ;
    rdfs:comment "The name of a variable, without the ? or $ sigil."@en ;
    rdfs:domain sps:Variable ;
    rdfs:range xsd:string .

sps:label a rdf:Property ;
    rdfs:label "label"@en ;
    rdfs:comment "The label of a syntactic blank node, without the _: prefix. Absent for anonymous blank nodes."@en ;
    rdfs:domain sps:BlankNode ;
    rdfs:range xsd:string .

sps:arg a rdf:Property ;
    rdfs:label "argument"@en ;
    rdfs:comment "The operand of a unary operator expression."@en .

sps:arg1 a rdf:Property ;
    rdfs:label "first argument"@en ;
    rdfs:comment "The left operand of a binary operator expression."@en .

sps:arg2 a rdf:Property ;
    rdfs:label "second argument"@en ;
    rdfs:comment "The right operand of a binary operator expression."@en .

sps:args a rdf:Property ;
    rdfs:label "arguments"@en ;
    rdfs:comment "The ordered arguments of a function call, built-in call, or IN/NOT IN expression: an rdf:List."@en ;
    rdfs:range rdf:List .

sps:function a rdf:Property ;
    rdfs:label "function"@en ;
    rdfs:comment "The function of a call: an IRI for custom functions, a sps:BuiltInFunction individual for built-ins."@en .

sps:groupBy a rdf:Property ;
    rdfs:label "group by"@en ;
    rdfs:comment "The GROUP BY conditions: an rdf:List of variables, expressions or sps:Alias nodes."@en ;
    rdfs:range rdf:List .

sps:having a rdf:Property ;
    rdfs:label "having"@en ;
    rdfs:comment "The HAVING conditions: an rdf:List of expressions."@en ;
    rdfs:range rdf:List .

sps:orderBy a rdf:Property ;
    rdfs:label "order by"@en ;
    rdfs:comment "The ORDER BY conditions: an rdf:List of variables, expressions, or sps:Asc/sps:Desc nodes."@en ;
    rdfs:range rdf:List .

sps:limit a rdf:Property ;
    rdfs:label "limit"@en ;
    rdfs:comment "The LIMIT of a query."@en ;
    rdfs:range xsd:integer .

sps:offset a rdf:Property ;
    rdfs:label "offset"@en ;
    rdfs:comment "The OFFSET of a query."@en ;
    rdfs:range xsd:integer .

sps:values a rdf:Property ;
    rdfs:label "values"@en ;
    rdfs:comment "The trailing VALUES clause of a query or sub-select."@en ;
    rdfs:range sps:Values .

sps:variables a rdf:Property ;
    rdfs:label "variables"@en ;
    rdfs:comment "The variables of a VALUES block: an rdf:List of sps:Variable nodes."@en ;
    rdfs:domain sps:Values ;
    rdfs:range rdf:List .

sps:bindings a rdf:Property ;
    rdfs:label "bindings"@en ;
    rdfs:comment "The binding rows of a VALUES block: an rdf:List of rows, each row an rdf:List of terms or sps:undef."@en ;
    rdfs:domain sps:Values ;
    rdfs:range rdf:List .

sps:pathElements a rdf:Property ;
    rdfs:label "path elements"@en ;
    rdfs:comment "The ordered sub-paths of a sequence, alternative or negated property path: an rdf:List."@en ;
    rdfs:range rdf:List .

sps:path a rdf:Property ;
    rdfs:label "path"@en ;
    rdfs:comment "The sub-path of an inverse or modified property path."@en .

sps:countStar a rdf:Property ;
    rdfs:label "count star"@en ;
    rdfs:comment "True for COUNT(*)."@en ;
    rdfs:domain sps:Count ;
    rdfs:range xsd:boolean .

sps:separator a rdf:Property ;
    rdfs:label "separator"@en ;
    rdfs:comment "The SEPARATOR of a GROUP_CONCAT aggregate."@en ;
    rdfs:domain sps:GroupConcat ;
    rdfs:range xsd:string .

sps:operations a rdf:Property ;
    rdfs:label "operations"@en ;
    rdfs:comment "The ordered update operations of an update request: an rdf:List."@en ;
    rdfs:domain sps:Update ;
    rdfs:range rdf:List .

sps:source a rdf:Property ;
    rdfs:label "source"@en ;
    rdfs:comment "The source document IRI of a LOAD operation."@en ;
    rdfs:domain sps:Load .

sps:into a rdf:Property ;
    rdfs:label "into"@en ;
    rdfs:comment "The target graph IRI of a LOAD ... INTO GRAPH operation."@en ;
    rdfs:domain sps:Load .

sps:graphTarget a rdf:Property ;
    rdfs:label "graph target"@en ;
    rdfs:comment "The target of a CLEAR or DROP operation: a graph IRI, sps:DefaultGraph, sps:NamedGraphs or sps:AllGraphs."@en .

sps:fromGraph a rdf:Property ;
    rdfs:label "from graph"@en ;
    rdfs:comment "The source graph of an ADD, MOVE or COPY operation: a graph IRI or sps:DefaultGraph."@en .

sps:toGraph a rdf:Property ;
    rdfs:label "to graph"@en ;
    rdfs:comment "The target graph of an ADD, MOVE or COPY operation: a graph IRI or sps:DefaultGraph."@en .

sps:data a rdf:Property ;
    rdfs:label "data"@en ;
    rdfs:comment "The quad data of an INSERT DATA or DELETE DATA operation: an rdf:List of sps:TriplePattern and sps:Graph nodes."@en ;
    rdfs:range rdf:List .

sps:deleteTemplate a rdf:Property ;
    rdfs:label "delete template"@en ;
    rdfs:comment "The DELETE template of a DELETE/INSERT operation: an rdf:List of sps:TriplePattern and sps:Graph nodes."@en ;
    rdfs:domain sps:Modify ;
    rdfs:range rdf:List .

sps:insertTemplate a rdf:Property ;
    rdfs:label "insert template"@en ;
    rdfs:comment "The INSERT template of a DELETE/INSERT operation: an rdf:List of sps:TriplePattern and sps:Graph nodes."@en ;
    rdfs:domain sps:Modify ;
    rdfs:range rdf:List .

sps:withGraph a rdf:Property ;
    rdfs:label "with graph"@en ;
    rdfs:comment "The WITH graph IRI of a DELETE/INSERT operation."@en ;
    rdfs:domain sps:Modify .

sps:using a rdf:Property ;
    rdfs:label "using"@en ;
    rdfs:comment "A USING clause IRI of a DELETE/INSERT operation (repeated for multiple clauses)."@en ;
    rdfs:domain sps:Modify .

sps:usingNamed a rdf:Property ;
    rdfs:label "using named"@en ;
    rdfs:comment "A USING NAMED clause IRI of a DELETE/INSERT operation (repeated for multiple clauses)."@en ;
    rdfs:domain sps:Modify .

# ==========================================
# Built-in function individuals
# ==========================================

sps:STR a sps:BuiltInFunction ; rdfs:label "STR" .
sps:LANG a sps:BuiltInFunction ; rdfs:label "LANG" .
sps:LANGMATCHES a sps:BuiltInFunction ; rdfs:label "LANGMATCHES" .
sps:LANGDIR a sps:BuiltInFunction ; rdfs:label "LANGDIR" .
sps:DATATYPE a sps:BuiltInFunction ; rdfs:label "DATATYPE" .
sps:IRI a sps:BuiltInFunction ; rdfs:label "IRI" .
sps:URI a sps:BuiltInFunction ; rdfs:label "URI" .
sps:BNODE a sps:BuiltInFunction ; rdfs:label "BNODE" .
sps:BOUND a sps:BuiltInFunction ; rdfs:label "BOUND" .
sps:STRLEN a sps:BuiltInFunction ; rdfs:label "STRLEN" .
sps:UCASE a sps:BuiltInFunction ; rdfs:label "UCASE" .
sps:LCASE a sps:BuiltInFunction ; rdfs:label "LCASE" .
sps:ENCODE_FOR_URI a sps:BuiltInFunction ; rdfs:label "ENCODE_FOR_URI" .
sps:CONTAINS a sps:BuiltInFunction ; rdfs:label "CONTAINS" .
sps:STRSTARTS a sps:BuiltInFunction ; rdfs:label "STRSTARTS" .
sps:CONCAT a sps:BuiltInFunction ; rdfs:label "CONCAT" .
sps:STRENDS a sps:BuiltInFunction ; rdfs:label "STRENDS" .
sps:STRBEFORE a sps:BuiltInFunction ; rdfs:label "STRBEFORE" .
sps:STRAFTER a sps:BuiltInFunction ; rdfs:label "STRAFTER" .
sps:STRLANG a sps:BuiltInFunction ; rdfs:label "STRLANG" .
sps:STRLANGDIR a sps:BuiltInFunction ; rdfs:label "STRLANGDIR" .
sps:STRDT a sps:BuiltInFunction ; rdfs:label "STRDT" .
sps:ABS a sps:BuiltInFunction ; rdfs:label "ABS" .
sps:CEIL a sps:BuiltInFunction ; rdfs:label "CEIL" .
sps:FLOOR a sps:BuiltInFunction ; rdfs:label "FLOOR" .
sps:ROUND a sps:BuiltInFunction ; rdfs:label "ROUND" .
sps:RAND a sps:BuiltInFunction ; rdfs:label "RAND" .
sps:YEAR a sps:BuiltInFunction ; rdfs:label "YEAR" .
sps:MONTH a sps:BuiltInFunction ; rdfs:label "MONTH" .
sps:DAY a sps:BuiltInFunction ; rdfs:label "DAY" .
sps:HOURS a sps:BuiltInFunction ; rdfs:label "HOURS" .
sps:MINUTES a sps:BuiltInFunction ; rdfs:label "MINUTES" .
sps:SECONDS a sps:BuiltInFunction ; rdfs:label "SECONDS" .
sps:TIMEZONE a sps:BuiltInFunction ; rdfs:label "TIMEZONE" .
sps:TZ a sps:BuiltInFunction ; rdfs:label "TZ" .
sps:NOW a sps:BuiltInFunction ; rdfs:label "NOW" .
sps:MD5 a sps:BuiltInFunction ; rdfs:label "MD5" .
sps:SHA1 a sps:BuiltInFunction ; rdfs:label "SHA1" .
sps:SHA256 a sps:BuiltInFunction ; rdfs:label "SHA256" .
sps:SHA384 a sps:BuiltInFunction ; rdfs:label "SHA384" .
sps:SHA512 a sps:BuiltInFunction ; rdfs:label "SHA512" .
sps:sameTerm a sps:BuiltInFunction ; rdfs:label "sameTerm" .
sps:isIRI a sps:BuiltInFunction ; rdfs:label "isIRI" .
sps:isURI a sps:BuiltInFunction ; rdfs:label "isURI" .
sps:isBLANK a sps:BuiltInFunction ; rdfs:label "isBLANK" .
sps:isLITERAL a sps:BuiltInFunction ; rdfs:label "isLITERAL" .
sps:isNUMERIC a sps:BuiltInFunction ; rdfs:label "isNUMERIC" .
sps:COALESCE a sps:BuiltInFunction ; rdfs:label "COALESCE" .
sps:IF a sps:BuiltInFunction ; rdfs:label "IF" .
sps:UUID a sps:BuiltInFunction ; rdfs:label "UUID" .
sps:STRUUID a sps:BuiltInFunction ; rdfs:label "STRUUID" .
sps:isTRIPLE a sps:BuiltInFunction ; rdfs:label "isTRIPLE" .
sps:TRIPLE a sps:BuiltInFunction ; rdfs:label "TRIPLE" .
sps:SUBJECT a sps:BuiltInFunction ; rdfs:label "SUBJECT" .
sps:PREDICATE a sps:BuiltInFunction ; rdfs:label "PREDICATE" .
sps:OBJECT a sps:BuiltInFunction ; rdfs:label "OBJECT" .
sps:hasLANG a sps:BuiltInFunction ; rdfs:label "hasLANG" .
sps:hasLANGDIR a sps:BuiltInFunction ; rdfs:label "hasLANGDIR" .
sps:REGEX a sps:BuiltInFunction ; rdfs:label "REGEX" .
sps:SUBSTR a sps:BuiltInFunction ; rdfs:label "SUBSTR" .
sps:REPLACE a sps:BuiltInFunction ; rdfs:label "REPLACE" .
