<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss1full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><channel rdf:about="http://blogs.talis.com/n2"><title>n²</title><link>http://blogs.talis.com/n2</link><description>All about developing with the Talis Platform</description><dc:language>en</dc:language><items><rdf:Seq><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/98" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/95" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/92" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/89" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/86" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/77" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/74" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/71" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/68" /><rdf:li rdf:resource="http://blogs.talis.com/n2/archives/67" /></rdf:Seq></items><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=talis/n2</feedburner:awareness><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/talis/n2" type="application/rss+xml" /></channel><item rdf:about="http://blogs.talis.com/n2/archives/98"><title>Store Admin Interface</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/412652163/98</link><dc:subject>Projects</dc:subject><dc:subject>platform</dc:subject><dc:creator>kwijibo</dc:creator><dc:date>2008-10-06T04:42:29-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>If you have a Talis store, or even if you&#8217;re just interested in browsing around existing talis stores, you might be interested in an <a title="Talis Myadmin" href="http://myadmin.kwijibo.talis.com/" >admin interface </a> I&#8217;ve been working on.</p>
<p>Once you have selected a store, you can browse resources <a href="http://myadmin.kwijibo.talis.com/talisians/Types" >by type</a> (rdf:type), <a href="http://myadmin.kwijibo.talis.com/geonames-cities/Search?q=Wien" >search across the contentbox index</a>, edit resources, view pending jobs and <a href="http://myadmin.kwijibo.talis.com/sandbox1/Jobs" >send new ones</a>, <a href="http://myadmin.kwijibo.talis.com/sandbox1/Importer" >import data,</a> and <a href="http://myadmin.kwijibo.talis.com/sandbox1/Config" >configure the field-predicate mapping </a>for your stores.</p>
<p>Please send bug reports and feature requests to keith dot alexander at talis.com</p>
<p>If you do want a talis store, just ask in #talis on irc.freenode.net, or email danny dot ayers  at talis.com</p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/412652163" height="1" width="1"/>]]></content:encoded><description>If you have a Talis store, or even if you&amp;#8217;re just interested in browsing around existing talis stores, you might be interested in an admin interface  I&amp;#8217;ve been working on.
Once you have selected a store, you can browse resources by type (rdf:type), search across the contentbox index, edit resources, view pending jobs and send new [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/98/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F98</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/98</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/95"><title>Moriarty Development List</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/411800814/95</link><dc:subject>Announcements</dc:subject><dc:subject>Projects</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:creator>Ian Davis</dc:creator><dc:date>2008-10-05T05:24:45-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I noticed that I was the only one getting notificiations of commits to <a href="http://code.google.com/p/moriarty/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/moriarty/');">Moriarty</a>&#8217;s subversion. I thought the best way to fix that was to create a Google group for moriarty and ensure the commit reports get sent there. So if you&#8217;re interested in keeping track of changes to Moriarty please sign up: <a href="http://groups.google.com/group/moriarty-dev" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://groups.google.com/group/moriarty-dev');">moriarty-dev</a></p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/411800814" height="1" width="1"/>]]></content:encoded><description>I noticed that I was the only one getting notificiations of commits to Moriarty&amp;#8217;s subversion. I thought the best way to fix that was to create a Google group for moriarty and ensure the commit reports get sent there. So if you&amp;#8217;re interested in keeping track of changes to Moriarty please sign up: moriarty-dev</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/95/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F95</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/95</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/92"><title>Exploring OpenLibrary Part One</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/410380585/92</link><dc:subject>Ideas and Experiments</dc:subject><dc:subject>Projects</dc:subject><dc:creator>Rob Styles</dc:creator><dc:date>2008-10-03T11:22:09-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I thought it was about time I got around to taking a better look at what might be possible with the OpenLibrary data.</p>
<p>My plan is to try and convert it into meaningful RDF and see what we can find out about things along the way. The project is an own-time project mostly, so progress isn&#8217;t likely to be very rapid. Let&#8217;s see how it goes. I&#8217;ll diary here as stuff gets done.</p>
<p>To save me typing loads of stuff out here, today&#8217;s source code is tagged and in the n2 subversion as <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1" >day 1 of OpenLibrary</a>.</p>
<p>Day one, 3rd October 2008, I downloaded the <a href="http://openlibrary.org/static/jsondump/authors.json.gz" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://openlibrary.org/static/jsondump/authors.json.gz');">authors data from OpenLibrary</a> and unzipped it. I&#8217;m also downloading the <a href="http://openlibrary.org/static/jsondump/editions.json.gz" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://openlibrary.org/static/jsondump/editions.json.gz');">editions data from OpenLibrary</a>, but that&#8217;s bigger (1.8Gb) so I&#8217;m playing with the author data while that comes down the tubes.</p>
<p>The data has been exported by OpenLibrary as <a href="http://www.json.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.json.org/');">JSON</a>, so is pretty easy to work with. I&#8217;m going to write some PHP scripts on the command line to mess with it and it looks great for doing that.</p>
<p>Each line of the JSON in the authors file represents a single author, although some authors will have more than one entry. Taking a look at Iain Banks (aka Iain M Banks) we have the following entries:</p>
<pre><code>
{"name": "Banks, Iain", "personal_name": "Banks, Iain", "key": "\/a\/OL32312A", "birth_date": "1954", "type": {"key": "\/type\/type"}, "id": 81616}
{"name": "Banks, Iain.", "type": {"key": "\/type\/type"}, "id": 3011389, "key": "\/a\/OL954586A", "personal_name": "Banks, Iain."}
{"type": {"key": "\/type\/type"}, "id": 9897124, "key": "\/a\/OL2623466A", "name": "Iain Banks"}
{"type": {"key": "\/type\/type"}, "id": 9975649, "key": "\/a\/OL2645303A", "name": "Iain Banks         "}
{"type": {"key": "\/type\/type"}, "id": 10565263, "key": "\/a\/OL2774908A", "name": "IAIN M. BANKS"}
{"type": {"key": "\/type\/type"}, "id": 10626661, "key": "\/a\/OL2787336A", "name": "Iain M. Banks"}
{"type": {"key": "\/type\/type"}, "id": 12035518, "key": "\/a\/OL3127859A", "name": "Iain M Banks"}
{"type": {"key": "\/type\/type"}, "id": 12078804, "key": "\/a\/OL3137983A", "name": "Iain M Banks         "}
{"type": {"key": "\/type\/type"}, "id": 12177832, "key": "\/a\/OL3160648A", "name": "IAIN M.BANKS"}
</code></pre>
<p>In total the file contains 4,174,245 entries. First job is to get a more manageable set of data to work with. So, I wrote <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1/src/cli/keep1LineIn10.php" >a short script to extract 1 line in every 10 from a file</a>. The resulting <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1/data/authors.1in10.json" >sample author data file contains 417,424 entries</a>. This is more manageable for quick testing of what I&#8217;m doing.</p>
<p>So now we can start writing some code to produce some RDF. Given the size of these files, I need to stream the data in and out again in chunks. The easiest format I find for that is <a href="http://www.w3.org/2007/02/turtle/primer/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.w3.org/2007/02/turtle/primer/');">turtle</a> which has the added benefit of being human readable. YMMV. Previously I&#8217;ve streamed stuff out using <a href="http://www.w3.org/2001/sw/RDFCore/ntriples/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.w3.org/2001/sw/RDFCore/ntriples/');">n-triples</a>. That has some great benefits too, like being able to generate different parts of the graph, for the same subject, in different parts of the file then being them together using a simple command line sort. It&#8217;s also a great format for chunking the resulting data into reasonable size files as breaking on whole lines doesn&#8217;t break the graph, whereas with <a href="http://www.w3.org/TR/rdf-syntax-grammar/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.w3.org/TR/rdf-syntax-grammar/');">rdf/xml</a> and turtle it does.</p>
<p>So, I may end up dropping back to n-triples, but for now I&#8217;m going to use turtle.</p>
<p>I also like working on the command line and love the unix pipes model, so I&#8217;ll be writing the cli (command line) tools to read from STDIN and write to STDOUT so I can mess with the data using grep, sed, awk, sort, uniq and so on.</p>
<p>First things first, Let&#8217;s find out what&#8217;s really in the authors data. Reading the json line by line and converting each line into an associative array is simple in PHP, so let&#8217;s do that, <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1/src/cli/findArrayKeys.php" >keep track of all the keys we find in the arrays and recurse into the nested arrays to look at them</a> - then dump the result out. The arrays contain this set of keys:</p>
<pre>
alternate_names
alternate_names
alternate_names\1
alternate_names\2
alternate_names\3
bio
birth_date
comment
date
death_date
entity_type
fuller_name
id
key
location
name
numeration
personal_name
photograph
title
type
type\key
website
</pre>
<p>So, they have names, birth dates, death dates, alternate names and a few other bits and pieces. And they have a &#8216;key&#8217; which turns out to be the resource part of the OpenLibrary url. That&#8217;s means we can link back into OpenLibrary nice and easy. Going back to our previous Iain Banks examples, we want to create something like this for each one:</p>
<pre><code>
@prefix rdf: &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .
@prefix bio: &lt;http://vocab.org/bio/0.1/&gt; .
@prefix foaf: &lt;http://xmlns.com/foaf/0.1/&gt; .

&lt;http://example.com/a/OL32312A&gt;
	foaf:Name &quot;Banks, Iain&quot;;
	foaf:primaryTopicOf &lt;http://openlibrary.org/a/OL32312A&gt;;
	bio:event &lt;http://example.com/a/OL32312A#birth&gt;;
	a foaf:Person .

&lt;http://example.com/a/OL32312A#birth&gt;
	bio:date &quot;1954&quot;;
	a bio:Birth .
</code></pre>
<p>This gives us a foaf:Person for the author and tracks his birth date using a bio:Birth event. While tracking the birth as a separate entity may seem odd it gives the opportunity to say things about the birth itself. We&#8217;ll model death dates the same way, for the same reason. I&#8217;ve written some <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1/src/cli/authorsToTriples.php" >basic code to generate foaf from the OpenLibrary authors</a>.</p>
<p>Linking back to the OpenLibrary url has been done here using foaf:primaryTopicOf. I didn&#8217;t use owl:sameAs because the url at OpenLibrary is that of a web page, whereas the uri here (http://example.com/a/OL32312A) represents a person. Clearly a person is not the same as a web page that contains information about them.</p>
<p>The only thing worrying me is that the uris we&#8217;re using are constructed from OpenLibrary&#8217;s keys. This makes matching them up with other data sources hard. Matching with other data sources requires a natural key, but there&#8217;s not enough data in these author entries to create one. The best I can do is to create a natural key that will enable people to discover the group of authors that share a name.</p>
<pre><code>
@prefix mine: &lt;http://example.com/mine/schema#&gt; .
&lt;http://example.com/names/banksiain&gt;
	mine:name_of &lt;http://example.com/a/OL32312A&gt;;
	a mine:Name .
</code></pre>
<p>These uris will enable me to find authors that share the same name easily, either because they do share the same name or because they&#8217;re duplicates. The natural key is simply the author&#8217;s name with any casing, whitespace or punctuation stripped out. That might need to evolve as I start looking at the names in more detail later.</p>
<p>Next step is to look in more detail at the dates in here, we have some simple cases of trailing whitespace or trailing punctuation, but also some more interesting cases of approximate dates or possible ranges - these occur for historical authors mostly. The <a href="http://n2.talis.com/svn/playground/mmmmmrob/OpenLibrary/tags/day1/data/authors.unique_dates.txt" >complete list of distinct dates within the authors file</a> is in svn. If you know anything about dates, feel free to throw me some free advice on what to do with them&#8230;</p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/410380585" height="1" width="1"/>]]></content:encoded><description>I thought it was about time I got around to taking a better look at what might be possible with the OpenLibrary data.
My plan is to try and convert it into meaningful RDF and see what we can find out about things along the way. The project is an own-time project mostly, so progress isn&amp;#8217;t [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/92/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F92</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/92</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/89"><title>Alternative to CURL in Moriarty</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/368224809/89</link><dc:subject>Projects</dc:subject><dc:subject>http</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:creator>Ian Davis</dc:creator><dc:date>2008-08-18T11:27:00-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I just checked in <a href="http://code.google.com/p/moriarty/source/detail?r=6" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/moriarty/source/detail?r=6');">a small update to moriarty</a> that might solve a problem some people have experienced using curl. It appears that even though curl implemented support for HTTP digest way back in 2003 with version 7.10.6, it took several more releases to iron out the bugs. The version I develop with 7.18.0 (and the version installed on Talis application servers) works without issue, but many webhosts have much older versions. In fact my own webhost is still on 7.10.6 which means that digest authentication doesn&#8217;t work as expected. To date there has been no workaround. The latest change to <a href="http://n2.talis.com/wiki/Moriarty" >Moriarty</a> adds support for using <a href="http://www.phpclasses.org/browse/package/3.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.phpclasses.org/browse/package/3.html');">httpclient</a> written by Manuel Lemos. This is a complete HTTP client written in PHP. To use digest authentication you also need <a href="http://www.phpclasses.org/browse/package/1888.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.phpclasses.org/browse/package/1888.html');">sasl</a> which is also written by Manuel Lemos. Moriarty looks for those two classes and uses them if it finds them otherwise it falls back to using curl as before. </p>
<p>To use httpclient with Moriarty you just need to ensure that http_class and sasl_interact_class are loaded before using any HTTP actions. Adding lines like the following to your index.php (or somewhere similar) should do the trick:</p>
<pre><code>    require_once '/path/to/moriarty/lib/httpclient/http.php';

    require_once '/path/to/moriarty/lib/sasl/sasl.php';</code></pre>
<p><strong>About Moriarty&#8230;</strong> Moriarty is a simple PHP library for accessing the <a href="http://n2.talis.com/" >Talis Platform</a>. It follows the Platform API very closely and wraps up many common tasks into convenient classes while remaining very lightweight. It also provides some simple RDF classes that are based on the excellent <a href="http://arc.semsol.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://arc.semsol.org/');">ARC2</a> class library. Moriarty is primarily being developed by <a href="http://iandavis.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://iandavis.com/');">Ian Davis</a> and is in continual alpha, subject to occasional rapid bursts of change. You can read <a href="http://n2.talis.com/wiki/Moriarty" >more about Moriarty on the n&#178; wiki</a> or visit its <a href="http://code.google.com/p/moriarty/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/moriarty/');">Google Code project</a></p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/368224809" height="1" width="1"/>]]></content:encoded><description>I just checked in a small update to moriarty that might solve a problem some people have experienced using curl. It appears that even though curl implemented support for HTTP digest way back in 2003 with version 7.10.6, it took several more releases to iron out the bugs. The version I develop with 7.18.0 (and [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/89/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F89</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/89</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/86"><title>Moriarty Now Hosted on Google Code</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/368201352/86</link><dc:subject>Projects</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:creator>Ian Davis</dc:creator><dc:date>2008-08-18T10:55:49-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>A couple of weeks ago I moved Moriarty from my playground area of the n² SVN repository to <a href="http://code.google.com/p/moriarty/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/moriarty/');">a new project at google code</a>. This brings the advantage of neat issue tracking and code review capabilities as well as better management of contributors and collaborators. The new SVN repository is now <a href="http://moriarty.googlecode.com/svn/trunk/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://moriarty.googlecode.com/svn/trunk/');">http://moriarty.googlecode.com/svn/trunk/</a> (with an <a href="http://code.google.com/p/moriarty/source/browse/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/moriarty/source/browse/');">interactive view</a> too). Just email me {at} iandavis.com if you&#8217;d like to be added to the project.</p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/368201352" height="1" width="1"/>]]></content:encoded><description>A couple of weeks ago I moved Moriarty from my playground area of the n² SVN repository to a new project at google code. This brings the advantage of neat issue tracking and code review capabilities as well as better management of contributors and collaborators. The new SVN repository is now http://moriarty.googlecode.com/svn/trunk/ (with an interactive [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/86/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F86</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/86</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/77"><title>Batch Changesets ARC Plugin</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/316381639/77</link><dc:subject>Tutorials</dc:subject><dc:subject>ARC2</dc:subject><dc:subject>changesets</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:subject>platform</dc:subject><dc:creator>kwijibo</dc:creator><dc:date>2008-06-20T13:15:04-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Platform Release 12 included a very useful new feature: the ability to send more than one changeset in a single POST to your store.</p>
<p>To generate a batch changeset from 2 versions of an RDF graph, you can use an ARC plugin called <a href="http://n2.talis.com/svn/playground/kwijibo/PHP/arc/plugins/trunk/talis/Talis_ChangeSetBuilderPlugin.php" >Talis_ChangeSetBuilderPlugin</a>.</p>
<p>To use it:</p>
<pre>
<code>
	  $args = array(
			'before' =&gt; $before, //can be rdf/xml, turtle, or an ARC simpleIndex array
			'after' =&gt; $after,  //can be rdf/xml, turtle, or an ARC simpleIndex array
		);
		$cs = ARC2::getComponent('Talis_ChangeSetBuilderPlugin', $args);
		$cs_response = $store-&gt;get_metabox()-&gt;apply_versioned_changeset($cs); 

</code></pre>
<p>The plugin also relies upon the <a href="http://n2.talis.com/svn/playground/kwijibo/PHP/arc/plugins/trunk/ARC2_IndexUtilsPlugin.php" >IndexUtils Plugin</a>. The easiest way to get them all set up is to change to your arc directory and do:</p>
<p><kbd><br />
svn co http://n2.talis.com/svn/playground/kwijibo/PHP/arc/plugins/trunk/ plugins<br />
</kbd></p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/316381639" height="1" width="1"/>]]></content:encoded><description>Platform Release 12 included a very useful new feature: the ability to send more than one changeset in a single POST to your store.
To generate a batch changeset from 2 versions of an RDF graph, you can use an ARC plugin called Talis_ChangeSetBuilderPlugin.
To use it:


	  $args = array(
			'before' =&amp;#62; $before, //can be rdf/xml, turtle, [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/77/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F77</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/77</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/74"><title>Rollbacks in Moriarty</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/316360048/74</link><dc:subject>Tips and Tricks</dc:subject><dc:subject>Tutorials</dc:subject><dc:subject>changesets</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:subject>rollbacks</dc:subject><dc:creator>kwijibo</dc:creator><dc:date>2008-06-20T12:45:47-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Editing resources in the metabox of Talis Platform stores  is  done with <a href="http://n2.talis.com/mediawiki/index.php?title=ChangeSets" >Changesets</a>. If you choose to use the <em>versioned changesets</em> API, your changesets will be stored as data in the metabox as well.</p>
<p>The great practical benefit of doing this is you can then reverse previous ChangeSets to return a resource to its previous state. You can read about one <a href="http://n2.talis.com/wiki/Rolling_Back_Changesets" >way to reverse changesets on the wiki</a>. You can also now create <em>rollback</em> changesets from Moriarty  with the new <a href="http://n2.talis.com/svn/playground/iand/moriarty/trunk/rollback.class.php" >Rollback class</a>.</p>
<p>To use it:</p>
<pre><code>
define('MORIARTY_ARC_DIR', 'arc/');
require 'moriarty/store.class.php';
require 'moriarty/rollback.class.php';  

//create a store object
$store = new Store('http://api.talis.com/stores/my_store');  

//Instantiate the Rollback class with a sparql service object:
$sparql = $store-&gt;get_sparql_service();
$rollback = new Rollback($sparql);  

//Call the to_changeset method, with a changeset's uri as the argument
$HTTP_Response = $rollback-&gt;to_changeset('http://api.talis.com/stores/my_store/items/1200302910905#self');  

// the body of the response is the changeset you need to revert back to the
// state of the resource before the changeset that you have given the URI of  

if($HTTP_Response-&gt;is_success()){  

//submit changeset  

	$rollbackResponse =  $store-&gt;apply_versioned_changeset($HTTP_Response-&gt;body);  

	if($rollbackResponse-&gt;is_success()){
		//relax!
	}else{
		// throw an error
	}  

}  

</code></pre>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/316360048" height="1" width="1"/>]]></content:encoded><description>Editing resources in the metabox of Talis Platform stores  is  done with Changesets. If you choose to use the versioned changesets API, your changesets will be stored as data in the metabox as well.
The great practical benefit of doing this is you can then reverse previous ChangeSets to return a resource to its [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/74/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F74</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/74</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/71"><title>Streaming Parsing of RDF/XML with ARC2</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/316161238/71</link><dc:subject>Tips and Tricks</dc:subject><dc:subject>Tutorials</dc:subject><dc:subject>ARC2</dc:subject><dc:subject>code</dc:subject><dc:subject>parsing</dc:subject><dc:subject>php</dc:subject><dc:subject>rdf/xml</dc:subject><dc:subject>streaming</dc:subject><dc:creator>kwijibo</dc:creator><dc:date>2008-06-20T06:51:23-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>A common trouble when parsing RDF is running out of memory because the document is too large. ARC2 solves this problem (for RDF/XML) by being able to stream it.</p>
<p>If you want to take advantage of the streaming, you just need to extend the ARC2_RDFXMLParser  class and overwrite the addT method:</p>
<pre>
&lt;?php
require 'arc/ARC2.php';
require 'arc/parsers/ARC2_RDFXMLParser.php'; 

class Streamer extends ARC2_RDFXMLParser { 

	function addT($s, $p, $o, $s_type, $o_type, $o_dt = '', $o_lang = ''){
		var_dump($s, $p, $o, $s_type, $o_type, $o_dt, $o_lang);
	} 

} 

$p = new Streamer(); 

$p-&gt;parse('big-data.rdf'); 

?&gt;</pre>
<p>In this simple example, I&#8217;m just <code>var_dump</code>ing out the triples as they come in, but of course you should do whatever it is you want to do instead to the triple in that method.</p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/316161238" height="1" width="1"/>]]></content:encoded><description>A common trouble when parsing RDF is running out of memory because the document is too large. ARC2 solves this problem (for RDF/XML) by being able to stream it.
If you want to take advantage of the streaming, you just need to extend the ARC2_RDFXMLParser  class and overwrite the addT method:

&amp;#60;?php
require 'arc/ARC2.php';
require 'arc/parsers/ARC2_RDFXMLParser.php'; 

class Streamer [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/71/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F71</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/71</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/68"><title>Moriarty Update</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/316110511/68</link><dc:subject>Projects</dc:subject><dc:subject>caching</dc:subject><dc:subject>describe</dc:subject><dc:subject>moriarty</dc:subject><dc:subject>php</dc:subject><dc:creator>Ian Davis</dc:creator><dc:date>2008-06-20T05:12:25-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>After a short break, it&#8217;s time for an update to Moriarty. Actually the changes in this version have been under development for several weeks but I wasn&#8217;t able to release them until Platform release 13 went live at the beginning of this week. There is one organisational change and functional changes, one of which is a major addition. The notes in this blog post relate to revision 679 in <a href="http://n2.talis.com/svn/playground/iand/moriarty/trunk/" >Moriarty&#8217;s subversion project</a></p>
<p>Firstly <strong>constants.inc.php has been deprecated in favour of moriarty.inc.php</strong> which has less of a potential name clash. constants.inc.php is now just a shell that includes moriarty.inc.php so no code should break. However you should update your applications to include moriarty.inc.php because in some future release I shall be removing constants.inc.php entirely.</p>
<p>This renaming is in preparation for a wider breaking change that I would like to make. Because PHP has traditionally had no namespacing capability the community has adopted library naming conventions to avoid name conflicts. For example, classes in Konstruct are prefixed with k_ (like k_Document) and classes in ARC are prefixed with ARC_ (e.g. ARC2_RDFXMLParser). Moriarty doesn&#8217;t do this which leads to a higher chance of naming clashes with client code. The right thing to do in a future release is to rename all the classes. So instead of Store we might have MORIARTY_Store or M_Store. I&#8217;d like some feedback on what you prefer so please do comment on this post.</p>
<p>It&#8217;s worth remembering that moriarty.inc.php defines the MORIARTY_DIR constant, setting it to be the directory in which moriarty.inc.php lives (this isn&#8217;t new, constants.inc.php used to do this). The preferred way of including Moriarty classes is like this:
<pre><code>require_once '/path/to/moriarty.inc.php';
require_once MORIARTY_DIR . 'store.class.php';</code></pre>
<p>The major piece of new functionality in Moriarty is <strong>HTTP caching support</strong>. The Platform supports etags and other related caching headers in many places and for a long time I&#8217;ve wanted Moriarty to automatically take advantage of these. I added this support over a period of several weeks, refining it and tuning it so that it could work with the minimum of effort on the client developer&#8217;s part. Enabling caching in Moriarty is very simple. Just define a constant called MORIARTY_HTTP_CACHE_DIR and set it to be a valid, writable directory. Moriarty will then start using that directory to cache responses from HTTP requests. For example, add something like this at the main entry point of your code:</p>
<pre><code>define('MORIARTY_HTTP_CACHE_DIR', '/var/cache');</code></pre>
<p>Moriarty uses cached etag headers to intercept standard GET requests and turn them automatically into conditional ones. Although it still requires a network transaction, the amount of bandwidth used for a cache hit is very small. This kind of caching is smart. Dumb caching just keeps content for a pre-determined time period and only requests a fresh version when the time period has expired. That means it won&#8217;t be aware of any changes in the source until minutes or hours later. This may work well for content that doesn&#8217;t change often but causes extreme difficulties for interactive applications that involve updating as well as reading content. Many Platform-based applications use a simple pattern of fetching a current resource description, diffing it with the one entered by a user and generating a changeset to apply to the store. Dumb caching interferes with this by not fetching the true state of the resource description, and to fix it requires close coordination between user-supplied updates and cache invalidation. Conditional GETs avoid this by revalidating the cached content with the source on every request. The result is a slight trade off in performance for better consistency.</p>
<p>If you&#8217;re confident that you only need dumb caching then you can switch it on by defining the MORIARTY_HTTP_CACHE_READ_ONLY constant somewhere in your application. Moriarty doesn&#8217;t care about the value of this constant, just whether it is defined or not. When this constant is defined Moriarty will use the max-age headers in HTTP responses to determine how long retrieved content should be considered to be fresh for. It intercepts HTTP requests to the Platform and if it finds a fresh cache entry then it will immediately return that without making any network request. If the cache entry is stale then the request proceeds as normal and the entry gets updated with the newly retrieved content. Use this constant when your application is predominantly read-only and you don&#8217;t care if content is stale for a few hours.</p>
<p>Moriarty supports one other caching related constant: MORIARTY_HTTP_CACHE_USE_STALE_ON_FAILURE. Define this constant if you want Moriarty to return a cache entry when it can&#8217;t communicate with the Platform. This enables your application to continue runng even if there are network problems, a tradeoff of apparent liveness against freshness of content. (I use this constant in my application when I&#8217;m developing offline on the train. While I&#8217;m on the network I hit a few pages to freshen up the cache and then when I disconnect I can still browse and test the application using cached content.)</p>
<p>One caveat you need to be aware of: the cache files are not encrypted. Avoid using Moriarty&#8217;s caching support if you are dealing with private or secure information that you don&#8217;t want to be stored unencrypted on a web server file system. I might provide this capability if there is demand.</p>
<p>Finally, this version of Moriarty includes support for the new <strong>describe service</strong>. This was included as part of <a href="http://n2.talis.com/wiki/Platform_Release_13_Notes" >release 13</a> of the Platform and is now the preferred way of obtaining resource descriptions from the metabox or a private graph. See the section labeled &#8220;GET&#8221; in the <a href="http://n2.talis.com/wiki/Metabox" >Metabox</a> documentation. You can use it in Moriarty like this:</p>
<pre><code>$store = new Store('http://api.talis.com/stores/mystore');
$mb = $store-&gt;get_metabox();
$response = $mb-&gt;describe('http://example.com/foo');</code></pre>
<p>The best thing is that the new describe service supports etags for resource descriptions, which means that Moriarty&#8217;s new caching functions can really speed up applications that use describe heavily (and if you&#8217;re building open world applications, then you should be). The Platform&#8217;s SPARQL services don&#8217;t currently support etags, so caching is less efficient. To support efficient HTTP caching we&#8217;d need to determine whether the resultset has changed since the last time the client issued the query. The only way to do that in SPARQL is by executing the query which could be very cheap or it could be horrendously expensive. The describe service packages up a very common use of SPARQL into a constrained service that is very easy to relate to changes in the underlying graph. That means we can really optimise this service, provide decent caching support and generally boost performance a lot more easily than we can for arbitrary SPARQL queries. Expect us to expand on the describe service in future releases and also to bite off a few other constrained derivatives of SPARQL.</p>
<p><strong>About Moriarty&#8230;</strong> Moriarty is a simple PHP library for accessing the <a href="http://n2.talis.com/" >Talis Platform</a>. It follows the Platform API very closely and wraps up many common tasks into convenient classes while remaining very lightweight. It also provides some simple RDF classes that are based on the excellent <a href="http://arc.semsol.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://arc.semsol.org/');">ARC2</a> class library. Moriarty is primarily being developed by <a href="http://iandavis.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://iandavis.com/');">Ian Davis</a> and is in continual alpha, subject to occasional rapid bursts of change. You can read <a href="http://n2.talis.com/wiki/Moriarty" >more about Moriarty on the n&#178; wiki</a> and get its source from the <a href="http://n2.talis.com/svn/playground/iand/moriarty/trunk/" >n&#178; subversion repository</a></p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/316110511" height="1" width="1"/>]]></content:encoded><description>After a short break, it&amp;#8217;s time for an update to Moriarty. Actually the changes in this version have been under development for several weeks but I wasn&amp;#8217;t able to release them until Platform release 13 went live at the beginning of this week. There is one organisational change and functional changes, one of which is [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/68/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F68</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/68</feedburner:origLink></item><item rdf:about="http://blogs.talis.com/n2/archives/67"><title>European Semantic Web Conference 2008 @ Tenerife</title><link>http://feeds.feedburner.com/~r/talis/n2/~3/309774860/67</link><dc:subject>Events</dc:subject><dc:subject>conference</dc:subject><dc:subject>eswc</dc:subject><dc:subject>eswc2008</dc:subject><dc:creator>kwijibo</dc:creator><dc:date>2008-06-11T11:52:05-05:00</dc:date><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Last week <a href="http://my.opera.com/tomheath/blog/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://my.opera.com/tomheath/blog/');">Tom</a> and I were in Tenerife for the <a href="http://www.eswc2008.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.eswc2008.org/');">European Semantic Web Conference</a>, where he was chairing a session, and I was presenting a <a href="http://www.semanticscripting.org/SFSW2008/papers/16.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.semanticscripting.org/SFSW2008/papers/16.pdf');">short paper on RDF/JSON</a>, both at the <a href="http://www.semanticscripting.org/SFSW2008/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.semanticscripting.org/SFSW2008/');">Semantic Scripting Workshop</a>.</p>
<h3>Scripting Workshop</h3>
<p>The scripting workshop itself was excellent - I enjoyed all of the others&#8217; papers a lot, and look forward to playing with the code, ideas, and applications they presented.</p>
<p>The paper just before me was about using RDFa and javascript to allow in-page editing of resources. One particularly nice thing about it was that they implemented our RDF/JSON specification in their API (cheers guys! <img src='http://blogs.talis.com/n2/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>The scripting challenge was won by the highly deserving but sadly absent <a href="http://bnode.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bnode.org');">Benjamin Nowack</a> with <a href="http://semsol.org/semcamp/sparqlbot" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://semsol.org/semcamp/sparqlbot');">SPARQLBot</a> - his IRC bot that can read and answer questions from RDF data sources. The second prize was won by Alexandre Passant and co for their <a href="http://smob.sioc-project.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://smob.sioc-project.org/');">Semantic Microblogging</a> system, which looks very interesting indeed.</p>
<h3>SPARQL</h3>
<p>There were quite a few interesting papers on SPARQL - extending it in various ways, or extending SPARQL into other technologies. There were two papers on using SPARQL to bridge the XML and RDF divide: one  on embedding SPARQL in XSLT extension functions (&#8217;enabling the developer to combine XSLT and RDF in a way that doesn&#8217;t suck&#8217;) ; another on combining XQuery and SPARQL.</p>
<p>One paper I thought was especially interesting was about  extending SPARQL to work on  streams of data.</p>
<p>The best paper award was on SPARQL, and won by  Christoph Kiefer, Abraham Bernstein, and André Locher for &#8220;Adding Data Mining Support to SPARQL via Statistical Relational Learning Methods&#8221;.</p>
<h3>Vocabularies and Ontologies</h3>
<p><a href="http://www.flickr.com/photos/gromgull/2565007469/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.flickr.com/photos/gromgull/2565007469/');"><img src="http://farm4.static.flickr.com/3002/2565007469_7fb6dc0df0.jpg?v=0" /></a></p>
<p><a href="http://richard.cyganiak.de" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://richard.cyganiak.de');">Richard Cyganiak</a> presented Neologism - an open source drupal-based web application for creating and publishing vocabularies. What is great about this application is not its features, but its philosophy. While desktop applications like <a href="http://protege.stanford.edu/overview/protege-owl.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://protege.stanford.edu/overview/protege-owl.html');">Protégé</a> may provide lots of features for designing, creating and reasoning with ontologies, they don&#8217;t help with the publishing of them - which can be a rather tricky issue. The idea behind Neologism is to make it easy for vocabulary authors to do the right thing, and author and publish their vocabularies according to best practice - an aim I really applaud.</p>
<p>I also attended a <a href="http://wiki.loa-cnr.it/index.php/LoaWiki:ESWC2008Tutorial" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://wiki.loa-cnr.it/index.php/LoaWiki:ESWC2008Tutorial');">tutorial on developing ontologies with the use of patterns</a> - starting by reusing some basic modeling patterns, which could be used as a mold and later discarded when the design was complete. The tutorial incorporated this into an XP system of development, involving test-driven ontology design - which I thought was an interesting idea.</p>
<h3>voiD</h3>
<p><a href="http://www.flickr.com/photos/dunken69/2569034018/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.flickr.com/photos/dunken69/2569034018/');"><img src="http://farm4.static.flickr.com/3069/2569034018_d1639cefb7.jpg?v=0" alt="Michael Hausenblas presenting voiD" /></a></p>
<p>One thing from the conference I particularly enjoyed was Michael Hausenblas, Richard Cyganiak, Jun Zhao, and I developing Michael&#8217;s idea of <a href="http://community.linkeddata.org/MediaWiki/index.php?MetaLOD" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://community.linkeddata.org/MediaWiki/index.php?MetaLOD');">metaLOD</a> into a vocabulary for describing datasets like those in Richard&#8217;s famous LOD diagram (see the slide in the photo above).</p>
<p>The idea was to come up with a light-weight vocabulary that would enable RDF descriptions of interlinked datasets; these descriptions (and so the various access points to the datasets) can be made discoverable via the <a href="http://sw.deri.org/2007/07/sitemapextension/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://sw.deri.org/2007/07/sitemapextension/');">Semantic Sitemaps extension</a>, and aggregated via services like <a href="http://sindice.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://sindice.com');">Sindice</a>. I have a practical interest in this as well, since with the Platform (and our work on the <a href="http://www.opendatacommons.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.opendatacommons.org/');">Open Data License</a>), we want to enable people to publish lots of datasets on the web. We already have lots of interesting datasets in the platform (which I have been doing some work on describing in the silkworm-dev store), and we are really keen to make our publicly available datasets discoverable by machines <em>and</em> humans, and available for reuse.</p>
<p>We spent about an hour discussing the weighty issues of scope, vocabulary reuse, and ontology modeling patterns - then at least a further hour trying to come up with a suitable acronym. Finally <a href="http://gridinoc.name/b.noise/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://gridinoc.name/b.noise/');">Laurian</a> advised us not to think of an acronym, but of a cool-sounding word that encapsulated what the vocabulary would give to the world. So we came up with voiD: a Vocabulary Of Interlinked Datasets.</p>
<p>(see also Orri&#8217;s <a href="http://www.openlinksw.com/weblog/oerling/?id=1377" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.openlinksw.com/weblog/oerling/?id=1377');">&#8220;VOID, Or will the LOD Cloud Bring Rain&#8221;</a>)</p>
<h3>Semantic Games</h3>
<p><a href="http://www.flickr.com/photos/gromgull/2565009853/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.flickr.com/photos/gromgull/2565009853/');"><img src="http://farm4.static.flickr.com/3276/2565009853_a52d0dca08.jpg?v=0" /></a></p>
<p>I saw two papers on games and the semantic web at ESWC. The first was <a href="http://kantenwerk.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://kantenwerk.org/');">Knud Möller</a>&#8217;s highly entertaining talk on  <a href="http://www.semanticscripting.org/SFSW2008/papers/9.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.semanticscripting.org/SFSW2008/papers/9.pdf');">World of WebCraft - Mashing up World of Warcraft and the Web</a> at the <a href="http://www.semanticscripting.org/SFSW2008/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.semanticscripting.org/SFSW2008/');">Semantic Scripting Workshop</a>; where he showed how he gleaned semantics from the game by scripting addons, mashing it up with data from <a href="http://dbpedia.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://dbpedia.org');">dbpedia</a>, and screenshots from <a href="http:/flickr.com">flickr</a>.</p>
<p><a href="http://www.flickr.com/photos/leobard/2580841225/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.flickr.com/photos/leobard/2580841225/');"><img alt="OntoGame presentation" src="http://farm4.static.flickr.com/3001/2580841225_92157cf997_m.jpg" /></a><br />
The second was <a href="http://www.katharinasiorpaes.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.katharinasiorpaes.net/');">Katharina Siorpaes</a>&#8216; presentation of her work on <a href="http://www.ontogame.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.ontogame.org/');">OntoGame</a>, an application of Luis von Ahn&#8217;s <a href="http://gwap.com/gwap/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://gwap.com/gwap/');">Games With a Purpose</a> concept to using online multiplayer games for getting people to perform what might otherwise be rather dull tasks in ontology creation and alignment, and data annotation. The idea centers around using blind collaborative game-play to achieve consensus and accuracy on what is common knowledge to humans, yet opaque to machines. I wondered if such game-play would be compelling to mainstream users, but according to the paper&#8217;s authors, the social aspect of these games can provide plenty of interest and incentive to keep playing. It&#8217;s a thought-provoking concept anyway, and it will be interesting to see what develops in this area, and in which niches these techniques will work best.</p>
<h3>Demos + Posters</h3>
<p>The demos were really good. From asking the other attendees, I think the favourites were <a href="http://semanticweb.org/wiki/QuiKey" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://semanticweb.org/wiki/QuiKey');">QuiKey</a>, a Quiksilver-like interface for entering and searching through triples (which won best poster); <a href="http://code.google.com/p/xoperator/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://code.google.com/p/xoperator/');">xOperator</a> (a really intriguing combination of jabber, SPARQL, and Agents to bring you trusted answers to questions via Instant Messaging);  OntoGame (described above); and <a href="http://www.eswc2008.org/demos/demo15.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.eswc2008.org/demos/demo15.pdf');">Konduit</a>, a Semantic Pipes-like application for visual programming for the Semantic Desktop  (which made me reconsider my position in an irc discussion with <a href="http://iandavis.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://iandavis.com');">iand</a> about whether to describe application flow in code or data; it also won best demo).</p>
<h3>Lightning Talks</h3>
<p>The lightning talks, were, as ever a popular and light-hearted, yet thought-provoking event. The format was a tight 2 minutes, 1 slide, which was strictly adhered to: Andraž Tori of <a href="http://zemanta.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://zemanta.com');">Zemanta</a> gave a very good presentation that was roundly and deservedly booed when he tried to slip in 3 slides. At first I thought 1 slide would be a bit limited, but it was actually pretty good - giving each speaker a chance to present only one single idea at a time. All the talks were entertaining, but some that stood out for me were:</p>
<ul>
<li>Jenny Green from the Ordnance Survey explaining that, in one database, they currently held enough data to overwhelm any triple-store in existence, and would need a large server-farm to store and serve it all.<a href="http://www.flickr.com/photos/dunken69/2569034374/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.flickr.com/photos/dunken69/2569034374/');"><img src="http://farm4.static.flickr.com/3280/2569034374_4e1ef9e70c.jpg?v=0" /></a></li>
<li> 		Laurian Gridinoc advocating the use of RDFa<br />
<a href="http://www.flickr.com/photos/dunken69/2568208035/"><br />
<img alt="Laurian" /><br />
</a></li>
<li> 		Andrew Green explaining How He Learned to Relax and Love the Bnodes: use them when you only need a &#8216;glue&#8217; node that isn&#8217;t a &#8216;thing&#8217; in its own right, and doesn&#8217;t deserve an identifier (I&#8217;m still not convinced: bnodes, bah!).<br />
<a href="/photos/dunken69/2569033084/" title="ESWC2008 Lightning Talks - Dr. Strange Semantic Unit"><img src="http://farm4.static.flickr.com/3072/2569033084_805250eb8a_m.jpg" onclick="javascript:pageTracker._trackPageview('/outbound/article//photos/dunken69/2569033084/" title="ESWC2008 Lightning Talks - Dr. Strange Semantic Unit"><img src="http://farm4.static.flickr.com/3072/2569033084_805250eb8a_m.jpg');" alt="ESWC2008 Lightning Talks - Dr. Strange Semantic Unit" width="240" height="180" /></a></li>
</ul>
<p>The only great pity was that the lightning talks were run in parallel with  other tracks, so I missed out on the start of the Applications track. Next year, hopefully they will run the lightning talks separately from the rest, and record them for posterity (the other talks had video-cameras in attendance).</p>
<h3>Industry</h3>
<p>ESWC is a pretty academic conference, but it was really interesting to meet people from other companies making great use of semantic technologies to their competitive advantage, like <a href="http://prokarriere.at" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://prokarriere.at');">ProKarriere</a>, an Austrian online recruitment service that uses tools like <a href="http://simile.mit.edu/wiki/Crowbar" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://simile.mit.edu/wiki/Crowbar');">Crowbar</a> and <a href="http://simile.mit.edu/wiki/Solvent" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://simile.mit.edu/wiki/Solvent');">Solvent</a> to scrape semantics from partner web-sites, together with Natural Language Processing, and ontologies they have developed, to intelligently match graduates up with appropriate vacancies. Or like <a href="http://www.netseven.it/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.netseven.it/');">Net7</a>, who have built <a href="http://trac.talia.discovery-project.eu/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://trac.talia.discovery-project.eu/');">Talia</a>, a semantically backed digital library for Philosophy Scholars (described in their <a href="http://www.semanticscripting.org/SFSW2008/papers/4.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.semanticscripting.org/SFSW2008/papers/4.pdf');">Scripting Workshop paper</a>). Or like <a href="http://www.garlik.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.garlik.com/');">Garlik</a>, who had a whole keynote about them.</p>
<h3>Interdisciplinary</h3>
<p>A theme that appealed to me was using semantic technologies outside of Computer Science departments to aid scholars in other fields - there was quite strong  presence from Finland  with their work in the cultural heritage sector, visualising time and space. I also really enjoyed seeing Jun Zhao&#8217;s presentation about using off-the-shelf semantic software like <a href="http://simile.mit.edu/wiki/Exhibit" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://simile.mit.edu/wiki/Exhibit');">Exhibit</a> to help zoologists navigate a repository of research images, the Net7 guy&#8217;s demonstration of their Digital Philosophy library Talia, and hearing about Norman Gray&#8217;s work using  RDF with astronomers.</p>
<p>While the quality of the presentations  was really high, the best bits, as usual, were the socializing and informal discussions in between, meeting names I&#8217;d long been familiar with from the various semweb mailing lists, blogs and irc channels (#swig, #swhack, #sioc etc), and new people besides.</p>
<h3>SWIG-Scotland</h3>
<p>It was also nice to meet a few other people living in Scotland doing semweb stuff - there doesn&#8217;t seem to be that many of us. So I set up http://groups.google.com/group/swig-scotland in the hope that we can all arrange to meet up some time and talk triples (please join if it&#8217;s of any interest).</p>
<p>Looking over my copy of the proceedings, I realise that there&#8217;s so much stuff I didn&#8217;t see that I would have liked to (the tragedy of parallel sessions), and so much stuff I did see that I haven&#8217;t done justice to here - all the Nepomuk semantic desktop stuff for instance, or DERI&#8217;s research into sensors connected to the web, or the Vapour tool for testing HTTP conneg, or &#8230; but I have to stop now :). Suffice to say, it was great, and I&#8217;ve got a lot to think about and try out over the coming weeks.</p>
<img src="http://feeds.feedburner.com/~r/talis/n2/~4/309774860" height="1" width="1"/>]]></content:encoded><description>Last week Tom and I were in Tenerife for the European Semantic Web Conference, where he was chairing a session, and I was presenting a short paper on RDF/JSON, both at the Semantic Scripting Workshop.
Scripting Workshop
The scripting workshop itself was excellent - I enjoyed all of the others&amp;#8217; papers a lot, and look forward to [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.talis.com/n2/archives/67/feed</wfw:commentRss><feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=talis/n2&amp;itemurl=http%3A%2F%2Fblogs.talis.com%2Fn2%2Farchives%2F67</feedburner:awareness><feedburner:origLink>http://blogs.talis.com/n2/archives/67</feedburner:origLink></item></rdf:RDF>
