Errata in SPARQL 1.1

$Id: errata.html,v 1.49 2018/04/18 17:41:21 aseaborne Exp $


This document records errata and corrections suggested by the community in the SPARQL 1.1 specification as published on the 21 March 2013. Actual changes to a W3C Recommendation must be approved by a chartered W3C Working Group and the W3C Advisory Committee.

  1. Errata for SPARQL 1.1 Overview
  2. Errata for SPARQL 1.1 Query Language
  3. Errata for SPARQL 1.1 Update
  4. Errata for SPARQL 1.1 Service Description
  5. Errata for SPARQL 1.1 Federated Query
  6. Errata for SPARQL 1.1 Query Results JSON Format
  7. Errata for SPARQL 1.1 Query Results CSV and TSV Formats
  8. Errata for SPARQL Query Results XML Format (Second Edition)
  9. Errata for SPARQL 1.1 Entailment Regimes
  10. Errata for SPARQL 1.1 Protocol
  11. Errata for SPARQL 1.1 Graph Store HTTP Protocol

These corrections have no normative status as they have not been incorporated in the specification through the Recommendation Track process. Ivan Herman, former Semantic Web Activity lead, is the editor of this document. Note that the SPARQL Working Group has closed; there may be issues relating to the SPARQL specifications which are not currently listed here. If you find something in one of the documents listed above that you believe may be an error and wish to have it recorded here, please post your discovery to the public-rdf-dawg-comments mailing list, cc-ing to the editor of this document, Ivan Herman. The community has the possibility to react on the post and, typically after 5-6 business days and unless the community strongly objects for the discovery to be recorded as an official erratum, the entry is added to this list by the editor.

The errata are separated into eleven sections, corresponding to the eleven parts of the specification.

Three kinds of changes are highlighted: new, added text, changed text, and deleted text.

Errata for SPARQL 1.1 Overview

None yet.

Errata for SPARQL 1.1 Query Language


Source: comments/2013Mar/0010

Definition of ALP

"Let V = empty multiset" ==> "Let V = empty set"

This change does not change the definition: V is only used as a set.


Report: public-sparql-dev/2013AprJun/0002

In the translation of group graph patterns, the text:

For each element E in the GroupGraphPattern

should indicate that elements are processed in lexical (parse) order.


Report: public-rdf-dawg-comments/2013Aug/0004.html

In the grammar rule [83] PropertyListPathNotEmpty both object lists uses should be ObjectListPath.


Report: comments/2013May/0003

The explanatory expansion of IN could clarify that the left-hand side of the IN is evaluated once only.


Report: public-rdf-dawg-comments/2013Jul/0004

Section 17.3.1 says "defined above" but there is a case of an error where extension is possible below in (RDFterm-equals).


Report: public-rdf-dawg-comments/2013Aug/0007

In #defn_evalGraph, the line

