<?xml version="1.0" encoding="UTF-8"?><article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0-subset Balisage-1.2"><title>Using Atom Categorization to Build Dynamic Applications</title><info><confgroup><conftitle>Balisage: The Markup Conference 2008</conftitle><confdates>August 12 - 15, 2008</confdates></confgroup><abstract><para>Atom feeds provide the ability to categorize both the feed and its
      entries. This categorization provides a simple and easy way for feed authors
      to associated terms and semantics to their feed contents. By using this
      categorization, authors can keep their information organized while
      re-purposing them to build dynamic web applications.</para></abstract><author><personname><firstname>R.</firstname><othername>Alexander</othername><surname>Milowski</surname></personname><personblurb><para>A long-time markup and web geek.</para></personblurb><affiliation><orgname>Appolux, Inc.</orgname></affiliation><email>alex@milowski.com</email></author><legalnotice><para>Copyright © 2008 R. Alexander Milowski</para></legalnotice></info><section><title>Lists, Stacks, and Piles</title><para>If you could see my desk at home or my office, you'd probably find
    it a horrific disorganized disaster with post-it notes on the desktop and
    monitor, stacks of papers and other items, and giant pile at one end. On
    the other hand, I see it as disorganized ordered mess. I know where to
    find what I need and there is a system of lists, stacks, and piles.</para><para>The post-it notes contain lists of things I need to do, information
    from "recent queries", reminders on one sort or another, and they are all
    ordered and carefully placed on my desk as to their importance. In
    relation to these lists, I have stacks of bills, papers, and other urgent items
    that need to be filed, where each stack has its purpose
    or category. Finally, I have giant pile of things that were
    formally in stacks. For some reason or another, they've expired but need
    to be filed. Someday I'll get around to that filing and make that giant
    pile not so giant anymore.</para><para>It shouldn't surprise you to find that my computers are similarly
    organized. It is easy to recognize the stacks of documents shuttered into
    folders by their relationship to each other or my stacks of photos or
    videos from my camera. My desktop has become a giant "pile of things
    downloaded" overtime and the whole computer is somewhat of a giant pile of
    information I've retained.</para><para>I've come to realized that this isn't going to change. What I need
    is for software and applications to adjust themselves to my way of storing
    information. Not finding what I needed and discovering the usefulness of
    Atom feeds, I created the open-source atomojo <xref linkend="atomojo"/> project to serve my "disorganized ordered
    mess" nature and store my information.</para><para>What I discovered was that even though I'm a software developer and
    work with things are often tightly controlled and highly structured, much
    of the information I produce or interact with--media, information bits,
    documents of all kinds--tends to be loosely organized into "stacks" rather
    than tightly controlled "lists". This is especially true when it comes to
    media coming from personal interactions, family, vacations and other
    things not related to business.</para><para>In fact, I'd say that the immense popularity of web search and the
    introduction of desktop search trends well with the idea that people
    generate stacks and piles of information that are loosely grouped
    together. I'd go even further to say that a "list" is a rare thing and can
    be hard to develop.</para><para>Let's then face the fact that people don't produce <quote>lists</quote>
    as much as they produce <quote>stacks</quote> and <quote>piles</quote>.  Producing organized and
    structured information takes time and so we just shove our media, documents, and other
    information into the nearest stack (or pile) that looks appropriate. We do
    that with a slightly dishonest hope that we'll come back to it later and
    "get organized."</para><para>In the end, this information should be the basis for the
    applications and communications that we share with others on the Internet.
    It could drive our websites, our picture galleries, and our commerce
    engines if we only had a way to get it organized. Thus, my messy desk led
    me to believe that if I got organized I could build better dynamic
    applications.</para></section><section><title>Getting Organized with Atom Feeds</title><para>Atom feeds are like stacks of objects. There is an order to the
    stack from the first entry to the last. You often have to sort through the
    entries from first to last to find what you want. But the feed has a
    purpose and so there is a loose relationship between each entry.</para><para>While certain information resources have processable content, many
    others are not so easily searched. That is, an image is difficult to
    search against without human interaction unless there are annotations. As
    a result, the metadata encoded in the feed entry is very
    important.</para><para>With the recent invention of the Atom Publishing Protocol
    (AtomPub) <xref linkend="apprfc"/>, creation and manipulation
    of both entries and their associated metadata is relatively easy. As such,
    rather than shoving that picture from your last vacation into the nearest
    folder, you can tuck it away nicely into a Atom feed. The consequence is
    the natural next step is to author some metadata.</para><para>Entries have a rich vocabulary with which you can annotate your
    resources. Just by looking at the entry you can learn about the author,
    titles, summaries, and many other aspects. This enhances the
    ability to retrieve that object later.</para><section><title>Term Categorization in Atom</title><para>One of the interesting parts of the Atom vocabulary is the
      <code>category</code> element associated with both feeds and entries.
      This element has two important attributes called
      <quote><code>scheme</code></quote> and
      <quote><code>term</code></quote>. The <code>scheme</code> attribute is
      an URI value that <quote>qualifies</quote> or <quote>scopes</quote> the <code>term</code>
      attribute's value. The element itself can contain any content--text or
      elements--but none is defined by the Atom Syndication Format <xref linkend="atomrfc"/>.</para><para>If you concatenate the <code>scheme</code> and <code>term</code>
      attribute values and assume a default for when the <code>scheme</code>
      attribute is omitted, the result is a URI. This
      value can be interpreted as a leaf term in some unnamed ontology
      that labels the entry or feed with that term. As the
      <code>category</code> element may contain content, a value can be
      associated with the term.</para><para>This interpretation means that for each <code>category</code>
      element you get a RDF <xref linkend="rdf"/> triple. This
      triple is constructed such that the subject is the entry or feed,
      the predicate is the term URI, and the object is the value of the
      element. When the <code>category</code> element is empty, the value
      defaults to <code>rdf:nil</code>.</para></section><section><title>Graphical Models for Terms</title><para>Each feed generates a simple graphical model using the unique
      <code>id</code> element values to represent the subjects in the triples.
      For example, given the feed in <xref linkend="feed-example"/>,
      the graph in <xref linkend="graph-example"/> is generated using
      edge labels:</para><itemizedlist><listitem><para>E: http://www.atomojo.org/O/type/entry</para></listitem><listitem><para>pets: http://www.atomojo.org/O/keywords/pets</para></listitem><listitem><para>kind: http://www.atomojo.org/O/keywords/kind</para></listitem><listitem><para>breed: http://www.atomojo.org/O/keywords/breed</para></listitem><listitem><para>color: http://www.atomojo.org/O/keywords/color</para></listitem><listitem><para>name: http://www.atomojo.org/O/keywords/name</para></listitem></itemizedlist><figure xml:id="feed-example"><title>Example Feed</title><programlisting xml:space="preserve">
