<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>OpenLink Virtuoso (Product Blog)</title><link>http://www.openlinksw.com/blog/vdb/blog/</link><description>A great place to track Virtuoso&#39;s rapid evolution.</description><managingEditor>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</managingEditor><pubDate>Sat, 10 May 2008 02:37:56 GMT</pubDate><generator>Virtuoso Universal Server 05.00.3028</generator><webMaster>kidehen@openlinksw.com</webMaster><copyright>OpenLink Software 1998-2006</copyright><n0:link xmlns:n0="http://www.w3.org/2005/Atom" href="http://www.openlinksw.com/weblogs/virtuoso/gems/rss.xml" rel="self" type="application/rss+xml" title="OpenLink Virtuoso (Product Blog)" /><category>&quot;virtual</category><category>database&quot;</category><category>&quot;enterprise</category><category>information</category><category>integration&quot;</category><category>odbc</category><category>jdbc</category><category>sql</category><category>soa</category><category>&quot;web</category><category>services&quot;</category><category>soap</category><category>federated</category><category>database</category><category>rdf</category><category>sparql</category><category>eii</category><category>bpel</category><category>bpm</category><category>webdav</category><category>sql</category><category>http</category><category>xml</category><category>xquery</category><category>xslt</category><language>en-us</language><image><title>OpenLink Virtuoso (Product Blog)</title><url>http://www.openlinksw.com/weblog/public/images/vbloglogo.gif</url><link>http://www.openlinksw.com/blog/vdb/blog/</link><description>A great place to track Virtuoso&#39;s rapid evolution.</description><width>88</width><height>31</height></image>
<cloud domain="localhost" port="8889" path="/RPC2" registerProcedure="xmlStorageSystem.requestNotification" protocol="xml-rpc" />
<item><title>Dbpedia Benchmark Revisited</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1359</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1359</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1359#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1359</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1359</n0:commentRss><pubDate>Fri, 09 May 2008 19:33:42 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Dbpedia Benchmark Revisited&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;We ran the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10f6d398&quot;&gt;Dbpedia&lt;/a&gt; benchmark queries again with different
configurations of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1088e318&quot;&gt;Virtuoso&lt;/a&gt;. I had not studied the details of the
matter previously but now did have a closer look at the
queries.&lt;/div&gt;
&lt;div&gt;Comparing numbers given by different parties is a constant
problem. In the case reported here, we loaded the full &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1673c4d8&quot;&gt;Dbpedia&lt;/a&gt; 3,
all languages with about 198M triples on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1673c460&quot;&gt;Virtuoso&lt;/a&gt; 5 and 6 cluster,
all on the same 4 core 2GHz Xeon with 8G RAM. All databases were
striped on 6 disks. The cluster configuration was with 4 processes
in the same box.&lt;/div&gt;
&lt;div&gt;We ran the queries in two variants: The first was with graph
specified in the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10682c50&quot;&gt;SPARQL&lt;/a&gt; from clause, using the default indices. The
second variant was with no graph specified anywhere, using an
alternate indexing scheme.&lt;/div&gt;
&lt;div&gt;The times below are for the sequence of 5 queries, individual
query times are not reported. I did not do a line by line review of
the execution plans since they seem to run well enough. We could
get some extra mileage from cost model tweaks, specially for the
numeric range conditions but we will do this when somebody comes up
with better times.&lt;/div&gt;
&lt;div&gt;First about 5: Because there is a query in the set that
specifies no condition on S or O and only P, this simply cannot be
done with the default indices. With 6 it sort of can because 6 is
more space efficient.&lt;/div&gt;
&lt;div&gt;So we added the index:&lt;/div&gt;
&lt;pre&gt;
create bitmap index &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xfec1130&quot;&gt;rdf&lt;/a&gt;_quad_pogs on rdf_quad (p, o, g, s);

5 with gspo, ogps, pogs 
cold   210s
warm  0.600s

6 cluster with gspo, ogps 
cold  136s
warm 4.01 s


6 cluster with gspo, ogpps, pogs
cold  33.4s
warm 0.628 s
&lt;/pre&gt;
&lt;div&gt;OK, so now let us do it without a graph being specified. For
all platforms, we do:&lt;/div&gt;
&lt;div&gt;- Drop any existing indices.&lt;/div&gt;
&lt;pre&gt;
create table r2 (g iri_id_8, s, iri_id_8, p iri_id_8, o any, primary key (s, p, o, g))
alter index R2 on R2 partition (s int (0hexffff00));

log_enable (2);
insert into r2 (g, s, p, o) select g, s, p, o from rdf_quad;

drop table rdf_quad;
alter table r2 rename RDF_QUAD;
create bitmap index rdf_quad_opgs on rdf_quad (o, p, g, s) partition (o varchar (-1, 0hexffff));
create bitmap index rdf_quad_pogs on rdf_quad (p, o, g, s) partition (o varchar (-1, 0hexffff));
create bitmap index rdf_quad_gpos on rdf_quad (g, p, o, s) partition (o varchar (-1, 0hexffff));
&lt;/pre&gt;
&lt;div&gt;The code is identical for 5 and 6, except that with 5 we use
iri_id (32 bit) for the type, not iri_id_8 (64 bit). We note that
we run out of id&amp;#39;s with 5 around a few billion triples, so with 6
we have double the id length and still manage to be vastly more
space efficient.&lt;/div&gt;
&lt;div&gt;With the above 4 indices, we can query the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10865200&quot;&gt;data&lt;/a&gt; pretty much in
any combination without hitting a full scan of any index. We note
that all indices that do not begin with s end with s as a bitmap.
This is about 60% of the space of a non-bitmap index for &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x6d11ff0&quot;&gt;data&lt;/a&gt; such
as Dbpedia.&lt;/div&gt;
&lt;div&gt;If you intend to do completely arbitrary RDF queries in
Virtuoso, then chances are you are best off with the above index
scheme.&lt;/div&gt;
&lt;pre&gt;
5 with spog, pogs, opgs, gpos 
warm 0.595 s

6 cluster  with spog, pogs, opgs, gpos 
warm 0.617 s
&lt;/pre&gt;
&lt;div&gt;The cold times were about the same as above, so not
reproduced.&lt;/div&gt;
&lt;div&gt;Graph or No Graph?&lt;/div&gt;
&lt;div&gt;It is in the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x6f2b660&quot;&gt;SPARQL&lt;/a&gt; spirit to specify a graph and for pretty
much any application, there are entirely sensible ways of keeping
the data in graphs and specifying which ones are concerned by
queries. This is why Virtuoso is set up for this by default.&lt;/div&gt;
&lt;div&gt;On the other hand, for the open web scenario, dealing with an
unknown large number of graphs, enumerating graphs is not possible
and questions like which graph of which source asserts x become
relevant. We have two distinct use cases which warrant a different
setup of the database, simple as that.&lt;/div&gt;
&lt;div&gt;The latter use case is not really within the SPARQL spec, so
implementations may or may not support this. For example &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id1089a608&quot;&gt;Oracle&lt;/a&gt; or
Vertica would not do this well since they partition data according
to graph or predicate, respectively. On the other hand stores that
work with one quad table, which is most of the ones out there
should do it maybe with some configuring, as shown above.&lt;/div&gt;
&lt;div&gt;Frameworks like Jena are not to my &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10a139a8&quot;&gt;knowledge&lt;/a&gt; geared towards
having a wildcard for graph, although I would suppose this can be
arranged by adding some &amp;quot;super-graph&amp;quot; object, a graph of all
graphs. I don&amp;#39;t think this is directly supported and besides most
apps would not need it.&lt;/div&gt;
&lt;div&gt;Once the indices are right, there is no difference between
specifying a graph and no graph with the queries considered. With
more complex queries, specifying a graph or set of graphs does
allow some optimizations that cannot be done with graph missing.
For example, bitmap intersections are possible only when all
leading key parts are given.&lt;/div&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;div&gt;The best warm cache time is with 5, the five queries under
600 ms after the first go. This is to show that all in memory with
a single thread of execution is hard to beat.&lt;/div&gt;
&lt;div&gt;The 6 cluster performs the same in 623 ms. What is gained in
parallelism is lost in latency if all operations complete in
microseconds. On the other hand, 6 cluster leaves 5 in the dust in
any situation that has less than 100% hit rate. This is due to
actual benefit from parallelism if operations take longer than a
few microseconds, such as in the case of disk reads. 6 has
substantially better data layout on disk, as well as fewer pages to
load for the same content.&lt;/div&gt;
&lt;div&gt;This makes it possible to run the queries without the pogs
index on 6 even when 5 took prohibitively long.&lt;/div&gt;
&lt;div&gt;The morale of the story is to have a lot of RAM and space
efficient data representation.&lt;/div&gt;
&lt;div&gt;The Dbpedia benchmark does not specify any random access
pattern that would give a measure of sustained throughput under
load, so we are left with the extremes of cold and warm cache of
which neither is quite realistic.&lt;/div&gt;
&lt;div&gt;Chris Bizer and I have talked on and off about benchmarks and
I have made suggestions that we will see incorporated into the
Berlin SPARQL benchmark, which will, I believe, be much more
informative.&lt;/div&gt;
&lt;h3&gt;Appendix: Query Text&lt;/h3&gt;
&lt;div&gt;For reference, the query text is below, with graph given. To
run without specifying the graph, just drop the from
&amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id105403c0&quot;&gt;http&lt;/a&gt;://dbpedia.org&amp;gt;. The returned row counts are indicated
below the query text.&lt;/div&gt;
&lt;pre&gt;
sparql SELECT ?p ?o from &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x17f22d88&quot;&gt;http&lt;/a&gt;://dbpedia.org&amp;gt; WHERE {
  &amp;lt;http://dbpedia.org/resource/Metropolitan_Museum_of_Art&amp;gt; ?p ?o };

-- 1337 rows

sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt;
SELECT ?film1 ?actor1 ?film2 ?actor2
from &amp;lt;http://dbpedia.org&amp;gt; WHERE {
  ?film1 p:starring &amp;lt;http://dbpedia.org/resource/Kevin_Bacon&amp;gt; .
  ?film1 p:starring ?actor1 .
  ?film2 p:starring ?actor1 .
  ?film2 p:starring ?actor2 . };

--  23910 rows

sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt;
SELECT ?artist ?artwork ?museum ?director from &amp;lt;http://dbpedia.org&amp;gt; 
WHERE {
  ?artwork p:artist ?artist .
  ?artwork p:museum ?museum .
  ?museum p:director ?director };

-- 303 rows

sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt;
PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt;
PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt;
SELECT ?s ?homepage from &amp;lt;http://dbpedia.org&amp;gt;  WHERE {
   &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:lat ?berlinLat .
   &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:long ?berlinLong . 
   ?s geo:lat ?lat .
   ?s geo:long ?long .
   ?s foaf:homepage ?homepage .
   FILTER (
     ?lat        &amp;lt;=     ?berlinLat + 0.03190235436 &amp;amp;&amp;amp;
     ?long       &amp;gt;=     ?berlinLong - 0.08679199218 &amp;amp;&amp;amp;
     ?lat        &amp;gt;=     ?berlinLat - 0.03190235436 &amp;amp;&amp;amp; 
     ?long       &amp;lt;=     ?berlinLong + 0.08679199218) };

-- 56 rows


sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt;
PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt;
PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt;
PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt;
SELECT ?s ?a ?homepage from &amp;lt;http://dbpedia.org&amp;gt;  WHERE {
   &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:lat ?nyLat .
   &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:long ?nyLong . 
   ?s geo:lat ?lat .
   ?s geo:long ?long .
   ?s p:architect ?a .
   ?a foaf:homepage ?homepage .
   FILTER (
     ?lat        &amp;lt;=     ?nyLat + 0.3190235436 &amp;amp;&amp;amp;
     ?long       &amp;gt;=     ?nyLong - 0.8679199218 &amp;amp;&amp;amp;
     ?lat        &amp;gt;=     ?nyLat - 0.3190235436 &amp;amp;&amp;amp; 
     ?long       &amp;lt;=     ?nyLong + 0.8679199218) };

