<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://www.jenitennison.com/blog" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>jQuery</title>
 <link>http://www.jenitennison.com/blog/taxonomy/term/41</link>
 <description>The taxonomy view with a depth of 0.</description>
 <language>en</language>
<item>
 <title>More Crime</title>
 <link>http://www.jenitennison.com/blog/node/125</link>
 <description>&lt;p&gt;I wrote &lt;a href=&quot;http://www.jenitennison.com/blog/node/123&quot;&gt;previously&lt;/a&gt; about a visualisation using &lt;a href=&quot;http://www.homeoffice.gov.uk/about-us/publications/non-personal-data/&quot;&gt;Home Office data&lt;/a&gt; to navigate around categories of offences. The second interesting set of data from the Home Office that I found, tucked away in a small link on a page about &lt;a href=&quot;http://www.crimereduction.homeoffice.gov.uk/toolkits/dr0202.htm&quot;&gt;Crime Reduction Toolkits&lt;/a&gt; was a &lt;a href=&quot;http://www.homeoffice.gov.uk/rds/pdfs/100years.xls&quot;&gt;spreadsheet of recorded crime statistics&lt;/a&gt; between 1898 and the present day. Each column is a different category of offence (I won&amp;#8217;t say class because they don&amp;#8217;t map onto the Classes from the spreadsheet of notifiable offences).&lt;/p&gt;

&lt;p&gt;This time I wanted to try out the &lt;a href=&quot;http://www.omnipotent.net/jquery.sparkline/&quot;&gt;jQuery sparklines&lt;/a&gt; plug-in to illustrate how crime notifications have changed over time. The resulting page is available at &lt;a href=&quot;http://www.jenitennison.com/visualisation/crime.html&quot;&gt;http://www.jenitennison.com/visualisation/crime.html&lt;/a&gt;; here&amp;#8217;s a screenshot for Bigamy:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/files/crime.jpg&quot; alt=&quot;Summary statistics for rate of Bigamy within the UK&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;!--break--&gt;

&lt;p&gt;(I chose Bigamy because there are some interesting humps in the data, roughly aligned with the two World Wars, which demonstrate the value of looking at timelines.)&lt;/p&gt;