&lt;feed xmlns='http://www.w3.org/2005/Atom'&gt;
&lt;title&gt;Pets&lt;/title&gt; &lt;id&gt;id:feed:1&lt;/id&gt;
&lt;updated&gt;2008-07-10T15:45:26-07:00&lt;/updated&gt;
&lt;category term='pets'/&gt;

&lt;entry&gt;
&lt;title&gt;My Cat&lt;/title&gt;
&lt;id&gt;id:entry:1&lt;/id&gt;
&lt;updated&gt;2008-07-10T15:45:26-07:00&lt;/updated&gt;
&lt;category term='pet'/&gt;
&lt;category term='kind'&gt;cat&lt;/category&gt;
&lt;category term='color'&gt;tan/tiger&lt;/category&gt;
&lt;category term='name'&gt;bruno&lt;/category&gt;
&lt;content type='image/png' src='bruno.png'/&gt;
&lt;/entry&gt;

&lt;entry&gt;
&lt;title&gt;My Dog&lt;/title&gt;
&lt;id&gt;id:entry:2&lt;/id&gt;
&lt;updated&gt;2008-07-10T15:40:17-07:00&lt;/updated&gt;
&lt;category term='pet'/&gt;
&lt;category term='kind'&gt;dog&lt;/category&gt;
&lt;category term='breed'&gt;siberian husky&lt;/category&gt;
&lt;category term='color'&gt;white&lt;/category&gt;
&lt;category term='name'&gt;hudson&lt;/category&gt;
&lt;content type='image/png' src='hudson.png'/&gt;
&lt;/entry&gt;