-- 13 rows
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>benchmarking</category><category>scalability</category><category>rdf</category><category>oracle</category><category>foaf</category><category>semanticweb</category><category>sparql</category><category>socialnetworking</category><category>virtuoso</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">1</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-05-09T15:33:43.000-04:00</n0:modified></item><item><title>SPARQL at WWW 2008</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1354</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1354</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1354#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1354</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1354</n0:commentRss><pubDate>Wed, 30 Apr 2008 16:28:10 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;SPARQL at WWW 2008&lt;/div&gt;
&lt;p&gt;Andy Seaborne and Eric Prud&amp;#39;hommeaux, editors of the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1501d1a0&quot;&gt;SPARQL&lt;/a&gt; recommendation, convened a SPARQL birds of a feather session at &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0xb9d6c10&quot;&gt;WWW 2008&lt;/a&gt;. The administrative outcome was that implementors could now
experiment with extensions, hopefully keeping each other current about their efforts and that towards the end of 2008, a new W3C working group might begin formalizing the experiences into a new SPARQL spec.&lt;/p&gt;
&lt;p&gt;The session drew a good crowd, including many users and developers. The wishes were largely as expected, with a few new ones added. Many of the wishes already had diverse implementations, however most often without interop. I will below give some comments on the main issues discussed.&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;SPARQL Update&lt;/b&gt; - This is likely the most universally agreed upon extension. Implementations exist, largely along the lines of Andy Seaborne&amp;#39;s SPARUL spec, which is also likely material for a W3C member submission. The issue is without much controversy; transactions fall outside the scope, which is reasonable enough. With triple stores, we can define things as combinations of inserts and deletes, and isolation we just leave aside. If anything, operating on a transactional platform such as &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xc13fe98&quot;&gt;Virtuoso&lt;/a&gt;, one wishes to disable transactions for any operations such as bulk loads and long-running inserts and deletes. Transactionality has pretty much no overhead for a few hundred rows, but for a few hundred million rows the cost of locking and rollback is prohibitive. With Virtuoso, we have a row auto-commit mode which we recommend for use with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xd7bff00&quot;&gt;RDF&lt;/a&gt;: It commits by itself now and then, optionally keeping a roll forward log, and is transactional enough not to leave half triples around, i.e., inserted in one index but not another.&lt;/p&gt;
&lt;p&gt;As far as we are concerned, updating physical triples along the SPARUL lines is pretty much a done deal.&lt;/p&gt;
&lt;p&gt;The matter of updating relational &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x140ea538&quot;&gt;data&lt;/a&gt; mapped to RDF is a whole other kettle of fish. On this, I should say that RDF has no special virtues for expressing transactions but rather has a special genius for integration. Updating is best left to web service interfaces that use &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xa24e9558&quot;&gt;SQL&lt;/a&gt; on the inside. Anyway, updating union views, which most mappings will be, is complicated. Besides, for transactions, one usually knows exactly what one wishes to update.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;Full Text&lt;/b&gt; - Many people expressed a desire for full text access. Here we run into a deplorable confusion with regexps. The closest SPARQL has to full text in its native form is regexps, but these are not really mappable to full text except in rare special cases and I would despair of explaining to an end user what exactly these cases are. So, in principle, some regexps are equivalent to full text but in practice I find it much preferable to keep these entirely separate.&lt;/p&gt;
&lt;p&gt;It was noted that what the users want is a text box for search words. This is a front end to the CONTAINS predicate of most SQL implementations. Ours is MS SQL Server compatible and has a SPARQL version called &lt;code&gt;bif:contains&lt;/code&gt;. One must still declare which triples one wants indexed for full text, though. This admin overhead seems inevitable, as text indexing is a large overhead and not needed by all applications.&lt;/p&gt;
&lt;p&gt;Also, text hits are not boolean; usually they come with a hit score. Thus, a SPARQL extension for this could look like &lt;/p&gt;
&lt;blockquote&gt;
  &lt;code&gt;select * where { ?thing has_description ?d . ?d ftcontains &amp;quot;gizmo&amp;quot; ftand &amp;quot;widget&amp;quot; score ?score . }&lt;/code&gt;
&lt;/blockquote&gt;
&lt;p&gt;This would return all the subjects, descriptions, and scores, from subjects with a has_description property containing widget and gizmo. Extending the basic pattern is better than having the match in a filter, since the match binds a variable.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id0x9ddb7240&quot;&gt;XQuery&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x9d84e070&quot;&gt;XPath&lt;/a&gt; groups have recently come up with a full-text spec, so I used their style of syntax above. We already have a full-text extension, as do some others. but for standardization, it is probably most appropriate to take the XQuery work as a basis. The XQuery full-text spec is quite complex, but I would expect most uses to get by with a small subset, and the structure seems better thought out, at first glance, than the more ad-hoc implementations in diverse SQLs.&lt;/p&gt;
&lt;p&gt;Again, declaring any text index to support the search, as well as its timeliness or transactionality, are best left to implementations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;Federation&lt;/b&gt; - This is a tricky matter. ARQ has a SPARQL extension for sending a nested set of triple patterns to a specific end-point. The DARQ project has something more, including a selectivity model for SPARQL.&lt;/p&gt;
&lt;p&gt;With federated SQL, life is simpler since after the views are expanded, we have a query where each table is at a known server and has more or less known statistics. Generally, execution plans where as much work as possible is pushed to the remote servers are preferred, and modeling the latencies is not overly hard. With SPARQL, each triple pattern could in principle come from any of the federated servers. Associating a specific end-point to a fragment of the query just passes the problem to the user. It is my guess that this is the best we can do without getting very elaborate, and possibly buggy, end-point content descriptions for routing federated queries.&lt;/p&gt;
&lt;p&gt;Having said this, there remains the problem of join order. I suggested that we enhance the protocol by allowing asking an end-point for the query cost for a given SPARQL query. Since they all must have a cost model for optimization, this should not be an impossible request. A time cost and estimated cardinality would be enough. Making statistics available &lt;i&gt;à la&lt;/i&gt; DARQ was also discussed. Being able to declare cardinalities expected of a remote end-point is probably necessary anyway, since not all will implement the cost model interface. For standardization, agreeing on what is a proper description of content and cardinality and how fine grained this must be will be so difficult that I would not wait for it. A cost model interface would nicely hide this within the end-point itself.&lt;/p&gt;
&lt;p&gt;With Virtuoso, we do not have a federated SPARQL scheme but we could have the ARQ-like service construct. We&amp;#39;d use our own cost model with explicit declarations of cardinalities of the remote data for guessing a join order. Still, this is a bit of work. We&amp;#39;ll see.&lt;/p&gt;
&lt;p&gt;For practicality, the service construct coupled with join order hints is the best short term bet. Making this pretty enough for standardization is not self-evident, as it requires end-point description and/or cost model hooks for things to stay declarative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;End-point description&lt;/b&gt; - This question has been around for a while; I have &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1085&quot; id=&quot;link-id10fa7da8&quot;&gt;blogged about it earlier&lt;/a&gt;, but we are not really at a point where there would be even rough consensus about an end-point ontology. We should probably do something on our own to demonstrate some application of this, as we host lots of &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xd048c68&quot;&gt;linked open data&lt;/a&gt; sets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;SQL equivalence&lt;/b&gt; - There were many requests for aggregation, some for subqueries and nesting, expressions in select, negation, existence and so on. I would call these all SQL equivalence. One use case was taking all the teams in the database and for all with over 5 members, add the big_team class and a property for member count.&lt;/p&gt;
&lt;p&gt;With Virtuoso, we could write this as -- &lt;/p&gt;
&lt;blockquote&gt;
  &lt;code&gt;construct { ?team a big_team . ?team member_count ?ct } from ... where {?team a team . { select ?team2 count (*) as ?ct where { ?m member_of ?team2 } . filter (?team = ?team2 and ? ct &amp;gt; 5) }}&lt;/code&gt;
&lt;/blockquote&gt;
&lt;p&gt;We have pretty much all the SQL equivalence features, as we have been working for some time at translating the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0xb9d5200&quot;&gt;TPC-H&lt;/a&gt; workload into SPARQL.&lt;/p&gt;
&lt;p&gt;The usefulness of these things is uncontested but standardization could be hard as there are subtle questions about variable scope and the like.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;Inference&lt;/b&gt; - The SPARQL spec does not deal with transitivity or such matters because it is assumed that these are handled by an underlying inference layer. This is however most often not so. There was interest in more fine grained control of inference, for example declaring that just one property in a query would be transitive or that subclasses should be taken into account in only one triple pattern. As far as I am concerned, this is very reasonable, and we even offer extensions for this sort of thing in Virtuoso&amp;#39;s SPARQL. This however only makes sense if the inference is done at query time and pattern by pattern. For instance, if forward chaining is used, this no longer makes sense. Specifying that some forward chaining ought to be done at query time is impractical, as the operation can be very large and time consuming and it is the DBA&amp;#39;s task to determine what should be stored and for how long, how changes should be propagated, and so on. All these are application dependent and standardizing will be difficult.&lt;/p&gt;
&lt;p&gt;Support for RDF features like lists and bags would all fall into the functions an underlying inference layer should perform. These things are of special interest when querying OWL models, for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
  &lt;b&gt;Path expressions&lt;/b&gt; - Path expressions were requested by a few people. We have implemented some, as in &lt;/p&gt;
 &lt;blockquote&gt;
  &lt;code&gt;?product+?has_supplier+&amp;gt;s_name = &amp;quot;Gizmos, Inc.&amp;quot;.&lt;/code&gt;
 &lt;/blockquote&gt; This means that one supplier of product has name &amp;quot;Gizmo, Inc.&amp;quot;. This is a nice shorthand but we run into problems if we start supporting repetitive steps, optional steps, and the like.&lt;/li&gt;
