<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Representing Time in RDF Part 5</title>
	<atom:link href="http://blog.iandavis.com/2009/08/time-in-rdf-5/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.iandavis.com/2009/08/time-in-rdf-5</link>
	<description>blog.iandavis.com</description>
	<lastBuildDate>Tue, 23 Mar 2010 13:32:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Tom Passin</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1452</link>
		<dc:creator>Tom Passin</dc:creator>
		<pubDate>Thu, 13 Aug 2009 02:09:03 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1452</guid>
		<description>Ian, have you looked at John Sowa&#039;s approach to how to represent time, both points and intervals?  Of course, he uses conceptual graphs, but the ideas ought to translate to RDF.  One thing he does is to construct &quot;situations&quot;, which are probably similar to your context nodes, I imagine.

Worth looking at if you haven&#039;t already.</description>
		<content:encoded><![CDATA[<p>Ian, have you looked at John Sowa&#8217;s approach to how to represent time, both points and intervals?  Of course, he uses conceptual graphs, but the ideas ought to translate to RDF.  One thing he does is to construct &#8220;situations&#8221;, which are probably similar to your context nodes, I imagine.</p>
<p>Worth looking at if you haven&#8217;t already.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: glenn mcdonald</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1447</link>
		<dc:creator>glenn mcdonald</dc:creator>
		<pubDate>Tue, 11 Aug 2009 03:17:12 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1447</guid>
		<description>Oh, the names of properties are a feature of the data, not the query language. If your domain models albums has having ReleaseDates, which in turn have a year and a country, then you could find all the artists who had albums that were released anywhere in 1984 like this:

Artist:(.Album.ReleaseDate.Year:=1984)

or, because all the relationships go both ways, you could find out the same thing in any of these ways:

Album:(.ReleaseDate.Year:=1984).Artist
ReleaseDate:(.Year:=1984).Album.Artist
Year:=1984.ReleaseDate.Album.Artist

But if you wanted to find only artists who had albums that were released in the US in 1984, you&#039;d instead do one of these:

Artist:(.Album.ReleaseDate:(.Country:=USA):(.Year:=1984))
Album:(.ReleaseDate:(.Country:=USA):(.Year:=1984)).Artist
ReleaseDate:(.Country:=USA):(.Year:=1984).Album.Artist
Year:=1984.ReleaseDate:(.Country:=USA).Album.Artist
Country:=USA.ReleaseDate:(.Year:=1984).Album.Artist


As for finding the right Nirvana, that&#039;s also a data issue, not a query-language issue. You can refer to things by ID in Thread, too, so &quot;@nirvana_us&quot; is a complete Thread query to find the node with that known ID. Or you could find them by whatever other criteria you&#039;d use in any other system, like:

Artist:=Nirvana:(.Member:@cobain_kurt)
Artist:=Nirvana:(.Album:=Nevermind)</description>
		<content:encoded><![CDATA[<p>Oh, the names of properties are a feature of the data, not the query language. If your domain models albums has having ReleaseDates, which in turn have a year and a country, then you could find all the artists who had albums that were released anywhere in 1984 like this:</p>
<p>Artist:(.Album.ReleaseDate.Year:=1984)</p>
<p>or, because all the relationships go both ways, you could find out the same thing in any of these ways:</p>
<p>Album:(.ReleaseDate.Year:=1984).Artist<br />
ReleaseDate:(.Year:=1984).Album.Artist<br />
Year:=1984.ReleaseDate.Album.Artist</p>
<p>But if you wanted to find only artists who had albums that were released in the US in 1984, you&#8217;d instead do one of these:</p>
<p>Artist:(.Album.ReleaseDate:(.Country:=USA):(.Year:=1984))<br />
Album:(.ReleaseDate:(.Country:=USA):(.Year:=1984)).Artist<br />
ReleaseDate:(.Country:=USA):(.Year:=1984).Album.Artist<br />
Year:=1984.ReleaseDate:(.Country:=USA).Album.Artist<br />
Country:=USA.ReleaseDate:(.Year:=1984).Album.Artist</p>
<p>As for finding the right Nirvana, that&#8217;s also a data issue, not a query-language issue. You can refer to things by ID in Thread, too, so &#8220;@nirvana_us&#8221; is a complete Thread query to find the node with that known ID. Or you could find them by whatever other criteria you&#8217;d use in any other system, like:</p>
<p>Artist:=Nirvana:(.Member:@cobain_kurt)<br />
Artist:=Nirvana:(.Album:=Nevermind)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ian Davis</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1446</link>
		<dc:creator>Ian Davis</dc:creator>
		<pubDate>Tue, 11 Aug 2009 01:27:30 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1446</guid>
		<description>Glenn, I suspect the hardest part of fitting your language to RDF will be the mapping between properties and classes and your short names for them. Your examples seem very simple even for a restricted domain language. When you refer to &quot;Year&quot; which  do you mean? The year copyright was assigned, the year the album was first published, one of the years of re-issue, year of issue in USA, UK or Japan etc?

Also how will you deal with ambiguity such as detecting which group called Nirvana was intended in an Artist query? Artist names don&#039;t generally have a normalised form and if your database doesn&#039;t contain the year of formation or home country then it&#039;s going to give some strange results.

The traversal parts etc seem pretty trivial to overlay on a triple store. I recently implemented the Fresnel Selector Language in PHP which has some similarities (see http://www.w3.org/2005/04/fresnel-info/fsl/ and http://code.google.com/p/moriarty/source/browse/trunk/graphpath.class.php )</description>
		<content:encoded><![CDATA[<p>Glenn, I suspect the hardest part of fitting your language to RDF will be the mapping between properties and classes and your short names for them. Your examples seem very simple even for a restricted domain language. When you refer to &#8220;Year&#8221; which  do you mean? The year copyright was assigned, the year the album was first published, one of the years of re-issue, year of issue in USA, UK or Japan etc?</p>
<p>Also how will you deal with ambiguity such as detecting which group called Nirvana was intended in an Artist query? Artist names don&#8217;t generally have a normalised form and if your database doesn&#8217;t contain the year of formation or home country then it&#8217;s going to give some strange results.</p>
<p>The traversal parts etc seem pretty trivial to overlay on a triple store. I recently implemented the Fresnel Selector Language in PHP which has some similarities (see <a href="http://www.w3.org/2005/04/fresnel-info/fsl/" rel="nofollow">http://www.w3.org/2005/04/fresnel-info/fsl/</a> and <a href="http://code.google.com/p/moriarty/source/browse/trunk/graphpath.class.php" rel="nofollow">http://code.google.com/p/moriarty/source/browse/trunk/graphpath.class.php</a> )</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: glenn mcdonald</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1445</link>
		<dc:creator>glenn mcdonald</dc:creator>
		<pubDate>Mon, 10 Aug 2009 22:04:03 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1445</guid>
		<description>The language (it&#039;s called Thread) is basically already suited for RDF by its graph-model nature. There are three practical differences, at least, between the data-model over which Thread operates and that of &quot;raw RDF&quot;, but none of them are conceptually problematic:

1. Thread nodes &quot;have&quot; literals, whereas in RDF nodes are connected to literals by predicates. This allows a Thread query to say, for example, &quot;Year:=1984&quot;. But this could already be written out more explicitly as &quot;Year:(.Name:=1984)&quot;, so this point is just about brevity in queries, and could be solved by mapping some common &quot;name&quot;-ish predicates to the syntactic shorthand. Minor.

2. In Thread data all relationships are asserted and maintained in both directions. Thus you can ask &quot;Artist:(.Album.Year:=1984)&quot; to find out all the bands who put out albums in 1984, and you don&#039;t have to worry about whether the relationship from Black Sabbath to Sabotage was explicitly asserted as &quot;black_sabbath album sabotage .&quot; or &quot;sabotage artist black_sabbath .&quot;. So you need to get those inverses all either asserted or inferred, either at data-modification-time or query-time, to make sure you&#039;re not missing anything in query-evaluation. Not a conceptual problem, but if it&#039;s going to be solved with inferrence, the RDF data would have to include the appropriate owl:inverse statements, at least, and I don&#039;t usually see those in published RDF examples.

3. Thread&#039;s data is expressed directly in nodes, with each node&#039;s internal data-structure including all its outbound arcs/predicates, whereas RDF implies nodes via decomposed triples. Thus most traversal operations are fast in Thread more or less by definition, and would tend to be slow or impractical if each step of query-evaluation had to rescan the entire universe of triples to re-infer the &quot;nodes&quot;. But this is just a matter of pre-indexing, and/or convention. The N3 notation in your examples is basically this same idea: bundle together all the statements about each node. And I suspect many RDF query-engines build indices by node-ID as preprocessing already.

Logistically speaking, the production system for which Thread was designed is a data-aggregation/analysis/republishing platform being built at ITA Software in Cambridge, MA. It&#039;s in private beta-testing now, and I&#039;m hoping to have at least a small public database available for query-language demonstration ahead of public exposure of the whole system, hopefully within a small number of months...</description>
		<content:encoded><![CDATA[<p>The language (it&#8217;s called Thread) is basically already suited for RDF by its graph-model nature. There are three practical differences, at least, between the data-model over which Thread operates and that of &#8220;raw RDF&#8221;, but none of them are conceptually problematic:</p>
<p>1. Thread nodes &#8220;have&#8221; literals, whereas in RDF nodes are connected to literals by predicates. This allows a Thread query to say, for example, &#8220;Year:=1984&#8243;. But this could already be written out more explicitly as &#8220;Year:(.Name:=1984)&#8221;, so this point is just about brevity in queries, and could be solved by mapping some common &#8220;name&#8221;-ish predicates to the syntactic shorthand. Minor.</p>
<p>2. In Thread data all relationships are asserted and maintained in both directions. Thus you can ask &#8220;Artist:(.Album.Year:=1984)&#8221; to find out all the bands who put out albums in 1984, and you don&#8217;t have to worry about whether the relationship from Black Sabbath to Sabotage was explicitly asserted as &#8220;black_sabbath album sabotage .&#8221; or &#8220;sabotage artist black_sabbath .&#8221;. So you need to get those inverses all either asserted or inferred, either at data-modification-time or query-time, to make sure you&#8217;re not missing anything in query-evaluation. Not a conceptual problem, but if it&#8217;s going to be solved with inferrence, the RDF data would have to include the appropriate owl:inverse statements, at least, and I don&#8217;t usually see those in published RDF examples.</p>
<p>3. Thread&#8217;s data is expressed directly in nodes, with each node&#8217;s internal data-structure including all its outbound arcs/predicates, whereas RDF implies nodes via decomposed triples. Thus most traversal operations are fast in Thread more or less by definition, and would tend to be slow or impractical if each step of query-evaluation had to rescan the entire universe of triples to re-infer the &#8220;nodes&#8221;. But this is just a matter of pre-indexing, and/or convention. The N3 notation in your examples is basically this same idea: bundle together all the statements about each node. And I suspect many RDF query-engines build indices by node-ID as preprocessing already.</p>
<p>Logistically speaking, the production system for which Thread was designed is a data-aggregation/analysis/republishing platform being built at ITA Software in Cambridge, MA. It&#8217;s in private beta-testing now, and I&#8217;m hoping to have at least a small public database available for query-language demonstration ahead of public exposure of the whole system, hopefully within a small number of months&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ian Davis</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1444</link>
		<dc:creator>Ian Davis</dc:creator>
		<pubDate>Mon, 10 Aug 2009 19:57:56 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1444</guid>
		<description>Glenn, your query language looks very powerful. Can you see a natural way to fit it with RDF?</description>
		<content:encoded><![CDATA[<p>Glenn, your query language looks very powerful. Can you see a natural way to fit it with RDF?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: glenn mcdonald</title>
		<link>http://blog.iandavis.com/2009/08/time-in-rdf-5/comment-page-1#comment-1441</link>
		<dc:creator>glenn mcdonald</dc:creator>
		<pubDate>Mon, 10 Aug 2009 17:26:04 +0000</pubDate>
		<guid isPermaLink="false">http://iandavis.com/blog/?p=1368#comment-1441</guid>
		<description>I left a comment on part 6 about the modeling issues that are the real topic here, but the SPARQL here in scenario 3 is so painful that I will offer an off-topic observation:

SPARQL is not good enough. The human question here is, given a sparse set of date-observations, what is the pair before and after a given date known to be in the middle. Your SPARQL query takes 14 lines to express this (plus six prefixes!), and would be even uglier if it weren&#039;t for the semantically dubious (and anti-open-world-assumption) intervalAfter/intervalBefore relationships you added to the data itself.

I submit that a good query language would let you ask this question in some way much more like this:

@anon.Residence#RecordYear::?,RecordYear1874,?

And, for that matter, what you&#039;d really like here in a more general sense is a list of the person&#039;s residences, sorted by temporal proximity to the year in question, subsorted by year. That&#039;s a better question, because it can be answered whether the year is before, during or after whatever data you have. Is that doable in SPARQL? Via CONSTRUCT, somehow? But it should be even easier to ask than the previous question, something more like this:

@anon.Residence#(.RecordYear._--1874),Year


I have a blog post about this query-language, if you&#039;re at all intrigued:

http://www.furia.com/page.cgi?type=log&amp;id=324</description>
		<content:encoded><![CDATA[<p>I left a comment on part 6 about the modeling issues that are the real topic here, but the SPARQL here in scenario 3 is so painful that I will offer an off-topic observation:</p>
<p>SPARQL is not good enough. The human question here is, given a sparse set of date-observations, what is the pair before and after a given date known to be in the middle. Your SPARQL query takes 14 lines to express this (plus six prefixes!), and would be even uglier if it weren&#8217;t for the semantically dubious (and anti-open-world-assumption) intervalAfter/intervalBefore relationships you added to the data itself.</p>
<p>I submit that a good query language would let you ask this question in some way much more like this:</p>
<p>@anon.Residence#RecordYear::?,RecordYear1874,?</p>
<p>And, for that matter, what you&#8217;d really like here in a more general sense is a list of the person&#8217;s residences, sorted by temporal proximity to the year in question, subsorted by year. That&#8217;s a better question, because it can be answered whether the year is before, during or after whatever data you have. Is that doable in SPARQL? Via CONSTRUCT, somehow? But it should be even easier to ask than the previous question, something more like this:</p>
<p>@anon.Residence#(.RecordYear._&#8211;1874),Year</p>
<p>I have a blog post about this query-language, if you&#8217;re at all intrigued:</p>
<p><a href="http://www.furia.com/page.cgi?type=log&amp;id=324" rel="nofollow">http://www.furia.com/page.cgi?type=log&amp;id=324</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>