&lt;/feed&gt;
</programlisting></figure><figure xml:id="graph-example"><title>Feed Graphical Model</title><mediaobject><imageobject><imagedata fileref="../../../vol1/graphics/Milowski01/Milowski01-001.png" format="png"/></imageobject></mediaobject></figure></section><section><title>Querying to Build Lists</title><para>Being able to query your feeds becomes very important after enough
      content as been collected. That is, your feeds start to look a lot like
      an unorganized <quote>pile</quote>. Past a certain number, keeping track of just where
      something can be found gets to be very difficult.</para><para>While the Atom vocabulary provides many interesting elements (e.g.
      title) by which you might search, the entry and feed categorization
      provide a fine-grained set of information on which a query can be
      performed. Simple queries can be used to retrieve entries from feeds
      simply by pulling those entries who have certain terms.</para><para>We'd like a query that can:</para><itemizedlist><listitem><para>provide a set of terms for the basis of the query,</para></listitem><listitem><para>allow comparison of any values associated with those
          terms,</para></listitem><listitem><para>return the query result as a "reconstituted" feed.</para></listitem></itemizedlist><para>Fortunately, SPARQL <xref linkend="sparql"/> has
      recently become a W3C recommendation and we can use this to query our
      <quote>pile</quote> of feeds.</para><para>For example, if we want to retrieve the feed with the keyword
      <quote><code>pets</code></quote>, we could query on the term
      <code>http://www.atomojo.org/O/keywords/pets</code> as shown in <xref linkend="petsfeed"/>.</para><figure xml:id="petsfeed"><title>Retrieve the pets feed</title><programlisting xml:space="preserve">
PREFIX k: &lt;http://www.atomojo.org/O/keyword/&gt;
SELECT ?e WHERE { ?e k:pets () . }
</programlisting></figure><para>Similarly, we could restrict the query to return all pet entries
      as in <xref linkend="allpets"/>.</para><figure xml:id="allpets"><title>Retrieve all pets entries</title><programlisting xml:space="preserve">
PREFIX k: &lt;http://www.atomojo.org/O/keyword/&gt;
PREFIX t: &lt;http://www.atomojo.org/O/type/&gt;
SELECT ?e WHERE { ?e t:entry (); k:pet () . }
</programlisting></figure><para>If we want to search by value, we could find the pet named
      'hudson' as in <xref linkend="findhudson"/>.</para><figure xml:id="findhudson"><title>Find Hudson</title><programlisting xml:space="preserve">
PREFIX k: &lt;http://www.atomojo.org/O/keyword/&gt;
SELECT ?e WHERE { ?e k:pet () ; k:name "hudson" .}
</programlisting></figure><para>As a query language, SPARQL is sufficiently powerful to express
      many types of queries. If the graphical model of the feeds is extended
      to include properties from the atom feed vocabulary, queries can be
      formulated that mix categorization with the feed structure (e.g. find
      all pet entries whose title contains a certain word).</para><para>Since we are interested in feeds and entries, the real use of the
      query is to <quote>reconstitute</quote> the result into a feed. This can be done by
      a simple process using these rules:</para><orderedlist><listitem><para>For each matching feed, return an entry that summarizes the
          feed, its categorization, and a single link of relation <quote><code>related</code></quote>
          that points to the feed's resource URI.</para></listitem><listitem><para>For each matching entry, return the entry with the
          <code>xml:base</code> attribute set such that the link relations are
          preserved.</para></listitem></orderedlist><para>As a result of this process, the query result is just another feed
      that can be consumed by any Atom-enabled client.</para></section></section><section><title>Building Applications from Atom Feeds</title><section><title>Architecture Overview</title><para>With our ability to annotate and query arbitrary content as feed
      entries, we can now describe a dynamic application architecture show in
       <xref linkend="architecture"/> that is based on atomojo's AtomPub and
      SPARQL abilities. On the far left is the application author who is
      responsible for loading content and configuring the application. On the
      far right is the end user of the application who is using a
      browser-based application presented by the system. In the middle is the
      web application server and atomojo server instances.</para><figure xml:id="architecture"><title>Atomojo-based Architecture</title><mediaobject><imageobject><imagedata fileref="../../../vol1/graphics/Milowski01/Milowski01-002.png" format="png"/></imageobject></mediaobject></figure><para>The author's responsibility is not only to provide the content
      from <quote>the pile</quote> and appropriate annotations, but also to provide
      <quote>instructions</quote> through the same means. These instructions provide
      content layouts, rules for content organization, web content such as
      javascript code or CSS stylesheets, and even service components. While
      some of this content is the domain of a web programmer, much of it is
      just simple entries with categorizations as to how to build resources on
      the web application server.</para><para>The web application server performs several tasks:</para><itemizedlist><listitem><para>provides content proxies from the atomojo server to deliver
          content to the browser,</para></listitem><listitem><para>loads and configures layouts for web pages that are to be
          built from atom feeds,</para></listitem><listitem><para>loads and configures resources that are SPARQL queries to the
          atomojo server,</para></listitem><listitem><para>loads custom application components for specialized
          services.</para></listitem></itemizedlist><para>The configuration information is retrieved from the atomojo server
      by a series of SPARQL queries. These queries allow the configuration
      information to be stored anywhere the author prefers.</para></section><section><title>An Example</title><para>When the web application server periodically updates itself, it
      performs a set of queries against the atomojo server to retrieve
      configuration information. For example, to find all the layouts, the
      server uses the
      query shown in <xref linkend="layouts"/>.  This query
      returns a set of entries that are the instructions for how each feeds is
      processed to produce a web page.</para><figure xml:id="layouts"><title>Query for All Layouts</title><programlisting xml:space="preserve">