&lt;p&gt;In conclusion, update, full text, and basic counting and grouping would seem straightforward at this point. Nesting queries, value subqueries, views, and the like should not be too hard if an agreement is reached on scope rules. Inference and federation will probably need more experimentation but a lot can be had already with very simple fine grained control of backward chaining, if such applies, or with explicit end-point references and explicit join order. These are practical but not pretty enough for committee consensus, would be my guess. Anyway, it will be a few months before anything formal will happen.&lt;/p&gt;
</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>rdf</category><category>xpath</category><category>xml</category><category>xquery</category><category>sql_server</category><category>semanticweb</category><category>sparql</category><category>virtuoso</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-30T13:48:12.000-04:00</n0:modified></item><item><title>Linked Data and Information Architecture</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1350</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1350</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1350#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1350</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1350</n0:commentRss><pubDate>Tue, 29 Apr 2008 14:37:22 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Linked Data and Information Architecture&lt;/div&gt;
&lt;p&gt;We had a workshop on &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1437ac70&quot;&gt;Linked Open Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1315f788&quot;&gt;LOD&lt;/a&gt;) last week in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x13737468&quot;&gt;Beijing&lt;/a&gt;. You can see the papers in &lt;a href=&quot;http://events.linkeddata.org/ldow2008/#program&quot; id=&quot;link-id10651ab8&quot;&gt;the program&lt;/a&gt;. The event was a success with plenty of good talks and animated conversation. I will not go into every paper here but will comment a little on the conversation and draw some technology requirements going forward.&lt;/p&gt;
&lt;p&gt;Tim Berners-Lee showed a read-write version of &lt;a href=&quot;http://dig.csail.mit.edu/2005/ajar/release/tabulator/0.8/tab.html&quot; id=&quot;link-id0x15633520&quot;&gt;Tabulator&lt;/a&gt;. This raises the question of updating on the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1350a178&quot;&gt;Data&lt;/a&gt; Web. The consensus was that one could assert what one wanted in one&amp;#39;s own space but that others&amp;#39; spaces would be read-only. What spaces one considered relevant would be the user&amp;#39;s or developer&amp;#39;s business, as in the document web.&lt;/p&gt;
&lt;p&gt;It seems to me that a significant use case of LOD is an open-web situation where the user picks a broad read-only &amp;quot;data wallpaper&amp;quot; or backdrop of assertions, and then uses this combined with a much smaller, local, writable data set. This is certainly the case when editing data for publishing, as in Tim&amp;#39;s demo. This will also be the case when developing mesh-ups combining multiple distinct data sets bound together by sets of SameAs assertions, for example. Questions like, &amp;quot;What is the minimum subset of n data sets needed for deriving the result?&amp;quot; will be common. This will also be the case in applications using proprietary data combined with open data.&lt;/p&gt;
&lt;p&gt;This means that databases will have to deal with queries that specify large lists of included graphs, all graphs in the store or all graphs with an exclusion list. All this is quite possible but again should be considered when architecting systems for an open &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xa27bae8&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x155c3f18&quot;&gt;web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;quot;There is data but what can we really do with it? How far can we trust it, and what can we confidently decide based on it?&amp;quot;&lt;/p&gt;
&lt;p&gt;As an answer to this question, &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0xd447580&quot;&gt;Zitgist&lt;/a&gt; has compiled the &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x14735008&quot;&gt;UMBEL&lt;/a&gt; taxonomy using &lt;a href=&quot;http://dbpedia.org/resource/SKOS&quot; id=&quot;link-id0x15ab1c48&quot;&gt;SKOS&lt;/a&gt;. This draws on Wikipedia, Open CYC, Wordnet, and &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id0x15d5aa88&quot;&gt;YAGO&lt;/a&gt;, hence the acronym WOWY. UMBEL is both a taxononmy and a set of instance data, containing a large set of &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0x9fe45d98&quot;&gt;named entities&lt;/a&gt;, including persons, organizations, geopolitical entities, and so forth. By extracting references to this set of named entities from documents and correlating this to the taxonomy, one gets a good idea of what a document (or part thereof) is about.&lt;/p&gt;
&lt;p&gt;Kingsley presented this in the Zitgist demo. This is our answer to the criticism about &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xa1920800&quot;&gt;DBpedia&lt;/a&gt; having errors in classification. DBpedia, as a bootstrap stage, is about giving names to all things. Subsequent efforts like UMBEL are about refining the relationships.&lt;/p&gt;
&lt;p&gt;&amp;quot;Should there be a global &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x12cd5290&quot;&gt;URI&lt;/a&gt; dictionary?&amp;quot;&lt;/p&gt;
&lt;p&gt;There was a talk by Paolo Bouquet about &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x12d03400&quot;&gt;Entity&lt;/a&gt; Name System, a a sort of data DNS, with the purpose of associating some description and rough classification to URIs. This would allow discovering URIs for reuse. I&amp;#39;d say that this is good if it can cut down on the SameAs proliferation and if this can be widely distributed and replicated for resilience, &lt;i&gt;à la&lt;/i&gt; DNS. On the other hand, it was pointed out that this was not quite in the LOD spirit, where parties would mint their own dereferenceable URIs, in their own domains. We&amp;#39;ll see.&lt;/p&gt;
&lt;p&gt;&amp;quot;What to do when identity expires?&amp;quot;&lt;/p&gt;
&lt;p&gt;Giovanni of Sindice said that a document should be removed from search if it was no longer available. Kingsley pointed out that resilience of reference requires some way to recover data. The data web cannot be less resilient than the document web, and there is a point to having access to history. He recommended hooking up with the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x143e4130&quot;&gt;Internet&lt;/a&gt; Archive, since they make long term persistence their business. In this way, if an application depends on data, and the URIs on which it depends are no longer dereferenceable or or provide content from a new owner of the domain, those who need the old version can still get it and host it themselves.&lt;/p&gt;
&lt;p&gt;It is increasingly clear that OWL SameAs is both the blessing and bane of linked data. We can easily have tens of URIs for the same thing, especially with people. Still, these should be considered the same.&lt;/p&gt;
&lt;p&gt;Returning every synonym in a query answer hardly makes sense but accepting them as input seems almost necessary. This is what we do with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x15a2a930&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s SameAs support. Even so, this can easily double query times even when there are no synonyms.&lt;/p&gt;
&lt;p&gt;Be that as it may, SameAs is here to stay; just consider the mapping of DBpedia to Geonames, for example.&lt;/p&gt;
&lt;p&gt;Also, making aberrant SameAs statements can completely poison a data set and lead to absurd query results. Hence choosing which SameAs assertions from which source will be considered seems necessary. In an open web scenario, this leads inevitably to multi-graph queries that can be complex to write with regular &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x12bb8ce8&quot;&gt;SPARQL&lt;/a&gt;. By extension, it seems that a good query would also include the graphs actually used for deriving each result row. This is of course possible but has some implications on how databases should be organized.&lt;/p&gt;
&lt;p&gt;Yves Raymond gave a talk about deriving identity between Musicbrainz and Jamendo. I see the issue as a core question of linked data in general. The algorithm Yves presented started with attribute value similarities and then followed related entities. Artists would be the same if they had similar names and similar names of albums with similar song titles, for example. We can find the same basic question in any analysis, for example, looking at how news reporting differs between media, supposing there is adequate entity extraction.&lt;/p&gt;
&lt;p&gt;There is basic graph diffing in &lt;a href=&quot;http://data.semanticweb.org/conference/iswc-aswc/2007/tracks/research/papers/533/html&quot; id=&quot;link-id0x153c1fa8&quot;&gt;RDFSync&lt;/a&gt;, for example. But here we are expanding the context significantly. We will traverse references to some depth, allow similarity matches, SameAs, and so forth. Having presumed identity of two URIs, we can then look at the difference in their environment to produce a human readable summary. This could then be evaluated for purposes of analysis or of combining content.&lt;/p&gt;
&lt;p&gt;At first sight, these algorithms seem well parallelizable, as long as all threads have access to all data. For scaling, this means a probably message-bound distributed algorithm. This is something to look into for the next stage of linked data.&lt;/p&gt;
&lt;p&gt;Some inference is needed, but if everybody has their own choice of data sets to query, then everybody would also have their own entailed triples. This will make for an explosion of entailed graphs if forward chaining is used. Forward chaining is very nice because it keeps queries simple and easy to optimize. With Virtuoso, we still favor backward chaining since we expect a great diversity of graph combinations and near infinite volume in the open web scenario. With private repositories of slowly changing data put together for a special application, the situation is different.&lt;/p&gt;
&lt;p&gt;In conclusion, we have a real LOD movement with actual momentum and a good idea of what to do next. The next step is promoting this to the broader community, starting with &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id0x155d1d00&quot;&gt;Linked Data Planet&lt;/a&gt; in New York in June.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>semanticweb</category><category>web30</category><category>skos</category><category>sparql</category><category>history</category><category>visionary</category><category>virtuoso</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-29T17:18:21.48000-04:00</n0:modified></item><item><title>On Sem Web Search</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1349</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1349</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1349#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1349</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1349</n0:commentRss><pubDate>Tue, 29 Apr 2008 14:37:21 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;On Sem Web Search&lt;/div&gt;
&lt;p&gt;&amp;quot;I give the search keywords and you give me a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xdc0c248&quot;&gt;SPARQL&lt;/a&gt; end-point and a query that will get the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xbd54be0&quot;&gt;data&lt;/a&gt;.&amp;quot;&lt;/p&gt;
&lt;p&gt;Thus did one SPARQL user describe the task of a semantic/data web search engine.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1336&quot; id=&quot;link-idff98750&quot;&gt;a previous post&lt;/a&gt;, I suggested that if the data web were the size of the document web, we&amp;#39;d be looking at two orders of magnitude more search complexity. It just might be so.&lt;/p&gt;
&lt;p&gt;In the conversation, I pointed out that a search engine might have a copy of everything and even a capability to do SPARQL and full text on it all, yet still the users would be better off doing the queries against the SPARQL end-points of the data publishers. It is a bit like the fact that not all web browsing runs off Google&amp;#39;s cache. With the data web, the point is even more pronounced, as serving a hit from Google&amp;#39;s cache is a small operation but a complex query might be a very large one.&lt;/p&gt;
&lt;p&gt;Yet, the data web is about ad-hoc joining between data sets of different origins. Thus a search engine of the data web ought to be capable of joining also, even if large queries ought to be run against individual publishers&amp;#39; end-points or the user&amp;#39;s own data warehouse.&lt;/p&gt;
&lt;p&gt;For ranking, the general consensus was that no single hit-ranking would be good for the data web. Thus word frequency-based hit-scores are OK for text hits but more is not obvious. I would think that some link analysis could apply but this will take some more experimentation.&lt;/p&gt;
&lt;p&gt;For search summaries, if we have splitting of data sets into small fragments &lt;i&gt;à la&lt;/i&gt; Sindice, search summaries are pretty much the same as with just text search. If we store triples, then we can give text style summaries of text hits in literals and Fresnel lens views of the structured data around the literal. For showing a page of hits, the lenses must abbreviate heavily but this is still feasible. The engine would know about the most common ontologies and summarize instance data accordingly.&lt;/p&gt;
&lt;p&gt;Chris Bizer pointed out that trust and provenance are critical, especially if an answer is arrived at by joining multiple data sets. The trust of the conclusion is no greater than that of the weakest participating document. Different users will have different trusted sources.&lt;/p&gt;
&lt;p&gt;A mature data web search engine would combine a provenance/trust specification, a search condition consisting of SPARQL or full text or both, and a specification for hit rank. Again, most searches would use defaults, but these three components should in principle be orthogonally specifiable.&lt;/p&gt;
&lt;p&gt;Many places may host the same data set either for download or SPARQL access. The &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xac4d6c8&quot;&gt;URI&lt;/a&gt; of the data set is not its &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0xdd50478&quot;&gt;URL&lt;/a&gt;. Different places may further host multiple data sets on one end-point. Thus the search engine ought to return all end-points where the set is to be found. The end-points themselves ought to be able to say what data sets they contain, under what graph IRIs. Since there is no consensus about end-point self description, this too would be left to the search engine. In practice, this could be accomplished by extending Sindice&amp;#39;s semantic site map specification. A possible query would be to find an end-point containing a set of named data sets. If none were found, the search engine itself could run a query joining all the sets since it at least would hold them all.&lt;/p&gt;
&lt;p&gt;Since many places will host sets like Wordnet or Uniprot, indexing these once for each copy hardly makes sense. Thus a site should identify its data by the data set&amp;#39;s URI and not the copy&amp;#39;s URL.&lt;/p&gt;
&lt;p&gt;It came up in the discussion that search engines should share a ping format so that a single message format would be enough to notify any engine about data being updated. This is already partly the case with Sindice and &lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0xb0c8078&quot;&gt;PTSW&lt;/a&gt; (Ping The &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xc28f9f0&quot;&gt;Semantic Web&lt;/a&gt;) sharing a ping format. &lt;/p&gt;
&lt;p&gt;Further, since it is no trouble to publish a copy of the 45G Uniprot file but a fair amount of work to index it, search engines should be smart about processing requests to index things, since these can amount to a denial of service attack. &lt;/p&gt;
&lt;p&gt;Probably very large data sets should be indexed only in the form supplied by their publisher, and others hosting copies would just state that they hold a copy. If the claim to the copy proved false, users could complain and the search engine administrator would remove the listing. It seems that some manual curating cannot be avoided here. &lt;/p&gt;
&lt;h2&gt;On Data Web Search Business Model&lt;/h2&gt;
&lt;p&gt;It seems there can be an overlap between the data web search and the data web hosting businesses. For example, Talis rents space for hosting &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xbececa0&quot;&gt;RDF&lt;/a&gt; data with SPARQL access. A search engine should offer basic indexing of everything for free, but could charge either data publishers or end users for running SPARQL queries across data sets. These do not have the nicely anticipatable and fairly uniform resource consumption of text lookups. In this manner, a search provider could cost-justify the capacity for allowing arbitrary queries. &lt;/p&gt;
&lt;p&gt;The value of the data web consists of unexpected joining. Such joining takes place most efficiently if the sources are at least in some proximity, for example in the same data center. Thus the search provider could monetize functioning as the database provider for mesh-ups. In the document web, publishing pages is very simple and there is no great benefit from co-locating search and pages, rather the opposite. For the data web, the hosting with SPARQL and all is more complex and resembles providing search. Thus providing search can combine with providing SPARQL hosting, once we accept in principle that search should have arbitrary inter-document joining, even if it is at an extra premium.&lt;/p&gt;
&lt;p&gt;The present search business model is advertising. If the data web is to be accessed by automated agents such as mesh-up code, display of ads is not self-evident. This is quite separate from the fact that semantics can lead to better ad targeting.&lt;/p&gt;
&lt;p&gt;One model would be to do text lookups for free from a regular web page but show ads, just a la Google search ads. Using the service via web services for text or SPARQL would have a cost paid by the searching or publishing party and would not be financed by advertising.&lt;/p&gt;
&lt;p&gt;In the case of data used in value-add data products (mesh-ups) that have financial value to their users, the original publisher of the data could even be paid for keeping the data up-to-date. This would hold for any time-sensitive feeds like news or financial feeds. Thus the hosting/search provider would be a broker of data-use fees and the data producer would be in the position of an AdSense inventory owner, i.e., a web site which shows AdSense ads. Organizing this under a hub providing back-office functions similar to an ad network could make sense even if the actual processing were divided among many sites.&lt;/p&gt;
&lt;p&gt;Kingsley has repeatedly formulated the core value proposition of the semantic web in terms of dealing with &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xa951148&quot;&gt;information&lt;/a&gt; overload: There is the real-time enterprise and the real-time individual and both are beasts of perception. Their image is won and lost in the Internet online conversation space. We know that allegations, even if later proven false, will stick if left unchallenged. The function of semantics on the web is to allow one to track and manage where one stands. In fact, Garlic has made a business of just this, but now from a privacy and security angle. Garlic&amp;#39;s Data Patrol harvests data from diverse sources and allows assessing vulnerability to identity theft, for example.&lt;/p&gt;
&lt;p&gt;If one is in the business of collating all the structured data in the world, as a data web search engine is, then providing custom alerts for both security or public image management is quite natural. This can be a very valuable service if it works well.&lt;/p&gt;
&lt;p&gt;At OpenLink, we will now experiment with the Sindice/&lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0x14606ec8&quot;&gt;Zitgist&lt;/a&gt;/&lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0xa08174e0&quot;&gt;PingTheSemanticWeb&lt;/a&gt; content. This is a regular part of the productization of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa127710&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s cluster edition. We expect to release some results in the next 4 weeks.   
&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>infomania</category><category>webservices</category><category>rdf</category><category>semanticweb</category><category>web30</category><category>sparql</category><category>openlink</category><category>virtuoso</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-29T16:06:09.000-04:00</n0:modified></item><item><title>WWW 2008</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1348</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1348</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1348#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1348</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1348</n0:commentRss><pubDate>Tue, 29 Apr 2008 14:37:20 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;WWW 2008&lt;/div&gt;
&lt;p&gt;Following my return from WWW 2008 in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x9ff7d5d0&quot;&gt;Beijing&lt;/a&gt;, I will write a series of &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x9e4a7650&quot;&gt;blog&lt;/a&gt; posts discussing diverse topics that were brought up in presentations and conversations during the week.&lt;/p&gt;
&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x9e7ae398&quot;&gt;Linked data&lt;/a&gt; was our main interest in the conference and there was a one day workshop on this, unfortunately overlapping with a day of W3C Advisory Committee meetings.  Hence Tim Berners-Lee, one of the chairs of the workshop, could not attend for most of the day.  Still, he was present to say that &amp;quot;&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xa287d38&quot;&gt;Linked open data&lt;/a&gt; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x15372940&quot;&gt;semantic web&lt;/a&gt; and the web done as it ought to be done.&amp;quot;
&lt;p&gt;For my part, I will draw some architecture conclusions from the different talks and extrapolate about the requirements on database platforms for linked data.&lt;/p&gt;
&lt;p&gt;Chris Bizer predicted that 2008 would be the year of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa1454c58&quot;&gt;data&lt;/a&gt; web search, if 2007 was the year of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xa0f73c50&quot;&gt;SPARQL&lt;/a&gt;.  This may be the case, as linked data is now pretty much a reality and the questions of discovery become prevalent.  There was a birds-of-a-feather session on this and I will make some comments on what we intend to explore in bridging between the text index based semantic web search engines and SPARQL.&lt;/p&gt;
&lt;p&gt;Andy Seaborne convened a birds-of-a-feather session on the future of SPARQL.  Many of the already anticipated and implemented requirements were confirmed and a few were introduced.  A separate blog post will discuss these further.&lt;/p&gt;
&lt;p&gt;From the various discussions held throughout the conference, we conclude that plug-and-play operation with the major semantic web frameworks of Jena, Sesame, and Redland, is our major immediate-term deliverable.  Our efforts in this direction thus far are insufficient and we will next have these done with the right supervision and  proper interop testing.  The issues are fortunately simple but doing things totally right require some small server side support and some &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xa5d4d5b8&quot;&gt;JDBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x9dc28d10&quot;&gt;ODBC&lt;/a&gt; tweaks, so to the interested, we advise to wait for an update to be published on this blog.&lt;/p&gt;
&lt;p&gt;I further had a conversation with Andy Seaborne about using Jena reasoning capabilities with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa2754050&quot;&gt;Virtuoso&lt;/a&gt; and generally the issues of &amp;quot;impedance mismatch&amp;quot; between reasoning and typical database workloads. More on this later.   
&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>architecture</category><category>hpc</category><category>jdbc</category><category>sql</category><category>odbc</category><category>semanticweb</category><category>web30</category><category>sparql</category><category>visionary</category><category>virtuoso</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-29T13:35:23.000-04:00</n0:modified></item><item><title>Partitioning and Cluster Config</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1340</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1340</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1340#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1340</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1340</n0:commentRss><pubDate>Mon, 14 Apr 2008 09:41:43 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Partitioning and Cluster Config&lt;/div&gt;
&lt;p&gt;Now that it is time to nail down the final database format and configuration steps for &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0x1c278550&quot;&gt;Virtuoso&lt;/a&gt; Cluster, we have to make a couple of small choices.&lt;/p&gt;
&lt;h3&gt;Design Objective&lt;/h3&gt;
&lt;p&gt;While fixed partitioning is good for testing, it is impractical even for measuring scalability, let alone deployment.  So fixed partitioning is really a no-go.  The best would be entirely dynamic partitioning where the data file split after reaching a certain size and where data files migrated between any number of heterogeneous boxes, so as to equalize pressure, like a liquid fills a container. It would have to be a sluggish cool liquid with a high surface tension, else we would get &amp;quot;Brownian motion&amp;quot; in trying to equalize the pressure too often.  But a liquid still.&lt;/p&gt;
&lt;p&gt;Sure.  Now go implement this with generic RDBMS ACID semantics and the works.  Feasible.   But while I am a fair-to-good geek, I don&amp;#39;t have time for this right now.&lt;/p&gt;
&lt;p&gt;So something in between, then.  The auto-migrating files are really a problem for keeping locks, keeping tractable roll forward, special cases in message routing etc.  The papers by Google and Amazon allude to this and they stop far short of serializable transaction semantics.&lt;/p&gt;
&lt;p&gt;So what is the design target?  In practice, running a few hundred database nodes with fault tolerance.  The nodes must be allowed to be of different sizes since a one time replace of hundreds of PC&amp;#39;s fits ill with the economy.&lt;/p&gt;
&lt;p&gt;Addition and removal of nodes must be without global downtime but putting some partitions in read only mode for restricted periods is OK.  Assigning the percentages of the data mass to the nodes can be a DBA task with a utility making suggestions based on measured disk cache hit rates and the like.  Partitions and the makeup of the cluster must be maintainable from a single place, no copying of config files or such, nobody can get this right and the screw ups from  having cluster nodes disagree about some part of the partition map are so untractable you don&amp;#39;t even want to go there.&lt;/p&gt;
&lt;p&gt;So, how is this done?  Divide the space of partitioning hashes into say 1K slices.  For each slice, give the node numbers that hold this slice of the partitioning space.  If there are more nodes, just divide the space in more slices.  When a node comes new to the cluster, it manages no slices.  Slices from other nodes can be offloaded to the new one by copying their contents.  The slice holders put the slice in read only mode and the new node just does an insert-select of the partitions it is meant to take over, no logs or locks needed and all comes in order so insert is 100% in processor cache. When the copy is complete, the slice comes back in read write mode in its new location and the old holders of the slices delete theirs in the background.  This is not as quick as shifting database files around but takes far less programming.&lt;/p&gt;
&lt;p&gt;To remove a node, reassign its slices and have the assignees read the data, as above.  When the copy is done, the node can go off line.&lt;/p&gt;
&lt;p&gt;A slight modification of this is for cases where a slice always has more than one holder.  Now, if we allocate slices to nodes on the go, keeping would-be replicas on different machines but otherwise equalizing load, we run into a problem with redundancy when we perform an operation that has no specific recipient: Suppose we count a table&amp;#39;s rows, we should send the count request once per every slice.  Now, the slice is not the recipient of the request, the cluster node hosting the slice is.  We should either qualify the request with what slices it pertains to, which means extra reading and filtering  or have it so that no matter the choice of replicas for any operation, there is no overlap between their contents, yet the contents cover every slice.  The only simple way to enforce the latter is to have cluster nodes pair-wise as each others&amp;#39; replicas.  Nodes will be adding nodes  in pairs or threes or whatever number of replicas there will be.  Google&amp;#39;s GFS, the file system redundancy layer under Bigtable or Dynamo do not have this problem since they do not deal with generic DBMS semantics.  The downside is that if a pair has two different types of boxes, the sizing should go according to the smaller one.  No big deal.&lt;/p&gt;
&lt;p&gt;If replicas are assigned box by box instead of slice by slice, life is also simpler in terms of roll forward and reconstituting lost nodes.&lt;/p&gt;
&lt;p&gt;The complete list of cluster nodes and their slice allocations are kept on a master node.  Each node also knows which slices it holds. With the loss of the master the situation can be reconstructed from the others.  For normal boot, the nodes get the cluster layout, slice allocation and some config parameters from the master, so that if network addresses change they do not have to be written to each node.  These are remembered by each node though, for the event of master failure.&lt;/p&gt;
&lt;p&gt;When a Virtuoso 6 database is made, the system objects are partitioned from the get-go.  On a single process this has no effect.  But since all the data structures exist, the transition from a single process to cluster and back is smooth.&lt;/p&gt;
&lt;p&gt;At any time, a database, whether single or cluster, is a self-contained unit.  One server process serves one database.  It is one-to-many from database to server process.  A server process will not mount multiple databases.  This could be done but then this would be more changes than fit in the time available so this will not be supported.  One can always have multiple server processes and attached tables for genuinely inter-database operations.  This said, a single database holds arbitrarily many catalogs and schemas and application objects of all sorts.&lt;/p&gt;
&lt;p&gt;In terms of schedule, we do the single copy per partition right now. Duplicate and triplicate copies of partitions are needed as we do some of our web scale things in the pipeline.  So a degree of this  supported even now but without seamless recovery, so when a replica is offline, the remaining copy is read only.  Making this read-write is a matter of a little programming.  DDL operations will continue to require all nodes to be online.&lt;/p&gt;
&lt;p&gt;As of this writing, we are making the regular test suite run on a cluster with the above described partitioning, a single copy per partition.  After this, the database layout will stay constant.  The first deployments will go out without replicated partitions. Replicated partitions will follow shortly, together with some of the optimizations mentioned in previous posts.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">4</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T16:32:43.000-04:00</n0:modified></item><item><title>Architectures for Infinity</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1339</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1339</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1339#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1339</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1339</n0:commentRss><pubDate>Mon, 14 Apr 2008 09:41:42 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Architectures for Infinity&lt;/div&gt;
&lt;p&gt;A while back, a friend suggested he and I go check out the &lt;a href=&quot;http://www.kurzweilai.net/&quot; id=&quot;link-idfed3e58&quot;&gt;Singularity
Summit&lt;/a&gt;, a conference where they talk of strong AI.  Well, I am not a
singularist.  But since singularists are so brazenly provocative, I
looked a little to see if there is anything there, engineering-wise.&lt;/p&gt;
&lt;p&gt;So, for a change, we&amp;#39;ll be visionary.  Read on, I also mention &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id109a58e8&quot;&gt;RDF&lt;/a&gt; at the end.&lt;/p&gt;
&lt;p&gt;I will not even begin with arguments about indefinitely continuing a
trend.  I will just say that nature has continuous and discontinuous
features.  Computing is at a qualitative bend and things are not as
simple as they are blithely cracked up to be.  Read HEC, the high end
crusader; he has good commentary on architecture.  Having absorbed and
understood this, you can talk again about a billion-fold increase in
computing price/performance.&lt;/p&gt;
&lt;p&gt;When I looked further, about uploading, i.e., the sci-fi process of
scanning a brain and having it continue its function inside a
computer simulation, I actually found some serious work.  &lt;a href=&quot;http://p9.hostingprod.com/@modha.org/&quot; id=&quot;link-id10bf26d0&quot;&gt;Dharmendra
Modha&lt;/a&gt; at IBM had made a rat-scale cortical simulator running on a 32K
node IBM BlueGene, with a 9x slowdown from real time.  This is real
stuff and in no way meant to be associated with singularism by being
mentioned in the same paragraph.  Anyway, I was intrigued.&lt;/p&gt;
&lt;p&gt;So I asked myself if I could do better.  I gave it a fair try, as fair
as can be without an actual experiment.  The end result is that
latency rules.  To have deterministic semantics, one must sync across
tens of thousands of processors and one cannot entirely eliminate
multi-hop messages on the interconnect fabric.  If one optimistically
precalculates and spreads optimistic results over the cluster, rolling
them back will be expensive.  Local optimistic computation may have
little point since most data points will directly depend on non local
data.  One needs two sets of wiring, a 3D torus for predominantly
close range bulk and a tree for sync, just like the BlueGene has.
Making the same from newer hardware makes it more economical but
there&amp;#39;s another 8 or so orders of magnitude to go before energy
efficiency parity with biology.  Anyway, a many-times-over
qualitative gap.  Human scale in real time might be just there
somewhere in reach with the stuff now in pre-release if there were no
bounds on cost or power consumption.  We&amp;#39;d be talking billions at
least and even then it is iffy.  But this is of little relevance as
long as the rat scale is at the level of a systems test for the
platform and not actually simulating a plausible organism in some sort
of virtual environment.  Anyway, of biology I cannot judge and for the
computer science, Modha et al have it figured out about as well as can.&lt;/p&gt;
&lt;p&gt;Simulation workloads are not the same as database.  Database is easier
in a way since any global sync is very rare.  2PC seldom touches every
partition and if it does, the time to update was anyway greater than
the time to commit.  Databases are generally multi-user, with a low
level of sync between users and a lot of asynchrony.  On the
other hand, the general case of database does not have predictable
cluster locality.  Well, if one has an OLTP app with a controlled set
of transactions and reports, then one can partition just for that and
have almost 100% affinity between the host serving the connection and
the data.  With &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id10c92378&quot;&gt;RDF&lt;/a&gt; for example, such is not generally possible or
would require such acrobatics of data layout that a DBA would not even
begin.&lt;/p&gt;
&lt;p&gt;So, for database, there is a pretty much even probability for any
connection between the node running the query and any other.  True,
function shipping can make the messages large and fairly async and
latency tolerant.&lt;/p&gt;
&lt;p&gt;On the simulation side, it would seem that the wiring can mimic
locality of the simulated process.  Messages to neighbors are more
likely than messages to remote nodes.  So a 3D torus works well there,
complemented by a tree for control messages, like sending all nodes
the count of messages to expect.  Of course, the control wiring
(reduce tree) must have far less latency than a long path through the
torus wiring and steps with long message deliveries on the torus must
be rare for this to bring any profit.  Also, long distance messages
can go through the tree wiring if the volume is not excessive, else
the tree top gets congested.&lt;/p&gt;
&lt;p&gt;So, looking past the multicore/multithread and a single level switched
interconnect, what would the architecture of the total knowledge
machine be?  For the neural simulation, the above-described is the
best I can come up with and IBM already has come up with it anyway.
But here I am more concerned with a database/symbol processing
workload than about physical simulation.  For the record, I&amp;#39;ll say
that I expect no strong AI to emerge from these pursuits but that they
will still be useful, basically as a support for a linked data
&amp;quot;planetary datasphere.&amp;quot;  Like Google, except it supports arbitrary
queries joining arbitrary data at web scale.  This would be a couple
of orders of magnitude above the text index of same.  Now, in
practice, most queries will be rather trivial, so it is not that the 2
orders of magnitude are always realized.  This would also involve a
bit more updating than the equivalent text index since reports would
now and then include private materialized inference results.  As a
general rule, backward chaining would be nicer, since this is read
only but some private workspaces for distilling data cannot be
avoided.&lt;/p&gt;
&lt;p&gt;So, given this general spec, where should architecture go?  We can talk of processors, networks and software in turn.&lt;/p&gt;
&lt;h3&gt;Processors &lt;/h3&gt;
&lt;p&gt;For evaluating processors, the archetypal task is doing a single
random lookup out of a big index.  Whether it is a B tree or hash is not
really essential since both will have to be built of fixed size pages
and will have more than one level.  Both need some serialization for
checking if things are in memory and for pinning them in cache for the
duration of processing.  This is eternally true as long as updates are
permitted, even if RAM were the bottom of the hierarchy.  And if not,
then there is the checking of whether a page is in memory and the
logic for pinning it.&lt;/p&gt;
&lt;p&gt;This means critical sections on shared data structures with  small memory writes inside.  This is
anathema, yet true.  So, what the processor needs is shared memory for
threads and if possible an instruction for entry into a read-write
lock.  If the lock is busy, there should be a settable interval before
the thread is removed from the core.  With a multithread core, this
should be just like a memory cache miss.  Only if this were really
prolonged would there be an interrupt to run the OS scheduler to
vacate the thread and load something else, and not even this if the
number of executable threads were less or equal the number of threads
on the cores.  &lt;/p&gt;
&lt;p&gt;For thread sync structures, the transactional memory ideas on the SPARC ROC
might be going in this direction.  For on-core threading, I have not
tried how well SPARC T2 does but with the right OS support, it might
be in the ballpark.  The X86_64 chips have nice thread speed but the
OS, whether Solaris or Linux, is a disaster if a mutex is busy.  Don&amp;#39;t
know why but so it is.&lt;/p&gt;
&lt;p&gt;Things like IBM Cell, with multiple integrated distributed memory
processors on a chip might be workable if they had hardware for global
critical sections and if sub-microsecond tasks could be profitably
dispatched to the specialized cores (synergistic unit in Cell
terminology).  If an index lookup, about 2-4 microseconds of real
time, could be profitably carried out on a synergistic core without
sinking it all in sync delays on the main core, there might be some
gain to this.  Still, operations like cache lookups tend to be pointer
chasing and latency of small memory reads and sometimes writes is a
big factor.  I have not measured Cell for this but it is not
advertised for this sort of workload.  It might do nicely for the
neuron simulator but not for generic database, I would
guess.&lt;/p&gt;
&lt;h3&gt;Networks and Data Center &lt;/h3&gt;
&lt;p&gt;The point at which distributed memory wins over shared determines the
size of the single compute node.  Problems of threads and critical
sections fall off but are replaced by network and the troubles of
scheduling and serializing and de-serializing messages.  There are
really huge shared memory systems (by Cray, for example) but even there,
hitting the wrong address sends a high latency message over an
internal switched fabric, a bit like a network page fault.  Well, if
one has millions of threads runnable for catching the slack of memory access over interconnect,
this might not be so bad, but this is not really the
architecture for a general purpose database.  So, at some point, we
have clearly demarcated distributed memory with affinity of data to processor, simple as that.&lt;/p&gt;
&lt;p&gt;For now, the high end clustered database benchmarks run off 1 Gbit
ethernet fabrics with some 30 compute nodes on a single switch.  This
is for shared nothing systems.  For shared disk, cache fusion systems
like Oracle RAC, we have more heavy duty networking like Infiniband,
as one would expect.  I have discussed the merits of cache fusion vs
shared nothing partitioning on in a previous post.&lt;/p&gt;
&lt;p&gt;As long as we are at a scale that fits on a single switch with even
port to port latency, we are set.  For an &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x1c4a5de8&quot;&gt;RDF&lt;/a&gt; workload, throughput is
not really the issue but latency can be.  With today&amp;#39;s technology,
nodes with 4-8 cores and 16G RAM are practical and their number is
most often not really large.  Adding two orders of magnitude, we get
more questions.  Let&amp;#39;s say that 2 billion triples fit with relative
comfort but not without disk on a 16G RAM node.  This would make 500 nodes for a trillion triples. &lt;/p&gt;
&lt;p&gt;This is an entirely relevant and reasonable scale, considering that
loading all public biomedical sets plus a pharma company&amp;#39;s in house
data could approach this ballpark.  Let alone anything on the scale of
the social web, i.e., the online conversation space.&lt;/p&gt;
&lt;p&gt;So how to manage clusters like this?  The current cluster gear is
oriented toward switch trees and is fairly expensive, about $1000 per
node.  To make this easy, we would need a wiring free, modular
architecture.  Picture a shelf with SATA drive size bays, each would
get a compute node of 8 cores and 16G plus interconnect.  To simplify
the network, the module would have a laser on each side, for a cube
network topology, the enclosure could connect the edges with fiber
optics for the 3D torus.  Mass storage would be in the same form
factor, as disks or flashes to be interspersed in the proper ratio
with compute nodes.  All would have the same communication chip,
something like a Cray SeaStar with 6 or 7 external ports.  A seventh
port could be used for a reduce tree.  The rack would provide cooling
on the shelves by circulating a coolant fluid.  Reconfiguring and
scaling would be a matter of adding shelves to the cabinet and laying
out Lego bricks, blue for compute and red for storage.  The network
could achieve a latency for an arbitrary point to point message of no more than 10-20
microseconds by the right mix of cube and tree.  This in a box of
thousands of nodes.&lt;/p&gt;
&lt;p&gt;This type of layout would accommodate web scale without needing rows and rows of rack cabinets.&lt;/p&gt;
&lt;p&gt;The external interfaces for web requests and replies are no big deal
after this, since the intra-cluster traffic is orders of magnitude
higher than the result set traffic.  After all, the end user does not
want dumps of the database but highly refined and ranked results.&lt;/p&gt;
&lt;h3&gt;Software &lt;/h3&gt;
&lt;p&gt;We have previously talked about dynamic partitions a la Google
Bigtable or Amazon Dynamo.  These techniques are entirely fine and
will serve for the universal knowledge store.  &lt;/p&gt;
&lt;p&gt;But what about query logic?  OK, having a consistent map of partitions
shared over tens of thousands of nodes is entirely possible.  So is
replication and logic for using a spatially closer partition when
multiple copies are know to exist.  These things take some programming
but there is nothing really new about them.  These are a direct straightforward extension of what we do for clustering right now. &lt;/p&gt;
&lt;p&gt;But look to windward.  How to run complex queries and inference on the
platform outlined above?  There are some features of RDF querying like
same-as that can be easily parallelized, backward-chaining style: Just
proceed with the value at hand and initiate the lookup of synonyms and
let them get processed when they become available.  Same for subclass
and sub-property.  We already do this, but could do it with more
parallelism.&lt;/p&gt;
&lt;p&gt;No matter what advances in architecture take place, I do not see a
world where every user materializes the entailment of their own
same-as-es and rules over a web scale data set.  So, backward chaining
approaches to inference must develop.  Luckily, what most queries need
is simple.  A rule-oriented language, like Prolog without cut will
parallelize well enough.  Some degree of memoization may be
appropriate for cutting down on re-proving the same thing over and
over.  Memoization over a cluster is a problem though, since this
involves messages.  I should say that one should not go looking for
pre-proven things beyond the node at hand and that computation should
not spread too quickly or too promiscuously so as not to make long
message paths.  We must remember that a totally even round trip time
on a large cluster just will not happen.&lt;/p&gt;
&lt;p&gt;Query planning on any system critically depends on correct ballpark
guesses on cardinality.  If predicates are amplified with transitivity
and same-as at run time, the cardinality guessing becomes harder.
This can kill any plan no matter the hardware.  Probably, an executing
query must be annotated with the underlying cardinality assumptions.
If these prove radically false, the execution may abort and a new plan
be made to better match what was found out.  This bears some looking into.  &lt;/p&gt;
&lt;p&gt;There are some network algorithms like shortest path, traveling
salesman and similar that probably deserve a special operator in the
query language.  These can benefit from parallelization and a
sequential implementation running on a cluster with latency will be a
disaster.  Expressing the message flow in a rule language is not
really simple and pretty much no programmer will either appreciate the necessity
or go to the trouble.  Therefore such things should likely be offered by the platform and made by the few people who understand such matters.&lt;/p&gt;
&lt;p&gt;For forward chaining, it seems that any results should generally go
into their own graph so as not to pollute the base data.  This graph,
supposing it is small enough, can have different partitioning from
the large base data set.  If the data comes from far and wide but
results are local, there is better usage of a RETE like algorithm for
triggering inference when data comes in.  RETE will parallelize well
enough, also for clusters,results just have to be broadcast to the
nodes that may have a use for them.&lt;/p&gt;
&lt;p&gt;The programming model will typically be using a set of local overlays
on a large shared data set.  Queries will most often not be against a
single graph.  Strict transactionality will be the exception rather
than the rule.  At the database node level, there must be
real transactionality even if the whole system most often did not run with
strict ACID semantics.  This is due to ACID requirements of some
internal ops, e.g., some bitmap index operations,  log checkpoints, DDL changes, etc.&lt;/p&gt;
&lt;p&gt;For procedural tasks, map-reduce is OK.  We have it even
&lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1270&quot; id=&quot;link-id10b7ac00&quot;&gt;in our SQL&lt;/a&gt;.  Map-reduce is not the basis for making a
DBMS but it is a nice feature for some parts of query evaluation and application logic.&lt;/p&gt;
&lt;p&gt;We have not talked about linking the data itself, but there is a whole workshop on this next week in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id14a5aa00&quot;&gt;Beijing&lt;/a&gt;; I will write about it separately.  
Let this just serve to state that we are serious about the platform for this, present and future.&lt;/p&gt;
&lt;h3&gt;Conclusion &lt;/h3&gt;
&lt;p&gt;The web scale database, the Google with arbitrary joining and
inference, is one generation away, talking of economical
implementation.  Today, a price tag of $100K will buy some 50-100
billion triples worth with reasonable query response.  Unlimited
budget will take this a bit further, like one order of magnitude. and
then, returns might be decreasing.&lt;/p&gt;
&lt;p&gt;Of course, this is worth nothing if the software isn&amp;#39;t there.
&lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-idfdcf058&quot;&gt;Virtuoso&lt;/a&gt; with its cluster edition will allow one to use unlimited RAM and
processors.  The frontier is now at getting just the right parallelism for
each task, including inference ones.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>architecture</category><category>hpc</category><category>semanticweb</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T13:19:58.10000-04:00</n0:modified></item><item><title>Virtuoso Cluster Update</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1338</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1338</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1338#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1338</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1338</n0:commentRss><pubDate>Mon, 14 Apr 2008 09:41:41 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Virtuoso Cluster Update&lt;/div&gt;
&lt;p&gt;We now have &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id10beda60&quot;&gt;Virtuoso&lt;/a&gt; 6 running most of its test suite in single process and cluster modes.  It is now time to finalize how it is to be configured and deployed.  A bit more on this later.&lt;/p&gt;
&lt;p&gt;We would have been done in about half time if we had not also redone the database physical layout with key compression.  Still, if we get 3x more data in the same memory, using 64 bit ids for everything, the effort is justified.  For any size above 2 billion triples, this means 3x less cost.&lt;/p&gt;
&lt;p&gt;A good amount of the time and effort goes into everything except the core.  Of course, we first do the optimizations we find appropriate and measure them.  After all, the rest has no point if these do not run in the desired ballpark.&lt;/p&gt;
&lt;p&gt;For delivering something, the requirements are quite the opposite: For example, when when defining a unique index, what to do when the billionth key turns out not to be unique?  And then what if one of the processes is killed during the operation?  Does it all come out right also when played from the roll forward log?  See what I mean?  There is no end of such.&lt;/p&gt;
&lt;p&gt;So, well after we are done with the basic functionality, we have to deal with this sort of thing.  Even if we limited ourselves to &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0xa1c2a768&quot;&gt;RDF&lt;/a&gt; workloads only in the first cut, we still would need to do this since maintaining this would simply not be possible without some generic DBMS functionality.  So we get the full feature generic clustered RDBMS in the same cut, no splitting the deliverable.&lt;/p&gt;
&lt;p&gt;The basic cluster execution model is described &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusterprogrammingsqlexmod.html&quot; id=&quot;link-id14a5cab0&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are some further optimizations that we will do at and around the time of first public cut.&lt;/p&gt;
&lt;p&gt;These have to do mostly with execution scheduling.  For example, a bitmap intersection join must be done differently from a single server when there is latency in getting the next chunk of bits.  Value sub-queries, derived tables and existences must be started as batches, just like joined tables.&lt;/p&gt;
&lt;p&gt;Having too many threads on an index is no good.  But having a large batch of random lookups to work with, even when each of them does not have its own thread, gives some possibilities for IO optimization. When one would block for disk, start the disk asynchronously, like with a read ahead and do the next index lookup from the batch.  This is specially so in cluster situations where the index lookups naturally come in &amp;quot;pre-vectored&amp;quot; batches.  You could say that the loop join is rolled out.  This is done anyhow for message latency reasons.&lt;/p&gt;
&lt;p&gt;Do we optimize for the right stuff?  Well, looking into the future, it does not look like regular RAM will be the bottom of the storage hierarchy, no matter how you look at it.  With solid state disks, locality may not be so important but latency is there to stay.  With everything now growing sideways, as in number of cores and core multithreading, we are just looking to deepening our already warm and intimate relationship with the Moira which cuts the thread, Atropos, Lady Latency.  The attention of the best minds of the industry is devoted to thee. pouring forth of the effort of the best minds in the industry.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>semanticweb</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">3</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T12:42:22.6000-04:00</n0:modified></item><item><title>Virtuoso 5.0.6 Updates</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1327</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1327</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1327#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1327</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1327</n0:commentRss><pubDate>Tue, 25 Mar 2008 17:23:24 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Virtuoso 5.0.6 Updates&lt;/div&gt;
&lt;p&gt;I will here summarize the developments since the last &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0x17765540&quot;&gt;Virtuoso&lt;/a&gt; 5 Open Source release.&lt;/p&gt; &lt;p&gt;On the &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x1d8eb970&quot;&gt;RDF&lt;/a&gt; side, the bitmap intersection join has been improved quite a bit so that it is now almost always more than 2x more efficient than the equivalent nested loop join.&lt;/p&gt; &lt;p&gt;XML trees in the object position in RDF quads were in some cases incorrectly indexed, leading to failure to retrieve quads.  This is fixed and should problems occur in existing databases, they can be corrected by simply dropping and re-creating an index.&lt;/p&gt; &lt;p&gt;Also the cost model has been further tuned.  We have run the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x17508ee8&quot;&gt;TPC-H&lt;/a&gt; queries with larger databases and have profiled it extensively.  There are improvements to locking, especially for concurrency of transactions with large shared lock sets, as is the case in the TPC-H queries.  The rules stipulate that these have to be run with repeatable read.  There are also optimizations for decimal floating point.&lt;/p&gt; &lt;p&gt;A sampling of TPC-H queries translated into &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x18365440&quot;&gt;SPARQL&lt;/a&gt; comes with the new demo database.  These show a live sample of the TPC-H schema translated into linked data, complete with SPARQL translations of the original queries.  Some work is still ongoing there but the relational to RDF mapping is mature enough for real business intelligence applications now.&lt;/p&gt; &lt;p&gt;On the closed source side, we have some adjustments to the virtual database.  When using Virtuoso as a front end to Oracle, using the TPC-H queries as a metric, the virtual database overhead is minimal.  Previously, we had some overhead because some queries were rewritten in a way that Oracle would not optimize as well as the original TPC-H text.  Specifically, turning an IN sub-query predicate into an equivalent EXISTS did not sit well with Oracle.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>semanticweb</category><category>sparql</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">4</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T14:02:55.000-04:00</n0:modified></item><item><title>TPC H as Linked Data (Updated)</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1322</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1322</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1322#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1322</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1322</n0:commentRss><pubDate>Thu, 06 Mar 2008 16:34:12 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;TPC H as Linked Data (Updated)&lt;/div&gt;
&lt;p&gt;We have a new demo online at &lt;a href=&quot;http://demo.openlinksw.com/tpc-h&quot; id=&quot;link-idfec5de0&quot;&gt;http://demo.openlinksw.com/tpc-h&lt;/a&gt;. This takes the industry standard &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x18aa62c8&quot;&gt;TPC-H&lt;/a&gt; benchmark data and presents it as linked data with a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xd252bd0&quot;&gt;SPARQL&lt;/a&gt; end point and dereferenceable URIs. &lt;/p&gt;
&lt;p&gt;This is an example of using &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0x17cfc2f0&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s relational to &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x17a3b490&quot;&gt;RDF&lt;/a&gt; mapping for publishing business data, for browsing using the linked data principles and opening it to analytics queries in SPARQL.&lt;/p&gt;
&lt;p&gt; As noted before, we have extended SPARQL with aggregation and nested queries, thus making it a viable SQL substitute for decision support queries. &lt;/p&gt;
&lt;p&gt;The article at &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSTPCHLinkedData&quot; id=&quot;link-id10320e88&quot;&gt;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSTPCHLinkedData&lt;/a&gt; gives details and the source code for the implementation.&lt;/p&gt;
&lt;p&gt; We are still working on some aspects of the more complex TPC-H queries, thus the demo is not complete with all the 22 queries. This is however enough to see a representative sample of how analytics queries work with SPARQL and Virtuoso&amp;#39;s SQL-to-RDF mapping. The demo will be part of the next Virtuoso Open Source download, probably out next week.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>semanticweb</category><category>sparql</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">5</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T14:02:53.000-04:00</n0:modified></item><item><title>What&amp;#39;s Wrong With LUBM?</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1313</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1313</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1313#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1313</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1313</n0:commentRss><pubDate>Tue, 05 Feb 2008 12:32:40 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;What&amp;#39;s Wrong With LUBM?&lt;/div&gt;
&lt;p&gt;In the interest of participating in a community benchmark development process, I will here outline some desiderata and explain how we could improve on LUBM.  I will also touch on the message such an effort ought to convey.&lt;/p&gt;
&lt;p&gt;A blow-by-blow analysis of the performance of a complex system such as a DBMS is more than fits within the scope of human attention at one go.  This is why this all must be abbreviated into a single metric. Only when thus abbreviated, can this information be used in context. The metric&amp;#39;s practical value is relative to how well it predicts the performance of the system in some real task.  This means a task not likely to be addressed by an alternative technology, unless the challenger  clearly beats the incumbent.&lt;/p&gt;
&lt;p&gt;A benchmark is promotional material, both well as for the technology being benchmarked as a whole.  This is why the benchmark, whatever it does, should do something that the technology does well, surely better than any alternative technology.  A case in point is that one ought not to take a pure relational workload and &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x17a49f40&quot;&gt;RDF&lt;/a&gt;-ize it, for then the relational variant is likely to come out on top.&lt;/p&gt;
&lt;p&gt;In this regard LUBM is not so bad because its reliance on class and property hierarchies and the occasional transitivity or inference rule makes the workload typically RDF, a little ways apart from a purely relational implementation of the task.&lt;/p&gt;
&lt;p&gt;RDF&amp;#39;s claim to fame is linked data.  This means giving things globally unique names and thereby making anything joinable with anything else, insofar there is agreement on the names.  RDF is a key to a new class of problems, call it web scale database.  Web scale here refers first to heterogeneity and multiplicity of independent sources and secondly to volume of data.&lt;/p&gt;
&lt;p&gt;Now there are plenty of relational applications with very large volumes of data.  On the non-relational side, there are even larger applications, such as web search engines.  All these have a set schema and a specific workload they are meant to address.  RDF versions of such  are conceivable but hold no intrinsic advantage if considered in the specific niche alone.&lt;/p&gt;
&lt;p&gt;The claim to fame of RDF is not to outperform these on their home turf but to open another turf altogether, allowing agile joining and composing of all these resources.&lt;/p&gt;
&lt;p&gt;This is why a benchmark, i.e., an an advertisement for the RDF value proposition, should not just take a relational workload and RDF-ize it.  The benchmark should carry  some of the web in it.&lt;/p&gt;
&lt;p&gt;If we just intend to measure how well an RDF store joins triples to other triples, LUBM is almost good enough.  If it defined a query mix with different frequencies for short and long queries and a concurrent query metric, it would be pretty much there.  Our adaptation of it is adequate for counting joins per second.  But joins per second is not a value proposition.&lt;/p&gt;
&lt;p&gt;So we have two questions: &lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
  &lt;p&gt;If we just take the RDF model and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xde09238&quot;&gt;SPARQL&lt;/a&gt;, how do we make a benchmark that fills in what LUBM does not cover?&lt;/p&gt;
 &lt;/li&gt;