R := Union(R, Join( eval(D(D[i]), P) , Ω(?var->i) )
is missing a right parenthesis.


Report: public-rdf-dawg-comments/2013Aug/0007

In #defn_algJoin, in the line

Join(Ω1, Ω2) = { merge(μ1, μ2) | μ1 in Ω1and μ2 in Ω2, and μ1 and μ2 are compatible }
there should be a space: s/Ω1and/Ω1 and/


Report: discussion in thread public-rdf-dawg-comments/2013Aug/0010.html

CONCAT refers fn:concat for it's defintion but fn:concat is only defined for 2 or more arguments whereas CONCAT alsp allows zero arguments and one argument.

The suggested fix is to extend the definition of CONCAT to be:

See also the definition of GROUP_CONCAT.


Report: discussion in thread public-rdf-dawg-comments/2013Aug/0024.html

In Section 19.6, Bulletpoint 2 "DELETE DATA" links to "DELETE WHERE" (footnote 40) instead of footnote 39.


Report: discussion in thread public-rdf-dawg-comments/2013Sep/0000.html

Need to note that aggregate functions are not allowed inside aggregate functions - add a note to the grammar notes (19.8).


Report: public-sparql-dev/2013OctDec/0001 and analysis public-sparql-dev/2013OctDec/0004.

Lack of clarity on aggregate processing in the presence of errors in the aggregated expression. Affects MAX; the others end up with the same result for different reasons.


Report: public-sparql-dev/2014May/0000.html.

In the expansion of LeftJoin:

LeftJoin(Ω1, Ω2, expr) =
    { merge(μ1, μ2) | μ1 in Ω1 and μ2 in Ω2, μ1 and μ2 are compatible and expr(merge(μ1, μ2)) is true }
    { μ1 | μ1 in Ω1, ∀ μ2 in Ω2, μ1 and μ2 are not compatible, or Ω2 is empty }
    { μ1 | μ1 in Ω1, ∃ μ2 in Ω2, μ1 and μ2 are compatible and expr(merge(μ1, μ2)) is false. }

The last clause should read:

  { μ1 | μ1 in Ω1, ∀ μ2 in Ω2, μ1 and μ2 are compatible and expr(merge(μ1, μ2)) is false }

The definition as Filter(expr, Join(Ω1, Ω2)) ∪ Diff(Ω1, Ω2, expr) is unaffected.


Report: public-sparql-dev/2015/Jun/0000.html.

Further comment following on from errata-query-7. The second and third clauses in the explanatory expansion do not work independently. When combined, they are the definition of Diff.

The definition as Filter(expr, Join(Ω1, Ω2)) ∪ Diff(Ω1, Ω2, expr) is unaffected.


Report: gist-github:/kasei/2543d93652016e0bb860

The definition of Substituteshould exclude varaibles not visible at the outermost level of the graph pattern. That is, a variable used inside a nested SELECT that is not in it's projection, should be considered a different variable. Similarly, with embedded NOT EXISTS/EXISTS expressions, variables used only within that expression, are "hidden" (these are an a nested "ASK" query).

    ?s :p ?value .
        ?s :p ?count
            SELECT (COUNT(*) AS ?count) WHERE {
                ?s :p ?other # Hidden by projection ?s : should be same-as ?anything.


Report: public-sparql-dev/2014OctDec/0005

The BIND example for { ?s :p ?v . {} BIND (2*?v AS ?v2) } should be:

Extend( BGP(?s :p ?v), ?v2, 2*?v )

A pattern of { BIND(2*?v AS ?v2) ?s :p ?v } would be:

   Extend( {} , ?v2, 2*?v )
   BGP(?s :p ?v)


Report: Apache jena users mailing list 2014-12-23

The definition of substitute operation should deal with variables in the bindings set formed from any VALUES clauses.

substitute also needs to be aware of inner scoped, variables with the same name (e.g. inside nested SELECTs).


Report: public-rdf-dawg-comments/2015Jun/0001

The definition of Aggregation() should replace P by Group(exprlist, P) giving:

eval(D(G), Aggregation(exprlist, func, scalarvals, Group(exprlist, P))) = Aggregation(exprlist, func, scalarvals, eval(D(G), Group(exprlist, P)))

There is also a confusion in the definition of Aggregation, between multiset and set (section 18.5.1). In Definition: Aggregation replace "multiset of partial functions" by "set of partial functions".


Report: public-rdf-dawg-comments/2015Jun/0004

Clarification of the definition of Diff.

The definition of Diff should more clearly say that expressions that evaluate with an error are considered to be false.

One such working is "and expr(merge(μ, μ')) does not have an effective boolean value of true".


The definition of filter does not need the ", D(G)". It is correctly used in the evaluation of filter.


Report: public-sparql-dev/2015JulSep/0002

The terminology "unaggregated variables" in needs defining or rewording.


Report: public-sparql-dev/2015OctDec/0035

GRAPH use needs updating for blank nodes.


Report: public-sparql-dev/2016JanMar/0005

Add suggestion ("SHOULD") that SAMPLE should return a defined value in preference to "undef" (i.e. when "error" is in the choice multiset).


Report: Tweet from Gregory Wiliams (March 2018)

The blank node label rule for no reuse of the same label should let the label be reused across property paths as well as triple patterns. The rule is mentioned in section 5.1.1 "Blank Node Labels" and section 19.6 Blank Nodes and Blank Node Labels.

See also the translation step Translate Property Path Patterns where some path become triple patterns.

Errata for SPARQL 1.1 Update


Report: 2015Mar/0001

The example in section has

        FILTER ( ?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime )

The test is the wrong way round: it should be:

        FILTER ( ?date < "1970-01-01T00:00:00-02:00"^^xsd:dateTime )

The text above and example data are correct.


Report: 2016Mar/0000

In the bulleted list, uses of Gj should be G'j


Report: 2018Apr/0000

In section 3.1.3 of https://www.w3.org/TR/2013/REC-sparql11-update-20130321 there are some links named DeleteClause and InsertClause. These should reference https://www.w3.org/TR/sparql11-query/#rDeleteClause and https://www.w3.org/TR/sparql11-query/#rInsertClause but instead reference the DELETE DATA (http://www.w3.org/TR/sparql11-query/#rDeleteData) and INSERT DATA (http://www.w3.org/TR/sparql11-query/#rInsertData).

Errata for SPARQL 1.1 Service Description


Source: public-rdf-dawg-comments/2013Apr/0000.html

Wrong/missing link in section 1.1.

Errata for SPARQL 1.1 Federated Query


Source: public-rdf-dawg-comments/2013Apr/0007.html

The last queryGroup example in section 2.4 of the document is not the right example (missing VALUES).

Errata for SPARQL 1.1 Query Results JSON Format


Source: public-sparql-dev/2015AprJun/0014

This errata applies to the tests, not the specification itself.

Some SPARQL tests use "type": "typed-literal", where it should be "type": "literal". e.g. json-res/jsonres01.srj.

"typed-literal" existed in the pre-recommendation working group note from the original SPARQL working group.

Errata for SPARQL 1.1 Query Results CSV and TSV Formats

None yet.

Errata for SPARQL Query Results XML Format (Second Edition)


Report: public-rdf-dawg-comments/2013Aug/0004.html

Incorrect XML namespaces.

Errata for SPARQL 1.1 Entailment Regimes


Report: public-rdf-dawg-comments/2014Feb/0001.html

The rdf:type labelled edge in Figure 1 (Section 1.2) from ex:MITPress to rdf:Property should go from ex:publishes to rdf:Property.

Errata for SPARQL 1.1 Protocol

None yet.

Errata for SPARQL 1.1 Graph Store HTTP Protocol

None yet.