PREFIX www: &lt;http://www.atomojo.org/O/www/configuration/&gt;
SELECT ?e WHERE { ?e www:layout () . }
</programlisting></figure><para>A typical layout entry is a media resource entry that contains a
      script (e.g. XSLT) for transforming the feed on the server into
      appropriate web content. While the
      transformation as shown in <xref linkend="layout2html"/> produces HTML, nothing precludes generation of images or other
      non-XML media types.</para><figure xml:id="layout2html"><title>A Layout Entry</title><programlisting xml:space="preserve">
&lt;entry xmlns='http://www.w3.org/2005/Atom'&gt;
&lt;title&gt;Default Layout&lt;/title&gt;
&lt;id&gt;urn:uuid:18e4d0870ee46-4ff5-8895-bdd0ee0fb226&lt;/id&gt;
&lt;published&gt;2008-07-18T11:22:06-07:00&lt;/published&gt;
&lt;updated&gt;2008-07-18T11:42:06-07:00&lt;/update&gt;
&lt;category scheme='http://www.atomojo.org/O/www/configuration/'
          term='layout'/&gt;
&lt;category scheme='http://www.atomojo.org/O/www/configuration/layout/'
          term='media-type'&gt;text/html&lt;/category&gt;
&lt;content src='default-layout.xsl' type='application/xslt+xml'/&gt;
&lt;/entry&gt;
</programlisting></figure><para>The layouts are used by internal or custom components where the
      choice of layout is based on a
      number of matching criteria. These layout rules can be restricted to
      match by resource path or require that the feed being rendered to have
      certain terms (i.e. category elements).  This allows the author to select
      the layout based on categorization rather than location in the atomojo
      server.</para><para>This approach has been used to configure the proxies, layouts,
      queries to the server, and application components as shown in
      <xref linkend="configuration"/>.</para><figure xml:id="configuration"><title>A Configuration Feed</title><programlisting xml:space="preserve">
&lt;feed xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2005/Atom" xml:base="./"&gt;
&lt;id&gt;urn:uuid:9a1ecf4e-2495-4a42-9b53-37b25dff731e&lt;/id&gt;
&lt;updated&gt;2008-07-17T14:38:20-07:00&lt;/updated&gt;
&lt;title&gt;Configuration&lt;/title&gt;
&lt;author&gt;&lt;name&gt;Alex Milowski&lt;/name&gt;&lt;/author&gt;
&lt;link href="" rel="edit"/&gt;
&lt;category scheme="http://www.atomojo.org/O/type/feed/" term="hidden"/&gt;
&lt;link href="" rel="self"/&gt;

