<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:coop="http://www.google.com/coop/namespace">
   <channel>
      <title>Q6</title>
      <link>http://q6.oclc.org/</link>
      <description>6 Questions - Who, What, Where, Why, When, and How.</description>
      <language>en</language>
      <copyright>Copyright 2011</copyright>
      <lastBuildDate>Wed, 19 May 2010 22:22:42 -0500</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=4.23-en</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>&quot;Conjuring&quot; as a Linked Data design pattern</title>
         <description><![CDATA[<p>Everywhere I look there are blobs laying around that nobody quite knows what to name except "database", "record", or 1, 2, 3, 4, 5... Oh sure, some of these blobs are XML and they're indexed. Some of them are even accessible via a Web API using hackable query string parameters. Still, though, nobody's quite sure what to name the blobs. If you find yourself in a similar situation, try this:</p>

<p>http://example.org/database/1 (303 redirect to...)<br />
http://example.org/database/1/ (2XX returning the blob)</p>

<p>Got those URIs working? Now go into the code for the latter and add this:</p>

<p>if (request.getHeader("Accept") == "application/rdf+xml") {</p>

<p>&nbsp;&lt;rdf:RDF<br />
&nbsp;&nbsp;xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"<br />
&nbsp;&nbsp;xmlns:owl="http://www.w3.org/2002/07/owl#"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;owl:Thing rdf:about="http://example.org/database/1" /&gt;<br />
&nbsp;&lt;/rdf:RDF&gt;</p>

<p>} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;blob<br />
}</p>

<p>That unnamable thing you've been calling "1" now has a useful globally-unique HTTP identifier that establishes its presence on the Semantic Web as Linked Data. </p>

<p>Now comes the conjuring trick I saw my colleague Andrew Houghton performing. Free your mind of the idea that this blob is one "thing" and write an elevator speech describing the use cases for the blobs. If your blob is XML, look at the element names to help you write the speech. Circle the important nouns in the speech and peer into the blob looking for such a thing. If you think you see one, append the noun to the latter URI with a "#" like so:</p>

<p>http://example.org/database/1/#noun1<br />
http://example.org/database/1/#noun2</p>

<p>etc.</p>

<p>Now that these <em>meaningful</em> names have actionable HTTP identifiers, we need to announce their existence inside the &lt;rdf:RDF&gt; like so:</p>

<p>&lt;owl:Thing rdf:about="http://example.org/database/1/#noun1" /&gt;<br />
&lt;owl:Thing rdf:about="http://example.org/database/1/#noun2" /&gt;</p>

<p>You've just conjured up meaningful things out of the blob and given them Linked Data names using semantically-rich HTTP URIs. Granted, some of the semantics implied in the URI aren't reflected in the RDF, but that is easily remedied. And if somebody says you are lying about the existence of noun7 for record 53, update your code and/or the blob to fix the bug (it's not a "lie" since it wasn't intentional). Apologize and explain to them that conjuring always has been and always will be an inexact science. ;-)</p>

