server-php-xml-class-rdql-rdql.htm / htm
<html> <head> <title>RDQL an RDF query language</title> <link rel="stylesheet" href="main.css" type="text/css"> </head> <body> <div align="center"> <table border="0" width="80%"> <tr> <td bgcolor="#aaaaee" class="textblbl" align="center">RDQL tutorial</td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td bgcolor="#eeeeff" class="text" width="20%"><a href="http://www.w3.org/RDF/" title="RDF Resource Description Framework"> <img border="0" src="http://www.w3.org/RDF/icons/rdf_w3c_icon.64" alt="RDF Resource Description Framework Icon"></a> </td> <td bgcolor="#eeeeff" class="text"><i>RDQL is a query language for <a href="http://www.w3.org/RDF/">RDF</a> based on SquishQL, you can find more about RDQL at <a href="http://www.hpl.hp.com/semweb/rdql.html">this site</a>. In this tutorial we'll cover RDQL based on the PHP RDQL implementation available at <a href="http://phpxmlclasses.sourceforge.net/">the phpxmlclasses project</a></i> </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Description:</b> </td> <td bgcolor="#eeeeff" class="text">RDQL queries RDF documents using a SQL-alike syntax, with the PHP implementation you can query RDF documents indicating their URLs (http://) or their paths if they are in your local machine. If you query more than one document then all the RDF statements present in the documents are considered part of a single document.<br/><br/> You can do a lot of thing with RDQL and there're a lot of interesting queries that can be performed. </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Syntax:</b> </td> <td bgcolor="#eeeeff" class="text">An RDQL query is in the form:<br/> <pre>SELECT <i>vars</i> FROM <i>documents</i> WHERE <i>Expressions</i> AND <i>Filters</i> USING <i>Namespace declarations</i></pre> Example: <pre>SELECT ?x,?y FROM <http://example.com/sample.rdf> WHERE (?x,<dc:name>,?y) USING dc for <http://www.dc.com#>> This would return all the ?x-?y tuples indicating the resource name and the value of the dc:name property for each resource. </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Syntax: SELECT</b> </td> <td bgcolor="#eeeeff" class="text">The select portion of the query let's you indiate which RDQL variables you want to be returned by the query, if you use SELECT ?x,?y,?z then you will receive an array of tuples containing values for ?x,?y and ?z. You can use other variables in the query such as ?a1,?p,?foo but they won't be returned since they are not present in the select part of the query. </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Syntax: FROM</b> </td> <td bgcolor="#eeeeff" class="text">The from part of the query indicates the RDF souces to be queried, each source is enclosed by angle brackets (<&>). If you indicate more than one source sepparate them using commas.<br/><br/> In the PHP implementation sources can be URLs or paths for local RDF documents. Example:<br/></br/> <pre>FROM <doc.rdf>, <http://example.com/sample.rdf>, <rdfs/other.rdf></pre><br/><br/ The semantic of the from part is simple, since each RDF document can be seen as a list of statements the from part produces the union of all the statements in the mentioned RDF documents as the set of statements from where the query will be processed. </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Sytax: WHERE</b> </td> <td bgcolor="#eeeeff" class="text">The where part is the most important part of the RDQL expression, in the where part you indicate constraints that RDF triples (subject, predicate, object) must accomplish in order to be returned. The where part is expressed by a list of restrictions sepparated by commas, each restriction takes the form: (subject, predicate, object) where the subject, predicate and object can be a literal value or a RDQL variable.<br/><br/> For the predicate you can express property names using a namespace declared in the USING section for example: <dc:name> which indicates that the predicate must match the "name" local-name for the namespace declared as "dc" in the using part.<br/><br/> Example: <pre>(?x,<foo:has^gt;,?y), (?y,<foo:color>,?z)</pre> This will match all the RDF statements where some subject "x" has a property "has" pointing to a resource and that resource has a property color. If you want to filter what color you want you use the "AND" part of the query. </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Sytax: AND</b> </td> <td bgcolor="#eeeeff" class="text">The AND part indicates constraints that RDQL variables must follow. In the PHP implementation the AND part is a PHP expression where variables are RDQL variables such as ?x,?y etc.<br/><br/> Example: Select all the subjects that have a blue item. <pre>SELECT ?x FROM <doc.rdf> WHERE (?x,<foo:has>,?y), (?y,<foo:color>,?z) AND ?z=="blue" USING foo for <http://foo.org/properties#> </pre> </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Syntax: USING</b> </td> <td bgcolor="#eeeeff" class="text">The using section declares all the namespaces that will be used for RDF properties, declarations are sepparated by commas and use the notation:<br/> <pre>prefix for <URI></pre> Example:<br/> <pre>USING foo for <http://foo.org/properties#>, col for <http://props.com/catalog#> </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Examples:</b> </td> <td bgcolor="#eeeeff" class="text">In the following section we'll show some examples using a real RDF document and working RDQL queries (at last!). <br/> The document describes information we know about some people. We indicate their names, age, position and other relationships between them. The RDF document to be used is the following (if you are not used to RDF docs take some time to read it): </td> </tr> </table> <br/> <table border="0" bgcolor="ddddff" width="80%"> <tr> <td valign="top" width="100%" class="text">people.rdf </td> </tr> </table> <table border="0" bgcolor="#aaaaaa" width="80%"> <tr> <td valign="top" width="100%" class="text"> <pre><?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dt="http://foo.org#"> <rdf:Description about="http://foo.org/persons/john"> <dt:name>John</dt:name> <dt:age>26</dt:age> </rdf:Description> <rdf:Description about="http://foo.org/persons/Peter"> <dt:name>Peter</dt:name> <dt:position>foo2</dt:position> <dt:age>25</dt:age> <dt:friend rdf:resource="http://foo.org/persons/john" /> <dt:friend rdf:resource="http://foo.org/persons/Carl" /> </rdf:Description> <rdf:Description about="http://foo.org/persons/Micky"> <dt:name>Micky</dt:name> <dt:position>foo</dt:position> <dt:age>16</dt:age> </rdf:Description> <rdf:Description about="http://foo.org/persons/Carl"> <dt:name>Carl</dt:name> <dt:position>foo</dt:position> <dt:age>28</dt:age> <dt:friend rdf:resource="http://foo.org/persons/Peter" /> </rdf:Description> <rdf:Description about="http://foo.org/team"> <dt:members> <rdf:Bag> <rdf:li rdf:resource="http://foo.org/persons/Peter" /> <rdf:li>Kim</rdf:li> </rdf:Bag> </dt:members> </rdf:Description> </rdf:RDF></pre> </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Example 1:</b> </td> <td bgcolor="#eeeeff" class="text"><i>Indicate name and age of all the individuals older than 20.</td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Query:</b> </td> <td bgcolor="#eeeeff" class="text"><pre>SELECT ?y FROM <people.rdf> WHERE (?x,<dt:age>,?z),(?x,<dt:name>,?y) AND ?z>20 USING dt for <http://foo.org#>, rdf for <http://www.w3.org/1999/02/22-rdf-syntax-ns#>> </td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Result:</b> </td> <td bgcolor="#eeeeff" class="text">Array ( [0] => Array ( [?y] => John ) [1] => Array ( [?y] => Peter ) [2] => Array ( [?y] => Carl ) ) </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Example 2:</b> </td> <td bgcolor="#eeeeff" class="text"><i>If A is friend of B and B is friend of A report them</i></td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Query:</b> </td> <td bgcolor="#eeeeff" class="text"><pre>SELECT ?x,?y FROM <people.rdf> WHERE (?x,<dt:friend>,?y),(?y,<dt:friend>,?x) AND ?x<^gt;?y USING dt for <http://foo.org#>, rdf for <http://www.w3.org/1999/02/22-rdf-syntax-ns#>> </td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Result:</b> </td> <td bgcolor="#eeeeff" class="text">Array ( [0] => Array ( [?x] => http://foo.org/persons/Carl [?y] => http://foo.org/persons/Peter ) [1] => Array ( [?x] => http://foo.org/persons/Peter [?y] => http://foo.org/persons/Carl ) ) </td> </tr> </table> <br/> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Example 3:</b> </td> <td bgcolor="#eeeeff" class="text"><i>Show all the members of the team.</i></td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Query:</b> </td> <td bgcolor="#eeeeff" class="text"><pre>SELECT ?z FROM <people.rdf> WHERE (?x,<dt:members>,?y),(?y,?w,?z) AND ?z<>"http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag" && ?x=="http://foo.org/team" USING dt for <http://foo.org#>, rdf for <http://www.w3.org/1999/02/22-rdf-syntax-ns#></pre> </td> </tr> </table> <table border="0" width="80%"> <tr> <td valign="top" bgcolor="#eeeeff" width="20%" class="text"><b>Result:</b> </td> <td bgcolor="#eeeeff" class="text">Array ( [0] => Array ( [?z] => http://foo.org/persons/Peter ) [1] => Array ( [?z] => Kim ) ) </td> </tr> </table> <br/> </div> </body> </html>
(C) Æliens 20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.