&lt;entry&gt;
&lt;title type="text"&gt;default-layout.xsl&lt;/title&gt;
&lt;id&gt;urn:uuid:18e4d087-ee46-4ff5-8895-bdd0ee0fb226&lt;/id&gt;
&lt;published&gt;2008-07-18T11:22:09-07:00&lt;/published&gt;
&lt;updated&gt;2008-07-18T11:22:09-07:00&lt;/updated&gt;
&lt;app:edited&gt;2008-07-18T12:01:59-07:00&lt;/app:edited&gt;
&lt;link href="./_/18e4d087-ee46-4ff5-8895-bdd0ee0fb226" rel="edit"/&gt;
&lt;content type="application/xslt+xml" src="default-layout.xsl"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/"
          term="layout"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/layout/"
          term="media-type"&gt;text/html&lt;/category&gt;
&lt;link href="default-layout.xsl" rel="edit-media"/&gt;
&lt;/entry&gt;

&lt;entry&gt;
&lt;published&gt;2008-07-17T14:43:17-07:00&lt;/published&gt;
&lt;app:edited&gt;2008-07-17T17:44:55-07:00&lt;/app:edited&gt;
&lt;updated&gt;2008-07-17T14:43:17-07:00&lt;/updated&gt;
&lt;id&gt;urn:uuid:f080d0ee-a1b2-4012-a916-b0d915ea2cc4&lt;/id&gt;
&lt;title type="text"&gt;Proxy&lt;/title&gt;
&lt;author&gt;&lt;name&gt;Alex Milowski&lt;/name&gt;&lt;/author&gt;
&lt;link href="./_/f080d0ee-a1b2-4012-a916-b0d915ea2cc4" rel="edit"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/"
          term="application"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="match"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="proxy"&gt;resources&lt;/category&gt;
&lt;/entry&gt;

&lt;entry&gt;
&lt;published&gt;2008-07-17T17:38:11-07:00&lt;/published&gt;
&lt;app:edited&gt;2008-07-17T17:44:24-07:00&lt;/app:edited&gt;
&lt;updated&gt;2008-07-17T17:38:11-07:00&lt;/updated&gt;
&lt;id&gt;urn:uuid:115b3132-4a9f-432d-bf7d-e366803d286e&lt;/id&gt;
&lt;title type="text"&gt;Index&lt;/title&gt;
&lt;author&gt;&lt;name&gt;Alex Milowski&lt;/name&gt;&lt;/author&gt;
&lt;link href="./_/115b3132-4a9f-432d-bf7d-e366803d286e" rel="edit"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/"
          term="application"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="class"&gt;org.atomojo.www.util.script.IndexApplication&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="match"&gt;/{path}/&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="match"&gt;/&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/match/"
          term="mode"&gt;exact&lt;/category&gt;
&lt;/entry&gt;

&lt;entry&gt;
&lt;published&gt;2008-07-18T13:28:51-07:00&lt;/published&gt;
&lt;app:edited&gt;2008-07-18T13:28:51-07:00&lt;/app:edited&gt;
&lt;updated&gt;2008-07-18T13:28:51-07:00&lt;/updated&gt;
&lt;id&gt;urn:uuid:01ababd0-9c16-4f0f-a4a9-ffecfdecdaf3&lt;/id&gt;
&lt;title type="text"&gt;Software Index&lt;/title&gt;
&lt;author&gt;&lt;name&gt;Alex Milowski&lt;/name&gt;&lt;/author&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/"
          term="application"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="class"&gt;org.atomojo.www.util.script.IndexApplication&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="match"&gt;/software/&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/match/"
          term="mode"&gt;exact&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/application/"
          term="resource"&gt;software&lt;/category&gt;
&lt;link href="./_/01ababd0-9c16-4f0f-a4a9-ffecfdecdaf3" rel="edit"/&gt;
&lt;/entry&gt;

&lt;entry&gt;
&lt;published&gt;2008-07-18T13:26:49-07:00&lt;/published&gt;
&lt;app:edited&gt;2008-07-18T13:26:49-07:00&lt;/app:edited&gt;
&lt;updated&gt;2008-07-18T13:26:49-07:00&lt;/updated&gt;
&lt;id&gt;urn:uuid:3b5319ba-2e8b-4b66-94bc-ecf01bac77f8&lt;/id&gt;
&lt;title type="text"&gt;Software Resource&lt;/title&gt;
&lt;author&gt;&lt;name&gt;Alex Milowski&lt;/name&gt;&lt;/author&gt;
&lt;link href="./_/3b5319ba-2e8b-4b66-94bc-ecf01bac77f8" rel="edit"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/"
          term="resource"/&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/resource/"
          term="name"&gt;software&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/resource/"
          term="relation"&gt;terms&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/resource/"
          term="media-type"&gt;application/sparql-query&lt;/category&gt;