<p>This "Conjuring" pattern is a trustworthy starting point for making the important things lurking inside your blobs discoverable and available for unexpected reuse.</p>]]></description>
         <link>http://q6.oclc.org/2010/05/conjuring_as_a.html</link>
         <guid>http://q6.oclc.org/2010/05/conjuring_as_a.html</guid>
         <category>Linked Data</category>
         <pubDate>Wed, 19 May 2010 22:22:42 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>&quot;Information&quot; is not very helpful</title>
         <description><![CDATA[<p>If you buy into the "information resource vs. non-information resource" conception of Linked Data, the answer to the question "is this identified thing an information resource?" is either "yes" (2XX), "maybe" (303 or hashURI) or "I don't know" (4XX).</p>

<p>The second answer changes if you buy into the "Web Document vs. Real World Object" conception of Linked Data: "is this identified thing a Web Document?" "yes" (2xx), "no" (303 or hashURI) or "I don't know" (4xx).</p>

<p>As a client looking at response codes, I can't really know which interpretation the Linked Data URI designer intended. Nevertheless, as a coiner of Linked Data URIs, we need to choose one or the other (and hopefully not waffle and use both.)</p>

<p>Which interpretation would you choose? Keep in mind that "document" can be modeled as an abstract concept and thus identified as a "Real World Object" using 303 links to a variety of "Web Document" representations.</p>]]></description>
         <link>http://q6.oclc.org/2010/03/information_is.html</link>
         <guid>http://q6.oclc.org/2010/03/information_is.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Sat, 20 Mar 2010 08:58:23 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Who invented &quot;information&quot;?</title>
         <description><![CDATA[<p>I've been ranting on the <a href="http://listserv.oclc.org/scripts/wa.exe?A0=OPENURL">OpenURL listserv</a> lately about the potential of Linked Data and <a href="http://listserv.oclc.org/scripts/wa.exe?A2=ind1003c&L=openurl&T=0&F=P&P=5454">occasionally</a> making a fool of myself by referring to "information resource" when I really meant "non-information resource". What on earth was the person who originally coined the word "information" thinking? Didn't they know that Linked Data would come along someday and transform our understanding of reality based on the novelty of "non-information"? Couldn't they have invented a term signifying the negation of "information" instead so that people like me wouldn't get confused by people like me?</p>]]></description>
         <link>http://q6.oclc.org/2010/03/who_invented_in.html</link>
         <guid>http://q6.oclc.org/2010/03/who_invented_in.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Fri, 19 Mar 2010 23:49:27 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Life is like a box of use-cases</title>
         <description><![CDATA[<p>Finding new use cases is easy.<br />
Understanding new use cases is hard.</p>

<p>Understanding new use cases is easy.<br />
Finding names for new things is hard.</p>

<p>Finding names for new things is easy.<br />
Understanding how new things fit in with old things is hard.</p>

<p>Understanding how new things fit in with old things is easy.<br />
Figuring how to move old things into new things is...<br />
(now where did I leave that thesaurus?)</p>]]></description>
         <link>http://q6.oclc.org/2010/03/life_is_like_a.html</link>
         <guid>http://q6.oclc.org/2010/03/life_is_like_a.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Thu, 18 Mar 2010 09:38:02 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>You can&apos;t argue with use cases...</title>
         <description><![CDATA[<p>You can't argue with use cases. That's a pity, so I started a list of things I like to argue with instead:<br />
<ol><br />
	<li>the words (names) people use when talking about use cases</li><br />
	<li>how those named things need to be related to one another in order to satisfy a set of use cases</li><br />
	<li>how existing names and relationships can best be adapted to accommodate new use cases</li><br />
	<li>the value of extending, constraining, instantiating existing abstractions to maximize unexpected reuse</li><br />
	<li>whether or not things should be named and behave on a wire</li><br />
</ol></p>

<p>Hmm. What am I forgetting?<br />
</p>]]></description>
         <link>http://q6.oclc.org/2010/03/you_cant_argue.html</link>
         <guid>http://q6.oclc.org/2010/03/you_cant_argue.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Fri, 12 Mar 2010 16:34:26 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Hype Cycles, Efficient Frontiers, and Linked Data</title>
         <description><![CDATA[<p>In the technology domain, "things" follow a <a href="http://en.wikipedia.org/wiki/Hype_cycle">Hype cycle</a>. I don't fully understand why, but something tells me this is unavoidable. </p>

<p>In the investing domain, the assumption is that every investment portfolio has a risk-return profile that can be optimized in line with an "<a href="http://en.wikipedia.org/wiki/Capital_asset_pricing_model#The_efficient_frontier">efficient frontier</a>". Again, I don't fully understand why, but something tells me this makes sense in spite of (or more likely especially in) these tough economic times.</p>

<p>Regardless of the times, it seems to me that these principles are somehow related. There must be an efficient frontier for any given hype cycle. It's not clear how anyone can measure this, but without having a handle on it we are making wild guesses about resource allocations.</p>

<p>OTOH, I don't want anyone to get the impression that I sit around thinking about the connection between hype and efficiency all day long. It's just an idea that popped into my head. What I sit around all day thinking about is ways of producing and consuming <a href="http://www.w3.org/DesignIssues/LinkedData.html">Linked Data</a> efficiently. This is the hype cycle that I hope without hope is being managed efficiently.</p>]]></description>
         <link>http://q6.oclc.org/2010/03/hype_cycles_eff.html</link>
         <guid>http://q6.oclc.org/2010/03/hype_cycles_eff.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Fri, 05 Mar 2010 22:34:51 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Linked Data and Cool URI Patterns</title>
         <description><![CDATA[<p>MVC <a href="http://en.wikipedia.org/wiki/Scaffold_(programming)">scaffolding</a> frameworks like <a href="http://grails.org/">Grails</a> and <a href="http://rubyonrails.org/">Ruby on Rails</a> prove that the identity and behavior of Web resources can easily be generalized when they are based on a domain model. What Grails and presumably most other frameworks fail to account for is the fact that things named in a domain model identify <a href="http://www.w3.org/TR/cooluris/#semweb">real world objects</a>. It is time to correct this oversight.</p>

<p><a href="http://q6.oclc.org/2009/12/domain_modeling.html">Recall</a> that the primary things named in a domain model fall into a handful of categories: class, instance, attribute, relationship, operation, and the model itself. The Grails scaffold automatically provides HTTP URIs for Web document <em>representations</em> for some of these things. Here are examples using the default Grails URI mapping:</p>

<dl>
<dt>Model Web Document</dt>
<dd>http://example.org/</dd>
<dt>Class Web Document</dt>
<dd>http://example.org/{className}/{operationName}</dd>
<dt>Instance Web Document</dt>
<dd>http://example.org/{className}/{operationName}/{instanceName}</dd>
</dl>

<p>[Beware that Grails names these path segment tokens based on analogous MVC concepts:<br />
{className}={controller}<br />
{instanceName}={id}<br />
{operationName}={action}<br />
Also beware that the default Grails URI patterns are deficient in other ways, but it is difficult to change them. As a result, the URI patterns below are reluctantly forced into the default mold.]</p>

<p>The first enhancement for Linked Data compliance is real world object identifiers support for everything in the model. For some domain model categories <a href="http://www.w3.org/TR/cooluris/#r303uri">303 (See Other)</a> redirect behavior is appropriate:</p>

<dl>
<dt>Real World Model</dt>
<dd>http://example.org/{modelName}/rwo</dd>
<dt>Real World Class</dt>
<dd>http://example.org/{className}/rwo</dd>
<dt>Real World Instance</dt>
<dd>http://example.org/{className}/rwo/{instanceName}</dd>
</dl>

<p>These can be implemented by creating a special controller for the {modelName} and adding a new content-negotiable "rwo" action to it and the default scaffold controller. Real world object URIs for attributes and relationships can then piggy-back on Real World Class as <a href="http://www.w3.org/TR/cooluris/#hashuri">hash URIs</a>:</p>

<dl>
<dt>Real World Attribute</dt>
<dd>http://example.org/{className}/rwo#{attributeName}</dd>
<dt>Real World Relationship</dt>
<dd>http://example.org/{className}/rwo#{relationshipName}</dd>
</dl>

<p>Now that real world object identifiers are defined for everything in the domain model, the only thing lacking is an RDF representation alongside the scaffold's HTML representation. This will be examined in a subsequent post.</p>]]></description>
         <link>http://q6.oclc.org/2009/12/linked_data_and_1.html</link>
         <guid>http://q6.oclc.org/2009/12/linked_data_and_1.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Wed, 02 Dec 2009 11:58:24 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Domain Modeling and Linked Data</title>
         <description><![CDATA[<p>As a principle of object-oriented design, most things worth naming in a domain fall into one of several categories: class, instance, data type, attribute, relationship, or operation. Here is a <a href="http://grails.org/">Grails</a> (domain) class example illustrating the patterns (excluding instance):</p>

<pre>
class Person {
	String name
	Organization employer
	
	String toString() {
		"${name}"
	}
}
</pre>

<p>Whether we realize it or not, the names assigned in this way form an ontology that uniquely identify everything in the domain. Also note that MVC frameworks like Grails automatically inject all domain classes with machine-level create, read, update, and delete (CRUD) operations. This accounts for the naming and persistence of instances as well.</p>

<p>Now that we know how to systematically name everything of interest in a domain, we need to realize that every one of those things identifies a <a href="http://www.w3.org/TR/2008/NOTE-cooluris-20081203/#semweb">real world object</a> (RWO). Conversely, every RWO of interest in a domain can and should be named according to object-oriented principles. </p>

<p>The next trick is to take this machine-local ontology and project it onto the Web as <a href="http://www.w3.org/DesignIssues/LinkedData.html">Linked Data</a>. Grails <a href="http://en.wikipedia.org/wiki/Scaffold_(programming)">scaffolds</a> provide a glimpse of how this can be automated by creating a parallel controller like so:</p>

<pre>
class PersonController {
	def scaffold = true
}
</pre>

<p>This effectively forces Grails to inject the domain class with globally-unique HTTP URI identifiers and CRUD behaviors. Unfortunately, the default Grails scaffold only provides HTTP URIs for Web documents that <em>represent</em> the real world objects. In contrast, Linked Data requires separate HTTP URIs for the RWOs themselves. The other problem is that it does not automatically provide an RDF representation. </p>

<p>Both problems can be solved by customizing the scaffold Controller with new actions to support content-negotiable RWO URIs and scaffold views that produce RDF. Details will be examined in subsequent posts.</p>

<p>Jeff</p>]]></description>
         <link>http://q6.oclc.org/2009/12/domain_modeling.html</link>
         <guid>http://q6.oclc.org/2009/12/domain_modeling.html</guid>
         <category>Linked Data</category>
         <pubDate>Wed, 02 Dec 2009 09:33:08 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>A Modest Proposal</title>
         <description><![CDATA[<p>Object-oriented modeling is taking over the world. The interesting thing about "objects" is that it makes sense to talk about "instances" of them. The interesting thing about "instances" of objects is that you can "classify" them. The interesting thing about "classifying" objects is that you can "subclassify" them. But where does classification/subclassification end? In Java, it ends with java.lang.Object. Similarly, <a href="http://tools.ietf.org/html/rfc3986">Web standards</a> effectively say that classification ends with "resource".</p>

<p>One of the interesting differences between these two ultimate classes is that Web standards allow for direct instantiation of "resource" whereas Java requires you to subclass java.lang.Object before you do so. Java is also nice, compared to say C++, because it restricts multiple inheritance. If the Web had a similar constraint, the Semantic Web would be a whole lot simpler because a singular rdf:type could be required instead of optional or duplicitous.</p>

<p>My modest proposal, then, is to change Java and Web standards ever so slightly. In the case of Java, let's forbid developers from subclassing java.lang.Object and force them to subclass java.lang.Goop or java.lang.Concept instead. My sense is that most experienced developers would proudly choose to subclass java.lang.Concept and would make a genuine effort to justify this claim.</p>

<p>Likewise, in the case of Web standards, let's deny developers the right to directly create HTTP URIs and force them to choose between GOOP and CONCEPT URIs instead. The protocols associated with the identifiers should be identical. Looking around the Web, I suspect we could solve the problem of world hunger by eating Web  developers who confuse the two.</p>]]></description>
         <link>http://q6.oclc.org/2009/06/a_modest_propos.html</link>
         <guid>http://q6.oclc.org/2009/06/a_modest_propos.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Thu, 11 Jun 2009 21:19:41 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Revisiting the Union of httpRange-14 and Linked Data</title>
         <description><![CDATA[<p><a href="http://efoundations.typepad.com/">PeteJ</a> provided some really interesting feedback to my <a href="http://q6.oclc.org/2009/05/linked_datahttp.html">class diagram</a> reconciling Linked Data and httpRange-14. To start, Pete says:</p>

<blockquote>It certainly isn't true that a 303 redirect allows me to conclude that the identified resource is a "Real World Object".</blockquote>

<p>I agree that HTTP <a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">303 See Other</a> does not allow clients to "conclude" that the URI identifies a RWO. This requires evidence of the server's intent which is currently expensive to obtain. One of the goals of <a href="http://q6.oclc.org/2009/04/the_union_of_do.html">Linked Data Architecture (LDA)</a> is to make this intent more transparent and discoverable, but that is a different story.</p>

<p>What 303 does allow, though, is for clients to "assume" that the URI identifies a RWO. The Web Document at the other end of the 303 must contain information of substance <em>about</em> the (assumed) RWO in at least a tangential way or else the server wouldn't have bothered to redirect the client there. Granted, this is a weak form of "aboutness" but it is "aboutness" nonetheless and can be strengthened by the server over time as appreciation grows of the significance of Real World Object URIs.</p>

<p>The same principles apply to the use of hash URIs to identify Real World Objects.</p>

<p>Moving on to some of Pete's other points, he gives an example of a ringbinder on this desk. This <em>Real World Object</em> is easily transformed into a <em>Web resource</em> by assigning it an HTTP URI that returns a 303 redirect to another URI that identifies the corresponding "information resource". These are two different resources (related by "aboutness") and in his example it would be semantically sensible for the latter (information) URI to return 404 Not Found without compromising the Web identity of the RWO. If and when information about the RWO becomes available (e.g. an OCR PDF or MARCXML representation), the information resource can be updated and the identity of the RWO URI will be <a href="http://q6.oclc.org/2009/04/amendment_stren.html">strengthened</a>.</p>

<p>On the topic of a Web document that describes another Web document, I think this is an interesting use case that deserves a blog entry of its own.</p>

<p>On the topic of a URI identifying an HTML document that returns "gobbledygook", we need to accept httpRange-14's decision that that every Web document is an information resource and understand that information is invariably <em>about</em> something. The fact that the information resource is non-nonsensical doesn't justify ignoring httpRange-14 and say it isn't really an information resource after all, nor does the fact that the Real World Object it presumably describes is currently anonymous and nonsensical. Anonymous and nonsensical Real World Objects exist in abundance and we could start to make headway on some of them if we went to the trouble of assigning them names (HTTP URIs) and returning whatever information we have regardless of its apparent incoherence.</p>

<p>On another topic, I agree that a Web document may describe several RWOs, but nevertheless the Web document as a whole describes a RWO in its own right, namely the aggregation of those RWOs. The fact that nobody bothered to assign an HTTP URI to this aggregation (presumably with 303 behavior in this case) doesn't mean the RWO doesn't exist.</p>

<p>As subtle and philosophical as these issues may sound to others, I am pretty sure Pete and I would agree that discussing them and hammering out a common understanding is vital to leveraging the Web with maximum efficiency.</p>

<p>Jeff</p>]]></description>
         <link>http://q6.oclc.org/2009/06/can_we_conclude.html</link>
         <guid>http://q6.oclc.org/2009/06/can_we_conclude.html</guid>
         <category>Linked Data</category>
         <pubDate>Fri, 05 Jun 2009 15:09:29 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>AtomPub, AtomPub, AtomPub</title>
         <description><![CDATA[<p>In the beginning, HTTP defined a create, read, update, and delete (<a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a>) model for managing and using Web resources. The fact that these operations map to HTTP methods named <a href="http://tools.ietf.org/html/rfc2616#section-9.5">POST</a>, <a href="http://tools.ietf.org/html/rfc2616#section-9.3">GET</a>, <a href="http://tools.ietf.org/html/rfc2616#section-9.6">PUT</a>, and <a href="http://tools.ietf.org/html/rfc2616#section-9.7">DELETE</a> obfuscates things a little, but not significantly. And although it may not be obvious, <strong>anything</strong> can be identified as a resource on the Web. More will be said on the significance of this below.</p>

<p>Since a CRUD model is integral to the HTTP specification, the need for AtomPub may seem counterintuitive. In fact, the AtomPub CRUD model does <em>not</em> replace the HTTP CRUD model, it just explains how to apply it to Web resources that exist in the context of "collections". This need originated in the blogosphere where developers wanted to manage <a href="http://en.wikipedia.org/wiki/Web_document">Web documents</a> known as "blog entries" in conformance with the HTTP CRUD model. Fortunately, the AtomPub specification did not couple tightly with this type of Web document and developers are slowly realizing it can be used to manage <strong>any</strong> collection of Web documents.</p>

<p>[As an aside, a create, update, and delete model also lies at the heart of <a href="http://www.loc.gov/standards/sru/record-update/#actions">SRU Update</a>. The key difference is that AtomPub chose to build on Web standards whereas SRU Update chose to build on SOAP standards. If you are wondering if SRU Update is for you, consider the fact that the SRU Update CrUD model will end up getting tunneled over HTTP despite the competing models. Why add the overhead?]</p>

<p>Getting back to an earlier point, people are realizing that AtomPub is effective at managing collections of Web documents other than blog entries. What may not be obvious is that there are <em>other</em> types of Web resources besides the familiar Web documents we all know and love. Specifically, <a href="http://www.w3.org/DesignIssues/LinkedData.html">Linked Data</a> tells us that <a href="http://www.w3.org/TR/2008/NOTE-cooluris-20081203/#semweb">Real World Objects</a> can also be identified as Web resources. Just as AtomPub accommodated the mental migration from blog entries to Web documents, it is equally effective for managing collections of Real World Objects. If it's not clear how this can be done, start with this <a href="http://q6.oclc.org/2009/04/the_union_of_do.html">earlier blog entry</a> and watch this blog space for followups.</p>]]></description>
         <link>http://q6.oclc.org/2009/06/atompub_atompub.html</link>
         <guid>http://q6.oclc.org/2009/06/atompub_atompub.html</guid>
         <category>Domain Modeling</category>
         <pubDate>Fri, 05 Jun 2009 13:15:54 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>How Do Domain Modeling and Atom(Pub) Fit Together?</title>
         <description><![CDATA[<p>In various forums, I have claimed the benefits of using <a href="http://en.wikipedia.org/wiki/Domain_model">domain modeling</a> (DM) to design RESTful Web resources, but explaining why is surprisingly difficult. <a href="http://q6.oclc.org/2009/04/the_union_of_do.html">Efforts so far</a> have been geared towards the domain modeling crowd, but there are so many bells, whistles, and misunderstandings of DM that the simple beauty is easily missed. An appreciation of the <a href="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller</a> (MVC) pattern helps immensely, but if you're like me a clear understanding of MVC is hard to come by. Last night I was thinking that an RDF route might be a more efficient. Today an AtomPub perspective seems more likely. For people who are unfamiliar with all of the above, other routes need to be mapped out. I would claim, though, that the situation is analogous to the "Ah ha!" transition from the service-oriented to resource-oriented perspective. Atom(Pub) is probably the easiest route to this realization, so the shortest path to appreciating DM probably lies in this same direction.</p>

<p>The first thing to note is that a <a href="http://tools.ietf.org/html/rfc5023#section-3">collection</a> in Atom(Pub) maps directly to a "class" in DM. There is no need to subclass in DM to accomplish this relationship. Likewise, a <a href="http://tools.ietf.org/html/rfc5023#section-3">member</a> in Atom maps directly to an "instance" in DM. Again, no subclassing is necessary. </p>

<p>The discussion becomes easier we set aside the create, update, and delete capabilities of <a href="http://tools.ietf.org/html/rfc5023">AtomPub</a> for the moment. We can do that because AtomPub mostly just tells us is how the URIs we need to support the Atom Syndication Format should react if we throw POST, PUT, and DELETE at them instead of GET. </p>

<p>Given this simplification, an Atom Feed is merely a representation of a class (collection) and an Atom Entry is merely a representation of an instance (member). It's just another representation that could/should be negotiable from a Generic Document that it shares with the text/html, text/xml, application/json, or any other representation that the server thinks is worth supporting. From the (MVC) controller POV, Atom is just another type of view (representation format) that it needs to produce from the model. Creating a class in DM that subclasses Atom would be equivalent to subclassing text/html or application/json. It's not necessary.</p>]]></description>
         <link>http://q6.oclc.org/2009/05/how_do_domain_m.html</link>
         <guid>http://q6.oclc.org/2009/05/how_do_domain_m.html</guid>
         <category>Linked Data</category>
         <pubDate>Fri, 15 May 2009 14:17:09 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Linked Data and httpRange-14 Concepts and Relationships</title>
         <description><![CDATA[<p>There is some understandable confusion about the relationship between concepts in <a href="http://www.w3.org/DesignIssues/LinkedData.html">Linked Data</a> and <a href="http://www.w3.org/2001/tag/issues.html#httpRange-14">httpRange-14</a>. This class diagram may help:</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Linked Data - httpRange-14.jpg" src="http://q6.oclc.org/images/Linked%20Data%20-%20httpRange-14.jpg" width="547" height="434" class="mt-image-none" style="" /></span></p>

<p>Note that unlike httpRange-14, a Linked Data interpretation requires additional, but relatively lightweight, assumptions on the <a href="http://www.w3.org/TR/webarch/">Architecture of the World Wide Web</a>. Here are at least some of them:<br />
<ol><br />
	<li>Clients can unambiguously classify a resource as a Real World Object (RWO) either by the presence of a <a href="http://www.w3.org/TR/2008/NOTE-cooluris-20081203/#hashuri">hash in the HTTP URI</a> (deduced prior to the HTTP request) or an <a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">HTTP 303 See Other</a> status in the response (deduced after the HTTP request). In comparison, an HTTP 200 OK can be used to unambiguously classify the resource as a Web Document/Information Resource.</li><br />
	<li>This implies that Real World Object vs. Web/Document/Information Resource are disjoint.</li><br />
	<li>Every Real World Object needs to have at least one associated Web Document/Information Resource that contains information <em>about</em> it.</li><br />
	<li>Every Web Document describes <a href="http://www.w3.org/TR/webarch/#id-resources">one</a> RWO. The fact that some of these RWOs are mash-ups doesn't change this fact. Traditional understandings of the Web commonly fail to identify these Real World Objects with HTTP URIs.</li><br />
	<li>The Web Document returned by dereferencing a RWO URI is expected to contain <em>information about</em> the RWO. Linked Data/httpRange-14 do not split hairs between data and metadata. It is all just information and information is invariably <em>about</em> something in the real world.</li><br />
</ol></p>

<p>One of the beauties of embracing the Linked Data assumptions as a matter of policy is that they benefit others who may not even be aware of their significance.</p>

<p>Jeff</p>]]></description>
         <link>http://q6.oclc.org/2009/05/linked_datahttp.html</link>
         <guid>http://q6.oclc.org/2009/05/linked_datahttp.html</guid>
         <category>Linked Data</category>
         <pubDate>Fri, 15 May 2009 11:50:58 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>FRBR Core Concepts: Domain Model</title>
         <description><![CDATA[<p>I got an assignment to create a domain model for FRBR and some related vocabularies. I started by modeling <a href="http://vocab.org/frbr/frbr-core-20050810">Expression of Core FRBR Concepts in RDF</a>. The class diagram can be found <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://q6.oclc.org/images/Core%20FRBR%20Concepts.jpg">here</a></span>.</p>]]></description>
         <link>http://q6.oclc.org/2009/05/frbr_core_conce.html</link>
         <guid>http://q6.oclc.org/2009/05/frbr_core_conce.html</guid>
         <category>FRBR</category>
         <pubDate>Thu, 07 May 2009 14:06:25 -0500</pubDate>
      </item>
      
      <item>
         <author>Jeffrey A. Young</author>
         <coop:keyword>OpenURL</coop:keyword>
         <coop:keyword>Q6</coop:keyword>
         <title>Using AtomPub to Discover Linked Data</title>
         <description><![CDATA[<p>In our blog entry introducing the <a href="http://q6.oclc.org/2009/04/the_union_of_do.html">Linked Data Architecture</a> (LDA), we suggested the complementary nature of <a href="http://www.w3.org/DesignIssues/LinkedData.html">Linked Data</a>, <a href="http://tools.ietf.org/html/rfc5023">AtomPub</a>, and <a href="http://en.wikipedia.org/wiki/Domain_model">domain modeling</a>. The jargon used in these different systems is uncoordinated but the concepts are easily mapped. For example, a "class" in domain modeling maps to a "collection" in AtomPub and an "instance" maps to a "member".</p>

<p>The harmonization of AtomPub and domain modeling provides a powerful model for discovering high-resolution resources that are suitable for "unexpected reuse". Here is a feed of the "person" class/collection with a single "instance/member" named "alice".</p>

<pre>
&lt;feed xmlns=&quot;http://www.w3.org/2005/Atom&quot;&gt;
  &lt;id&gt;urn:uuid:D9A1E60A-5F8A-4361-8CC6-E28EFD66B3AE&lt;id&gt;
  &lt;title&gt;Person Instances&lt;/title&gt;
  &lt;author&gt;&lt;name /&gt;&lt;/author&gt;
  &lt;updated&gt;2009-04-28T00:00:00.0Z&lt;/updated&gt;
  &lt;link rel=&quot;self&quot; type=&quot;application/atom+xml&quot;
    href=&quot;http://example.org/view/person/instances.atom&quot; /&gt;
  &lt;link rel=&quot;related&quot; title="Real World Class"
    href=&quot;http://example.org/person&quot; /&gt;
  &lt;entry&gt;
    &lt;id&gt;urn:uuid:FC3921ED-BD3F-4479-AE48-73AAA38EE19E&lt;/id&gt;
    &lt;title&gt;Alice&lt;/title&gt;
    &lt;author&gt;&lt;name /&gt;&lt;/author&gt;
    &lt;published&gt;2009-04-28T00:00:00.0Z&lt;/published&gt;
    &lt;updated&gt;2009-04-28T00:00:00.0Z&lt;/updated&gt;
    &lt;link rel=&quot;edit&quot;
        type=&quot;application/atom+xml;type=entry&quot;
        href=&quot;http://example.org/person/alice/entry.atom&quot; /&gt;
    &lt;link rel=&quot;edit-media&quot; type=&quot;application/rdf+xml&quot;
        href=&quot;http://example.org/person/alice/entry.datum&quot; /&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;application/xhtml+xml&quot;
        href=&quot;http://example.org/person/alice/default.html&quot; /&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/n3&quot;
        href=&quot;http://example.org/person/alice/default.n3&quot; /&gt;
    &lt;link rel=&quot;alternate&quot; type=&quot;text/turtle&quot;
        href=&quot;http://example.org/person/alice/default.ttl&quot; /&gt;
    &lt;link rel=&quot;related&quot; title="Real World Instance"
        href=&quot;http://example.org/person/alice&quot; /&gt;
    &lt;content type=&quot;application/rdf+xml&quot;
        src=&quot;http://example.org/person/alice/default.rdf&quot; /&gt;
    &lt;summary type=&quot;text&quot; /&gt;
  &lt;/entry&gt;
&lt;/feed&gt;
</pre>

<p>Since the concept of domain model "class" maps to Atom "collection", we should expect them to appear as such in an Atom Service Document.Here is an example:</p>

<pre>
&lt;service xmlns="http://www.w3.org/2007/app"
    xmlns:atom="http://www.w3.org/2005/Atom"&gt;
  &lt;workspace&gt;
    &lt;atom:title&gt;My Domain Model&lt;/atom:title&gt;
    &lt;collection href="http://example.org/person"&gt;
      &lt;atom:title&gt;Person&lt;/atom:title&gt;
      &lt;accept&gt;application/rdf+xml&lt;/accept&gt;
    &lt;/collection&gt;
  &lt;/workspace&gt;
&lt;/service&gt;
</pre>

<p>Note that in order to accommodate Linked Data, the collection/@href refers to a <em>Real World Class</em> URI. This URI should do an HTTP <a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">303 See Other</a> redirect to a <em>Class Generic Document</em> from which the Atom feed <em>Class Web Document</em> shown above can be negotiated. </p>

<p>Ideally, the server root will act as a <em>Model Generic Document</em> for the model from which the Atom Service <em>Model Web Document</em> can be negotiated. The LDA resource categories for "model" are shown here:</p>

<table border="1">
<tr><th>Domain Modeling Concept</th><th>LDA Category Name</th></tr>
<tr><th rowspan="3">Model</th><th>Real World Model</th></tr>
<tr><th>Model Generic Document</th></tr>
<tr><th>Model Web Document</th></tr>
</table>

<p>The HTTP behaviors for these LDA categories can be found <a href="http://q6.oclc.org/lda/LDA%20Model%20Behaviors.pdf">here</a>.</p>

<p>Jeff Young<br />
Andrew Houghton</p>]]></description>
         <link>http://q6.oclc.org/2009/04/discovering_dom.html</link>
         <guid>http://q6.oclc.org/2009/04/discovering_dom.html</guid>
         <category>Linked Data</category>
         <pubDate>Tue, 28 Apr 2009 09:26:34 -0500</pubDate>
      </item>
      
   </channel>
</rss>