&lt;p&gt;I got this working by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cleaning up and processing the spreadsheet into RDF/XML&lt;/li&gt;
&lt;li&gt;putting the RDF/XML on my server in &lt;a href=&quot;http://www.jenitennison.com/data/scheme/crime/&quot;&gt;http://www.jenitennison.com/data/scheme/crime/&lt;/a&gt;, with more or less the same &lt;code&gt;.htaccess&lt;/code&gt; as I &lt;a href=&quot;http://www.jenitennison.com/blog/node/123&quot;&gt;used previously&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;creating a web page that included jQuery sparklines and &lt;a href=&quot;http://code.google.com/p/rdfquery&quot;&gt;rdfQuery&lt;/a&gt; as libraries and populates the page with details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see the source code for &lt;code&gt;crime.html&lt;/code&gt; if you just go and look at it, but the relevant piece for populating the sparkline is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$.get(selected, null, function (rdfXml) {
  var values = {}, sparkline = [],
    ...
    counts = $.rdf()
      .load(rdfXml)
      .prefix(&#039;rdf&#039;, &#039;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#039;)
      .prefix(&#039;crime&#039;, &#039;http://www.jenitennison.com/data/ontology/crime#&#039;)
      .where(&#039;&amp;lt;&#039; + selected + &#039;&amp;gt; crime:count ?count&#039;)
      .where(&#039;?count crime:startYear ?year&#039;)
      .where(&#039;?count rdf:value ?value&#039;)
      .each(function () {
        ...
        values[this.year.value] = this.value.value;
      });
  ...
  for (v in values) {
    sparkline.push([v, values[v]]);
  }
  $(&#039;#sparkline&#039;)
    .sparkline(sparkline, { 
      chartRangeMin: 0,
      lineColor: &#039;#999&#039;,
      fillColor: &#039;#EEE&#039;,
      spotColor: &#039;blue&#039;,
      minSpotColor: &#039;green&#039;,
      maxSpotColor: &#039;red&#039;
    });
}, &#039;xml&#039;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(There is a reason for first creating an object representation of the values and then generating the array-of-arrays that the sparkline needs, but it&amp;#8217;s in the elided code so you&amp;#8217;ll have to look at the original source to see.)&lt;/p&gt;

&lt;p&gt;jQuery sparklines are ridiculously easy to create. I&amp;#8217;m looking forward to using more of the great variety of visualisations that they support.&lt;/p&gt;

&lt;p&gt;Now, the big problem with the data is that the ways in which crimes are classified and notified has changed over time. If you look at the &lt;a href=&quot;http://www.homeoffice.gov.uk/rds/pdfs/100years.xls&quot;&gt;original spreadsheet&lt;/a&gt; you&amp;#8217;ll see a bunch of notes that describe three kinds of changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changes in the codes used for particular offences: for example Arson changed from classification 51 to 56 in 1934. I&amp;#8217;m not using the Home Office codes at the moment anyway, but this is going to be something to be wary of when I start doing so.&lt;/li&gt;
&lt;li&gt;Changes when a code is split into separate codes: for example &amp;#8220;Other wounding&amp;#8221; (8) split into &amp;#8220;Other wounding&amp;#8221; (8A), &amp;#8220;Possession of weapons&amp;#8221; (8B) and &amp;#8220;Harassment&amp;#8221; (8C) in 1998. In this case, offences stop being recorded under the original category and start being recorded under the new ones.&lt;/li&gt;
&lt;li&gt;Changes in whether a crime is notifiable: for example &amp;#8220;Cruelty to or neglect of children&amp;#8221; (11) became notifiable in 1998 (according to the notes; according to the data, at least some instances were notified up to 1952, but then there was a gap).&lt;/li&gt;
&lt;li&gt;Changes in how crimes are recorded: for example &amp;#8220;The introduction of the Sexual Offences Act 2003 in May 2004 resulted in substantial changes to the sexual offences.  This means that sexual offences data for 2004/05 are not comparable with those for previous years.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are undoubtedly other effects that aren&amp;#8217;t listed in the notes, either in the legislation that covers a particular crime, or other environmental factors such as being at war (as shown above).&lt;/p&gt;

&lt;p&gt;What I&amp;#8217;d really like to do is to indicate these events in the sparkline and in the data table. Unfortunately it involves the translation of the loose notes from the spreadsheet into handcrafted RDF/XML, which is a little tedious. It&amp;#8217;s also frustrating that there&amp;#8217;s no good means of identification for the categories of offences. I&amp;#8217;ve ended up arbitrarily naming them &amp;#8216;A&amp;#8217; to &amp;#8216;FZ&amp;#8217; which is somewhat unsatisfactory.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s worth noting that although I have a closed data set I&amp;#8217;m explicitly using the Linked Data paradigm to go from a list of categories of crimes to retrieving information about a particular category (because the identifier for a category is a URI). If I weren&amp;#8217;t using RDF, and wanted to split up the data in the way that I have for manageability, I&amp;#8217;d have to document that particular properties contain pointers to information held at other locations. (Kris Zyp has attempted to &lt;a href=&quot;http://www.json-schema.org/draft-hyperschema-02.txt&quot;&gt;formalise this in a kind of schema for JSON&lt;/a&gt;, but I have no idea how much support for this there is.)&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also used &lt;a href=&quot;http://www.w3.org/TR/skos-primer/&quot;&gt;SKOS&lt;/a&gt; to describe the categories, which is nice because all I have to tell you is that &lt;code&gt;http://www.jenitennison.com/data/scheme/crime/&lt;/code&gt; is a SKOS Concept Scheme and if you know SKOS you&amp;#8217;ll know how to locate the top concepts in that scheme, nice human readable labels for them, and so on.&lt;/p&gt;

&lt;p&gt;But if you want to reuse the counts of offences you will still have to actually look at the data to find the name of the property that I&amp;#8217;ve used to go from a category to a count, and for the years and values themselves. These semantics are local to this particular application and the only way you can know them is by being told, just as it would be if I were using JSON.&lt;/p&gt;

&lt;p&gt;So using RDF has bought us some things &amp;#8212; a level of understanding about reaching data and a common vocabulary for organising concept schemes &amp;#8212; but certainly not everything. It should be no surprise to anyone that it is not a magic bullet.&lt;/p&gt;
</description>
 <comments>http://www.jenitennison.com/blog/node/125#comments</comments>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/41">jQuery</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/31">rdf</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/40">rdfQuery</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/49">visualisation</category>
 <pubDate>Sun, 23 Aug 2009 21:26:49 +0100</pubDate>
 <dc:creator>Jeni</dc:creator>
 <guid isPermaLink="false">125 at http://www.jenitennison.com/blog</guid>
</item>
<item>
 <title>rdfQuery: Progressive Enhancement with RDFa</title>
 <link>http://www.jenitennison.com/blog/node/94</link>
 <description>&lt;p&gt;Earlier this week I presented at &lt;a href=&quot;http://swig.networkedplanet.com/november2008.html&quot; title=&quot;Semantic Web Interest Group Community Event&quot;&gt;SWIG-UK&lt;/a&gt; about &lt;a href=&quot;http://code.google.com/p/rdfquery&quot; title=&quot;rdfQuery: RDF plugins for jQuery&quot;&gt;rdfQuery&lt;/a&gt;. rdfQuery is a set of plugins that I&amp;#8217;ve developed for &lt;a href=&quot;http://www.jquery.com&quot; title=&quot;jQuery: The Write Less, Do More, Javascript Library&quot;&gt;jQuery&lt;/a&gt; in order to support RDFa parsing, querying and generation. There are a bunch of other Javascript libraries for RDFa around, such as Mark Birbeck&amp;#8217;s &lt;a href=&quot;http://code.google.com/p/ubiquity-rdfa/&quot; title=&quot;Ubiquity RDFa&quot;&gt;Ubiquity RDFa&lt;/a&gt; and Ben Adida&amp;#8217;s &lt;a href=&quot;http://www.w3.org/2006/07/SWD/RDFa/impl/js/&quot; title=&quot;RDFa Javascript Library&quot;&gt;RDFa library&lt;/a&gt;. What I&amp;#8217;ve really tried to do with rdfQuery is tie it in with the &amp;#8220;Write Less, Do More&amp;#8221; philosophy of jQuery and provide a neat, elegant API. At least that&amp;#8217;s the aim!&lt;/p&gt;

&lt;!--break--&gt;

&lt;p&gt;So what does it do? Well, I&amp;#8217;ve just added the demo that I used on Tuesday into &lt;a href=&quot;http://code.google.com/p/rdfquery/source/checkout&quot; title=&quot;rdfQuery: SVN repository&quot;&gt;the repository&lt;/a&gt;, so if you grab hold of that you can take a look. Here&amp;#8217;s a screenshot of the demo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/files/markup-demo.jpg&quot; alt=&quot;Screenshot of rdfQuery demo&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The demo shows the overall concept of rdfQuery, namely that semantic markup can be useful not only to the crawlers that extract data from your pages to pump into massive triplestores, but also for you as a developer. In this case, which is a simple genealogy-type application, I want to have the people and places that are relevant to this particular extract highlighted within the text. I also want them listed on the left, with their details summarised.&lt;/p&gt;

&lt;p&gt;So the demo illustrates three things that rdfQuery does to help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gleaning triples from a section of the page (not just the whole page); in this case the triples are marked up with RDFa&lt;/li&gt;
&lt;li&gt;querying the data to construct objects that represent the results of those queries, then doing things with those results&lt;/li&gt;
&lt;li&gt;automatically adding RDFa to elements within the page, to update the data that it holds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also demonstrates rough versions of a couple of things that rdfQuery could and should do that I aim to work on soon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reasoning based on the data that&amp;#8217;s found in the page&lt;/li&gt;
&lt;li&gt;using ontologies to decide how to handle the data you find&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the by, it shows a simple, natural-language interface for making statements based on some text, but don&amp;#8217;t let that distract you. It&amp;#8217;s just regular expression processing.&lt;/p&gt;

&lt;p&gt;There are four parts of this page. The main part contains some text about Charles Darwin. If you look at the source, you&amp;#8217;ll see that it&amp;#8217;s been marked up with some RDFa like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;span about=&quot;#CharlesRobertDarwin&quot; typeof=&quot;foaf:Person&quot; 
      property=&quot;rdfs:label&quot; datatype=&quot;&quot;&amp;gt;
  &amp;lt;span property=&quot;foaf:firstName&quot;&amp;gt;Charles&amp;lt;/span&amp;gt; Robert 
  &amp;lt;span property=&quot;foaf:surname&quot;&amp;gt;Darwin&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt; was &amp;lt;span about=&quot;#CharlesRobertDarwin&quot; rel=&quot;biografr:hasBirthPlace&quot;&amp;gt;born in 
&amp;lt;span about=&quot;#Shrewsbury&quot; typeof=&quot;vcard:Address&quot; 
      property=&quot;rdfs:label&quot; datatype=&quot;&quot;&amp;gt;
  &amp;lt;span property=&quot;vcard:locality&quot;&amp;gt;Shrewsbury&amp;lt;/span&amp;gt;, 
  &amp;lt;span property=&quot;vcard:region&quot;&amp;gt;Shropshire&amp;lt;/span&amp;gt;, 
  &amp;lt;span property=&quot;vcard:country&quot;&amp;gt;England&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; on &amp;lt;span about=&quot;#CharlesRobertDarwin&quot; property=&quot;biografr:bornOn&quot; 
  content=&quot;1809-02-12&quot; datatype=&quot;xsd:date&quot;&amp;gt;12 February 1809&amp;lt;/span&amp;gt; at his 
  family home, the Mount. ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This source is also shown in the textarea at the bottom of the page. Obviously this wouldn&amp;#8217;t be visible in a real application, but it enables you to see what&amp;#8217;s going on in the demo. Changing it won&amp;#8217;t do anything; you can imagine that string being POSTed back to the server. I&amp;#8217;ve also added some CSS that gives a border to any elements with a &lt;code&gt;typeof&lt;/code&gt; attribute. Elements that have a &lt;code&gt;property&lt;/code&gt; change their colour when you mouse over them.&lt;/p&gt;

&lt;p&gt;So the page contains some RDFa. But what it doesn&amp;#8217;t contain (in the source) is any information in the menu on the left. This gets populated based on the RDFa. If you click on Charles Robert Darwin, you&amp;#8217;ll see the data that&amp;#8217;s been gleaned about him, including (at the bottom), the derived fact that Robert Darwin was Charles Darwin&amp;#8217;s father. Anything in black is information pulled from the RDFa; anything in orange is derived.&lt;/p&gt;

&lt;p&gt;Next, try typing &amp;#8220;Susannah Darwin was a person&amp;#8221; into the text input and hit return. You should get Susannah Darwin added to the list of people. More importantly, if you look at the new source of the page, you&amp;#8217;ll see that the phrase &amp;#8220;Susannah Darwin&amp;#8221; has been marked up with some RDFa to indicate that she was, indeed, a person and that &amp;#8220;Susannah Darwin&amp;#8221; can be used as a label for her.&lt;/p&gt;

&lt;p&gt;You can try typing a few more facts into the box if you like. I suggest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&amp;#8220;Charles Robert Darwin was also known as Darwin&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Susannah Darwin was Darwin&amp;#8217;s mother&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Susannah Darwin&amp;#8217;s surname was Darwin&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Josiah Wedgwood was a person&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Susannah Darwin&amp;#8217;s father was Josiah Wedgwood&amp;#8221;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So this is all very cool and all, but the point was to show the code. So here we go.&lt;/p&gt;

&lt;h2&gt;Gleaning and Querying&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s look at how the lists are populated:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;457: populateLists = function () {
458:   var rdf = $(&#039;#content&#039;).rdf();
459:   people.empty();
460:   places.empty();
461:   rdf
462:     .prefix(&#039;rdfs&#039;, ns.rdfs)
463:     .prefix(&#039;foaf&#039;, ns.foaf)
464:     .where(&#039;?person a foaf:Person&#039;)
465:     .where(&#039;?person rdfs:label ?label&#039;)
466:     .each(function () {
467:       addIndividual(people, this.person, this.label.value);
468:     })
469:     .reset()
470:     .where(&#039;?place a vcard:Address&#039;)
471:     .where(&#039;?place rdfs:label ?label&#039;)
472:     .each(function () {
473:       addIndividual(places, this.place, this.label.value);
474:     });
475: },
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Line 458 parses the RDFa within the element with the id &lt;code&gt;content&lt;/code&gt; (this is a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; that wraps around the paragraphs about Charles Darwin). The &lt;code&gt;rdf&lt;/code&gt; variable holds an rdfQuery object, which is very similar to a jQuery object except that it queries over RDF triples rather than DOM nodes. The rdfQuery object holds a pointer to a databank, which holds the triples that have been collected.&lt;/p&gt;

&lt;p&gt;Lines 459 and 460 empty out the existing lists of people and places if there are any. The &lt;code&gt;people&lt;/code&gt; and &lt;code&gt;places&lt;/code&gt; variables are set earlier in the script and are jQuery objects.&lt;/p&gt;

&lt;p&gt;Now the fun begins. I first set some prefixes on the rdfQuery object so that I can use those prefixes in &lt;a href=&quot;http://www.w3.org/TR/curie/&quot; title=&quot;CURIE Syntax 1.0&quot;&gt;CURIEs&lt;/a&gt; within the queries. In fact, these prefixes will have been set up by default anyway, because they&amp;#8217;re declared in the HTML page, but it doesn&amp;#8217;t hurt.&lt;/p&gt;

&lt;p&gt;Lines 464 and 465 locate triples in the databank based on simple &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot; title=&quot;SPARQL Query Language for RDF&quot;&gt;SPARQL&lt;/a&gt;-based queries. The first &lt;code&gt;where()&lt;/code&gt; call creates a new rdfQuery object that, like a jQuery object, looks a bit like an array. The array contains objects, one for each triple that matches the pattern &lt;code&gt;?person a foaf:Person&lt;/code&gt;. Each of the objects has a &lt;code&gt;person&lt;/code&gt; property containing the resource that represents the person. So the rdfQuery that results from this &lt;code&gt;where()&lt;/code&gt; call looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ length: 2,
  0: { person: $.rdf.resource(&#039;&amp;lt;#CharlesRobertDarwin&amp;gt;&#039;) },
  1: { person: $.rdf.resource(&#039;&amp;lt;#RobertDarwin&amp;gt;&#039;) },
  ... bunch of other properties and methods that aren&#039;t important here ... }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The second &lt;code&gt;where()&lt;/code&gt; call creates another new rdfQuery object based on combining the previous query results with the any triples that match the pattern &lt;code&gt;?person rdfs:label ?label&lt;/code&gt;. This holds objects with &lt;code&gt;person&lt;/code&gt; and &lt;code&gt;label&lt;/code&gt; properties, one for each person and their label. So the result of this looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ length: 2,
  0: { person: $.rdf.resource(&#039;&amp;lt;#CharlesRobertDarwin&amp;gt;&#039;),
       label:  $.rdf.literal(&#039;&quot;Charles Robert Darwin&quot;&#039;) },
  1: { person: $.rdf.resource(&#039;&amp;lt;#RobertDarwin&amp;gt;&#039;),
       label:  $.rdf.literal(&#039;&quot;Robert Darwin&quot;&#039;) },
  ... bunch of other properties and methods that aren&#039;t important here ... }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;each()&lt;/code&gt; on lines 466-468 then iterates over the objects that it&amp;#8217;s constructed and calls the &lt;code&gt;addIndividuals()&lt;/code&gt; function (which is particular for this demo), passing in the list in the HTML, the person resource and the value of the label literal.&lt;/p&gt;

&lt;p&gt;Line 469 uses the &lt;code&gt;reset()&lt;/code&gt; method to go back to the original rdfQuery object. If I didn&amp;#8217;t do this, any further queries would simply add to the objects that I already have, or remove them if nothing matched.&lt;/p&gt;

&lt;p&gt;Lines 470-474 do the same thing for the places that are marked up within the text.&lt;/p&gt;

&lt;p&gt;There are various other places within &lt;code&gt;markup.js&lt;/code&gt; that glean and query RDF. For example, the &lt;code&gt;addDescription()&lt;/code&gt; function, which populates the list items on the left with data about particualr people and places. That function demonstrates the use of the &lt;code&gt;about()&lt;/code&gt; method, which gives you all the triples about a particular subject, and shows how to use arguments with the &lt;code&gt;each()&lt;/code&gt; method when you want to use the index of the query result or the triples that were used to create the query result.&lt;/p&gt;

&lt;h2&gt;Updating RDFa&lt;/h2&gt;

&lt;p&gt;So how easy is it to update the RDFa on the web page? Well, if you know what you want to add, then it&amp;#8217;s dead easy. Here&amp;#8217;s the code that does it on lines 452 and 532:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;span.rdfa(triple);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The variable &lt;code&gt;span&lt;/code&gt; here is a jQuery object. The triple itself is a &lt;code&gt;$.rdf.triple&lt;/code&gt;. I&amp;#8217;d tell you more about them but I think I&amp;#8217;ve gone on long enough.&lt;/p&gt;

&lt;h2&gt;Final Words&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/rdfquery&quot; title=&quot;rdfQuery: RDF plugins for jQuery&quot;&gt;rdfQuery&lt;/a&gt; is a Google Code project, released under an MIT license. If you&amp;#8217;re interested in contributing, send me an email and I&amp;#8217;ll add you as a member, or an owner if you&amp;#8217;re really keen. If you&amp;#8217;re interested, I&amp;#8217;ve set up a &lt;a href=&quot;http://groups.google.com/group/rdfquery&quot; title=&quot;rdfQuery Discussion Group&quot;&gt;discussion group&lt;/a&gt;. You can post any questions there, although of course if you find bugs, do &lt;a href=&quot;http://code.google.com/p/rdfquery/issues/entry&quot; title=&quot;rdfQuery: Add Issue&quot;&gt;add an issue&lt;/a&gt;.&lt;/p&gt;
</description>
 <comments>http://www.jenitennison.com/blog/node/94#comments</comments>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/34">genealogy</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/41">jQuery</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/31">rdf</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/42">rdfa</category>
 <category domain="http://www.jenitennison.com/blog/taxonomy/term/40">rdfQuery</category>
 <enclosure url="http://www.jenitennison.com/blog/files/markup-demo.jpg" length="286620" type="image/jpeg" />
 <pubDate>Sat, 15 Nov 2008 16:46:02 +0000</pubDate>
 <dc:creator>Jeni</dc:creator>
 <guid isPermaLink="false">94 at http://www.jenitennison.com/blog</guid>
</item>
</channel>
</rss>