&lt;category scheme="http://www.atomojo.org/O/www/configuration/resource/"
          term="query"&gt;
PREFIX k: &amp;lt;http://ww.atomojo.org/O/keyword/&amp;gt;
PREFIX t: &amp;lt;http://www.atomojo.org/O/type/&amp;gt;
SELECT ?e WHERE { ?e t:feed (); k:software () }
&lt;/category&gt;
&lt;/entry&gt;
&lt;/feed&gt;
</programlisting></figure><para>In <xref linkend="configuration"/>, the first entry
      is the layout, the second entry is a proxy for content, and the third is
      an application component that comes packaged with atomojo. This
      component is used to create <quote>index pages</quote> from feeds using the layouts and is typically
      mapped to <quote>index</quote> resources (e.g. ends with a forward slash). These
      mappings are shown in the <quote><code>match</code></quote> terms in the entries.</para><para>The last two entries are slightly different. Their purpose is to
      use the query facilities of the atomojo server to find all <quote>software</quote>
      projects on the web site and then present a listing. They do this by
      associating a query to a resource that is then called by another <quote>index</quote>
      component.</para><para>The last entry defines a query against the atomojo server for
      retrieving all those feeds that have a keyword of <quote><code>software</code></quote>. That
      resource is used by the index component defined by the preceding entry.
      These two entries together configure an index page at <quote><code>/software/</code></quote> on
      the web site.</para></section></section><section><title>Conclusion</title><para>In <xref linkend="configuration"/> in the last
    section, the last two entries achieved finding resources in our <quote>pile of
    information</quote>. An author can now put information about software in any feed
    they choose  and, as long as it is
    annotated with a category element with a term value of <quote><code>software</code></quote>, it will
    show up on that software index page.</para><para>This is not remarkable. Plenty of software system exists that allow
    authored keywords to produce index information and then allow people to
    browse that information. What is interesting here is that we're using
    categorization and terms.</para><para>Any categorization--both formal and informal--can now be used to
    annotate information stored in the feeds. The annotations are not limited
    to keywords. Also, the combination of different terms and values can be
    used to create a very specific set of informaiton.</para><para>Similarly, the queries are not limited to simple retrieval
    exercises.  The SPARQL queries can perform complex union and intersection
    operations as well as filtering on term values.  As such, very specific
    data sets can be retrieved from the atomojo server.</para><para>As time goes by, queries can be developed to use whatever categorization
    evolves from the authors.  These queries can be used to
    re-purpose that original content without much, if any, change to the
    feed metadata.  The resulting feeds can then be associated with a web resource
    independent of how the author chose to organize the original entries and
    feeds. That is, I can create a disorganized pile of information and keep
    my website organized.</para></section><bibliography><title>Bibliography</title><bibliomixed xml:id="atomojo">Milowski, R. "Atomojo" 2008
    <link xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">http://code.google.com/p/atomojo/</link></bibliomixed><bibliomixed xml:id="atomrfc">Nottingham, M. and Sayre R., "RFC 4287: The
    Atom Syndication Format", December 2005
    <link xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">http://www.ietf.org/rfc/rfc4287.txt</link></bibliomixed><bibliomixed xml:id="apprfc">Gregorio, J. and de hOra, B. "RFC 5023: The
    Atom Publishing Protocol", October 2007
    <link xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">http://www.ietf.org/rfc/rfc5023.txt</link></bibliomixed><bibliomixed xml:id="sparql">Prud'hommeaux, E. and Seaborne, A. "SPARQL
    Query Language for RDF", January 2008
    <link xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">http://www.w3.org/TR/rdf-sparql-query/</link></bibliomixed><bibliomixed xml:id="rdf">Hayes, P. "RDF Semantics", February 2004
    <link xlink:type="simple" xlink:show="new" xlink:actuate="onRequest">http://www.w3.org/TR/rdf-mt/</link></bibliomixed></bibliography></article>