&lt;li&gt;How do we make a benchmark that displays RDF&amp;#39;s strengths against a comparable relational solution?  A priori, by going somewhere where SQL has trouble reaching.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The answers to the first are not very complex:&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
  &lt;p&gt;Add some optionals.  Have different frequencies of occurrence for some properties.&lt;/p&gt;
 &lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;Add different graphs.  Make queries joining between graphs and drawing on different graphs. Querying against all graphs of the store is not a part of the language.  Still this would be useful but leave it out for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;Add some filters and arithmetic.  Not much can be done there, though because expressions cannot be returned and there is no aggregation or grouping.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;Split the workload into short and long queries.  The short should be  typical for online use and the long ones for analysis.  Different execution  frequencies for different queries is a must.  Analysis is  limited by lack of grouping, expressions or aggregation.  Still,  something can be contrived by looking for a pattern that does not  exist or occurs extremely rarely.  Producing result sets of millions  of rows is not realistic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;Many of the LUBM queries return thousands of rows, even when scoped to a single university.  This is not very realistic.  No user interface displays that sort of quantity.  Of course, the intermediate results can be large as you please but the output must be somehow ranked.  SPARQL has order by and limit, so these will have to be used.  &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0xa0f3c620&quot;&gt;TPC-H&lt;/a&gt; for example has almost always a group by/order by combination and sometimes a result rows limit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;The degree of inference in LUBM is about right, mostly sub-classes and sub-properties, nothing complex.  We certainly regard this as a database benchmark more than a knowledge representation or rule system one. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
  &lt;p&gt;LUBM does an OK job of defining a scale factor.  I think that a  concurrent query metric can just be so many queries per time at a  given scale.  The number of clients, I would say, can be decided by  the test sponsor, taking whatever works best.  A load balancer or  web server can always be tuned to enforce some limit on concurrency.  I don&amp;#39;t think that a scale rule like in TPC C, where it says that  only so many transactions per minute are allowed per warehouse is  needed here.  The effect of this is that when reporting a higher  throughput, one has to automatically have a bigger database.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is nothing to prevent these improvements from being put into a subsequent version of LUBM.&lt;/p&gt;
