<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: sparqlx.rng,v 1.1 2005/03/24 17:25:21 kclark Exp $ -->
<grammar ns="http://www.w3.org/2001/sw/DataAccess/sparql-xml-syntax/"
  xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <element name="rdf-query">
      <choice>
        <element name="ask">
          <empty></empty>
        </element>
        <element name="construct">
          <oneOrMore>
            <ref name="triple-pattern"></ref>
          </oneOrMore>
        </element>
        <element name="describe">
          <zeroOrMore>
            <ref name="variable"></ref>
          </zeroOrMore>
          <zeroOrMore>
            <ref name="uri"></ref>
          </zeroOrMore>
        </element>
        <element name="select-all">
          <optional>
            <!-- this is the SELECT * case -->
            <attribute name="distinct">
              <data type="boolean"></data>
            </attribute>
          </optional>
          <optional>
            <attribute name="limit">
              <data type="int"></data>
            </attribute>
          </optional>
          <optional>
            <attribute name="offset">
              <data type="int"></data>
            </attribute>
          </optional>
          <empty></empty>
        </element>
        <element name="select">
          <optional>
            <attribute name="distinct">
              <data type="boolean"></data>
            </attribute>
          </optional>
          <optional>
            <attribute name="limit">
              <data type="int"></data>
            </attribute>
          </optional>
          <optional>
            <attribute name="offset">
              <data type="int"></data>
            </attribute>
          </optional>
          <oneOrMore>
            <ref name="variable"></ref>
          </oneOrMore>
        </element>
      </choice>
      <optional>
        <ref name="query-pattern"></ref>
      </optional>
      <optional>
        <ref name="order"></ref>
      </optional>
    </element>
  </start>
  <define name="query-pattern">
    <element name="query-pattern">
      <zeroOrMore>
        <ref name="triple-pattern"></ref>
        <ref name="optional"></ref>
        <ref name="union"></ref>
        <ref name="dataset-constraint"></ref>
        <ref name="filter"></ref>
        <ref name="query-pattern"></ref>
      </zeroOrMore>
    </element>
  </define>
  <define name="optional">
    <element name="optional">
      <ref name="query-pattern"></ref>
    </element>
  </define>
  <define name="union">
    <element name="union">
      <oneOrMore>
        <ref name="query-pattern"></ref>
      </oneOrMore>
    </element>
  </define>
  <define name="dataset-constraint">
    <element name="dataset-constraint">
      <choice>
        <ref name="uri"></ref>
        <ref name="variable"></ref>
        <ref name="bnode"></ref>
      </choice>
      <ref name="query-pattern"></ref>
    </element>
  </define>
  <define name="variable">
    <element name="variable">
      <attribute name="name">
        <data type="NCName"></data>
      </attribute>
    </element>
  </define>
  <define name="uri">
    <element name="uri">
      <data type="anyURI"></data>
    </element>
  </define>
  <define name="triple-pattern">
    <element name="triple-pattern">
      <group>
        <optional>
          <attribute name="optional">
            <data type="boolean"></data>
          </attribute>
        </optional>
        <element name="subject">
          <choice>
            <ref name="bnode"></ref>
            <ref name="uri"></ref>
            <ref name="variable"></ref>
          </choice>
        </element>
        <element name="predicate">
          <choice>
            <ref name="bnode"></ref>
            <ref name="uri"></ref>
            <ref name="variable"></ref>
          </choice>
        </element>
        <element name="object">
          <choice>
            <ref name="bnode"></ref>
            <ref name="uri"></ref>
            <ref name="variable"></ref>
            <element name="literal">
              <optional>
                <attribute name="datatype">
                  <data type="anyURI"></data>
                </attribute>
              </optional>
              <optional>
                <attribute name="lang">
                  <data type="NCName"></data>
                </attribute>
              </optional>
              <text></text>
            </element>
          </choice>
        </element>
        <optional>
          <ref name="filter"></ref>
        </optional>
      </group>
      <!-- I'm unsure about there being an optional filter on TP -->
    </element>
  </define>
  <define name="order">
    <element name="order-by">
      <oneOrMore>
        <ref name="order-condition"></ref>
      </oneOrMore>
    </element>
  </define>
  <define name="bnode">
    <element name="bnode">
      <attribute name="id">
        <data type="NCName"></data>
      </attribute>
    </element>
  </define>
  <!-- this is temporary until sorting gets sorted out and accepted -->
  <define name="order-condition">
    <element name="order-condition">
      <text></text>
    </element>
  </define>
  <define name="filter">
    <element name="filter">
      <ref name="expression"></ref>
    </element>
  </define>
  <!-- this is just a temporary stub... it won't be a text element -->
  <define name="expression">
    <element name="expression">
      <text></text>
    </element>
  </define>
</grammar>
