<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>

<title>OpenLink Community Blog</title><link>http://www.openlinksw.com:443/weblog/dav/dav-blog-1/</link><description>A Collection of blogs by OpenLink Staff</description><managingEditor>kidehen@openlinksw.com</managingEditor><pubDate>Tue, 06 Oct 2026 04:58:21 GMT</pubDate><generator>Virtuoso Universal Server 08.03.3334</generator><webMaster>kidehen@openlinksw.com</webMaster><image><title>OpenLink Community Blog</title><url>http://www.openlinksw.com:443/weblog/public/images/vbloglogo.gif</url><link>http://www.openlinksw.com:443/weblog/dav/dav-blog-1/</link><description>A Collection of blogs by OpenLink Staff</description><width>88</width><height>31</height></image>
<item><title>New Semantic Publishing Benchmark Record</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2016-01-11#1867</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1867#comments</comments><pubDate>Mon, 11 Jan 2016 15:22:22 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2016-01-11T15:25:17.969354</n0:modified><description>&lt;p&gt;There is a new &lt;a href=&quot;http://ldbcouncil.org/developer/spb&quot; id=&quot;link-id0x7fd87214c348&quot;&gt;SPB (Semantic Publishing Benchmark)&lt;/a&gt; 256 Mtriple record with &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x7fd870d26a48&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As before, the result has been measured with the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x7fd870d26be8&quot;&gt;feature/analytics&lt;/a&gt; branch of the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x7fd870d26d58&quot;&gt;v7fasttrack&lt;/a&gt; open source distribution, and it will soon be available as a preconfigured Amazon EC2 image.  The updated &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1849&quot; id=&quot;link-id0x7fd87217aec8&quot;&gt;benchmarks AMI&lt;/a&gt; with this version of the software will be out there within the next week, to be announced on this blog.&lt;/p&gt;

&lt;h2&gt;On the Cost of RDF Query Optimization&lt;/h2&gt;

&lt;p&gt;RDF query optimization is harder than the relational equivalent; first, because there are more joins, hence an NP complete explosion of plan search space, and second, because cardinality estimation is harder and usually less reliable.  The work on characteristic sets, pioneered by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x7fd870c3e918&quot;&gt;Thomas Neumann&lt;/a&gt; in &lt;a href=&quot;https://domino.mpi-inf.mpg.de/intranet/ag5/ag5publ.nsf/0/AD3DBAFA6FB90DD2C1257593002FF3DF/$file/rdf3x.pdf&quot; id=&quot;link-id0x7fd870c3eae8&quot;&gt;RDF3X&lt;/a&gt;, uses regularities in structure for treating properties usually occurring in the same subject as columns of a table.  The same idea is applied for tuning physical representation in &lt;a href=&quot;http://homepages.cwi.nl/~duc/papers/emergentschema_www15.pdf&quot; id=&quot;link-id0x7fd8721c1ea8&quot;&gt;the joint Virtuoso / MonetDB work published at WWW 2015&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Virtuoso results discussed here, however, are all based on a single RDF quad table with Virtuoso&amp;#39;s default index configuration.&lt;/p&gt;

&lt;p&gt;Introducing query plan caching raises the Virtuoso score from 80 qps to 144 qps at the 256 Mtriple scale.  The SPB queries are not extremely complex; lookups with many more triple patterns exist in actual workloads, e.g., &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x7fd8721313e8&quot;&gt;Open PHACTS&lt;/a&gt;.  In such applications, query optimization indeed dominates execution times.  In SPB, data volumes touched by queries grow near linearly with data scale.  At the 256 Mtriple scale, nearly half of CPU cycles are spent deciding a query plan.  Below are the CPU cycles for execution and compilation per query type, sorted by descending sum of the times, scaled to milliseconds per execution. These are taken from a one minute sample of running at full throughput.&lt;/p&gt;

&lt;p&gt;Test system is the same used before in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x7fd872131738&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630 Sandy Bridge, 2 x 6 cores x 2 threads, 2.3GHz, 192 GB RAM.&lt;/p&gt;

&lt;p&gt;We measure the compile and execute times, with and without using hash join.  When considering hash join, the throughput is 80 qps.  When not considering hash join, the throughput is 110 qps.  With query plan caching, the throughput is 145 qps whether or not hash join is considered.  Using hash join is not significant for the workload but considering its use in query optimization leads to significant extra work.&lt;/p&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
&lt;td&gt;

&lt;h3&gt;With hash join&lt;/h3&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
    &lt;th&gt;Compile&lt;/th&gt;
    &lt;th&gt;Execute&lt;/th&gt;
    &lt;th&gt;Total&lt;/th&gt;
    &lt;th&gt;Query&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 3156Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1181Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 4337Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; Total &lt;/i&gt;&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1327Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 28Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1355Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 01 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 444Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  460Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 904Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 08 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 466Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  54Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 520Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 06 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 123Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  268Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 391Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 05 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 257Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 262Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 11 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 191Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  59Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 250Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 10 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 9Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;    179Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 188Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 04 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 114Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  26Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 140Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 07 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 46Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   62Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 108Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 09 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 71Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   25Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 96Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 12 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 61Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   13Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 74Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 03 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 47Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   2Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 49Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 02 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;/td&gt;
&lt;td style=&quot;text-align:center;&quot;&gt;
Â  Â  Â  Â  
&lt;/td&gt;
&lt;td style=&quot;text-align:center;&quot;&gt;

&lt;h3&gt;Without hash join&lt;/h3&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
    &lt;th&gt;Compile&lt;/th&gt;
    &lt;th&gt;Execute&lt;/th&gt;
    &lt;th&gt;Total&lt;/th&gt;
    &lt;th&gt;Query&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1816Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1019Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 2835Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; Total &lt;/i&gt;&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 197Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  466Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 663Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 08 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 609Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  32Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 641Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 01 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 188Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  293Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 481Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 05 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 275Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  61Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 336Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 09 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 163Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  10Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 173Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 03 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 128Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  38Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 166Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 10 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 102Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 107Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 11 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 63Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   27Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 90Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 12 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 24Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   57Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 81Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 06 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 47Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   1Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 48Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 02 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 15Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   24Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 39Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 07 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;    5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 10Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 04 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Considering hash join always slows down compilation, and sometimes improves and sometimes worsens execution. Some improvement in cost-model and plan-space traversal-order is possible, but altogether removing compilation via caching is better still.  The results are as expected, since a lookup workload such as SPB has little use for hash join by nature.&lt;/p&gt;

&lt;p&gt;The rationale for considering hash join in the first place is that analytical workloads rely heavily on this.  A good &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7fd8721ce268&quot;&gt;TPC-H&lt;/a&gt; score is simply unfeasible without this as &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x7fd8720f3f48&quot;&gt;previously discussed on this blog&lt;/a&gt;.  If RDF is to be a serious contender beyond serving lookups, then hash join is indispensable.  The decision for using this however depends on accurate cardinality estimates on either side of the join.&lt;/p&gt;