&lt;p&gt;Building something that shows RDF at its best is  a slightly different proposition. For this, we cannot be limited to the SPARQL recommendation and must allow custom  application code and language extensions.  Examples would be scripting similar to SQL stored procedures and extensions such as we have made for sub-queries and aggregation, explained a couple of posts back. &lt;/p&gt;
&lt;p&gt;Maybe the Billion Triples challenge produces some material that we can use for this.  We need to go for spaces that are not easily reached with SQL, have distributed computing, federation, discovery, demand driven import of data and such like.  &lt;/p&gt;
&lt;p&gt;I&amp;#39;ll write more about ways of making RDF shine in some future post. &lt;/p&gt;
&lt;p&gt;There are two kinds of workloads: online and offline.  Online is what must be performed in an interactive situation, without significant human perceptible delay, i.e. within 500 ms.  Anything else is offline. &lt;/p&gt;
&lt;p&gt;Because this is how any online system is designed, this should be reflected in the benchmark.  Ideally we would make two benchmarks.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>lubm</category><category>benchmarking</category><category>semanticweb</category><category>sparql</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">3</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T14:02:50.000-04:00</n0:modified></item><item><title>LUBM results with Virtuoso 6.0</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1309</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1309</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1309#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1309</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1309</n0:commentRss><pubDate>Mon, 04 Feb 2008 10:26:17 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;LUBM results with Virtuoso 6.0&lt;/div&gt;
&lt;p&gt;We have now run the LUBM benchmark on &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0x1aa511d0&quot;&gt;Virtuoso&lt;/a&gt; 6, with the same configuration as discussed last Friday.&lt;/p&gt;
&lt;p&gt;We had a database of 8000 universities, and we ran 8 clients on slices of 100, 1000 and 8000 universities — same data but different sizes of working set.&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;
 100 universities: 35.3 qps
