QEL

QEL (Query Exchange Language) has been developed as part of the Edutella project. It is used to distribute queries to various RDF repositories, where the query is transformed to the repository query language (e.g. SQL, RDQL). For simple queries (graph matching) a syntax in query-by-example style is provided:

<?xml version='1.0'?>
<!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY edu 'http://www.edutella.org/edutella#'>
  <!ENTITY wsdl 'http://schemas.xmlsoap.org/wsdl/'>
  <!ENTITY wssoap 'http://schemas.xmlsoap.org/wsdl/soap/'>
  ]>
<rdf:RDF xmlns:rdf="&rdf;"
  xmlns:edu="&edu;"
  xmlns:wsdl="&wsdl;"
  xmlns:wssoap="&wssoap;">

<edu:QEL1Query rdf:about="#sampleQuery">
  <edu:hasVariable>
    <edu:Variable rdf:about="#SERVICE"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#PORT"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#BINDING"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#BINDINGNAME"/>
  </edu:hasVariable>
</edu:QEL1Query>

<wsdl:service rdf:about="#SERVICE">
  <wsdl:hasPort>
    <rdf:Description rdf:about="#PORT">
      <wsdl:binding>
        <rdf:Description rdf:about="#BINDING">
          <wssoap:style rdf:resource="&wssoap;document"/>
          <wsdl:name rdf:resource="#BINDINGNAME"/>
        </rdf:Description>
      </wsdl:binding>
    </rdf:Description>
  </wsdl:hasPort>
</wsdl:service>

</rdf:RDF>

More complex queries (e.g. queries including rules) can be written in a more expressive, but also more verbose syntax:

<?xml version='1.0'?>
 <!DOCTYPE rdf:RDF [
  <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
  <!ENTITY edu 'http://www.edutella.org/edutella#'>
  <!ENTITY wsdl 'http://schemas.xmlsoap.org/wsdl/'>
  <!ENTITY wssoap 'http://schemas.xmlsoap.org/wsdl/soap/'>
  ]>
<rdf:RDF xmlns:rdf="&rdf;"
  xmlns:edu="&edu;"
  xmlns:wsdl="&wsdl;"
  xmlns:wssoap="&wssoap;">

<edu:QEL3Query rdf:about="#sampleQuery">
  <edu:hasVariable>
    <edu:Variable rdf:about="#SERVICE"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#PORT"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#BINDING"/>
  </edu:hasVariable>
  <edu:hasVariable>
    <edu:Variable rdf:about="#BINDINGNAME"/>
  </edu:hasVariable>
  <edu:hasQueryLiteral rdf:resource="#st1"/>
  <edu:hasQueryLiteral rdf:resource="#st2"/>
  <edu:hasQueryLiteral rdf:resource="#st3"/>
  <edu:hasQueryLiteral rdf:resource="#st4"/>
  <edu:hasQueryLiteral rdf:resource="#st5"/>
</edu:QEL3Query>

<edu:RDFReifiedStatement rdf:about="#st1">
  <rdf:subject rdf:resource="#SERVICE"/>
  <rdf:predicate rdf:resource="&wsdl;hasPort"/>
  <rdf:object rdf:resource="#PORT"/>
</edu:RDFReifiedStatement>

<edu:RDFReifiedStatement rdf:about="#st2">
  <rdf:subject rdf:resource="#SERVICE"/>
  <rdf:predicate rdf:resource="&rdf;type"/>
  <rdf:object rdf:resource="&wsdl;service"/>
</edu:RDFReifiedStatement>

<edu:RDFReifiedStatement rdf:about="#st3">
  <rdf:subject rdf:resource="#PORT"/>
  <rdf:predicate rdf:resource="&wsdl;binding"/>
  <rdf:object rdf:resource="#BINDING"/>
</edu:RDFReifiedStatement>

<edu:RDFReifiedStatement rdf:about="#st4">
  <rdf:subject rdf:resource="#BINDING"/>
  <rdf:predicate rdf:resource="&wssoap;style"/>
  <rdf:object rdf:resource="&wssoap;document"/>
</edu:RDFReifiedStatement>

<edu:RDFReifiedStatement rdf:about="#st5">
  <rdf:subject rdf:resource="#BINDING"/>
  <rdf:predicate rdf:resource="&wsdl;name"/>
  <rdf:object rdf:resource="#BINDINGNAME"/>
</edu:RDFReifiedStatement>

</rdf:RDF>