&lt;p&gt;Previous work (e.g., papers from &lt;a href=&quot;http://www.forth.gr/&quot; id=&quot;link-id0x7fd8720f8548&quot;&gt;FORTH&lt;/a&gt; around &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x7fd8721bfe38&quot;&gt;MonetDB&lt;/a&gt;) advocates doing away with a cost model altogether, since one is hard and unreliable with RDF anyway.  The idea is not without its attraction but will lead to missing out of analytics or to relying on query hints for hash join.&lt;/p&gt;

&lt;p&gt;The present Virtuoso thinking is that going to rule based optimization is not the preferred solution, but rather using characteristic sets for reducing triples into wider tables, which also cuts down on plan search space and increases reliability of cost estimation.&lt;/p&gt;

&lt;p&gt;When looking at execution alone, we see that actual database operations are low in the profile, with memory management taking the top 19%. This is due to &lt;code&gt;CONSTRUCT&lt;/code&gt; queries allocating small blocks for returning graphs, which is entirely avoidable.&lt;/p&gt;
</description></item><item><title>New Semantic Publishing Benchmark Record</title><guid>http://www.openlinksw.com:443/weblog/oerling/?date=2016-01-11#1866</guid><comments>http://www.openlinksw.com:443/weblog/oerling/?id=1866#comments</comments><pubDate>Mon, 11 Jan 2016 15:22:09 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2016-01-11T15:25:01.739223</n0:modified><description>&lt;p&gt;There is a new &lt;a href=&quot;http://ldbcouncil.org/developer/spb&quot; id=&quot;link-id0x7fd87214c348&quot;&gt;SPB (Semantic Publishing Benchmark)&lt;/a&gt; 256 Mtriple record with &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x7fd870d26a48&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As before, the result has been measured with the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x7fd870d26be8&quot;&gt;feature/analytics&lt;/a&gt; branch of the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x7fd870d26d58&quot;&gt;v7fasttrack&lt;/a&gt; open source distribution, and it will soon be available as a preconfigured Amazon EC2 image.  The updated &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1849&quot; id=&quot;link-id0x7fd87217aec8&quot;&gt;benchmarks AMI&lt;/a&gt; with this version of the software will be out there within the next week, to be announced on this blog.&lt;/p&gt;

&lt;h2&gt;On the Cost of RDF Query Optimization&lt;/h2&gt;

&lt;p&gt;RDF query optimization is harder than the relational equivalent; first, because there are more joins, hence an NP complete explosion of plan search space, and second, because cardinality estimation is harder and usually less reliable.  The work on characteristic sets, pioneered by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x7fd870c3e918&quot;&gt;Thomas Neumann&lt;/a&gt; in &lt;a href=&quot;https://domino.mpi-inf.mpg.de/intranet/ag5/ag5publ.nsf/0/AD3DBAFA6FB90DD2C1257593002FF3DF/$file/rdf3x.pdf&quot; id=&quot;link-id0x7fd870c3eae8&quot;&gt;RDF3X&lt;/a&gt;, uses regularities in structure for treating properties usually occurring in the same subject as columns of a table.  The same idea is applied for tuning physical representation in &lt;a href=&quot;http://homepages.cwi.nl/~duc/papers/emergentschema_www15.pdf&quot; id=&quot;link-id0x7fd8721c1ea8&quot;&gt;the joint Virtuoso / MonetDB work published at WWW 2015&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Virtuoso results discussed here, however, are all based on a single RDF quad table with Virtuoso&amp;#39;s default index configuration.&lt;/p&gt;

&lt;p&gt;Introducing query plan caching raises the Virtuoso score from 80 qps to 144 qps at the 256 Mtriple scale.  The SPB queries are not extremely complex; lookups with many more triple patterns exist in actual workloads, e.g., &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x7fd8721313e8&quot;&gt;Open PHACTS&lt;/a&gt;.  In such applications, query optimization indeed dominates execution times.  In SPB, data volumes touched by queries grow near linearly with data scale.  At the 256 Mtriple scale, nearly half of CPU cycles are spent deciding a query plan.  Below are the CPU cycles for execution and compilation per query type, sorted by descending sum of the times, scaled to milliseconds per execution. These are taken from a one minute sample of running at full throughput.&lt;/p&gt;

&lt;p&gt;Test system is the same used before in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x7fd872131738&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630 Sandy Bridge, 2 x 6 cores x 2 threads, 2.3GHz, 192 GB RAM.&lt;/p&gt;

&lt;p&gt;We measure the compile and execute times, with and without using hash join.  When considering hash join, the throughput is 80 qps.  When not considering hash join, the throughput is 110 qps.  With query plan caching, the throughput is 145 qps whether or not hash join is considered.  Using hash join is not significant for the workload but considering its use in query optimization leads to significant extra work.&lt;/p&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
&lt;td&gt;

&lt;h3&gt;With hash join&lt;/h3&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
    &lt;th&gt;Compile&lt;/th&gt;
    &lt;th&gt;Execute&lt;/th&gt;
    &lt;th&gt;Total&lt;/th&gt;
    &lt;th&gt;Query&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 3156Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1181Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 4337Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; Total &lt;/i&gt;&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1327Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 28Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1355Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 01 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 444Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  460Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 904Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 08 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 466Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  54Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 520Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 06 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 123Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  268Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 391Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 05 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 257Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 262Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 11 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 191Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  59Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 250Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 10 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 9Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;    179Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 188Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 04 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 114Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  26Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 140Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 07 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 46Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   62Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 108Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 09 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 71Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   25Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 96Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 12 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 61Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   13Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 74Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 03 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 47Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   2Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 49Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 02 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;/td&gt;
&lt;td style=&quot;text-align:center;&quot;&gt;
Â  Â  Â  Â  
&lt;/td&gt;
&lt;td style=&quot;text-align:center;&quot;&gt;

&lt;h3&gt;Without hash join&lt;/h3&gt;

&lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt;
&lt;tr style=&quot;text-align:center;&quot;&gt;
    &lt;th&gt;Compile&lt;/th&gt;
    &lt;th&gt;Execute&lt;/th&gt;
    &lt;th&gt;Total&lt;/th&gt;
    &lt;th&gt;Query&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1816Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 1019Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; 2835Â ms &lt;/i&gt;&lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;&lt;i&gt; Total &lt;/i&gt;&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 197Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  466Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 663Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 08 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 609Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  32Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 641Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 01 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 188Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  293Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 481Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 05 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 275Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  61Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 336Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 09 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 163Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  10Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 173Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 03 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 128Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  38Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 166Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 10 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 102Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;  5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 107Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 11 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 63Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   27Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 90Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 12 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 24Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   57Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 81Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 06 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 47Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   1Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 48Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 02 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 15Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;   24Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 39Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 07 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt;    5Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 10Â ms &lt;/code&gt; &lt;/td&gt;
    &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; query 04 &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Considering hash join always slows down compilation, and sometimes improves and sometimes worsens execution. Some improvement in cost-model and plan-space traversal-order is possible, but altogether removing compilation via caching is better still.  The results are as expected, since a lookup workload such as SPB has little use for hash join by nature.&lt;/p&gt;

&lt;p&gt;The rationale for considering hash join in the first place is that analytical workloads rely heavily on this.  A good &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7fd8721ce268&quot;&gt;TPC-H&lt;/a&gt; score is simply unfeasible without this as &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x7fd8720f3f48&quot;&gt;previously discussed on this blog&lt;/a&gt;.  If RDF is to be a serious contender beyond serving lookups, then hash join is indispensable.  The decision for using this however depends on accurate cardinality estimates on either side of the join.&lt;/p&gt;

&lt;p&gt;Previous work (e.g., papers from &lt;a href=&quot;http://www.forth.gr/&quot; id=&quot;link-id0x7fd8720f8548&quot;&gt;FORTH&lt;/a&gt; around &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x7fd8721bfe38&quot;&gt;MonetDB&lt;/a&gt;) advocates doing away with a cost model altogether, since one is hard and unreliable with RDF anyway.  The idea is not without its attraction but will lead to missing out of analytics or to relying on query hints for hash join.&lt;/p&gt;

&lt;p&gt;The present Virtuoso thinking is that going to rule based optimization is not the preferred solution, but rather using characteristic sets for reducing triples into wider tables, which also cuts down on plan search space and increases reliability of cost estimation.&lt;/p&gt;

&lt;p&gt;When looking at execution alone, we see that actual database operations are low in the profile, with memory management taking the top 19%. This is due to &lt;code&gt;CONSTRUCT&lt;/code&gt; queries allocating small blocks for returning graphs, which is entirely avoidable.&lt;/p&gt;
</description></item><item><title>Life after sun.jdbc.odbc.JdbcOdbcDriver</title><guid>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-04#1840</guid><comments>http://www.openlinksw.com:443/weblog/uda/135/?id=1840#comments</comments><pubDate>Thu, 04 Jun 2015 21:12:19 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2016-05-12T22:39:03.406510</n0:modified><description>&lt;h2&gt;In the beginning...&lt;/h2&gt;

&lt;p&gt;When Sun originally released Java 1.0, there were no JDBC drivers -- there wasn&amp;#39;t even a JDBC.&lt;/p&gt;

&lt;p&gt;Data access came in Java 2.0, as &lt;a href=&quot;http://www.oracle.com/technetwork/java/overview-141217.html&quot; id=&quot;link-id0x2aab5b257518&quot;&gt;JDBC 1.0&lt;/a&gt;, but there were very few JDBC drivers from any source, as would be expected with any new technology -- but the ODBC ecosystem (itself then at only v2.0) was going strong.&lt;/p&gt;

&lt;p&gt;Sun recognized that Java wouldn&amp;#39;t have as much uptake without a functional data access solution -- so they produced and bundled the original Type 1 JDBC-ODBC Bridge Driver, &lt;code&gt;sun.jdbc.odbc.JdbcOdbcDriver&lt;/code&gt;, but from the very beginning, they warned that users &amp;quot;should use the JDBC-ODBC Bridge only for experimental prototyping or when you have no other driver available.&amp;quot;&lt;/p&gt;

&lt;p&gt;That bundled JDBC-ODBC Bridge was (and always remained) single-threaded, and though it received some other updates along the way, it only ever supported a subset of JDBC 2.0 and later.  Sun (and later Oracle) recommended that users employ &amp;quot;a pure Java JDBC technology-enabled driver, type 3 or 4, in order to get all of the benefits of the Java programming language and the JDBC API.&amp;quot;&lt;/p&gt;

&lt;h2&gt;Where does OpenLink Software come in?&lt;/h2&gt;

&lt;p&gt;Even in the early days of JDBC, we saw that there would not always be an available JDBC driver for a given target data source -- but the numbers of ODBC drivers were rapidly increasing, supporting every major and many minor DBMS and other data sources.  We saw a need for an enterprise-grade, non-experimental Bridge solution, with full support for the JDBC API.&lt;/p&gt;

&lt;p&gt;We delivered this first as our &lt;a href=&quot;http://uda.openlinksw.com/jdbc-odbc-mt/&quot; id=&quot;link-id0x2aab5bf439b8&quot;&gt;Type 3 Multi-Tier solution&lt;/a&gt;, bridging from JDBC in one environment (typically a UNIX-like OS) to ODBC in another (most often, Microsoft Windows). &lt;/p&gt;

&lt;p style=&quot;text-align:center&quot;&gt;
 &lt;a href=&quot;http://uda.openlinksw.com/images/jdbcodbcmt.gif&quot; target=&quot;_blank&quot; id=&quot;link-id0x7fe32e904c08&quot;&gt;&lt;img src=&quot;http://uda.openlinksw.com/images/jdbcodbcmt.gif&quot; alt=&quot;Type 3 Enterprise Edition (Multi-Tier) Architecture Diagram&quot; title=&quot;Type 3 Enterprise Edition (Multi-Tier) Architecture Diagram&quot; style=&quot;max-width: 300px; height: auto&quot; /&gt;
 &lt;/a&gt; &lt;br /&gt; Type 3 Enterprise Edition (Multi-Tier) Architecture Diagram &lt;br /&gt; &lt;i&gt;(click to enlarge)&lt;/i&gt;
&lt;/p&gt;

Soon afterward, we released our first &lt;a href=&quot;http://uda.openlinksw.com/jdbc-odbc-st/&quot; id=&quot;link-id0x2aab5b257628&quot;&gt;Type 1 Single-Tier solution&lt;/a&gt;, first for Windows, but quickly also supporting Linux, Mac OS X, Solaris, AIX, HP-UX, and other UNIX-like OS, through our own &lt;a href=&quot;http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/&quot; id=&quot;link-id0x2aab5b0cbc48&quot;&gt;iODBC driver manager&lt;/a&gt; -- which was itself helping to expand the ODBC ecosystem far beyond its birthplace on Windows.

&lt;p style=&quot;text-align:center&quot;&gt;
 &lt;a href=&quot;http://uda.openlinksw.com/images/jdbcodbcst.gif&quot; target=&quot;_blank&quot; id=&quot;link-id0x7fe32e385fe8&quot;&gt;&lt;img src=&quot;http://uda.openlinksw.com/images/jdbcodbcst.gif&quot; alt=&quot;Type 1 Lite Edition (Single-Tier) Architecture Diagram&quot; title=&quot;Type 1 Lite Edition (Single-Tier) Architecture Diagram&quot; style=&quot;max-width: 300px; height: auto&quot; /&gt;
 &lt;/a&gt; &lt;br /&gt; Type 1 Lite Edition (Single-Tier) Architecture Diagram &lt;br /&gt; &lt;i&gt;(click to enlarge)&lt;/i&gt;
&lt;/p&gt;


&lt;h2&gt;Why is Java 8 so special?&lt;/h2&gt;

&lt;p&gt;Sun long warned that the JRE-bundled Bridge was transitional, and Oracle confirmed immediately upon acquisition that it would &amp;quot;be removed in JDK 8. In addition, Oracle does not support the JDBC-ODBC Bridge.&amp;quot;  Java 8 is now in full release, and indeed, the venerable &lt;code&gt;sun.jdbc.odbc.JdbcOdbcDriver&lt;/code&gt; is no longer present, as evidenced by the scary looking error --&lt;/p&gt;

&lt;blockquote&gt;
 &lt;code&gt;&lt;pre&gt;java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:30
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:259)
&lt;/pre&gt;
 &lt;/code&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any Java users or applications relying on ODBC connections and also needing the security and other improvements found in Java 8 are left high and dry...  Or would be, but for OpenLink Software.&lt;/p&gt;

&lt;p&gt;Our JDBC-to-ODBC Bridge, in both &lt;a href=&quot;http://uda.openlinksw.com/jdbc-odbc-st/&quot; id=&quot;link-id0x2aab5b0cc1f8&quot;&gt;Type 1&lt;/a&gt; and &lt;a href=&quot;http://uda.openlinksw.com/jdbc-odbc-mt/&quot; id=&quot;link-id0x2aab5b0cc308&quot;&gt;Type 3&lt;/a&gt; forms, has been available and regularly updated since its original release for JDBC 1.  Fully multi-threaded since Java Runtime Environments (JREs) could handle such, we have also kept pace with the JDBC API -- now at &lt;a href=&quot;http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/jdbc_42.html&quot; id=&quot;link-id0x2aab5b0cc548&quot;&gt;JDBC 4.2, in 2015&amp;#39;s Java 8 a/k/a JDK/JVM/JRE 1.8&lt;/a&gt; -- and maintained compatibility with the also-evolving &lt;a href=&quot;https://msdn.microsoft.com/library/ee388580.aspx&quot; id=&quot;link-id0x2aab5b0cc6a8&quot;&gt;ODBC API, now at 3.8&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Especially important for the modern world, our solutions support both 64-bit and 32-bit environments, including both 64-bit JVMs and ODBC drivers, and our &lt;a href=&quot;http://uda.openlinksw.com/jdbc-odbc-mt/&quot; id=&quot;link-id0x7fe35a5e2168&quot;&gt;Type 3 solutions&lt;/a&gt; can even bridge between these, whether you have a 64-bit JVM and need to connect to a 32-bit ODBC driver, or you have a 32-bit JVM and need to connect to a 64-bit ODBC driver.&lt;/p&gt;

&lt;p&gt;As always, our solutions are &lt;a href=&quot;http://download.openlinksw.com/solwiz/&quot; id=&quot;link-id0x2aab5b0cc0e8&quot;&gt;available for immediate download&lt;/a&gt;, with a free two-week trial license provided alongside.  We encourage pre-purchase installation, configuration, and testing, with support provided through our &lt;a href=&quot;http://boards.openlinksw.com/support/index.php&quot; id=&quot;link-id0x2aab5b0cc9a8&quot;&gt;web-based Support Forums&lt;/a&gt; and even &lt;a href=&quot;http://support.openlinksw.com/support/online-support.vsp&quot; id=&quot;link-id0x2aab5b0ccaa8&quot;&gt;free up-and-running Support Cases&lt;/a&gt;.  Once you&amp;#39;ve confirmed the driver works for you, &lt;a href=&quot;http://uda.openlinksw.com/offers/&quot; id=&quot;link-id0x2aab5b255fc8&quot;&gt;entry level and special offer licenses&lt;/a&gt; may be purchased online or through our Sales Team; these as well as custom license configurations or &lt;a href=&quot;http://www.openlinksw.com/partners/&quot; id=&quot;link-id0x2aab5b256168&quot;&gt;partnership (IBP, ISV, VAR, OEM, etc.) arrangements&lt;/a&gt; are always available by &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x2aab5b256288&quot;&gt;direct contact&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>ICDE 2012 (post 6 of 6) - Science Data Panel</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1713</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1713#comments</comments><pubDate>Tue, 17 Apr 2012 19:38:20 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T15:47:03.467938-04:00</n0:modified><description>&lt;p&gt;
&lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c05b28&quot;&gt;Michael Stonebraker&lt;/a&gt; chaired a panel on the future of science data at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d5d658&quot;&gt;ICDE 2012&lt;/a&gt; last week. Other participants were &lt;a href=&quot;http://www.mit.edu/~kepner/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c05360&quot;&gt;Jeremy Kepner&lt;/a&gt; from &lt;a href=&quot;http://www.mit.edu/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26b12608&quot;&gt;MIT&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Lincoln_Laboratory&quot; class=&quot;absuri&quot; id=&quot;link-id0x27d4f370&quot;&gt;Lincoln Labs&lt;/a&gt;, &lt;a href=&quot;http://people.epfl.ch/cgi-bin/people?id=177957&quot; class=&quot;absuri&quot; id=&quot;link-id0x25259440&quot;&gt;Anastasia Ailamaki&lt;/a&gt; from &lt;a href=&quot;http://dbpedia.org/resource/%C3%89cole_Polytechnique_F%C3%A9d%C3%A9rale_de_Lausanne&quot; class=&quot;absuri&quot; id=&quot;link-id0x252593b8&quot;&gt;EPFL&lt;/a&gt;, and &lt;a href=&quot;http://www.sdss.jhu.edu/~szalay/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c067e8&quot;&gt;Alex Szalay&lt;/a&gt; from &lt;a href=&quot;http://dbpedia.org/resource/Johns_Hopkins_University&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c06678&quot;&gt;Johns Hopkins University&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; This is the thrust of what was said, noted from memory. My comments follow after the synopsis.&lt;/p&gt;
&lt;b&gt;Jeremy Kepner:&lt;/b&gt; When &lt;a href=&quot;http://dbpedia.org/resource/Java_(programming_language)&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c052d8&quot;&gt;Java&lt;/a&gt; was new we saw it as the coming thing and figured that in &lt;a href=&quot;http://dbpedia.org/resource/High-performance_computing&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c06900&quot;&gt;HPC&lt;/a&gt; we should find space for this. When &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d5d518&quot;&gt;MapReduce&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; class=&quot;absuri&quot; id=&quot;link-id0x27d6a330&quot;&gt;Hadoop&lt;/a&gt; came along, we saw this as a sea change in parallel programming models. This was so simple literally anybody could make parallel algorithms whereas this was not so with &lt;a href=&quot;http://dbpedia.org/resource/Message_Passing_Interface&quot; class=&quot;absuri&quot; id=&quot;link-id0x25290350&quot;&gt;MPI&lt;/a&gt;. Even parallel distributed arrays are harder. So MapReduce was a game changer, together with the cloud where anybody can get a cluster. Hardly a week passes without me having to explain to somebody in government what MapReduce and Hadoop are about.&lt;p&gt;We have a lot of arrays and a custom database for them. But the arrays are sparse so this is in fact a triple store. Our users like to work in &lt;a href=&quot;http://dbpedia.org/resource/MATLAB&quot; class=&quot;absuri&quot; id=&quot;link-id0x26b11980&quot;&gt;MATLAB&lt;/a&gt;, and any data management must run together with that.&lt;/p&gt;
&lt;p&gt;Of course, MapReduce is not a real scheduler, and Hadoop is not a real file system. For deployment, we must integrate real schedulers and make &lt;a href=&quot;http://dbpedia.org/resource/Hadoop_Distributed_File_System&quot; class=&quot;absuri&quot; id=&quot;link-id0x27d50258&quot;&gt;HDFS&lt;/a&gt; look like a file system to applications. The abstraction of a file system is something people like. Being able to skip a time-consuming data-ingestion process with a database is an advantage with file-based paradigms like Hadoop. If this is enhanced with the right scheduling features, this can be a good component in the HPC toolbox.&lt;/p&gt;
&lt;p&gt; &lt;b&gt;Michael Stonebraker:&lt;/b&gt; Users of the data use math packages like R, MATLAB, SAS, SPSS, or similar. If business intelligence is about &lt;tt&gt;AVG&lt;/tt&gt;, &lt;tt&gt;MIN&lt;/tt&gt;, &lt;tt&gt;MAX&lt;/tt&gt;, &lt;tt&gt;COUNT&lt;/tt&gt;, and &lt;tt&gt;GROUP BY&lt;/tt&gt;, science applications are much more diverse in their analytics. All science algorithms have an inner loop that resembles linear algebra operations like matrix multiplication. Data is more often than not a large array. There are some graphs in biology and chemistry, but the world is primarily rectangular. Relational databases can emulate sparse arrays but are 20x slower than a custom-made array database for dense arrays. And I will not finish without picking on MapReduce: I know of 2000-node MapReduce clusters. The work they do is maybe that of a 100-node parallel database. So if 2000 nodes is what you want to operate, be my guest.&lt;/p&gt;
&lt;p&gt; Science database is a zero billion dollar business. We do not expect to make money from the science market with &lt;a href=&quot;http://www.scidb.org/&quot; class=&quot;absuri&quot; id=&quot;link-id0x25269080&quot;&gt;SciDB&lt;/a&gt;, which by now works and has commercial services supplied by Paradigm 4, while the code itself is open source, which is a must for the science community. The real business opportunity is in the analytics needed by insurance and financial services in general, which are next to identical with the science use cases SciDB tackles. This makes the vendors pay attention.&lt;/p&gt;
&lt;p&gt; &lt;b&gt;Alex Szalay:&lt;/b&gt; The way astronomy is done today is through surveys: a telescope scans through the sky and produces data. We have now for 10 years operated the Sloane Sky Survey and kept the data online. We have all the data, and complete query logs, available for anyone interested. When we set out to do this with Jim Gray, everybody found this a crazy idea, but it has worked out.&lt;/p&gt;
&lt;p&gt; &lt;b&gt;Anastasia Ailamaki:&lt;/b&gt; We do not use SciDB. We find a lot of spatial use cases. Researchers need access to simulation results which are usually over a spatial model, like in earthquake simulations and the brain. Off-the-shelf techniques like R trees do not work -- the objects overlap too much -- so we have made our own spatial indexing. We make custom software when it is necessary, and are not tied to vendors. In geospatial applications, we can create meshes of different shapes -- like tetrahedral or cubes for earthquakes, and cylinders for the brain -- and index these in a geospatial index. But since an R tree is inefficient when objects overlap too much, as these do, we just find one; and then because there is reachability from an object to neighboring ones, we use this to get all the objects in the area of interest.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;*                     *                     *&lt;/p&gt;
&lt;p&gt;This is obviously a diverse field. Probably the message that we can synthesize out of this is that &lt;b&gt;&lt;i&gt;flexibility and parallel programming models are what we need to pay attention to.&lt;/i&gt;&lt;/b&gt; There is a need to go beyond what one can do in SQL while continuing to stay close to the data. Also, allowing for plug-in data types and index structures may be useful; we sometimes get requests for such anyway.&lt;/p&gt;
&lt;p&gt;The continuing argument around MapReduce and Hadoop is a lasting feature of the landscape. A parallel DB will beat MapReduce any day at joining across partitions; the problem is to overcome the mindset that sees Hadoop as the always-first answer to anything parallel. People will likely have to fail with this before they do anything else. For us, the matter is about having database-resident logic for &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c06558&quot;&gt;extract-transform-load (ETL)&lt;/a&gt; that can do data-integration type-transformations and maybe iterative graph algorithms that constantly join across partitions, better than a MapReduce job, while still allowing application logic to be written in Java. Teaching sem-web-heads to write SQL procedures and to know about join order, join type, and partition locality, has proven to be difficult. People do not understand latency, whether in client-server or cluster settings. This is why they do not see the point of stored procedures or of shipping functions to data. This sounds like a terrible indictment, like saying that people do not understand why rivers flow downhill. Yet, it is true. This is also why MapReduce is maybe the only parallel programming paradigm that can be successfully deployed in the absence of this understanding, since it is actually quite latency-tolerant, not having any synchronous cross-partition operations except for the succession of the map and reduce steps themselves.&lt;/p&gt;
&lt;p&gt;Maybe it is so that the database guys see MapReduce as an insult to their intelligence and the rest of the world sees it as the only understandable way of running &lt;tt&gt;&lt;a href=&quot;http://dbpedia.org/resource/Grep&quot; class=&quot;absuri&quot; id=&quot;link-id0x2507a000&quot;&gt;grep&lt;/a&gt;&lt;/tt&gt; and &lt;tt&gt;&lt;a href=&quot;http://dbpedia.org/resource/Sed&quot; class=&quot;absuri&quot; id=&quot;link-id0x25079ec0&quot;&gt;sed&lt;/a&gt;&lt;/tt&gt; (Unix commands for string search/replace) in parallel, with the super bonus of letting you reshuffle the outputs so that you can compare everything to everything else, which &lt;tt&gt;grep&lt;/tt&gt; alone never let you do.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;*                     *                     *&lt;/p&gt;
&lt;p&gt;Making a database that does not need data loading seems a nice idea, and CWI has actually done something in this direction in &amp;quot;&lt;a href=&quot;http://infoscience.epfl.ch/record/161489&quot; class=&quot;absuri&quot; id=&quot;link-id0x250787f0&quot;&gt;Here are my Data Files. Here are my Queries. Where are my Results?&lt;/a&gt;&amp;quot;] However, there is another product called Algebra Data that claims to take in data without loading and to optimize storage based on access. We do not have immediate plans in this direction. Bulk load is already quite fast (take 100G TPC-H in 70 minutes or so), but faster is always possible.&lt;/p&gt;</description></item><item><title>LOD2 Plenary and Review: Semanticist, Think Database!</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-09-30#1700</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1700#comments</comments><pubDate>Fri, 30 Sep 2011 21:02:01 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T15:43:29.091466-04:00</n0:modified><description>&lt;p&gt;Last week the &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x57d7368&quot;&gt;LOD2 FP7 project&lt;/a&gt; had its first review, preceded by its third plenary meeting.&lt;/p&gt;

&lt;p&gt;Before this, we did, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x579c950&quot;&gt;as promised&lt;/a&gt;, get the column store and vectored execution capabilities of Virtuoso 7 Single-Server Edition extended to Virtuoso 7 Cluster Edition. More interesting still, we decoupled storage from the database server process, so now database files can migrate between server processes. This means that clusters are now elastic, i.e., new servers can be added to a cluster and the load can be redistributed without reloading the data.&lt;/p&gt;

&lt;p&gt;These things were long planned, but now are done. Measurements will be published in some weeks, as part of CWI&amp;#39;s continued running of RDF store benchmarks, per the LOD2 plan.&lt;/p&gt;

&lt;p&gt;Doing the column store and elastic cluster is work enough, so I do not in general participate in support or consultancy or the like. This has some pros and cons. On the plus side, there is a relative lack of noise and a very clear idea of focus. Of course, this work is most highly applied, thus always informed by use cases, thus forgetting what ought to be done out there is not the problem. Rather, the problem is forgetting how things in fact &lt;i&gt;are&lt;/i&gt; done as opposed to how they &lt;i&gt;could or should be&lt;/i&gt; done.&lt;/p&gt;

&lt;p&gt;To cut a long story short, it has become clear to me that the DBMS must tell the application developer what to do. Of course, the application developer could also look at performance metrics, but they do not, and explaining these metrics is too much work and yields no lasting benefit. Developers will produce all kinds of performance diagnostic traces if requested, but going through this song and dance can also be avoided by the right automation.&lt;/p&gt;

&lt;p&gt;So, I will introduce two new product features called &lt;i&gt;&lt;b&gt;Wazzup?&lt;/b&gt;&lt;/i&gt; and &lt;i&gt;&lt;b&gt;Saywhat?&lt;/b&gt;&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Wazzup?&lt;/b&gt; is answered by a mood line, like &amp;quot;Heavily disk bound: 100G more memory will give 10x speedup&amp;quot; or &amp;quot;Network bound: Processing in larger batches will give 5x more throughput&amp;quot; and &lt;b&gt;Saywhat?&lt;/b&gt; is answered by some commentary on the user&amp;#39;s last action, for example &amp;quot;there is no ?order with o_totalprice &amp;lt; 0&amp;quot; or &amp;quot;there is no property O_misspelledtotallprrice.&amp;quot;&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Wazzup?&lt;/b&gt; is about overall system state, and &lt;b&gt;Saywhat?&lt;/b&gt; is about the user session, specifically query plans. But an explanation of a query plan is not understandable, so this will just point out some salient facts, like the reason why the answer comes out empty.&lt;/p&gt;

&lt;p&gt;The other thing that came to my attention is the fact that a user has no instinctive feel for &lt;a href=&quot;http://dbpedia.org/page/Extract,_transform,_load&quot; id=&quot;link-id0x527eb88&quot;&gt;ETL&lt;/a&gt;. A database person takes it for a self-evident truth that data is loaded in bulk, but the application developer does not think of that. Likewise, the line between warehousing and federating is not instinctively felt; actually the question is not even posed in these terms. So one will find Web protocols and end-points and glue code on the app server when one ought to have ETL and adequate hardware for running the consolidated database.&lt;/p&gt;

&lt;p&gt;Further, under-provisioning of equipment is endemic with semanticists. The Semantic Web gets a needlessly bad rap just because we find too much data on too little equipment. For example, I was surprised to learn that the Linked Geodata demo ran on only 16 GB RAM and 6 processor cores with 2 billion triples and 350 million points in a geo index. Now, even with our greatest space efficiency advances, there is no way this will run from memory.&lt;/p&gt;

&lt;p&gt;It is not that the Web 2.0 stack is necessarily efficient (we hear the wildest stories of lack of database understanding from that side too), but at least there is a culture of running with enough equipment. Surely when the web-scale data gear (e.g. Google Bigtable, Yahoo PNUTS, Amazon Dynamo) was new, by the operators&amp;#39; own admission there was no way for this to be particularly efficient, database-wise. Not if your eventual consistency is a client application to a shared MySQL back-end. For a lookup or single-record-update workload, who cares when there is enough hardware? For analytics, there is the &lt;i&gt;de facto&lt;/i&gt; impossibility of doing big joins, but map reduce is for that, all offline. The big web houses have always known how to deal with data; it is the smaller Web 2.0 guys who patch systems together with duct tape and memcache. Even so, the online experience gets created.&lt;/p&gt;

&lt;p&gt;Semanticism has no part of this outlook, except maybe for Freebase, but then they are from California and now have been inside Google for a while.&lt;/p&gt;

&lt;p&gt;We quite understand that when one needs to get big data online, one makes a key-value store as a point solution, because this way one owns what one operates, and the time to market is a lot shorter than if one tried building all this inside a general-purpose DBMS. Besides, the people who can in fact do this almost do not exist, and even if one had a whole army of this rare breed, development is not very scalable in a tightly-integrated system like a high-performance DBMS. Still further, to even start, one needs to own the DBMS, meaning that the initial platform must be known through and through. This is an issue even though open source platforms exist.&lt;/p&gt;

&lt;p&gt;The graph data, semdata, schema-last, RDF, linked data enterprise -- whatever one calls it -- makes the bold proposition of bringing complex-query-at-scale to heterogeneous data. This is a database claim.&lt;/p&gt;

&lt;p&gt;In the meantime, test deployments are made in defiance of database best practices. This is a bit like test driving a race car in reverse gear and steering by looking in the rear-view mirror.&lt;/p&gt;

&lt;p&gt;There is also no short-term scalable way to educate people. At the LOD2 review, one comment was that an integrated project ought to clearly indicate how to set up the tool chain for good performance, specially as concerns interfaces between the tools. This is very true. Experience shows that developers of tools cannot accurately anticipate what usage patterns will emerge in the field. Therefore, we propose to do better than just documentation; we will make the server recognize the common sources of inefficiency and point the user to the right action.&lt;/p&gt;

&lt;h3&gt;Provisioning and usage patterns: The DBMS ought to know best.&lt;/h3&gt;

&lt;p&gt;Imagine the following conversation:&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;DBMS:&lt;/b&gt; Your application does single-triple INSERTs over client-server protocol all day, from a single client. 57% of real time goes in client server latency, 40% in cluster interconnect latency, 2% in compiling the statements, and 1% in doing the work. Use array parameters or bulk load from a file.&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Operator:&lt;/b&gt; My developers use industry-standard Java class libraries with a service-oriented architecture and strictly enforced interfaces. This is called software engineering. Watch out ere you raise your voice against the canon.&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;[Some weeks later, after the load job has gone on for 10 days and gotten a third of the way, developers have discovered that JDBC has array parameters and are trying these.]&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;DBMS:&lt;/b&gt; 60% of real time goes into waiting for locks. 10% of transactions get aborted for deadlock. Transactions consist of an average of 10 client-server operations. Use stored procedures; acquire locks in predictable order; do SELECT FOR UPDATE. Throughput will be 4x higher if client-server operations are merged into a single operation. The transactions only INSERT; hence consider bulk load instead.&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Operator&lt;/b&gt;: We are using an enterprise-class three-tier architecture. It has &amp;quot;enterprise&amp;quot; in the name and all the big guys are using it, so it must be scalable. Besides, it is distributed transactions, and distributed computing is the wave of the future. You are a cluster yourself, so the pot&amp;#39;s got no business calling the kettle black.&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;[After a while, the data gets loaded with bulk load, but now on a single stream.]&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;DBMS&lt;/b&gt;: CPU is at 400% for an INSERT workload; adding more parallel threads will get 4.5x better throughput.&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;[Some time has elapsed and there are Ajax client apps out there trying to use the data.]&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;DBMS&lt;/b&gt;: Will you really not give me another 140 GB RAM and 16 more cores?&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Operator&lt;/b&gt;: No, on general principles I will not, shut up.&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;DBMS&lt;/b&gt;: Do you know that your page impression takes 3 seconds and anything over 0.25 seconds is visibly slow? 300 GB worth of distinct pages have been accessed in the last 24 hours for 160 GB of RAM. Latency will drop 10x by using SSD; 50x by increasing RAM.&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Operator&lt;/b&gt;: No dice, bucket. Shut up, besides, when I scroll through the data I always use for testing, I get it fast enough, you are just doing this out of greed and self-importance. You are a server among many, just like the mail server; you databases are just pretentious.&lt;/p&gt;

&lt;p&gt;Currently addressing any of the above sorts of issues takes a long time and involves mostly-avoidable support communication. Questions of this sort do occur. We can probably produce commentary like the above based on logging some 50 numbers, and making some 15 regularly-run reports over these. The patterns to watch out for are well known. No, we will not make a Zippy the Pinhead office assistant; a computer should not try to be cute. This one will talk only in terms of gains from adjusting the deployment or usage patterns.&lt;/p&gt;

&lt;p&gt;Now, suppose the operator said &lt;i&gt;yes&lt;/i&gt; to the request for more cores and memory; then it would be up to the DBMS to deliver. This entails a capacity to redistribute itself automatically, and to give a quantitative report on the success of this measure. This means usage-based repartitioning of the data to equalize load over a cluster. The relevant metric in the above case is the drop in response time. On the other hand, the DBMS should also notice if there is clearly unused capacity.&lt;/p&gt;

&lt;p&gt;This all will be presented as a line in the status report, so there is no extra wizard or workload analyzer that one must remember to run. For programmatic use there are SQL views for the relevant reports.&lt;/p&gt;

&lt;p&gt;As for ETL, even if the DBMS can detect that it is not being done right, this does not mean that the user will know what to do. Therefore, for all the Web harvesting we support, as well as any import from local file system or Web services, with some RDF-ization, we will simply implement a proper ETL utility that will do things right. &lt;b&gt;Wazzup?&lt;/b&gt; can just point the user to that if the workload looks like loading. This will have its own status report giving a load and transform rate and will point out what takes the longest, after everything is duly parallelized and made asynchronous.&lt;/p&gt;

&lt;p&gt;Beyond these lessons, there is more to say about the review and plenary, we will get to that a bit later. We did promise a new edition of the LOD cache in a couple of months, now on the clustered column-store platform. Look for advances in data discoverability.&lt;/p&gt;
</description></item><item><title>Virtuoso 6.2 brings New Features!</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-22#1638</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1638#comments</comments><pubDate>Wed, 22 Sep 2010 21:08:24 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T14:43:46.770292-04:00</n0:modified><description>&lt;p&gt;Virtuoso 6.2 introduces a major number of enhancements to areas including...&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;
  Linked Data Deployment
&lt;/li&gt; 
&lt;li&gt;
  Linked Data Middleware&lt;/li&gt; 
&lt;li&gt;
  Data Virtualization&lt;/li&gt; 
&lt;li&gt;
  Dynamic Data Exchange &amp;amp; Data Replication
&lt;/li&gt; 
&lt;li&gt;
  Security&lt;/li&gt;
&lt;/ul&gt;  

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
&lt;a name=&quot;LinkedDataDeployment&quot; id=&quot;LinkedDataDeployment&quot;&gt;&lt;/a&gt; Linked Data Deployment&lt;/h3&gt;
 
&lt;table class=&quot;data&quot; border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot;&gt;
 &lt;tr&gt;
&lt;th id=&quot;0&quot; width=&quot;15%&quot;&gt;Feature&lt;/th&gt;
&lt;th id=&quot;1&quot; width=&quot;42%&quot;&gt;Description&lt;/th&gt;
&lt;th id=&quot;2&quot;&gt;Benefit&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Automatic Deployment&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Linked Data Pages are now automatically published for every Virtuoso Data Object; users need only load their data into the RDF Quad Store.   &lt;/td&gt;
  &lt;td&gt; Handcrafted URL-Rewrite Rules are no longer necessary.  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;HTTP Metadata Enhancements&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; HTTP &lt;code&gt;Link:&lt;/code&gt; header is used to transfer vital metadata (e.g., relationships between a Descriptor Resource and its Subject) from HTTP Servers to User Agents.  &lt;/td&gt;
  &lt;td&gt; Enables HTTP-oriented tools to work with such relationships and other metadata.  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;HTML Metadata Embedding&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; HTML resource &lt;code&gt;&amp;lt;head /&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;link  /&amp;gt;&lt;/code&gt; elements and their &lt;code&gt;@rel&lt;/code&gt; attributes are used to transfer vital metadata  (e.g., relationships between a Descriptor Resource and its Subject) from HTTP Servers to User Agents.  &lt;/td&gt;
  &lt;td&gt; Enables HTML-oriented tools to work with such relationships and other metadata.  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Hammer Stack Auto-Discovery Patterns&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; HTML resource &lt;code&gt;&amp;lt;head /&amp;gt;&lt;/code&gt; section and &lt;code&gt;&amp;lt;link  /&amp;gt;&lt;/code&gt; elements, the HTTP &lt;code&gt;Link:&lt;/code&gt; header, and XRD-based &lt;code&gt;&amp;quot;host-meta&amp;quot;&lt;/code&gt; resources collectively provide structured metadata about Virtuoso hosts, associated Linked Data Spaces, and specific Data Items (Entities). &lt;/td&gt;
  &lt;td&gt; Enables humans and machines to easily distinguish between Descriptor Resources and their Subjects, irrespective of URI scheme.  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;
&lt;a name=&quot;LinkedDataMiddleware&quot; id=&quot;LinkedDataMiddleware&quot;&gt;&lt;/a&gt; Linked Data Middleware&lt;/h3&gt;
 
&lt;table class=&quot;data&quot; border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot;&gt;
&lt;tr&gt;
  &lt;th id=&quot;3&quot; width=&quot;15%&quot;&gt;Feature&lt;/th&gt;
&lt;th id=&quot;4&quot; width=&quot;42%&quot;&gt;Description&lt;/th&gt;
&lt;th id=&quot;5&quot;&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;New Sponger Cartridges&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; New cartridges (data access and transformation drivers) for Twitter, Facebook, Amazon, eBay, &lt;nop&gt;&lt;/nop&gt;LinkedIn, and others.   &lt;/td&gt;
  &lt;td&gt; Enable users and user agents to deal with the Sponged data spaces as though they were named graphs in a quad store, or tables in an RDBMS.  &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;New Descriptor Pages&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; HTML-based descriptor pages are automatically generated.  &lt;/td&gt;
  &lt;td&gt; Descriptor subjects, and the constellation of navigable attribute-and-value pairs that constitute their descriptive representation, are clearly identified.  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Automatic Subject Identifier Generation&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; De-referenceable data object identifiers are automatically created.  &lt;/td&gt;
  &lt;td&gt; Removes tedium and risk of error associated with nuance-laced manual construction of identifiers. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt;  &lt;b&gt;Support for OData, JSON, RDFa&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Additional data representation and serialization formats associated with Linked Data.  &lt;/td&gt;
  &lt;td&gt; Increases flexibility and interoperability. &lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;h3&gt;
&lt;a name=&quot;DataVirtualization&quot; id=&quot;DataVirtualization&quot;&gt;&lt;/a&gt; Data Virtualization&lt;/h3&gt;
 
&lt;table class=&quot;data&quot; border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot;&gt;
&lt;tr&gt;
  &lt;th id=&quot;6&quot; width=&quot;15%&quot;&gt;Feature&lt;/th&gt;
&lt;th id=&quot;7&quot; width=&quot;42%&quot;&gt;Description&lt;/th&gt;
&lt;th id=&quot;8&quot;&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Materialized RDF Views&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; RDF Views over ODBC/JDBC Data Sources can now (optionally) keep the Quad Store in sync with the RDBMS data source.  &lt;/td&gt;
  &lt;td&gt; Enables high-performance Faceted Browsing while remaining sensitive to changes in the RDBMS data sources.  &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;CSV-to-RDF Transformation&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Wizard-based generation of RDF Linked Data from CSV files.  &lt;/td&gt;
  &lt;td&gt; Speeds deployment of data which may only exist in CSV form as Linked Data.  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Transparent Data Access Binding&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; SPASQL (SPARQL Query Language integrated into SQL) is usable over ODBC, JDBC, ADO.NET, OLEDB, or XMLA connections.  &lt;/td&gt;
  &lt;td&gt; Enables Desktop Productivity Tools to transparently work with any blend of RDBMS and RDF data sources. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;
&lt;a name=&quot;DynamicDataExchangeDataReplication&quot; id=&quot;DynamicDataExchangeDataReplication&quot;&gt;&lt;/a&gt; Dynamic Data Exchange &amp;amp; Data Replication&lt;/h3&gt;
 
&lt;table class=&quot;data&quot; border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot;&gt;
&lt;tr&gt;
  &lt;th id=&quot;9&quot; width=&quot;15%&quot;&gt;Feature&lt;/th&gt;
&lt;th id=&quot;10&quot; width=&quot;42%&quot;&gt;Description&lt;/th&gt;
&lt;th id=&quot;11&quot;&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Quad Store to Quad Store Replication&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; High-fidelity graph-data replication between one or more database instances.  &lt;/td&gt;
  &lt;td&gt; Enables a wide variety of deployment topologies.  &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Delta Engine&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Automated generation of deltas at the named-graph-level, matches transactional replication offered by the Virtuoso SQL engine.  &lt;/td&gt;
  &lt;td&gt; Brings RDF replication on par with SQL replication. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt;  &lt;b&gt;&lt;nop&gt;&lt;/nop&gt;PubSubHubbub Support&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Deep integration within Quad Store as an optional mechanism for shipping deltas.  &lt;/td&gt;
  &lt;td&gt; Enables push-based data replication across a variety of topologies. &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;
&lt;a name=&quot;Security&quot; id=&quot;Security&quot;&gt;&lt;/a&gt; Security&lt;/h3&gt;
 
&lt;table class=&quot;data&quot; border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot;&gt;
&lt;tr&gt;
  &lt;th id=&quot;12&quot; width=&quot;15%&quot;&gt;Feature&lt;/th&gt;
&lt;th id=&quot;13&quot; width=&quot;42%&quot;&gt;Description&lt;/th&gt;
&lt;th id=&quot;14&quot;&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt;  &lt;b&gt;&lt;nop&gt;&lt;/nop&gt;WebID support at the DBMS core&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Use &lt;nop&gt;&lt;/nop&gt;WebID protocol for low-level ACL-based protection of database objects (RDF or Relational) and Web Services.  &lt;/td&gt;
  &lt;td&gt; Enables application of sophisticated security and data access policies to Web Services (e.g., SPARQL endpoint) and actual DBMS objects. &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Webfinger&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Supports using &lt;code&gt;mailto:&lt;/code&gt; and &lt;code&gt;acct:&lt;/code&gt; URIs in the context of &lt;nop&gt;&lt;/nop&gt;WebID and other mechanisms, when domain holders have published necessary XRDS resources.  &lt;/td&gt;
  &lt;td&gt; Enables more intuitive identification of people and organizations. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td align=&quot;center&quot;&gt; &lt;b&gt;Fingerpoint&lt;/b&gt;  &lt;/td&gt;
  &lt;td&gt; Similar to Webfinger but does not require XRDS resources; instea,d it works directly with SPARQL endpoints exposed using auto-discovery patterns in the &lt;code&gt;&amp;lt;head  /&amp;gt;&lt;/code&gt; section of HTML documents.  &lt;/td&gt;
  &lt;td&gt; Enables more intuitive identification of people and organizations. &lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
</description></item><item><title>Linked Data and Information Architecture</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-29#1350</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1350#comments</comments><pubDate>Tue, 29 Apr 2008 14:37:22 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T14:32:10.859283-04:00</n0:modified><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></item><item><title>On Sem Web Search</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-29#1349</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1349#comments</comments><pubDate>Tue, 29 Apr 2008 14:37:21 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T14:31:03.220528-04:00</n0:modified><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;On Sem Web Search&lt;/div&gt;
&lt;p&gt;
&lt;i&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-id0x1a603f18&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-id0x1bda5c00&quot;&gt;data&lt;/a&gt;.&amp;quot;&lt;/i&gt;
&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; &lt;a href=&quot;http://sindice.com/&quot; id=&quot;link-id0x1d2b7288&quot;&gt;Sindice&lt;/a&gt;, 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-id0x1b2317d0&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-id0x1c55dd68&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-id0xa405ebd0&quot;&gt;PTSW&lt;/a&gt; (&lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0x1c051a00&quot;&gt;PingTheSemanticWeb&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-id0x1a60c7e0&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 &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x3728a2f8&quot;&gt;semantic web&lt;/a&gt; in terms of dealing with &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1bbcbeb8&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 &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x1843b020&quot;&gt;Internet&lt;/a&gt; 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, Garlik has made a business of just this, but now from a privacy and security angle. The &lt;a href=&quot;http://www.garlik.com/&quot; id=&quot;link-id0x1aa76ab0&quot;&gt;Garlik DataPatrol&lt;/a&gt; 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-id0x18800228&quot;&gt;Zitgist&lt;/a&gt;/PingTheSemanticWeb content. This is a regular part of the productization of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1adf39c8&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></item><item><title>Virtuoso Cluster</title><guid>http://www.openlinksw.com:443/blog/vdb/blog/?date=2007-05-23#1201</guid><comments>http://www.openlinksw.com:443/blog/vdb/blog/?id=1201#comments</comments><pubDate>Wed, 23 May 2007 14:09:37 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2015-08-21T16:19:48.176593-04:00</n0:modified><description>&lt;div&gt;
&lt;div style=&quot;display:none;&quot;&gt;Virtuoso Cluster&lt;/div&gt;
&lt;p&gt;We often get questions on clustering support, especially around &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e53d008&quot;&gt;RDF&lt;/a&gt;, where databases quickly get rather large. So we will answer them here.&lt;/p&gt;
&lt;p&gt;But first on some support technology. We have an entire new disk allocation and IO system. It is basically operational but needs some further tuning. It offers much better locality and much better sequential access speeds.&lt;/p&gt;
&lt;p&gt;Specially for dealing with large RDF databases, we will introduce &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1e042690&quot;&gt;data&lt;/a&gt; compression. We have over the years looked at different key compression possibilities but have never been very excited by them since thy complicate random access to index pages and make for longer execution paths, require scraping data for one logical thing from many places, and so on. Anyway, now we will compress pages before writing them to disk, so the cache is in machine byte order and alignment and disk is compressed. Since multiple processors are commonplace on servers, they can well be used for compression, that being such a nicely local operation, all in cache and requiring no serialization with other things.&lt;/p&gt;
&lt;p&gt;Of course, what was fixed length now becomes variable length, but if the compression ratio is fairly constant, we reserve space for the expected compressed size, and deal with the rare overflows separately. So no complicated shifting data around when something grows.&lt;/p&gt;
&lt;p&gt;Once we are done with this, this could well be a separate intermediate release.&lt;/p&gt;
&lt;p&gt;Now about clusters. We have for a long time had various plans for clusters but have not seen the immediate need for execution. With the rapid growth in the Linking Open Data movement and questions on web scale &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1e7714f0&quot;&gt;knowledge&lt;/a&gt; systems, it is time to get going.&lt;/p&gt;
&lt;p&gt;How will it work? &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e3caea8&quot;&gt;Virtuoso&lt;/a&gt; remains a generic DBMS, thus the clustering support is an across the board feature, not something for RDF only. So we can join &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1ac67648&quot;&gt;Oracle&lt;/a&gt;, IBM &lt;a href=&quot;http://dbpedia.org/resource/IBM_DB2&quot; id=&quot;link-id0x1c2267d0&quot;&gt;DB2&lt;/a&gt;, and others at the multi-terabyte TPC races.&lt;/p&gt;
&lt;p&gt;We introduce hash partitioning at the index level and allow for redundancy, where multiple nodes can serve the same partition, allowing for load balancing read and replacement of failing nodes and growth of cluster without interruption of service.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1daea638&quot;&gt;SQL&lt;/a&gt; compiler, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1ddb8c50&quot;&gt;SPARQL&lt;/a&gt;, and database engine all stay the same. There is a little change in the SQL run time, not so different from what we do with remote databases at present in the context of our &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id0x1e13a880&quot;&gt;virtual database&lt;/a&gt; federation. There is a little extra complexity for distributed deadlock detection and sometimes multiple threads per transaction. We remember that one RPC round trip Is 3-4 index lookups, so we pipeline things so as to move requests in batches, a few dozen at a time.&lt;/p&gt;
&lt;p&gt;The cluster support will be in the same executable and will be enabled by configuration file settings. Administration is limited to one node, but Web and SQL clients can connect to any node and see the same data. There is no balancing between storage and control nodes because clients can simply be allocated round robin for statistically even usage. In relational applications, as exemplified by &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x1c236bb0&quot;&gt;TPC-C&lt;/a&gt;, if one partitions by fields with an application meaning (such as warehouse ID), and if clients have an affinity to a particular chunk of data, they will of course preferentially connect to nodes hosting this data. With RDF, such affinity is unlikely, so nodes are basically interchangeable.&lt;/p&gt;
&lt;p&gt;In practice, we develop in June and July. Then we can rent a supercomputer maybe from Amazon EC2 and experiment away.&lt;/p&gt;
&lt;p&gt;We should just come up with a name for this. Maybe something astronomical, like star cluster. Big, bright but in this case not far away.&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>OAT and JS Hijacking</title><guid>http://www.openlinksw.com:443/weblog/oat/?date=2007-04-04#1176</guid><comments>http://www.openlinksw.com:443/weblog/oat/?id=1176#comments</comments><pubDate>Wed, 04 Apr 2007 04:18:00 GMT</pubDate><n0:modified xmlns:n0="http://www.openlinksw.com/weblog/">2017-12-29T13:21:33.987201</n0:modified><description>

	&lt;div&gt;&lt;/div&gt;


&lt;p&gt;OAT and JS Hijacking&lt;/p&gt;

&lt;p&gt;There has been some &lt;a href=&quot;http://ajaxian.com/archives/towards-secure-ajax-mashups&quot; id=&quot;link-id0x7f98d4a7c728&quot;&gt;recent&lt;/a&gt; &lt;a href=&quot;http://www.networkworld.com/news/2007/040207-javascript-ajax-applications.html&quot; id=&quot;link-id0x7f98d4a7c8b8&quot;&gt;buzz&lt;/a&gt; regarding security issues of Web 2.0 sites. I decided to thoroughly study and analyze how this works, manifests and influences JS toolkits.&lt;br /&gt;
&lt;br /&gt;
The best approach here is to study whitepaper located at  &lt;a href=&quot;http://comparitech.net/websecuritytools&quot; id=&quot;link-id0x7f98d4a703d8&quot;&gt;http://comparitech.net/websecuritytools&lt;/a&gt; . One can find a typical attack scenario, some defense suggestions and security considerations. While the paper is (in my opinion) oversized, telling rather small amount of facts on large amount of pages, it contains some interesting information. Let me share how all this relates to OAT.&lt;br /&gt;
&lt;br /&gt;
First of all, I must conclude that none of OAT-based apps is vulnerable to mentioned attacks, for two reasons:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;attacks are only appliable in JSON documents, fetched via GET method. Our OAT apps use XML format, requested with POST (via XML/A - SOAP).&lt;/li&gt;
	&lt;li&gt;attacks are only appliable when security tokens (i.e. user name, password) are passed via browser cookie. This is not our case, since we pass these in POST request&amp;#39;s body.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, we might take into consideration the fact that OAT can be used for building different applications. So I added some low-level support for security countermeasures mentioned in the PDF document. Specifically (as a client-side only toolkit), the following two methods:&lt;br /&gt;
&lt;br /&gt;
  a) cookie-based secret, passed as URL parameter in GET requests. So every OAT.AJAX.GET invocation will&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;set a cookie called &amp;#39;oatSecurityCookie&amp;#39; to some random value&lt;/li&gt;
	&lt;li&gt;add &amp;#39;oatSecurityCookie=xxx&amp;#39; to URL string, where xxx equals to the random value mentioned above. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;  b) enhanced JSON parser with smarter text analysis, effectively filtering out&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;comments (at the beginning and end of JSONified text)&lt;/li&gt;
	&lt;li&gt;the &amp;#39;while(1);&amp;#39; trap, situated at the beginning of received text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both methods are now mentioned in the OAT documentation. Of course, applying OAT eqipped with these countermeasures doesn&amp;#39;t make (yet) your app secure: one must explicitely use one (or both) methods on server side, to complement OAT&amp;#39;s security features.&lt;br /&gt;
&lt;br /&gt;
To sum this up - OAT is now providing a maximum support for securing GETting JSONified data. It is up to user whether he wants to take advantage of this. We are - as (nearly) always - ready :)&lt;/p&gt;


</description></item>
</channel>
</rss>