1000 universities: 26.3 qps
8000 universities: 13.1 qps&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;The 100 universities slice is about the same as with v5.0.5 (35.3 vs 33.1). &lt;br /&gt;The 8000 universities set is almost 3x better (13.1 vs. 4.8).&lt;/p&gt;
&lt;p&gt;This comes from the fact that the v6 database takes half of the space of the v5.0.5 one.  Further, this is with 64-bit IDs for everything.  If the 5.5 database were with 64-bit IDs, we&amp;#39;d have a difference of over 3x.  This is worth something if it lets you get by with only 1 terabyte of RAM for the 100 billion  triple application, instead of 3 TB.&lt;/p&gt;
&lt;p&gt;In a few more days we&amp;#39;ll give the results for &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0xa612c710&quot;&gt;Virtuoso&lt;/a&gt; 6 cluster.&lt;/p&gt;

&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>lubm</category><category>benchmarking</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">2</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-03-25T14:43:47.12000-04:00</n0:modified></item><item><title>Latest LUBM Benchmark results for Virtuoso</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1305</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1305</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1305#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1305</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1305</n0:commentRss><pubDate>Fri, 01 Feb 2008 15:16:59 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Latest LUBM Benchmark results for Virtuoso&lt;/div&gt;
&lt;p&gt;We have now taken a close look at the query side of the LUBM benchmark, as promised a couple of blog posts ago.&lt;/p&gt;
&lt;p&gt;We load 8000 universities and run a query mix consisting of the 14 LUBM queries with different numbers of clients against different portions of the database.&lt;/p&gt;
&lt;p&gt;When it is all in memory, we get 33 queries per second with 8 concurrent clients; when it is so I/O bound that 7.7 of 8 threads wait for disk, we get 5 qps. This was run in 8G RAM with 2 Xeon 5130.&lt;/p&gt;
&lt;p&gt;We adapted some of the queries so that they do not run over the whole database. In terms of retrieving triples per second, this would be about 330000 for the rate of 33 qps, with 4 cores at 2GHz. This is a combination of random access and linear scans and bitmap merge intersections; lookups for non-found triples are not counted. The rate of random lookups alone based on known G, S, P, O, without any query logic, is about 250000 random lookups per core per second.&lt;/p&gt;
&lt;p&gt;The article &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VOSArticleLUBMBenchmark&quot; id=&quot;link-id121f54d8&quot;&gt;LUBM and Virtuoso&lt;/a&gt; gives the details.&lt;/p&gt;
&lt;p&gt;In the process of going through the workload we made some cost model adjustments and optimized the bitmap intersection join. In this way we can quickly determine which subjects are, for example, professors holding a degree from a given university. So the benchmark served us well in that it provided an incentive to further optimize some things.&lt;/p&gt;
&lt;p&gt;Now, what has been said about &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x1aeb1c38&quot;&gt;RDF&lt;/a&gt; benchmarking previously still holds. What does it mean to do so many LUBM queries per second? What does this say about the capacity to run an online site off RDF data? Or about information integration? Not very much. But then this was not the aim of the authors either.&lt;/p&gt;
&lt;p&gt;So we still need to make a benchmark for online queries and search, and another for E-science and business intelligence. But we are getting there.&lt;/p&gt;
&lt;p&gt;In the immediate future, we have the general availability of &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0xda3c178&quot;&gt;Virtuoso&lt;/a&gt; Open Source 5.0.5 early next week. This comes with a LUBM test driver and a test suite running against the LUBM qualification database.&lt;/p&gt;
&lt;p&gt;After this we will give some numbers for the cluster edition with LUBM and &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1caa0558&quot;&gt;TPC-H&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>lubm</category><category>benchmarking</category><category>semanticweb</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">3</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T14:02:48.000-04:00</n0:modified></item><item><title>SPARQL Extensions for Subqueries</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1297</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1297</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1297#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1297</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1297</n0:commentRss><pubDate>Wed, 16 Jan 2008 15:47:09 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;SPARQL Extensions for Subqueries&lt;/div&gt;
&lt;p&gt;Last time I said we had extended &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c6616d0&quot;&gt;SPARQL&lt;/a&gt; for sub-queries. As a preview of the new functionality, let us look at a query from &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x17ac7450&quot;&gt;TPC-H&lt;/a&gt;.&lt;/p&gt;  
&lt;p&gt;Below is the &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/virtuoso#this&quot; id=&quot;link-id0x1b0ec750&quot;&gt;Virtuoso&lt;/a&gt; SPARQL version of Q2.&lt;/p&gt;  
&lt;blockquote&gt;
&lt;pre&gt;
sparql
define sql:signal-void-variables 1
prefix tpcd: &amp;lt;http://www.openlinksw.com/schemas/tpcd#&amp;gt;
prefix oplsioc: &amp;lt;http://www.openlinksw.com/schemas/oplsioc#&amp;gt;
prefix sioc: &amp;lt;http://rdfs.org/sioc/ns#&amp;gt;
prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt;
select
  ?supp+&amp;gt;tpcd:acctbal,
  ?supp+&amp;gt;tpcd:name,
  ?supp+&amp;gt;tpcd:has_nation+&amp;gt;tpcd:name as ?nation_name,
  ?part+&amp;gt;tpcd:partkey,
  ?part+&amp;gt;tpcd:mfgr,
  ?supp+&amp;gt;tpcd:address,
  ?supp+&amp;gt;tpcd:phone,
  ?supp+&amp;gt;tpcd:comment
from &amp;lt;http://example.com/tpcd&amp;gt;
where {
  ?ps a tpcd:partsupp ; tpcd:has_supplier ?supp ; tpcd:has_part ?part .
  ?supp+&amp;gt;tpcd:has_nation+&amp;gt;tpcd:has_region tpcd:name &amp;#39;EUROPE&amp;#39; .
  ?part tpcd:size 15 .
  ?ps tpcd:supplycost ?minsc .
  { select ?p min(?ps+&amp;gt;tpcd:supplycost) as ?minsc
    where {
        ?ps a tpcd:partsupp ; tpcd:has_part ?p ; tpcd:has_supplier ?ms .
        ?ms+&amp;gt;tpcd:has_nation+&amp;gt;tpcd:has_region tpcd:name &amp;#39;EUROPE&amp;#39; .
      }
  }
    filter (?part+&amp;gt;tpcd:type like &amp;#39;%BRASS&amp;#39;) }
order by
  desc (?supp+&amp;gt;tpcd:acctbal)
  ?supp+&amp;gt;tpcd:has_nation+&amp;gt;tpcd:name
  ?supp+&amp;gt;tpcd:name
  ?part+&amp;gt;tpcd:partkey ;
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Note the pattern  
&lt;code&gt;{ ?ms+&amp;gt;tpcd:has_nation+&amp;gt;tpcd:has_region tpcd:name &amp;#39;EUROPE&amp;#39; }&lt;/code&gt; which is a shorthand for  
&lt;code&gt;{ ?ms tpcd:has_nation ?t1 . ?t1 tpcd:has-region ?t2 . ?t2 tpcd:has_region ?t3 . ?t3 tpcd:name  &amp;quot;EUROPE&amp;quot; } &lt;/code&gt; &lt;/p&gt; 
&lt;p&gt;Also note a sub-query is used for determining the lowest supply cost for a part. &lt;/p&gt; 
&lt;p&gt;The SQL text of the query can be found in the TPC-H benchmark specification, reproduced below: &lt;/p&gt;  
&lt;blockquote&gt;
&lt;pre&gt;select s_acctbal, s_name, n_name,
        p_partkey, p_mfgr, s_address,
        s_phone, s_comment
from part, supplier, partsupp, nation, region
where
        p_partkey = ps_partkey
        and s_suppkey = ps_suppkey
        and p_size = 15
        and p_type like &amp;#39;%BRASS&amp;#39;
        and s_nationkey = n_nationkey
        and n_regionkey = r_regionkey
        and r_name = &amp;#39;EUROPE&amp;#39;
        and ps_supplycost = (
                        select min(ps_supplycost)
                        from partsupp, supplier, nation, region
                        where
                                p_partkey = ps_partkey
                                and s_suppkey = ps_suppkey
                                and s_nationkey = n_nationkey
                                and n_regionkey = r_regionkey
                                and r_name = &amp;#39;EUROPE&amp;#39;)
order by
        s_acctbal desc, n_name, s_name, p_partkey;
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt; For brevity we have omitted the declarations for mapping the TPC-H schema to its &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0xd044708&quot;&gt;RDF&lt;/a&gt; equivalent.  The mapping is straightforward, with each column mapping to a predicate and each table to a class.&lt;/p&gt;
&lt;p&gt; This is now part of the next Virtuoso Open Source cut, due around next week. &lt;/p&gt;
&lt;p&gt; As of this writing we are going through the TPC-H query by query and testing with mapping going to Virtuoso and Oracle databases.  &lt;/p&gt;
&lt;p&gt; Also we have been busy measuring Virtuoso 6.  Even after switching from 32-bit to 64-bit IDs for IRIs and objects, the new databases are about half the size of the same Virtuoso 5.0.2 databases.  This does not include any stream compression like gzip for disk pages. The load and query speeds are higher because of better working set.  For all in memory, they are about even with 5.0.2.  So now on an 8G box, we load 1067 million LUBM triples at 39.7 Kt/s instead of 29 Kt/s with 5.0.2. Right now we experimenting with clusters at Amazon EC2.  We&amp;#39;ll write about that in a bit. &lt;/p&gt; 
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>database</category><category>databases</category><category>lubm</category><category>benchmarking</category><category>semanticweb</category><category>sioc</category><category>sparql</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">3</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2008-04-14T14:02:43.000-04:00</n0:modified></item><item><title>Retrospective and Outlook for 2008</title><guid>http://www.openlinksw.com/blog/vdb/blog/?id=1287</guid><link>http://www.openlinksw.com/blog/vdb/blog/?id=1287</link><comments>http://www.openlinksw.com/blog/vdb/blog/?id=1287#comments</comments><n0:comment xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/mt-tb/Http/comments?id=1287</n0:comment><n0:commentRss xmlns:n0="http://wellformedweb.org/CommentAPI/">http://www.openlinksw.com/blog/vdb/blog/gems/rsscomment.xml?:id=1287</n0:commentRss><pubDate>Tue, 18 Dec 2007 12:22:21 GMT</pubDate><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Retrospective and Outlook for 2008&lt;/div&gt;
&lt;p&gt;At this close of the year, I&amp;#39;ll give a little recap over the past year in terms of &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id103d2cb0&quot;&gt;Virtuoso&lt;/a&gt; development and a look at where we are headed for 2008.  &lt;/p&gt; &lt;p&gt;A year ago, I was in the middle of redoing the Virtuoso database engine for better SMP performance.  We redid the way traversal of index structures and cache buffers was serialized for SMP and generally compared Virtuoso and Oracle engines function by function.  We had just returned from the ISWC 2006 in Athens, Georgia and the Virtuoso database was becoming a usable triple store.&lt;/p&gt; &lt;p&gt;Soon thereafter, we comfirmed that all this worked when we put out the first cut of &lt;a href=&quot;http://dbpedia.org/&quot; id=&quot;link-idf8b4728&quot;&gt;Dbpedia&lt;/a&gt; with Chris Bizer et al and were working with Alan Ruttenberg on what would become &lt;a href=&quot;http://esw.w3.org/topic/HCLS/Banff2007Demo&quot; id=&quot;link-id10397930&quot;&gt;the Banff health care and life sciences demo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://www2007.org/&quot; id=&quot;link-id10335160&quot;&gt;WWW 2007 conference in Banff&lt;/a&gt;, Canada, was a sort of kick-off for the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id102cc0c8&quot;&gt;Linking Open Data&lt;/a&gt; movement, which started as a community project under &lt;a href=&quot;http://www.w3.org/2001/sw/sweo/&quot; id=&quot;link-idfbe9cb8&quot;&gt;SWEO&lt;/a&gt;, the W3C interest group for Semantic Web Education and Outreach, and has gained a life of its own since.&lt;/p&gt; &lt;p&gt;Right after WWW 2007 the Virtuoso development effort split on two tracks, one for enhancing the then new 5.0 release and one for building a new generation of Virtuoso, notably featuring clustering and double storage density for RDF.&lt;/p&gt; &lt;p&gt;The first track produced constant improvements to the relational to RDF mapping functionality, SPARQL enhancements, Redland, Jena and Sesame compatible client libraries with Virtuoso as as a triple store.  These things have been out with testers for a while and are all generally available as of this writing.  &lt;/p&gt; &lt;p&gt;The second track started with adding key compression to the storage engine, specifically with regard to RDF, even though there are some gains in relational applications as well.  With RDF, the space consumption drops to about half, all without recourse to any non-random access compatible compression like gzip.  Since the start of August, we turned to clustering and are now code complete, pretty much with all the tricks one would expect, of course full function SQL and taking advantage of colocated joins and doing aggregation and generally all possible processing where the data is.  I have covered details of this along the way in previous posts.  The key ppoint is that now the thing is written and works with test cases. &lt;/p&gt; &lt;p&gt;In late October, we were at the W3C workshop for mapping relational data to RDF.  For us, this confirmed the importance of mapping and scalability in general.  Ivan Herman proposed forming a W3C incubator group on benchmarking.  Also a W3C incubator group of relational to RDF mapping is being formed.  &lt;/p&gt; &lt;p&gt;Now, scalability has two sides.  One is dealing with volume and the other is dealing with complexity.  Volume alone will not help if interesting queries cannot be formulated.  Hence we recently extended SPARQL with subqueries so that we can now express at least any SQL workloads, which was previously not the case.  It is sort of a contradiction in terms to say that SPARQL is the universal language for information integration while not being able to express for example the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-idf7ac7e8&quot;&gt;TPC H&lt;/a&gt; queries.  Well, we fixed this.  A separate post will jhighlight how.  The W3C process will eventually follow, as the necessity of these things is undeniable, on the unimpeachable authority of the whole SQL world.  Anyway, for now, SPARQL as it is ought to become a recommendation and extensions can be addressed later.&lt;/p&gt; &lt;p&gt;For now, the only RDF benchmark that seems to be out there is the loading part of the LUBM.  We did a couple of enhancements of our own for that just recently but much bigger things are on the way.  Also, the billion triples challenge is an interesting initiative in the area.  We all recognize that loading any number of triples is a finite problem with known solutions.  The challenge is running interesting queries on large volumes.  &lt;/p&gt; &lt;p&gt;Our present emphasis is demonstrating both RDF data warehousing and RDF mapping with complex queries and large data.  We start with the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-idfcf8470&quot;&gt;TPC H&lt;/a&gt; benchmark and doing the queries both through mapping to SQL against any RDBMS, Oracle, DB2, Virtuoso or other, and by querying the physical RDF rendition of the data in Virtuoso.  From there, we move to querying a collection of RDBMS&amp;#39;s hosting similar data. &lt;/p&gt; &lt;p&gt;Doing this with performance at the level of direct SQL in the case of mappping and not very much slower with physical triples is an important milestone on the way to real world enterprise data web.  Real life has harder and more unexpected issues than a benchmark but at any rate doing the benchmark without breaking a sweat is a step on the way.  We sent a paper to ESWC 2008 about that but it was rather incomplete.  By the time of the VLDB submissions deadline in March we&amp;#39;ll have more meat.&lt;/p&gt; &lt;p&gt;Another tack soon to start is a rearchitecting of &lt;a href=&quot;http://zitgist.com/&quot; id=&quot;link-id104024b8&quot;&gt;Zitgist&lt;/a&gt; around clustered Virtuoso.  Aside matters of scale, we will make a number of qualitatively new things possible.  Again, more will be released in the first quarter of 08.&lt;/p&gt; &lt;p&gt;Beyond these short and mid-term goals we have the introduction of entirely dynamic and demand driven partitioning, a la Google Bigtable or Amazon Dynamo.  Now, regular partitioning will do for a while yet but this is the future when we move the the vision of linked dataeverywhere.&lt;/p&gt; &lt;p&gt;In conclusion, this year we have built the basis and the next year is about deployment.  The bulk of really new development is behind us and now we start applying.  Also, the community will find adoption easier due to our recent support of the common RDF API&amp;#39;s. &lt;/p&gt; 
&lt;a href=&quot;index.vspx?tag=benchmarking&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;benchmarking&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=sparql&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;sparql&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=rdf&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;rdf&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=sem web&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;sem web&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=semantic web&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;semantic web&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=database&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;database&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=databases&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;databases&lt;/a&gt;
&lt;/div&gt;</description><author>Virtuso Data Space Bot &lt;kidehen@openlinksw.com&gt;</author><category>benchmarking</category><category>sparql</category><category>rdf</category><category>sem web</category><category>semantic web</category><category>database</category><category>databases</category><n0:version xmlns:n0="http://www.openlinksw.com/weblog/">1</n0:version><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2007-12-18T07:22:21.6000-05:00</n0:modified></item>
</channel>
</rss>
