<?xml version="1.0" encoding="UTF-8" ?>
<!--ATOM based XML document generated By OpenLink Virtuoso-->
<atom:feed xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:vi="http://www.openlinksw.com/weblog/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/">
<atom:id>http://www.openlinksw.com:443/weblog/dav/dav-blog-1/</atom:id>
<atom:title>OpenLink Community Blog</atom:title>
<atom:link href="http://www.openlinksw.com:443/weblog/dav/dav-blog-1/" type="text/html" rel="alternate" />
<atom:link href="http://www.openlinksw.com:443/blogs/gems/atom_date_arch.xml?:sel=&amp;:bid=dav-blog-1" type="application/atom+xml" rel="self" />
<atom:subtitle>A Collection of blogs by OpenLink Staff</atom:subtitle>
 <atom:author>
  <atom:name>kidehen@openlinksw.com</atom:name>
  <atom:email>kidehen@openlinksw.com</atom:email>
  </atom:author>
<atom:updated>2026-09-06T19:32:00Z</atom:updated>
<atom:generator>Virtuoso Universal Server 08.03.3334</atom:generator>
<atom:logo>http://www.openlinksw.com:443/weblog/public/images/vbloglogo.gif</atom:logo>
 <atom:entry>
  <atom:title>New Semantic Publishing Benchmark Record</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2016-01-11#1867</atom:id>
  <atom:published>2016-01-11T15:22:22Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2016-01-11T15:25:17.969354</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>New Semantic Publishing Benchmark Record</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2016-01-11#1866</atom:id>
  <atom:published>2016-01-11T15:22:09Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2016-01-11T15:25:01.739223</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Usage Report, August 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-08-11#1865</atom:id>
  <atom:published>2015-08-11T16:59:23Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently published the latest &lt;a href=&quot;http://bit.ly/1IL35Xu&quot; id=&quot;link-id0x2aabbfb1e308&quot;&gt;DBpedia Usage Report&lt;/a&gt;, covering v3.3 (released July, 2009) to v3.10 (sometimes called &amp;quot;DBpedia 2014&amp;quot;; released September, 2014).&lt;/p&gt; &lt;p&gt;The new report has usage data through July 31, 2015, and brought a few surprises to our eyes. What do you think?&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-11T12:59:23.150522-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Usage Report, August 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-08-11#1864</atom:id>
  <atom:published>2015-08-11T16:58:21Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently published the latest &lt;a href=&quot;http://bit.ly/1IL35Xu&quot; id=&quot;link-id0x2aabbfb1e308&quot;&gt;DBpedia Usage Report&lt;/a&gt;, covering v3.3 (released July, 2009) to v3.10 (sometimes called &amp;quot;DBpedia 2014&amp;quot;; released September, 2014).&lt;/p&gt; &lt;p&gt;The new report has usage data through July 31, 2015, and brought a few surprises to our eyes. What do you think?&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-11T12:58:21.429167-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Big Data, Part 2: Virtuoso Meets Impala</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-07-15#1863</atom:id>
  <atom:published>2015-07-15T20:17:55Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this article we will look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac0250bde8&quot;&gt;Virtuoso&lt;/a&gt; vs. &lt;a href=&quot;https://dbpedia.org/resource/Cloudera_Impala&quot; id=&quot;link-id0x2aac01e3c6d8&quot;&gt;Impala&lt;/a&gt; with 100G TPC-H on two R3.8 EC2 instances. We get a single user win for Virtuoso by a factor of 136, and a five user win by a factor of 55. The details and analysis follow.&lt;/p&gt; &lt;p&gt;The load setup is the same as ever, with copying from CSV files attached as external tables into &lt;a href=&quot;http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/v2-0-x/topics/impala_parquet.html&quot; id=&quot;link-id0x2aac014886d8&quot;&gt;Parquet tables&lt;/a&gt;. We get &lt;code&gt;lineitem&lt;/code&gt; split over 88 Parquet files, which should provide enough parallelism for the platform. The Impala documentation states that there can be up to one thread per file, and here we wish to see maximum parallelism for a single query stream. We use the schema from the &lt;a href=&quot;https://github.com/cloudera/impala&quot; id=&quot;link-id0x2aac01cb0518&quot;&gt;Impala github&lt;/a&gt; checkout, with &lt;code&gt;string&lt;/code&gt; for &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; columns, and &lt;code&gt;decimal&lt;/code&gt; for &lt;code&gt;numbers&lt;/code&gt;. We suppose the authors know what works best.&lt;/p&gt; &lt;p&gt;The execution behavior is surprising. Sometimes we get full platform utilization, but quite often only 200% CPU per box. The query plan for Q1, for example, says 2 cores per box. This makes no sense, as the same plan fully well knows the table cardinality. The settings for scanner threads and cores to use (in &lt;code&gt;impala-shell&lt;/code&gt;) can be changed, but the behavior does not seem to change.&lt;/p&gt; &lt;p&gt;Following are the run times for one query stream.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Impala&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; — &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 332     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 841     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Data Load &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.098 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 164.61  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.187 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 24.19  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.761 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 105.70  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.205 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 179.67  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.808 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 84.51  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.403 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.43  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 270.88  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.775 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 51.89  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.836 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 177.72  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.165 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 39.85  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.37  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 22.56  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.356 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 17.03  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.233 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 103.67  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.488 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 10.86  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.72  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 11.49  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.814 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.93  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.681 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 276.06  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.324 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 267.13  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.417 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 368.80  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.792 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 60.45  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.720 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 418.09  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.155 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 40.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Total &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 20     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2724     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Because the platform utilization was often low, we made a second experiment running the same queries in five parallel sessions. We show the average execution time for each query. We then compare this with the Virtuoso throughput run average times. We permute the single query stream used in the first tests in 5 different orders, as per the TPC-H spec. The results are not entirely comparable, because Virtuoso is doing the refreshes in parallel. According to Impala documentation, there is no random delete operation, so the refreshes cannot be implemented.&lt;/p&gt; &lt;p&gt;Just to establish a baseline, we do &lt;code&gt;SELECT COUNT (*) FROM lineitem&lt;/code&gt;. This takes 20s when run by itself. When run in five parallel sessions, the fastest terminates in 64s and the slowest in 69s. Looking at &lt;code&gt;top&lt;/code&gt;, the platform utilization is indeed about 5x more in CPU%, but the concurrency does not add much to throughput. This is odd, considering that there is no synchronization requirement worth mentioning between the operations.&lt;/p&gt; &lt;p&gt;Following are the average times for each query in the 5 stream experiment.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Impala&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.95 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 191.81 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.70 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 40.40 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.01 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 95.67 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.71 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 345.11 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.93 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 112.29 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.76 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 14.41 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.08 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 329.25 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.00 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 98.91 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 5.58 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 250.88 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 8.23 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 55.23 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.26 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 27.84 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.74 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 37.66 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 6.07 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 147.69 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.73 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.91 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.27 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.79 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.41 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 34.76 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.92 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 362.43 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.02 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 348.08 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.27 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 443.94 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.05 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 92.50 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.00 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 623.69 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.37 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 61.36 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Total for &lt;br /&gt; Slowest Stream &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 67    s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3740    s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;There are 4 queries in Impala that terminated with an error (&lt;code&gt;memory limit exceeded&lt;/code&gt;). These were two Q21s, one Q19, one Q4. One stream executed without errors, so this stream is reported as the slowest stream. Q21 will, in the absence of indexed access, do a hash build side of half of &lt;code&gt;lineitem&lt;/code&gt;, which explains running out of memory. Virtuoso does Q21 mostly by index.&lt;/p&gt; &lt;p&gt;Looking at the 5 streams, we see CPU between 1000% and 2000% on either box. This looks about 5x more than the 250% per box that we were seeing with, for instance, Q1. The process sizes for &lt;code&gt;impalad&lt;/code&gt; are over 160G, certainly enough to have the working set in memory. &lt;code&gt;iostat&lt;/code&gt; also does not show any &lt;code&gt;I&lt;/code&gt;, so we seem to be running from memory, as intended.&lt;/p&gt; &lt;p&gt;We observe that Impala does not store tables in any specific order. Therefore a merge join of &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt; is not possible. Thus we always get a hash join with a potentially large build side, e.g., half of &lt;code&gt;orders&lt;/code&gt; and half of &lt;code&gt;lineitem&lt;/code&gt; in Q21, and all &lt;code&gt;orders&lt;/code&gt; in Q9. This explains in part why these take so long. &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aac01486778&quot;&gt;TPC-DS&lt;/a&gt; does not pose this particular problem though, as there are no tables in the DS schema where the primary key of one would be the prefix of that of another.&lt;/p&gt; &lt;p&gt;However, the &lt;code&gt;lineitem/orders&lt;/code&gt; join does not explain the scores on Q1, Q20, or Q19. A simple hash join of &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; was about 90s, with a replicated &lt;code&gt;part&lt;/code&gt; hash table. In the profile, the hash probe was 74s, which seems excessive. One would have to single-step through the hash probe to find out what actually happens. Maybe there are prohibitive numbers of collisions, which would throw off the results across the board. We would have to ask the Impala community about this.&lt;/p&gt; &lt;p&gt;Anyway, &lt;i&gt;&lt;b&gt;Impala experts out there are invited to set the record straight.&lt;/b&gt;&lt;/i&gt; We have attached the results and the output of the Impala &lt;code&gt;profile&lt;/code&gt; statement for each query for the single stream run. &lt;code&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/media/impala_stream0.zip&quot; title=&quot;impala_stream0.zip&quot; alt=&quot;impala_stream0.zip&quot; id=&quot;link-id0x2aac0170e038&quot;&gt;impala_stream0.zip&lt;/a&gt;&lt;/code&gt; contains the evidence for the single-stream run; &lt;code&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/media/impala-stream1-5.zip&quot; title=&quot;impala-stream1-5.zip&quot; alt=&quot;impala-stream1-5.zip&quot; id=&quot;link-id0x2aac0170e258&quot;&gt;impala-stream1-5.zip&lt;/a&gt;&lt;/code&gt; holds the 5-stream run.&lt;/p&gt; &lt;p&gt;To be more Big Data-like, we should probably run with significantly larger data than memory; for example, 3T in 0.5T RAM. At EC2, we could do this with 2 I3.8 instances (6.4T SSD each). With Virtuoso, we&amp;#39;d be done in 8 hours or so, counting 2x for the I/O and 30x for the greater scale (the 100G experiment goes in 8 minutes or so, all included). With Impala, we could be running for weeks, so at the very least we&amp;#39;d like to do this with an Impala expert, to make sure things are done right and will not have to be retried. Some of the hash joins would have to be done in multiple passes and with partitioning.&lt;/p&gt; &lt;p&gt;In subsequent articles, we will look at other players in this space, and possibly some other benchmarks, like the TPC-DS subset that &lt;a href=&quot;http://www.actian.com/&quot; id=&quot;link-id0x2aac0045dc78&quot;&gt;Actian&lt;/a&gt; uses to beat Impala.&lt;/p&gt;</atom:content>
  <atom:updated>2015-07-15T16:17:55.789042-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Big Data, Part 2: Virtuoso Meets Impala</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-07-15#1862</atom:id>
  <atom:published>2015-07-15T20:12:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this article we will look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac0250bde8&quot;&gt;Virtuoso&lt;/a&gt; vs. &lt;a href=&quot;https://dbpedia.org/resource/Cloudera_Impala&quot; id=&quot;link-id0x2aac01e3c6d8&quot;&gt;Impala&lt;/a&gt; with 100G TPC-H on two R3.8 EC2 instances. We get a single user win for Virtuoso by a factor of 136, and a five user win by a factor of 55. The details and analysis follow.&lt;/p&gt; &lt;p&gt;The load setup is the same as ever, with copying from CSV files attached as external tables into &lt;a href=&quot;http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/v2-0-x/topics/impala_parquet.html&quot; id=&quot;link-id0x2aac014886d8&quot;&gt;Parquet tables&lt;/a&gt;. We get &lt;code&gt;lineitem&lt;/code&gt; split over 88 Parquet files, which should provide enough parallelism for the platform. The Impala documentation states that there can be up to one thread per file, and here we wish to see maximum parallelism for a single query stream. We use the schema from the &lt;a href=&quot;https://github.com/cloudera/impala&quot; id=&quot;link-id0x2aac01cb0518&quot;&gt;Impala github&lt;/a&gt; checkout, with &lt;code&gt;string&lt;/code&gt; for &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; columns, and &lt;code&gt;decimal&lt;/code&gt; for &lt;code&gt;numbers&lt;/code&gt;. We suppose the authors know what works best.&lt;/p&gt; &lt;p&gt;The execution behavior is surprising. Sometimes we get full platform utilization, but quite often only 200% CPU per box. The query plan for Q1, for example, says 2 cores per box. This makes no sense, as the same plan fully well knows the table cardinality. The settings for scanner threads and cores to use (in &lt;code&gt;impala-shell&lt;/code&gt;) can be changed, but the behavior does not seem to change.&lt;/p&gt; &lt;p&gt;Following are the run times for one query stream.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Impala&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; — &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 332     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 841     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Data Load &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.098 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 164.61  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.187 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 24.19  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.761 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 105.70  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.205 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 179.67  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.808 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 84.51  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.403 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.43  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 270.88  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.775 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 51.89  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.836 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 177.72  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.165 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 39.85  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.37  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 22.56  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.356 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 17.03  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.233 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 103.67  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.488 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 10.86  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.72  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 11.49  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.814 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.93  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.681 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 276.06  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.324 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 267.13  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.417 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 368.80  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.792 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 60.45  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.720 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 418.09  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.155 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 40.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Total &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 20     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2724     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Because the platform utilization was often low, we made a second experiment running the same queries in five parallel sessions. We show the average execution time for each query. We then compare this with the Virtuoso throughput run average times. We permute the single query stream used in the first tests in 5 different orders, as per the TPC-H spec. The results are not entirely comparable, because Virtuoso is doing the refreshes in parallel. According to Impala documentation, there is no random delete operation, so the refreshes cannot be implemented.&lt;/p&gt; &lt;p&gt;Just to establish a baseline, we do &lt;code&gt;SELECT COUNT (*) FROM lineitem&lt;/code&gt;. This takes 20s when run by itself. When run in five parallel sessions, the fastest terminates in 64s and the slowest in 69s. Looking at &lt;code&gt;top&lt;/code&gt;, the platform utilization is indeed about 5x more in CPU%, but the concurrency does not add much to throughput. This is odd, considering that there is no synchronization requirement worth mentioning between the operations.&lt;/p&gt; &lt;p&gt;Following are the average times for each query in the 5 stream experiment.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Impala&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.95 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 191.81 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.70 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 40.40 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.01 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 95.67 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.71 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 345.11 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.93 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 112.29 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.76 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 14.41 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.08 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 329.25 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.00 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 98.91 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 5.58 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 250.88 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 8.23 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 55.23 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 4.26 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 27.84 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.74 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 37.66 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 6.07 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 147.69 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.73 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.91 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.27 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 23.79 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.41 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 34.76 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.92 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 362.43 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.02 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 348.08 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.27 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 443.94 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.05 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 92.50 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.00 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 623.69 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.37 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 61.36 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Total for &lt;br /&gt; Slowest Stream &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 67    s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3740    s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;There are 4 queries in Impala that terminated with an error (&lt;code&gt;memory limit exceeded&lt;/code&gt;). These were two Q21s, one Q19, one Q4. One stream executed without errors, so this stream is reported as the slowest stream. Q21 will, in the absence of indexed access, do a hash build side of half of &lt;code&gt;lineitem&lt;/code&gt;, which explains running out of memory. Virtuoso does Q21 mostly by index.&lt;/p&gt; &lt;p&gt;Looking at the 5 streams, we see CPU between 1000% and 2000% on either box. This looks about 5x more than the 250% per box that we were seeing with, for instance, Q1. The process sizes for &lt;code&gt;impalad&lt;/code&gt; are over 160G, certainly enough to have the working set in memory. &lt;code&gt;iostat&lt;/code&gt; also does not show any &lt;code&gt;I&lt;/code&gt;, so we seem to be running from memory, as intended.&lt;/p&gt; &lt;p&gt;We observe that Impala does not store tables in any specific order. Therefore a merge join of &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt; is not possible. Thus we always get a hash join with a potentially large build side, e.g., half of &lt;code&gt;orders&lt;/code&gt; and half of &lt;code&gt;lineitem&lt;/code&gt; in Q21, and all &lt;code&gt;orders&lt;/code&gt; in Q9. This explains in part why these take so long. &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aac01486778&quot;&gt;TPC-DS&lt;/a&gt; does not pose this particular problem though, as there are no tables in the DS schema where the primary key of one would be the prefix of that of another.&lt;/p&gt; &lt;p&gt;However, the &lt;code&gt;lineitem/orders&lt;/code&gt; join does not explain the scores on Q1, Q20, or Q19. A simple hash join of &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; was about 90s, with a replicated &lt;code&gt;part&lt;/code&gt; hash table. In the profile, the hash probe was 74s, which seems excessive. One would have to single-step through the hash probe to find out what actually happens. Maybe there are prohibitive numbers of collisions, which would throw off the results across the board. We would have to ask the Impala community about this.&lt;/p&gt; &lt;p&gt;Anyway, &lt;i&gt;&lt;b&gt;Impala experts out there are invited to set the record straight.&lt;/b&gt;&lt;/i&gt; We have attached the results and the output of the Impala &lt;code&gt;profile&lt;/code&gt; statement for each query for the single stream run. &lt;code&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/media/impala_stream0.zip&quot; title=&quot;impala_stream0.zip&quot; alt=&quot;impala_stream0.zip&quot; id=&quot;link-id0x2aac0170e038&quot;&gt;impala_stream0.zip&lt;/a&gt;&lt;/code&gt; contains the evidence for the single-stream run; &lt;code&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/media/impala-stream1-5.zip&quot; title=&quot;impala-stream1-5.zip&quot; alt=&quot;impala-stream1-5.zip&quot; id=&quot;link-id0x2aac0170e258&quot;&gt;impala-stream1-5.zip&lt;/a&gt;&lt;/code&gt; holds the 5-stream run.&lt;/p&gt; &lt;p&gt;To be more Big Data-like, we should probably run with significantly larger data than memory; for example, 3T in 0.5T RAM. At EC2, we could do this with 2 I3.8 instances (6.4T SSD each). With Virtuoso, we&amp;#39;d be done in 8 hours or so, counting 2x for the I/O and 30x for the greater scale (the 100G experiment goes in 8 minutes or so, all included). With Impala, we could be running for weeks, so at the very least we&amp;#39;d like to do this with an Impala expert, to make sure things are done right and will not have to be retried. Some of the hash joins would have to be done in multiple passes and with partitioning.&lt;/p&gt; &lt;p&gt;In subsequent articles, we will look at other players in this space, and possibly some other benchmarks, like the TPC-DS subset that &lt;a href=&quot;http://www.actian.com/&quot; id=&quot;link-id0x2aac0045dc78&quot;&gt;Actian&lt;/a&gt; uses to beat Impala.&lt;/p&gt;</atom:content>
  <atom:updated>2015-07-15T16:12:27.639584-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Vectored Execution in Column/Row Stores</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-07-13#1861</atom:id>
  <atom:published>2015-07-13T17:49:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article discusses the relationship between vectored execution and column- and row-wise data representations. &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x2aab8a00d208&quot;&gt;Column stores&lt;/a&gt; are traditionally considered to be good for big scans but poor at indexed access. This is not necessarily so, though. We take &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab8a00d398&quot;&gt;TPC-H Q9&lt;/a&gt; as a starting point, working with different row- and column-wise data representations and index choices. The goal of the article is to provide a primer on the performance implications of different physical designs.&lt;/p&gt; &lt;p&gt;All the experiments are against the TPC-H 100G dataset hosted in Virtuoso on the test system used before in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab8bcec9d8&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630, 2x6 cores x 2 threads, 2.3GHz, 192 GB RAM. The Virtuoso version corresponds to the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aab8bcecbd8&quot;&gt;feature/analytics branch&lt;/a&gt; in the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aab8bceccb8&quot;&gt;v7fasttrack github project&lt;/a&gt;. All run times are from memory, and queries generally run at full platform, 24 concurrent threads.&lt;/p&gt; &lt;p&gt;We note that RDF stores and graph databases usually do not have secondary indices with multiple key parts. However, these do predominantly index-based access as opposed to big scans and hash joins. To explore the impact of this, we have decomposed the tables into projections with a single dependent column, which approximates a triple store or a vertically-decomposed graph database like &lt;a href=&quot;http://dbpedia.org/resource/DEX_(Graph_database)&quot; id=&quot;link-id0x2aab8bced038&quot;&gt;Sparksee&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, in these experiments, we store the relevant data four times over, as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;100G TPC-H dataset in the column-wise schema as discussed in the TPC-H series, now complemented with indices on &lt;code&gt;l_partkey&lt;/code&gt; and on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The same in row-wise data representation &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Column-wise tables with a single dependent column for &lt;code&gt;l_partkey, l_suppkey, l_extendedprice, l_quantity, l_discount, ps_supplycost, s_nationkey, p_name&lt;/code&gt;. These all have the original tables primary key, e.g., &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt; for the &lt;code&gt;l_ prefixed tables&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The same with row-wise tables&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The column-wise structures are in the &lt;code&gt;DB&lt;/code&gt; qualifier, and the row-wise are in the &lt;code&gt;R&lt;/code&gt; qualifier. There is a summary of space consumption at the end of the article. This is relevant for scalability, since even if row-wise structures can be faster for scattered random access, they will fit less data in RAM, typically 2 to 3x less. Thus, if &amp;quot;faster&amp;quot; rows cause the working set not to fit, &amp;quot;slower&amp;quot; columns will still win.&lt;/p&gt; &lt;p&gt;As a starting point, we know that the best Q9 is the one in the Virtuoso TPC-H implementation which is described in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab8a78d208&quot;&gt;Part 10 of the TPC-H blog series&lt;/a&gt;. This is a scan of &lt;code&gt;lineitem&lt;/code&gt; with a selective hash join followed ordered index access of &lt;code&gt;orders&lt;/code&gt;, then hash joins against the smaller tables. There are special tricks to keep the hash tables small by propagating restrictions from the probe side to the build side.&lt;/p&gt; &lt;p&gt;The query texts are &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/&quot; id=&quot;link-id0x2aab8bc59538&quot;&gt;available here&lt;/a&gt;, along with the table declarations and scripts for populating the single-column projections. &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/rs.sql&quot; id=&quot;link-id0x2aab8bc59778&quot;&gt;rs.sql&lt;/a&gt;&lt;/code&gt; makes the tables and indices, &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/rsload.sql&quot; id=&quot;link-id0x2aab8bc59918&quot;&gt;rsload.sql&lt;/a&gt;&lt;/code&gt; copies the data from the TPC-H tables.&lt;/p&gt; &lt;p&gt;The business question is to calculate the profit from sale of selected &lt;code&gt;parts&lt;/code&gt; grouped by &lt;code&gt;year&lt;/code&gt; and &lt;code&gt;country&lt;/code&gt; of the &lt;code&gt;supplier&lt;/code&gt;. This touches most of the tables, aggregates over 1/17 of all sales, and touches at least every page of the tables concerned, if not every row.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT n_name AS nation, EXTRACT(year FROM o_orderdate) AS o_year, SUM (l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity) AS sum_profit FROM lineitem, part, partsupp, orders, supplier, nation WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey AND ps_partkey = l_partkey AND p_partkey = l_partkey AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey AND p_name LIKE &amp;#39;%green%&amp;#39; GROUP BY nation, o_year ORDER BY nation, o_year DESC &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Query Variants&lt;/h2&gt; &lt;p&gt;The query variants discussed here are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Hash based, the best plan -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9h.sql&quot; id=&quot;link-id0x2aab8bd04788&quot;&gt;9h.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with multicolumn rows, with &lt;code&gt;lineitem&lt;/code&gt; index on &lt;code&gt;l_partkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9i.sql&quot; id=&quot;link-id0x2aab8bd04bb8&quot;&gt;9i.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ir.sql&quot; id=&quot;link-id0x2aab88894bf8&quot;&gt;9ir.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with multicolumn rows, &lt;code&gt;lineitem&lt;/code&gt; index on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ip.sql&quot; id=&quot;link-id0x2aab88894fc8&quot;&gt;9ip.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ipr.sql&quot; id=&quot;link-id0x2aab888950c8&quot;&gt;9ipr.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with one table per dependent column, index on &lt;code&gt;l_partkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9p.sql&quot; id=&quot;link-id0x2aab8a4e42c8&quot;&gt;9p.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;index based with one table per dependent column, with materialized &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; -&amp;gt; &lt;code&gt;l_orderkey, l_minenumber&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9pp.sql&quot; id=&quot;link-id0x2aab8a4e4708&quot;&gt;9pp.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ppr.sql&quot; id=&quot;link-id0x2aab8a4e4808&quot;&gt;9ppr.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;These are done against row- and column-wise data representations with 3 different vectorization settings. The dynamic vector size starts at 10,000 values in a vector, and adaptively upgrades this to 1,000,000 if it finds that index access is too sparse. Accessing rows close to each other is more efficient than widely scattered rows in vectored index access, so using a larger vector will likely cause a denser, hence more efficient, access pattern.&lt;/p&gt; &lt;p&gt;The 10K vector size corresponds to running with a fixed vector size. The Vector 1 sets vector size to 1, effectively running a tuple at a time, which corresponds to a non-vectorized engine.&lt;/p&gt; &lt;p&gt;We note that &lt;code&gt;lineitem&lt;/code&gt; and its single column projections contain 600M rows. So, a vector of 10K values will hit, on the average, every 60,000th row. A vector of 1,000,000 will thus hit every 600th. This is when doing random lookups that are in no specific order, e.g., getting &lt;code&gt;lineitems&lt;/code&gt; by a secondary index on &lt;code&gt;l_partkey&lt;/code&gt;.&lt;/p&gt; &lt;h3&gt;1 — Hash-based plan&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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4.1 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4.1 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;145   s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;25.6 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;25.9 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;45.4 s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Dynamic vector size has no effect here, as there is no indexed access that would gain from more locality. The column store is much faster because of less memory access (just scan the &lt;code&gt;l_partkey&lt;/code&gt; column, and filter this with a Bloom filter; and then hash table lookup to pick only items with the desired &lt;code&gt;part&lt;/code&gt;). The other columns are accessed only for the matching rows. The hash lookup is vectored since there are hundreds of compressed &lt;code&gt;l_partkey&lt;/code&gt; values available at each time. The row store does the hash lookup row by row, hence losing cache locality and instruction-level parallelism.&lt;/p&gt; &lt;p&gt;Without vectorization, we have a situation where the &lt;code&gt;lineitem&lt;/code&gt; scan emits one row at a time. Restarting the scan with the column store takes much longer, since 5 buffers have to be located and pinned instead of one for the row store. The row store is thus slowed down less, but it too suffers almost a factor of 2 from interpretation overhead.&lt;/p&gt; &lt;h3&gt;2 — Index-based, &lt;code&gt;lineitem&lt;/code&gt; indexed on &lt;code&gt;l_partkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 30.4 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 62.3 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 321   s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 31.8 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 27.7 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 122   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Here the plan scans &lt;code&gt;part&lt;/code&gt;, then &lt;code&gt;partsupp&lt;/code&gt;, which shares ordering with &lt;code&gt;part&lt;/code&gt;; both are ordered on &lt;code&gt;partkey&lt;/code&gt;. Then &lt;code&gt;lineitem&lt;/code&gt; is fetched by a secondary index on &lt;code&gt;l_partkey&lt;/code&gt;. This produces &lt;code&gt;l_orderkey, l_lineitem&lt;/code&gt;, which are used to get the &lt;code&gt;l_suppkey&lt;/code&gt;. We then check if the &lt;code&gt;l_suppkey&lt;/code&gt; matches the &lt;code&gt;ps_suppkey&lt;/code&gt; from &lt;code&gt;partsupp&lt;/code&gt;, which drops 3/4 of the rows. The next join is on &lt;code&gt;orders&lt;/code&gt;, which shares ordering with &lt;code&gt;lineitem&lt;/code&gt;; both are ordered on &lt;code&gt;orderkey&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;There is a narrow win for columns with dynamic vector size. When access becomes scattered, rows win by 2.5x, because there is only one page to access instead of 1 + 3 for columns. This is compensated for if the next item is found on the same page, which happens if the access pattern is denser. &lt;/p&gt; &lt;h3&gt;3 — Index-based, &lt;code&gt;lineitem&lt;/code&gt; indexed on &lt;code&gt;L_partkey, l_suppkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 16.9 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 47.2 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 151   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.4 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 20.7 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 89   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;This is similar to the previous, except that now only &lt;code&gt;lineitems&lt;/code&gt; that match &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt; are accessed, as the secondary index has two columns. Access is more local. Columns thus win more with dynamic vector size.&lt;/p&gt; &lt;h3&gt;4 — Decomposed, index on &lt;code&gt;l_partkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 35.7 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 170   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 601   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 44.5 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 56.2 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 130   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Now, each of the &lt;code&gt;l_extendedprice, l_discount, l_quantity&lt;/code&gt; and &lt;code&gt;l_suppkey&lt;/code&gt; is a separate index lookup. The times are slightly higher but the dynamic is the same.&lt;/p&gt; &lt;p&gt;The non-vectored columns case is hit the hardest.&lt;/p&gt; &lt;h3&gt;5 — Decomposed, index on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 19.6 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 111   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 257   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 32.0 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 37   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 74.9 s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Again, we see the same dynamic as with a multicolumn table. Columns win slightly more at long vector sizes because of overall better index performance in the presence of locality.&lt;/p&gt; &lt;h2&gt;Space Utilization &lt;/h2&gt; &lt;p&gt;The following tables list the space consumption in megabytes of allocated pages. Unallocated space in database files is not counted.&lt;/p&gt; &lt;p&gt;The row-wise table also contains entries for column-wise structures (&lt;code&gt;DB.*&lt;/code&gt;) since these have a row-wise sparse index. The size of this is however negligible, under 1% of the column-wise structures.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align: center;&quot;&gt;Row-Wise&lt;/th&gt; &lt;th&gt;  &lt;/th&gt; &lt;th style=&quot;text-align: center;&quot;&gt; Column-Wise&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;vertical-align:top;&quot;&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;MB&lt;/th&gt; &lt;th&gt;structure&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;73515&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.LINEITEM&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;14768&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11728&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.PARTSUPP&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10161&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10003&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;9908&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8761&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8745&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8738&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8713&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;6267&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2223&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2180&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.o_orderdate&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2041&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1911&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1281&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.ps_supplycost&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;811&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.p_name&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;127&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.SUPPLIER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;88&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.LINEITEM&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PARTSUPP&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.s_nationkey&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/td&gt; &lt;td&gt;  &lt;/td&gt; &lt;td style=&quot;vertical-align:top;&quot;&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;MB&lt;/th&gt; &lt;th&gt;structure&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;36482&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.LINEITEM&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;13087&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11587&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PARTSUPP&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;5181&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4431&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3072&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2958&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2918&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2835&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2067&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1618&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1156&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;961&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ps_supplycost&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;814&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;798&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;724&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.p_name&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;436&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.o_orderdate&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;126&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.SUPPLIER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.s_nationkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;In both cases, the large tables are on top, but the column-wise case takes only half the space due to compression. &lt;/p&gt; &lt;p&gt;We note that the single column projections are smaller column-wise. The &lt;code&gt;l_extendedprice&lt;/code&gt; is not very compressible hence column-wise takes much more space than &lt;code&gt;l_quantity&lt;/code&gt;; the row-wise difference is less. Since the leading key parts &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt; are ordered and very compressible, the column-wise structures are in all cases noticeably more compact.&lt;/p&gt; &lt;p&gt;The same applies to the multipart index &lt;code&gt;l_pksk&lt;/code&gt; and &lt;code&gt;r_l_pksk&lt;/code&gt; (&lt;code&gt;l_partkey, l_suppkey, l_orderkey, l_linenumber&lt;/code&gt;) in column- and row-wise representations.&lt;/p&gt; &lt;p&gt;Note that &lt;code&gt;STRING&lt;/code&gt; columns (e.g., &lt;code&gt;l_comment&lt;/code&gt;) are not compressed. If they were, the overall space ratio would be even more to the advantage of the column store.&lt;/p&gt; &lt;h2&gt;Conclusions &lt;/h2&gt; &lt;p&gt;Column stores and vectorization inextricably belong together. Column-wise compression yields great gains also for indices, since sorted data is easy to compress. Also for non-sorted data, adaptive use of dictionaries, run lengths, etc., produce great space savings. Columns also win with indexed access if there is locality.&lt;/p&gt; &lt;p&gt;Row stores have less dependence on locality, but they also will win by a factor of 3 from dropping interpretation overhead and exploiting join locality.&lt;/p&gt; &lt;p&gt;For point lookups, columns lose by 2+x but considering their better space efficiency, they will still win if space savings prevent going to secondary storage. For bulk random access, like in graph analytics, columns will win because of being able to operate on a large vector of keys to fetch.&lt;/p&gt; &lt;p&gt;For many workloads, from TPC-H to LDBC social network, multi-part keys are a necessary component of physical design for performance if indexed access predominates. Triple stores and most graph databases do not have such and are therefore at a disadvantage. Self-joining, like in RDF or other vertically decomposed structures, can cost up to a factor of 10-20 over a column-wise multicolumn table. This depends however on the density of access.&lt;/p&gt; &lt;p&gt;For analytical workloads, where the dominant join pattern is the scan with selective hash join, column stores are unbeatable, as per common wisdom. There are good physical reasons for this and the row store even with well implemented vectorization loses by a factor of 5.&lt;/p&gt; &lt;p&gt;For decomposed structures, like RDF quads or single column projections of tables, column stores are relatively more advantageous because the key columns are extensively repeated, and these compress better with columns than with rows. In all the RDF workloads we have tried, columns never lose, but there is often a draw between rows and columns for lookup workloads. The longer the query, the more columns win.&lt;/p&gt;</atom:content>
  <atom:updated>2015-07-13T13:56:51.535359-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Vectored Execution in Column/Row Stores</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-07-13#1860</atom:id>
  <atom:published>2015-07-13T17:46:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article discusses the relationship between vectored execution and column- and row-wise data representations. &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x2aab8a00d208&quot;&gt;Column stores&lt;/a&gt; are traditionally considered to be good for big scans but poor at indexed access. This is not necessarily so, though. We take &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab8a00d398&quot;&gt;TPC-H Q9&lt;/a&gt; as a starting point, working with different row- and column-wise data representations and index choices. The goal of the article is to provide a primer on the performance implications of different physical designs.&lt;/p&gt; &lt;p&gt;All the experiments are against the TPC-H 100G dataset hosted in Virtuoso on the test system used before in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab8bcec9d8&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630, 2x6 cores x 2 threads, 2.3GHz, 192 GB RAM. The Virtuoso version corresponds to the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aab8bcecbd8&quot;&gt;feature/analytics branch&lt;/a&gt; in the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aab8bceccb8&quot;&gt;v7fasttrack github project&lt;/a&gt;. All run times are from memory, and queries generally run at full platform, 24 concurrent threads.&lt;/p&gt; &lt;p&gt;We note that RDF stores and graph databases usually do not have secondary indices with multiple key parts. However, these do predominantly index-based access as opposed to big scans and hash joins. To explore the impact of this, we have decomposed the tables into projections with a single dependent column, which approximates a triple store or a vertically-decomposed graph database like &lt;a href=&quot;http://dbpedia.org/resource/DEX_(Graph_database)&quot; id=&quot;link-id0x2aab8bced038&quot;&gt;Sparksee&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, in these experiments, we store the relevant data four times over, as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;100G TPC-H dataset in the column-wise schema as discussed in the TPC-H series, now complemented with indices on &lt;code&gt;l_partkey&lt;/code&gt; and on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The same in row-wise data representation &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Column-wise tables with a single dependent column for &lt;code&gt;l_partkey, l_suppkey, l_extendedprice, l_quantity, l_discount, ps_supplycost, s_nationkey, p_name&lt;/code&gt;. These all have the original tables primary key, e.g., &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt; for the &lt;code&gt;l_ prefixed tables&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The same with row-wise tables&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The column-wise structures are in the &lt;code&gt;DB&lt;/code&gt; qualifier, and the row-wise are in the &lt;code&gt;R&lt;/code&gt; qualifier. There is a summary of space consumption at the end of the article. This is relevant for scalability, since even if row-wise structures can be faster for scattered random access, they will fit less data in RAM, typically 2 to 3x less. Thus, if &amp;quot;faster&amp;quot; rows cause the working set not to fit, &amp;quot;slower&amp;quot; columns will still win.&lt;/p&gt; &lt;p&gt;As a starting point, we know that the best Q9 is the one in the Virtuoso TPC-H implementation which is described in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab8a78d208&quot;&gt;Part 10 of the TPC-H blog series&lt;/a&gt;. This is a scan of &lt;code&gt;lineitem&lt;/code&gt; with a selective hash join followed ordered index access of &lt;code&gt;orders&lt;/code&gt;, then hash joins against the smaller tables. There are special tricks to keep the hash tables small by propagating restrictions from the probe side to the build side.&lt;/p&gt; &lt;p&gt;The query texts are &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/&quot; id=&quot;link-id0x2aab8bc59538&quot;&gt;available here&lt;/a&gt;, along with the table declarations and scripts for populating the single-column projections. &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/rs.sql&quot; id=&quot;link-id0x2aab8bc59778&quot;&gt;rs.sql&lt;/a&gt;&lt;/code&gt; makes the tables and indices, &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/rsload.sql&quot; id=&quot;link-id0x2aab8bc59918&quot;&gt;rsload.sql&lt;/a&gt;&lt;/code&gt; copies the data from the TPC-H tables.&lt;/p&gt; &lt;p&gt;The business question is to calculate the profit from sale of selected &lt;code&gt;parts&lt;/code&gt; grouped by &lt;code&gt;year&lt;/code&gt; and &lt;code&gt;country&lt;/code&gt; of the &lt;code&gt;supplier&lt;/code&gt;. This touches most of the tables, aggregates over 1/17 of all sales, and touches at least every page of the tables concerned, if not every row.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT n_name AS nation, EXTRACT(year FROM o_orderdate) AS o_year, SUM (l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity) AS sum_profit FROM lineitem, part, partsupp, orders, supplier, nation WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey AND ps_partkey = l_partkey AND p_partkey = l_partkey AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey AND p_name LIKE &amp;#39;%green%&amp;#39; GROUP BY nation, o_year ORDER BY nation, o_year DESC &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Query Variants&lt;/h2&gt; &lt;p&gt;The query variants discussed here are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Hash based, the best plan -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9h.sql&quot; id=&quot;link-id0x2aab8bd04788&quot;&gt;9h.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with multicolumn rows, with &lt;code&gt;lineitem&lt;/code&gt; index on &lt;code&gt;l_partkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9i.sql&quot; id=&quot;link-id0x2aab8bd04bb8&quot;&gt;9i.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ir.sql&quot; id=&quot;link-id0x2aab88894bf8&quot;&gt;9ir.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with multicolumn rows, &lt;code&gt;lineitem&lt;/code&gt; index on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ip.sql&quot; id=&quot;link-id0x2aab88894fc8&quot;&gt;9ip.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ipr.sql&quot; id=&quot;link-id0x2aab888950c8&quot;&gt;9ipr.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Index based with one table per dependent column, index on &lt;code&gt;l_partkey&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9p.sql&quot; id=&quot;link-id0x2aab8a4e42c8&quot;&gt;9p.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;index based with one table per dependent column, with materialized &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; -&amp;gt; &lt;code&gt;l_orderkey, l_minenumber&lt;/code&gt; -- &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9pp.sql&quot; id=&quot;link-id0x2aab8a4e4708&quot;&gt;9pp.sql&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150713VectoredExecution/9ppr.sql&quot; id=&quot;link-id0x2aab8a4e4808&quot;&gt;9ppr.sql&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;These are done against row- and column-wise data representations with 3 different vectorization settings. The dynamic vector size starts at 10,000 values in a vector, and adaptively upgrades this to 1,000,000 if it finds that index access is too sparse. Accessing rows close to each other is more efficient than widely scattered rows in vectored index access, so using a larger vector will likely cause a denser, hence more efficient, access pattern.&lt;/p&gt; &lt;p&gt;The 10K vector size corresponds to running with a fixed vector size. The Vector 1 sets vector size to 1, effectively running a tuple at a time, which corresponds to a non-vectorized engine.&lt;/p&gt; &lt;p&gt;We note that &lt;code&gt;lineitem&lt;/code&gt; and its single column projections contain 600M rows. So, a vector of 10K values will hit, on the average, every 60,000th row. A vector of 1,000,000 will thus hit every 600th. This is when doing random lookups that are in no specific order, e.g., getting &lt;code&gt;lineitems&lt;/code&gt; by a secondary index on &lt;code&gt;l_partkey&lt;/code&gt;.&lt;/p&gt; &lt;h3&gt;1 — Hash-based plan&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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4.1 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4.1 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;145   s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;25.6 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;25.9 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;45.4 s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Dynamic vector size has no effect here, as there is no indexed access that would gain from more locality. The column store is much faster because of less memory access (just scan the &lt;code&gt;l_partkey&lt;/code&gt; column, and filter this with a Bloom filter; and then hash table lookup to pick only items with the desired &lt;code&gt;part&lt;/code&gt;). The other columns are accessed only for the matching rows. The hash lookup is vectored since there are hundreds of compressed &lt;code&gt;l_partkey&lt;/code&gt; values available at each time. The row store does the hash lookup row by row, hence losing cache locality and instruction-level parallelism.&lt;/p&gt; &lt;p&gt;Without vectorization, we have a situation where the &lt;code&gt;lineitem&lt;/code&gt; scan emits one row at a time. Restarting the scan with the column store takes much longer, since 5 buffers have to be located and pinned instead of one for the row store. The row store is thus slowed down less, but it too suffers almost a factor of 2 from interpretation overhead.&lt;/p&gt; &lt;h3&gt;2 — Index-based, &lt;code&gt;lineitem&lt;/code&gt; indexed on &lt;code&gt;l_partkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 30.4 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 62.3 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 321   s&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 31.8 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 27.7 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 122   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Here the plan scans &lt;code&gt;part&lt;/code&gt;, then &lt;code&gt;partsupp&lt;/code&gt;, which shares ordering with &lt;code&gt;part&lt;/code&gt;; both are ordered on &lt;code&gt;partkey&lt;/code&gt;. Then &lt;code&gt;lineitem&lt;/code&gt; is fetched by a secondary index on &lt;code&gt;l_partkey&lt;/code&gt;. This produces &lt;code&gt;l_orderkey, l_lineitem&lt;/code&gt;, which are used to get the &lt;code&gt;l_suppkey&lt;/code&gt;. We then check if the &lt;code&gt;l_suppkey&lt;/code&gt; matches the &lt;code&gt;ps_suppkey&lt;/code&gt; from &lt;code&gt;partsupp&lt;/code&gt;, which drops 3/4 of the rows. The next join is on &lt;code&gt;orders&lt;/code&gt;, which shares ordering with &lt;code&gt;lineitem&lt;/code&gt;; both are ordered on &lt;code&gt;orderkey&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;There is a narrow win for columns with dynamic vector size. When access becomes scattered, rows win by 2.5x, because there is only one page to access instead of 1 + 3 for columns. This is compensated for if the next item is found on the same page, which happens if the access pattern is denser. &lt;/p&gt; &lt;h3&gt;3 — Index-based, &lt;code&gt;lineitem&lt;/code&gt; indexed on &lt;code&gt;L_partkey, l_suppkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 16.9 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 47.2 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 151   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.4 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 20.7 s&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 89   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;This is similar to the previous, except that now only &lt;code&gt;lineitems&lt;/code&gt; that match &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt; are accessed, as the secondary index has two columns. Access is more local. Columns thus win more with dynamic vector size.&lt;/p&gt; &lt;h3&gt;4 — Decomposed, index on &lt;code&gt;l_partkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 35.7 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 170   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 601   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 44.5 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 56.2 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 130   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Now, each of the &lt;code&gt;l_extendedprice, l_discount, l_quantity&lt;/code&gt; and &lt;code&gt;l_suppkey&lt;/code&gt; is a separate index lookup. The times are slightly higher but the dynamic is the same.&lt;/p&gt; &lt;p&gt;The non-vectored columns case is hit the hardest.&lt;/p&gt; &lt;h3&gt;5 — Decomposed, index on &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; &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;Vector&lt;/th&gt; &lt;th&gt;Dynamic&lt;/th&gt; &lt;th&gt;10k&lt;/th&gt; &lt;th&gt;1&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Column-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 19.6 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 111   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 257   s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left;&quot;&gt;Row-wise &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 32.0 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 37   s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 74.9 s &lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Again, we see the same dynamic as with a multicolumn table. Columns win slightly more at long vector sizes because of overall better index performance in the presence of locality.&lt;/p&gt; &lt;h2&gt;Space Utilization &lt;/h2&gt; &lt;p&gt;The following tables list the space consumption in megabytes of allocated pages. Unallocated space in database files is not counted.&lt;/p&gt; &lt;p&gt;The row-wise table also contains entries for column-wise structures (&lt;code&gt;DB.*&lt;/code&gt;) since these have a row-wise sparse index. The size of this is however negligible, under 1% of the column-wise structures.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align: center;&quot;&gt;Row-Wise&lt;/th&gt; &lt;th&gt;  &lt;/th&gt; &lt;th style=&quot;text-align: center;&quot;&gt; Column-Wise&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;vertical-align:top;&quot;&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;MB&lt;/th&gt; &lt;th&gt;structure&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;73515&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.LINEITEM&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;14768&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11728&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.PARTSUPP&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10161&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10003&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;9908&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8761&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8745&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8738&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;8713&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;6267&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2223&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2180&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.o_orderdate&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2041&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;r_O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1911&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1281&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.ps_supplycost&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;811&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.p_name&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;127&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.SUPPLIER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;88&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.LINEITEM&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PARTSUPP&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;R.DBA.s_nationkey&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&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/td&gt; &lt;td&gt;  &lt;/td&gt; &lt;td style=&quot;vertical-align:top;&quot;&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;MB&lt;/th&gt; &lt;th&gt;structure&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;36482&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.LINEITEM&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;13087&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ORDERS&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11587&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PARTSUPP&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;5181&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_extendedprice&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4431&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pksk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;3072&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_partkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2958&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;lpk_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2918&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;l_pk&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2835&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_suppkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2067&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.CUSTOMER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1618&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.PART&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1156&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_quantity&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;961&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.ps_supplycost&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;814&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;798&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.l_discount&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;724&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.p_name&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;436&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.o_orderdate&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;126&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.SUPPLIER&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;DB.DBA.s_nationkey&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;In both cases, the large tables are on top, but the column-wise case takes only half the space due to compression. &lt;/p&gt; &lt;p&gt;We note that the single column projections are smaller column-wise. The &lt;code&gt;l_extendedprice&lt;/code&gt; is not very compressible hence column-wise takes much more space than &lt;code&gt;l_quantity&lt;/code&gt;; the row-wise difference is less. Since the leading key parts &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt; are ordered and very compressible, the column-wise structures are in all cases noticeably more compact.&lt;/p&gt; &lt;p&gt;The same applies to the multipart index &lt;code&gt;l_pksk&lt;/code&gt; and &lt;code&gt;r_l_pksk&lt;/code&gt; (&lt;code&gt;l_partkey, l_suppkey, l_orderkey, l_linenumber&lt;/code&gt;) in column- and row-wise representations.&lt;/p&gt; &lt;p&gt;Note that &lt;code&gt;STRING&lt;/code&gt; columns (e.g., &lt;code&gt;l_comment&lt;/code&gt;) are not compressed. If they were, the overall space ratio would be even more to the advantage of the column store.&lt;/p&gt; &lt;h2&gt;Conclusions &lt;/h2&gt; &lt;p&gt;Column stores and vectorization inextricably belong together. Column-wise compression yields great gains also for indices, since sorted data is easy to compress. Also for non-sorted data, adaptive use of dictionaries, run lengths, etc., produce great space savings. Columns also win with indexed access if there is locality.&lt;/p&gt; &lt;p&gt;Row stores have less dependence on locality, but they also will win by a factor of 3 from dropping interpretation overhead and exploiting join locality.&lt;/p&gt; &lt;p&gt;For point lookups, columns lose by 2+x but considering their better space efficiency, they will still win if space savings prevent going to secondary storage. For bulk random access, like in graph analytics, columns will win because of being able to operate on a large vector of keys to fetch.&lt;/p&gt; &lt;p&gt;For many workloads, from TPC-H to LDBC social network, multi-part keys are a necessary component of physical design for performance if indexed access predominates. Triple stores and most graph databases do not have such and are therefore at a disadvantage. Self-joining, like in RDF or other vertically decomposed structures, can cost up to a factor of 10-20 over a column-wise multicolumn table. This depends however on the density of access.&lt;/p&gt; &lt;p&gt;For analytical workloads, where the dominant join pattern is the scan with selective hash join, column stores are unbeatable, as per common wisdom. There are good physical reasons for this and the row store even with well implemented vectorization loses by a factor of 5.&lt;/p&gt; &lt;p&gt;For decomposed structures, like RDF quads or single column projections of tables, column stores are relatively more advantageous because the key columns are extensively repeated, and these compress better with columns than with rows. In all the RDF workloads we have tried, columns never lose, but there is often a draw between rows and columns for lookup workloads. The longer the query, the more columns win.&lt;/p&gt;</atom:content>
  <atom:updated>2015-07-13T13:56:22.323548-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso at SIGMOD 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-07-13#1859</atom:id>
  <atom:published>2015-07-13T16:52:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;Two papers presented at &lt;a href=&quot;http://dbpedia.org/resource/SIGMOD&quot; id=&quot;link-id0x10f5b4448&quot;&gt;SIGMOD&lt;/a&gt; &lt;a href=&quot;http://www.sigmod2015.org/&quot; id=&quot;link-id0x10f84b6e8&quot;&gt;2015&lt;/a&gt; have been added to the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtuosoScienceLibrary&quot; id=&quot;link-id0x10f84b8c8&quot;&gt;Virtuoso Science Library&lt;/a&gt;.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling (OpenLink Software); Alex Averbuch (Neo Technology); Josep Larriba-Pey (Sparsity Technologies); Hassan Chafi (Oracle Labs); Andrey Gubichev (TU Munich); Arnau Prat-Pérez (Universitat Politècnica de Catalunya); Minh-Duc Pham (VU University Amsterdam); Peter Boncz (CWI): &lt;a href=&quot;http://dl.acm.org/authorize.cfm?key=N97179&quot; id=&quot;link-id0x10f7147b8&quot;&gt;The LDBC Social Network Benchmark: Interactive Workload&lt;/a&gt;. &lt;a href=&quot;http://www.sigmod2015.org/toc_sigmod.shtml&quot; id=&quot;link-id0x10f7148d8&quot;&gt;Proceedings of SIGMOD 2015, Melbourne&lt;/a&gt;.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper is an overview of the challenges posed in the LDBC social network benchmark, from data generation to the interactive workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Mihai Capotă (Delft University of Technology), Tim Hegeman (Delft University of Technology), Alexandru Iosup (Delft University of Technology), Arnau Prat-Pérez (Universitat Politècnica de Catalunya), Orri Erling (OpenLink Software), Peter Boncz (CWI): &lt;a href=&quot;http://dl.acm.org/authorize.cfm?key=N97204&quot; id=&quot;link-id0x110864288&quot;&gt;Graphalytics: A Big Data Benchmark for Graph-Processing Platforms&lt;/a&gt;. &lt;a href=&quot;http://www.sigmod2015.org/toc_grades.html&quot; id=&quot;link-id0x1108643a8&quot;&gt;Sigmod GRADES 2015&lt;/a&gt;.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper discusses the future evolution of the LDBC Social Network Benchmark and gives a preview of Virtuoso graph traversal performance.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-07-13T12:52:53.615634-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso at SIGMOD 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-07-13#1858</atom:id>
  <atom:published>2015-07-13T16:52:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;Two papers presented at &lt;a href=&quot;http://dbpedia.org/resource/SIGMOD&quot; id=&quot;link-id0x10f5b4448&quot;&gt;SIGMOD&lt;/a&gt; &lt;a href=&quot;http://www.sigmod2015.org/&quot; id=&quot;link-id0x10f84b6e8&quot;&gt;2015&lt;/a&gt; have been added to the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtuosoScienceLibrary&quot; id=&quot;link-id0x10f84b8c8&quot;&gt;Virtuoso Science Library&lt;/a&gt;.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling (OpenLink Software); Alex Averbuch (Neo Technology); Josep Larriba-Pey (Sparsity Technologies); Hassan Chafi (Oracle Labs); Andrey Gubichev (TU Munich); Arnau Prat-Pérez (Universitat Politècnica de Catalunya); Minh-Duc Pham (VU University Amsterdam); Peter Boncz (CWI): &lt;a href=&quot;http://dl.acm.org/authorize.cfm?key=N97179&quot; id=&quot;link-id0x10f7147b8&quot;&gt;The LDBC Social Network Benchmark: Interactive Workload&lt;/a&gt;. &lt;a href=&quot;http://www.sigmod2015.org/toc_sigmod.shtml&quot; id=&quot;link-id0x10f7148d8&quot;&gt;Proceedings of SIGMOD 2015, Melbourne&lt;/a&gt;.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper is an overview of the challenges posed in the LDBC social network benchmark, from data generation to the interactive workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Mihai Capotă (Delft University of Technology), Tim Hegeman (Delft University of Technology), Alexandru Iosup (Delft University of Technology), Arnau Prat-Pérez (Universitat Politècnica de Catalunya), Orri Erling (OpenLink Software), Peter Boncz (CWI): &lt;a href=&quot;http://dl.acm.org/authorize.cfm?key=N97204&quot; id=&quot;link-id0x110864288&quot;&gt;Graphalytics: A Big Data Benchmark for Graph-Processing Platforms&lt;/a&gt;. &lt;a href=&quot;http://www.sigmod2015.org/toc_grades.html&quot; id=&quot;link-id0x1108643a8&quot;&gt;Sigmod GRADES 2015&lt;/a&gt;.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper discusses the future evolution of the LDBC Social Network Benchmark and gives a preview of Virtuoso graph traversal performance.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-07-13T12:52:45.067773-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Big Data, Part 1: Virtuoso Meets Hive</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-07-13#1857</atom:id>
  <atom:published>2015-07-13T16:17:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this series, we will look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab3b3c1df8&quot;&gt;Virtuoso&lt;/a&gt; and some of the big data technologies out there. &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab3b3c1f08&quot;&gt;SQL&lt;/a&gt; on &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aab3b3c2028&quot;&gt;Hadoop&lt;/a&gt; is of interest, as well as &lt;a href=&quot;http://dbpedia.org/resource/NoSQL&quot; id=&quot;link-id0x2aab3b3c2148&quot;&gt;NoSQL&lt;/a&gt; technologies.&lt;/p&gt; &lt;p&gt;We begin at the beginning, with &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hive&quot; id=&quot;link-id0x2aab3b3c2168&quot;&gt;Hive&lt;/a&gt;, the grand-daddy of SQL on Hadoop.&lt;/p&gt; &lt;p&gt;The test platform is two Amazon R3.8 &lt;a href=&quot;http://dbpedia.org/resource/Amazon_Machine_Image&quot; id=&quot;link-id0x2aab62f44bf8&quot;&gt;AMI&lt;/a&gt; instances. We compared Hive with the Virtuoso 100G TPC-H experiment on the same platform, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab62f44d78&quot;&gt;published earlier on this blog&lt;/a&gt;. The runs follow a bulk load in both cases, with all data served from memory. The platform has 2x244GB RAM with only 40GB or so of working set.&lt;/p&gt; &lt;p&gt;The Virtuoso version and settings are as in the &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1849&quot; id=&quot;link-id0x2aab3be6df88&quot;&gt;Virtuoso Cluster test AMI&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The Hive version is &lt;a href=&quot;http://hortonworks.com/blog/announcing-apache-hive-0-14/&quot; id=&quot;link-id0x2aab3be6e148&quot;&gt;0.14&lt;/a&gt; from the &lt;a href=&quot;http://dbpedia.org/resource/Hortonworks&quot; id=&quot;link-id0x2aab3be6e298&quot;&gt;Hortonworks&lt;/a&gt; &lt;a href=&quot;http://hortonworks.com/hdp/downloads/&quot; id=&quot;link-id0x2aab3b149c48&quot;&gt;HDP 2.2 distribution&amp;gt;. The Hive schema and query formulations are the ones from &lt;a href=&quot;https://github.com/hortonworks/hive-testbench&quot; id=&quot;link-id0x2aab3b1498c8&quot;&gt;&lt;code&gt;hive-testbench&lt;/code&gt; on GitHub&lt;/a&gt;. The Hive configuration parameters are as set by &lt;a href=&quot;https://cwiki.apache.org/confluence/display/AMBARI/Installation+Guide+for+Ambari+2.0.1&quot; id=&quot;link-id0x2aab3b149aa8&quot;&gt;Ambari 2.0.1&lt;/a&gt;. These are different from the ones in &lt;code&gt;hive-testbench&lt;/code&gt;, but the Ambari choices offer higher performance on the platform. We did run statistics with Hive and did not specify any settings not in the &lt;code&gt;hive-testbench&lt;/code&gt;. Thus we suppose the query plans were as good as Hive will make them. Platform utilization was even across both machines, and varied between 30% and 100% of the 2 x 32 hardware threads.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Load time with Hive was 742 seconds against 232 seconds with Virtuoso. In both cases, this was a copy from 32 &lt;a href=&quot;http://dbpedia.org/resource/Comma-separated_values&quot; id=&quot;link-id0x2aab3be6e328&quot;&gt;CSV&lt;/a&gt; files into native database format; for Hive, this is &lt;a href=&quot;https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC&quot; id=&quot;link-id0x2aab3b149868&quot;&gt;ORC (Optimized Row Columnar)&lt;/a&gt;. In Virtuoso, there is one index, (&lt;code&gt;o_custkey&lt;/code&gt;); in Hive, there are no indices.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Hive&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; — &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 332     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 742     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Data Load &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.098 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 296.636 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.187 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.761 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 98.652 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.205 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 147.867 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.808 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 114.782 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.403 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 71.789 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 394.201 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.775 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.836 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.165 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 179.646 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.37  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 43.094 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.356 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 101.193 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.233 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 208.476 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.488 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 89.047 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.72 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 136.431 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.814 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 105.652 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.681 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 255.848 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.324 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 337.921 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.417 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.792 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 193.965 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.720 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 670.718 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.155 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 68.462 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Hive does relatively best on bulk load. This is understandable since this is a sequential read of many files in parallel with just compression to do.&lt;/p&gt; &lt;p&gt;Hive&amp;#39;s query times are obviously affected by not having a persistent memory image of the data, as this is always streamed from the storage files into other files as &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x2aab3b57ad38&quot;&gt;MapReduce&lt;/a&gt; intermediate results. This seems to be an operator-at-a-time business as opposed to Virtuoso&amp;#39;s vectorized streaming.&lt;/p&gt; &lt;p&gt;The queries that would do partitioned &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x2aab3bec82d8&quot;&gt;hash joins&lt;/a&gt; (e.g., Q9) did not finish under an hour in Hive, so we do not have a good metric of a cross-partition hash join.&lt;/p&gt; &lt;p&gt;One could argue that one should benchmark Hive only in disk-bound circumstances. We may yet get to this.&lt;/p&gt; &lt;p&gt;Our next stop will probably be &lt;a href=&quot;https://en.wikipedia.org/wiki/Cloudera_Impala&quot; id=&quot;link-id0x2aab3b4f7bc8&quot;&gt;Impala&lt;/a&gt;, which ought to do much better than Hive, as it dose not have the MapReduce overheads.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;If you are a Hive expert&lt;/b&gt; and believe that Hive should have done much better, please let us know how to improve the Hive scores, and we will retry.&lt;/i&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2015-07-13T12:17:45.682053-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Big Data, Part 1: Virtuoso Meets Hive</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-07-13#1856</atom:id>
  <atom:published>2015-07-13T16:16:31Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this series, we will look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab3b3c1df8&quot;&gt;Virtuoso&lt;/a&gt; and some of the big data technologies out there. &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab3b3c1f08&quot;&gt;SQL&lt;/a&gt; on &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aab3b3c2028&quot;&gt;Hadoop&lt;/a&gt; is of interest, as well as &lt;a href=&quot;http://dbpedia.org/resource/NoSQL&quot; id=&quot;link-id0x2aab3b3c2148&quot;&gt;NoSQL&lt;/a&gt; technologies.&lt;/p&gt; &lt;p&gt;We begin at the beginning, with &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hive&quot; id=&quot;link-id0x2aab3b3c2168&quot;&gt;Hive&lt;/a&gt;, the grand-daddy of SQL on Hadoop.&lt;/p&gt; &lt;p&gt;The test platform is two Amazon R3.8 &lt;a href=&quot;http://dbpedia.org/resource/Amazon_Machine_Image&quot; id=&quot;link-id0x2aab62f44bf8&quot;&gt;AMI&lt;/a&gt; instances. We compared Hive with the Virtuoso 100G TPC-H experiment on the same platform, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab62f44d78&quot;&gt;published earlier on this blog&lt;/a&gt;. The runs follow a bulk load in both cases, with all data served from memory. The platform has 2x244GB RAM with only 40GB or so of working set.&lt;/p&gt; &lt;p&gt;The Virtuoso version and settings are as in the &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1849&quot; id=&quot;link-id0x2aab3be6df88&quot;&gt;Virtuoso Cluster test AMI&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The Hive version is &lt;a href=&quot;http://hortonworks.com/blog/announcing-apache-hive-0-14/&quot; id=&quot;link-id0x2aab3be6e148&quot;&gt;0.14&lt;/a&gt; from the &lt;a href=&quot;http://dbpedia.org/resource/Hortonworks&quot; id=&quot;link-id0x2aab3be6e298&quot;&gt;Hortonworks&lt;/a&gt; &lt;a href=&quot;http://hortonworks.com/hdp/downloads/&quot; id=&quot;link-id0x2aab3b149c48&quot;&gt;HDP 2.2 distribution&amp;gt;. The Hive schema and query formulations are the ones from &lt;a href=&quot;https://github.com/hortonworks/hive-testbench&quot; id=&quot;link-id0x2aab3b1498c8&quot;&gt;&lt;code&gt;hive-testbench&lt;/code&gt; on GitHub&lt;/a&gt;. The Hive configuration parameters are as set by &lt;a href=&quot;https://cwiki.apache.org/confluence/display/AMBARI/Installation+Guide+for+Ambari+2.0.1&quot; id=&quot;link-id0x2aab3b149aa8&quot;&gt;Ambari 2.0.1&lt;/a&gt;. These are different from the ones in &lt;code&gt;hive-testbench&lt;/code&gt;, but the Ambari choices offer higher performance on the platform. We did run statistics with Hive and did not specify any settings not in the &lt;code&gt;hive-testbench&lt;/code&gt;. Thus we suppose the query plans were as good as Hive will make them. Platform utilization was even across both machines, and varied between 30% and 100% of the 2 x 32 hardware threads.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Load time with Hive was 742 seconds against 232 seconds with Virtuoso. In both cases, this was a copy from 32 &lt;a href=&quot;http://dbpedia.org/resource/Comma-separated_values&quot; id=&quot;link-id0x2aab3be6e328&quot;&gt;CSV&lt;/a&gt; files into native database format; for Hive, this is &lt;a href=&quot;https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC&quot; id=&quot;link-id0x2aab3b149868&quot;&gt;ORC (Optimized Row Columnar)&lt;/a&gt;. In Virtuoso, there is one index, (&lt;code&gt;o_custkey&lt;/code&gt;); in Hive, there are no indices.&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;th&gt;Query&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;Hive&lt;/th&gt; &lt;th&gt;Notes&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; — &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 332     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 742     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Data Load &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q1 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.098 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 296.636 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q2 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.187 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q3 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.761 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 98.652 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q4 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.205 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 147.867 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q5 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.808 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 114.782 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q6 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.403 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 71.789 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q7 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.59  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 394.201 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q8 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.775 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q9 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.836 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q10 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 3.165 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 179.646 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q11 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.37  s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 43.094 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q12 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.356 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 101.193 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q13 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 2.233 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 208.476 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q14 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.488 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 89.047 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q15 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.72 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 136.431 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q16 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.814 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 105.652 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q17 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.681 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 255.848 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q18 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 1.324 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 337.921 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q19 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.417 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; &amp;gt;3600     s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; Hive Timeout &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q20 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.792 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 193.965 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q21 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.720 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 670.718 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt; Q22 &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 0.155 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt; &lt;code&gt; 68.462 s &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:left;&quot;&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Hive does relatively best on bulk load. This is understandable since this is a sequential read of many files in parallel with just compression to do.&lt;/p&gt; &lt;p&gt;Hive&amp;#39;s query times are obviously affected by not having a persistent memory image of the data, as this is always streamed from the storage files into other files as &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x2aab3b57ad38&quot;&gt;MapReduce&lt;/a&gt; intermediate results. This seems to be an operator-at-a-time business as opposed to Virtuoso&amp;#39;s vectorized streaming.&lt;/p&gt; &lt;p&gt;The queries that would do partitioned &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x2aab3bec82d8&quot;&gt;hash joins&lt;/a&gt; (e.g., Q9) did not finish under an hour in Hive, so we do not have a good metric of a cross-partition hash join.&lt;/p&gt; &lt;p&gt;One could argue that one should benchmark Hive only in disk-bound circumstances. We may yet get to this.&lt;/p&gt; &lt;p&gt;Our next stop will probably be &lt;a href=&quot;https://en.wikipedia.org/wiki/Cloudera_Impala&quot; id=&quot;link-id0x2aab3b4f7bc8&quot;&gt;Impala&lt;/a&gt;, which ought to do much better than Hive, as it dose not have the MapReduce overheads.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;If you are a Hive expert&lt;/b&gt; and believe that Hive should have done much better, please let us know how to improve the Hive scores, and we will retry.&lt;/i&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2015-07-13T12:16:31.280965-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Rethink Big and Europe?s Position in Big Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-29#1855</atom:id>
  <atom:published>2015-06-29T19:36:16Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here take a break from core database and talk a bit about &lt;a href=&quot;http://dbpedia.org/page/European_Union&quot; id=&quot;link-id0x2aab76cf53a8&quot;&gt;EU&lt;/a&gt; policies for research funding.&lt;/p&gt; &lt;p&gt;I had lunch with &lt;a href=&quot;http://homepages.cwi.nl/~manegold/&quot; id=&quot;link-id0x2aab74e7ff38&quot;&gt;Stefan Manegold&lt;/a&gt; of &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aab76fdf4a8&quot;&gt;CWI&lt;/a&gt; last week, where we talked about where European research should go. Stefan is involved in &lt;i&gt;&lt;a href=&quot;http://www.rethinkbig-project.eu/&quot; id=&quot;link-id0x2aab767d4d88&quot;&gt;RETHINK big&lt;/a&gt;,&lt;/i&gt; a European research project for compiling policy advice regarding big data for EC funding agencies. As part of this, he is interviewing various stakeholders such as end user organizations and developers of technology.&lt;/p&gt; &lt;p&gt; &lt;i&gt;RETHINK big&lt;/i&gt; wants to come up with a research agenda primarily for hardware, anything from faster networks to greener data centers. CWI represents software expertise in the consortium.&lt;/p&gt; &lt;p&gt;So, we went through a regular questionnaire about how we see the landscape. I will summarize this below, as this is anyway informative.&lt;/p&gt; &lt;h3&gt;Core competence&lt;/h3&gt; &lt;p&gt;My own core competence is in core database functionality, specifically in high performance query processing, scale-out, and managing schema-less data. Most of the &lt;a href=&quot;http://dbpedia.org/page/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab766406e8&quot;&gt;Virtuoso&lt;/a&gt; installed base is in the &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aab74871c28&quot;&gt;RDF&lt;/a&gt; space, but most potential applications are in fact outside of this niche.&lt;/p&gt; &lt;h3&gt;User challenges&lt;/h3&gt; &lt;p&gt;The life sciences vertical is the one in which I have the most application insight, from going to &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x2aab765598c8&quot;&gt;Open PHACTS&lt;/a&gt; meetings and holding extensive conversations with domain specialists. We have users in many other verticals, from manufacturing to financial services, but there I do not have as much exposure to the actual applications.&lt;/p&gt; &lt;p&gt;Having said this, the challenges throughout tend to be in diversity of data. Every researcher has their &lt;a href=&quot;http://dbpedia.org/page/MySQL&quot; id=&quot;link-id0x2aab76bff778&quot;&gt;MySQL&lt;/a&gt; database or &lt;a href=&quot;http://dbpedia.org/page/Spreadsheet&quot; id=&quot;link-id0x2aab75ceeaa8&quot;&gt;spreadsheet&lt;/a&gt;, and there may not even be a top level catalogue of everything. Data formats are diverse. Some people use &lt;a href=&quot;http://dbpedia.org/resource/Linked_data&quot; id=&quot;link-id0x2aab74e675e8&quot;&gt;linked data&lt;/a&gt; (most commonly RDF) as a top level metadata format. The application data, such as gene sequences or microarray assays, reside in their native file formats and there is little point in RDF-izing these.&lt;/p&gt; &lt;p&gt;There are also public data resources that are published in RDF serializations as vendor-neutral, self-describing format. Having everything as triples, without &lt;i&gt;a priori&lt;/i&gt; schema, makes things easier to integrate and in some cases easier to describe and query.&lt;/p&gt; &lt;p&gt;So, the challenge is in the labor intensive nature of data integration. Data comes with different levels of quantity and quality, from hand-curated to &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x2aab76dfe0c8&quot;&gt;NLP&lt;/a&gt; extractions. Querying in the single- or double-digit terabyte range with RDF is quite possible, as we have shown many times on this blog, but most use cases do not even go that far. Anyway, what we see on the field is primarily a data diversity game. The scenario is data integration; the technology we provide is database. The data transformation proper, data cleansing, units of measure, entity de-duplication, and such core data-integration functions are performed using diverse, user-specific means.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://ch.linkedin.com/in/jervenbolleman&quot; id=&quot;link-id0x2aab754e5e38&quot;&gt;Jerven Bolleman&lt;/a&gt; of the &lt;a href=&quot;https://www.linkedin.com/company/sib-swiss-institute-of-bioinformatics&quot; id=&quot;link-id0x2aab75d891d8&quot;&gt;Swiss Institute of Bioinformatics&lt;/a&gt; is a user of ours with whom we have long standing discussions on the virtues of federated data and querying. I advised Stefan to go talk to him; he has fresh views about the volume challenges with unexpected usage patterns. Designing for performance is tough if the usage pattern is out of the blue, like correlating air humidity on the day of measurement with the presence of some genomic patterns. Building a warehouse just for that might not be the preferred choice, so the problem field is not exhausted. Generally, I’d go for warehousing though.&lt;/p&gt; &lt;h3&gt;What technology would you like to have? Network or power efficiency?&lt;/h3&gt; &lt;p&gt;OK. Even a fast network is a network. A set of processes on a single shared-memory box is also a kind of network. InfiniBand is maybe half the throughput and 3x the latency of single threaded interprocess communication within one box. The operative word is latency. Making large systems always involves a network or something very much like one in large scale-up scenarios.&lt;/p&gt; &lt;p&gt;On the software side, next to nobody understands latency and contention; yet these are the one core factor in any pursuit of scalability. Because of this situation, paradigms like &lt;a href=&quot;http://dbpedia.org/page/MapReduce&quot; id=&quot;link-id0x2aab76bea288&quot;&gt;MapReduce&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Bulk_synchronous_parallel&quot; id=&quot;link-id0x2aab75907c48&quot;&gt;bulk synchronous parallel (BSP)&lt;/a&gt; processing have become popular because these take the communication out of the program flow, so the programmer cannot muck this up, as otherwise would happen with the inevitability of destiny. Of course, our beloved SQL or declarative query in general does give scalability in many tasks without programmer participation. &lt;a href=&quot;http://dbpedia.org/resource/Datalog&quot; id=&quot;link-id0x2aab75e63cc8&quot;&gt;Datalog&lt;/a&gt; has also been used as a means of shipping computation around, as in the the work of &lt;a href=&quot;http://www.linkedin.com/in/joehellerstein&quot; id=&quot;link-id0x2aab75483c38&quot;&gt;Hellerstein&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There are no easy solutions. We have built scale-out conscious, vectorized extensions to SQL procedures where one can express complex parallel, distributed flows, but people do not use or understand these. These are very useful, even indispensable, but only on the inside, not as a programmer-facing construct. MapReduce and BSP are the limit of what a development culture will absorb. MapReduce and BSP do not hide the fact of distributed processing. What about things that do? Parallel, partitioned extensions to &lt;a href=&quot;http://dbpedia.org/resource/Fortran&quot; id=&quot;link-id0x2aab76254d78&quot;&gt;Fortran&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/page/Array_programming&quot; id=&quot;link-id0x2aab75db6098&quot;&gt;arrays&lt;/a&gt;? &lt;a href=&quot;http://dbpedia.org/page/Functional_programming&quot; id=&quot;link-id0x2aab75ffb7b8&quot;&gt;Functional languages&lt;/a&gt;? I think that all the obvious aids to parallel/distributed programming have been conceived of. No silver bullet; just hard work. And above all the discernment of what paradigm fits what problem. Since these are always changing, there is no finite set of rules, and no substitute for understanding and insight, and the latter are vanishingly scarce. &amp;quot;&lt;a href=&quot;http://dissoiblogoi.blogspot.com/2005/11/aristotles-paradigmatism.html&quot; id=&quot;link-id0x2aab764f6738&quot;&gt;Paradigmatism&lt;/a&gt;,&amp;quot; i.e., the belief that one particular programming model is a panacea outside of its original niche, is a common source of complexity and inefficiency. This is a common form of enthusiastic naïveté. &lt;/p&gt; &lt;p&gt;If you look at power efficiency, the clusters that are the easiest to program consist of relatively few high power machines and a fast network. A typical node size is 16+ cores and 256G or more RAM. Amazon has these in entirely workable configurations, as &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1843&quot; id=&quot;link-id0x2aab76396be8&quot;&gt;documented earlier on this blog&lt;/a&gt;. The leading edge in power efficiency is in larger number of smaller units, which makes life again harder. This exacerbates latency and forces one to partition the data more often, whereas one can play with replication of key parts of data more freely if the node size is larger.&lt;/p&gt; &lt;p&gt;One very specific item where research might help without having to rebuild the hardware stack would be better, lower-latency exposure of networks to software. Lightweight threads and user-space access, bypassing slow protocol stacks, etc. &lt;a href=&quot;https://en.wikipedia.org/wiki/Message_Passing_Interface&quot; id=&quot;link-id0x2aab754d0208&quot;&gt;MPI&lt;/a&gt; has some of this, but maybe more could be done.&lt;/p&gt; &lt;p&gt;So, I will take a cluster of such 16-core, 256GB machines on a faster network, over a cluster of 1024 x 4G mobile phones connected via USB. Very selfish and unecological, but one has to stay alive and life is tough enough as is.&lt;/p&gt; &lt;h3&gt;Are there pressures to adapt business models based on big data?&lt;/h3&gt; &lt;p&gt;The transition from &lt;a href=&quot;http://dbpedia.org/page/Capital_expenditure&quot; id=&quot;link-id0x2aab767114e8&quot;&gt;capex&lt;/a&gt; to &lt;a href=&quot;http://dbpedia.org/page/Operating_expense&quot; id=&quot;link-id0x2aab76254b28&quot;&gt;opex&lt;/a&gt; may be approaching maturity, as there have been workable cloud configurations for the past couple of years. The &lt;a href=&quot;http://dbpedia.org/page/Amazon_Elastic_Compute_Cloud&quot; id=&quot;link-id0x2aab75235fa8&quot;&gt;EC2&lt;/a&gt; from way back, with at best a 4 core 16G VM and a horrible network for $2/hr, is long gone. It remains the case that 4 months of 24x7 rent in the cloud equals the purchase price of physical hardware. So, for this to be economical long-term at scale, the average utilization should be about 10% of the peak, and peaks should not be on for more than 10% of the time.&lt;/p&gt; &lt;p&gt;So, database software should be rented by the hour. A 100-150% markup for the $2.80 a large EC2 instance costs would be reasonable. Consider that 70% of the cost in TPC benchmarks is database software.&lt;/p&gt; &lt;p&gt;There will be different pricing models combining different up-front and per-usage costs, just as there are for clouds now. If the platform business goes that way and the market accepts this, then systems software will follow. Price/performance quotes should probably be expressed as speed/price/hour instead of speed/price.&lt;/p&gt; &lt;p&gt;The above is rather uncontroversial but there is no harm restating these facts. Reinforce often.&lt;/p&gt; &lt;h3&gt;Well, the question is raised, what should Europe do that would have tangible impact in the next 5 years?&lt;/h3&gt; &lt;p&gt;This is a harder question. There is some European business in wide area and mobile infrastructures. Competing against &lt;a href=&quot;http://dbpedia.org/resource/Huawei&quot; id=&quot;link-id0x2aab76c8a288&quot;&gt;Huawei&lt;/a&gt; will keep them busy. &lt;a href=&quot;http://dbpedia.org/page/Intel&quot; id=&quot;link-id0x2aab752b4178&quot;&gt;Intel&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Mellanox_Technologies&quot; id=&quot;link-id0x2aab753a84b8&quot;&gt;Mellanox&lt;/a&gt; will continue making faster networks regardless of European policies. Intel will continue building denser compute nodes, e.g., integrated Knight’s Corner with dual IB network and 16G fast RAM on chip. Clouds will continue making these available on demand once the technology is in mass production.&lt;/p&gt; &lt;p&gt;What’s the next big innovation? &lt;a href=&quot;http://dbpedia.org/page/Neuromorphic_engineering&quot; id=&quot;link-id0x2aab76156358&quot;&gt;Neuromorphic computing&lt;/a&gt;? &lt;a href=&quot;http://dbpedia.org/page/Quantum_computer&quot; id=&quot;link-id0x2aab74efc458&quot;&gt;Quantum computing&lt;/a&gt;? Maybe. For now, I’d just do more engineering along the core competence discussed above, with emphasis on good marketing and scalable execution. By this I mean trained people who know something about deployment. There is a huge training gap. In the would-be &amp;quot;Age of Data,&amp;quot; knowledge of how things actually work and scale is near-absent. I have offered to do some courses on this to partners and public alike, but I need somebody to drive this show; I have other things to do.&lt;/p&gt; &lt;p&gt;I have been to many, many project review meetings, mostly as a project partner but also as reviewer. For the past year, the &lt;a href=&quot;http://dbpedia.org/resource/European_Commission&quot; id=&quot;link-id0x2aab7628cb88&quot;&gt;EC&lt;/a&gt; has used an innovation questionnaire at the end of the meetings. It is quite vague, and I don’t think it delivers much actionable intelligence.&lt;/p&gt; &lt;p&gt;What would deliver this would be a venture capital type activity, with well-developed networks and active participation in developing a business. The EC is not now set up to perform this role, though. But the EC is a fairly large and wealthy entity, so it could invest some money via this type of channel. Also there should be higher individual incentives and rewards for speed and excellence. Getting the next Horizon 2020 research grant may be good, but better exists. The grants are competitive enough and the calls are not bad; they follow the times.&lt;/p&gt; &lt;p&gt;In the projects I have seen, productization does get some attention, e.g., the &lt;a href=&quot;http://stack.lod2.eu/blog/&quot; id=&quot;link-id0x2aab768be028&quot;&gt;LOD2 stack&lt;/a&gt;, but it is not something that is really ongoing or with dedicated commercial backing. It may also be that there is no market to justify such dedicated backing. Much of the RDF work has been &amp;quot;me, too&amp;quot; — let’s do what the real database and data integration people do, but let’s just do this with triples. Innovation? Well, I took the best of the real DB world and adapted this to RDF, which did produce a competent piece of work with broad applicability, extending outside RDF. Is there better than this? Well, some of the data integration work (e.g., &lt;a href=&quot;http://svn.aksw.org/papers/2011/WWW_LIMES/public.pdf&quot; id=&quot;link-id0x2aab76423568&quot;&gt;LIMES&lt;/a&gt;) is not bad, and it might be picked up by some of the players that do this sort of thing in the broader world, e.g., &lt;a href=&quot;http://dbpedia.org/resource/Informatica&quot; id=&quot;link-id0x2aab753c3e68&quot;&gt;Informatica&lt;/a&gt;, the DI suites of big DB vendors, &lt;a href=&quot;https://www.crunchbase.com/organization/tamr&quot; id=&quot;link-id0x2aab76fc6e78&quot;&gt;Tamr&lt;/a&gt;, etc. I would not know if this in fact adds value to the non-RDF equivalents; I do not know the field well enough, but there could be a possibility.&lt;/p&gt; &lt;p&gt;The recent emphasis for benchmarking, spearheaded by &lt;a href=&quot;https://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x2aab76c45018&quot;&gt;Stefano Bertolo&lt;/a&gt; is good, as exemplified by the &lt;a href=&quot;http://ldbcouncil.org/industry/organization/origins&quot; id=&quot;link-id0x2aab75f4e288&quot;&gt;LDBC FP7&lt;/a&gt;. There should probably be one or two projects of this sort going at all times. These make challenges known and are an effective means of guiding research, with a large multiplier: Once a benchmark gets adopted, infinitely more work goes into solving the problem than in stating it in the first place.&lt;/p&gt; &lt;p&gt;The aims and calls are good. The execution by projects is variable. For 1% of excellence, there apparently must be 99% of so-and-so, but this is just a fact of life and not specific to this context. The projects are rather diffuse. There is not a single outcome that gets all the effort. In this, the level of engagement of participants is less and focus is much more scattered than in startups. A really hungry, go-getter mood is mostly absent. I am a believer in core competence. Well, most people will agree that core competence is nice. But the projects I have seen do not drive for it hard enough.&lt;/p&gt; &lt;p&gt;It is hard to say exactly what kinds of incentives could be offered to encourage truly exceptional work. The American startup scene does offer high rewards and something of this could be transplanted into the EC project world. I would not know exactly what form this could take, though.&lt;/p&gt;</atom:content>
  <atom:updated>2015-06-29T15:36:16.622570-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Rethink Big and Europe?s Position in Big Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-29#1854</atom:id>
  <atom:published>2015-06-29T19:36:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here take a break from core database and talk a bit about &lt;a href=&quot;http://dbpedia.org/page/European_Union&quot; id=&quot;link-id0x2aab76cf53a8&quot;&gt;EU&lt;/a&gt; policies for research funding.&lt;/p&gt; &lt;p&gt;I had lunch with &lt;a href=&quot;http://homepages.cwi.nl/~manegold/&quot; id=&quot;link-id0x2aab74e7ff38&quot;&gt;Stefan Manegold&lt;/a&gt; of &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aab76fdf4a8&quot;&gt;CWI&lt;/a&gt; last week, where we talked about where European research should go. Stefan is involved in &lt;i&gt;&lt;a href=&quot;http://www.rethinkbig-project.eu/&quot; id=&quot;link-id0x2aab767d4d88&quot;&gt;RETHINK big&lt;/a&gt;,&lt;/i&gt; a European research project for compiling policy advice regarding big data for EC funding agencies. As part of this, he is interviewing various stakeholders such as end user organizations and developers of technology.&lt;/p&gt; &lt;p&gt; &lt;i&gt;RETHINK big&lt;/i&gt; wants to come up with a research agenda primarily for hardware, anything from faster networks to greener data centers. CWI represents software expertise in the consortium.&lt;/p&gt; &lt;p&gt;So, we went through a regular questionnaire about how we see the landscape. I will summarize this below, as this is anyway informative.&lt;/p&gt; &lt;h3&gt;Core competence&lt;/h3&gt; &lt;p&gt;My own core competence is in core database functionality, specifically in high performance query processing, scale-out, and managing schema-less data. Most of the &lt;a href=&quot;http://dbpedia.org/page/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab766406e8&quot;&gt;Virtuoso&lt;/a&gt; installed base is in the &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aab74871c28&quot;&gt;RDF&lt;/a&gt; space, but most potential applications are in fact outside of this niche.&lt;/p&gt; &lt;h3&gt;User challenges&lt;/h3&gt; &lt;p&gt;The life sciences vertical is the one in which I have the most application insight, from going to &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x2aab765598c8&quot;&gt;Open PHACTS&lt;/a&gt; meetings and holding extensive conversations with domain specialists. We have users in many other verticals, from manufacturing to financial services, but there I do not have as much exposure to the actual applications.&lt;/p&gt; &lt;p&gt;Having said this, the challenges throughout tend to be in diversity of data. Every researcher has their &lt;a href=&quot;http://dbpedia.org/page/MySQL&quot; id=&quot;link-id0x2aab76bff778&quot;&gt;MySQL&lt;/a&gt; database or &lt;a href=&quot;http://dbpedia.org/page/Spreadsheet&quot; id=&quot;link-id0x2aab75ceeaa8&quot;&gt;spreadsheet&lt;/a&gt;, and there may not even be a top level catalogue of everything. Data formats are diverse. Some people use &lt;a href=&quot;http://dbpedia.org/resource/Linked_data&quot; id=&quot;link-id0x2aab74e675e8&quot;&gt;linked data&lt;/a&gt; (most commonly RDF) as a top level metadata format. The application data, such as gene sequences or microarray assays, reside in their native file formats and there is little point in RDF-izing these.&lt;/p&gt; &lt;p&gt;There are also public data resources that are published in RDF serializations as vendor-neutral, self-describing format. Having everything as triples, without &lt;i&gt;a priori&lt;/i&gt; schema, makes things easier to integrate and in some cases easier to describe and query.&lt;/p&gt; &lt;p&gt;So, the challenge is in the labor intensive nature of data integration. Data comes with different levels of quantity and quality, from hand-curated to &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x2aab76dfe0c8&quot;&gt;NLP&lt;/a&gt; extractions. Querying in the single- or double-digit terabyte range with RDF is quite possible, as we have shown many times on this blog, but most use cases do not even go that far. Anyway, what we see on the field is primarily a data diversity game. The scenario is data integration; the technology we provide is database. The data transformation proper, data cleansing, units of measure, entity de-duplication, and such core data-integration functions are performed using diverse, user-specific means.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;https://ch.linkedin.com/in/jervenbolleman&quot; id=&quot;link-id0x2aab754e5e38&quot;&gt;Jerven Bolleman&lt;/a&gt; of the &lt;a href=&quot;https://www.linkedin.com/company/sib-swiss-institute-of-bioinformatics&quot; id=&quot;link-id0x2aab75d891d8&quot;&gt;Swiss Institute of Bioinformatics&lt;/a&gt; is a user of ours with whom we have long standing discussions on the virtues of federated data and querying. I advised Stefan to go talk to him; he has fresh views about the volume challenges with unexpected usage patterns. Designing for performance is tough if the usage pattern is out of the blue, like correlating air humidity on the day of measurement with the presence of some genomic patterns. Building a warehouse just for that might not be the preferred choice, so the problem field is not exhausted. Generally, I’d go for warehousing though.&lt;/p&gt; &lt;h3&gt;What technology would you like to have? Network or power efficiency?&lt;/h3&gt; &lt;p&gt;OK. Even a fast network is a network. A set of processes on a single shared-memory box is also a kind of network. InfiniBand is maybe half the throughput and 3x the latency of single threaded interprocess communication within one box. The operative word is latency. Making large systems always involves a network or something very much like one in large scale-up scenarios.&lt;/p&gt; &lt;p&gt;On the software side, next to nobody understands latency and contention; yet these are the one core factor in any pursuit of scalability. Because of this situation, paradigms like &lt;a href=&quot;http://dbpedia.org/page/MapReduce&quot; id=&quot;link-id0x2aab76bea288&quot;&gt;MapReduce&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Bulk_synchronous_parallel&quot; id=&quot;link-id0x2aab75907c48&quot;&gt;bulk synchronous parallel (BSP)&lt;/a&gt; processing have become popular because these take the communication out of the program flow, so the programmer cannot muck this up, as otherwise would happen with the inevitability of destiny. Of course, our beloved SQL or declarative query in general does give scalability in many tasks without programmer participation. &lt;a href=&quot;http://dbpedia.org/resource/Datalog&quot; id=&quot;link-id0x2aab75e63cc8&quot;&gt;Datalog&lt;/a&gt; has also been used as a means of shipping computation around, as in the the work of &lt;a href=&quot;http://www.linkedin.com/in/joehellerstein&quot; id=&quot;link-id0x2aab75483c38&quot;&gt;Hellerstein&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There are no easy solutions. We have built scale-out conscious, vectorized extensions to SQL procedures where one can express complex parallel, distributed flows, but people do not use or understand these. These are very useful, even indispensable, but only on the inside, not as a programmer-facing construct. MapReduce and BSP are the limit of what a development culture will absorb. MapReduce and BSP do not hide the fact of distributed processing. What about things that do? Parallel, partitioned extensions to &lt;a href=&quot;http://dbpedia.org/resource/Fortran&quot; id=&quot;link-id0x2aab76254d78&quot;&gt;Fortran&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/page/Array_programming&quot; id=&quot;link-id0x2aab75db6098&quot;&gt;arrays&lt;/a&gt;? &lt;a href=&quot;http://dbpedia.org/page/Functional_programming&quot; id=&quot;link-id0x2aab75ffb7b8&quot;&gt;Functional languages&lt;/a&gt;? I think that all the obvious aids to parallel/distributed programming have been conceived of. No silver bullet; just hard work. And above all the discernment of what paradigm fits what problem. Since these are always changing, there is no finite set of rules, and no substitute for understanding and insight, and the latter are vanishingly scarce. &amp;quot;&lt;a href=&quot;http://dissoiblogoi.blogspot.com/2005/11/aristotles-paradigmatism.html&quot; id=&quot;link-id0x2aab764f6738&quot;&gt;Paradigmatism&lt;/a&gt;,&amp;quot; i.e., the belief that one particular programming model is a panacea outside of its original niche, is a common source of complexity and inefficiency. This is a common form of enthusiastic naïveté. &lt;/p&gt; &lt;p&gt;If you look at power efficiency, the clusters that are the easiest to program consist of relatively few high power machines and a fast network. A typical node size is 16+ cores and 256G or more RAM. Amazon has these in entirely workable configurations, as &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1843&quot; id=&quot;link-id0x2aab76396be8&quot;&gt;documented earlier on this blog&lt;/a&gt;. The leading edge in power efficiency is in larger number of smaller units, which makes life again harder. This exacerbates latency and forces one to partition the data more often, whereas one can play with replication of key parts of data more freely if the node size is larger.&lt;/p&gt; &lt;p&gt;One very specific item where research might help without having to rebuild the hardware stack would be better, lower-latency exposure of networks to software. Lightweight threads and user-space access, bypassing slow protocol stacks, etc. &lt;a href=&quot;https://en.wikipedia.org/wiki/Message_Passing_Interface&quot; id=&quot;link-id0x2aab754d0208&quot;&gt;MPI&lt;/a&gt; has some of this, but maybe more could be done.&lt;/p&gt; &lt;p&gt;So, I will take a cluster of such 16-core, 256GB machines on a faster network, over a cluster of 1024 x 4G mobile phones connected via USB. Very selfish and unecological, but one has to stay alive and life is tough enough as is.&lt;/p&gt; &lt;h3&gt;Are there pressures to adapt business models based on big data?&lt;/h3&gt; &lt;p&gt;The transition from &lt;a href=&quot;http://dbpedia.org/page/Capital_expenditure&quot; id=&quot;link-id0x2aab767114e8&quot;&gt;capex&lt;/a&gt; to &lt;a href=&quot;http://dbpedia.org/page/Operating_expense&quot; id=&quot;link-id0x2aab76254b28&quot;&gt;opex&lt;/a&gt; may be approaching maturity, as there have been workable cloud configurations for the past couple of years. The &lt;a href=&quot;http://dbpedia.org/page/Amazon_Elastic_Compute_Cloud&quot; id=&quot;link-id0x2aab75235fa8&quot;&gt;EC2&lt;/a&gt; from way back, with at best a 4 core 16G VM and a horrible network for $2/hr, is long gone. It remains the case that 4 months of 24x7 rent in the cloud equals the purchase price of physical hardware. So, for this to be economical long-term at scale, the average utilization should be about 10% of the peak, and peaks should not be on for more than 10% of the time.&lt;/p&gt; &lt;p&gt;So, database software should be rented by the hour. A 100-150% markup for the $2.80 a large EC2 instance costs would be reasonable. Consider that 70% of the cost in TPC benchmarks is database software.&lt;/p&gt; &lt;p&gt;There will be different pricing models combining different up-front and per-usage costs, just as there are for clouds now. If the platform business goes that way and the market accepts this, then systems software will follow. Price/performance quotes should probably be expressed as speed/price/hour instead of speed/price.&lt;/p&gt; &lt;p&gt;The above is rather uncontroversial but there is no harm restating these facts. Reinforce often.&lt;/p&gt; &lt;h3&gt;Well, the question is raised, what should Europe do that would have tangible impact in the next 5 years?&lt;/h3&gt; &lt;p&gt;This is a harder question. There is some European business in wide area and mobile infrastructures. Competing against &lt;a href=&quot;http://dbpedia.org/resource/Huawei&quot; id=&quot;link-id0x2aab76c8a288&quot;&gt;Huawei&lt;/a&gt; will keep them busy. &lt;a href=&quot;http://dbpedia.org/page/Intel&quot; id=&quot;link-id0x2aab752b4178&quot;&gt;Intel&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Mellanox_Technologies&quot; id=&quot;link-id0x2aab753a84b8&quot;&gt;Mellanox&lt;/a&gt; will continue making faster networks regardless of European policies. Intel will continue building denser compute nodes, e.g., integrated Knight’s Corner with dual IB network and 16G fast RAM on chip. Clouds will continue making these available on demand once the technology is in mass production.&lt;/p&gt; &lt;p&gt;What’s the next big innovation? &lt;a href=&quot;http://dbpedia.org/page/Neuromorphic_engineering&quot; id=&quot;link-id0x2aab76156358&quot;&gt;Neuromorphic computing&lt;/a&gt;? &lt;a href=&quot;http://dbpedia.org/page/Quantum_computer&quot; id=&quot;link-id0x2aab74efc458&quot;&gt;Quantum computing&lt;/a&gt;? Maybe. For now, I’d just do more engineering along the core competence discussed above, with emphasis on good marketing and scalable execution. By this I mean trained people who know something about deployment. There is a huge training gap. In the would-be &amp;quot;Age of Data,&amp;quot; knowledge of how things actually work and scale is near-absent. I have offered to do some courses on this to partners and public alike, but I need somebody to drive this show; I have other things to do.&lt;/p&gt; &lt;p&gt;I have been to many, many project review meetings, mostly as a project partner but also as reviewer. For the past year, the &lt;a href=&quot;http://dbpedia.org/resource/European_Commission&quot; id=&quot;link-id0x2aab7628cb88&quot;&gt;EC&lt;/a&gt; has used an innovation questionnaire at the end of the meetings. It is quite vague, and I don’t think it delivers much actionable intelligence.&lt;/p&gt; &lt;p&gt;What would deliver this would be a venture capital type activity, with well-developed networks and active participation in developing a business. The EC is not now set up to perform this role, though. But the EC is a fairly large and wealthy entity, so it could invest some money via this type of channel. Also there should be higher individual incentives and rewards for speed and excellence. Getting the next Horizon 2020 research grant may be good, but better exists. The grants are competitive enough and the calls are not bad; they follow the times.&lt;/p&gt; &lt;p&gt;In the projects I have seen, productization does get some attention, e.g., the &lt;a href=&quot;http://stack.lod2.eu/blog/&quot; id=&quot;link-id0x2aab768be028&quot;&gt;LOD2 stack&lt;/a&gt;, but it is not something that is really ongoing or with dedicated commercial backing. It may also be that there is no market to justify such dedicated backing. Much of the RDF work has been &amp;quot;me, too&amp;quot; — let’s do what the real database and data integration people do, but let’s just do this with triples. Innovation? Well, I took the best of the real DB world and adapted this to RDF, which did produce a competent piece of work with broad applicability, extending outside RDF. Is there better than this? Well, some of the data integration work (e.g., &lt;a href=&quot;http://svn.aksw.org/papers/2011/WWW_LIMES/public.pdf&quot; id=&quot;link-id0x2aab76423568&quot;&gt;LIMES&lt;/a&gt;) is not bad, and it might be picked up by some of the players that do this sort of thing in the broader world, e.g., &lt;a href=&quot;http://dbpedia.org/resource/Informatica&quot; id=&quot;link-id0x2aab753c3e68&quot;&gt;Informatica&lt;/a&gt;, the DI suites of big DB vendors, &lt;a href=&quot;https://www.crunchbase.com/organization/tamr&quot; id=&quot;link-id0x2aab76fc6e78&quot;&gt;Tamr&lt;/a&gt;, etc. I would not know if this in fact adds value to the non-RDF equivalents; I do not know the field well enough, but there could be a possibility.&lt;/p&gt; &lt;p&gt;The recent emphasis for benchmarking, spearheaded by &lt;a href=&quot;https://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x2aab76c45018&quot;&gt;Stefano Bertolo&lt;/a&gt; is good, as exemplified by the &lt;a href=&quot;http://ldbcouncil.org/industry/organization/origins&quot; id=&quot;link-id0x2aab75f4e288&quot;&gt;LDBC FP7&lt;/a&gt;. There should probably be one or two projects of this sort going at all times. These make challenges known and are an effective means of guiding research, with a large multiplier: Once a benchmark gets adopted, infinitely more work goes into solving the problem than in stating it in the first place.&lt;/p&gt; &lt;p&gt;The aims and calls are good. The execution by projects is variable. For 1% of excellence, there apparently must be 99% of so-and-so, but this is just a fact of life and not specific to this context. The projects are rather diffuse. There is not a single outcome that gets all the effort. In this, the level of engagement of participants is less and focus is much more scattered than in startups. A really hungry, go-getter mood is mostly absent. I am a believer in core competence. Well, most people will agree that core competence is nice. But the projects I have seen do not drive for it hard enough.&lt;/p&gt; &lt;p&gt;It is hard to say exactly what kinds of incentives could be offered to encourage truly exceptional work. The American startup scene does offer high rewards and something of this could be transplanted into the EC project world. I would not know exactly what form this could take, though.&lt;/p&gt;</atom:content>
  <atom:updated>2015-06-29T15:36:03.387872-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso updated to version 7.2.1</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-29#1853</atom:id>
  <atom:published>2015-06-29T19:21:25Z</atom:published>
  <atom:content type="html">&lt;p&gt;We&amp;#39;re pleased to announce that Virtuoso 7.2.1 is now available, and includes various enhancements and bug fixes. Important additions include new support for &lt;code&gt;xsd:boolean&lt;/code&gt; and &lt;code&gt;TIMEZONE&lt;/code&gt;-less &lt;code&gt;DATETIME&lt;/code&gt; &amp;amp; &lt;code&gt;xsd:dateTime&lt;/code&gt;; and significantly improved compatibility with the Jena and Sesame Frameworks.&lt;/p&gt; &lt;p&gt;New product features as of June 24, 2015, v7.2.1, include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Virtuoso Engine&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for &lt;code&gt;TIMEZONE&lt;/code&gt;-less &lt;code&gt;xsd:dateTime&lt;/code&gt; and &lt;code&gt;DATETIME&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added support for &lt;code&gt;xsd:boolean&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added new text index functions &lt;/li&gt; &lt;li&gt;Added better handling of HTTP status codes on SPARQL graph protocol endpoint &lt;/li&gt; &lt;li&gt;Added new cache for compiled regular expressions &lt;/li&gt; &lt;li&gt;Added support for expression in &lt;code&gt;TOP/SKIP&lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;SPARQL&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for SPARQL &lt;code&gt;GROUPING SETS&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added support for SPARQL 1.1 &lt;code&gt;EBV&lt;/code&gt; (Efficient Boolean Value) &lt;/li&gt; &lt;li&gt;Added support for &lt;code&gt;define input:with-fallback-graph_uri &lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added support for &lt;code&gt;define input:target-fallback-graph-uri&lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Jena &amp;amp; Sesame Compatibility&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for using &lt;code&gt;rdf_insert_triple_c()&lt;/code&gt; to insert BNode data &lt;/li&gt; &lt;li&gt;Added support for returning &lt;code&gt;xsd:boolean&lt;/code&gt; as &lt;code&gt;true/false&lt;/code&gt; rather than &lt;code&gt;1/0&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added support for &lt;code&gt;maxQueryTimeout&lt;/code&gt; in Sesame2 provider &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;JDBC Driver&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added new methods &lt;code&gt;setLogFileName&lt;/code&gt; and &lt;code&gt;getLogFileName&lt;/code&gt; &lt;/li&gt; &lt;li&gt;Added new attribute &amp;quot;&lt;code&gt;logFileName&lt;/code&gt;&amp;quot; to &lt;code&gt;VirtuosoDataSources&lt;/code&gt; for logging support &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Faceted Browser&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for emitting HTML5+Microdata instead of RDFa as default HTML page &lt;/li&gt; &lt;li&gt;Added query optimizations &lt;/li&gt; &lt;li&gt;Added new footer icons to /describe page &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Conductor and DAV&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Added support for VAD dependency tree &lt;/li&gt; &lt;li&gt;Added support for default vdirs when creating new listeners &lt;/li&gt; &lt;li&gt;Added support for private RDF graphs &lt;/li&gt; &lt;li&gt;Added support for LDP in DAV API &lt;/li&gt; &lt;li&gt;Added option to create shared folder if not present &lt;/li&gt; &lt;li&gt;Added option to enable/disable DET graphs binding &lt;/li&gt; &lt;li&gt;Added option to set content length threshold for asynchronous sponging &lt;/li&gt; &lt;li&gt;Added folder option related to &lt;code&gt;.TTL&lt;/code&gt; redirection &lt;/li&gt; &lt;li&gt;Added functions to edit turtle files &lt;/li&gt; &lt;li&gt;Added popup dialog to search for unknown prefixes &lt;/li&gt; &lt;li&gt;Added registry option to add missing prefixes for &lt;code&gt;.TTL&lt;/code&gt; files &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; More details of the additions, fixes, and other changes in this update of both Open Source and Commercial Editions, may be found on &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSNews#2015-06-24%20-%20Virtuoso%20Open-Source%20Edition%207.2.1%20Released&quot; id=&quot;link-id0x2aab74ec1248&quot;&gt;the Virtuoso News page&lt;/a&gt;. Additional Information: &lt;ul&gt; &lt;li&gt; &lt;p&gt;Virtuoso Commercial Edition&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aab75e9ead8&quot;&gt;Home Page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x2aab75e9ebe8&quot;&gt;Download Page&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Virtuoso Open Source Edition &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/tree/develop/7&quot; id=&quot;link-id0x2aab75e9eef8&quot;&gt;Development Branch&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/tree/stable/7&quot; id=&quot;link-id0x2aab75e9f048&quot;&gt;Stable Branch&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-29T15:21:25.985492-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Announcement: UDA Release 7.0 Lite Edition ODBC Driver for Oracle</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-23#1852</atom:id>
  <atom:published>2015-06-23T20:14:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;Today, we&amp;#39;ve updated the &lt;b&gt;&lt;a href=&quot;http://uda.openlinksw.com/odbc-oracle-st/&quot; id=&quot;link-id0x2aac17a529d8&quot;&gt;Lite Edition ODBC Driver for Oracle&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt; &lt;p&gt;Installation and configuration takes only minutes, by following the documentation which remains available anytime, specifically for this driver on &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/UdaWikiWeb/PreinstallOracleLiteWin32&quot; id=&quot;link-id0x2aac17a1eaf8&quot;&gt;Windows&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Release 7.0 licenses are also &lt;a href=&quot;http://uda.openlinksw.com/offers/offers.vsp?data_access=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23DataAccessODBC&amp;amp;dbms=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23Oracle&amp;amp;format=http%3A%2F%2Fdata.openlinksw.com%2Foplweb%2Fproduct_format%2Fst%23this&amp;amp;version=7.x&quot; id=&quot;link-id0x2aac17c00a78&quot;&gt;available for immediate purchase&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Client Platform Support&lt;/h2&gt; &lt;p&gt;Release 7.0 installers are &lt;a href=&quot;http://uda.openlinksw.com/odbc-oracle-st/&quot; id=&quot;link-id0x2aac171b9928&quot;&gt;available for immediate download&lt;/a&gt; for Windows. Builds for Mac, Linux, and other Unix-like OS will be available soon; please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x2aabdbc32078&quot;&gt;contact us if you have urgent need&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Release 7.0 supports all 32-bit and 64-bit ODBC client tools and applications, both GUI and command-line, on —&lt;/p&gt; &lt;table style=&quot;align:center;width:45%;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;width:45%;vertical-align:top;&quot;&gt;Windows and Windows Server &lt;br /&gt; on x86 and x86_64&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;width:45%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Windows 8.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows 7.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Vista (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows XP (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 R2 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;DBMS Version Support&lt;/h2&gt; &lt;p&gt;The Release 7.0 Lite Edition ODBC Driver supports virtually every version of Oracle in current use, including —&lt;/p&gt; &lt;table style=&quot;align:center;width:95%;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;width:30%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Oracle 12c Release 1 (12.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 11g Release 2 (11.2.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 11g Release 1 (11.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 10g Release 2 (10.2.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 10g Release 1 (10.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 9i Release 2 (9.2.x)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt; Changes since Release 6.x &lt;/h2&gt; &lt;h3&gt;Additions&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Support for Oracle 12c&lt;/p&gt; &lt;/li&gt; &lt;li&gt;Support for Windows 8 and Windows Server 2012 &lt;p&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Fixes&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Enhanced support for Oracle 11g&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-23T16:56:02.257317-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Announcement: UDA Release 7.0 Express Edition ODBC Driver for Oracle</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-23#1851</atom:id>
  <atom:published>2015-06-23T20:14:36Z</atom:published>
  <atom:content type="html">&lt;p&gt;Today, we&amp;#39;ve updated the &lt;b&gt;&lt;a href=&quot;http://uda.openlinksw.com/odbc-oracle-ee/&quot; id=&quot;link-id0x2aac15bc16d8&quot;&gt;Express Edition ODBC Driver for Oracle&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt; &lt;p&gt;Installation and configuration takes only minutes, by following the documentation which remains available anytime, specifically for this driver on &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/UdaWikiWeb/PreInstallOracleExpressOSX&quot; id=&quot;link-id0x2aac17257ea8&quot;&gt;OS X&lt;/a&gt; and &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/UdaWikiWeb/PreInstallOracleExpressWin32&quot; id=&quot;link-id0x2aac1432de48&quot;&gt;Windows&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Release 7.0 licenses are also &lt;a href=&quot;http://uda.openlinksw.com/offers/offers.vsp?data_access=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23DataAccessODBC&amp;amp;dbms=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23Oracle&amp;amp;format=http%3A%2F%2Fdata.openlinksw.com%2Foplweb%2Fproduct_format%2Fexpress%23this&amp;amp;version=7.x&quot; id=&quot;link-id0x2aac15531168&quot;&gt;available for immediate purchase&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Client Platform Support&lt;/h2&gt; &lt;p&gt;Release 7.0 installers are &lt;a href=&quot;http://uda.openlinksw.com/odbc-oracle-ee/&quot; id=&quot;link-id0x2aac16f812e8&quot;&gt;available for immediate download&lt;/a&gt; for Mac and Windows. (Express Edition is not typically produced for Linux and other Unix-like OS will be available soon; please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x2aabdbc32078&quot;&gt;contact us if you have specific need&lt;/a&gt;.)&lt;/p&gt; &lt;p&gt;Release 7.0 supports all 32-bit and 64-bit ODBC client tools and applications, both GUI and command-line, on —&lt;/p&gt; &lt;table style=&quot;align:center;width:95%;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;width:45%;vertical-align:top;&quot;&gt;OS X and OS X Server &lt;br /&gt; on x86 and x86_64&lt;/th&gt; &lt;th style=&quot;width:45%;vertical-align:top;&quot;&gt;Windows and Windows Server &lt;br /&gt; on x86 and x86_64&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;width:45%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; Yosemite (10.10.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Mavericks (10.9.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Mountain Lion (10.8.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Lion (10.7.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;td style=&quot;width:45%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Windows 8.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows 7.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Vista (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows XP (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 R2 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;DBMS Version Support&lt;/h2&gt; &lt;p&gt;The Release 7.0 Express Edition ODBC Driver supports virtually every version of Oracle in current use, including —&lt;/p&gt; &lt;table style=&quot;align:center;width:95%;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;width:30%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Oracle 12c Release 1 (12.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 11g Release 2 (11.2.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 11g Release 1 (11.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 10g Release 2 (10.2.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 10g Release 1 (10.1.x)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Oracle 9i Release 2 (9.2.x)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt; Changes since Release 6.x &lt;/h2&gt; &lt;h3&gt;Additions&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Support for Oracle 12c&lt;/p&gt; &lt;/li&gt; &lt;li&gt;Support for OS X Yosemite, Windows 8, and Windows Server 2012 &lt;p&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Fixes&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Enhanced support for Oracle 11g&lt;/p&gt; &lt;/li&gt; &lt;li&gt;Enhanced support for OS X Mavericks &lt;p&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-26T10:41:25.982191-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Elastic Cluster Benchmarks AMI on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-16#1850</atom:id>
  <atom:published>2015-06-16T21:53:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have another new Amazon machine image, this time for deploying your own Virtuoso Elastic Cluster on the cloud. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x10cd1dc38&quot;&gt;previous post&lt;/a&gt; gave a summary of running TPC-H on this image. This post is about what the AMI consists of and how to set it up.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; This AMI is running a pre-release build of Virtuoso 7.5, Commercial Edition. Features are subject to change, and this build is not licensed for any use other than the AMI-based benchmarking described herein.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;There are two preconfigured cluster setups; one is for two (2) machines/instances and one is for four (4). Generation and loading of TPC-H data, as well as the benchmark run itself, is preconfigured, so you can do it by entering just a few commands. The whole sequence of doing a terabyte (1000G) scale TPC-H takes under two hours, with 30 minutes to generate the data, 35 minutes to load, and 35 minutes to do three benchmark runs. The 100G scale is several times faster still.&lt;/p&gt; &lt;p&gt;To experiment with this AMI, you will need a set of license files, one per machine/instance, which &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x10ca15da8&quot;&gt;our Sales Team can provide&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Detailed instructions are on the AMI, in &lt;code&gt;/home/ec2-user/&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150616ElasticClusterSetup/cluster_instructions.txt&quot; title=&quot;cluster_instructions.txt&quot; alt=&quot;Detailed Cluster Setup Instructions&quot; id=&quot;link-id0x2aab90d25058&quot;&gt;cluster_instructions.txt&lt;/a&gt;&lt;/code&gt;, but the basic steps to get up and running are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Instantiate machine image &lt;b&gt;ami-811becea)&lt;/b&gt; (AMI ID is subject to change; you should be able to find the latest by searching for &amp;quot;OpenLink Virtuoso Benchmarks&amp;quot; in &amp;quot;Community AMIs&amp;quot;; this one is short-named &lt;code&gt;virtuoso-bench-cl&lt;/code&gt;) with two or four (2 or 4) R3.8xlarge instances within one virtual private cluster and placement group. Make sure the VPC security is set to allow all connections.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Log in to the first, and fill in the configuration file with the internal IP addresses of all machines instantiated in step 1.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Distribute the license files to the instances, and start the OpenLink License Manager on each machine.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run 3 shell commands to set up the file systems and the Virtuoso configuration files.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;If you do not plan to run one of these benchmarks, you can simply start and work with the Virtuoso cluster now. It is ready for use with an empty database.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Before running one of these benchmark, generate the appropriate dataset with the &lt;code&gt;dbgen.sh&lt;/code&gt; command.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Bulk load the data with &lt;code&gt;load.sh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run the benchmark with &lt;code&gt;run.sh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Right now the cluster benchmarks are limited to TPC-H but cluster versions of the LDBC Social Network and Semantic Publishing benchmarks will follow soon.&lt;/p&gt;</atom:content>
  <atom:updated>2015-06-17T10:13:21.091311-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Elastic Cluster Benchmarks AMI on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-16#1849</atom:id>
  <atom:published>2015-06-16T21:53:29Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have another new Amazon machine image, this time for deploying your own Virtuoso Elastic Cluster on the cloud. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x10cd1dc38&quot;&gt;previous post&lt;/a&gt; gave a summary of running TPC-H on this image. This post is about what the AMI consists of and how to set it up.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; This AMI is running a pre-release build of Virtuoso 7.5, Commercial Edition. Features are subject to change, and this build is not licensed for any use other than the AMI-based benchmarking described herein.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;There are two preconfigured cluster setups; one is for two (2) machines/instances and one is for four (4). Generation and loading of TPC-H data, as well as the benchmark run itself, is preconfigured, so you can do it by entering just a few commands. The whole sequence of doing a terabyte (1000G) scale TPC-H takes under two hours, with 30 minutes to generate the data, 35 minutes to load, and 35 minutes to do three benchmark runs. The 100G scale is several times faster still.&lt;/p&gt; &lt;p&gt;To experiment with this AMI, you will need a set of license files, one per machine/instance, which &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x10ca15da8&quot;&gt;our Sales Team can provide&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Detailed instructions are on the AMI, in &lt;code&gt;/home/ec2-user/&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150616ElasticClusterSetup/cluster_instructions.txt&quot; title=&quot;cluster_instructions.txt&quot; alt=&quot;Detailed Cluster Setup Instructions&quot; id=&quot;link-id0x2aab9a4158b8&quot;&gt;cluster_instructions.txt&lt;/a&gt;&lt;/code&gt;, but the basic steps to get up and running are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Instantiate machine image &lt;b&gt;ami-811becea)&lt;/b&gt; (AMI ID is subject to change; you should be able to find the latest by searching for &amp;quot;OpenLink Virtuoso Benchmarks&amp;quot; in &amp;quot;Community AMIs&amp;quot;; this one is short-named &lt;code&gt;virtuoso-bench-cl&lt;/code&gt;) with two or four (2 or 4) R3.8xlarge instances within one virtual private cluster and placement group. Make sure the VPC security is set to allow all connections.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Log in to the first, and fill in the configuration file with the internal IP addresses of all machines instantiated in step 1.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Distribute the license files to the instances, and start the OpenLink License Manager on each machine.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run 3 shell commands to set up the file systems and the Virtuoso configuration files.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;If you do not plan to run one of these benchmarks, you can simply start and work with the Virtuoso cluster now. It is ready for use with an empty database.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Before running one of these benchmark, generate the appropriate dataset with the &lt;code&gt;dbgen.sh&lt;/code&gt; command.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Bulk load the data with &lt;code&gt;load.sh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run the benchmark with &lt;code&gt;run.sh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Right now the cluster benchmarks are limited to TPC-H but cluster versions of the LDBC Social Network and Semantic Publishing benchmarks will follow soon.&lt;/p&gt;</atom:content>
  <atom:updated>2015-06-17T10:13:37.325753-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Announcement: UDA Release 7.0 Lite Edition ODBC Driver for Sybase and Microsoft SQL Server</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-16#1848</atom:id>
  <atom:published>2015-06-16T21:43:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;In coming months, we&amp;#39;ll be gradually shipping Release 7.0 of all our UDA drivers. This post will be the first of many, describing some of the fixes, changes, and improvements in each driver as they are made available.&lt;/p&gt; &lt;p&gt;Today, we have the &lt;b&gt;&lt;a href=&quot;http://uda.openlinksw.com/odbc-sqlserver-st/&quot; id=&quot;link-id0x2aabdba80608&quot;&gt;Lite Edition ODBC Drivers for Sybase and Microsoft SQL Server&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt; &lt;p&gt;Installation and configuration takes only minutes, by following the documentation which remains available anytime, specifically for this driver on &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/UdaWikiWeb/PreinstallSQLLiteOSX&quot; id=&quot;link-id0x2aabdbc32318&quot;&gt;OS X&lt;/a&gt; and &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/UdaWikiWeb/PreinstallSQLLiteWin32&quot; id=&quot;link-id0x2aabdbc32498&quot;&gt;Windows&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Release 7.0 licenses are also &lt;a href=&quot;http://uda.openlinksw.com/offers/offers.vsp?data_access=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23DataAccessODBC&amp;amp;dbms=http%3A%2F%2Fwww.openlinksw.com%2Fontology%2Fsoftware%23SQLServer&amp;amp;format=http%3A%2F%2Fdata.openlinksw.com%2Foplweb%2Fproduct_format%2Fst%23this&amp;amp;version=7.x&quot; id=&quot;link-id0x2aabdbc32738&quot;&gt;available for immediate purchase&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Client Platform Support&lt;/h2&gt; &lt;p&gt;Release 7.0 installers are &lt;a href=&quot;http://uda.openlinksw.com/odbc-sqlserver-st/&quot; id=&quot;link-id0x2aabdba80798&quot;&gt;available for immediate download&lt;/a&gt; for Mac and Windows. Builds for Linux and other Unix-like OS will be available soon; please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x2aabdbc32078&quot;&gt;contact us if you have urgent need&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Release 7.0 supports all 32-bit and 64-bit ODBC client tools and applications, both GUI and command-line, on —&lt;/p&gt; &lt;table style=&quot;align:center;width:95%;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;width:45%;vertical-align:top;&quot;&gt;OS X and OS X Server &lt;br /&gt; on x86 and x86_64&lt;/th&gt; &lt;th style=&quot;width:45%;vertical-align:top;&quot;&gt;Windows and Windows Server &lt;br /&gt; on x86 and x86_64&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;width:45%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; Yosemite (10.10.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Mavericks (10.9.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Mountain Lion (10.8.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Lion (10.7.x) (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;td style=&quot;width:45%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Windows 8.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows 7.x (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Vista (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows XP (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2012 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 R2 (x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2008 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 R2 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Windows Server 2003 (x86, x86_64)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;DBMS Version Support&lt;/h2&gt; &lt;p&gt;The Release 7.0 Lite Edition ODBC Driver supports virtually every version of Microsoft SQL Server and Sybase Adaptive Server in current use, including —&lt;/p&gt; &lt;table style=&quot;align:center;width:95%;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;width:30%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 6.5&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 7.0&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 2000&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 2005&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 2008&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 2012&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Server 2014 &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Microsoft SQL Azure&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;td style=&quot;width:30%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Server 4.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Server 10.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Server 11.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Enterprise (ASE) 11.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Enterprise (ASE) 12.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Enterprise (ASE) 15.x&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;td style=&quot;width:30%;vertical-align:top;&quot;&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Anywhere 6.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Anywhere (ASA) 7.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Anywhere (ASA) 8.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase Adaptive Server Anywhere (ASA) 9.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Anywhere 10.x&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Sybase SQL Anywhere 11.x&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt; Changes since Release 6.x &lt;/h2&gt; &lt;h3&gt;Additions&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;added support for &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/cc280604%28v=sql.100%29.aspx&quot; id=&quot;link-id0x2aabdbbc6278&quot;&gt;&lt;code&gt;SPARSE&lt;/code&gt; columns&lt;/a&gt; in &lt;code&gt;SQLColumns()&lt;/code&gt; call&lt;/p&gt; &lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;added DSN options &lt;code&gt;&lt;nowiki&gt;SHOWSPARSECOLS / ShowSparseCols&lt;/nowiki&gt;&lt;/code&gt; and Multi-Tier connect option &lt;code&gt;-X&lt;/code&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;details, based on test table:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; &lt;code&gt;&lt;nowiki&gt; CREATE TABLE tbl_sparse_test ( col1 INT SPARSE , col2 INT , col3 XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ) &lt;/nowiki&gt; &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;wildcard query will return only &lt;code&gt;col2&lt;/code&gt; and &lt;code&gt;col3&lt;/code&gt;; will not include &lt;code&gt;SPARSE&lt;/code&gt; columns. This is standard SQL Server behavior, and it cannot be changed. &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; &lt;code&gt;&lt;nowiki&gt; SELECT * FROM tbl_sparse_test ; &lt;/nowiki&gt; &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;To include &lt;code&gt;SPARSE&lt;/code&gt; columns in results, they must be explicitly &lt;code&gt;SELECTed&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; &lt;code&gt;&lt;nowiki&gt; SELECT col1, col2, col3 FROM tbl_sparse_test ; &lt;/nowiki&gt; &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;By default, calls to &lt;code&gt;SQLColumns()&lt;/code&gt; don&amp;#39;t return Sparse Columns. To receive full columns list:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;via our Lite Edition ODBC driver — &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;open connection with &lt;code&gt;SHOWSPARSECOLS&lt;/code&gt; in DSN connection string, e.g., &lt;code&gt;&lt;nowiki&gt;&amp;quot;DSN=TdsSQL;UID=sa;PWD=sa;SHOWSPARSECOLS=Y;&amp;quot;&lt;/nowiki&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;code&gt;&lt;nowiki&gt;SQLColumns (hstmt, NULL, 0, NULL, 0, L&amp;quot;tbl_sparse_test&amp;quot;, SQL_NTS, NULL, 0 );&lt;/nowiki&gt; &lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;via the Microsoft ODBC driver — &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;code&gt;&lt;nowiki&gt;SQLSetStmtAttr (hstmt, SQL_SOPT_SS_NAME_SCOPE, (SQLPOINTER)SQL_SS_NAME_SCOPE_EXTENDED, SQL_IS_SMALLINT);&lt;/nowiki&gt; &lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;code&gt;&lt;nowiki&gt;SQLColumns (hstmt, L&amp;quot;tempdb&amp;quot;, SQL_NTS, L&amp;quot;dbo&amp;quot;, SQL_NTS, L&amp;quot;tbl_sparse_test&amp;quot;, SQL_NTS, NULL, 0 );&lt;/nowiki&gt; &lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;li&gt; &lt;p&gt;added support for new SQL Server datatypes such as &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/bb677335.aspx&quot; id=&quot;link-id0x2aab7f6655a8&quot;&gt;&lt;code&gt;datetime2&lt;/code&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;added support for &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/dd304783.aspx&quot; id=&quot;link-id0x107149af8&quot;&gt;&lt;code&gt;NBCROW&lt;/code&gt; token&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;added support for Sybase 15 &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;added support for &lt;a href=&quot;http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc38151.1540/doc/html/jwi1287495761977.html&quot; id=&quot;link-id0x2aac180e7f08&quot;&gt;&lt;code&gt;BIGDATETIME&lt;/code&gt; and &lt;code&gt;BIGTIME&lt;/code&gt;&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;added support for &lt;code&gt;UNITEXT&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;added support for &lt;code&gt;&lt;a href=&quot;http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc38151.1540/doc/html/san1278452908740.html&quot; id=&quot;link-id0x2aac185b5d48&quot;&gt;UNSIGNED BIGINT&lt;/a&gt;&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Fixes&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;fixed issue with SQL Server &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms177603.aspx&quot; id=&quot;link-id0x2aabdbb8e848&quot;&gt;&lt;code&gt;BIT&lt;/code&gt; datatype&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;fixed memory overwrite error, when DB procedure is called with &lt;code&gt;&lt;nowiki&gt;SQL_PARAM_OUTPUT&lt;/nowiki&gt;&lt;/code&gt; parameter of &lt;code&gt;CHAR/VARCHAR/LONGVARCHAR&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;fixed issue with &lt;code&gt;VARBINARY&lt;/code&gt; datatype and DB procedures&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;fixed issue with converting &lt;code&gt;TIMESTAMP&lt;/code&gt; to &lt;code&gt;CHAR/WCHAR&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;fixed datatype info in &lt;code&gt;&lt;nowiki&gt;SQLGetTypeInfo&lt;/nowiki&gt;&lt;/code&gt; -- new Sybase and MSSQL datatypes were added&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;fixed database catalog and query metadata info for Sybase 15&amp;#39;s &lt;code&gt;UNSIGNED INT, UNSIGNED SMALLINT, BIGINT, SYSNAME, LONGSYSNAME&lt;/code&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-23T16:18:08.671938-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Why Do I Need To Pay For ODBC, JDBC, ADO.NET, OLE-DB Drivers? (revisited)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-11#1847</atom:id>
  <atom:published>2015-06-11T21:18:05Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Situation Analysis&lt;/h2&gt; &lt;p&gt;It&amp;#39;s the year 2015, and the fundamental issues associated with the utility of data access drivers remain confusing. Basically, we remain uncertain about the value-to-compensation alignment of ODBC (Open Database Connectivity), JDBC (Java Database Connectivity), and ADO.NET drivers/providers.&lt;/p&gt; &lt;table style=&quot;border-spacing: 10px; margin-left: auto; margin-right: auto; padding: 10px; width: 95%;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align: center; width: 45%;&quot;&gt;ODBC&lt;/th&gt; &lt;th style=&quot;text-align: center; width: 45%;&quot;&gt;JDBC&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align: center; width: 45%;&quot;&gt; &lt;a href=&quot;https://s-media-cache-ak0.pinimg.com/originals/ef/b2/7e/efb27e54ef098c18a93aa8a074d5817d.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; id=&quot;link-id0x1066f4c38&quot;&gt;&lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;https://s-media-cache-ak0.pinimg.com/originals/ef/b2/7e/efb27e54ef098c18a93aa8a074d5817d.png&quot; style=&quot;max-width: 400px; width: 100%&quot; /&gt;&lt;/a&gt; &lt;/td&gt; &lt;td style=&quot;text-align: center; width: 45%;&quot;&gt; &lt;a href=&quot;https://s-media-cache-ak0.pinimg.com/originals/75/11/a8/7511a81c2e4ec244473cc514d997bd0a.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; id=&quot;link-id0x10619cce8&quot;&gt;&lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;https://s-media-cache-ak0.pinimg.com/originals/75/11/a8/7511a81c2e4ec244473cc514d997bd0a.png&quot; style=&quot;max-width: 400px; width: 100%&quot; /&gt;&lt;/a&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align: center; width: 45%;&quot; colspan=&quot;2&quot;&gt;ADO.NET&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align: center; width: 45%;&quot; colspan=&quot;2&quot;&gt; &lt;a href=&quot;https://s-media-cache-ak0.pinimg.com/originals/70/67/69/706769ab0ff453e94c50f38c956beeab.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; id=&quot;link-id0x108c5e078&quot;&gt;&lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;https://s-media-cache-ak0.pinimg.com/originals/70/67/69/706769ab0ff453e94c50f38c956beeab.jpg&quot; style=&quot;max-width: 400px; width: 100%&quot; /&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Why do we pay for anything?&lt;/h3&gt; &lt;p&gt;After allowing for consumer irrationality [&lt;a href=&quot;http://www.theatlantic.com/business/archive/2013/01/the-irrational-consumer-why-economics-is-dead-wrong-about-how-we-make-choices/267255/&quot; id=&quot;link-id0x10711d0f8&quot;&gt;1&lt;/a&gt;], the basis of any payment is fundamentally tied to the monetization of opportunity costs. Essentially, we pay for one thing to alleviate the (usually higher) costs of something else.&lt;/p&gt; &lt;p&gt;The rest of this post focuses on highlighting the real pains associated with the $0.00 value misconception associated with Data Access Drivers: ODBC, JDBC, ADO.NET, OLE-DB, etc.&lt;/p&gt; &lt;h2&gt;Real Costs of Data Access Drivers&lt;/h2&gt; &lt;p&gt;In the most basic sense, there are some fundamental aspects of data access that are complex to implement and rarely implemented (if at all) by free drivers. The list includes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Escape Syntaxes for Dates and Functions&lt;/b&gt; -- abstraction for dates and function signatures at the application level (i.e., the same abstraction works across all compliant databases)&lt;/li&gt; &lt;li&gt; &lt;b&gt;Metadata Calls which enable smarter ODBC compliant applications&lt;/b&gt; -- this feature is typically missing in Drivers and abused by the Clients (consumers); i.e., clients are made DBMS specific by testing for specific DBMS names, rather than utilizing feature and functionality metadata returned by drivers&lt;/li&gt; &lt;li&gt; &lt;b&gt;Scrollable Cursors&lt;/b&gt; -- this is how you deal with change sensitivity and paging through large datasets; some drivers actually fake support and get away with it due to shortage of applications to test proper cursor types (Static, Forward-Only, Key-Set, Dynamic, and Mixed models).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Beyond actual driver sophistication, in regards to key feature implementations, let&amp;#39;s up the ante by veering into the area of data security. At the most basic level, It&amp;#39;s extremely important to understand that all data access drivers provide read-write access to your databases; thus, it&amp;#39;s imperative that data access drivers address the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Read-Only or Read-Write Access modalities scoped to specific &lt;ul&gt; &lt;li&gt;users&lt;/li&gt; &lt;li&gt;user groups&lt;/li&gt; &lt;li&gt;target databases&lt;/li&gt; &lt;li&gt;data access standards (e.g., ODBC, JDBC, ADO.NET) &lt;/li&gt; &lt;li&gt;client applications&lt;/li&gt; &lt;li&gt;client host operating systems&lt;/li&gt; &lt;li&gt;client host IP addresses&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Any combination of the above as part of a configurable collection of data access rules (or policies).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Once you&amp;#39;re done with security, you then have the thorny issue of data access and data flow management. In a nutshell, your driver needs to be able to handle:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;i&gt;Protection against Cartesian-product-based network flooding&lt;/i&gt; (e.g., user queries an enormous table without knowing or understanding back-end implications)&lt;/li&gt; &lt;li&gt; &lt;i&gt;Enabling or Disabling of key DBMS engine data access optimization features&lt;/i&gt; (e.g. SQL RDBMS-specific extensions exposed via Environment Variables or SQL-command-based settings)&lt;/li&gt; &lt;li&gt; &lt;i&gt;Conditional Connection Pooling&lt;/i&gt; across various dimensions such as Users, User Groups, Applications, Host Operating Systems, IP Addresses&lt;/li&gt; &lt;li&gt; &lt;i&gt;Encryption of Data&lt;/i&gt; in Transit&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Once you&amp;#39;ve dealt with Security and Data Flow, you then have to address the enforcement of these settings across a myriad of ODBC compliant host, which is where Zeroconfig and centralized data access administration comes into play i.e., configure once (locally) and enforce globally.&lt;/p&gt; &lt;h2&gt;OpenLink Universal Data Access (UDA) Drivers &lt;/h2&gt; &lt;p&gt;When OpenLink Software entered the ODBC Driver Market segment (circa 1992), the issues above were the fundamental basis of our Multi-Tier Drivers. Although the marketplace highlighted our drivers for high performance, stability, and specification adherence -- to all of which we remain committed -- our fundamental engineering focus has always been skewed towards configurable data security, platform independence, and scalability.&lt;/p&gt; &lt;p&gt;Every item of concern outlined in the section above is addressed by security features built into our Multi-Tier Drivers [&lt;a href=&quot;http://uda.openlinksw.com/odbc/mt/&quot; id=&quot;link-id0x106b2c0c8&quot;&gt;2&lt;/a&gt;][&lt;a href=&quot;http://uda.openlinksw.com/jdbc/mt/&quot; id=&quot;link-id0x108454e28&quot;&gt;3&lt;/a&gt;][&lt;a href=&quot;http://uda.openlinksw.com/dotnet/&quot; id=&quot;link-id0x108454f28&quot;&gt;4&lt;/a&gt;]. These features all leverage the fact that our multi-tier drivers include a sophisticated DB session rules book that enables construction and enforcement of user attribute (user name, application, client operating system, IP address, target database etc.) based rules which are applied to all database sessions (single or pooled). &lt;/p&gt; &lt;table style=&quot;border-spacing: 10px; margin-left: auto; margin-right: auto; padding: 10px; width: 95%;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;text-align: center; width: 45%;&quot;&gt; &lt;a href=&quot;https://s-media-cache-ak0.pinimg.com/originals/ed/95/14/ed9514178ecf89849402af1c48942412.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; id=&quot;link-id0x107378c98&quot;&gt;&lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;https://s-media-cache-ak0.pinimg.com/originals/ed/95/14/ed9514178ecf89849402af1c48942412.png&quot; style=&quot;max-width: 400px; width: 100%&quot; /&gt;&lt;/a&gt; &lt;div class=&quot;p2&quot;&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Today, in the year 2015, the security issues that pervade Data Access, whether via Native SQL RDBMS Drivers, or ODBC, JDBC, and ADO.NET Drivers/Providers, have only increased, courtesy of ubiquitous computing -- facilitated by the Internet &amp;amp; Web, across desktop and mobile device dimensions. Paradoxically, there remains a fundamental illusion that all Data Access Drivers are made the same; i.e., they simply provide you with the ability to connect to SQL RDBMS back-ends, for the industry standard price of $0.00, without consequence -- thereby skewing the very nature of SQL RDBMS data access and its security and privacy implications. &lt;/p&gt; &lt;p&gt;I hope that this post brings some clarity to a very serious security and general configuration management issues associated with Data Access Drivers. Free ODBC Drivers offer nothing; that&amp;#39;s why they cost $0.00. When dealing with real issues associated with Open Data Access, you must have a handle on the inevitable issues of data security and privacy. &lt;/p&gt; &lt;h2&gt;Links&lt;/h2&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://www.theatlantic.com/business/archive/2013/01/the-irrational-consumer-why-economics-is-dead-wrong-about-how-we-make-choices/267255/&quot; id=&quot;link-id0x1082b54b8&quot;&gt;The Irrational Consumer: Why Economics Is Dead Wrong About How We Make Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/odbc/mt/&quot; id=&quot;link-id0x1082b55b8&quot;&gt;OpenLink Multi-Tier ODBC Drivers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/jdbc/mt/&quot; id=&quot;link-id0x1067e1e68&quot;&gt;OpenLink Multi-Tier JDBC Drivers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/dotnet/mt/&quot; id=&quot;link-id0x1067e1fd8&quot;&gt;OpenLink Multi-Tier ADO.NET Providers&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.dba-oracle.com/t_auditing4_horror_stories_inside_jobs.htm&quot; id=&quot;link-id0x107044328&quot;&gt;&lt;span class=&quot;s1&quot;&gt;Oracle Security Auditing Horror Stories&lt;/span&gt; &lt;/a&gt;&lt;span class=&quot;s1&quot;&gt; -- showcases social dimension of security that exploits literal identifiers used by SQL RDBMS products in regards to user identity&lt;/span&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://searchoracle.techtarget.com/news/2240015728/Database-security-strategies-need-to-grow-up-in-2010?&quot; id=&quot;link-id0x1062ad718&quot;&gt;Database Security Strategies Need to Grow Up in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-1.html&quot; id=&quot;link-id0x10772cc78&quot;&gt;&lt;span class=&quot;s1&quot;&gt;Whose Data is it? Part 1&lt;/span&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;span class=&quot;s1&quot;&gt;&lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-2.html&quot; id=&quot;link-id0x10876fc48&quot;&gt;Whose Data is it? Part 2&lt;/a&gt; &lt;/span&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-07-17T14:00:52.056449-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 21 of n): Running TPC-H on Virtuoso Elastic Cluster on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-10#1846</atom:id>
  <atom:published>2015-06-10T16:04:52Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have made an Amazon EC2 deployment of &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/#cluster&quot; id=&quot;link-id0x2aabd14557d8&quot;&gt;Virtuoso 7 Commercial Edition, configured to use the Elastic Cluster Module&lt;/a&gt; with TPC-H preconfigured, similar to the &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1843&quot; id=&quot;link-id0x2aabd235a378&quot;&gt;recently published OpenLink Virtuoso Benchmark AMI&lt;/a&gt; running the Open Source Edition. The details of the new Elastic Cluster AMI and steps to use it will be published in a forthcoming post. Here we will simply look at results of running TPC-H 100G scale on two machines, and 1000G scale on four machines. This shows how Virtuoso provides great performance on a cloud platform. The extremely fast bulk load — 33 minutes for a terabyte! — means that you can get straight to work even with on-demand infrastructure.&lt;/p&gt; &lt;p&gt;In the following, the Amazon instance type is R3.8xlarge, each with dual Xeon E5-2670 v2, 244G RAM, and 2 x 300G SSD. The image is made from the Amazon Linux with built-in network optimization. We first tried a RedHat image without network optimization and had considerable trouble with the interconnect. Using network-optimized Amazon Linux images inside a virtual private cloud has resolved all these problems.&lt;/p&gt; &lt;p&gt;The network optimized 10GE interconnect at Amazon offers throughput close to the QDR InfiniBand running TCP-IP; thus the Amazon platform is suitable for running cluster databases. The execution that we have seen is not seriously network bound.&lt;/p&gt; &lt;h3&gt;100G on 2 machines, with a total of 32 cores, 64 threads, 488 GB RAM, 4 x 300 GB SSD&lt;/h3&gt; &lt;b&gt;Load time:&lt;/b&gt; 3m 52s &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;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;1&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;523,554.3&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;590,692.6&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;556,111.2&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;2&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;565,353.3&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;642,503.0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;602,694.9&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;1000G on 4 machines, with a total of 64 cores, 128 threads, 976 GB RAM, 8 x 300 GB SSD&lt;/h3&gt; &lt;b&gt;Load time:&lt;/b&gt; 32m 47s &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;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;1&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;592,013.9&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;754,107.6&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;668,163.3&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;2&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;896,564.1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;828,265.4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;861,738.4&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;3&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;883,736.9&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;829,609.0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;856,245.3&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;For the larger scale we did 3 sets of power + throughput tests to measure consistency of performance. By the TPC-H rules, the worst (first) score should be reported. Even after bulk load, this is markedly less than the next power score due to working set effects. This is seen to a lesser degree with the first throughput score also.&lt;/p&gt; &lt;p&gt;The numerical quantities summaries are available &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report.zip&quot; id=&quot;link-id0x2aabafe59058&quot;&gt;in a report.zip file&lt;/a&gt;, or individually --&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-100-1.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0d449ff8&quot;&gt;report-100-1.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-100-2.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aab628ae658&quot;&gt;report-100-2.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-1.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aab637b1078&quot;&gt;report-1000-1.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-2.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0db30728&quot;&gt;report-1000-2.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-3.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0d462b08&quot;&gt;report-1000-3.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Subsequent posts will explain how to deploy Virtuoso Elastic Clusters on AWS.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab52abc0b8&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aab53935178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aab537ea348&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aab516a28b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab514b53d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aaba8e12aa8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aab537ea308&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaba97e18d8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aab52a6add8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaba9725b78&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab51109e68&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aaba97e1898&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aab51a706a8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aaba97e18b8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aaba9725b98&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab52abc098&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab5130e068&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aab52979f88&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:49:08.293219-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 21 of n): Running TPC-H on Virtuoso Elastic Cluster on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-10#1845</atom:id>
  <atom:published>2015-06-10T16:03:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have made an Amazon EC2 deployment of &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/#cluster&quot; id=&quot;link-id0x2aabd14557d8&quot;&gt;Virtuoso 7 Commercial Edition, configured to use the Elastic Cluster Module&lt;/a&gt; with TPC-H preconfigured, similar to the &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1843&quot; id=&quot;link-id0x2aabd235a378&quot;&gt;recently published OpenLink Virtuoso Benchmark AMI&lt;/a&gt; running the Open Source Edition. The details of the new Elastic Cluster AMI and steps to use it will be published in a forthcoming post. Here we will simply look at results of running TPC-H 100G scale on two machines, and 1000G scale on four machines. This shows how Virtuoso provides great performance on a cloud platform. The extremely fast bulk load — 33 minutes for a terabyte! — means that you can get straight to work even with on-demand infrastructure.&lt;/p&gt; &lt;p&gt;In the following, the Amazon instance type is R3.8xlarge, each with dual Xeon E5-2670 v2, 244G RAM, and 2 x 300G SSD. The image is made from the Amazon Linux with built-in network optimization. We first tried a RedHat image without network optimization and had considerable trouble with the interconnect. Using network-optimized Amazon Linux images inside a virtual private cloud has resolved all these problems.&lt;/p&gt; &lt;p&gt;The network optimized 10GE interconnect at Amazon offers throughput close to the QDR InfiniBand running TCP-IP; thus the Amazon platform is suitable for running cluster databases. The execution that we have seen is not seriously network bound.&lt;/p&gt; &lt;h3&gt;100G on 2 machines, with a total of 32 cores, 64 threads, 488 GB RAM, 4 x 300 GB SSD&lt;/h3&gt; &lt;b&gt;Load time:&lt;/b&gt; 3m 52s &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;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;1&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;523,554.3&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;590,692.6&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;556,111.2&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;2&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;565,353.3&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;642,503.0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;602,694.9&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;1000G on 4 machines, with a total of 64 cores, 128 threads, 976 GB RAM, 8 x 300 GB SSD&lt;/h3&gt; &lt;b&gt;Load time:&lt;/b&gt; 32m 47s &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;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;1&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;592,013.9&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;754,107.6&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;668,163.3&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;2&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;896,564.1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;828,265.4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;861,738.4&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center;&quot;&gt;&lt;code&gt;3&lt;/code&gt; &lt;/th&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;883,736.9&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;829,609.0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;856,245.3&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;For the larger scale we did 3 sets of power + throughput tests to measure consistency of performance. By the TPC-H rules, the worst (first) score should be reported. Even after bulk load, this is markedly less than the next power score due to working set effects. This is seen to a lesser degree with the first throughput score also.&lt;/p&gt; &lt;p&gt;The numerical quantities summaries are available &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report.zip&quot; id=&quot;link-id0x2aabafe59058&quot;&gt;in a report.zip file&lt;/a&gt;, or individually --&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-100-1.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aab623aa418&quot;&gt;report-100-1.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-100-2.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0dc9e6d8&quot;&gt;report-100-2.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-1.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aab63598398&quot;&gt;report-1000-1.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-2.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0c70f3a8&quot;&gt;report-1000-2.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20150610TPCHonClusterAMI/report-1000-3.txt&quot; style=&quot;wikiautogen&quot; id=&quot;link-id0x2aac0d939808&quot;&gt;report-1000-3.txt&lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Subsequent posts will explain how to deploy Virtuoso Elastic Clusters on AWS.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab52abc0b8&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aab53935178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aab537ea348&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aab516a28b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab514b53d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aaba8e12aa8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aab537ea308&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaba97e18d8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aab52a6add8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaba9725b78&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab51109e68&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aaba97e1898&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aab51a706a8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aaba97e18b8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aaba9725b98&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab52abc098&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab5130e068&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aab52979f88&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:49:39.451863-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Introducing the OpenLink Virtuoso Benchmarks AMI on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-09#1844</atom:id>
  <atom:published>2015-06-09T15:51:35Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;b&gt;OpenLink Virtuoso Benchmarks&lt;/b&gt; AMI is an Amazon EC2 machine image with the latest Virtuoso open source technology preconfigured to run —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0xf6c2bae8&quot;&gt;TPC-H&lt;/a&gt; &lt;/i&gt;, the classic of SQL data warehousing&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0xfdfb2aa8&quot;&gt;LDBC SNB&lt;/a&gt;,&lt;/i&gt; the new Social Network Benchmark from the Linked Data Benchmark Council&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1831&quot; id=&quot;link-id0x104b01368&quot;&gt;LDBC SPB&lt;/a&gt;,&lt;/i&gt; the RDF/SPARQL Semantic Publishing Benchmark from LDBC&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This package is ideal for technology evaluators and developers interested in getting the most performance out of Virtuoso. This is also an all-in-one solution to any questions about reproducing claimed benchmark results. All necessary tools for building and running are included; thus any developer can use this model installation as a starting point. The benchmark drivers are preconfigured with appropriate settings, and benchmark qualification tests can be run with a single command.&lt;/p&gt; &lt;p&gt;The Benchmarks AMI includes a precompiled, preconfigured checkout of the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x1051c7358&quot;&gt;v7fasttrack github repository&lt;/a&gt;, checkouts of the github repositories of the benchmarks, and a number of running directories with all configuration files preset and optimized. The image is intended to be instantiated on a R3.8xlarge Amazon instance with 244G RAM, dual Xeon E5-2670 v2, and 600G SSD.&lt;/p&gt; &lt;p&gt;Benchmark datasets and preloaded database files can be downloaded from S3 when large, and generated as needed on the instance when small. As an alternative, the instance is also set up to do all phases of data generation and database bulk load.&lt;/p&gt; &lt;p&gt;The following benchmark setups are included:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;TPC-H 100G&lt;/li&gt; &lt;li&gt;TPC-H 300G&lt;/li&gt; &lt;li&gt;LDBC SNB Validation &lt;/li&gt; &lt;li&gt;LDBC SNB Interactive 100G&lt;/li&gt; &lt;li&gt;LDBC SNB Interactive 300G (SF3)&lt;/li&gt; &lt;li&gt;LDBC SPB Validation &lt;/li&gt; &lt;li&gt;LDBC SPB Basic 256 Mtriples (SF5)&lt;/li&gt; &lt;li&gt;LDBC SPB Basic 1 Gtriple&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The AMI will be expanded as new benchmarks are introduced, for example, the &lt;i&gt;LDBC Social Network Business Intelligence&lt;/i&gt; or &lt;i&gt;Graph Analytics.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;To get started: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Instantiate machine image &lt;b&gt;ami-eb789280&lt;/b&gt; (AMI ID is subject to change; you should be able to find the latest by searching for &amp;quot;OpenLink Virtuoso Benchmarks&amp;quot; in &amp;quot;Community AMIs&amp;quot;; this one is short-named &lt;code&gt;virtuoso-bench-6&lt;/code&gt;) with a R3.8xlarge instance. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Connect via &lt;code&gt;ssh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;See the &lt;b&gt;&lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/blob/feature/analytics/binsrc/samples/ldami/ec2-user/README&quot; id=&quot;link-id0xfca2bab8&quot;&gt;README&lt;/a&gt;&lt;/b&gt; (also found in the &lt;b&gt;&lt;code&gt;ec2-user&lt;/code&gt;&lt;/b&gt;&amp;#39;s home directory) for full instructions on getting up and running.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2015-06-18T14:56:20.063339-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Introducing the OpenLink Virtuoso Benchmarks AMI on Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-09#1843</atom:id>
  <atom:published>2015-06-09T15:51:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;b&gt;OpenLink Virtuoso Benchmarks&lt;/b&gt; AMI is an Amazon EC2 machine image with the latest Virtuoso open source technology preconfigured to run —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0xf6c2bae8&quot;&gt;TPC-H&lt;/a&gt; &lt;/i&gt;, the classic of SQL data warehousing&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0xfdfb2aa8&quot;&gt;LDBC SNB&lt;/a&gt;,&lt;/i&gt; the new Social Network Benchmark from the Linked Data Benchmark Council&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1831&quot; id=&quot;link-id0x104b01368&quot;&gt;LDBC SPB&lt;/a&gt;,&lt;/i&gt; the RDF/SPARQL Semantic Publishing Benchmark from LDBC&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This package is ideal for technology evaluators and developers interested in getting the most performance out of Virtuoso. This is also an all-in-one solution to any questions about reproducing claimed benchmark results. All necessary tools for building and running are included; thus any developer can use this model installation as a starting point. The benchmark drivers are preconfigured with appropriate settings, and benchmark qualification tests can be run with a single command.&lt;/p&gt; &lt;p&gt;The Benchmarks AMI includes a precompiled, preconfigured checkout of the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x1051c7358&quot;&gt;v7fasttrack github repository&lt;/a&gt;, checkouts of the github repositories of the benchmarks, and a number of running directories with all configuration files preset and optimized. The image is intended to be instantiated on a R3.8xlarge Amazon instance with 244G RAM, dual Xeon E5-2670 v2, and 600G SSD.&lt;/p&gt; &lt;p&gt;Benchmark datasets and preloaded database files can be downloaded from S3 when large, and generated as needed on the instance when small. As an alternative, the instance is also set up to do all phases of data generation and database bulk load.&lt;/p&gt; &lt;p&gt;The following benchmark setups are included:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;TPC-H 100G&lt;/li&gt; &lt;li&gt;TPC-H 300G&lt;/li&gt; &lt;li&gt;LDBC SNB Validation &lt;/li&gt; &lt;li&gt;LDBC SNB Interactive 100G&lt;/li&gt; &lt;li&gt;LDBC SNB Interactive 300G (SF3)&lt;/li&gt; &lt;li&gt;LDBC SPB Validation &lt;/li&gt; &lt;li&gt;LDBC SPB Basic 256 Mtriples (SF5)&lt;/li&gt; &lt;li&gt;LDBC SPB Basic 1 Gtriple&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The AMI will be expanded as new benchmarks are introduced, for example, the &lt;i&gt;LDBC Social Network Business Intelligence&lt;/i&gt; or &lt;i&gt;Graph Analytics.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;To get started: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Instantiate machine image &lt;b&gt;ami-eb789280&lt;/b&gt; (AMI ID is subject to change; you should be able to find the latest by searching for &amp;quot;OpenLink Virtuoso Benchmarks&amp;quot; in &amp;quot;Community AMIs&amp;quot;; this one is short-named &lt;code&gt;virtuoso-bench-6&lt;/code&gt;) with a R3.8xlarge instance. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Connect via &lt;code&gt;ssh&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;See the &lt;b&gt;&lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/blob/feature/analytics/binsrc/samples/ldami/ec2-user/README&quot; id=&quot;link-id0xfca2bab8&quot;&gt;README&lt;/a&gt;&lt;/b&gt; (also found in the &lt;b&gt;&lt;code&gt;ec2-user&lt;/code&gt;&lt;/b&gt;&amp;#39;s home directory) for full instructions on getting up and running.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2015-06-18T14:55:56.642858-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-09#1842</atom:id>
  <atom:published>2015-06-09T15:35:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post we will look at running the &lt;a href=&quot;http://ldbcouncil.org/developer/snb&quot; id=&quot;link-id0x2aab62c37078&quot;&gt;LDBC SNB&lt;/a&gt; on &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aab629da5c8&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First, let&amp;#39;s recap what the benchmark is about: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;fairly frequent short updates, with no update contention worth mentioning&lt;/li&gt; &lt;li&gt;short random lookups&lt;/li&gt; &lt;li&gt;medium complex queries centered around a person&amp;#39;s social environment&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The updates exist so as to invalidate strategies that rely too heavily on precomputation. The short lookups exist for the sake of realism; after all, an online social application does lookups for the most part. The medium complex queries are to challenge the DBMS.&lt;/p&gt; &lt;p&gt;The DBMS challenges have to do firstly with query optimization, and secondly with execution with a lot of non-local random access patterns. Query optimization is not a requirement, &lt;i&gt;per se,&lt;/i&gt; since imperative implementations are allowed, but we will see that these are no more free of the laws of nature than the declarative ones.&lt;/p&gt; &lt;p&gt;The workload is arbitrarily parallel, so intra-query parallelization is not particularly useful, if also not harmful. There are latency constraints on operations which strongly encourage implementations to stay within a predictable time envelope regardless of specific query parameters. The parameters are a combination of person and date range, and sometimes tags or countries. The hardest queries have the potential to access all content created by people within 2 steps of a central person, so possibly thousands of people, times 2000 posts per person, times up to 4 tags per post. We are talking in the millions of key lookups, aiming for sub-second single-threaded execution.&lt;/p&gt; &lt;p&gt;The test system is the same as used in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab62e7f368&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630, 2x6 cores x 2 threads, 2.3GHz, 192 GB RAM. The software is the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aab62bf6de8&quot;&gt;feature/analytics branch&lt;/a&gt; of &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aab623b1358&quot;&gt;v7fasttrack, available from www.github.com&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The dataset is the SNB 300G set, with:&lt;/p&gt; &lt;blockquote&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,136,127&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;persons&lt;/code&gt; &lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;125,249,604&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;knows&lt;/code&gt; &lt;/b&gt; edges&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;847,886,644&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;posts&lt;/code&gt; &lt;/b&gt;, including replies&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,145,893,841&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;tags&lt;/code&gt; &lt;/b&gt; of posts or replies&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,140,226,235&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;likes&lt;/code&gt; &lt;/b&gt; of posts or replies&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;As an initial step, we run the benchmark as fast as it will go. We use 32 threads on the driver side for 24 hardware threads.&lt;/p&gt; &lt;p&gt;Below are the numerical quantities for a 400K operation run after 150K operations worth of warmup.&lt;/p&gt; &lt;blockquote&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;b&gt;Duration:&lt;/b&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;10:41.251&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;b&gt;Throughput:&lt;/b&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;623.71 (op/s)&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The statistics that matter are detailed below, with operations ranked in order of descending client-side wait-time. All times are in milliseconds.&lt;/p&gt; &lt;blockquote&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;% of total&lt;/th&gt; &lt;th&gt;total_wait&lt;/th&gt; &lt;th&gt;name&lt;/th&gt; &lt;th&gt;count&lt;/th&gt; &lt;th&gt;mean&lt;/th&gt; &lt;th&gt;min&lt;/th&gt; &lt;th&gt;max&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;20     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4,231,130&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery5 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 656&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;6,449.89   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 245&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10,311&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,272,954&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery8 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;18,354&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 123.84   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 14&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,240&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,200,718&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery3 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 388&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;5,671.95   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 468&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;17,368&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.3   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,561,382&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery14 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,124&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,389.13   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,724&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 6.7   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,441,575&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery12 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,252&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,151.42   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 15&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,273&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 6.5   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,396,932&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery10 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,252&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,115.76   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 13&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4,743&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     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,064,457&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery3PersonFriends &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.9979 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,287&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,047,536&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery2PersonPosts &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.6323 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,156&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4.1   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 885,102&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery6 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,721&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 514.295  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,227&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3.3   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 707,901&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery1 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,117&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 334.389  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 28&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,467&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2.4   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 521,738&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery4 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,530&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 341.005  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 49&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,774&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2.1   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 440,197&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery4MessageContent &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 9.50708&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,015&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 407,450&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate5AddForumMembership &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;14,338&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 28.4175 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,008&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 405,243&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery7MessageReplies &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8.75217&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,112&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 404,002&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery6MessageForum &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8.72537&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,968&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.8   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 387,044&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate3AddCommentLike &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;12,659&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 30.5746 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,060&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.7   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 361,290&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery1PersonProfile &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.80577&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,015&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.6   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 334,409&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery5MessageCreator &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.22234&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,055&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 220,740&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery2 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,488&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 148.347  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,504&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.96  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 205,910&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery7 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,721&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 119.646  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 11&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,295&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.93  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 198,971&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate2AddPostLike &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,974&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 33.3062 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,987&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.88  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 189,871&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery11 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,294&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 82.7685 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,219&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.85  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 182,964&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery13 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,898&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 63.1346 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,201&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.74  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 158,188&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery9 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 78&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,028.05   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,108&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4,183&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.67  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 143,457&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate7AddComment &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,986&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 35.9902 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,912&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.26  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 54,947&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate8AddFriendship &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 571&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 96.2294 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 988&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.2   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 43,451&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate6AddPost &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,386&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 31.3499 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,060&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.0086%&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,848&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate4AddForum &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 103&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 17.9417 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 65&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.0002%&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 44&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate1AddPerson &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22      &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 10&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 34&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;At this point we have in-depth knowledge of the choke points the benchmark stresses, and we can give a first assessment of whether the design meets its objectives for setting an agenda for the coming years of graph database development.&lt;/p&gt; &lt;p&gt;The implementation is well optimized in general but still has maybe 30% room for improvement. We note that this is based on a compressed column store. One could think that alternative data representations, like in-memory graphs of structs and pointers between them, are better for the task. This is not necessarily so; at the least, a compressed column store is much more space efficient. Space efficiency is the root of cost efficiency, since as soon as the working set is not in memory, a random access workload is badly hit.&lt;/p&gt; &lt;p&gt;The set of choke points (technical challenges) actually revealed by the benchmark is so far as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Cardinality estimation under heavy data skew —&lt;/b&gt; Many queries take a &lt;code&gt;tag&lt;/code&gt; or a &lt;code&gt;country&lt;/code&gt; as a parameter. The cardinalities associated with &lt;code&gt;tags&lt;/code&gt; vary from 29M &lt;code&gt;posts&lt;/code&gt; for the most common to 1 for the least common. Q6 has a common &lt;code&gt;tag&lt;/code&gt; (in top few hundred) half the time and a random, most often very infrequent, one the rest of the time. A declarative implementation must recognize the cardinality implications from the literal and plan accordingly. An imperative one would have to count. Missing this makes Q6 take about 40% of the time instead of 4.1% when adapting.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Covering indices —&lt;/b&gt; Being able to make multi-column indices that duplicate some columns from the table often saves an entire table lookup. For example, an index on &lt;code&gt;post&lt;/code&gt; by &lt;code&gt;author&lt;/code&gt; can also contain the &lt;code&gt;post&lt;/code&gt;&amp;#39;s &lt;code&gt;creation date&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Multi-hop graph traversal —&lt;/b&gt; Most queries access a two-hop environment starting at a &lt;code&gt;person&lt;/code&gt;. Two queries look for shortest paths of unbounded length. For the two-hop case, it makes almost no difference whether this is done as a union or a special graph traversal operator. For shortest paths, this simply must be built into the engine; doing this client-side incurs prohibitive overheads. A bidirectional shortest path operation is a requirement for the benchmark.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Top &lt;i&gt;K&lt;/i&gt; —&lt;/b&gt; Most queries returning &lt;code&gt;posts&lt;/code&gt; order results by descending &lt;code&gt;date&lt;/code&gt;. Once there are at least &lt;i&gt;k&lt;/i&gt; results, anything older than the &lt;i&gt;k&lt;/i&gt;th can be dropped, adding a &lt;code&gt;date&lt;/code&gt; selection as early as possible in the query. This interacts with vectored execution, so that starting with a short vector size more rapidly produces an initial top &lt;i&gt;k&lt;/i&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Late projection —&lt;/b&gt; Many queries access several columns and touch millions of rows but only return a few. The columns that are not used in sorting or selection can be retrieved only for the rows that are actually returned. This is especially useful with a column store, as this removes many large columns (e.g., text of a &lt;code&gt;post&lt;/code&gt;) from the working set.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Materialization —&lt;/b&gt; Q14 accesses an expensive-to-compute edge weight, the number of &lt;code&gt;post-reply&lt;/code&gt; pairs between two &lt;code&gt;people&lt;/code&gt;. Keeping this precomputed drops Q14 from the top place. Other materialization would be possible, for example Q2 (top 20 &lt;code&gt;posts&lt;/code&gt; by friends), but since Q2 is just 1% of the load, there is no need. One could of course argue that this should be 20x more frequent, in which case there could be a point to this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Concurrency control —&lt;/b&gt; Read-write contention is rare, as updates are randomly spread over the database. However, some pages get read very frequently, e.g., some middle level index pages in the &lt;code&gt;post&lt;/code&gt; table. Keeping a count of reading threads requires a mutex, and there is significant contention on this. Since the hot set can be one page, adding more mutexes does not always help. However, hash partitioning the index into many independent trees (as in the case of a cluster) helps for this. There is also contention on a mutex for assigning threads to client requests, as there are large numbers of short operations.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In subsequent posts, we will look at specific queries, what they in fact do, and what their theoretical performance limits would be. In this way we will have a precise understanding of which way SNB can steer the graph DB community.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0x2aab62c9ee38&quot;&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1836&quot; id=&quot;link-id0x2aab62e64818&quot;&gt; SNB Interactive, Part 2: Modeling Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:35:27.248425-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-09#1841</atom:id>
  <atom:published>2015-06-09T15:24:58Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post we will look at running the &lt;a href=&quot;http://ldbcouncil.org/developer/snb&quot; id=&quot;link-id0x2aab62c37078&quot;&gt;LDBC SNB&lt;/a&gt; on &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aab629da5c8&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First, let&amp;#39;s recap what the benchmark is about: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;fairly frequent short updates, with no update contention worth mentioning&lt;/li&gt; &lt;li&gt;short random lookups&lt;/li&gt; &lt;li&gt;medium complex queries centered around a person&amp;#39;s social environment&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The updates exist so as to invalidate strategies that rely too heavily on precomputation. The short lookups exist for the sake of realism; after all, an online social application does lookups for the most part. The medium complex queries are to challenge the DBMS.&lt;/p&gt; &lt;p&gt;The DBMS challenges have to do firstly with query optimization, and secondly with execution with a lot of non-local random access patterns. Query optimization is not a requirement, &lt;i&gt;per se,&lt;/i&gt; since imperative implementations are allowed, but we will see that these are no more free of the laws of nature than the declarative ones.&lt;/p&gt; &lt;p&gt;The workload is arbitrarily parallel, so intra-query parallelization is not particularly useful, if also not harmful. There are latency constraints on operations which strongly encourage implementations to stay within a predictable time envelope regardless of specific query parameters. The parameters are a combination of person and date range, and sometimes tags or countries. The hardest queries have the potential to access all content created by people within 2 steps of a central person, so possibly thousands of people, times 2000 posts per person, times up to 4 tags per post. We are talking in the millions of key lookups, aiming for sub-second single-threaded execution.&lt;/p&gt; &lt;p&gt;The test system is the same as used in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab62e7f368&quot;&gt;TPC-H series&lt;/a&gt;: dual Xeon E5-2630, 2x6 cores x 2 threads, 2.3GHz, 192 GB RAM. The software is the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aab62bf6de8&quot;&gt;feature/analytics branch&lt;/a&gt; of &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aab623b1358&quot;&gt;v7fasttrack, available from www.github.com&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The dataset is the SNB 300G set, with:&lt;/p&gt; &lt;blockquote&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,136,127&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;persons&lt;/code&gt; &lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;125,249,604&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;knows&lt;/code&gt; &lt;/b&gt; edges&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;847,886,644&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;posts&lt;/code&gt; &lt;/b&gt;, including replies&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,145,893,841&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;tags&lt;/code&gt; &lt;/b&gt; of posts or replies&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,140,226,235&lt;/code&gt; &lt;/td&gt; &lt;td&gt; &lt;b&gt;&lt;code&gt;likes&lt;/code&gt; &lt;/b&gt; of posts or replies&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;As an initial step, we run the benchmark as fast as it will go. We use 32 threads on the driver side for 24 hardware threads.&lt;/p&gt; &lt;p&gt;Below are the numerical quantities for a 400K operation run after 150K operations worth of warmup.&lt;/p&gt; &lt;blockquote&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;b&gt;Duration:&lt;/b&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;10:41.251&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;b&gt;Throughput:&lt;/b&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;623.71 (op/s)&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The statistics that matter are detailed below, with operations ranked in order of descending client-side wait-time. All times are in milliseconds.&lt;/p&gt; &lt;blockquote&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;% of total&lt;/th&gt; &lt;th&gt;total_wait&lt;/th&gt; &lt;th&gt;name&lt;/th&gt; &lt;th&gt;count&lt;/th&gt; &lt;th&gt;mean&lt;/th&gt; &lt;th&gt;min&lt;/th&gt; &lt;th&gt;max&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;20     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;4,231,130&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery5 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 656&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;6,449.89   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 245&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10,311&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;11     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,272,954&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery8 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;18,354&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 123.84   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 14&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,240&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;10     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,200,718&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery3 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 388&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;5,671.95   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 468&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;17,368&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.3   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,561,382&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery14 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,124&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,389.13   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,724&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 6.7   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,441,575&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery12 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,252&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,151.42   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 15&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,273&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 6.5   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,396,932&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery10 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,252&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,115.76   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 13&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4,743&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     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,064,457&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery3PersonFriends &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.9979 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,287&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,047,536&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery2PersonPosts &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22.6323 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,156&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4.1   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 885,102&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery6 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,721&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 514.295  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,227&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3.3   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 707,901&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery1 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,117&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 334.389  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 28&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,467&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2.4   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 521,738&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery4 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,530&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 341.005  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 49&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,774&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2.1   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 440,197&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery4MessageContent &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 9.50708&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,015&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 407,450&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate5AddForumMembership &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;14,338&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 28.4175 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,008&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 405,243&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery7MessageReplies &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8.75217&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,112&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.9   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 404,002&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery6MessageForum &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 8.72537&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,968&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.8   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 387,044&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate3AddCommentLike &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;12,659&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 30.5746 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,060&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.7   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 361,290&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery1PersonProfile &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,285&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.80577&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,015&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1.6   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 334,409&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcShortQuery5MessageCreator &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;46,302&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 7.22234&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,055&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1     %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 220,740&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery2 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,488&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 148.347  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,504&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.96  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 205,910&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery7 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,721&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 119.646  &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 11&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,295&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.93  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 198,971&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate2AddPostLike &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 5,974&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 33.3062 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,987&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.88  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 189,871&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery11 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,294&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 82.7685 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,219&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.85  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 182,964&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery13 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,898&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 63.1346 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,201&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.74  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 158,188&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcQuery9 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 78&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;2,028.05   &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt;1,108&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 4,183&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.67  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 143,457&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate7AddComment &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 3,986&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 35.9902 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,912&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.26  %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 54,947&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate8AddFriendship &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 571&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 96.2294 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 988&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.2   %&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 43,451&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate6AddPost &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,386&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 31.3499 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2,060&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.0086%&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1,848&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate4AddForum &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 103&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 17.9417 &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 1&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 65&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 0.0002%&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 44&lt;/code&gt; &lt;/td&gt; &lt;td&gt;&lt;code&gt;LdbcUpdate1AddPerson &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 2&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 22      &lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 10&lt;/code&gt; &lt;/td&gt; &lt;td style=&quot;text-align:right;&quot;&gt;&lt;code&gt; 34&lt;/code&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;At this point we have in-depth knowledge of the choke points the benchmark stresses, and we can give a first assessment of whether the design meets its objectives for setting an agenda for the coming years of graph database development.&lt;/p&gt; &lt;p&gt;The implementation is well optimized in general but still has maybe 30% room for improvement. We note that this is based on a compressed column store. One could think that alternative data representations, like in-memory graphs of structs and pointers between them, are better for the task. This is not necessarily so; at the least, a compressed column store is much more space efficient. Space efficiency is the root of cost efficiency, since as soon as the working set is not in memory, a random access workload is badly hit.&lt;/p&gt; &lt;p&gt;The set of choke points (technical challenges) actually revealed by the benchmark is so far as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Cardinality estimation under heavy data skew —&lt;/b&gt; Many queries take a &lt;code&gt;tag&lt;/code&gt; or a &lt;code&gt;country&lt;/code&gt; as a parameter. The cardinalities associated with &lt;code&gt;tags&lt;/code&gt; vary from 29M &lt;code&gt;posts&lt;/code&gt; for the most common to 1 for the least common. Q6 has a common &lt;code&gt;tag&lt;/code&gt; (in top few hundred) half the time and a random, most often very infrequent, one the rest of the time. A declarative implementation must recognize the cardinality implications from the literal and plan accordingly. An imperative one would have to count. Missing this makes Q6 take about 40% of the time instead of 4.1% when adapting.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Covering indices —&lt;/b&gt; Being able to make multi-column indices that duplicate some columns from the table often saves an entire table lookup. For example, an index on &lt;code&gt;post&lt;/code&gt; by &lt;code&gt;author&lt;/code&gt; can also contain the &lt;code&gt;post&lt;/code&gt;&amp;#39;s &lt;code&gt;creation date&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Multi-hop graph traversal —&lt;/b&gt; Most queries access a two-hop environment starting at a &lt;code&gt;person&lt;/code&gt;. Two queries look for shortest paths of unbounded length. For the two-hop case, it makes almost no difference whether this is done as a union or a special graph traversal operator. For shortest paths, this simply must be built into the engine; doing this client-side incurs prohibitive overheads. A bidirectional shortest path operation is a requirement for the benchmark.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Top &lt;i&gt;K&lt;/i&gt; —&lt;/b&gt; Most queries returning &lt;code&gt;posts&lt;/code&gt; order results by descending &lt;code&gt;date&lt;/code&gt;. Once there are at least &lt;i&gt;k&lt;/i&gt; results, anything older than the &lt;i&gt;k&lt;/i&gt;th can be dropped, adding a &lt;code&gt;date&lt;/code&gt; selection as early as possible in the query. This interacts with vectored execution, so that starting with a short vector size more rapidly produces an initial top &lt;i&gt;k&lt;/i&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Late projection —&lt;/b&gt; Many queries access several columns and touch millions of rows but only return a few. The columns that are not used in sorting or selection can be retrieved only for the rows that are actually returned. This is especially useful with a column store, as this removes many large columns (e.g., text of a &lt;code&gt;post&lt;/code&gt;) from the working set.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Materialization —&lt;/b&gt; Q14 accesses an expensive-to-compute edge weight, the number of &lt;code&gt;post-reply&lt;/code&gt; pairs between two &lt;code&gt;people&lt;/code&gt;. Keeping this precomputed drops Q14 from the top place. Other materialization would be possible, for example Q2 (top 20 &lt;code&gt;posts&lt;/code&gt; by friends), but since Q2 is just 1% of the load, there is no need. One could of course argue that this should be 20x more frequent, in which case there could be a point to this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Concurrency control —&lt;/b&gt; Read-write contention is rare, as updates are randomly spread over the database. However, some pages get read very frequently, e.g., some middle level index pages in the &lt;code&gt;post&lt;/code&gt; table. Keeping a count of reading threads requires a mutex, and there is significant contention on this. Since the hot set can be one page, adding more mutexes does not always help. However, hash partitioning the index into many independent trees (as in the case of a cluster) helps for this. There is also contention on a mutex for assigning threads to client requests, as there are large numbers of short operations.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In subsequent posts, we will look at specific queries, what they in fact do, and what their theoretical performance limits would be. In this way we will have a precise understanding of which way SNB can steer the graph DB community.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0x2aab62c9ee38&quot;&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1836&quot; id=&quot;link-id0x2aab62e64818&quot;&gt; SNB Interactive, Part 2: Modeling Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:24:58.727972-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Life after sun.jdbc.odbc.JdbcOdbcDriver</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2015-06-04#1840</atom:id>
  <atom:published>2015-06-04T21:12:19Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2016-05-12T22:39:03.406510</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Virtuoso Science Library</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-06-03#1839</atom:id>
  <atom:published>2015-06-03T16:51:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;There is a lot of scientific material on Virtuoso, but it has not been presented all together in any one place. So I am making here a compilation of the best resources with a paragraph of introduction on each. Some of these are project deliverables from projects under the EU FP7 programme; some are peer-reviewed publications.&lt;/p&gt; &lt;p&gt;For the future, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtuosoScienceLibrary&quot; id=&quot;link-id0x2aab62129648&quot;&gt;an updated version of this list&lt;/a&gt; may be found on the &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aab614e7508&quot;&gt;main Virtuoso site&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;European Project Deliverables&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://svn.aksw.org/projects/GeoKnow/Public/D2.6.1_Prototype_of_Built-in_Complex_Geo_Problem_Solving.pdf&quot; id=&quot;link-id0x2aab62a51908&quot;&gt;GeoKnow D 2.6.1&lt;/a&gt;: Graph Analytics in the DBMS&lt;/b&gt; (2015-01-05)&lt;/p&gt; &lt;p&gt;This introduces the idea of unbundling basic cluster DBMS functionality like cross partition joins and partitioned group by to form a graph processing framework collocated with the data.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://svn.aksw.org/projects/GeoKnow/Public/D2.4.1_Geospatial_Clustering.pdf&quot; id=&quot;link-id0x2aab61577e18&quot;&gt;GeoKnow D2.4.1&lt;/a&gt;: Geospatial Clustering and Characteristic Sets&lt;/b&gt; (2015-01-06)&lt;/p&gt; &lt;p&gt;This presents experimental results of structure-aware RDF applied to geospatial data. The regularly structured part of the data goes in tables; the rest is triples/quads. Furthermore, for the first time in the RDF space, physical storage location is correlated to properties of entities, in this case geo location, so that geospatially adjacent items are also likely adjacent in the physical data representation.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://lod2.eu/Deliverable/D2.1.5.html&quot; id=&quot;link-id0x2aab617997f8&quot;&gt;LOD2 D2.1.5&lt;/a&gt;: 500 billion triple BSBM&lt;/b&gt; (2014-08-18)&lt;/p&gt; &lt;p&gt;This presents experimental results on lookup and BI workloads on Virtuoso cluster with 12 nodes, for a total of 3T RAM and 192 cores. This also discusses bulk load, at up to 6M triples/s and specifics of query optimization in scale-out settings.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://lod2.eu/Deliverable/D2.6.html&quot; id=&quot;link-id0x2aab629cf8c8&quot;&gt;LOD2 D2.6&lt;/a&gt;: Parallel Programming in SQL&lt;/b&gt; (2012-08-12)&lt;/p&gt; &lt;p&gt;This discusses ways of making SQL procedures partitioning-aware, so that one can, map-reduce style, send parallel chunks of computation to each partition of the data.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Publications&lt;/h2&gt; &lt;h3&gt;2015&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Minh-Duc, Pham, Linnea, P., Erling, O., and Boncz, P.A. &amp;quot;&lt;a href=&quot;http://homepages.cwi.nl/~duc/papers/emergentschema_www15.pdf&quot; id=&quot;link-id0x2aab61eb10a8&quot;&gt;Deriving an Emergent Relational Schema from RDF Data&lt;/a&gt;,&amp;quot; WWW, 2015.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper shows how RDF is in fact structured and how this structure can be reconstructed. This reconstruction then serves to create a physical schema, reintroducing all the benefits of physical design to the schema-last world. Experiments with Virtuoso show marked gains in query speed and data compactness.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2014&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Peter A. Boncz, Orri Erling, Minh-Duc Pham: &lt;a href=&quot;http://oai.cwi.nl/oai/asset/21394/21394B.pdf&quot; id=&quot;link-id0x2aab62eb22f8&quot;&gt;Experiences with Virtuoso Cluster RDF Column Store&lt;/a&gt;. Linked Data Management 2014: 239-259&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This book chapter gives an in-depth look at the performance dynamics of Virtuoso scale out.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2013&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;P. A. Boncz, T. Neumann, and O. Erling. &lt;a href=&quot;http://oai.cwi.nl/oai/asset/21424/21424B.pdf&quot; id=&quot;link-id0x2aab621bc728&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;. Proceedings of the TPC Technology Conference on Performance Evaluation &amp;amp; Benchmarking TPCTC, 2013.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is a summary of all factors that make up analytics performance by those who know. The Virtuoso &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab61dceb68&quot;&gt;TPC-H blog series&lt;/a&gt; is a further development and commentary on these same truths.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2012&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling: &lt;a href=&quot;http://sites.computer.org/debull/A12mar/vicol.pdf&quot; id=&quot;link-id0x2aab61fac308&quot;&gt;Virtuoso, a Hybrid RDBMS/Graph Column Store&lt;/a&gt;. IEEE Data Eng. Bull. (DEBU) 35(1):3-8 (2012)&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces the Virtuoso column store architecture and design choices. One design is made to serve both random updates and lookups as well as the big scans where column stores traditionally excel. Examples are given from both TPC-H and the schema-less RDF world.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Minh-Duc Pham, Peter A. Boncz, Orri Erling: &lt;a href=&quot;http://oai.cwi.nl/oai/asset/19919/19919D.pdf&quot; id=&quot;link-id0x2aab617b0238&quot;&gt;S3G2: A Scalable Structure-Correlated Social Graph Generator&lt;/a&gt;. TPCTC 2012:156-172&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper presents the basis of the social network benchmarking technology later used in the LDBC benchmarks.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2011&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Christian Bizer, Peter A. Boncz, Michael L. Brodie, Orri Erling: &amp;quot;&lt;a href=&quot;http://www.sigmod.org/publications/sigmod-record/1112/pdfs/10.report.bizer.pdf&quot; id=&quot;link-id0x2aab616b2678&quot;&gt;The Meaningful Use of Big Data: Four Perspectives – Four Challenges&lt;/a&gt;.&amp;quot; SIGMOD Record (SIGMOD) 40(4):56-60 (2011)&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is an anthology of views by industry thought leaders on what semantics could or ought to contribute to the practice of data management.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2009&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw2.pdf&quot; id=&quot;link-id0x2aab62629058&quot;&gt;Faceted Views over Large-Scale Linked Data&lt;/a&gt;. LDOW 2009&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces anytime query answering as an enabling technology for open-ended querying of large data on public service end points. While not every query can be run to completion, partial results can most often be returned within a constrained time window.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.researchgate.net/publication/234196284_Virtuoso_RDF_Support_in_a_Native_RDBMS&quot; id=&quot;link-id0x2aab6150f208&quot;&gt;Virtuoso: RDF Support in a Native RDBMS&lt;/a&gt;. Semantic Web Information Management 2009:501-519&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is a general presentation of how a SQL engine needs to be adapted to serve a run-time typed and schema-less workload.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2008&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/RDFAndMapped_BI.pdf&quot; id=&quot;link-id0x2aab62b107d8&quot;&gt;Integrating Open Sources and Relational Data with SPARQL&lt;/a&gt;. ESWC 2008:838-842&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces the still challenging RDF-H benchmark, an RDF translation of the classic TPC-H. Running this over SPARQL to SQL mapping is considered.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2007&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://ceur-ws.org/Vol-301/Paper_5_Erling.pdf&quot; id=&quot;link-id0x2aab616f18a8&quot;&gt;RDF Support in the Virtuoso DBMS&lt;/a&gt;. CSSW 2007:59-68&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is an initial discussion of RDF support in Virtuoso. Most specifics are by now different but this can give a historical perspective.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-03T12:53:50.259637-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Virtuoso Science Library</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-06-03#1838</atom:id>
  <atom:published>2015-06-03T16:51:04Z</atom:published>
  <atom:content type="html">&lt;p&gt;There is a lot of scientific material on Virtuoso, but it has not been presented all together in any one place. So I am making here a compilation of the best resources with a paragraph of introduction on each. Some of these are project deliverables from projects under the EU FP7 programme; some are peer-reviewed publications.&lt;/p&gt; &lt;p&gt;For the future, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtuosoScienceLibrary&quot; id=&quot;link-id0x2aab62129648&quot;&gt;an updated version of this list&lt;/a&gt; may be found on the &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aab614e7508&quot;&gt;main Virtuoso site&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;European Project Deliverables&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://svn.aksw.org/projects/GeoKnow/Public/D2.6.1_Prototype_of_Built-in_Complex_Geo_Problem_Solving.pdf&quot; id=&quot;link-id0x2aab62a51908&quot;&gt;GeoKnow D 2.6.1&lt;/a&gt;: Graph Analytics in the DBMS&lt;/b&gt; (2015-01-05)&lt;/p&gt; &lt;p&gt;This introduces the idea of unbundling basic cluster DBMS functionality like cross partition joins and partitioned group by to form a graph processing framework collocated with the data.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://svn.aksw.org/projects/GeoKnow/Public/D2.4.1_Geospatial_Clustering.pdf&quot; id=&quot;link-id0x2aab61577e18&quot;&gt;GeoKnow D2.4.1&lt;/a&gt;: Geospatial Clustering and Characteristic Sets&lt;/b&gt; (2015-01-06)&lt;/p&gt; &lt;p&gt;This presents experimental results of structure-aware RDF applied to geospatial data. The regularly structured part of the data goes in tables; the rest is triples/quads. Furthermore, for the first time in the RDF space, physical storage location is correlated to properties of entities, in this case geo location, so that geospatially adjacent items are also likely adjacent in the physical data representation.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://lod2.eu/Deliverable/D2.1.5.html&quot; id=&quot;link-id0x2aab617997f8&quot;&gt;LOD2 D2.1.5&lt;/a&gt;: 500 billion triple BSBM&lt;/b&gt; (2014-08-18)&lt;/p&gt; &lt;p&gt;This presents experimental results on lookup and BI workloads on Virtuoso cluster with 12 nodes, for a total of 3T RAM and 192 cores. This also discusses bulk load, at up to 6M triples/s and specifics of query optimization in scale-out settings.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;a href=&quot;http://lod2.eu/Deliverable/D2.6.html&quot; id=&quot;link-id0x2aab629cf8c8&quot;&gt;LOD2 D2.6&lt;/a&gt;: Parallel Programming in SQL&lt;/b&gt; (2012-08-12)&lt;/p&gt; &lt;p&gt;This discusses ways of making SQL procedures partitioning-aware, so that one can, map-reduce style, send parallel chunks of computation to each partition of the data.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Publications&lt;/h2&gt; &lt;h3&gt;2015&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Minh-Duc, Pham, Linnea, P., Erling, O., and Boncz, P.A. &amp;quot;&lt;a href=&quot;http://homepages.cwi.nl/~duc/papers/emergentschema_www15.pdf&quot; id=&quot;link-id0x2aab61eb10a8&quot;&gt;Deriving an Emergent Relational Schema from RDF Data&lt;/a&gt;,&amp;quot; WWW, 2015.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper shows how RDF is in fact structured and how this structure can be reconstructed. This reconstruction then serves to create a physical schema, reintroducing all the benefits of physical design to the schema-last world. Experiments with Virtuoso show marked gains in query speed and data compactness.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2014&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Peter A. Boncz, Orri Erling, Minh-Duc Pham: &lt;a href=&quot;http://oai.cwi.nl/oai/asset/21394/21394B.pdf&quot; id=&quot;link-id0x2aab62eb22f8&quot;&gt;Experiences with Virtuoso Cluster RDF Column Store&lt;/a&gt;. Linked Data Management 2014: 239-259&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This book chapter gives an in-depth look at the performance dynamics of Virtuoso scale out.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2013&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;P. A. Boncz, T. Neumann, and O. Erling. &lt;a href=&quot;http://oai.cwi.nl/oai/asset/21424/21424B.pdf&quot; id=&quot;link-id0x2aab621bc728&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;. Proceedings of the TPC Technology Conference on Performance Evaluation &amp;amp; Benchmarking TPCTC, 2013.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is a summary of all factors that make up analytics performance by those who know. The Virtuoso &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab61dceb68&quot;&gt;TPC-H blog series&lt;/a&gt; is a further development and commentary on these same truths.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2012&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling: &lt;a href=&quot;http://sites.computer.org/debull/A12mar/vicol.pdf&quot; id=&quot;link-id0x2aab61fac308&quot;&gt;Virtuoso, a Hybrid RDBMS/Graph Column Store&lt;/a&gt;. IEEE Data Eng. Bull. (DEBU) 35(1):3-8 (2012)&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces the Virtuoso column store architecture and design choices. One design is made to serve both random updates and lookups as well as the big scans where column stores traditionally excel. Examples are given from both TPC-H and the schema-less RDF world.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Minh-Duc Pham, Peter A. Boncz, Orri Erling: &lt;a href=&quot;http://oai.cwi.nl/oai/asset/19919/19919D.pdf&quot; id=&quot;link-id0x2aab617b0238&quot;&gt;S3G2: A Scalable Structure-Correlated Social Graph Generator&lt;/a&gt;. TPCTC 2012:156-172&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper presents the basis of the social network benchmarking technology later used in the LDBC benchmarks.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2011&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Christian Bizer, Peter A. Boncz, Michael L. Brodie, Orri Erling: &amp;quot;&lt;a href=&quot;http://www.sigmod.org/publications/sigmod-record/1112/pdfs/10.report.bizer.pdf&quot; id=&quot;link-id0x2aab616b2678&quot;&gt;The Meaningful Use of Big Data: Four Perspectives – Four Challenges&lt;/a&gt;.&amp;quot; SIGMOD Record (SIGMOD) 40(4):56-60 (2011)&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is an anthology of views by industry thought leaders on what semantics could or ought to contribute to the practice of data management.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2009&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw2.pdf&quot; id=&quot;link-id0x2aab62629058&quot;&gt;Faceted Views over Large-Scale Linked Data&lt;/a&gt;. LDOW 2009&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces anytime query answering as an enabling technology for open-ended querying of large data on public service end points. While not every query can be run to completion, partial results can most often be returned within a constrained time window.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.researchgate.net/publication/234196284_Virtuoso_RDF_Support_in_a_Native_RDBMS&quot; id=&quot;link-id0x2aab6150f208&quot;&gt;Virtuoso: RDF Support in a Native RDBMS&lt;/a&gt;. Semantic Web Information Management 2009:501-519&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is a general presentation of how a SQL engine needs to be adapted to serve a run-time typed and schema-less workload.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2008&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/RDFAndMapped_BI.pdf&quot; id=&quot;link-id0x2aab62b107d8&quot;&gt;Integrating Open Sources and Relational Data with SPARQL&lt;/a&gt;. ESWC 2008:838-842&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This paper introduces the still challenging RDF-H benchmark, an RDF translation of the classic TPC-H. Running this over SPARQL to SQL mapping is considered.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;2007&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Orri Erling, Ivan Mikhailov: &lt;a href=&quot;http://ceur-ws.org/Vol-301/Paper_5_Erling.pdf&quot; id=&quot;link-id0x2aab616f18a8&quot;&gt;RDF Support in the Virtuoso DBMS&lt;/a&gt;. CSSW 2007:59-68&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This is an initial discussion of RDF support in Virtuoso. Most specifics are by now different but this can give a historical perspective.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-03T12:53:36.943110-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 2: Modeling Choices</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-05-14#1837</atom:id>
  <atom:published>2015-05-14T15:37:59Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://ldbcouncil.org/benchmarks/snb&quot; id=&quot;link-id0x2aab76e5ac28&quot;&gt;SNB Interactive&lt;/a&gt; is the wild frontier, with very few rules. This is necessary, among other reasons, because there is no standard property graph data model, and because the contestants support a broad mix of programming models, ranging from in-process APIs to declarative query.&lt;/p&gt; &lt;p&gt;In the case of &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab76e5af48&quot;&gt;Virtuoso&lt;/a&gt;, we have played with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab76e5b088&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aab77e969e8&quot;&gt;SPARQL&lt;/a&gt; implementations. For a fixed schema and well known workload, SQL will always win. The reason is that SQL allows materialization of multi-part indices and data orderings that make sense for the application. In other words, there is transparency into physical design. An RDF/SPARQL-based application may also have physical design by means of structure-aware storage, but this is more complex and here we are just concerned with speed and having things work precisely as we intend.&lt;/p&gt; &lt;h2&gt;Schema Design&lt;/h2&gt; &lt;p&gt;SNB has a regular schema described by a &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot; id=&quot;link-id0x2aab77e96da8&quot;&gt;UML&lt;/a&gt; diagram. This has a number of relationships, of which some have attributes. There are no heterogenous sets, i.e., no need for run-time typed attributes or graph edges with the same label but heterogenous end-points. Translation into SQL or SPARQL is straightforward. Edges with attributes (e.g., the &lt;code&gt;&lt;a href=&quot;http://xmlns.com/foaf/spec/#term_knows&quot; id=&quot;link-id0x2aab77e97098&quot;&gt;foaf:knows&lt;/a&gt;&lt;/code&gt; relation between people) would end up represented as a subject with the end points and the effective date as properties. The relational implementation has a two-part primary key and the effective date as a dependent column. A native property graph database would use an edge with an extra property for this, as such are typically supported.&lt;/p&gt; &lt;p&gt;The only table-level choice has to do with whether &lt;code&gt;posts&lt;/code&gt; and &lt;code&gt;comments&lt;/code&gt; are kept in the same or different data structures. The Virtuoso schema uses a single table for both, with nullable columns for the properties that occur only in one. This makes the queries more concise. There are cases where only non-reply &lt;code&gt;posts&lt;/code&gt; of a given &lt;code&gt;author&lt;/code&gt; are accessed. This is supported by having two &lt;code&gt;author&lt;/code&gt; foreign key columns each with its own index. There is a single nullable foreign key from the reply to the post/comment being replied to.&lt;/p&gt; &lt;p&gt;The workload has some frequent access paths that need to be supported by index. Some queries reward placing extra columns in indices. For example, a common pattern is accessing the most recent posts of an author or a group of authors. There, having a composite key of &lt;code&gt;ps_creatorid, ps_creationdate, ps_postid&lt;/code&gt; pays off since the &lt;code&gt;top-k&lt;/code&gt; on &lt;code&gt;creationdate&lt;/code&gt; can be pushed down into the index without needing a reference to the table.&lt;/p&gt; &lt;p&gt;The implementation is free to choose data types for attributes, particularly &lt;code&gt;datetimes&lt;/code&gt;. The Virtuoso implementation adopts the practice of the &lt;a href=&quot;http://dbpedia.org/resource/DEX_(Graph_database)&quot; id=&quot;link-id0x2aab77e97d88&quot;&gt;Sparksee&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Neo4j&quot; id=&quot;link-id0x2aab77e97ed8&quot;&gt;Neo4j&lt;/a&gt; implementations and represents this is a count of milliseconds since epoch. This is less confusing, faster to compare, and more compact than a native datetime datatype that may or may not have timezones, etc. Using a built-in datetime seems to be nearly always a bad idea. A dimension table or a number for a time dimension avoids the ambiguities of a calendar or at least makes these explicit.&lt;/p&gt; &lt;p&gt;The benchmark allows procedurally maintained materializations of intermediate results for use by queries as long as these are maintained transaction-by-transaction. For example, each person could have the 20 newest posts by their immediate contacts precomputed. This would reduce Q2 &amp;quot;top of the wall&amp;quot; to a single lookup. This does not however appear to be worthwhile. The Virtuoso implementation does do one such materialization for Q14: A connection weight is calculated for every pair of persons that know each other. This is related to the count of replies by either to content generated by the other. If there does not exist a single reply in either direction, the weight is taken to be 0. This weight is precomputed after bulk load and subsequently maintained each time a reply is added. The table for this is the only row-wise structure in the schema and represents a half-matrix of connected people, i.e., &lt;code&gt;person1, person2 -&amp;gt; weight&lt;/code&gt;. &lt;code&gt;Person1&lt;/code&gt; is by convention the one with the smaller &lt;code&gt;p_personid&lt;/code&gt;. Note that comparing IDs in this way is useful but not normally supported by SPARQL/RDF systems. SPARQL would end up comparing strings of URIs with disastrous performance implications unless an implementation-specific trick were used.&lt;/p&gt; &lt;p&gt;In the next installment, we will analyze an actual run.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0x2aab62d2ef08&quot;&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SNB Interactive, Part 2: Modeling Choices&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1841&quot; id=&quot;link-id0x2aab62df6248&quot;&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:36:52.327195-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 2: Modeling Choices</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-05-14#1836</atom:id>
  <atom:published>2015-05-14T15:37:50Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://ldbcouncil.org/benchmarks/snb&quot; id=&quot;link-id0x2aab76e5ac28&quot;&gt;SNB Interactive&lt;/a&gt; is the wild frontier, with very few rules. This is necessary, among other reasons, because there is no standard property graph data model, and because the contestants support a broad mix of programming models, ranging from in-process APIs to declarative query.&lt;/p&gt; &lt;p&gt;In the case of &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab76e5af48&quot;&gt;Virtuoso&lt;/a&gt;, we have played with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab76e5b088&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aab77e969e8&quot;&gt;SPARQL&lt;/a&gt; implementations. For a fixed schema and well known workload, SQL will always win. The reason is that SQL allows materialization of multi-part indices and data orderings that make sense for the application. In other words, there is transparency into physical design. An RDF/SPARQL-based application may also have physical design by means of structure-aware storage, but this is more complex and here we are just concerned with speed and having things work precisely as we intend.&lt;/p&gt; &lt;h2&gt;Schema Design&lt;/h2&gt; &lt;p&gt;SNB has a regular schema described by a &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot; id=&quot;link-id0x2aab77e96da8&quot;&gt;UML&lt;/a&gt; diagram. This has a number of relationships, of which some have attributes. There are no heterogenous sets, i.e., no need for run-time typed attributes or graph edges with the same label but heterogenous end-points. Translation into SQL or SPARQL is straightforward. Edges with attributes (e.g., the &lt;code&gt;&lt;a href=&quot;http://xmlns.com/foaf/spec/#term_knows&quot; id=&quot;link-id0x2aab77e97098&quot;&gt;foaf:knows&lt;/a&gt;&lt;/code&gt; relation between people) would end up represented as a subject with the end points and the effective date as properties. The relational implementation has a two-part primary key and the effective date as a dependent column. A native property graph database would use an edge with an extra property for this, as such are typically supported.&lt;/p&gt; &lt;p&gt;The only table-level choice has to do with whether &lt;code&gt;posts&lt;/code&gt; and &lt;code&gt;comments&lt;/code&gt; are kept in the same or different data structures. The Virtuoso schema uses a single table for both, with nullable columns for the properties that occur only in one. This makes the queries more concise. There are cases where only non-reply &lt;code&gt;posts&lt;/code&gt; of a given &lt;code&gt;author&lt;/code&gt; are accessed. This is supported by having two &lt;code&gt;author&lt;/code&gt; foreign key columns each with its own index. There is a single nullable foreign key from the reply to the post/comment being replied to.&lt;/p&gt; &lt;p&gt;The workload has some frequent access paths that need to be supported by index. Some queries reward placing extra columns in indices. For example, a common pattern is accessing the most recent posts of an author or a group of authors. There, having a composite key of &lt;code&gt;ps_creatorid, ps_creationdate, ps_postid&lt;/code&gt; pays off since the &lt;code&gt;top-k&lt;/code&gt; on &lt;code&gt;creationdate&lt;/code&gt; can be pushed down into the index without needing a reference to the table.&lt;/p&gt; &lt;p&gt;The implementation is free to choose data types for attributes, particularly &lt;code&gt;datetimes&lt;/code&gt;. The Virtuoso implementation adopts the practice of the &lt;a href=&quot;http://dbpedia.org/resource/DEX_(Graph_database)&quot; id=&quot;link-id0x2aab77e97d88&quot;&gt;Sparksee&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Neo4j&quot; id=&quot;link-id0x2aab77e97ed8&quot;&gt;Neo4j&lt;/a&gt; implementations and represents this is a count of milliseconds since epoch. This is less confusing, faster to compare, and more compact than a native datetime datatype that may or may not have timezones, etc. Using a built-in datetime seems to be nearly always a bad idea. A dimension table or a number for a time dimension avoids the ambiguities of a calendar or at least makes these explicit.&lt;/p&gt; &lt;p&gt;The benchmark allows procedurally maintained materializations of intermediate results for use by queries as long as these are maintained transaction-by-transaction. For example, each person could have the 20 newest posts by their immediate contacts precomputed. This would reduce Q2 &amp;quot;top of the wall&amp;quot; to a single lookup. This does not however appear to be worthwhile. The Virtuoso implementation does do one such materialization for Q14: A connection weight is calculated for every pair of persons that know each other. This is related to the count of replies by either to content generated by the other. If there does not exist a single reply in either direction, the weight is taken to be 0. This weight is precomputed after bulk load and subsequently maintained each time a reply is added. The table for this is the only row-wise structure in the schema and represents a half-matrix of connected people, i.e., &lt;code&gt;person1, person2 -&amp;gt; weight&lt;/code&gt;. &lt;code&gt;Person1&lt;/code&gt; is by convention the one with the smaller &lt;code&gt;p_personid&lt;/code&gt;. Note that comparing IDs in this way is useful but not normally supported by SPARQL/RDF systems. SPARQL would end up comparing strings of URIs with disastrous performance implications unless an implementation-specific trick were used.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1841&quot; id=&quot;link-id0x2aab6315d2b8&quot;&gt;the next installment&lt;/a&gt;, we will analyze an actual run.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1834&quot; id=&quot;link-id0x2aab62d2ef08&quot;&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SNB Interactive, Part 2: Modeling Choices&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1841&quot; id=&quot;link-id0x2aab62df6248&quot;&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:26:49.994102-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 1: What is SNB Interactive Really About?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-05-14#1835</atom:id>
  <atom:published>2015-05-14T15:37:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is the first in a series of blog posts analyzing the Interactive workload of the &lt;a href=&quot;http://ldbcouncil.org/benchmarks/snb&quot; id=&quot;link-id0x2aab77caacf8&quot;&gt;LDBC Social Network Benchmark&lt;/a&gt;. This is written from the dual perspective of participating in the benchmark design, and of building the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab76f21928&quot;&gt;OpenLink Virtuoso&lt;/a&gt; implementation of same.&lt;/p&gt; &lt;p&gt;With two implementations of SNB Interactive at four different scales, we can take a first look at what the benchmark is really about. The hallmark of a benchmark implementation is that its performance characteristics are understood; even if these do not represent the maximum of the attainable, there are no glaring mistakes; and the implementation represents a reasonable best effort by those who ought to know such, namely the system vendors.&lt;/p&gt; &lt;p&gt;The essence of a benchmark is a set of trick questions or &amp;quot;choke points,&amp;quot; as &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab77ca9c88&quot;&gt;LDBC&lt;/a&gt; calls them. A number of these were planned from the start. It is then the role of experience to tell whether addressing these is really the key to winning the race. Unforeseen ones will also surface.&lt;/p&gt; &lt;p&gt;So far, we see that SNB confronts the implementor with choices in the following areas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data model —&lt;/b&gt; Tabular relational (commonly known as SQL), graph relational (including RDF), property graph, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Physical storage model —&lt;/b&gt; Row-wise vs. column-wise, for instance.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ordering of materialized data —&lt;/b&gt; Sorted projections, composite keys, replicating columns in auxiliary data structures, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Persistence of intermediate results — &lt;/b&gt; Materialized views, triggers, precomputed temporary tables, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Query optimization —&lt;/b&gt; join order/type, interesting physical data orderings, late projection, top k, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Parameters vs. literals —&lt;/b&gt; Sometimes different parameter values result in different optimal query plans.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Predictable, uniform latency —&lt;/b&gt; Measurement rules stipulate the the &lt;a href=&quot;http://dbpedia.org/resource/System_under_test&quot; id=&quot;link-id0x2aab77de7a58&quot;&gt;SUT (system under test)&lt;/a&gt; must not fall behind the simulated workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Durability —&lt;/b&gt; How to make data durable while maintaining steady throughput, e.g., logging, checkpointing, etc.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In the process of making a benchmark implementation, one naturally encounters questions about the validity, reasonability, and rationale of the benchmark definition itself. Additionally, even though the benchmark might not directly measure certain aspects of a system, making an implementation will take a system past its usual envelope and highlight some operational aspects.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data generation —&lt;/b&gt; Generating a mid-size dataset takes time, e.g., 8 hours for 300G. In a cloud situation, keeping the dataset in &lt;a href=&quot;http://dbpedia.org/resource/Amazon_S3&quot; id=&quot;link-id0x2aab77c11b18&quot;&gt;S3&lt;/a&gt; or similar is necessary; re-generating every time is not an option.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Query mix —&lt;/b&gt; Are the relative frequencies of the operations reasonable? What bias does this introduce?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Uniformity of parameters —&lt;/b&gt; Due to non-uniform data distributions in the dataset, there is easily a 100x difference between &amp;quot;fast&amp;quot; and &amp;quot;slow&amp;quot; cases of a single query template. How long does one need to run to balance these fluctuations?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Working set —&lt;/b&gt; Experience shows that there is a large difference between almost-warm and steady-state of working set. This can be a factor of 1.5 in throughput.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reasonability of latency constraints —&lt;/b&gt; In the present case, a qualifying run must have no more than 5% of all query executions starting over 1 second late. Each execution is scheduled beforehand and done at the intended time. If the SUT does not keep up, it will have all available threads busy and must finish some work before accepting new work, so some queries will start late. Is this a good criterion for measuring consistency of response time? There are some obvious possibilities for abuse.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ease of benchmark implementation/execution —&lt;/b&gt; Perfection is open-ended and optimization possibilities infinite, albeit with diminishing returns. Still, getting started should not be too hard. Since systems will be highly diverse, testing that these in fact do the same thing is important. The SNB validation suite is good for this and, given publicly available reference implementations, the effort of getting started is not unreasonable.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ease of adjustment —&lt;/b&gt; Since a qualifying run must meet latency constraints while going as fast as possible, setting the performance target involves trial and error. Does the tooling make this easy?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reasonability of durability rule —&lt;/b&gt; Right now, one is not required to do checkpoints but must report the time to roll forward from the last checkpoint or initial state. Inspiring vendors to build faster recovery is certainly good, but we are not through with all the implications. What about redundant clusters?&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The following posts will look at the above in light of actual experience.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1836&quot; id=&quot;link-id0x2aab6357ab98&quot;&gt; SNB Interactive, Part 2: Modeling Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1841&quot; id=&quot;link-id0x2aab6357ada8&quot;&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:36:14.812596-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SNB Interactive, Part 1: What is SNB Interactive Really About?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-05-14#1834</atom:id>
  <atom:published>2015-05-14T15:37:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is the first in a series of blog posts analyzing the Interactive workload of the &lt;a href=&quot;http://ldbcouncil.org/benchmarks/snb&quot; id=&quot;link-id0x2aab77caacf8&quot;&gt;LDBC Social Network Benchmark&lt;/a&gt;. This is written from the dual perspective of participating in the benchmark design, and of building the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab76f21928&quot;&gt;OpenLink Virtuoso&lt;/a&gt; implementation of same.&lt;/p&gt; &lt;p&gt;With two implementations of SNB Interactive at four different scales, we can take a first look at what the benchmark is really about. The hallmark of a benchmark implementation is that its performance characteristics are understood; even if these do not represent the maximum of the attainable, there are no glaring mistakes; and the implementation represents a reasonable best effort by those who ought to know such, namely the system vendors.&lt;/p&gt; &lt;p&gt;The essence of a benchmark is a set of trick questions or &amp;quot;choke points,&amp;quot; as &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab77ca9c88&quot;&gt;LDBC&lt;/a&gt; calls them. A number of these were planned from the start. It is then the role of experience to tell whether addressing these is really the key to winning the race. Unforeseen ones will also surface.&lt;/p&gt; &lt;p&gt;So far, we see that SNB confronts the implementor with choices in the following areas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data model —&lt;/b&gt; Tabular relational (commonly known as SQL), graph relational (including RDF), property graph, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Physical storage model —&lt;/b&gt; Row-wise vs. column-wise, for instance.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ordering of materialized data —&lt;/b&gt; Sorted projections, composite keys, replicating columns in auxiliary data structures, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Persistence of intermediate results — &lt;/b&gt; Materialized views, triggers, precomputed temporary tables, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Query optimization —&lt;/b&gt; join order/type, interesting physical data orderings, late projection, top k, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Parameters vs. literals —&lt;/b&gt; Sometimes different parameter values result in different optimal query plans.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Predictable, uniform latency —&lt;/b&gt; Measurement rules stipulate the the &lt;a href=&quot;http://dbpedia.org/resource/System_under_test&quot; id=&quot;link-id0x2aab77de7a58&quot;&gt;SUT (system under test)&lt;/a&gt; must not fall behind the simulated workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Durability —&lt;/b&gt; How to make data durable while maintaining steady throughput, e.g., logging, checkpointing, etc.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In the process of making a benchmark implementation, one naturally encounters questions about the validity, reasonability, and rationale of the benchmark definition itself. Additionally, even though the benchmark might not directly measure certain aspects of a system, making an implementation will take a system past its usual envelope and highlight some operational aspects.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data generation —&lt;/b&gt; Generating a mid-size dataset takes time, e.g., 8 hours for 300G. In a cloud situation, keeping the dataset in &lt;a href=&quot;http://dbpedia.org/resource/Amazon_S3&quot; id=&quot;link-id0x2aab77c11b18&quot;&gt;S3&lt;/a&gt; or similar is necessary; re-generating every time is not an option.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Query mix —&lt;/b&gt; Are the relative frequencies of the operations reasonable? What bias does this introduce?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Uniformity of parameters —&lt;/b&gt; Due to non-uniform data distributions in the dataset, there is easily a 100x difference between &amp;quot;fast&amp;quot; and &amp;quot;slow&amp;quot; cases of a single query template. How long does one need to run to balance these fluctuations?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Working set —&lt;/b&gt; Experience shows that there is a large difference between almost-warm and steady-state of working set. This can be a factor of 1.5 in throughput.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reasonability of latency constraints —&lt;/b&gt; In the present case, a qualifying run must have no more than 5% of all query executions starting over 1 second late. Each execution is scheduled beforehand and done at the intended time. If the SUT does not keep up, it will have all available threads busy and must finish some work before accepting new work, so some queries will start late. Is this a good criterion for measuring consistency of response time? There are some obvious possibilities for abuse.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ease of benchmark implementation/execution —&lt;/b&gt; Perfection is open-ended and optimization possibilities infinite, albeit with diminishing returns. Still, getting started should not be too hard. Since systems will be highly diverse, testing that these in fact do the same thing is important. The SNB validation suite is good for this and, given publicly available reference implementations, the effort of getting started is not unreasonable.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Ease of adjustment —&lt;/b&gt; Since a qualifying run must meet latency constraints while going as fast as possible, setting the performance target involves trial and error. Does the tooling make this easy?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reasonability of durability rule —&lt;/b&gt; Right now, one is not required to do checkpoints but must report the time to roll forward from the last checkpoint or initial state. Inspiring vendors to build faster recovery is certainly good, but we are not through with all the implications. What about redundant clusters?&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The following posts will look at the above in light of actual experience.&lt;/p&gt; &lt;h3&gt; SNB Interactive Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; SNB Interactive, Part 1: What is SNB Interactive Really About?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1836&quot; id=&quot;link-id0x2aab6357ab98&quot;&gt; SNB Interactive, Part 2: Modeling Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1841&quot; id=&quot;link-id0x2aab6357ada8&quot;&gt; SNB Interactive, Part 3: Choke Points and Initial Run on Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-09T11:30:09.916724-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Usage Report, January 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2015-01-07#1833</atom:id>
  <atom:published>2015-01-07T20:12:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We&amp;#39;ve just published the latest &lt;a href=&quot;http://bit.ly/1DymR8p&quot; id=&quot;link-id0x2aab663027d8&quot;&gt;DBpedia Usage Report&lt;/a&gt;, covering v3.3 (released July, 2009) to v3.9 (released September, 2013); v3.10 (sometimes called &amp;quot;DBpedia 2014&amp;quot;; released September, 2014) will be included in the next report.&lt;/p&gt; &lt;p&gt;We think you&amp;#39;ll find some interesting details in the statistics. There are also some important notes about Virtuoso configuration options and other sneaky technical issues that can surprise you (as they did us!) when exposing an ad-hoc query server to the world.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-11T12:59:11.440347-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Usage Report, January 2015</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2015-01-07#1832</atom:id>
  <atom:published>2015-01-07T20:12:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;We&amp;#39;ve just published the latest &lt;a href=&quot;http://bit.ly/1DymR8p&quot; id=&quot;link-id0x2aab663027d8&quot;&gt;DBpedia Usage Report&lt;/a&gt;, covering v3.3 (released July, 2009) to v3.9 (released September, 2013); v3.10 (sometimes called &amp;quot;DBpedia 2014&amp;quot;; released September, 2014) will be included in the next report.&lt;/p&gt; &lt;p&gt;We think you&amp;#39;ll find some interesting details in the statistics. There are also some important notes about Virtuoso configuration options and other sneaky technical issues that can surprise you (as they did us!) when exposing an ad-hoc query server to the world.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-11T12:59:03.643766-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC: Making Semantic Publishing Execution Rules</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-11-13#1831</atom:id>
  <atom:published>2014-11-13T21:19:42Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab2c2b02f8&quot;&gt;LDBC&lt;/a&gt; &lt;a href=&quot;http://ldbcouncil.org/developer/spb&quot; id=&quot;link-id0x2aab2c2b0438&quot;&gt;SPB (Semantic Publishing Benchmark)&lt;/a&gt; is based on the BBC Linked Data use case. Thus the data modeling and transaction mix reflect the BBC&amp;#39;s actual utilization of RDF. But a benchmark is not only a condensation of current best practice. The BBC Linked Data is deployed on &lt;a href=&quot;http://www.ontotext.com/products/ontotext-graphdb-owlim/&quot; id=&quot;link-id0x2aab2c2b0698&quot;&gt;Ontotext GraphDB&lt;/a&gt; (formerly known as OWLIM).&lt;/p&gt; &lt;p&gt;So, in SPB we wanted to address substantially more complex queries than the lookups than the BBC linked data deployment primarily serves. Diverse dataset summaries, timelines, and faceted search qualified by keywords and/or geography, are examples of online user experience that SPB needs to cover.&lt;/p&gt; &lt;p&gt;SPB is not an analytical workload, per se, but we still find that the queries fall broadly in two categories: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Some queries are centered on a particular search or entity. The data touched by the query size does not grow at the same rate as the dataset. &lt;/li&gt; &lt;li&gt;Some queries cover whole cross sections of the dataset, e.g., find the most popular tags across the whole database.&lt;/li&gt; &lt;/ul&gt; These different classes of questions need to be separated in a metric, otherwise the short lookup dominates at small scales, and the large query at large scales. &lt;p&gt;Another guiding factor of SPB was the BBC&amp;#39;s and others&amp;#39; express wish to cover operational aspects such as online backups, replication, and fail-over in a benchmark. True, most online installations have to deal with these, yet these things are as good as absent from present benchmark practice. We will look at these aspects in a different article; for now, I will just discuss the matter of workload mix and metric.&lt;/p&gt; &lt;p&gt;Normally, the lookup and analytics workloads are divided into different benchmarks. Here, we will try something different. There are three things the benchmark does:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Updates&lt;/b&gt; - These sometimes insert a graph, sometimes delete and re-insert the same graph, sometimes just delete a graph. These are logarithmic to data size.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Short queries&lt;/b&gt; - These are lookups that most often touch on recent data and can drive page impressions. These are roughly logarithmic to data scale.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Analytics&lt;/b&gt; - These cover a large fraction of the dataset and are roughly linear to data size.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;A test sponsor can decide on the query mix within certain bounds. A qualifying run must sustain a minimum, scale-dependent update throughput and must execute a scale-dependent number of analytical query mixes, or run for a scale-dependent duration. The minimum update rate, the minimum number of analytics mixes and the minimum duration all grow logarithmically to data size.&lt;/p&gt; &lt;p&gt;Within these limits, the test sponsor can decide how to mix the workloads. Publishing several results emphasizing different aspects is also possible. A given system may be especially good at one aspect, leading the test sponsor to accentuate this.&lt;/p&gt; &lt;p&gt;The benchmark has been developed and tested at small scales, between 50 and 150M triples. Next we need to see how it actually scales. There we expect to see how the two query sets behave differently. One effect that we see right away when loading data is that creating the full text index on the literals is in fact the longest running part. For a SF 32 ( 1.6 billion triples) SPB database we have the following space consumption figures:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;46,886 MB of RDF literal text&lt;/li&gt; &lt;li&gt;23,924 MB of full text index for RDF literals&lt;/li&gt; &lt;li&gt;23,598 MB of URI strings&lt;/li&gt; &lt;li&gt;21,981 MB of quads, stored column-wise with default index scheme&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Clearly, applying column-wise compression to the strings is the best move for increasing scalability. The literals are individually short, so literal per literal compression will do little or nothing but applying this by the column is known to get a 2x size reduction with Google Snappy.&lt;/p&gt; &lt;p&gt;The full text index does not get much from column store techniques, as it already consists of words followed by space efficient lists of word positions. The above numbers are measured with Virtuoso column store, with quads column-wise and the rest row-wise. Each number includes the table(s) and any extra indices associated to them.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s now look at a full run at unit scale, i.e., 50M triples.&lt;/p&gt; &lt;p&gt;The run rules stipulate a minimum of 7 updates per second. The updates are comparatively fast, so we set the update rate to 70 updates per second. This is seen not to take too much CPU. We run 2 threads of updates, 20 of short queries, and 2 of long queries. The minimum run time for the unit scale is 10 minutes, so we do 10 analytical mixes, as this is expected to take a little over 10 minutes. The run stops by itself when the last of the analytical mixes finishes.&lt;/p&gt; &lt;p&gt;The interactive driver reports:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Seconds run : 2,144 Editorial: 2 agents 68,164 inserts (avg : 46 ms, min : 5 ms, max : 3002 ms) 8,440 updates (avg : 72 ms, min : 15 ms, max : 2471 ms) 8,539 deletes (avg : 37 ms, min : 4 ms, max : 2531 ms) 85,143 operations (68,164 CW Inserts (98 errors), 8,440 CW Updates ( 0 errors), 8,539 CW Deletions ( 0 errors)) 39.7122 average operations per second Aggregation: 20 agents 4120 Q1 queries (avg : 789 ms, min : 197 ms, max : 6,767 ms, 0 errors) 4121 Q2 queries (avg : 85 ms, min : 26 ms, max : 3,058 ms, 0 errors) 4124 Q3 queries (avg : 67 ms, min : 5 ms, max : 3,031 ms, 0 errors) 4118 Q5 queries (avg : 354 ms, min : 3 ms, max : 8,172 ms, 0 errors) 4117 Q8 queries (avg : 975 ms, min : 25 ms, max : 7,368 ms, 0 errors) 4119 Q11 queries (avg : 221 ms, min : 75 ms, max : 3,129 ms, 0 errors) 4122 Q12 queries (avg : 131 ms, min : 45 ms, max : 1,130 ms, 0 errors) 4115 Q17 queries (avg : 5,321 ms, min : 35 ms, max : 13,144 ms, 0 errors) 4119 Q18 queries (avg : 987 ms, min : 138 ms, max : 6,738 ms, 0 errors) 4121 Q24 queries (avg : 917 ms, min : 33 ms, max : 3,653 ms, 0 errors) 4122 Q25 queries (avg : 451 ms, min : 70 ms, max : 3,695 ms, 0 errors) 22.5239 average queries per second. Pool 0, queries [ Q1 Q2 Q3 Q5 Q8 Q11 Q12 Q17 Q18 Q24 Q25 ] 45,318 total retrieval queries (0 timed-out) 22.5239 average queries per second &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The analytical driver reports:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Aggregation: 2 agents 14 Q4 queries (avg : 9,984 ms, min : 4,832 ms, max : 17,957 ms, 0 errors) 12 Q6 queries (avg : 4,173 ms, min : 46 ms, max : 7,843 ms, 0 errors) 13 Q7 queries (avg : 1,855 ms, min : 1,295 ms, max : 2,415 ms, 0 errors) 13 Q9 queries (avg : 561 ms, min : 446 ms, max : 662 ms, 0 errors) 14 Q10 queries (avg : 2,641 ms, min : 1,652 ms, max : 4,238 ms, 0 errors) 12 Q13 queries (avg : 595 ms, min : 373 ms, max : 1,167 ms, 0 errors) 12 Q14 queries (avg : 65,362 ms, min : 6,127 ms, max : 136,346 ms, 2 errors) 13 Q15 queries (avg : 45,737 ms, min : 12,698 ms, max : 59,935 ms, 0 errors) 13 Q16 queries (avg : 30,939 ms, min : 10,224 ms, max : 38,161 ms, 0 errors) 13 Q19 queries (avg : 310 ms, min : 26 ms, max : 1,733 ms, 0 errors) 12 Q20 queries (avg : 13,821 ms, min : 11,092 ms, max : 15,435 ms, 0 errors) 13 Q21 queries (avg : 36,611 ms, min : 14,164 ms, max : 70,954 ms, 0 errors) 13 Q22 queries (avg : 42,048 ms, min : 7,106 ms, max : 74,296 ms, 0 errors) 13 Q23 queries (avg : 48,474 ms, min : 18,574 ms, max : 93,656 ms, 0 errors) 0.0862 average queries per second. Pool 0, queries [ Q4 Q6 Q7 Q9 Q10 Q13 Q14 Q15 Q16 Q19 Q20 Q21 Q22 Q23 ] 180 total retrieval queries (2 timed-out) 0.0862 average queries per second &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The metric would be 22.52 qi/s , 310 qa/h, 39.7 u/s @ 50Mt (SF 1)&lt;/p&gt; &lt;p&gt;The SUT is dual Xeon E5-2630, all in memory. The platform utilization is steadily above 2000% CPU (over 20/24 hardware threads busy on the DBMS). The DBMS is Virtuoso Open Source (&lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aab2c370168&quot;&gt;v7fasttrack at github.com&lt;/a&gt;, &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aab2c370308&quot;&gt;feature/analytics&lt;/a&gt; branch).&lt;/p&gt; &lt;p&gt;The minimum update rate of 7/s was sustained, but fell short of the target of 70/s. In this run, most demand was put on the interactive queries. Different thread allocations would give different ratios of the metric components. The analytics mix, for example, is about 3x faster without other concurrent activity.&lt;/p&gt; &lt;p&gt;Is this good or bad? I would say that this is possible but better can certainly be accomplished.&lt;/p&gt; &lt;p&gt;The initial observation is that Q17 is the worst of the interactive lot. 3x better is easily accomplished by avoiding a basic stupidity. The query does the evil deed of checking for a substring in a URI. This is done in the wrong place and accounts for most of the time. The query is meant to test geo retrieval but ends up doing something quite different. Optimizing this right would by itself almost double the interactive score. There are some timeouts in the analytical run, which as such disqualifies the run. This is not a fully compliant result, but is close enough to give an idea of the dynamics. So we see that the experiment is definitely feasible, is reasonably defined, and that the dynamics seen make sense.&lt;/p&gt; &lt;p&gt;As an initial comment of the workload mix, I&amp;#39;d say that interactive should have a few more very short point-lookups, to stress compilation times and give a higher absolute score of queries per second.&lt;/p&gt; &lt;p&gt;Adjustments to the mix will depend on what we find out about scaling. As with SNB, it is likely that the workload will shift a little so this result might not be comparable with future ones.&lt;/p&gt; &lt;p&gt;In the next SPB article, we will look closer at performance dynamics and choke points and will have an initial impression on scaling the workload.&lt;/p&gt;</atom:content>
  <atom:updated>2014-11-13T16:19:42.399180-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC: Creating a Metric for SNB</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-11-13#1830</atom:id>
  <atom:published>2014-11-13T21:09:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the &lt;a href=&quot;http://ldbcouncil.org/blog/making-it-interactive&quot; id=&quot;link-id0x2aaad4d40f58&quot;&gt;&lt;i&gt;Making It Interactive&lt;/i&gt; post on the LDBC blog&lt;/a&gt;, we were talking about composing an interactive &lt;a href=&quot;http://ldbcouncil.org/developer/snb&quot; id=&quot;link-id0x2aaad4d410a8&quot;&gt;Social Network Benchmark (SNB)&lt;/a&gt; metric. Now we will look at what this looks like in practice.&lt;/p&gt; &lt;p&gt;A benchmark is known by its primary metric. An actual benchmark implementation may deal with endless complexity but the whole point of the exercise is to reduce this all to an extremely compact form, optimally a number or two.&lt;/p&gt; &lt;p&gt;For SNB, we suggest clicks per second Interactive at scale (cpsI@ so many GB) as the primary metric. To each scale of the dataset corresponds a rate of update in the dataset&amp;#39;s timeline (simulation time). When running the benchmark, the events in simulation time are transposed to a timeline in real time.&lt;/p&gt; &lt;p&gt;Another way of expressing the metric is therefore acceleration factor at scale. In this example, we run a 300 GB database at an acceleration of 1.64; i.e., in the present example, we did 97 minutes of simulation time in 58 minutes of real time.&lt;/p&gt; &lt;p&gt;Another key component of a benchmark is the full disclosure report (FDR). This is expected to enable any interested party to reproduce the experiment.&lt;/p&gt; &lt;p&gt;The system under test (SUT) is Virtuoso running an SQL implementation of the workload at 300 GB (SF = 300). This run gives an idea of what an official report will look like but is not one yet. The implementation differs from the present specification in the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;The SNB test driver is not used. Instead, the workload is read from the file system by stored procedures on the SUT. This is done to circumvent latencies in update scheduling in the test driver which would result in the SUT not reaching full platform utilization.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The workload is extended by 2 short lookups, i.e., person profile view and post detail view. These are very short and serve to give the test more of an online flavor.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The short queries appear in the report as multiple entries. This should not be the case. This inflates the clicks per second number but does not significantly affect the acceleration factor.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;As a caveat, this metric will not be comparable with future ones.&lt;/p&gt; &lt;p&gt;Aside from the composition of the report, the interesting point is that with the present workload, a 300 GB database keeps up with the simulation timeline on a commodity server, also when running updates. The query frequencies and run times are in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20141111LdbcCreatingAMetricForSnb&quot; id=&quot;link-id0x2aaad6fc6528&quot;&gt;the full report&lt;/a&gt;. We also produced a graphic showing the evolution of the throughput over a run of one hour -- &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20141111LdbcCreatingAMetricForSnb/ldbc-snb-qpm.png&quot; id=&quot;link-id0x2aaad4cbdb68&quot;&gt;&lt;img src=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20141111LdbcCreatingAMetricForSnb/ldbc-snb-qpm.png&quot; alt=&quot;ldbc-snb-qpm.png&quot; width=&quot;640px&quot; /&gt; &lt;/a&gt; &lt;br /&gt; &lt;i&gt;(click to embiggen)&lt;/i&gt; &lt;/p&gt; &lt;p&gt;We see steady throughput except for some slower minutes which correspond to database checkpoints. (A checkpoint, sometimes called a log checkpoint, is the operation which makes a database state durable outside of the transaction log.) If we run updates only at full platform, we get an acceleration of about 300x in memory for 20 minutes, then 10 minutes of nothing happening while the database is being checkpointed. This is measured with 6 2TB magnetic disks. Such a behavior is incompatible with an interactive workload. But with a checkpoint every 10 minutes and updates mixed with queries, checkpointing the database does not lead to impossible latencies. Thus, we do not get the TPC-C syndrome which requires tens of disks or several SSDs per core to run.&lt;/p&gt; &lt;p&gt;This is a good thing for the benchmark, as we do not want to require unusual I/O systems for competition. Such a requirement would simply encourage people to ignore the specification for the point and would limit the number of qualifying results.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20141111LdbcCreatingAMetricForSnb&quot; id=&quot;link-id0x2aaad4cbe258&quot;&gt;The full report&lt;/a&gt; contains the details. This is also a template for later &amp;quot;real&amp;quot; FDRs. The supporting files are divided into test implementation and system configuration. With these materials plus the data generator, one should be able to repeat the results using a Virtuoso Open Source cut from &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/&quot; id=&quot;link-id0x2aaad7642ab8&quot;&gt;v7fasttrack at github.com&lt;/a&gt;, &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aaad7642c28&quot;&gt;feature/analytics branch&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In later posts we will analyze the results a bit more and see how much improvement potential we find. The next SNB article will be about the business intelligence and graph analytics areas of SNB.&lt;/p&gt;</atom:content>
  <atom:updated>2014-11-13T16:09:00.580195-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>On Universality and Core Competence</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-10-22#1829</atom:id>
  <atom:published>2014-10-22T17:24:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here develop some ideas on the platform of &lt;a href=&quot;http://www.cs.vu.nl/en/research/artificial-intelligence/kr/staff/boncz/index.asp&quot; id=&quot;link-id0x2aab794ab9f8&quot;&gt;Peter Boncz&lt;/a&gt;&amp;#39;s inaugural lecture mentioned in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1826&quot; id=&quot;link-id0x2aab7921f328&quot;&gt;the previous post&lt;/a&gt;. This is a high-level look at where the leading edge of analytics will be, now that the column store is mainstream.&lt;/p&gt; &lt;p&gt;Peter&amp;#39;s description of his domain was roughly as follows, summarized from memory:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt; &lt;p&gt;The new chair is for data analysis and engines for this purpose. The data analysis engine includes the analytical DBMS but is a broader category. For example, the diverse parts of the big data chain (including preprocessing, noise elimination, feature extraction, natural language extraction, graph analytics, and so forth) fall under this category, and most of these things are usually not done in a DBMS. For anything that is big, the main challenge remains one of performance and time to solution. These things are being done, and will increasingly be done, on a platform with heterogenous features, e.g., CPU/GPU clusters, possibly custom hardware like FPGAs, etc. This is driven by factors of cost and energy efficiency. Different processing stages will sometimes be distributed over a wide area, as for example in instrument networks and any network infrastructure, which is wide area by definition.&lt;/p&gt; &lt;p&gt;The design space of database and all that is around it is huge, and any exhaustive exploration is impossible. Development times are long, and a platform might take ten years to be mature. This is ill compatible with academic funding cycles. However, we should not leave all the research in this to industry, as industry maximizes profit, not innovation or absolute performance. Architecting data systems has aspects of an art. Consider the parallel with architecture of buildings: There are considerations of function, compatibility with environment, cost, restrictions arising from the materials at hand, and so forth. How a specific design will work cannot be known without experiment. The experiments themselves must be designed to make sense. This is not an exact science with clear-cut procedures and exact metrics of success.&lt;/p&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;This is the gist of Peter&amp;#39;s description of our art. Peter&amp;#39;s successes, best exemplified by &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x10ff99dc8&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x11200e6d8&quot;&gt;Vectorwise&lt;/a&gt;, arise from focus over a special problem area and from developing and systematically applying specific insights to a specific problem. This process led to the emergence of the column store, which is now a mainstream thing. The DBMS that does not do columns is by now behind the times.&lt;/p&gt; &lt;p&gt;Needless to say, I am a great believer in core competence. Not every core competence is exactly the same. But a core competence needs to be broad enough so that its integral mastery and consistent application can produce a unit of value valuable in itself. What and how broad this is varies a great deal. Typically such a unit of value is something that is behind a &amp;quot;natural interface.&amp;quot; This defies exhaustive definition but the examples below may give a hint. Looking at value chains and all diverse things in them that have a price tag may be another guideline.&lt;/p&gt; &lt;p&gt;There is a sort of &lt;a href=&quot;http://dbpedia.org/resource/Hegelian_dialectic&quot; id=&quot;link-id0x10dffc548&quot;&gt;Hegelian dialectic&lt;/a&gt; to technology trends: At the start, it was generally believed that a &lt;a href=&quot;http://dbpedia.org/resource/Database&quot; id=&quot;link-id0xff8f1508&quot;&gt;DBMS&lt;/a&gt; would be universal like the &lt;a href=&quot;http://dbpedia.org/resource/Operating_system&quot; id=&quot;link-id0x112383048&quot;&gt;operating system&lt;/a&gt; itself, with a few products with very similar functionality covering the whole field. The antithesis came with &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x1124d3718&quot;&gt;Michael Stonebraker&lt;/a&gt; declaring that one size no longer fit all. Since then the &lt;a href=&quot;http://dbpedia.org/resource/Online_transaction_processing&quot; id=&quot;link-id0x10ff77b18&quot;&gt;transactional (OLTP)&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Online_analytical_processing&quot; id=&quot;link-id0x1113877a8&quot;&gt;analytical (OLAP)&lt;/a&gt; sides are clearly divided. The eventual synthesis may be in the air, with pioneering work like &lt;a href=&quot;http://hyper-db.de/&quot; id=&quot;link-id0x10f62b958&quot;&gt;HyPer&lt;/a&gt; led by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x11094d628&quot;&gt;Thomas Neumann&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Technische_Universit%C3%A4t_M%C3%BCnchen&quot; id=&quot;link-id0x110a34158&quot;&gt;TU München&lt;/a&gt;. Peter, following his &lt;a href=&quot;http://www.cwi.nl/brief/2013/humboldt-research-award-peter-boncz&quot; id=&quot;link-id0x112a93358&quot;&gt;Humbolt prize&lt;/a&gt;, has spent a couple of days a week in Thomas&amp;#39;s group, and I have joined him there a few times. The key to eventually bridging the gap would be compilation and adaptivity. If the workload is compiled on demand, then the right data structures could always be at hand.&lt;/p&gt; &lt;p&gt;This might be the start of a shift similar to the column store turning the DBMS on its side, so to say.&lt;/p&gt; &lt;p&gt;In the mainstream of software engineering, objects, abstractions and interfaces are held to be a value almost in and of themselves. Our science, that of performance, stands in apparent opposition to at least any naive application of the paradigm of objects and interfaces. Interfaces have a cost, and boxes limit transparency into performance. So inlining and merging distinct (in principle) processing phases is necessary for performance. Vectoring is one take on this: An interface that is crossed just a few times is much less harmful than one crossed a billion times. Using compilation, or at least type-and-data-structure-specific variants of operators and switching their application based on run-time observed behaviors, is another aspect of this.&lt;/p&gt; &lt;p&gt;Information systems thus take on more attributes of nature, i.e., more interconnectedness and adaptive behaviors.&lt;/p&gt; &lt;p&gt;Something quite universal might emerge from the highly problem-specific technology of the column store. The big scan, selective hash join plus aggregation, has been explored in slightly different ways by all of HyPer, Vectorwise, and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x10ffbeb88&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Interfaces are not good or bad, in and of themselves. Well-intentioned naïveté in their use is bad. As in nature, there are natural borders in the &amp;quot;technosphere&amp;quot;; declarative query languages, processor instruction sets, and network protocols are good examples. Behind a relatively narrow interface lies a world of complexity of which the unsuspecting have no idea. In biology, the cell membrane might be an analogy, but this is in all likelihood more permeable and diverse in function than the techno examples mentioned.&lt;/p&gt; &lt;p&gt;With the experience of Vectorwise and later Virtuoso, it turns out that vectorization without compilation is good enough for &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x10a6cc008&quot;&gt;TPC-H&lt;/a&gt;. Indeed, I see a few percent of gain at best from further breaking of interfaces and &amp;quot;biology-style&amp;quot; merging of operators and adding inter-stage communication and self-balancing. But TPC-H is not the end of all things, even though it is a sort of rite of passage: Jazz players will do their take on &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/On_Green_Dolphin_Street_(song)&quot; id=&quot;link-id0xfce45c28&quot;&gt;Green Dolphin Street&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Summertime_(song)&quot; id=&quot;link-id0x10e04daa8&quot;&gt;Summertime&lt;/a&gt;&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Science is drawn towards a grand unification of all which is. Nature, on the other hand, discloses more and more diversity and special cases, the closer one looks. This may be true of physical things, but also of abstractions such as software systems or mathematics.&lt;/p&gt; &lt;p&gt;So, let us look at the generalized DBMS, or the data analysis engine, as Peter put it. The use of DBMS technology is hampered by its interface, i.e., declarative query language. The well known counter-reactions to this are the &lt;a href=&quot;http://dbpedia.org/resource/NoSQL&quot; id=&quot;link-id0x2aab79e56bb8&quot;&gt;NoSQL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0xff54e4d8&quot;&gt;MapReduce&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0xfe5601b8&quot;&gt;graph DB&lt;/a&gt; memes, which expose lower level interfaces. But then the interface gets put in the whole wrong place, denying most of the things that make the analytics DBMS extremely good at what it does.&lt;/p&gt; &lt;p&gt;We need better and smarter building blocks and interfaces at zero cost. We continue to need blocks of some sort, since algorithms would stop being understandable without any data/procedural abstraction. At run time, the blocks must overlap and interpenetrate: Scan plus hash plus reduction in one loop, for example. Inter-thread, inter-process status sharing for things like &lt;i&gt;top k&lt;/i&gt; for faster convergence, for another. Vectorized execution of the &lt;a href=&quot;http://dbpedia.org/resource/SIMD&quot; id=&quot;link-id0x10e9d8c48&quot;&gt;same algorithm on many data&lt;/a&gt; for things like graph traversals. There are very good single blocks, like GPU graph algorithms, but interface and composability are ever the problem.&lt;/p&gt; &lt;p&gt;So, we must unravel the package that encapsulates the wonders of the analytical DBMS. These consist of scan, hash/index lookup, partitioning, aggregation, expression evaluation, scheduling, message passing and related flow control for scale-out systems, just to mention a few. The complete list would be under 30 long, with blocks parameterized by data payload and specific computation.&lt;/p&gt; &lt;p&gt;By putting these together in a few new ways, we will cover much more of the big data pipeline. &lt;a href=&quot;http://dbpedia.org/resource/Just-in-time_compilation&quot; id=&quot;link-id0x10f482d38&quot;&gt;Just-in-time compilation&lt;/a&gt; may well be the way to deliver these components in an application/environment tailored composition. Yes, keep talking about block diagrams, but never once believe that this represents how things work or ought to work. The algorithms are expressed as distinct things, but at the level of the physical manifestation, things are parallel and interleaved.&lt;/p&gt; &lt;p&gt;The core skill for architecting the future of data analytics is correct discernment of abstraction and interface. What is generic enough to be broadly applicable yet concise enough to be usable? When should the computation move, and when should the data move? What are easy ways of talking about data location? How can protect the application developer be protected from various inevitable stupidities?&lt;/p&gt; &lt;p&gt;No mistake about it, there are at present very few people with the background for formulating the blueprint for the generalized data pipeline. These will be mostly drawn from architects of DBMS. The prospective user is any present-day user of analytics DBMS, &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aab79f6c878&quot;&gt;Hadoop&lt;/a&gt;, or the like. By and large, SQL has worked well within its area of applicability. If there had never been an anti-SQL rebel faction, SQL would not have been successful. Now that a broader workload definition calls for redefinition of interfaces, so as to use the best where it fits, there is a need for re-evaluation of the &lt;a href=&quot;http://dbpedia.org/resource/Imperative_programming&quot; id=&quot;link-id0x1117d4418&quot;&gt;imperative&lt;/a&gt; Vs. &lt;a href=&quot;http://dbpedia.org/resource/Declarative_programming&quot; id=&quot;link-id0x110b67598&quot;&gt;declarative&lt;/a&gt; question.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/T._S._Eliot&quot; id=&quot;link-id0x111756198&quot;&gt;T. S. Eliot&lt;/a&gt; once wrote that humankind cannot bear very much reality. It seems that we in reality can deconstruct the DBMS and redeploy the state of the art to serve novel purposes across a broader set of problems. This is a cross-over that slightly readjusts the mental frame of the DBMS expert but leaves the core precepts intact. In other words, this is a straightforward extension of core competence with no slide into the dilettantism of doing a little bit of everything.&lt;/p&gt; &lt;p&gt;People like MapReduce and stand-alone graph programming frameworks, because these do one specific thing and are readily understood. By and large, these are orders of magnitude simpler than the DBMS. Even when the DBMS provides in-process Java or CLR, these are rarely used. The single-purpose framework is a much narrower core competence, and thus less exclusive, than the high art of the DBMS, plus it has a faster platform development cycle.&lt;/p&gt; &lt;p&gt;In the short term, we will look at opening the SQL internal toolbox for graph analytics applications. I was discussing this idea with Thomas Neumann at Peter Boncz&amp;#39;s party. He asked who would be the user. I answered that doing good parallel algorithms, even with powerful shorthands, was an expert task; so the people doing new types of analytics would be mostly on the system vendor side. However, modifying such for input selection and statistics gathering would be no harder than doing the same with ready-made SQL reports.&lt;/p&gt; &lt;p&gt;There is significant possibility for generalization of the leading edge of database. How will this fare against single-model frameworks? We hope to shed some light on this in the final phase of &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x112527518&quot;&gt;LDBC&lt;/a&gt; and beyond.&lt;/p&gt;</atom:content>
  <atom:updated>2014-10-22T13:24:14.900227-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Inaugural Lecture of Prof. Boncz at VU Amsterdam</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-10-22#1828</atom:id>
  <atom:published>2014-10-22T17:24:07Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last Friday, I attended the inaugural lecture of Professor &lt;a href=&quot;http://www.cs.vu.nl/en/research/artificial-intelligence/kr/staff/boncz/index.asp&quot; id=&quot;link-id0x10f0a64e8&quot;&gt;Peter Boncz&lt;/a&gt; at the &lt;a href=&quot;http://dbpedia.org/page/VU_University_Amsterdam&quot; id=&quot;link-id0x10e23e948&quot;&gt;VU University Amsterdam&lt;/a&gt;. As the reader is likely to know, Peter is one of the database luminaries of the 21st century, known among other things for architecting &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x10fb03ab8&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x10eb1b1f8&quot;&gt;Actian Vector (Vectorwise)&lt;/a&gt; and publishing a stellar succession of core database papers. &lt;/p&gt; &lt;p&gt;The lecture touched on the fact of the data economy and the possibilities of E-science. Peter proceeded to address issues of ethics of cyberspace and the fact of legal and regulatory practice trailing far behind the factual dynamics of cyberspace. In conclusion, Peter gave some pointers to his research agenda; for example, use of just-in-time compilation for fusing problem-specific logic with infrastructure software like databases for both performance and architecture adaptivity.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;There was later a party in Amsterdam with many of the local database people as well as some from further away, e.g., &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0xfe423dd8&quot;&gt;Thomas Neumann&lt;/a&gt; of Munich, and &lt;a href=&quot;https://www.linkedin.com/in/marcinzukowski&quot; id=&quot;link-id0x103d43218&quot;&gt;Marcin Zukowsky&lt;/a&gt;, Vectorwise founder and initial CEO.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;I should have had the presence of mind to prepare a speech for Peter. &lt;a href=&quot;http://homepages.cwi.nl/~manegold/&quot; id=&quot;link-id0x10d769278&quot;&gt;Stefan Manegold&lt;/a&gt; of &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x100e502b8&quot;&gt;CWI&lt;/a&gt; did give a short address at the party, while presenting the gifts from Peter&amp;#39;s CWI colleagues. To this I will add my belated part here, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;&lt;p&gt;If I were to describe Prof. Boncz, our friend, co-worker, and mentor, in one word, this would be man of knowledge. If physicists define energy as that which can do work, then knowledge would be that which can do meaningful work. A schematic in itself does nothing. Knowledge is needed to bring this to life. Yet this is more than an outstanding specialist skill, as this implies discerning the right means in the right context and includes the will and ability to go through with this. As Peter now takes on the mantle of professor, the best students will, I am sure, not fail to recognize excellence and be accordingly inspired to strive for the sort of industry changing accomplishments we have come to associate with Peter&amp;#39;s career so far. This is what our world needs. A big cheer for Prof. Boncz!&lt;/p&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;I did talk to many at the party, especially &lt;a href=&quot;http://homepages.cwi.nl/~duc/&quot; id=&quot;link-id0x1099e2b78&quot;&gt;Pham Minh Duc&lt;/a&gt;, who is doing schema-aware RDF in MonetDB, and many others among the excellent team at CWI. Stefan Manegold told me about &lt;a href=&quot;http://www.rethinkbig-project.eu/&quot; id=&quot;link-id0x2aabb478aab8&quot;&gt;Rethink Big&lt;/a&gt;, an FP7 for big data policy recommendations. I was meant to be an advisor and still hope to go to one of their meetings for some networking about policy. On the other hand, the EU agenda and priorities, as discussed with, for example, &lt;a href=&quot;https://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x103da2e78&quot;&gt;Stefano Bertolo&lt;/a&gt;, are, as far as I am concerned, on the right track: The science of performance must meet with the real, or at least realistic, data. Peter did not fail to mention this same truth in his lecture: Spinoffs play a key part in research, and exposure to the world out there gives research both focus and credibility. As René Char put it in his poem &lt;i&gt;L&amp;#39;Allumette (The Matchstick&lt;/i&gt;), &amp;quot;La tête seule à pouvoir de prendre feu au contact d&amp;#39;une réalité dure.&amp;quot; (&amp;quot;The head alone has power to catch fire at the touch of hard reality.&amp;quot;) Great deeds need great challenges, and there is nothing like reality to exceed man&amp;#39;s imagination.&lt;/p&gt; &lt;p&gt;For my part, I was advertising the imminent advances in the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x10e99fb98&quot;&gt;Virtuoso&lt;/a&gt; RDF and graph functionality. Now that the SQL part, which is anyway the necessary foundation for all this, is really very competent, it is time to deploy these same things in slightly new ways. This will produce graph analytics and structure-aware RDF to match relational performance while keeping schema-last-ness. Anyway, the claim has been made; we will see how it is delivered during the final phase of &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x10db84bc8&quot;&gt;LDBC&lt;/a&gt; and &lt;a href=&quot;http://geoknow.eu/&quot; id=&quot;link-id0x10586d568&quot;&gt;Geoknow&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2014-10-22T13:24:07.576952-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>On Universality and Core Competence</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-10-22#1827</atom:id>
  <atom:published>2014-10-22T17:23:58Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here develop some ideas on the platform of &lt;a href=&quot;http://www.cs.vu.nl/en/research/artificial-intelligence/kr/staff/boncz/index.asp&quot; id=&quot;link-id0x2aab794ab9f8&quot;&gt;Peter Boncz&lt;/a&gt;&amp;#39;s inaugural lecture mentioned in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1826&quot; id=&quot;link-id0x2aab7921f328&quot;&gt;the previous post&lt;/a&gt;. This is a high-level look at where the leading edge of analytics will be, now that the column store is mainstream.&lt;/p&gt; &lt;p&gt;Peter&amp;#39;s description of his domain was roughly as follows, summarized from memory:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt; &lt;p&gt;The new chair is for data analysis and engines for this purpose. The data analysis engine includes the analytical DBMS but is a broader category. For example, the diverse parts of the big data chain (including preprocessing, noise elimination, feature extraction, natural language extraction, graph analytics, and so forth) fall under this category, and most of these things are usually not done in a DBMS. For anything that is big, the main challenge remains one of performance and time to solution. These things are being done, and will increasingly be done, on a platform with heterogenous features, e.g., CPU/GPU clusters, possibly custom hardware like FPGAs, etc. This is driven by factors of cost and energy efficiency. Different processing stages will sometimes be distributed over a wide area, as for example in instrument networks and any network infrastructure, which is wide area by definition.&lt;/p&gt; &lt;p&gt;The design space of database and all that is around it is huge, and any exhaustive exploration is impossible. Development times are long, and a platform might take ten years to be mature. This is ill compatible with academic funding cycles. However, we should not leave all the research in this to industry, as industry maximizes profit, not innovation or absolute performance. Architecting data systems has aspects of an art. Consider the parallel with architecture of buildings: There are considerations of function, compatibility with environment, cost, restrictions arising from the materials at hand, and so forth. How a specific design will work cannot be known without experiment. The experiments themselves must be designed to make sense. This is not an exact science with clear-cut procedures and exact metrics of success.&lt;/p&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;This is the gist of Peter&amp;#39;s description of our art. Peter&amp;#39;s successes, best exemplified by &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x10ff99dc8&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x11200e6d8&quot;&gt;Vectorwise&lt;/a&gt;, arise from focus over a special problem area and from developing and systematically applying specific insights to a specific problem. This process led to the emergence of the column store, which is now a mainstream thing. The DBMS that does not do columns is by now behind the times.&lt;/p&gt; &lt;p&gt;Needless to say, I am a great believer in core competence. Not every core competence is exactly the same. But a core competence needs to be broad enough so that its integral mastery and consistent application can produce a unit of value valuable in itself. What and how broad this is varies a great deal. Typically such a unit of value is something that is behind a &amp;quot;natural interface.&amp;quot; This defies exhaustive definition but the examples below may give a hint. Looking at value chains and all diverse things in them that have a price tag may be another guideline.&lt;/p&gt; &lt;p&gt;There is a sort of &lt;a href=&quot;http://dbpedia.org/resource/Hegelian_dialectic&quot; id=&quot;link-id0x10dffc548&quot;&gt;Hegelian dialectic&lt;/a&gt; to technology trends: At the start, it was generally believed that a &lt;a href=&quot;http://dbpedia.org/resource/Database&quot; id=&quot;link-id0xff8f1508&quot;&gt;DBMS&lt;/a&gt; would be universal like the &lt;a href=&quot;http://dbpedia.org/resource/Operating_system&quot; id=&quot;link-id0x112383048&quot;&gt;operating system&lt;/a&gt; itself, with a few products with very similar functionality covering the whole field. The antithesis came with &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x1124d3718&quot;&gt;Michael Stonebraker&lt;/a&gt; declaring that one size no longer fit all. Since then the &lt;a href=&quot;http://dbpedia.org/resource/Online_transaction_processing&quot; id=&quot;link-id0x10ff77b18&quot;&gt;transactional (OLTP)&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Online_analytical_processing&quot; id=&quot;link-id0x1113877a8&quot;&gt;analytical (OLAP)&lt;/a&gt; sides are clearly divided. The eventual synthesis may be in the air, with pioneering work like &lt;a href=&quot;http://hyper-db.de/&quot; id=&quot;link-id0x10f62b958&quot;&gt;HyPer&lt;/a&gt; led by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x11094d628&quot;&gt;Thomas Neumann&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Technische_Universit%C3%A4t_M%C3%BCnchen&quot; id=&quot;link-id0x110a34158&quot;&gt;TU München&lt;/a&gt;. Peter, following his &lt;a href=&quot;http://www.cwi.nl/brief/2013/humboldt-research-award-peter-boncz&quot; id=&quot;link-id0x112a93358&quot;&gt;Humbolt prize&lt;/a&gt;, has spent a couple of days a week in Thomas&amp;#39;s group, and I have joined him there a few times. The key to eventually bridging the gap would be compilation and adaptivity. If the workload is compiled on demand, then the right data structures could always be at hand.&lt;/p&gt; &lt;p&gt;This might be the start of a shift similar to the column store turning the DBMS on its side, so to say.&lt;/p&gt; &lt;p&gt;In the mainstream of software engineering, objects, abstractions and interfaces are held to be a value almost in and of themselves. Our science, that of performance, stands in apparent opposition to at least any naive application of the paradigm of objects and interfaces. Interfaces have a cost, and boxes limit transparency into performance. So inlining and merging distinct (in principle) processing phases is necessary for performance. Vectoring is one take on this: An interface that is crossed just a few times is much less harmful than one crossed a billion times. Using compilation, or at least type-and-data-structure-specific variants of operators and switching their application based on run-time observed behaviors, is another aspect of this.&lt;/p&gt; &lt;p&gt;Information systems thus take on more attributes of nature, i.e., more interconnectedness and adaptive behaviors.&lt;/p&gt; &lt;p&gt;Something quite universal might emerge from the highly problem-specific technology of the column store. The big scan, selective hash join plus aggregation, has been explored in slightly different ways by all of HyPer, Vectorwise, and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x10ffbeb88&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Interfaces are not good or bad, in and of themselves. Well-intentioned naïveté in their use is bad. As in nature, there are natural borders in the &amp;quot;technosphere&amp;quot;; declarative query languages, processor instruction sets, and network protocols are good examples. Behind a relatively narrow interface lies a world of complexity of which the unsuspecting have no idea. In biology, the cell membrane might be an analogy, but this is in all likelihood more permeable and diverse in function than the techno examples mentioned.&lt;/p&gt; &lt;p&gt;With the experience of Vectorwise and later Virtuoso, it turns out that vectorization without compilation is good enough for &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x10a6cc008&quot;&gt;TPC-H&lt;/a&gt;. Indeed, I see a few percent of gain at best from further breaking of interfaces and &amp;quot;biology-style&amp;quot; merging of operators and adding inter-stage communication and self-balancing. But TPC-H is not the end of all things, even though it is a sort of rite of passage: Jazz players will do their take on &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/On_Green_Dolphin_Street_(song)&quot; id=&quot;link-id0xfce45c28&quot;&gt;Green Dolphin Street&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Summertime_(song)&quot; id=&quot;link-id0x10e04daa8&quot;&gt;Summertime&lt;/a&gt;&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Science is drawn towards a grand unification of all which is. Nature, on the other hand, discloses more and more diversity and special cases, the closer one looks. This may be true of physical things, but also of abstractions such as software systems or mathematics.&lt;/p&gt; &lt;p&gt;So, let us look at the generalized DBMS, or the data analysis engine, as Peter put it. The use of DBMS technology is hampered by its interface, i.e., declarative query language. The well known counter-reactions to this are the &lt;a href=&quot;http://dbpedia.org/resource/NoSQL&quot; id=&quot;link-id0x2aab79e56bb8&quot;&gt;NoSQL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0xff54e4d8&quot;&gt;MapReduce&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0xfe5601b8&quot;&gt;graph DB&lt;/a&gt; memes, which expose lower level interfaces. But then the interface gets put in the whole wrong place, denying most of the things that make the analytics DBMS extremely good at what it does.&lt;/p&gt; &lt;p&gt;We need better and smarter building blocks and interfaces at zero cost. We continue to need blocks of some sort, since algorithms would stop being understandable without any data/procedural abstraction. At run time, the blocks must overlap and interpenetrate: Scan plus hash plus reduction in one loop, for example. Inter-thread, inter-process status sharing for things like &lt;i&gt;top k&lt;/i&gt; for faster convergence, for another. Vectorized execution of the &lt;a href=&quot;http://dbpedia.org/resource/SIMD&quot; id=&quot;link-id0x10e9d8c48&quot;&gt;same algorithm on many data&lt;/a&gt; for things like graph traversals. There are very good single blocks, like GPU graph algorithms, but interface and composability are ever the problem.&lt;/p&gt; &lt;p&gt;So, we must unravel the package that encapsulates the wonders of the analytical DBMS. These consist of scan, hash/index lookup, partitioning, aggregation, expression evaluation, scheduling, message passing and related flow control for scale-out systems, just to mention a few. The complete list would be under 30 long, with blocks parameterized by data payload and specific computation.&lt;/p&gt; &lt;p&gt;By putting these together in a few new ways, we will cover much more of the big data pipeline. &lt;a href=&quot;http://dbpedia.org/resource/Just-in-time_compilation&quot; id=&quot;link-id0x10f482d38&quot;&gt;Just-in-time compilation&lt;/a&gt; may well be the way to deliver these components in an application/environment tailored composition. Yes, keep talking about block diagrams, but never once believe that this represents how things work or ought to work. The algorithms are expressed as distinct things, but at the level of the physical manifestation, things are parallel and interleaved.&lt;/p&gt; &lt;p&gt;The core skill for architecting the future of data analytics is correct discernment of abstraction and interface. What is generic enough to be broadly applicable yet concise enough to be usable? When should the computation move, and when should the data move? What are easy ways of talking about data location? How can protect the application developer be protected from various inevitable stupidities?&lt;/p&gt; &lt;p&gt;No mistake about it, there are at present very few people with the background for formulating the blueprint for the generalized data pipeline. These will be mostly drawn from architects of DBMS. The prospective user is any present-day user of analytics DBMS, &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aab79f6c878&quot;&gt;Hadoop&lt;/a&gt;, or the like. By and large, SQL has worked well within its area of applicability. If there had never been an anti-SQL rebel faction, SQL would not have been successful. Now that a broader workload definition calls for redefinition of interfaces, so as to use the best where it fits, there is a need for re-evaluation of the &lt;a href=&quot;http://dbpedia.org/resource/Imperative_programming&quot; id=&quot;link-id0x1117d4418&quot;&gt;imperative&lt;/a&gt; Vs. &lt;a href=&quot;http://dbpedia.org/resource/Declarative_programming&quot; id=&quot;link-id0x110b67598&quot;&gt;declarative&lt;/a&gt; question.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/T._S._Eliot&quot; id=&quot;link-id0x111756198&quot;&gt;T. S. Eliot&lt;/a&gt; once wrote that humankind cannot bear very much reality. It seems that we in reality can deconstruct the DBMS and redeploy the state of the art to serve novel purposes across a broader set of problems. This is a cross-over that slightly readjusts the mental frame of the DBMS expert but leaves the core precepts intact. In other words, this is a straightforward extension of core competence with no slide into the dilettantism of doing a little bit of everything.&lt;/p&gt; &lt;p&gt;People like MapReduce and stand-alone graph programming frameworks, because these do one specific thing and are readily understood. By and large, these are orders of magnitude simpler than the DBMS. Even when the DBMS provides in-process Java or CLR, these are rarely used. The single-purpose framework is a much narrower core competence, and thus less exclusive, than the high art of the DBMS, plus it has a faster platform development cycle.&lt;/p&gt; &lt;p&gt;In the short term, we will look at opening the SQL internal toolbox for graph analytics applications. I was discussing this idea with Thomas Neumann at Peter Boncz&amp;#39;s party. He asked who would be the user. I answered that doing good parallel algorithms, even with powerful shorthands, was an expert task; so the people doing new types of analytics would be mostly on the system vendor side. However, modifying such for input selection and statistics gathering would be no harder than doing the same with ready-made SQL reports.&lt;/p&gt; &lt;p&gt;There is significant possibility for generalization of the leading edge of database. How will this fare against single-model frameworks? We hope to shed some light on this in the final phase of &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x112527518&quot;&gt;LDBC&lt;/a&gt; and beyond.&lt;/p&gt;</atom:content>
  <atom:updated>2014-10-22T13:23:58.362941-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Inaugural Lecture of Prof. Boncz at VU Amsterdam</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-10-22#1826</atom:id>
  <atom:published>2014-10-22T17:21:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last Friday, I attended the inaugural lecture of Professor &lt;a href=&quot;http://www.cs.vu.nl/en/research/artificial-intelligence/kr/staff/boncz/index.asp&quot; id=&quot;link-id0x10f0a64e8&quot;&gt;Peter Boncz&lt;/a&gt; at the &lt;a href=&quot;http://dbpedia.org/page/VU_University_Amsterdam&quot; id=&quot;link-id0x10e23e948&quot;&gt;VU University Amsterdam&lt;/a&gt;. As the reader is likely to know, Peter is one of the database luminaries of the 21st century, known among other things for architecting &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x10fb03ab8&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x10eb1b1f8&quot;&gt;Actian Vector (Vectorwise)&lt;/a&gt; and publishing a stellar succession of core database papers. &lt;/p&gt; &lt;p&gt;The lecture touched on the fact of the data economy and the possibilities of E-science. Peter proceeded to address issues of ethics of cyberspace and the fact of legal and regulatory practice trailing far behind the factual dynamics of cyberspace. In conclusion, Peter gave some pointers to his research agenda; for example, use of just-in-time compilation for fusing problem-specific logic with infrastructure software like databases for both performance and architecture adaptivity.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;There was later a party in Amsterdam with many of the local database people as well as some from further away, e.g., &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0xfe423dd8&quot;&gt;Thomas Neumann&lt;/a&gt; of Munich, and &lt;a href=&quot;https://www.linkedin.com/in/marcinzukowski&quot; id=&quot;link-id0x103d43218&quot;&gt;Marcin Zukowsky&lt;/a&gt;, Vectorwise founder and initial CEO.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;I should have had the presence of mind to prepare a speech for Peter. &lt;a href=&quot;http://homepages.cwi.nl/~manegold/&quot; id=&quot;link-id0x10d769278&quot;&gt;Stefan Manegold&lt;/a&gt; of &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x100e502b8&quot;&gt;CWI&lt;/a&gt; did give a short address at the party, while presenting the gifts from Peter&amp;#39;s CWI colleagues. To this I will add my belated part here, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;&lt;p&gt;If I were to describe Prof. Boncz, our friend, co-worker, and mentor, in one word, this would be man of knowledge. If physicists define energy as that which can do work, then knowledge would be that which can do meaningful work. A schematic in itself does nothing. Knowledge is needed to bring this to life. Yet this is more than an outstanding specialist skill, as this implies discerning the right means in the right context and includes the will and ability to go through with this. As Peter now takes on the mantle of professor, the best students will, I am sure, not fail to recognize excellence and be accordingly inspired to strive for the sort of industry changing accomplishments we have come to associate with Peter&amp;#39;s career so far. This is what our world needs. A big cheer for Prof. Boncz!&lt;/p&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;I did talk to many at the party, especially &lt;a href=&quot;http://homepages.cwi.nl/~duc/&quot; id=&quot;link-id0x1099e2b78&quot;&gt;Pham Minh Duc&lt;/a&gt;, who is doing schema-aware RDF in MonetDB, and many others among the excellent team at CWI. Stefan Manegold told me about &lt;a href=&quot;http://www.rethinkbig-project.eu/&quot; id=&quot;link-id0x2aabb478aab8&quot;&gt;Rethink Big&lt;/a&gt;, an FP7 for big data policy recommendations. I was meant to be an advisor and still hope to go to one of their meetings for some networking about policy. On the other hand, the EU agenda and priorities, as discussed with, for example, &lt;a href=&quot;https://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x103da2e78&quot;&gt;Stefano Bertolo&lt;/a&gt;, are, as far as I am concerned, on the right track: The science of performance must meet with the real, or at least realistic, data. Peter did not fail to mention this same truth in his lecture: Spinoffs play a key part in research, and exposure to the world out there gives research both focus and credibility. As René Char put it in his poem &lt;i&gt;L&amp;#39;Allumette (The Matchstick&lt;/i&gt;), &amp;quot;La tête seule à pouvoir de prendre feu au contact d&amp;#39;une réalité dure.&amp;quot; (&amp;quot;The head alone has power to catch fire at the touch of hard reality.&amp;quot;) Great deeds need great challenges, and there is nothing like reality to exceed man&amp;#39;s imagination.&lt;/p&gt; &lt;p&gt;For my part, I was advertising the imminent advances in the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x10e99fb98&quot;&gt;Virtuoso&lt;/a&gt; RDF and graph functionality. Now that the SQL part, which is anyway the necessary foundation for all this, is really very competent, it is time to deploy these same things in slightly new ways. This will produce graph analytics and structure-aware RDF to match relational performance while keeping schema-last-ness. Anyway, the claim has been made; we will see how it is delivered during the final phase of &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x10db84bc8&quot;&gt;LDBC&lt;/a&gt; and &lt;a href=&quot;http://geoknow.eu/&quot; id=&quot;link-id0x10586d568&quot;&gt;Geoknow&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2014-10-22T13:21:37.296395-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 20 of n): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-10-06#1825</atom:id>
  <atom:published>2014-10-06T17:53:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab51a32ce8&quot;&gt;introduction to scale out&lt;/a&gt; piece, I promised to address the matter of data-to-memory ratio, and to talk about when scale-out makes sense. Here we will see that scale-out makes sense whenever data does not fit in memory on a single commodity server. The gains in processing power are immediate, even when going from one box to just two, with both systems having all in memory.&lt;/p&gt; &lt;p&gt;As an initial take on the issue we run 100 GB and 1000 GB on the test system. 100 GB is trivially in memory, 1000 GB is not, as the memory is 384 GB total, of which 360 GB may be used for the processes.&lt;/p&gt; &lt;p&gt;We run 2 workloads on the 100 GB database, having pre-loaded the data in memory:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;run&lt;/th&gt; &lt;th&gt;power&lt;/th&gt; &lt;th&gt;throughput&lt;/th&gt; &lt;th&gt;composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1&lt;/th&gt; &lt;td&gt;349,027.7&lt;/td&gt; &lt;td&gt;420,503.1&lt;/td&gt; &lt;td&gt;383,102.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2&lt;/th&gt; &lt;td&gt;387,890.3&lt;/td&gt; &lt;td&gt;433,066.6&lt;/td&gt; &lt;td&gt;409,856.5&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;This is directly comparable to the 100 GB single-server results. Comparing the second runs, we see a 1.53x gain in power and a 1.8x gain in throughput from 2x the platform. This is fully on the level for a workload that is not trivially parallel, as we have seen in the previous articles. The difference between the first and second runs at 100 GB comes, for both single-server and cluster, from the latency of allocating transient query memory. For an official run, where the weakest link is the first power test, this would simply have to be pre-allocated.&lt;/p&gt; &lt;p&gt;We run 2 workloads on the 1000 GB database, starting from cold.&lt;/p&gt; &lt;p&gt;The result is:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;run&lt;/th&gt; &lt;th&gt;power&lt;/th&gt; &lt;th&gt;throughput&lt;/th&gt; &lt;th&gt;composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1&lt;/th&gt; &lt;td&gt;136,744.5&lt;/td&gt; &lt;td&gt;147,374.6&lt;/td&gt; &lt;td&gt;141,960.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2&lt;/th&gt; &lt;td&gt;199,652.0&lt;/td&gt; &lt;td&gt;125,161.1&lt;/td&gt; &lt;td&gt;158,078.0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The 1000 GB result is not for competition with this platform; more memory would be needed. For actual applications, the numbers are still in the usable range, though.&lt;/p&gt; &lt;p&gt;The 1000 GB setup uses 4 SSDs for storage, one per server process. The server processes are each bound to their own physical CPU.&lt;/p&gt; &lt;p&gt;We look at the meters: 32M pages (8M per process) are in memory at each time. Over the 2 benchmark executions there are a total of 494M disk reads. The total CPU time is 165,674 seconds of CPU, of which about 10% are system, over 10,063 seconds of real-time. Cumulative disk-read wait-time is 130,177 s. This gives an average disk read throughput of 384 MB/s.&lt;/p&gt; &lt;p&gt;This is easily sustained by 4 SSDs; in practice, the maximum throughput we see for reading is 1 GB/s (256 MB/s per SSD). Newer SSDs would do maybe twice that. Using rotating media would not be an option.&lt;/p&gt; &lt;p&gt;Without the drop in CPU caused by waiting for SSD, we would have numbers very close to the 100 GB numbers. &lt;/p&gt; &lt;p&gt;The interconnect traffic for the two runs was 1,077 GB with no message compression. The write block time was 448 seconds of thread-time. So we see that blocking on write hurts platform utilization when running under optimal conditions, but compared to going to secondary storage, it is not a large factor.&lt;/p&gt; &lt;p&gt;The 1000 GB scale has a transient peak memory consumption of 42 GB. This consists of hash-join build sides and GROUP BYs. The greatest memory consumers are Q9 with 9 GB, Q13 with 11 GB, and Q16 with 7 GB. Having many of these at a time drives up the transient peak. The peak gets higher as the scale grows, also because a larger scale requires more concurrent query streams. At the 384 GB for 1000 GB ratio, we do not yet get into memory saving plans like hash joins in many passes or index use instead of hash. When the data size grows, replicated hash build sides will become less convenient, and communication will increase. Q9 and Q13 can be done by index with almost no transient memory, but these plans are easily 3x less efficient for CPU. These will probably help at 3000 GB and be necessary at least part of the time at 10,000 GB.&lt;/p&gt; &lt;p&gt;The I/O volume in MB per index over the 2 executions is:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;index&lt;/th&gt; &lt;th&gt;MB&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;LINEITEM&lt;/code&gt; &lt;/th&gt; &lt;td&gt;1,987,483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;ORDERS&lt;/code&gt; &lt;/th&gt; &lt;td&gt;1,440,526&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;PARTSUPP&lt;/code&gt; &lt;/th&gt; &lt;td&gt;199,335&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;PART&lt;/code&gt; &lt;/th&gt; &lt;td&gt;161,717&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;CUSTOMER&lt;/code&gt; &lt;/th&gt; &lt;td&gt;43,276&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/th&gt; &lt;td&gt;19,085&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;SUPPLIER&lt;/code&gt; &lt;/th&gt; &lt;td&gt;13,393&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Of this, maybe 600 GB could be saved by stream compressing &lt;code&gt;o_comment&lt;/code&gt;. Otherwise this cannot be helped without adding memory. The &lt;code&gt;lineitem&lt;/code&gt; reads are mostly for &lt;code&gt;l_extendedprice&lt;/code&gt;, which is not compressible. If compressing &lt;code&gt;o_comment&lt;/code&gt; made &lt;code&gt;l_extendedprice&lt;/code&gt; always fit in memory, then there would be a radical drop in I/O. Also, as a matter of fact, the buffer management policy of least-recently-used works the very worst for big scans, specifically those of &lt;code&gt;l_extendedprice&lt;/code&gt;: If the head is replaced when reading the tail, and the next read starts from the head, then the whole table/column is read all over again. Caching policies that specially recognized scans of this sort could further reduce I/O. Clustering &lt;code&gt;lineitems&lt;/code&gt;/&lt;code&gt;orders&lt;/code&gt; on &lt;code&gt;date&lt;/code&gt;, as &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x2aab50f9b008&quot;&gt;Actian Vector&lt;/a&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aab51845d48&quot;&gt;TPC-H&lt;/a&gt; implementations do, also starts yielding a greater gain when not running from memory: One column (e.g., &lt;code&gt;l_shipdate&lt;/code&gt;) may be scanned for the whole table but, if the matches are bunched together, then most of &lt;code&gt;l_extendedprice&lt;/code&gt; will not be read at all. Still, if going for top ranks in the races, all will be from memory, or at least there will be SSDs with read throughput around 150 MB/s per core, so these tricks become relatively less important.&lt;/p&gt; &lt;p&gt;In the 100 GB numerical quantities summaries, we see much the same picture as in the single-server. Queries get faster, but their relative times are not radically different. The throughput test (many queries at a time) times are more or less multiples of the power (single user) times. This picture breaks at 1000 GB where I/O first drops the performance to under half and introduces huge variation in execution times within a single query. The time entirely depends on which queries are running along with or right before the execution and on whether these have the same or different working sets. All the streams have the same queries with different parameters, but the query order in each stream is different.&lt;/p&gt; &lt;p&gt;The numerical quantities follow for all the runs. Note that the first 1000 GB run is cold. A competition grade 1000 GB result can be made with double the memory, and the more CPU the better. We will try one at Amazon in a bit.&lt;/p&gt; &lt;p&gt; *** &lt;/p&gt; &lt;p&gt;The conclusion is that scale-out pays from the get-go. At present prices, a system with twice the power of a single node of the test system is cost effective. Scales of up to 500 GB are single commodity server, under $10K. Rather than going from a mid-to-large dual-socket box to a quad-socket box, one is likely to be better off having two cheaper dual-socket boxes. These are also readily available on clouds, whereas scale-up configurations are not. Onwards of 1 TB, a cluster is expected to clearly win. At 3 TB, a commodity cluster will clearly be the better deal for both price and absolute performance.&lt;/p&gt; &lt;h2&gt;100 GB Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;0M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;349,027.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;420,503.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;383,102.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;94.273000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:07&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:40&lt;/td&gt; &lt;td&gt;0:00:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:16&lt;/td&gt; &lt;td&gt;0:01:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:14&lt;/td&gt; &lt;td&gt;0:01:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:07&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:13&lt;/td&gt; &lt;td&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 15:05:41&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:03&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:06&lt;/td&gt; &lt;td&gt;0:00:24&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:06&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:20&lt;/td&gt; &lt;td&gt;0:00:14&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:20&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:35&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:35&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:48&lt;/td&gt; &lt;td&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.045198&lt;/td&gt; &lt;td&gt;0.337315&lt;/td&gt; &lt;td&gt;1.129548&lt;/td&gt; &lt;td&gt;0.327029&lt;/td&gt; &lt;td&gt;1.230955&lt;/td&gt; &lt;td&gt;0.473090&lt;/td&gt; &lt;td&gt;0.979096&lt;/td&gt; &lt;td&gt;0.852639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;4.521951&lt;/td&gt; &lt;td&gt;0.596538&lt;/td&gt; &lt;td&gt;3.464342&lt;/td&gt; &lt;td&gt;1.167101&lt;/td&gt; &lt;td&gt;3.944699&lt;/td&gt; &lt;td&gt;1.744325&lt;/td&gt; &lt;td&gt;5.442328&lt;/td&gt; &lt;td&gt;4.706185&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.678728&lt;/td&gt; &lt;td&gt;0.837205&lt;/td&gt; &lt;td&gt;3.594060&lt;/td&gt; &lt;td&gt;1.911751&lt;/td&gt; &lt;td&gt;3.942459&lt;/td&gt; &lt;td&gt;0.947788&lt;/td&gt; &lt;td&gt;3.821267&lt;/td&gt; &lt;td&gt;4.686319&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;5.126384&lt;/td&gt; &lt;td&gt;0.932394&lt;/td&gt; &lt;td&gt;0.961762&lt;/td&gt; &lt;td&gt;1.043759&lt;/td&gt; &lt;td&gt;5.359990&lt;/td&gt; &lt;td&gt;1.035597&lt;/td&gt; &lt;td&gt;3.056079&lt;/td&gt; &lt;td&gt;5.803445&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.497118&lt;/td&gt; &lt;td&gt;0.381036&lt;/td&gt; &lt;td&gt;4.665412&lt;/td&gt; &lt;td&gt;1.224975&lt;/td&gt; &lt;td&gt;5.316591&lt;/td&gt; &lt;td&gt;1.666253&lt;/td&gt; &lt;td&gt;2.297872&lt;/td&gt; &lt;td&gt;6.425171&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.080968&lt;/td&gt; &lt;td&gt;0.493741&lt;/td&gt; &lt;td&gt;4.416305&lt;/td&gt; &lt;td&gt;0.879202&lt;/td&gt; &lt;td&gt;5.705877&lt;/td&gt; &lt;td&gt;1.615987&lt;/td&gt; &lt;td&gt;3.846881&lt;/td&gt; &lt;td&gt;3.346686&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.080968&lt;/td&gt; &lt;td&gt;0.381036&lt;/td&gt; &lt;td&gt;0.961762&lt;/td&gt; &lt;td&gt;0.879202&lt;/td&gt; &lt;td&gt;3.942459&lt;/td&gt; &lt;td&gt;0.947788&lt;/td&gt; &lt;td&gt;2.297872&lt;/td&gt; &lt;td&gt;3.346686&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.126384&lt;/td&gt; &lt;td&gt;0.932394&lt;/td&gt; &lt;td&gt;4.665412&lt;/td&gt; &lt;td&gt;1.911751&lt;/td&gt; &lt;td&gt;5.705877&lt;/td&gt; &lt;td&gt;1.744325&lt;/td&gt; &lt;td&gt;5.442328&lt;/td&gt; &lt;td&gt;6.425171&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.581030&lt;/td&gt; &lt;td&gt;0.648183&lt;/td&gt; &lt;td&gt;3.420376&lt;/td&gt; &lt;td&gt;1.245358&lt;/td&gt; &lt;td&gt;4.853923&lt;/td&gt; &lt;td&gt;1.401990&lt;/td&gt; &lt;td&gt;3.692885&lt;/td&gt; &lt;td&gt;4.993561&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;3.575916&lt;/td&gt; &lt;td&gt;2.786656&lt;/td&gt; &lt;td&gt;1.579488&lt;/td&gt; &lt;td&gt;0.611454&lt;/td&gt; &lt;td&gt;3.132460&lt;/td&gt; &lt;td&gt;0.685095&lt;/td&gt; &lt;td&gt;0.955559&lt;/td&gt; &lt;td&gt;1.060110&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.551437&lt;/td&gt; &lt;td&gt;7.187181&lt;/td&gt; &lt;td&gt;5.816455&lt;/td&gt; &lt;td&gt;2.004946&lt;/td&gt; &lt;td&gt;9.461347&lt;/td&gt; &lt;td&gt;5.624020&lt;/td&gt; &lt;td&gt;5.517677&lt;/td&gt; &lt;td&gt;2.924265&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.637427&lt;/td&gt; &lt;td&gt;6.641804&lt;/td&gt; &lt;td&gt;6.359532&lt;/td&gt; &lt;td&gt;2.412576&lt;/td&gt; &lt;td&gt;8.819754&lt;/td&gt; &lt;td&gt;3.335494&lt;/td&gt; &lt;td&gt;4.549792&lt;/td&gt; &lt;td&gt;3.163920&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;11.041451&lt;/td&gt; &lt;td&gt;6.464479&lt;/td&gt; &lt;td&gt;6.982671&lt;/td&gt; &lt;td&gt;3.272975&lt;/td&gt; &lt;td&gt;8.342983&lt;/td&gt; &lt;td&gt;3.448635&lt;/td&gt; &lt;td&gt;4.405911&lt;/td&gt; &lt;td&gt;2.886393&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;8.860228&lt;/td&gt; &lt;td&gt;6.754529&lt;/td&gt; &lt;td&gt;7.065501&lt;/td&gt; &lt;td&gt;3.225236&lt;/td&gt; &lt;td&gt;8.789565&lt;/td&gt; &lt;td&gt;3.419165&lt;/td&gt; &lt;td&gt;4.240718&lt;/td&gt; &lt;td&gt;2.399092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;7.339672&lt;/td&gt; &lt;td&gt;8.121027&lt;/td&gt; &lt;td&gt;6.261988&lt;/td&gt; &lt;td&gt;2.711946&lt;/td&gt; &lt;td&gt;8.764934&lt;/td&gt; &lt;td&gt;3.106366&lt;/td&gt; &lt;td&gt;6.544712&lt;/td&gt; &lt;td&gt;3.472092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.339672&lt;/td&gt; &lt;td&gt;6.464479&lt;/td&gt; &lt;td&gt;5.816455&lt;/td&gt; &lt;td&gt;2.004946&lt;/td&gt; &lt;td&gt;8.342983&lt;/td&gt; &lt;td&gt;3.106366&lt;/td&gt; &lt;td&gt;4.240718&lt;/td&gt; &lt;td&gt;2.399092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;11.041451&lt;/td&gt; &lt;td&gt;8.121027&lt;/td&gt; &lt;td&gt;7.065501&lt;/td&gt; &lt;td&gt;3.272975&lt;/td&gt; &lt;td&gt;9.461347&lt;/td&gt; &lt;td&gt;5.624020&lt;/td&gt; &lt;td&gt;6.544712&lt;/td&gt; &lt;td&gt;3.472092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;9.286043&lt;/td&gt; &lt;td&gt;7.033804&lt;/td&gt; &lt;td&gt;6.497229&lt;/td&gt; &lt;td&gt;2.725536&lt;/td&gt; &lt;td&gt;8.835717&lt;/td&gt; &lt;td&gt;3.786736&lt;/td&gt; &lt;td&gt;5.051762&lt;/td&gt; &lt;td&gt;2.969152&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.433789&lt;/td&gt; &lt;td&gt;0.972152&lt;/td&gt; &lt;td&gt;0.780247&lt;/td&gt; &lt;td&gt;1.287222&lt;/td&gt; &lt;td&gt;1.360084&lt;/td&gt; &lt;td&gt;0.254051&lt;/td&gt; &lt;td&gt;6.201742&lt;/td&gt; &lt;td&gt;1.219707&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.398354&lt;/td&gt; &lt;td&gt;2.591249&lt;/td&gt; &lt;td&gt;3.021207&lt;/td&gt; &lt;td&gt;4.663204&lt;/td&gt; &lt;td&gt;4.775704&lt;/td&gt; &lt;td&gt;1.116547&lt;/td&gt; &lt;td&gt;8.770115&lt;/td&gt; &lt;td&gt;5.643550&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;6.811520&lt;/td&gt; &lt;td&gt;3.411846&lt;/td&gt; &lt;td&gt;2.634076&lt;/td&gt; &lt;td&gt;4.296810&lt;/td&gt; &lt;td&gt;4.669635&lt;/td&gt; &lt;td&gt;2.282003&lt;/td&gt; &lt;td&gt;18.039617&lt;/td&gt; &lt;td&gt;6.060465&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;4.947110&lt;/td&gt; &lt;td&gt;2.479268&lt;/td&gt; &lt;td&gt;2.952951&lt;/td&gt; &lt;td&gt;6.431644&lt;/td&gt; &lt;td&gt;5.469152&lt;/td&gt; &lt;td&gt;1.816467&lt;/td&gt; &lt;td&gt;8.271266&lt;/td&gt; &lt;td&gt;5.498956&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;5.240237&lt;/td&gt; &lt;td&gt;2.062261&lt;/td&gt; &lt;td&gt;2.734378&lt;/td&gt; &lt;td&gt;6.055141&lt;/td&gt; &lt;td&gt;2.997684&lt;/td&gt; &lt;td&gt;2.519301&lt;/td&gt; &lt;td&gt;7.889700&lt;/td&gt; &lt;td&gt;6.944722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.839670&lt;/td&gt; &lt;td&gt;3.379315&lt;/td&gt; &lt;td&gt;3.231582&lt;/td&gt; &lt;td&gt;6.255944&lt;/td&gt; &lt;td&gt;3.759509&lt;/td&gt; &lt;td&gt;1.347830&lt;/td&gt; &lt;td&gt;8.707303&lt;/td&gt; &lt;td&gt;4.376033&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.398354&lt;/td&gt; &lt;td&gt;2.062261&lt;/td&gt; &lt;td&gt;2.634076&lt;/td&gt; &lt;td&gt;4.296810&lt;/td&gt; &lt;td&gt;2.997684&lt;/td&gt; &lt;td&gt;1.116547&lt;/td&gt; &lt;td&gt;7.889700&lt;/td&gt; &lt;td&gt;4.376033&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;6.811520&lt;/td&gt; &lt;td&gt;3.411846&lt;/td&gt; &lt;td&gt;3.231582&lt;/td&gt; &lt;td&gt;6.431644&lt;/td&gt; &lt;td&gt;5.469152&lt;/td&gt; &lt;td&gt;2.519301&lt;/td&gt; &lt;td&gt;18.039617&lt;/td&gt; &lt;td&gt;6.944722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.047378&lt;/td&gt; &lt;td&gt;2.784788&lt;/td&gt; &lt;td&gt;2.914839&lt;/td&gt; &lt;td&gt;5.540549&lt;/td&gt; &lt;td&gt;4.334337&lt;/td&gt; &lt;td&gt;1.816430&lt;/td&gt; &lt;td&gt;10.335600&lt;/td&gt; &lt;td&gt;5.704745&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;100 GB Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;0M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;387,890.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;433,066.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;409,856.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;91.541000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:19&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:47&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:19&lt;/td&gt; &lt;td&gt;0:01:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:16&lt;/td&gt; &lt;td&gt;0:01:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:17&lt;/td&gt; &lt;td&gt;0:01:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:16&lt;/td&gt; &lt;td&gt;0:01:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:20&lt;/td&gt; &lt;td&gt;0:01:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:19&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:22&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 15:07:47&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:45&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:59&lt;/td&gt; &lt;td&gt;0:00:14&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:49&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:02&lt;/td&gt; &lt;td&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:02&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:17&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:17&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:29&lt;/td&gt; &lt;td&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:29&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:45&lt;/td&gt; &lt;td&gt;0:00:16&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.081986&lt;/td&gt; &lt;td&gt;0.208487&lt;/td&gt; &lt;td&gt;0.902462&lt;/td&gt; &lt;td&gt;0.313160&lt;/td&gt; &lt;td&gt;1.312273&lt;/td&gt; &lt;td&gt;0.493157&lt;/td&gt; &lt;td&gt;0.926629&lt;/td&gt; &lt;td&gt;0.786345&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2.755427&lt;/td&gt; &lt;td&gt;0.911578&lt;/td&gt; &lt;td&gt;3.618085&lt;/td&gt; &lt;td&gt;0.664407&lt;/td&gt; &lt;td&gt;3.740112&lt;/td&gt; &lt;td&gt;2.118189&lt;/td&gt; &lt;td&gt;4.738754&lt;/td&gt; &lt;td&gt;6.551446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.189612&lt;/td&gt; &lt;td&gt;0.957921&lt;/td&gt; &lt;td&gt;5.267355&lt;/td&gt; &lt;td&gt;2.152479&lt;/td&gt; &lt;td&gt;6.068005&lt;/td&gt; &lt;td&gt;1.263380&lt;/td&gt; &lt;td&gt;4.251842&lt;/td&gt; &lt;td&gt;3.620160&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;4.708834&lt;/td&gt; &lt;td&gt;0.981651&lt;/td&gt; &lt;td&gt;2.411839&lt;/td&gt; &lt;td&gt;0.790955&lt;/td&gt; &lt;td&gt;4.384516&lt;/td&gt; &lt;td&gt;1.322670&lt;/td&gt; &lt;td&gt;2.641571&lt;/td&gt; &lt;td&gt;4.771831&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;3.739567&lt;/td&gt; &lt;td&gt;1.185884&lt;/td&gt; &lt;td&gt;2.863871&lt;/td&gt; &lt;td&gt;1.517891&lt;/td&gt; &lt;td&gt;5.946967&lt;/td&gt; &lt;td&gt;1.179960&lt;/td&gt; &lt;td&gt;3.840560&lt;/td&gt; &lt;td&gt;4.926325&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.258746&lt;/td&gt; &lt;td&gt;0.705228&lt;/td&gt; &lt;td&gt;3.460904&lt;/td&gt; &lt;td&gt;0.951328&lt;/td&gt; &lt;td&gt;4.530620&lt;/td&gt; &lt;td&gt;1.104500&lt;/td&gt; &lt;td&gt;3.226494&lt;/td&gt; &lt;td&gt;4.041142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;2.755427&lt;/td&gt; &lt;td&gt;0.705228&lt;/td&gt; &lt;td&gt;2.411839&lt;/td&gt; &lt;td&gt;0.664407&lt;/td&gt; &lt;td&gt;3.740112&lt;/td&gt; &lt;td&gt;1.104500&lt;/td&gt; &lt;td&gt;2.641571&lt;/td&gt; &lt;td&gt;3.620160&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.258746&lt;/td&gt; &lt;td&gt;1.185884&lt;/td&gt; &lt;td&gt;5.267355&lt;/td&gt; &lt;td&gt;2.152479&lt;/td&gt; &lt;td&gt;6.068005&lt;/td&gt; &lt;td&gt;2.118189&lt;/td&gt; &lt;td&gt;4.738754&lt;/td&gt; &lt;td&gt;6.551446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.130437&lt;/td&gt; &lt;td&gt;0.948452&lt;/td&gt; &lt;td&gt;3.524411&lt;/td&gt; &lt;td&gt;1.215412&lt;/td&gt; &lt;td&gt;4.934044&lt;/td&gt; &lt;td&gt;1.397740&lt;/td&gt; &lt;td&gt;3.739844&lt;/td&gt; &lt;td&gt;4.782181&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;3.226685&lt;/td&gt; &lt;td&gt;1.878227&lt;/td&gt; &lt;td&gt;1.802562&lt;/td&gt; &lt;td&gt;0.676499&lt;/td&gt; &lt;td&gt;3.145884&lt;/td&gt; &lt;td&gt;0.653129&lt;/td&gt; &lt;td&gt;0.963449&lt;/td&gt; &lt;td&gt;0.990524&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;8.842030&lt;/td&gt; &lt;td&gt;5.630466&lt;/td&gt; &lt;td&gt;5.728147&lt;/td&gt; &lt;td&gt;2.643227&lt;/td&gt; &lt;td&gt;9.615551&lt;/td&gt; &lt;td&gt;3.197855&lt;/td&gt; &lt;td&gt;4.676538&lt;/td&gt; &lt;td&gt;4.285251&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.508612&lt;/td&gt; &lt;td&gt;5.288044&lt;/td&gt; &lt;td&gt;4.319998&lt;/td&gt; &lt;td&gt;1.492915&lt;/td&gt; &lt;td&gt;9.431995&lt;/td&gt; &lt;td&gt;3.206360&lt;/td&gt; &lt;td&gt;3.859749&lt;/td&gt; &lt;td&gt;3.201996&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10.480224&lt;/td&gt; &lt;td&gt;5.880274&lt;/td&gt; &lt;td&gt;4.517320&lt;/td&gt; &lt;td&gt;2.509405&lt;/td&gt; &lt;td&gt;6.913159&lt;/td&gt; &lt;td&gt;2.892479&lt;/td&gt; &lt;td&gt;6.408602&lt;/td&gt; &lt;td&gt;2.938061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;8.824111&lt;/td&gt; &lt;td&gt;5.752413&lt;/td&gt; &lt;td&gt;5.997959&lt;/td&gt; &lt;td&gt;2.581237&lt;/td&gt; &lt;td&gt;8.954756&lt;/td&gt; &lt;td&gt;3.351951&lt;/td&gt; &lt;td&gt;2.420598&lt;/td&gt; &lt;td&gt;4.148455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.905553&lt;/td&gt; &lt;td&gt;7.099111&lt;/td&gt; &lt;td&gt;5.121041&lt;/td&gt; &lt;td&gt;2.516020&lt;/td&gt; &lt;td&gt;9.354924&lt;/td&gt; &lt;td&gt;3.955638&lt;/td&gt; &lt;td&gt;4.389209&lt;/td&gt; &lt;td&gt;3.818902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.905553&lt;/td&gt; &lt;td&gt;5.288044&lt;/td&gt; &lt;td&gt;4.319998&lt;/td&gt; &lt;td&gt;1.492915&lt;/td&gt; &lt;td&gt;6.913159&lt;/td&gt; &lt;td&gt;2.892479&lt;/td&gt; &lt;td&gt;2.420598&lt;/td&gt; &lt;td&gt;2.938061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;10.480224&lt;/td&gt; &lt;td&gt;7.099111&lt;/td&gt; &lt;td&gt;5.997959&lt;/td&gt; &lt;td&gt;2.643227&lt;/td&gt; &lt;td&gt;9.615551&lt;/td&gt; &lt;td&gt;3.955638&lt;/td&gt; &lt;td&gt;6.408602&lt;/td&gt; &lt;td&gt;4.285251&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.512106&lt;/td&gt; &lt;td&gt;5.930062&lt;/td&gt; &lt;td&gt;5.136893&lt;/td&gt; &lt;td&gt;2.348561&lt;/td&gt; &lt;td&gt;8.854077&lt;/td&gt; &lt;td&gt;3.320857&lt;/td&gt; &lt;td&gt;4.350939&lt;/td&gt; &lt;td&gt;3.678533&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.405338&lt;/td&gt; &lt;td&gt;0.868313&lt;/td&gt; &lt;td&gt;0.806277&lt;/td&gt; &lt;td&gt;1.123366&lt;/td&gt; &lt;td&gt;1.314028&lt;/td&gt; &lt;td&gt;0.233214&lt;/td&gt; &lt;td&gt;2.590459&lt;/td&gt; &lt;td&gt;1.230242&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.191045&lt;/td&gt; &lt;td&gt;3.171244&lt;/td&gt; &lt;td&gt;3.403836&lt;/td&gt; &lt;td&gt;4.604523&lt;/td&gt; &lt;td&gt;3.721133&lt;/td&gt; &lt;td&gt;0.892096&lt;/td&gt; &lt;td&gt;7.136841&lt;/td&gt; &lt;td&gt;6.500452&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;6.282687&lt;/td&gt; &lt;td&gt;2.845465&lt;/td&gt; &lt;td&gt;3.024786&lt;/td&gt; &lt;td&gt;4.086546&lt;/td&gt; &lt;td&gt;3.530743&lt;/td&gt; &lt;td&gt;0.619683&lt;/td&gt; &lt;td&gt;9.263671&lt;/td&gt; &lt;td&gt;4.826173&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;6.040787&lt;/td&gt; &lt;td&gt;2.659766&lt;/td&gt; &lt;td&gt;2.787273&lt;/td&gt; &lt;td&gt;6.210077&lt;/td&gt; &lt;td&gt;3.902190&lt;/td&gt; &lt;td&gt;2.175417&lt;/td&gt; &lt;td&gt;7.974860&lt;/td&gt; &lt;td&gt;6.689780&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.978721&lt;/td&gt; &lt;td&gt;2.542674&lt;/td&gt; &lt;td&gt;3.518783&lt;/td&gt; &lt;td&gt;4.385571&lt;/td&gt; &lt;td&gt;3.906211&lt;/td&gt; &lt;td&gt;0.918752&lt;/td&gt; &lt;td&gt;6.303352&lt;/td&gt; &lt;td&gt;5.139326&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.208600&lt;/td&gt; &lt;td&gt;3.761975&lt;/td&gt; &lt;td&gt;3.682886&lt;/td&gt; &lt;td&gt;7.874493&lt;/td&gt; &lt;td&gt;5.017600&lt;/td&gt; &lt;td&gt;2.087150&lt;/td&gt; &lt;td&gt;7.999074&lt;/td&gt; &lt;td&gt;7.978154&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.978721&lt;/td&gt; &lt;td&gt;2.542674&lt;/td&gt; &lt;td&gt;2.787273&lt;/td&gt; &lt;td&gt;4.086546&lt;/td&gt; &lt;td&gt;3.530743&lt;/td&gt; &lt;td&gt;0.619683&lt;/td&gt; &lt;td&gt;6.303352&lt;/td&gt; &lt;td&gt;4.826173&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;6.282687&lt;/td&gt; &lt;td&gt;3.761975&lt;/td&gt; &lt;td&gt;3.682886&lt;/td&gt; &lt;td&gt;7.874493&lt;/td&gt; &lt;td&gt;5.017600&lt;/td&gt; &lt;td&gt;2.175417&lt;/td&gt; &lt;td&gt;9.263671&lt;/td&gt; &lt;td&gt;7.978154&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.540368&lt;/td&gt; &lt;td&gt;2.996225&lt;/td&gt; &lt;td&gt;3.283513&lt;/td&gt; &lt;td&gt;5.432242&lt;/td&gt; &lt;td&gt;4.015575&lt;/td&gt; &lt;td&gt;1.338620&lt;/td&gt; &lt;td&gt;7.735560&lt;/td&gt; &lt;td&gt;6.226777&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;1000 GB Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;1000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;26M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;136,744.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;147,374.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@1000GB)&lt;/th&gt; &lt;td&gt;141,960.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;3,761.953000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 09:18:42&lt;/td&gt; &lt;td&gt;10/03/2014 09:34:12&lt;/td&gt; &lt;td&gt;0:15:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:42&lt;/td&gt; &lt;td&gt;1:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:14&lt;/td&gt; &lt;td&gt;1:02:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:25&lt;/td&gt; &lt;td&gt;1:02:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:33:31&lt;/td&gt; &lt;td&gt;0:58:48&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:26&lt;/td&gt; &lt;td&gt;1:00:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:28:00&lt;/td&gt; &lt;td&gt;0:53:17&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:42&lt;/td&gt; &lt;td&gt;1:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 09:18:42&lt;/td&gt; &lt;td&gt;10/03/2014 09:19:27&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 09:34:12&lt;/td&gt; &lt;td&gt;10/03/2014 09:34:42&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 09:43:03&lt;/td&gt; &lt;td&gt;10/03/2014 09:43:38&lt;/td&gt; &lt;td&gt;0:00:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 09:36:54&lt;/td&gt; &lt;td&gt;0:02:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 09:36:53&lt;/td&gt; &lt;td&gt;10/03/2014 09:38:39&lt;/td&gt; &lt;td&gt;0:01:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 09:38:39&lt;/td&gt; &lt;td&gt;10/03/2014 09:39:22&lt;/td&gt; &lt;td&gt;0:00:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 09:39:23&lt;/td&gt; &lt;td&gt;10/03/2014 09:41:09&lt;/td&gt; &lt;td&gt;0:01:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;10/03/2014 09:41:09&lt;/td&gt; &lt;td&gt;10/03/2014 09:42:15&lt;/td&gt; &lt;td&gt;0:01:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;10/03/2014 09:42:15&lt;/td&gt; &lt;td&gt;10/03/2014 09:43:02&lt;/td&gt; &lt;td&gt;0:00:47&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;104.488583&lt;/td&gt; &lt;td&gt;18.351559&lt;/td&gt; &lt;td&gt;24.631282&lt;/td&gt; &lt;td&gt;36.195531&lt;/td&gt; &lt;td&gt;36.319915&lt;/td&gt; &lt;td&gt;3.807790&lt;/td&gt; &lt;td&gt;22.750889&lt;/td&gt; &lt;td&gt;31.190630&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;209.323441&lt;/td&gt; &lt;td&gt;26.205435&lt;/td&gt; &lt;td&gt;59.637373&lt;/td&gt; &lt;td&gt;245.808484&lt;/td&gt; &lt;td&gt;60.699333&lt;/td&gt; &lt;td&gt;22.369379&lt;/td&gt; &lt;td&gt;289.435780&lt;/td&gt; &lt;td&gt;335.733425&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;109.134446&lt;/td&gt; &lt;td&gt;64.185831&lt;/td&gt; &lt;td&gt;96.131735&lt;/td&gt; &lt;td&gt;108.459418&lt;/td&gt; &lt;td&gt;310.273986&lt;/td&gt; &lt;td&gt;53.595127&lt;/td&gt; &lt;td&gt;152.242755&lt;/td&gt; &lt;td&gt;104.350098&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;73.321611&lt;/td&gt; &lt;td&gt;215.535408&lt;/td&gt; &lt;td&gt;69.543101&lt;/td&gt; &lt;td&gt;12.423757&lt;/td&gt; &lt;td&gt;64.445611&lt;/td&gt; &lt;td&gt;38.254747&lt;/td&gt; &lt;td&gt;122.952872&lt;/td&gt; &lt;td&gt;98.713213&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;110.875875&lt;/td&gt; &lt;td&gt;4.272757&lt;/td&gt; &lt;td&gt;78.697314&lt;/td&gt; &lt;td&gt;16.316807&lt;/td&gt; &lt;td&gt;59.746855&lt;/td&gt; &lt;td&gt;23.447211&lt;/td&gt; &lt;td&gt;353.190412&lt;/td&gt; &lt;td&gt;342.549908&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;41.972337&lt;/td&gt; &lt;td&gt;5.978707&lt;/td&gt; &lt;td&gt;60.784575&lt;/td&gt; &lt;td&gt;34.219229&lt;/td&gt; &lt;td&gt;42.372449&lt;/td&gt; &lt;td&gt;344.590640&lt;/td&gt; &lt;td&gt;146.186614&lt;/td&gt; &lt;td&gt;274.972270&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;115.760155&lt;/td&gt; &lt;td&gt;18.692078&lt;/td&gt; &lt;td&gt;58.493147&lt;/td&gt; &lt;td&gt;9.193234&lt;/td&gt; &lt;td&gt;49.831932&lt;/td&gt; &lt;td&gt;19.081395&lt;/td&gt; &lt;td&gt;60.603109&lt;/td&gt; &lt;td&gt;128.095501&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;58.601744&lt;/td&gt; &lt;td&gt;118.126585&lt;/td&gt; &lt;td&gt;297.327543&lt;/td&gt; &lt;td&gt;298.578268&lt;/td&gt; &lt;td&gt;714.284222&lt;/td&gt; &lt;td&gt;108.475250&lt;/td&gt; &lt;td&gt;91.868151&lt;/td&gt; &lt;td&gt;55.881029&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;41.972337&lt;/td&gt; &lt;td&gt;4.272757&lt;/td&gt; &lt;td&gt;58.493147&lt;/td&gt; &lt;td&gt;9.193234&lt;/td&gt; &lt;td&gt;42.372449&lt;/td&gt; &lt;td&gt;19.081395&lt;/td&gt; &lt;td&gt;60.603109&lt;/td&gt; &lt;td&gt;55.881029&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;209.323441&lt;/td&gt; &lt;td&gt;215.535408&lt;/td&gt; &lt;td&gt;297.327543&lt;/td&gt; &lt;td&gt;298.578268&lt;/td&gt; &lt;td&gt;714.284222&lt;/td&gt; &lt;td&gt;344.590640&lt;/td&gt; &lt;td&gt;353.190412&lt;/td&gt; &lt;td&gt;342.549908&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;102.712801&lt;/td&gt; &lt;td&gt;64.713829&lt;/td&gt; &lt;td&gt;102.944970&lt;/td&gt; &lt;td&gt;103.571314&lt;/td&gt; &lt;td&gt;185.950627&lt;/td&gt; &lt;td&gt;87.116250&lt;/td&gt; &lt;td&gt;173.782813&lt;/td&gt; &lt;td&gt;191.470778&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;41.777880&lt;/td&gt; &lt;td&gt;10.035063&lt;/td&gt; &lt;td&gt;16.125611&lt;/td&gt; &lt;td&gt;9.245638&lt;/td&gt; &lt;td&gt;209.443782&lt;/td&gt; &lt;td&gt;111.271310&lt;/td&gt; &lt;td&gt;37.821595&lt;/td&gt; &lt;td&gt;9.483838&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;244.243830&lt;/td&gt; &lt;td&gt;63.473338&lt;/td&gt; &lt;td&gt;207.741931&lt;/td&gt; &lt;td&gt;33.696956&lt;/td&gt; &lt;td&gt;561.057408&lt;/td&gt; &lt;td&gt;141.026049&lt;/td&gt; &lt;td&gt;126.818051&lt;/td&gt; &lt;td&gt;54.774792&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;189.297446&lt;/td&gt; &lt;td&gt;144.853756&lt;/td&gt; &lt;td&gt;56.292537&lt;/td&gt; &lt;td&gt;184.781273&lt;/td&gt; &lt;td&gt;501.330052&lt;/td&gt; &lt;td&gt;49.965102&lt;/td&gt; &lt;td&gt;107.736393&lt;/td&gt; &lt;td&gt;85.691079&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;231.060699&lt;/td&gt; &lt;td&gt;355.394713&lt;/td&gt; &lt;td&gt;43.483645&lt;/td&gt; &lt;td&gt;11.806590&lt;/td&gt; &lt;td&gt;555.445111&lt;/td&gt; &lt;td&gt;36.722686&lt;/td&gt; &lt;td&gt;251.241817&lt;/td&gt; &lt;td&gt;9.057850&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;227.371508&lt;/td&gt; &lt;td&gt;32.207115&lt;/td&gt; &lt;td&gt;108.880658&lt;/td&gt; &lt;td&gt;139.922550&lt;/td&gt; &lt;td&gt;532.697956&lt;/td&gt; &lt;td&gt;57.106583&lt;/td&gt; &lt;td&gt;159.198489&lt;/td&gt; &lt;td&gt;153.088913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;416.113856&lt;/td&gt; &lt;td&gt;108.689389&lt;/td&gt; &lt;td&gt;62.847727&lt;/td&gt; &lt;td&gt;702.712683&lt;/td&gt; &lt;td&gt;622.906487&lt;/td&gt; &lt;td&gt;58.198961&lt;/td&gt; &lt;td&gt;89.707091&lt;/td&gt; &lt;td&gt;85.614769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;228.019243&lt;/td&gt; &lt;td&gt;62.474213&lt;/td&gt; &lt;td&gt;88.227994&lt;/td&gt; &lt;td&gt;282.932978&lt;/td&gt; &lt;td&gt;432.387869&lt;/td&gt; &lt;td&gt;238.544027&lt;/td&gt; &lt;td&gt;61.486269&lt;/td&gt; &lt;td&gt;56.950548&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;230.564416&lt;/td&gt; &lt;td&gt;69.197517&lt;/td&gt; &lt;td&gt;130.708759&lt;/td&gt; &lt;td&gt;120.531103&lt;/td&gt; &lt;td&gt;551.112816&lt;/td&gt; &lt;td&gt;57.438478&lt;/td&gt; &lt;td&gt;82.256530&lt;/td&gt; &lt;td&gt;63.796403&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;189.297446&lt;/td&gt; &lt;td&gt;32.207115&lt;/td&gt; &lt;td&gt;43.483645&lt;/td&gt; &lt;td&gt;11.806590&lt;/td&gt; &lt;td&gt;432.387869&lt;/td&gt; &lt;td&gt;36.722686&lt;/td&gt; &lt;td&gt;61.486269&lt;/td&gt; &lt;td&gt;9.057850&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;416.113856&lt;/td&gt; &lt;td&gt;355.394713&lt;/td&gt; &lt;td&gt;207.741931&lt;/td&gt; &lt;td&gt;702.712683&lt;/td&gt; &lt;td&gt;622.906487&lt;/td&gt; &lt;td&gt;238.544027&lt;/td&gt; &lt;td&gt;251.241817&lt;/td&gt; &lt;td&gt;153.088913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;252.381571&lt;/td&gt; &lt;td&gt;119.470006&lt;/td&gt; &lt;td&gt;99.740464&lt;/td&gt; &lt;td&gt;210.912019&lt;/td&gt; &lt;td&gt;536.705386&lt;/td&gt; &lt;td&gt;91.285984&lt;/td&gt; &lt;td&gt;125.492091&lt;/td&gt; &lt;td&gt;72.710622&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;22.897349&lt;/td&gt; &lt;td&gt;47.870269&lt;/td&gt; &lt;td&gt;12.735580&lt;/td&gt; &lt;td&gt;25.982194&lt;/td&gt; &lt;td&gt;46.091766&lt;/td&gt; &lt;td&gt;6.623306&lt;/td&gt; &lt;td&gt;45.120559&lt;/td&gt; &lt;td&gt;30.016788&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;123.444839&lt;/td&gt; &lt;td&gt;22.212194&lt;/td&gt; &lt;td&gt;647.523826&lt;/td&gt; &lt;td&gt;97.431531&lt;/td&gt; &lt;td&gt;81.592165&lt;/td&gt; &lt;td&gt;4.573040&lt;/td&gt; &lt;td&gt;21.068225&lt;/td&gt; &lt;td&gt;14.486185&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;80.853865&lt;/td&gt; &lt;td&gt;622.651044&lt;/td&gt; &lt;td&gt;288.656211&lt;/td&gt; &lt;td&gt;336.409076&lt;/td&gt; &lt;td&gt;70.925079&lt;/td&gt; &lt;td&gt;33.578052&lt;/td&gt; &lt;td&gt;82.910543&lt;/td&gt; &lt;td&gt;48.001583&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;392.340812&lt;/td&gt; &lt;td&gt;84.967695&lt;/td&gt; &lt;td&gt;57.181935&lt;/td&gt; &lt;td&gt;473.720060&lt;/td&gt; &lt;td&gt;497.262620&lt;/td&gt; &lt;td&gt;66.966740&lt;/td&gt; &lt;td&gt;54.778284&lt;/td&gt; &lt;td&gt;50.940094&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;97.069440&lt;/td&gt; &lt;td&gt;301.705125&lt;/td&gt; &lt;td&gt;338.035788&lt;/td&gt; &lt;td&gt;258.992426&lt;/td&gt; &lt;td&gt;103.699408&lt;/td&gt; &lt;td&gt;28.750257&lt;/td&gt; &lt;td&gt;23.858757&lt;/td&gt; &lt;td&gt;13.626079&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;69.882110&lt;/td&gt; &lt;td&gt;34.277914&lt;/td&gt; &lt;td&gt;146.031938&lt;/td&gt; &lt;td&gt;179.656129&lt;/td&gt; &lt;td&gt;104.788154&lt;/td&gt; &lt;td&gt;10.836148&lt;/td&gt; &lt;td&gt;54.319823&lt;/td&gt; &lt;td&gt;52.077352&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;141.310431&lt;/td&gt; &lt;td&gt;247.242904&lt;/td&gt; &lt;td&gt;94.392791&lt;/td&gt; &lt;td&gt;702.775460&lt;/td&gt; &lt;td&gt;80.142930&lt;/td&gt; &lt;td&gt;19.969889&lt;/td&gt; &lt;td&gt;46.027410&lt;/td&gt; &lt;td&gt;19.136271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;89.018281&lt;/td&gt; &lt;td&gt;51.105998&lt;/td&gt; &lt;td&gt;281.234432&lt;/td&gt; &lt;td&gt;79.046122&lt;/td&gt; &lt;td&gt;84.341517&lt;/td&gt; &lt;td&gt;26.221892&lt;/td&gt; &lt;td&gt;33.169666&lt;/td&gt; &lt;td&gt;13.309634&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;69.882110&lt;/td&gt; &lt;td&gt;22.212194&lt;/td&gt; &lt;td&gt;57.181935&lt;/td&gt; &lt;td&gt;79.046122&lt;/td&gt; &lt;td&gt;70.925079&lt;/td&gt; &lt;td&gt;4.573040&lt;/td&gt; &lt;td&gt;21.068225&lt;/td&gt; &lt;td&gt;13.309634&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;392.340812&lt;/td&gt; &lt;td&gt;622.651044&lt;/td&gt; &lt;td&gt;647.523826&lt;/td&gt; &lt;td&gt;702.775460&lt;/td&gt; &lt;td&gt;497.262620&lt;/td&gt; &lt;td&gt;66.966740&lt;/td&gt; &lt;td&gt;82.910543&lt;/td&gt; &lt;td&gt;52.077352&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;141.988540&lt;/td&gt; &lt;td&gt;194.880411&lt;/td&gt; &lt;td&gt;264.722417&lt;/td&gt; &lt;td&gt;304.004401&lt;/td&gt; &lt;td&gt;146.107410&lt;/td&gt; &lt;td&gt;27.270860&lt;/td&gt; &lt;td&gt;45.161815&lt;/td&gt; &lt;td&gt;30.225314&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;1000 GB Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;1000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;26M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;199,652.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;125,161.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@1000GB)&lt;/th&gt; &lt;td&gt;158,078.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;4,429.608000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 10:37:29&lt;/td&gt; &lt;td&gt;10/03/2014 10:52:26&lt;/td&gt; &lt;td&gt;0:14:57&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:19&lt;/td&gt; &lt;td&gt;1:12:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:06:25&lt;/td&gt; &lt;td&gt;1:13:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:03:08&lt;/td&gt; &lt;td&gt;1:10:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:20&lt;/td&gt; &lt;td&gt;1:12:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 11:57:40&lt;/td&gt; &lt;td&gt;1:05:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:28&lt;/td&gt; &lt;td&gt;1:12:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:25&lt;/td&gt; &lt;td&gt;1:12:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 10:37:29&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:52&lt;/td&gt; &lt;td&gt;0:00:23&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 10:52:25&lt;/td&gt; &lt;td&gt;10/03/2014 10:52:34&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 11:01:44&lt;/td&gt; &lt;td&gt;10/03/2014 11:02:29&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 10:54:50&lt;/td&gt; &lt;td&gt;0:02:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 10:54:50&lt;/td&gt; &lt;td&gt;10/03/2014 10:57:02&lt;/td&gt; &lt;td&gt;0:02:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 10:57:05&lt;/td&gt; &lt;td&gt;10/03/2014 10:58:47&lt;/td&gt; &lt;td&gt;0:01:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 10:58:47&lt;/td&gt; &lt;td&gt;10/03/2014 10:59:46&lt;/td&gt; &lt;td&gt;0:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;10/03/2014 10:59:45&lt;/td&gt; &lt;td&gt;10/03/2014 11:00:38&lt;/td&gt; &lt;td&gt;0:00:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;10/03/2014 11:00:39&lt;/td&gt; &lt;td&gt;10/03/2014 11:01:44&lt;/td&gt; &lt;td&gt;0:01:05&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;34.105419&lt;/td&gt; &lt;td&gt;1.439089&lt;/td&gt; &lt;td&gt;9.802183&lt;/td&gt; &lt;td&gt;2.033956&lt;/td&gt; &lt;td&gt;10.525742&lt;/td&gt; &lt;td&gt;3.356152&lt;/td&gt; &lt;td&gt;23.953729&lt;/td&gt; &lt;td&gt;36.199533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;26.598252&lt;/td&gt; &lt;td&gt;150.572833&lt;/td&gt; &lt;td&gt;41.930330&lt;/td&gt; &lt;td&gt;86.870320&lt;/td&gt; &lt;td&gt;50.604856&lt;/td&gt; &lt;td&gt;201.001372&lt;/td&gt; &lt;td&gt;61.638366&lt;/td&gt; &lt;td&gt;244.013359&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;50.129895&lt;/td&gt; &lt;td&gt;102.219282&lt;/td&gt; &lt;td&gt;12.380935&lt;/td&gt; &lt;td&gt;102.319615&lt;/td&gt; &lt;td&gt;62.577229&lt;/td&gt; &lt;td&gt;43.454392&lt;/td&gt; &lt;td&gt;891.076608&lt;/td&gt; &lt;td&gt;407.640626&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;269.947278&lt;/td&gt; &lt;td&gt;53.172724&lt;/td&gt; &lt;td&gt;54.649973&lt;/td&gt; &lt;td&gt;11.460062&lt;/td&gt; &lt;td&gt;66.695722&lt;/td&gt; &lt;td&gt;17.336698&lt;/td&gt; &lt;td&gt;63.371232&lt;/td&gt; &lt;td&gt;91.158050&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;41.149221&lt;/td&gt; &lt;td&gt;22.520836&lt;/td&gt; &lt;td&gt;28.707973&lt;/td&gt; &lt;td&gt;509.984321&lt;/td&gt; &lt;td&gt;68.916549&lt;/td&gt; &lt;td&gt;17.525025&lt;/td&gt; &lt;td&gt;702.191490&lt;/td&gt; &lt;td&gt;666.450230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;59.179045&lt;/td&gt; &lt;td&gt;30.734442&lt;/td&gt; &lt;td&gt;99.504351&lt;/td&gt; &lt;td&gt;11.145990&lt;/td&gt; &lt;td&gt;101.334340&lt;/td&gt; &lt;td&gt;21.660836&lt;/td&gt; &lt;td&gt;74.625589&lt;/td&gt; &lt;td&gt;535.160207&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;225.105215&lt;/td&gt; &lt;td&gt;55.567328&lt;/td&gt; &lt;td&gt;46.749707&lt;/td&gt; &lt;td&gt;554.474507&lt;/td&gt; &lt;td&gt;215.657091&lt;/td&gt; &lt;td&gt;54.362551&lt;/td&gt; &lt;td&gt;72.960653&lt;/td&gt; &lt;td&gt;442.194302&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;220.993226&lt;/td&gt; &lt;td&gt;28.528230&lt;/td&gt; &lt;td&gt;47.543365&lt;/td&gt; &lt;td&gt;336.191006&lt;/td&gt; &lt;td&gt;308.931194&lt;/td&gt; &lt;td&gt;9.767397&lt;/td&gt; &lt;td&gt;850.258452&lt;/td&gt; &lt;td&gt;66.121298&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;26.598252&lt;/td&gt; &lt;td&gt;22.520836&lt;/td&gt; &lt;td&gt;12.380935&lt;/td&gt; &lt;td&gt;11.145990&lt;/td&gt; &lt;td&gt;50.604856&lt;/td&gt; &lt;td&gt;9.767397&lt;/td&gt; &lt;td&gt;61.638366&lt;/td&gt; &lt;td&gt;66.121298&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;269.947278&lt;/td&gt; &lt;td&gt;150.572833&lt;/td&gt; &lt;td&gt;99.504351&lt;/td&gt; &lt;td&gt;554.474507&lt;/td&gt; &lt;td&gt;308.931194&lt;/td&gt; &lt;td&gt;201.001372&lt;/td&gt; &lt;td&gt;891.076608&lt;/td&gt; &lt;td&gt;666.450230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;127.586019&lt;/td&gt; &lt;td&gt;63.330811&lt;/td&gt; &lt;td&gt;47.352376&lt;/td&gt; &lt;td&gt;230.349403&lt;/td&gt; &lt;td&gt;124.959569&lt;/td&gt; &lt;td&gt;52.158324&lt;/td&gt; &lt;td&gt;388.017484&lt;/td&gt; &lt;td&gt;350.391153&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;50.439615&lt;/td&gt; &lt;td&gt;9.287196&lt;/td&gt; &lt;td&gt;15.892947&lt;/td&gt; &lt;td&gt;7.112715&lt;/td&gt; &lt;td&gt;250.527755&lt;/td&gt; &lt;td&gt;131.478131&lt;/td&gt; &lt;td&gt;54.458992&lt;/td&gt; &lt;td&gt;10.525842&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;420.919329&lt;/td&gt; &lt;td&gt;317.402771&lt;/td&gt; &lt;td&gt;101.818338&lt;/td&gt; &lt;td&gt;403.213385&lt;/td&gt; &lt;td&gt;724.539887&lt;/td&gt; &lt;td&gt;160.669174&lt;/td&gt; &lt;td&gt;65.374584&lt;/td&gt; &lt;td&gt;28.563034&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;464.378760&lt;/td&gt; &lt;td&gt;210.938167&lt;/td&gt; &lt;td&gt;23.395678&lt;/td&gt; &lt;td&gt;545.086468&lt;/td&gt; &lt;td&gt;736.005716&lt;/td&gt; &lt;td&gt;54.680686&lt;/td&gt; &lt;td&gt;398.880053&lt;/td&gt; &lt;td&gt;34.018918&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;350.083270&lt;/td&gt; &lt;td&gt;321.781561&lt;/td&gt; &lt;td&gt;48.652019&lt;/td&gt; &lt;td&gt;435.954962&lt;/td&gt; &lt;td&gt;378.872739&lt;/td&gt; &lt;td&gt;100.588804&lt;/td&gt; &lt;td&gt;289.350342&lt;/td&gt; &lt;td&gt;190.140640&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;306.265994&lt;/td&gt; &lt;td&gt;249.621982&lt;/td&gt; &lt;td&gt;79.280220&lt;/td&gt; &lt;td&gt;221.255121&lt;/td&gt; &lt;td&gt;348.932746&lt;/td&gt; &lt;td&gt;49.555802&lt;/td&gt; &lt;td&gt;100.062439&lt;/td&gt; &lt;td&gt;61.368814&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;511.923087&lt;/td&gt; &lt;td&gt;133.018420&lt;/td&gt; &lt;td&gt;134.199065&lt;/td&gt; &lt;td&gt;9.655693&lt;/td&gt; &lt;td&gt;662.658830&lt;/td&gt; &lt;td&gt;104.380635&lt;/td&gt; &lt;td&gt;82.847242&lt;/td&gt; &lt;td&gt;59.952271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;578.362701&lt;/td&gt; &lt;td&gt;61.221715&lt;/td&gt; &lt;td&gt;145.613349&lt;/td&gt; &lt;td&gt;47.957006&lt;/td&gt; &lt;td&gt;621.993889&lt;/td&gt; &lt;td&gt;256.150595&lt;/td&gt; &lt;td&gt;77.124777&lt;/td&gt; &lt;td&gt;91.163005&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;418.450091&lt;/td&gt; &lt;td&gt;391.818564&lt;/td&gt; &lt;td&gt;29.360218&lt;/td&gt; &lt;td&gt;17.236628&lt;/td&gt; &lt;td&gt;761.850888&lt;/td&gt; &lt;td&gt;31.952329&lt;/td&gt; &lt;td&gt;50.393082&lt;/td&gt; &lt;td&gt;27.530882&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;306.265994&lt;/td&gt; &lt;td&gt;61.221715&lt;/td&gt; &lt;td&gt;23.395678&lt;/td&gt; &lt;td&gt;9.655693&lt;/td&gt; &lt;td&gt;348.932746&lt;/td&gt; &lt;td&gt;31.952329&lt;/td&gt; &lt;td&gt;50.393082&lt;/td&gt; &lt;td&gt;27.530882&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;578.362701&lt;/td&gt; &lt;td&gt;391.818564&lt;/td&gt; &lt;td&gt;145.613349&lt;/td&gt; &lt;td&gt;545.086468&lt;/td&gt; &lt;td&gt;761.850888&lt;/td&gt; &lt;td&gt;256.150595&lt;/td&gt; &lt;td&gt;398.880053&lt;/td&gt; &lt;td&gt;190.140640&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;435.769033&lt;/td&gt; &lt;td&gt;240.829026&lt;/td&gt; &lt;td&gt;80.331270&lt;/td&gt; &lt;td&gt;240.051323&lt;/td&gt; &lt;td&gt;604.979242&lt;/td&gt; &lt;td&gt;108.282575&lt;/td&gt; &lt;td&gt;152.004646&lt;/td&gt; &lt;td&gt;70.391081&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;22.444111&lt;/td&gt; &lt;td&gt;37.978532&lt;/td&gt; &lt;td&gt;13.347320&lt;/td&gt; &lt;td&gt;26.553364&lt;/td&gt; &lt;td&gt;115.511143&lt;/td&gt; &lt;td&gt;7.670304&lt;/td&gt; &lt;td&gt;22.771613&lt;/td&gt; &lt;td&gt;8.761026&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;329.153807&lt;/td&gt; &lt;td&gt;19.198590&lt;/td&gt; &lt;td&gt;258.455295&lt;/td&gt; &lt;td&gt;556.256015&lt;/td&gt; &lt;td&gt;99.647793&lt;/td&gt; &lt;td&gt;14.878746&lt;/td&gt; &lt;td&gt;32.803289&lt;/td&gt; &lt;td&gt;8.771923&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;76.940373&lt;/td&gt; &lt;td&gt;74.916489&lt;/td&gt; &lt;td&gt;75.246897&lt;/td&gt; &lt;td&gt;16.035355&lt;/td&gt; &lt;td&gt;14.403643&lt;/td&gt; &lt;td&gt;32.348500&lt;/td&gt; &lt;td&gt;91.981362&lt;/td&gt; &lt;td&gt;41.426540&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;88.918404&lt;/td&gt; &lt;td&gt;238.858707&lt;/td&gt; &lt;td&gt;221.257060&lt;/td&gt; &lt;td&gt;688.441713&lt;/td&gt; &lt;td&gt;247.669761&lt;/td&gt; &lt;td&gt;5.345632&lt;/td&gt; &lt;td&gt;70.780594&lt;/td&gt; &lt;td&gt;49.352955&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;497.105081&lt;/td&gt; &lt;td&gt;167.874781&lt;/td&gt; &lt;td&gt;67.668514&lt;/td&gt; &lt;td&gt;76.820831&lt;/td&gt; &lt;td&gt;78.585717&lt;/td&gt; &lt;td&gt;3.655421&lt;/td&gt; &lt;td&gt;73.165786&lt;/td&gt; &lt;td&gt;29.401670&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;309.991618&lt;/td&gt; &lt;td&gt;123.023557&lt;/td&gt; &lt;td&gt;380.801141&lt;/td&gt; &lt;td&gt;347.055909&lt;/td&gt; &lt;td&gt;93.478502&lt;/td&gt; &lt;td&gt;18.351491&lt;/td&gt; &lt;td&gt;33.338814&lt;/td&gt; &lt;td&gt;12.557542&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;57.200926&lt;/td&gt; &lt;td&gt;154.489850&lt;/td&gt; &lt;td&gt;386.007137&lt;/td&gt; &lt;td&gt;103.558355&lt;/td&gt; &lt;td&gt;32.676369&lt;/td&gt; &lt;td&gt;92.863316&lt;/td&gt; &lt;td&gt;35.576966&lt;/td&gt; &lt;td&gt;14.061801&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;160.332088&lt;/td&gt; &lt;td&gt;46.934177&lt;/td&gt; &lt;td&gt;340.957970&lt;/td&gt; &lt;td&gt;84.479720&lt;/td&gt; &lt;td&gt;78.985110&lt;/td&gt; &lt;td&gt;60.568796&lt;/td&gt; &lt;td&gt;44.362737&lt;/td&gt; &lt;td&gt;8.831746&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;57.200926&lt;/td&gt; &lt;td&gt;19.198590&lt;/td&gt; &lt;td&gt;67.668514&lt;/td&gt; &lt;td&gt;16.035355&lt;/td&gt; &lt;td&gt;14.403643&lt;/td&gt; &lt;td&gt;3.655421&lt;/td&gt; &lt;td&gt;32.803289&lt;/td&gt; &lt;td&gt;8.771923&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;497.105081&lt;/td&gt; &lt;td&gt;238.858707&lt;/td&gt; &lt;td&gt;386.007137&lt;/td&gt; &lt;td&gt;688.441713&lt;/td&gt; &lt;td&gt;247.669761&lt;/td&gt; &lt;td&gt;92.863316&lt;/td&gt; &lt;td&gt;91.981362&lt;/td&gt; &lt;td&gt;49.352955&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;217.091757&lt;/td&gt; &lt;td&gt;117.899450&lt;/td&gt; &lt;td&gt;247.199145&lt;/td&gt; &lt;td&gt;267.521128&lt;/td&gt; &lt;td&gt;92.206699&lt;/td&gt; &lt;td&gt;32.573129&lt;/td&gt; &lt;td&gt;54.572793&lt;/td&gt; &lt;td&gt;23.486311&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab52abc0b8&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aab53935178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aab537ea348&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aab516a28b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab514b53d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aaba8e12aa8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aab537ea308&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaba97e18d8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aab52a6add8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaba9725b78&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab51109e68&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aaba97e1898&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aab51a706a8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aaba97e18b8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aaba9725b98&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab52abc098&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab5130e068&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aab52979f88&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac04bdd538&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:08:38.906994-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 20 of n): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-10-06#1824</atom:id>
  <atom:published>2014-10-06T17:53:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab51a32ce8&quot;&gt;introduction to scale out&lt;/a&gt; piece, I promised to address the matter of data-to-memory ratio, and to talk about when scale-out makes sense. Here we will see that scale-out makes sense whenever data does not fit in memory on a single commodity server. The gains in processing power are immediate, even when going from one box to just two, with both systems having all in memory.&lt;/p&gt; &lt;p&gt;As an initial take on the issue we run 100 GB and 1000 GB on the test system. 100 GB is trivially in memory, 1000 GB is not, as the memory is 384 GB total, of which 360 GB may be used for the processes.&lt;/p&gt; &lt;p&gt;We run 2 workloads on the 100 GB database, having pre-loaded the data in memory:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;run&lt;/th&gt; &lt;th&gt;power&lt;/th&gt; &lt;th&gt;throughput&lt;/th&gt; &lt;th&gt;composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1&lt;/th&gt; &lt;td&gt;349,027.7&lt;/td&gt; &lt;td&gt;420,503.1&lt;/td&gt; &lt;td&gt;383,102.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2&lt;/th&gt; &lt;td&gt;387,890.3&lt;/td&gt; &lt;td&gt;433,066.6&lt;/td&gt; &lt;td&gt;409,856.5&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;This is directly comparable to the 100 GB single-server results. Comparing the second runs, we see a 1.53x gain in power and a 1.8x gain in throughput from 2x the platform. This is fully on the level for a workload that is not trivially parallel, as we have seen in the previous articles. The difference between the first and second runs at 100 GB comes, for both single-server and cluster, from the latency of allocating transient query memory. For an official run, where the weakest link is the first power test, this would simply have to be pre-allocated.&lt;/p&gt; &lt;p&gt;We run 2 workloads on the 1000 GB database, starting from cold.&lt;/p&gt; &lt;p&gt;The result is:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;run&lt;/th&gt; &lt;th&gt;power&lt;/th&gt; &lt;th&gt;throughput&lt;/th&gt; &lt;th&gt;composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1&lt;/th&gt; &lt;td&gt;136,744.5&lt;/td&gt; &lt;td&gt;147,374.6&lt;/td&gt; &lt;td&gt;141,960.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2&lt;/th&gt; &lt;td&gt;199,652.0&lt;/td&gt; &lt;td&gt;125,161.1&lt;/td&gt; &lt;td&gt;158,078.0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The 1000 GB result is not for competition with this platform; more memory would be needed. For actual applications, the numbers are still in the usable range, though.&lt;/p&gt; &lt;p&gt;The 1000 GB setup uses 4 SSDs for storage, one per server process. The server processes are each bound to their own physical CPU.&lt;/p&gt; &lt;p&gt;We look at the meters: 32M pages (8M per process) are in memory at each time. Over the 2 benchmark executions there are a total of 494M disk reads. The total CPU time is 165,674 seconds of CPU, of which about 10% are system, over 10,063 seconds of real-time. Cumulative disk-read wait-time is 130,177 s. This gives an average disk read throughput of 384 MB/s.&lt;/p&gt; &lt;p&gt;This is easily sustained by 4 SSDs; in practice, the maximum throughput we see for reading is 1 GB/s (256 MB/s per SSD). Newer SSDs would do maybe twice that. Using rotating media would not be an option.&lt;/p&gt; &lt;p&gt;Without the drop in CPU caused by waiting for SSD, we would have numbers very close to the 100 GB numbers. &lt;/p&gt; &lt;p&gt;The interconnect traffic for the two runs was 1,077 GB with no message compression. The write block time was 448 seconds of thread-time. So we see that blocking on write hurts platform utilization when running under optimal conditions, but compared to going to secondary storage, it is not a large factor.&lt;/p&gt; &lt;p&gt;The 1000 GB scale has a transient peak memory consumption of 42 GB. This consists of hash-join build sides and GROUP BYs. The greatest memory consumers are Q9 with 9 GB, Q13 with 11 GB, and Q16 with 7 GB. Having many of these at a time drives up the transient peak. The peak gets higher as the scale grows, also because a larger scale requires more concurrent query streams. At the 384 GB for 1000 GB ratio, we do not yet get into memory saving plans like hash joins in many passes or index use instead of hash. When the data size grows, replicated hash build sides will become less convenient, and communication will increase. Q9 and Q13 can be done by index with almost no transient memory, but these plans are easily 3x less efficient for CPU. These will probably help at 3000 GB and be necessary at least part of the time at 10,000 GB.&lt;/p&gt; &lt;p&gt;The I/O volume in MB per index over the 2 executions is:&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr style=&quot;text-align:center;&quot;&gt; &lt;th&gt;index&lt;/th&gt; &lt;th&gt;MB&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;LINEITEM&lt;/code&gt; &lt;/th&gt; &lt;td&gt;1,987,483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;ORDERS&lt;/code&gt; &lt;/th&gt; &lt;td&gt;1,440,526&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;PARTSUPP&lt;/code&gt; &lt;/th&gt; &lt;td&gt;199,335&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;PART&lt;/code&gt; &lt;/th&gt; &lt;td&gt;161,717&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;CUSTOMER&lt;/code&gt; &lt;/th&gt; &lt;td&gt;43,276&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;O_CK&lt;/code&gt; &lt;/th&gt; &lt;td&gt;19,085&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;code&gt;SUPPLIER&lt;/code&gt; &lt;/th&gt; &lt;td&gt;13,393&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Of this, maybe 600 GB could be saved by stream compressing &lt;code&gt;o_comment&lt;/code&gt;. Otherwise this cannot be helped without adding memory. The &lt;code&gt;lineitem&lt;/code&gt; reads are mostly for &lt;code&gt;l_extendedprice&lt;/code&gt;, which is not compressible. If compressing &lt;code&gt;o_comment&lt;/code&gt; made &lt;code&gt;l_extendedprice&lt;/code&gt; always fit in memory, then there would be a radical drop in I/O. Also, as a matter of fact, the buffer management policy of least-recently-used works the very worst for big scans, specifically those of &lt;code&gt;l_extendedprice&lt;/code&gt;: If the head is replaced when reading the tail, and the next read starts from the head, then the whole table/column is read all over again. Caching policies that specially recognized scans of this sort could further reduce I/O. Clustering &lt;code&gt;lineitems&lt;/code&gt;/&lt;code&gt;orders&lt;/code&gt; on &lt;code&gt;date&lt;/code&gt;, as &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x2aab50f9b008&quot;&gt;Actian Vector&lt;/a&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aab51845d48&quot;&gt;TPC-H&lt;/a&gt; implementations do, also starts yielding a greater gain when not running from memory: One column (e.g., &lt;code&gt;l_shipdate&lt;/code&gt;) may be scanned for the whole table but, if the matches are bunched together, then most of &lt;code&gt;l_extendedprice&lt;/code&gt; will not be read at all. Still, if going for top ranks in the races, all will be from memory, or at least there will be SSDs with read throughput around 150 MB/s per core, so these tricks become relatively less important.&lt;/p&gt; &lt;p&gt;In the 100 GB numerical quantities summaries, we see much the same picture as in the single-server. Queries get faster, but their relative times are not radically different. The throughput test (many queries at a time) times are more or less multiples of the power (single user) times. This picture breaks at 1000 GB where I/O first drops the performance to under half and introduces huge variation in execution times within a single query. The time entirely depends on which queries are running along with or right before the execution and on whether these have the same or different working sets. All the streams have the same queries with different parameters, but the query order in each stream is different.&lt;/p&gt; &lt;p&gt;The numerical quantities follow for all the runs. Note that the first 1000 GB run is cold. A competition grade 1000 GB result can be made with double the memory, and the more CPU the better. We will try one at Amazon in a bit.&lt;/p&gt; &lt;p&gt; *** &lt;/p&gt; &lt;p&gt;The conclusion is that scale-out pays from the get-go. At present prices, a system with twice the power of a single node of the test system is cost effective. Scales of up to 500 GB are single commodity server, under $10K. Rather than going from a mid-to-large dual-socket box to a quad-socket box, one is likely to be better off having two cheaper dual-socket boxes. These are also readily available on clouds, whereas scale-up configurations are not. Onwards of 1 TB, a cluster is expected to clearly win. At 3 TB, a commodity cluster will clearly be the better deal for both price and absolute performance.&lt;/p&gt; &lt;h2&gt;100 GB Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;0M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;349,027.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;420,503.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;383,102.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;94.273000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:07&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:40&lt;/td&gt; &lt;td&gt;0:00:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:16&lt;/td&gt; &lt;td&gt;0:01:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:14&lt;/td&gt; &lt;td&gt;0:01:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:15&lt;/td&gt; &lt;td&gt;0:01:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:07&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:13&lt;/td&gt; &lt;td&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 15:05:41&lt;/td&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:03&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:05:42&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:06&lt;/td&gt; &lt;td&gt;0:00:24&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:06&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:20&lt;/td&gt; &lt;td&gt;0:00:14&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:20&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:35&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:06:35&lt;/td&gt; &lt;td&gt;10/03/2014 15:06:48&lt;/td&gt; &lt;td&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.045198&lt;/td&gt; &lt;td&gt;0.337315&lt;/td&gt; &lt;td&gt;1.129548&lt;/td&gt; &lt;td&gt;0.327029&lt;/td&gt; &lt;td&gt;1.230955&lt;/td&gt; &lt;td&gt;0.473090&lt;/td&gt; &lt;td&gt;0.979096&lt;/td&gt; &lt;td&gt;0.852639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;4.521951&lt;/td&gt; &lt;td&gt;0.596538&lt;/td&gt; &lt;td&gt;3.464342&lt;/td&gt; &lt;td&gt;1.167101&lt;/td&gt; &lt;td&gt;3.944699&lt;/td&gt; &lt;td&gt;1.744325&lt;/td&gt; &lt;td&gt;5.442328&lt;/td&gt; &lt;td&gt;4.706185&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.678728&lt;/td&gt; &lt;td&gt;0.837205&lt;/td&gt; &lt;td&gt;3.594060&lt;/td&gt; &lt;td&gt;1.911751&lt;/td&gt; &lt;td&gt;3.942459&lt;/td&gt; &lt;td&gt;0.947788&lt;/td&gt; &lt;td&gt;3.821267&lt;/td&gt; &lt;td&gt;4.686319&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;5.126384&lt;/td&gt; &lt;td&gt;0.932394&lt;/td&gt; &lt;td&gt;0.961762&lt;/td&gt; &lt;td&gt;1.043759&lt;/td&gt; &lt;td&gt;5.359990&lt;/td&gt; &lt;td&gt;1.035597&lt;/td&gt; &lt;td&gt;3.056079&lt;/td&gt; &lt;td&gt;5.803445&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.497118&lt;/td&gt; &lt;td&gt;0.381036&lt;/td&gt; &lt;td&gt;4.665412&lt;/td&gt; &lt;td&gt;1.224975&lt;/td&gt; &lt;td&gt;5.316591&lt;/td&gt; &lt;td&gt;1.666253&lt;/td&gt; &lt;td&gt;2.297872&lt;/td&gt; &lt;td&gt;6.425171&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.080968&lt;/td&gt; &lt;td&gt;0.493741&lt;/td&gt; &lt;td&gt;4.416305&lt;/td&gt; &lt;td&gt;0.879202&lt;/td&gt; &lt;td&gt;5.705877&lt;/td&gt; &lt;td&gt;1.615987&lt;/td&gt; &lt;td&gt;3.846881&lt;/td&gt; &lt;td&gt;3.346686&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.080968&lt;/td&gt; &lt;td&gt;0.381036&lt;/td&gt; &lt;td&gt;0.961762&lt;/td&gt; &lt;td&gt;0.879202&lt;/td&gt; &lt;td&gt;3.942459&lt;/td&gt; &lt;td&gt;0.947788&lt;/td&gt; &lt;td&gt;2.297872&lt;/td&gt; &lt;td&gt;3.346686&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.126384&lt;/td&gt; &lt;td&gt;0.932394&lt;/td&gt; &lt;td&gt;4.665412&lt;/td&gt; &lt;td&gt;1.911751&lt;/td&gt; &lt;td&gt;5.705877&lt;/td&gt; &lt;td&gt;1.744325&lt;/td&gt; &lt;td&gt;5.442328&lt;/td&gt; &lt;td&gt;6.425171&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.581030&lt;/td&gt; &lt;td&gt;0.648183&lt;/td&gt; &lt;td&gt;3.420376&lt;/td&gt; &lt;td&gt;1.245358&lt;/td&gt; &lt;td&gt;4.853923&lt;/td&gt; &lt;td&gt;1.401990&lt;/td&gt; &lt;td&gt;3.692885&lt;/td&gt; &lt;td&gt;4.993561&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;3.575916&lt;/td&gt; &lt;td&gt;2.786656&lt;/td&gt; &lt;td&gt;1.579488&lt;/td&gt; &lt;td&gt;0.611454&lt;/td&gt; &lt;td&gt;3.132460&lt;/td&gt; &lt;td&gt;0.685095&lt;/td&gt; &lt;td&gt;0.955559&lt;/td&gt; &lt;td&gt;1.060110&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.551437&lt;/td&gt; &lt;td&gt;7.187181&lt;/td&gt; &lt;td&gt;5.816455&lt;/td&gt; &lt;td&gt;2.004946&lt;/td&gt; &lt;td&gt;9.461347&lt;/td&gt; &lt;td&gt;5.624020&lt;/td&gt; &lt;td&gt;5.517677&lt;/td&gt; &lt;td&gt;2.924265&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.637427&lt;/td&gt; &lt;td&gt;6.641804&lt;/td&gt; &lt;td&gt;6.359532&lt;/td&gt; &lt;td&gt;2.412576&lt;/td&gt; &lt;td&gt;8.819754&lt;/td&gt; &lt;td&gt;3.335494&lt;/td&gt; &lt;td&gt;4.549792&lt;/td&gt; &lt;td&gt;3.163920&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;11.041451&lt;/td&gt; &lt;td&gt;6.464479&lt;/td&gt; &lt;td&gt;6.982671&lt;/td&gt; &lt;td&gt;3.272975&lt;/td&gt; &lt;td&gt;8.342983&lt;/td&gt; &lt;td&gt;3.448635&lt;/td&gt; &lt;td&gt;4.405911&lt;/td&gt; &lt;td&gt;2.886393&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;8.860228&lt;/td&gt; &lt;td&gt;6.754529&lt;/td&gt; &lt;td&gt;7.065501&lt;/td&gt; &lt;td&gt;3.225236&lt;/td&gt; &lt;td&gt;8.789565&lt;/td&gt; &lt;td&gt;3.419165&lt;/td&gt; &lt;td&gt;4.240718&lt;/td&gt; &lt;td&gt;2.399092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;7.339672&lt;/td&gt; &lt;td&gt;8.121027&lt;/td&gt; &lt;td&gt;6.261988&lt;/td&gt; &lt;td&gt;2.711946&lt;/td&gt; &lt;td&gt;8.764934&lt;/td&gt; &lt;td&gt;3.106366&lt;/td&gt; &lt;td&gt;6.544712&lt;/td&gt; &lt;td&gt;3.472092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.339672&lt;/td&gt; &lt;td&gt;6.464479&lt;/td&gt; &lt;td&gt;5.816455&lt;/td&gt; &lt;td&gt;2.004946&lt;/td&gt; &lt;td&gt;8.342983&lt;/td&gt; &lt;td&gt;3.106366&lt;/td&gt; &lt;td&gt;4.240718&lt;/td&gt; &lt;td&gt;2.399092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;11.041451&lt;/td&gt; &lt;td&gt;8.121027&lt;/td&gt; &lt;td&gt;7.065501&lt;/td&gt; &lt;td&gt;3.272975&lt;/td&gt; &lt;td&gt;9.461347&lt;/td&gt; &lt;td&gt;5.624020&lt;/td&gt; &lt;td&gt;6.544712&lt;/td&gt; &lt;td&gt;3.472092&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;9.286043&lt;/td&gt; &lt;td&gt;7.033804&lt;/td&gt; &lt;td&gt;6.497229&lt;/td&gt; &lt;td&gt;2.725536&lt;/td&gt; &lt;td&gt;8.835717&lt;/td&gt; &lt;td&gt;3.786736&lt;/td&gt; &lt;td&gt;5.051762&lt;/td&gt; &lt;td&gt;2.969152&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.433789&lt;/td&gt; &lt;td&gt;0.972152&lt;/td&gt; &lt;td&gt;0.780247&lt;/td&gt; &lt;td&gt;1.287222&lt;/td&gt; &lt;td&gt;1.360084&lt;/td&gt; &lt;td&gt;0.254051&lt;/td&gt; &lt;td&gt;6.201742&lt;/td&gt; &lt;td&gt;1.219707&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.398354&lt;/td&gt; &lt;td&gt;2.591249&lt;/td&gt; &lt;td&gt;3.021207&lt;/td&gt; &lt;td&gt;4.663204&lt;/td&gt; &lt;td&gt;4.775704&lt;/td&gt; &lt;td&gt;1.116547&lt;/td&gt; &lt;td&gt;8.770115&lt;/td&gt; &lt;td&gt;5.643550&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;6.811520&lt;/td&gt; &lt;td&gt;3.411846&lt;/td&gt; &lt;td&gt;2.634076&lt;/td&gt; &lt;td&gt;4.296810&lt;/td&gt; &lt;td&gt;4.669635&lt;/td&gt; &lt;td&gt;2.282003&lt;/td&gt; &lt;td&gt;18.039617&lt;/td&gt; &lt;td&gt;6.060465&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;4.947110&lt;/td&gt; &lt;td&gt;2.479268&lt;/td&gt; &lt;td&gt;2.952951&lt;/td&gt; &lt;td&gt;6.431644&lt;/td&gt; &lt;td&gt;5.469152&lt;/td&gt; &lt;td&gt;1.816467&lt;/td&gt; &lt;td&gt;8.271266&lt;/td&gt; &lt;td&gt;5.498956&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;5.240237&lt;/td&gt; &lt;td&gt;2.062261&lt;/td&gt; &lt;td&gt;2.734378&lt;/td&gt; &lt;td&gt;6.055141&lt;/td&gt; &lt;td&gt;2.997684&lt;/td&gt; &lt;td&gt;2.519301&lt;/td&gt; &lt;td&gt;7.889700&lt;/td&gt; &lt;td&gt;6.944722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.839670&lt;/td&gt; &lt;td&gt;3.379315&lt;/td&gt; &lt;td&gt;3.231582&lt;/td&gt; &lt;td&gt;6.255944&lt;/td&gt; &lt;td&gt;3.759509&lt;/td&gt; &lt;td&gt;1.347830&lt;/td&gt; &lt;td&gt;8.707303&lt;/td&gt; &lt;td&gt;4.376033&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.398354&lt;/td&gt; &lt;td&gt;2.062261&lt;/td&gt; &lt;td&gt;2.634076&lt;/td&gt; &lt;td&gt;4.296810&lt;/td&gt; &lt;td&gt;2.997684&lt;/td&gt; &lt;td&gt;1.116547&lt;/td&gt; &lt;td&gt;7.889700&lt;/td&gt; &lt;td&gt;4.376033&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;6.811520&lt;/td&gt; &lt;td&gt;3.411846&lt;/td&gt; &lt;td&gt;3.231582&lt;/td&gt; &lt;td&gt;6.431644&lt;/td&gt; &lt;td&gt;5.469152&lt;/td&gt; &lt;td&gt;2.519301&lt;/td&gt; &lt;td&gt;18.039617&lt;/td&gt; &lt;td&gt;6.944722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.047378&lt;/td&gt; &lt;td&gt;2.784788&lt;/td&gt; &lt;td&gt;2.914839&lt;/td&gt; &lt;td&gt;5.540549&lt;/td&gt; &lt;td&gt;4.334337&lt;/td&gt; &lt;td&gt;1.816430&lt;/td&gt; &lt;td&gt;10.335600&lt;/td&gt; &lt;td&gt;5.704745&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;100 GB Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;0M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;387,890.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;433,066.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;409,856.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;91.541000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:19&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:47&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:19&lt;/td&gt; &lt;td&gt;0:01:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:16&lt;/td&gt; &lt;td&gt;0:01:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:17&lt;/td&gt; &lt;td&gt;0:01:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:16&lt;/td&gt; &lt;td&gt;0:01:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;10/03/2014 15:09:20&lt;/td&gt; &lt;td&gt;0:01:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:19&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:22&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 15:07:47&lt;/td&gt; &lt;td&gt;10/03/2014 15:07:48&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:45&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:59&lt;/td&gt; &lt;td&gt;0:00:14&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 15:07:49&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:02&lt;/td&gt; &lt;td&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:02&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:17&lt;/td&gt; &lt;td&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:17&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:29&lt;/td&gt; &lt;td&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 15:08:29&lt;/td&gt; &lt;td&gt;10/03/2014 15:08:45&lt;/td&gt; &lt;td&gt;0:00:16&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.081986&lt;/td&gt; &lt;td&gt;0.208487&lt;/td&gt; &lt;td&gt;0.902462&lt;/td&gt; &lt;td&gt;0.313160&lt;/td&gt; &lt;td&gt;1.312273&lt;/td&gt; &lt;td&gt;0.493157&lt;/td&gt; &lt;td&gt;0.926629&lt;/td&gt; &lt;td&gt;0.786345&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2.755427&lt;/td&gt; &lt;td&gt;0.911578&lt;/td&gt; &lt;td&gt;3.618085&lt;/td&gt; &lt;td&gt;0.664407&lt;/td&gt; &lt;td&gt;3.740112&lt;/td&gt; &lt;td&gt;2.118189&lt;/td&gt; &lt;td&gt;4.738754&lt;/td&gt; &lt;td&gt;6.551446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.189612&lt;/td&gt; &lt;td&gt;0.957921&lt;/td&gt; &lt;td&gt;5.267355&lt;/td&gt; &lt;td&gt;2.152479&lt;/td&gt; &lt;td&gt;6.068005&lt;/td&gt; &lt;td&gt;1.263380&lt;/td&gt; &lt;td&gt;4.251842&lt;/td&gt; &lt;td&gt;3.620160&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;4.708834&lt;/td&gt; &lt;td&gt;0.981651&lt;/td&gt; &lt;td&gt;2.411839&lt;/td&gt; &lt;td&gt;0.790955&lt;/td&gt; &lt;td&gt;4.384516&lt;/td&gt; &lt;td&gt;1.322670&lt;/td&gt; &lt;td&gt;2.641571&lt;/td&gt; &lt;td&gt;4.771831&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;3.739567&lt;/td&gt; &lt;td&gt;1.185884&lt;/td&gt; &lt;td&gt;2.863871&lt;/td&gt; &lt;td&gt;1.517891&lt;/td&gt; &lt;td&gt;5.946967&lt;/td&gt; &lt;td&gt;1.179960&lt;/td&gt; &lt;td&gt;3.840560&lt;/td&gt; &lt;td&gt;4.926325&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.258746&lt;/td&gt; &lt;td&gt;0.705228&lt;/td&gt; &lt;td&gt;3.460904&lt;/td&gt; &lt;td&gt;0.951328&lt;/td&gt; &lt;td&gt;4.530620&lt;/td&gt; &lt;td&gt;1.104500&lt;/td&gt; &lt;td&gt;3.226494&lt;/td&gt; &lt;td&gt;4.041142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;2.755427&lt;/td&gt; &lt;td&gt;0.705228&lt;/td&gt; &lt;td&gt;2.411839&lt;/td&gt; &lt;td&gt;0.664407&lt;/td&gt; &lt;td&gt;3.740112&lt;/td&gt; &lt;td&gt;1.104500&lt;/td&gt; &lt;td&gt;2.641571&lt;/td&gt; &lt;td&gt;3.620160&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.258746&lt;/td&gt; &lt;td&gt;1.185884&lt;/td&gt; &lt;td&gt;5.267355&lt;/td&gt; &lt;td&gt;2.152479&lt;/td&gt; &lt;td&gt;6.068005&lt;/td&gt; &lt;td&gt;2.118189&lt;/td&gt; &lt;td&gt;4.738754&lt;/td&gt; &lt;td&gt;6.551446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.130437&lt;/td&gt; &lt;td&gt;0.948452&lt;/td&gt; &lt;td&gt;3.524411&lt;/td&gt; &lt;td&gt;1.215412&lt;/td&gt; &lt;td&gt;4.934044&lt;/td&gt; &lt;td&gt;1.397740&lt;/td&gt; &lt;td&gt;3.739844&lt;/td&gt; &lt;td&gt;4.782181&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;3.226685&lt;/td&gt; &lt;td&gt;1.878227&lt;/td&gt; &lt;td&gt;1.802562&lt;/td&gt; &lt;td&gt;0.676499&lt;/td&gt; &lt;td&gt;3.145884&lt;/td&gt; &lt;td&gt;0.653129&lt;/td&gt; &lt;td&gt;0.963449&lt;/td&gt; &lt;td&gt;0.990524&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;8.842030&lt;/td&gt; &lt;td&gt;5.630466&lt;/td&gt; &lt;td&gt;5.728147&lt;/td&gt; &lt;td&gt;2.643227&lt;/td&gt; &lt;td&gt;9.615551&lt;/td&gt; &lt;td&gt;3.197855&lt;/td&gt; &lt;td&gt;4.676538&lt;/td&gt; &lt;td&gt;4.285251&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.508612&lt;/td&gt; &lt;td&gt;5.288044&lt;/td&gt; &lt;td&gt;4.319998&lt;/td&gt; &lt;td&gt;1.492915&lt;/td&gt; &lt;td&gt;9.431995&lt;/td&gt; &lt;td&gt;3.206360&lt;/td&gt; &lt;td&gt;3.859749&lt;/td&gt; &lt;td&gt;3.201996&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10.480224&lt;/td&gt; &lt;td&gt;5.880274&lt;/td&gt; &lt;td&gt;4.517320&lt;/td&gt; &lt;td&gt;2.509405&lt;/td&gt; &lt;td&gt;6.913159&lt;/td&gt; &lt;td&gt;2.892479&lt;/td&gt; &lt;td&gt;6.408602&lt;/td&gt; &lt;td&gt;2.938061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;8.824111&lt;/td&gt; &lt;td&gt;5.752413&lt;/td&gt; &lt;td&gt;5.997959&lt;/td&gt; &lt;td&gt;2.581237&lt;/td&gt; &lt;td&gt;8.954756&lt;/td&gt; &lt;td&gt;3.351951&lt;/td&gt; &lt;td&gt;2.420598&lt;/td&gt; &lt;td&gt;4.148455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.905553&lt;/td&gt; &lt;td&gt;7.099111&lt;/td&gt; &lt;td&gt;5.121041&lt;/td&gt; &lt;td&gt;2.516020&lt;/td&gt; &lt;td&gt;9.354924&lt;/td&gt; &lt;td&gt;3.955638&lt;/td&gt; &lt;td&gt;4.389209&lt;/td&gt; &lt;td&gt;3.818902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.905553&lt;/td&gt; &lt;td&gt;5.288044&lt;/td&gt; &lt;td&gt;4.319998&lt;/td&gt; &lt;td&gt;1.492915&lt;/td&gt; &lt;td&gt;6.913159&lt;/td&gt; &lt;td&gt;2.892479&lt;/td&gt; &lt;td&gt;2.420598&lt;/td&gt; &lt;td&gt;2.938061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;10.480224&lt;/td&gt; &lt;td&gt;7.099111&lt;/td&gt; &lt;td&gt;5.997959&lt;/td&gt; &lt;td&gt;2.643227&lt;/td&gt; &lt;td&gt;9.615551&lt;/td&gt; &lt;td&gt;3.955638&lt;/td&gt; &lt;td&gt;6.408602&lt;/td&gt; &lt;td&gt;4.285251&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.512106&lt;/td&gt; &lt;td&gt;5.930062&lt;/td&gt; &lt;td&gt;5.136893&lt;/td&gt; &lt;td&gt;2.348561&lt;/td&gt; &lt;td&gt;8.854077&lt;/td&gt; &lt;td&gt;3.320857&lt;/td&gt; &lt;td&gt;4.350939&lt;/td&gt; &lt;td&gt;3.678533&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.405338&lt;/td&gt; &lt;td&gt;0.868313&lt;/td&gt; &lt;td&gt;0.806277&lt;/td&gt; &lt;td&gt;1.123366&lt;/td&gt; &lt;td&gt;1.314028&lt;/td&gt; &lt;td&gt;0.233214&lt;/td&gt; &lt;td&gt;2.590459&lt;/td&gt; &lt;td&gt;1.230242&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.191045&lt;/td&gt; &lt;td&gt;3.171244&lt;/td&gt; &lt;td&gt;3.403836&lt;/td&gt; &lt;td&gt;4.604523&lt;/td&gt; &lt;td&gt;3.721133&lt;/td&gt; &lt;td&gt;0.892096&lt;/td&gt; &lt;td&gt;7.136841&lt;/td&gt; &lt;td&gt;6.500452&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;6.282687&lt;/td&gt; &lt;td&gt;2.845465&lt;/td&gt; &lt;td&gt;3.024786&lt;/td&gt; &lt;td&gt;4.086546&lt;/td&gt; &lt;td&gt;3.530743&lt;/td&gt; &lt;td&gt;0.619683&lt;/td&gt; &lt;td&gt;9.263671&lt;/td&gt; &lt;td&gt;4.826173&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;6.040787&lt;/td&gt; &lt;td&gt;2.659766&lt;/td&gt; &lt;td&gt;2.787273&lt;/td&gt; &lt;td&gt;6.210077&lt;/td&gt; &lt;td&gt;3.902190&lt;/td&gt; &lt;td&gt;2.175417&lt;/td&gt; &lt;td&gt;7.974860&lt;/td&gt; &lt;td&gt;6.689780&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.978721&lt;/td&gt; &lt;td&gt;2.542674&lt;/td&gt; &lt;td&gt;3.518783&lt;/td&gt; &lt;td&gt;4.385571&lt;/td&gt; &lt;td&gt;3.906211&lt;/td&gt; &lt;td&gt;0.918752&lt;/td&gt; &lt;td&gt;6.303352&lt;/td&gt; &lt;td&gt;5.139326&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.208600&lt;/td&gt; &lt;td&gt;3.761975&lt;/td&gt; &lt;td&gt;3.682886&lt;/td&gt; &lt;td&gt;7.874493&lt;/td&gt; &lt;td&gt;5.017600&lt;/td&gt; &lt;td&gt;2.087150&lt;/td&gt; &lt;td&gt;7.999074&lt;/td&gt; &lt;td&gt;7.978154&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.978721&lt;/td&gt; &lt;td&gt;2.542674&lt;/td&gt; &lt;td&gt;2.787273&lt;/td&gt; &lt;td&gt;4.086546&lt;/td&gt; &lt;td&gt;3.530743&lt;/td&gt; &lt;td&gt;0.619683&lt;/td&gt; &lt;td&gt;6.303352&lt;/td&gt; &lt;td&gt;4.826173&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;6.282687&lt;/td&gt; &lt;td&gt;3.761975&lt;/td&gt; &lt;td&gt;3.682886&lt;/td&gt; &lt;td&gt;7.874493&lt;/td&gt; &lt;td&gt;5.017600&lt;/td&gt; &lt;td&gt;2.175417&lt;/td&gt; &lt;td&gt;9.263671&lt;/td&gt; &lt;td&gt;7.978154&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.540368&lt;/td&gt; &lt;td&gt;2.996225&lt;/td&gt; &lt;td&gt;3.283513&lt;/td&gt; &lt;td&gt;5.432242&lt;/td&gt; &lt;td&gt;4.015575&lt;/td&gt; &lt;td&gt;1.338620&lt;/td&gt; &lt;td&gt;7.735560&lt;/td&gt; &lt;td&gt;6.226777&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;1000 GB Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;1000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;26M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;136,744.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;147,374.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@1000GB)&lt;/th&gt; &lt;td&gt;141,960.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;3,761.953000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 09:18:42&lt;/td&gt; &lt;td&gt;10/03/2014 09:34:12&lt;/td&gt; &lt;td&gt;0:15:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:42&lt;/td&gt; &lt;td&gt;1:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:14&lt;/td&gt; &lt;td&gt;1:02:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:25&lt;/td&gt; &lt;td&gt;1:02:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:33:31&lt;/td&gt; &lt;td&gt;0:58:48&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:26&lt;/td&gt; &lt;td&gt;1:00:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:28:00&lt;/td&gt; &lt;td&gt;0:53:17&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 10:35:42&lt;/td&gt; &lt;td&gt;1:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 09:18:42&lt;/td&gt; &lt;td&gt;10/03/2014 09:19:27&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 09:34:12&lt;/td&gt; &lt;td&gt;10/03/2014 09:34:42&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 09:43:03&lt;/td&gt; &lt;td&gt;10/03/2014 09:43:38&lt;/td&gt; &lt;td&gt;0:00:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 09:34:43&lt;/td&gt; &lt;td&gt;10/03/2014 09:36:54&lt;/td&gt; &lt;td&gt;0:02:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 09:36:53&lt;/td&gt; &lt;td&gt;10/03/2014 09:38:39&lt;/td&gt; &lt;td&gt;0:01:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 09:38:39&lt;/td&gt; &lt;td&gt;10/03/2014 09:39:22&lt;/td&gt; &lt;td&gt;0:00:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 09:39:23&lt;/td&gt; &lt;td&gt;10/03/2014 09:41:09&lt;/td&gt; &lt;td&gt;0:01:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;10/03/2014 09:41:09&lt;/td&gt; &lt;td&gt;10/03/2014 09:42:15&lt;/td&gt; &lt;td&gt;0:01:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;10/03/2014 09:42:15&lt;/td&gt; &lt;td&gt;10/03/2014 09:43:02&lt;/td&gt; &lt;td&gt;0:00:47&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;104.488583&lt;/td&gt; &lt;td&gt;18.351559&lt;/td&gt; &lt;td&gt;24.631282&lt;/td&gt; &lt;td&gt;36.195531&lt;/td&gt; &lt;td&gt;36.319915&lt;/td&gt; &lt;td&gt;3.807790&lt;/td&gt; &lt;td&gt;22.750889&lt;/td&gt; &lt;td&gt;31.190630&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;209.323441&lt;/td&gt; &lt;td&gt;26.205435&lt;/td&gt; &lt;td&gt;59.637373&lt;/td&gt; &lt;td&gt;245.808484&lt;/td&gt; &lt;td&gt;60.699333&lt;/td&gt; &lt;td&gt;22.369379&lt;/td&gt; &lt;td&gt;289.435780&lt;/td&gt; &lt;td&gt;335.733425&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;109.134446&lt;/td&gt; &lt;td&gt;64.185831&lt;/td&gt; &lt;td&gt;96.131735&lt;/td&gt; &lt;td&gt;108.459418&lt;/td&gt; &lt;td&gt;310.273986&lt;/td&gt; &lt;td&gt;53.595127&lt;/td&gt; &lt;td&gt;152.242755&lt;/td&gt; &lt;td&gt;104.350098&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;73.321611&lt;/td&gt; &lt;td&gt;215.535408&lt;/td&gt; &lt;td&gt;69.543101&lt;/td&gt; &lt;td&gt;12.423757&lt;/td&gt; &lt;td&gt;64.445611&lt;/td&gt; &lt;td&gt;38.254747&lt;/td&gt; &lt;td&gt;122.952872&lt;/td&gt; &lt;td&gt;98.713213&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;110.875875&lt;/td&gt; &lt;td&gt;4.272757&lt;/td&gt; &lt;td&gt;78.697314&lt;/td&gt; &lt;td&gt;16.316807&lt;/td&gt; &lt;td&gt;59.746855&lt;/td&gt; &lt;td&gt;23.447211&lt;/td&gt; &lt;td&gt;353.190412&lt;/td&gt; &lt;td&gt;342.549908&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;41.972337&lt;/td&gt; &lt;td&gt;5.978707&lt;/td&gt; &lt;td&gt;60.784575&lt;/td&gt; &lt;td&gt;34.219229&lt;/td&gt; &lt;td&gt;42.372449&lt;/td&gt; &lt;td&gt;344.590640&lt;/td&gt; &lt;td&gt;146.186614&lt;/td&gt; &lt;td&gt;274.972270&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;115.760155&lt;/td&gt; &lt;td&gt;18.692078&lt;/td&gt; &lt;td&gt;58.493147&lt;/td&gt; &lt;td&gt;9.193234&lt;/td&gt; &lt;td&gt;49.831932&lt;/td&gt; &lt;td&gt;19.081395&lt;/td&gt; &lt;td&gt;60.603109&lt;/td&gt; &lt;td&gt;128.095501&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;58.601744&lt;/td&gt; &lt;td&gt;118.126585&lt;/td&gt; &lt;td&gt;297.327543&lt;/td&gt; &lt;td&gt;298.578268&lt;/td&gt; &lt;td&gt;714.284222&lt;/td&gt; &lt;td&gt;108.475250&lt;/td&gt; &lt;td&gt;91.868151&lt;/td&gt; &lt;td&gt;55.881029&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;41.972337&lt;/td&gt; &lt;td&gt;4.272757&lt;/td&gt; &lt;td&gt;58.493147&lt;/td&gt; &lt;td&gt;9.193234&lt;/td&gt; &lt;td&gt;42.372449&lt;/td&gt; &lt;td&gt;19.081395&lt;/td&gt; &lt;td&gt;60.603109&lt;/td&gt; &lt;td&gt;55.881029&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;209.323441&lt;/td&gt; &lt;td&gt;215.535408&lt;/td&gt; &lt;td&gt;297.327543&lt;/td&gt; &lt;td&gt;298.578268&lt;/td&gt; &lt;td&gt;714.284222&lt;/td&gt; &lt;td&gt;344.590640&lt;/td&gt; &lt;td&gt;353.190412&lt;/td&gt; &lt;td&gt;342.549908&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;102.712801&lt;/td&gt; &lt;td&gt;64.713829&lt;/td&gt; &lt;td&gt;102.944970&lt;/td&gt; &lt;td&gt;103.571314&lt;/td&gt; &lt;td&gt;185.950627&lt;/td&gt; &lt;td&gt;87.116250&lt;/td&gt; &lt;td&gt;173.782813&lt;/td&gt; &lt;td&gt;191.470778&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;41.777880&lt;/td&gt; &lt;td&gt;10.035063&lt;/td&gt; &lt;td&gt;16.125611&lt;/td&gt; &lt;td&gt;9.245638&lt;/td&gt; &lt;td&gt;209.443782&lt;/td&gt; &lt;td&gt;111.271310&lt;/td&gt; &lt;td&gt;37.821595&lt;/td&gt; &lt;td&gt;9.483838&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;244.243830&lt;/td&gt; &lt;td&gt;63.473338&lt;/td&gt; &lt;td&gt;207.741931&lt;/td&gt; &lt;td&gt;33.696956&lt;/td&gt; &lt;td&gt;561.057408&lt;/td&gt; &lt;td&gt;141.026049&lt;/td&gt; &lt;td&gt;126.818051&lt;/td&gt; &lt;td&gt;54.774792&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;189.297446&lt;/td&gt; &lt;td&gt;144.853756&lt;/td&gt; &lt;td&gt;56.292537&lt;/td&gt; &lt;td&gt;184.781273&lt;/td&gt; &lt;td&gt;501.330052&lt;/td&gt; &lt;td&gt;49.965102&lt;/td&gt; &lt;td&gt;107.736393&lt;/td&gt; &lt;td&gt;85.691079&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;231.060699&lt;/td&gt; &lt;td&gt;355.394713&lt;/td&gt; &lt;td&gt;43.483645&lt;/td&gt; &lt;td&gt;11.806590&lt;/td&gt; &lt;td&gt;555.445111&lt;/td&gt; &lt;td&gt;36.722686&lt;/td&gt; &lt;td&gt;251.241817&lt;/td&gt; &lt;td&gt;9.057850&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;227.371508&lt;/td&gt; &lt;td&gt;32.207115&lt;/td&gt; &lt;td&gt;108.880658&lt;/td&gt; &lt;td&gt;139.922550&lt;/td&gt; &lt;td&gt;532.697956&lt;/td&gt; &lt;td&gt;57.106583&lt;/td&gt; &lt;td&gt;159.198489&lt;/td&gt; &lt;td&gt;153.088913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;416.113856&lt;/td&gt; &lt;td&gt;108.689389&lt;/td&gt; &lt;td&gt;62.847727&lt;/td&gt; &lt;td&gt;702.712683&lt;/td&gt; &lt;td&gt;622.906487&lt;/td&gt; &lt;td&gt;58.198961&lt;/td&gt; &lt;td&gt;89.707091&lt;/td&gt; &lt;td&gt;85.614769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;228.019243&lt;/td&gt; &lt;td&gt;62.474213&lt;/td&gt; &lt;td&gt;88.227994&lt;/td&gt; &lt;td&gt;282.932978&lt;/td&gt; &lt;td&gt;432.387869&lt;/td&gt; &lt;td&gt;238.544027&lt;/td&gt; &lt;td&gt;61.486269&lt;/td&gt; &lt;td&gt;56.950548&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;230.564416&lt;/td&gt; &lt;td&gt;69.197517&lt;/td&gt; &lt;td&gt;130.708759&lt;/td&gt; &lt;td&gt;120.531103&lt;/td&gt; &lt;td&gt;551.112816&lt;/td&gt; &lt;td&gt;57.438478&lt;/td&gt; &lt;td&gt;82.256530&lt;/td&gt; &lt;td&gt;63.796403&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;189.297446&lt;/td&gt; &lt;td&gt;32.207115&lt;/td&gt; &lt;td&gt;43.483645&lt;/td&gt; &lt;td&gt;11.806590&lt;/td&gt; &lt;td&gt;432.387869&lt;/td&gt; &lt;td&gt;36.722686&lt;/td&gt; &lt;td&gt;61.486269&lt;/td&gt; &lt;td&gt;9.057850&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;416.113856&lt;/td&gt; &lt;td&gt;355.394713&lt;/td&gt; &lt;td&gt;207.741931&lt;/td&gt; &lt;td&gt;702.712683&lt;/td&gt; &lt;td&gt;622.906487&lt;/td&gt; &lt;td&gt;238.544027&lt;/td&gt; &lt;td&gt;251.241817&lt;/td&gt; &lt;td&gt;153.088913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;252.381571&lt;/td&gt; &lt;td&gt;119.470006&lt;/td&gt; &lt;td&gt;99.740464&lt;/td&gt; &lt;td&gt;210.912019&lt;/td&gt; &lt;td&gt;536.705386&lt;/td&gt; &lt;td&gt;91.285984&lt;/td&gt; &lt;td&gt;125.492091&lt;/td&gt; &lt;td&gt;72.710622&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;22.897349&lt;/td&gt; &lt;td&gt;47.870269&lt;/td&gt; &lt;td&gt;12.735580&lt;/td&gt; &lt;td&gt;25.982194&lt;/td&gt; &lt;td&gt;46.091766&lt;/td&gt; &lt;td&gt;6.623306&lt;/td&gt; &lt;td&gt;45.120559&lt;/td&gt; &lt;td&gt;30.016788&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;123.444839&lt;/td&gt; &lt;td&gt;22.212194&lt;/td&gt; &lt;td&gt;647.523826&lt;/td&gt; &lt;td&gt;97.431531&lt;/td&gt; &lt;td&gt;81.592165&lt;/td&gt; &lt;td&gt;4.573040&lt;/td&gt; &lt;td&gt;21.068225&lt;/td&gt; &lt;td&gt;14.486185&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;80.853865&lt;/td&gt; &lt;td&gt;622.651044&lt;/td&gt; &lt;td&gt;288.656211&lt;/td&gt; &lt;td&gt;336.409076&lt;/td&gt; &lt;td&gt;70.925079&lt;/td&gt; &lt;td&gt;33.578052&lt;/td&gt; &lt;td&gt;82.910543&lt;/td&gt; &lt;td&gt;48.001583&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;392.340812&lt;/td&gt; &lt;td&gt;84.967695&lt;/td&gt; &lt;td&gt;57.181935&lt;/td&gt; &lt;td&gt;473.720060&lt;/td&gt; &lt;td&gt;497.262620&lt;/td&gt; &lt;td&gt;66.966740&lt;/td&gt; &lt;td&gt;54.778284&lt;/td&gt; &lt;td&gt;50.940094&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;97.069440&lt;/td&gt; &lt;td&gt;301.705125&lt;/td&gt; &lt;td&gt;338.035788&lt;/td&gt; &lt;td&gt;258.992426&lt;/td&gt; &lt;td&gt;103.699408&lt;/td&gt; &lt;td&gt;28.750257&lt;/td&gt; &lt;td&gt;23.858757&lt;/td&gt; &lt;td&gt;13.626079&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;69.882110&lt;/td&gt; &lt;td&gt;34.277914&lt;/td&gt; &lt;td&gt;146.031938&lt;/td&gt; &lt;td&gt;179.656129&lt;/td&gt; &lt;td&gt;104.788154&lt;/td&gt; &lt;td&gt;10.836148&lt;/td&gt; &lt;td&gt;54.319823&lt;/td&gt; &lt;td&gt;52.077352&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;141.310431&lt;/td&gt; &lt;td&gt;247.242904&lt;/td&gt; &lt;td&gt;94.392791&lt;/td&gt; &lt;td&gt;702.775460&lt;/td&gt; &lt;td&gt;80.142930&lt;/td&gt; &lt;td&gt;19.969889&lt;/td&gt; &lt;td&gt;46.027410&lt;/td&gt; &lt;td&gt;19.136271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;89.018281&lt;/td&gt; &lt;td&gt;51.105998&lt;/td&gt; &lt;td&gt;281.234432&lt;/td&gt; &lt;td&gt;79.046122&lt;/td&gt; &lt;td&gt;84.341517&lt;/td&gt; &lt;td&gt;26.221892&lt;/td&gt; &lt;td&gt;33.169666&lt;/td&gt; &lt;td&gt;13.309634&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;69.882110&lt;/td&gt; &lt;td&gt;22.212194&lt;/td&gt; &lt;td&gt;57.181935&lt;/td&gt; &lt;td&gt;79.046122&lt;/td&gt; &lt;td&gt;70.925079&lt;/td&gt; &lt;td&gt;4.573040&lt;/td&gt; &lt;td&gt;21.068225&lt;/td&gt; &lt;td&gt;13.309634&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;392.340812&lt;/td&gt; &lt;td&gt;622.651044&lt;/td&gt; &lt;td&gt;647.523826&lt;/td&gt; &lt;td&gt;702.775460&lt;/td&gt; &lt;td&gt;497.262620&lt;/td&gt; &lt;td&gt;66.966740&lt;/td&gt; &lt;td&gt;82.910543&lt;/td&gt; &lt;td&gt;52.077352&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;141.988540&lt;/td&gt; &lt;td&gt;194.880411&lt;/td&gt; &lt;td&gt;264.722417&lt;/td&gt; &lt;td&gt;304.004401&lt;/td&gt; &lt;td&gt;146.107410&lt;/td&gt; &lt;td&gt;27.270860&lt;/td&gt; &lt;td&gt;45.161815&lt;/td&gt; &lt;td&gt;30.225314&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;1000 GB Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;October 3, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;1000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;26M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;199,652.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;125,161.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@1000GB)&lt;/th&gt; &lt;td&gt;158,078.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;4,429.608000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;10/03/2014 10:37:29&lt;/td&gt; &lt;td&gt;10/03/2014 10:52:26&lt;/td&gt; &lt;td&gt;0:14:57&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:19&lt;/td&gt; &lt;td&gt;1:12:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:06:25&lt;/td&gt; &lt;td&gt;1:13:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:03:08&lt;/td&gt; &lt;td&gt;1:10:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:20&lt;/td&gt; &lt;td&gt;1:12:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 11:57:40&lt;/td&gt; &lt;td&gt;1:05:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:28&lt;/td&gt; &lt;td&gt;1:12:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 12:05:25&lt;/td&gt; &lt;td&gt;1:12:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;10/03/2014 10:37:29&lt;/td&gt; &lt;td&gt;10/03/2014 10:37:52&lt;/td&gt; &lt;td&gt;0:00:23&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;10/03/2014 10:52:25&lt;/td&gt; &lt;td&gt;10/03/2014 10:52:34&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;10/03/2014 11:01:44&lt;/td&gt; &lt;td&gt;10/03/2014 11:02:29&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;10/03/2014 10:52:35&lt;/td&gt; &lt;td&gt;10/03/2014 10:54:50&lt;/td&gt; &lt;td&gt;0:02:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;10/03/2014 10:54:50&lt;/td&gt; &lt;td&gt;10/03/2014 10:57:02&lt;/td&gt; &lt;td&gt;0:02:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;10/03/2014 10:57:05&lt;/td&gt; &lt;td&gt;10/03/2014 10:58:47&lt;/td&gt; &lt;td&gt;0:01:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;10/03/2014 10:58:47&lt;/td&gt; &lt;td&gt;10/03/2014 10:59:46&lt;/td&gt; &lt;td&gt;0:00:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;10/03/2014 10:59:45&lt;/td&gt; &lt;td&gt;10/03/2014 11:00:38&lt;/td&gt; &lt;td&gt;0:00:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;10/03/2014 11:00:39&lt;/td&gt; &lt;td&gt;10/03/2014 11:01:44&lt;/td&gt; &lt;td&gt;0:01:05&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;34.105419&lt;/td&gt; &lt;td&gt;1.439089&lt;/td&gt; &lt;td&gt;9.802183&lt;/td&gt; &lt;td&gt;2.033956&lt;/td&gt; &lt;td&gt;10.525742&lt;/td&gt; &lt;td&gt;3.356152&lt;/td&gt; &lt;td&gt;23.953729&lt;/td&gt; &lt;td&gt;36.199533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;26.598252&lt;/td&gt; &lt;td&gt;150.572833&lt;/td&gt; &lt;td&gt;41.930330&lt;/td&gt; &lt;td&gt;86.870320&lt;/td&gt; &lt;td&gt;50.604856&lt;/td&gt; &lt;td&gt;201.001372&lt;/td&gt; &lt;td&gt;61.638366&lt;/td&gt; &lt;td&gt;244.013359&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;50.129895&lt;/td&gt; &lt;td&gt;102.219282&lt;/td&gt; &lt;td&gt;12.380935&lt;/td&gt; &lt;td&gt;102.319615&lt;/td&gt; &lt;td&gt;62.577229&lt;/td&gt; &lt;td&gt;43.454392&lt;/td&gt; &lt;td&gt;891.076608&lt;/td&gt; &lt;td&gt;407.640626&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;269.947278&lt;/td&gt; &lt;td&gt;53.172724&lt;/td&gt; &lt;td&gt;54.649973&lt;/td&gt; &lt;td&gt;11.460062&lt;/td&gt; &lt;td&gt;66.695722&lt;/td&gt; &lt;td&gt;17.336698&lt;/td&gt; &lt;td&gt;63.371232&lt;/td&gt; &lt;td&gt;91.158050&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;41.149221&lt;/td&gt; &lt;td&gt;22.520836&lt;/td&gt; &lt;td&gt;28.707973&lt;/td&gt; &lt;td&gt;509.984321&lt;/td&gt; &lt;td&gt;68.916549&lt;/td&gt; &lt;td&gt;17.525025&lt;/td&gt; &lt;td&gt;702.191490&lt;/td&gt; &lt;td&gt;666.450230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;59.179045&lt;/td&gt; &lt;td&gt;30.734442&lt;/td&gt; &lt;td&gt;99.504351&lt;/td&gt; &lt;td&gt;11.145990&lt;/td&gt; &lt;td&gt;101.334340&lt;/td&gt; &lt;td&gt;21.660836&lt;/td&gt; &lt;td&gt;74.625589&lt;/td&gt; &lt;td&gt;535.160207&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;225.105215&lt;/td&gt; &lt;td&gt;55.567328&lt;/td&gt; &lt;td&gt;46.749707&lt;/td&gt; &lt;td&gt;554.474507&lt;/td&gt; &lt;td&gt;215.657091&lt;/td&gt; &lt;td&gt;54.362551&lt;/td&gt; &lt;td&gt;72.960653&lt;/td&gt; &lt;td&gt;442.194302&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;220.993226&lt;/td&gt; &lt;td&gt;28.528230&lt;/td&gt; &lt;td&gt;47.543365&lt;/td&gt; &lt;td&gt;336.191006&lt;/td&gt; &lt;td&gt;308.931194&lt;/td&gt; &lt;td&gt;9.767397&lt;/td&gt; &lt;td&gt;850.258452&lt;/td&gt; &lt;td&gt;66.121298&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;26.598252&lt;/td&gt; &lt;td&gt;22.520836&lt;/td&gt; &lt;td&gt;12.380935&lt;/td&gt; &lt;td&gt;11.145990&lt;/td&gt; &lt;td&gt;50.604856&lt;/td&gt; &lt;td&gt;9.767397&lt;/td&gt; &lt;td&gt;61.638366&lt;/td&gt; &lt;td&gt;66.121298&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;269.947278&lt;/td&gt; &lt;td&gt;150.572833&lt;/td&gt; &lt;td&gt;99.504351&lt;/td&gt; &lt;td&gt;554.474507&lt;/td&gt; &lt;td&gt;308.931194&lt;/td&gt; &lt;td&gt;201.001372&lt;/td&gt; &lt;td&gt;891.076608&lt;/td&gt; &lt;td&gt;666.450230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;127.586019&lt;/td&gt; &lt;td&gt;63.330811&lt;/td&gt; &lt;td&gt;47.352376&lt;/td&gt; &lt;td&gt;230.349403&lt;/td&gt; &lt;td&gt;124.959569&lt;/td&gt; &lt;td&gt;52.158324&lt;/td&gt; &lt;td&gt;388.017484&lt;/td&gt; &lt;td&gt;350.391153&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;50.439615&lt;/td&gt; &lt;td&gt;9.287196&lt;/td&gt; &lt;td&gt;15.892947&lt;/td&gt; &lt;td&gt;7.112715&lt;/td&gt; &lt;td&gt;250.527755&lt;/td&gt; &lt;td&gt;131.478131&lt;/td&gt; &lt;td&gt;54.458992&lt;/td&gt; &lt;td&gt;10.525842&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;420.919329&lt;/td&gt; &lt;td&gt;317.402771&lt;/td&gt; &lt;td&gt;101.818338&lt;/td&gt; &lt;td&gt;403.213385&lt;/td&gt; &lt;td&gt;724.539887&lt;/td&gt; &lt;td&gt;160.669174&lt;/td&gt; &lt;td&gt;65.374584&lt;/td&gt; &lt;td&gt;28.563034&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;464.378760&lt;/td&gt; &lt;td&gt;210.938167&lt;/td&gt; &lt;td&gt;23.395678&lt;/td&gt; &lt;td&gt;545.086468&lt;/td&gt; &lt;td&gt;736.005716&lt;/td&gt; &lt;td&gt;54.680686&lt;/td&gt; &lt;td&gt;398.880053&lt;/td&gt; &lt;td&gt;34.018918&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;350.083270&lt;/td&gt; &lt;td&gt;321.781561&lt;/td&gt; &lt;td&gt;48.652019&lt;/td&gt; &lt;td&gt;435.954962&lt;/td&gt; &lt;td&gt;378.872739&lt;/td&gt; &lt;td&gt;100.588804&lt;/td&gt; &lt;td&gt;289.350342&lt;/td&gt; &lt;td&gt;190.140640&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;306.265994&lt;/td&gt; &lt;td&gt;249.621982&lt;/td&gt; &lt;td&gt;79.280220&lt;/td&gt; &lt;td&gt;221.255121&lt;/td&gt; &lt;td&gt;348.932746&lt;/td&gt; &lt;td&gt;49.555802&lt;/td&gt; &lt;td&gt;100.062439&lt;/td&gt; &lt;td&gt;61.368814&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;511.923087&lt;/td&gt; &lt;td&gt;133.018420&lt;/td&gt; &lt;td&gt;134.199065&lt;/td&gt; &lt;td&gt;9.655693&lt;/td&gt; &lt;td&gt;662.658830&lt;/td&gt; &lt;td&gt;104.380635&lt;/td&gt; &lt;td&gt;82.847242&lt;/td&gt; &lt;td&gt;59.952271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;578.362701&lt;/td&gt; &lt;td&gt;61.221715&lt;/td&gt; &lt;td&gt;145.613349&lt;/td&gt; &lt;td&gt;47.957006&lt;/td&gt; &lt;td&gt;621.993889&lt;/td&gt; &lt;td&gt;256.150595&lt;/td&gt; &lt;td&gt;77.124777&lt;/td&gt; &lt;td&gt;91.163005&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;418.450091&lt;/td&gt; &lt;td&gt;391.818564&lt;/td&gt; &lt;td&gt;29.360218&lt;/td&gt; &lt;td&gt;17.236628&lt;/td&gt; &lt;td&gt;761.850888&lt;/td&gt; &lt;td&gt;31.952329&lt;/td&gt; &lt;td&gt;50.393082&lt;/td&gt; &lt;td&gt;27.530882&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;306.265994&lt;/td&gt; &lt;td&gt;61.221715&lt;/td&gt; &lt;td&gt;23.395678&lt;/td&gt; &lt;td&gt;9.655693&lt;/td&gt; &lt;td&gt;348.932746&lt;/td&gt; &lt;td&gt;31.952329&lt;/td&gt; &lt;td&gt;50.393082&lt;/td&gt; &lt;td&gt;27.530882&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;578.362701&lt;/td&gt; &lt;td&gt;391.818564&lt;/td&gt; &lt;td&gt;145.613349&lt;/td&gt; &lt;td&gt;545.086468&lt;/td&gt; &lt;td&gt;761.850888&lt;/td&gt; &lt;td&gt;256.150595&lt;/td&gt; &lt;td&gt;398.880053&lt;/td&gt; &lt;td&gt;190.140640&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;435.769033&lt;/td&gt; &lt;td&gt;240.829026&lt;/td&gt; &lt;td&gt;80.331270&lt;/td&gt; &lt;td&gt;240.051323&lt;/td&gt; &lt;td&gt;604.979242&lt;/td&gt; &lt;td&gt;108.282575&lt;/td&gt; &lt;td&gt;152.004646&lt;/td&gt; &lt;td&gt;70.391081&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;22.444111&lt;/td&gt; &lt;td&gt;37.978532&lt;/td&gt; &lt;td&gt;13.347320&lt;/td&gt; &lt;td&gt;26.553364&lt;/td&gt; &lt;td&gt;115.511143&lt;/td&gt; &lt;td&gt;7.670304&lt;/td&gt; &lt;td&gt;22.771613&lt;/td&gt; &lt;td&gt;8.761026&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;329.153807&lt;/td&gt; &lt;td&gt;19.198590&lt;/td&gt; &lt;td&gt;258.455295&lt;/td&gt; &lt;td&gt;556.256015&lt;/td&gt; &lt;td&gt;99.647793&lt;/td&gt; &lt;td&gt;14.878746&lt;/td&gt; &lt;td&gt;32.803289&lt;/td&gt; &lt;td&gt;8.771923&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;76.940373&lt;/td&gt; &lt;td&gt;74.916489&lt;/td&gt; &lt;td&gt;75.246897&lt;/td&gt; &lt;td&gt;16.035355&lt;/td&gt; &lt;td&gt;14.403643&lt;/td&gt; &lt;td&gt;32.348500&lt;/td&gt; &lt;td&gt;91.981362&lt;/td&gt; &lt;td&gt;41.426540&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;88.918404&lt;/td&gt; &lt;td&gt;238.858707&lt;/td&gt; &lt;td&gt;221.257060&lt;/td&gt; &lt;td&gt;688.441713&lt;/td&gt; &lt;td&gt;247.669761&lt;/td&gt; &lt;td&gt;5.345632&lt;/td&gt; &lt;td&gt;70.780594&lt;/td&gt; &lt;td&gt;49.352955&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;497.105081&lt;/td&gt; &lt;td&gt;167.874781&lt;/td&gt; &lt;td&gt;67.668514&lt;/td&gt; &lt;td&gt;76.820831&lt;/td&gt; &lt;td&gt;78.585717&lt;/td&gt; &lt;td&gt;3.655421&lt;/td&gt; &lt;td&gt;73.165786&lt;/td&gt; &lt;td&gt;29.401670&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;309.991618&lt;/td&gt; &lt;td&gt;123.023557&lt;/td&gt; &lt;td&gt;380.801141&lt;/td&gt; &lt;td&gt;347.055909&lt;/td&gt; &lt;td&gt;93.478502&lt;/td&gt; &lt;td&gt;18.351491&lt;/td&gt; &lt;td&gt;33.338814&lt;/td&gt; &lt;td&gt;12.557542&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;57.200926&lt;/td&gt; &lt;td&gt;154.489850&lt;/td&gt; &lt;td&gt;386.007137&lt;/td&gt; &lt;td&gt;103.558355&lt;/td&gt; &lt;td&gt;32.676369&lt;/td&gt; &lt;td&gt;92.863316&lt;/td&gt; &lt;td&gt;35.576966&lt;/td&gt; &lt;td&gt;14.061801&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;160.332088&lt;/td&gt; &lt;td&gt;46.934177&lt;/td&gt; &lt;td&gt;340.957970&lt;/td&gt; &lt;td&gt;84.479720&lt;/td&gt; &lt;td&gt;78.985110&lt;/td&gt; &lt;td&gt;60.568796&lt;/td&gt; &lt;td&gt;44.362737&lt;/td&gt; &lt;td&gt;8.831746&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;57.200926&lt;/td&gt; &lt;td&gt;19.198590&lt;/td&gt; &lt;td&gt;67.668514&lt;/td&gt; &lt;td&gt;16.035355&lt;/td&gt; &lt;td&gt;14.403643&lt;/td&gt; &lt;td&gt;3.655421&lt;/td&gt; &lt;td&gt;32.803289&lt;/td&gt; &lt;td&gt;8.771923&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;497.105081&lt;/td&gt; &lt;td&gt;238.858707&lt;/td&gt; &lt;td&gt;386.007137&lt;/td&gt; &lt;td&gt;688.441713&lt;/td&gt; &lt;td&gt;247.669761&lt;/td&gt; &lt;td&gt;92.863316&lt;/td&gt; &lt;td&gt;91.981362&lt;/td&gt; &lt;td&gt;49.352955&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;217.091757&lt;/td&gt; &lt;td&gt;117.899450&lt;/td&gt; &lt;td&gt;247.199145&lt;/td&gt; &lt;td&gt;267.521128&lt;/td&gt; &lt;td&gt;92.206699&lt;/td&gt; &lt;td&gt;32.573129&lt;/td&gt; &lt;td&gt;54.572793&lt;/td&gt; &lt;td&gt;23.486311&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab52abc0b8&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aab53935178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aab537ea348&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aab516a28b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab514b53d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aaba8e12aa8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aab537ea308&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaba97e18d8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aab52a6add8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaba9725b78&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab51109e68&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aaba97e1898&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aab51a706a8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aaba97e18b8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aaba9725b98&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab52abc098&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab5130e068&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aab52979f88&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab53015408&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd2975158&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:05:31.563713-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 19 of n): Scalability, 1000G, and 3000G</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-30#1823</atom:id>
  <atom:published>2014-09-30T20:33:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;Scalability, specifically linear scalability, means that twice the data takes twice as long to process, or that double the gear processes the same data in half the time. This is only literally true for &amp;quot;embarrassingly parallel&amp;quot; workloads.&lt;/p&gt; &lt;p&gt;There are parts of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac693da068&quot;&gt;TPC-H&lt;/a&gt; which have an embarrassingly parallel nature, like &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac3757a2d8&quot;&gt;Q1&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac6ad4c0b8&quot;&gt;Q7&lt;/a&gt;. There are parts that are almost as easy, like Q14, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac116f1f88&quot;&gt;Q17&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aacaa6ec0b8&quot;&gt;Q19&lt;/a&gt;, and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaca8c66f18&quot;&gt;Q21&lt;/a&gt;, where there is a big scan and a selective hash join with a hash table small enough to replicate everywhere. The scan scales linearly; building the hash does not, since it is done at single-server speed (once in each process). Some queries like &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac116f2728&quot;&gt;Q9&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac6a56bd28&quot;&gt;Q13&lt;/a&gt; end up doing a big cross-partition join which runs into communication overheads.&lt;/p&gt; &lt;p&gt;This is our first look at how performance behaves with bigger data and a larger platform. The results shown here are interesting but are not final. I bet I can do better; by how much is what we&amp;#39;ll find out soon enough.&lt;/p&gt; &lt;p&gt;We will here compare a 1000G setup on my desktop, and a 3000G setup at the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac6ad4c2b8&quot;&gt;CWI&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aac117f8cb8&quot;&gt;Scilens cluster&lt;/a&gt;. The former is 2 boxes of dual Xeon E5 2630, and the latter is 8 boxes of dual Xeon E5 2650v2. All things run from memory and both have QDR IB interconnect. Counting cores and clock, the CWI cluster is 6x larger.&lt;/p&gt; &lt;p&gt;As a rough approximation, for the worst queries, 6x the gear runs 3x the data in the same amount of real time. The 1000G setup has near full platform utilization and the 3000G setup has about half platform utilization. In both cases, running two instances of the same query at the same time takes twice as long.&lt;/p&gt; &lt;p&gt;We use &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaca8c272f8&quot;&gt;Q9&lt;/a&gt; for this study. The plan makes a hash table of &lt;code&gt;part&lt;/code&gt; with 1/14 of all &lt;code&gt;parts&lt;/code&gt;, replicating to all processes. Then there is a hash table of &lt;code&gt;partsupp&lt;/code&gt; with a key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt;, and a dependent of &lt;code&gt;ps_supplycost&lt;/code&gt;. This is much larger than the &lt;code&gt;part&lt;/code&gt; hash table and is therefore partitioned on &lt;code&gt;ps_partkey&lt;/code&gt;. The build is for 1/14th of &lt;code&gt;partsupp&lt;/code&gt;. Then there is a scan of &lt;code&gt;lineitem&lt;/code&gt; filtered by the &lt;code&gt;part&lt;/code&gt; hash table; then a cross-partition join to the &lt;code&gt;partsupp&lt;/code&gt; hash table; then a cross partition join to &lt;code&gt;orders&lt;/code&gt;, this time by index; then a hash join on a replicated hash table of &lt;code&gt;supplier&lt;/code&gt;; then &lt;code&gt;nation&lt;/code&gt;; then aggregation. The aggregation is done in each slice; then the slices are added up at the end.&lt;/p&gt; &lt;p&gt;The plan could be made better by one fewer partition crossing. Now there is a crossing from &lt;code&gt;l_orderkey&lt;/code&gt; to &lt;code&gt;l_partkey&lt;/code&gt; and back to &lt;code&gt;o_orderkey&lt;/code&gt;. This would not be so if the cost model knew that the &lt;code&gt;partsupp&lt;/code&gt; always hits. The cost model thinks it hits 1/14 of the time, because it does not know that the selection on the build is exactly the same as on the probe.&lt;/p&gt; &lt;p&gt;For the present purposes, the extra crossing just serves to make the matter of interest more visible.&lt;/p&gt; &lt;p&gt;So, for the 1000G setup, we have 43.6 seconds (s) and &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 4 nodes, 44 s. 459 m/s 119788 KB/s 3120% cpu 0% read 19% clw threads 1r 0w 0i buffers 17622126 68 d 0 w 0 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;For the 3000G setup, we have 49.9 s and &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 16 nodes, 50 s. 49389 m/s 1801815 KB/s 7283% cpu 0% read 18% clw threads 1r 0w 0i buffers 135122893 15895255 d 0 w 17 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The platform utilization on the small system is better, at 31/48 (running/total threads); the large one has 73/256.&lt;/p&gt; &lt;p&gt;The large case is clearly network bound. If this were for CPU only, it should be done in half the time it takes the small system to do 1000G. &lt;/p&gt; &lt;p&gt;We confirm this by looking at write wait: 3940 seconds of thread time blocked on write over 50s of real time. The figures on the small one are 3.9s of thread time blocked for 39s of real time. The data transfer on the large one is 93 GB. &lt;/p&gt; &lt;p&gt;How to block less? One idea would be to write less. So we try compression; there is a Google snappy-based message compression option in Virtuoso. &lt;/p&gt; &lt;p&gt;We now get 39.6 s and&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 16 nodes, 40 s. 65161 m/s 1239922 KB/s 10201% cpu 0% read 21% clw threads 1r 0w 0i buffers 52828440 172 d 0 w 0 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The write block time is 397 s of thread time over 39 s of real time, 10x better. The data transfer is 50.9 GB after compression. Snappy is somewhat effective for compression and very fast; in CPU profile, it is under 3% of Q9 on the small system. Gains on the small system are less, though, since blocking is not a big issue to start with.&lt;/p&gt; &lt;p&gt;This is still not full platform. But if the data transfer is further cut in half by a better plan, the situation will be quite good. Now we have 102/256 threads running, meaning that there could be another 40-50% of throughput to be added. The last 128 threads are second threads of a core, so count for roughly 30% of a real core.&lt;/p&gt; &lt;p&gt;The main cluster-specific operation is a send from one to many. This is now done by formulating the message to each recipient in a chain of string buffers; then, after all the messages are prepared, these are optionally compressed and sent to their recipient. This is needlessly simple: Compressing can proceed if ever there is a would-block situation on writing. If all the compression is done, then a blocked write should switch to another recipient, and only after all recipients have a would-block situation, then the thread can call-select with all descriptors and block on them collectively. There is a piece of code to this effect, but is not now being used. It has been seen to add no value in small cases, but could be useful here. &lt;/p&gt; &lt;p&gt;The IB fabric has been seen to do 1.8 GB/s bidirectionally on multiple independent point-to-point TCP links. This is about half the nominal 4 GB/s (40 Gbit/s with 10/8 encoding). So the aggregate throughputs that we see here are nowhere near the nominal spec of the network. Lower level interfaces and the occasional busy wait on the reading end could be tried to some advantage. We have not tried 10GbE either; but if that works at nominal speed, then 10GbE should also be good enough. We will try this at Amazon in due time.&lt;/p&gt; &lt;p&gt;In the meantime, there is a 3000G test made at the CWI cluster without message compression. The score is about 4x that of the single server at 300G using the same hardware. The run is with approximately half platform utilization. There are three runs of power plus throughput, the first run being cold.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;305,881.5&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,072,411.9&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;572,739.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,292,085.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,179,391.6&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,234,453.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,178,534.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,092,936.2&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,134,928.4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The numerical quantities summaries follow. One problem of the run is a high peak of query memory consumption leading to slowdown. Some parts should probably be done in multiple passes to keep the peak lower and not run into swapping. The details will have to be sorted out. This is a demonstration of capability; the perfected accomplishment is to follow.&lt;/p&gt; &lt;h2&gt;3000G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;305,881.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;1,072,411.9&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;572,739.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;1,772.554000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 12:54:52&lt;/td&gt; &lt;td&gt;09/29/2014 13:31:17&lt;/td&gt; &lt;td&gt;0:36:25&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:24&lt;/td&gt; &lt;td&gt;0:28:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:59&lt;/td&gt; &lt;td&gt;0:27:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:29&lt;/td&gt; &lt;td&gt;0:27:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:52&lt;/td&gt; &lt;td&gt;0:27:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:06&lt;/td&gt; &lt;td&gt;0:28:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:18&lt;/td&gt; &lt;td&gt;0:26:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;0:28:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:50&lt;/td&gt; &lt;td&gt;0:27:26&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 12:54:52&lt;/td&gt; &lt;td&gt;09/29/2014 12:56:59&lt;/td&gt; &lt;td&gt;0:02:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 13:31:17&lt;/td&gt; &lt;td&gt;09/29/2014 13:31:23&lt;/td&gt; &lt;td&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:00:38&lt;/td&gt; &lt;td&gt;09/29/2014 14:01:11&lt;/td&gt; &lt;td&gt;0:00:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:25&lt;/td&gt; &lt;td&gt;09/29/2014 13:36:57&lt;/td&gt; &lt;td&gt;0:05:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 13:36:56&lt;/td&gt; &lt;td&gt;09/29/2014 13:47:02&lt;/td&gt; &lt;td&gt;0:10:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 13:47:03&lt;/td&gt; &lt;td&gt;09/29/2014 13:51:40&lt;/td&gt; &lt;td&gt;0:04:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 13:51:42&lt;/td&gt; &lt;td&gt;09/29/2014 13:56:40&lt;/td&gt; &lt;td&gt;0:04:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 13:56:40&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;0:02:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:10&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:00:11&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:37&lt;/td&gt; &lt;td&gt;0:00:26&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;601.576975&lt;/td&gt; &lt;td&gt;90.803782&lt;/td&gt; &lt;td&gt;108.725110&lt;/td&gt; &lt;td&gt;177.112667&lt;/td&gt; &lt;td&gt;171.995572&lt;/td&gt; &lt;td&gt;2.098138&lt;/td&gt; &lt;td&gt;15.768311&lt;/td&gt; &lt;td&gt;152.511444&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;13.310341&lt;/td&gt; &lt;td&gt;32.722946&lt;/td&gt; &lt;td&gt;125.551415&lt;/td&gt; &lt;td&gt;1.912836&lt;/td&gt; &lt;td&gt;46.041675&lt;/td&gt; &lt;td&gt;13.294214&lt;/td&gt; &lt;td&gt;85.345068&lt;/td&gt; &lt;td&gt;165.424288&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;19.425885&lt;/td&gt; &lt;td&gt;9.248670&lt;/td&gt; &lt;td&gt;150.855556&lt;/td&gt; &lt;td&gt;7.085737&lt;/td&gt; &lt;td&gt;88.445566&lt;/td&gt; &lt;td&gt;10.490432&lt;/td&gt; &lt;td&gt;49.318554&lt;/td&gt; &lt;td&gt;322.500839&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;30.534391&lt;/td&gt; &lt;td&gt;14.273478&lt;/td&gt; &lt;td&gt;100.987791&lt;/td&gt; &lt;td&gt;59.341763&lt;/td&gt; &lt;td&gt;46.442443&lt;/td&gt; &lt;td&gt;9.613795&lt;/td&gt; &lt;td&gt;64.186196&lt;/td&gt; &lt;td&gt;146.324186&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;28.211213&lt;/td&gt; &lt;td&gt;37.134522&lt;/td&gt; &lt;td&gt;64.189335&lt;/td&gt; &lt;td&gt;10.931513&lt;/td&gt; &lt;td&gt;100.610673&lt;/td&gt; &lt;td&gt;9.929866&lt;/td&gt; &lt;td&gt;112.270530&lt;/td&gt; &lt;td&gt;108.489951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;29.226411&lt;/td&gt; &lt;td&gt;18.132589&lt;/td&gt; &lt;td&gt;95.245160&lt;/td&gt; &lt;td&gt;63.100068&lt;/td&gt; &lt;td&gt;115.663908&lt;/td&gt; &lt;td&gt;6.151231&lt;/td&gt; &lt;td&gt;46.251309&lt;/td&gt; &lt;td&gt;127.742471&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;30.750930&lt;/td&gt; &lt;td&gt;20.888658&lt;/td&gt; &lt;td&gt;108.894177&lt;/td&gt; &lt;td&gt;55.168565&lt;/td&gt; &lt;td&gt;82.016828&lt;/td&gt; &lt;td&gt;69.451493&lt;/td&gt; &lt;td&gt;65.161517&lt;/td&gt; &lt;td&gt;103.697733&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;13.462570&lt;/td&gt; &lt;td&gt;18.033847&lt;/td&gt; &lt;td&gt;32.065492&lt;/td&gt; &lt;td&gt;78.910373&lt;/td&gt; &lt;td&gt;202.998301&lt;/td&gt; &lt;td&gt;10.688279&lt;/td&gt; &lt;td&gt;47.167022&lt;/td&gt; &lt;td&gt;139.601948&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;24.354314&lt;/td&gt; &lt;td&gt;16.711503&lt;/td&gt; &lt;td&gt;112.008551&lt;/td&gt; &lt;td&gt;8.307098&lt;/td&gt; &lt;td&gt;126.849630&lt;/td&gt; &lt;td&gt;7.127605&lt;/td&gt; &lt;td&gt;51.083118&lt;/td&gt; &lt;td&gt;98.648077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;13.310341&lt;/td&gt; &lt;td&gt;9.248670&lt;/td&gt; &lt;td&gt;32.065492&lt;/td&gt; &lt;td&gt;1.912836&lt;/td&gt; &lt;td&gt;46.041675&lt;/td&gt; &lt;td&gt;6.151231&lt;/td&gt; &lt;td&gt;46.251309&lt;/td&gt; &lt;td&gt;98.648077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;30.750930&lt;/td&gt; &lt;td&gt;37.134522&lt;/td&gt; &lt;td&gt;150.855556&lt;/td&gt; &lt;td&gt;78.910373&lt;/td&gt; &lt;td&gt;202.998301&lt;/td&gt; &lt;td&gt;69.451493&lt;/td&gt; &lt;td&gt;112.270530&lt;/td&gt; &lt;td&gt;322.500839&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;23.659507&lt;/td&gt; &lt;td&gt;20.893277&lt;/td&gt; &lt;td&gt;98.724685&lt;/td&gt; &lt;td&gt;35.594744&lt;/td&gt; &lt;td&gt;101.133628&lt;/td&gt; &lt;td&gt;17.093364&lt;/td&gt; &lt;td&gt;65.097914&lt;/td&gt; &lt;td&gt;151.553687&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;92.991259&lt;/td&gt; &lt;td&gt;5.175922&lt;/td&gt; &lt;td&gt;42.238393&lt;/td&gt; &lt;td&gt;29.239879&lt;/td&gt; &lt;td&gt;367.805534&lt;/td&gt; &lt;td&gt;3.604910&lt;/td&gt; &lt;td&gt;15.557396&lt;/td&gt; &lt;td&gt;11.650267&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;149.502128&lt;/td&gt; &lt;td&gt;30.197806&lt;/td&gt; &lt;td&gt;50.786184&lt;/td&gt; &lt;td&gt;217.190836&lt;/td&gt; &lt;td&gt;283.545905&lt;/td&gt; &lt;td&gt;11.653171&lt;/td&gt; &lt;td&gt;73.321150&lt;/td&gt; &lt;td&gt;116.860455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;245.783668&lt;/td&gt; &lt;td&gt;22.278841&lt;/td&gt; &lt;td&gt;50.578731&lt;/td&gt; &lt;td&gt;36.301810&lt;/td&gt; &lt;td&gt;181.405269&lt;/td&gt; &lt;td&gt;32.236754&lt;/td&gt; &lt;td&gt;57.631764&lt;/td&gt; &lt;td&gt;61.540533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;377.782738&lt;/td&gt; &lt;td&gt;24.129319&lt;/td&gt; &lt;td&gt;84.097657&lt;/td&gt; &lt;td&gt;10.959661&lt;/td&gt; &lt;td&gt;171.698669&lt;/td&gt; &lt;td&gt;8.973519&lt;/td&gt; &lt;td&gt;54.532180&lt;/td&gt; &lt;td&gt;45.527142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;341.148908&lt;/td&gt; &lt;td&gt;74.358770&lt;/td&gt; &lt;td&gt;85.782399&lt;/td&gt; &lt;td&gt;43.116347&lt;/td&gt; &lt;td&gt;151.146233&lt;/td&gt; &lt;td&gt;22.870727&lt;/td&gt; &lt;td&gt;74.439693&lt;/td&gt; &lt;td&gt;51.871535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;72.259919&lt;/td&gt; &lt;td&gt;11.424035&lt;/td&gt; &lt;td&gt;79.310504&lt;/td&gt; &lt;td&gt;9.833135&lt;/td&gt; &lt;td&gt;562.871920&lt;/td&gt; &lt;td&gt;14.961209&lt;/td&gt; &lt;td&gt;127.861874&lt;/td&gt; &lt;td&gt;55.377721&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;373.301225&lt;/td&gt; &lt;td&gt;41.379753&lt;/td&gt; &lt;td&gt;81.983260&lt;/td&gt; &lt;td&gt;9.373200&lt;/td&gt; &lt;td&gt;95.039317&lt;/td&gt; &lt;td&gt;19.071346&lt;/td&gt; &lt;td&gt;76.159452&lt;/td&gt; &lt;td&gt;48.324504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;449.871952&lt;/td&gt; &lt;td&gt;16.099152&lt;/td&gt; &lt;td&gt;48.047940&lt;/td&gt; &lt;td&gt;8.559784&lt;/td&gt; &lt;td&gt;211.094730&lt;/td&gt; &lt;td&gt;10.569071&lt;/td&gt; &lt;td&gt;26.710228&lt;/td&gt; &lt;td&gt;72.571454&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;395.771006&lt;/td&gt; &lt;td&gt;33.537585&lt;/td&gt; &lt;td&gt;54.850876&lt;/td&gt; &lt;td&gt;141.526389&lt;/td&gt; &lt;td&gt;153.763316&lt;/td&gt; &lt;td&gt;12.997092&lt;/td&gt; &lt;td&gt;127.961975&lt;/td&gt; &lt;td&gt;57.100346&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;72.259919&lt;/td&gt; &lt;td&gt;11.424035&lt;/td&gt; &lt;td&gt;48.047940&lt;/td&gt; &lt;td&gt;8.559784&lt;/td&gt; &lt;td&gt;95.039317&lt;/td&gt; &lt;td&gt;8.973519&lt;/td&gt; &lt;td&gt;26.710228&lt;/td&gt; &lt;td&gt;45.527142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;449.871952&lt;/td&gt; &lt;td&gt;74.358770&lt;/td&gt; &lt;td&gt;85.782399&lt;/td&gt; &lt;td&gt;217.190836&lt;/td&gt; &lt;td&gt;562.871920&lt;/td&gt; &lt;td&gt;32.236754&lt;/td&gt; &lt;td&gt;127.961975&lt;/td&gt; &lt;td&gt;116.860455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;300.677693&lt;/td&gt; &lt;td&gt;31.675658&lt;/td&gt; &lt;td&gt;66.929694&lt;/td&gt; &lt;td&gt;59.607645&lt;/td&gt; &lt;td&gt;226.320670&lt;/td&gt; &lt;td&gt;16.666611&lt;/td&gt; &lt;td&gt;77.327289&lt;/td&gt; &lt;td&gt;63.646711&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;12.230334&lt;/td&gt; &lt;td&gt;70.991261&lt;/td&gt; &lt;td&gt;33.092797&lt;/td&gt; &lt;td&gt;17.517230&lt;/td&gt; &lt;td&gt;15.798438&lt;/td&gt; &lt;td&gt;19.743562&lt;/td&gt; &lt;td&gt;127.494687&lt;/td&gt; &lt;td&gt;5.893471&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;27.550293&lt;/td&gt; &lt;td&gt;14.970857&lt;/td&gt; &lt;td&gt;16.442806&lt;/td&gt; &lt;td&gt;111.138612&lt;/td&gt; &lt;td&gt;68.214095&lt;/td&gt; &lt;td&gt;7.884782&lt;/td&gt; &lt;td&gt;27.109441&lt;/td&gt; &lt;td&gt;6.087067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;43.277918&lt;/td&gt; &lt;td&gt;12.748690&lt;/td&gt; &lt;td&gt;22.681844&lt;/td&gt; &lt;td&gt;92.835566&lt;/td&gt; &lt;td&gt;84.416610&lt;/td&gt; &lt;td&gt;14.661934&lt;/td&gt; &lt;td&gt;151.094498&lt;/td&gt; &lt;td&gt;153.285076&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;129.696125&lt;/td&gt; &lt;td&gt;13.435663&lt;/td&gt; &lt;td&gt;14.674499&lt;/td&gt; &lt;td&gt;129.179966&lt;/td&gt; &lt;td&gt;39.176513&lt;/td&gt; &lt;td&gt;6.286296&lt;/td&gt; &lt;td&gt;181.596838&lt;/td&gt; &lt;td&gt;416.052710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;110.348816&lt;/td&gt; &lt;td&gt;7.080225&lt;/td&gt; &lt;td&gt;21.051910&lt;/td&gt; &lt;td&gt;85.758973&lt;/td&gt; &lt;td&gt;65.130356&lt;/td&gt; &lt;td&gt;7.292999&lt;/td&gt; &lt;td&gt;123.386514&lt;/td&gt; &lt;td&gt;151.000786&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;43.365006&lt;/td&gt; &lt;td&gt;9.847612&lt;/td&gt; &lt;td&gt;32.881770&lt;/td&gt; &lt;td&gt;94.752284&lt;/td&gt; &lt;td&gt;67.788314&lt;/td&gt; &lt;td&gt;9.035439&lt;/td&gt; &lt;td&gt;72.539334&lt;/td&gt; &lt;td&gt;223.967821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;34.534280&lt;/td&gt; &lt;td&gt;36.347298&lt;/td&gt; &lt;td&gt;27.849276&lt;/td&gt; &lt;td&gt;122.736244&lt;/td&gt; &lt;td&gt;51.447492&lt;/td&gt; &lt;td&gt;25.051058&lt;/td&gt; &lt;td&gt;80.452175&lt;/td&gt; &lt;td&gt;84.519426&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;48.021860&lt;/td&gt; &lt;td&gt;30.594474&lt;/td&gt; &lt;td&gt;22.522426&lt;/td&gt; &lt;td&gt;99.245893&lt;/td&gt; &lt;td&gt;73.076698&lt;/td&gt; &lt;td&gt;7.260729&lt;/td&gt; &lt;td&gt;38.585852&lt;/td&gt; &lt;td&gt;5.697277&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;29.484201&lt;/td&gt; &lt;td&gt;12.368769&lt;/td&gt; &lt;td&gt;40.344043&lt;/td&gt; &lt;td&gt;84.137820&lt;/td&gt; &lt;td&gt;30.813313&lt;/td&gt; &lt;td&gt;4.856991&lt;/td&gt; &lt;td&gt;22.196547&lt;/td&gt; &lt;td&gt;4.600057&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;27.550293&lt;/td&gt; &lt;td&gt;7.080225&lt;/td&gt; &lt;td&gt;14.674499&lt;/td&gt; &lt;td&gt;84.137820&lt;/td&gt; &lt;td&gt;30.813313&lt;/td&gt; &lt;td&gt;4.856991&lt;/td&gt; &lt;td&gt;22.196547&lt;/td&gt; &lt;td&gt;4.600057&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;129.696125&lt;/td&gt; &lt;td&gt;36.347298&lt;/td&gt; &lt;td&gt;40.344043&lt;/td&gt; &lt;td&gt;129.179966&lt;/td&gt; &lt;td&gt;84.416610&lt;/td&gt; &lt;td&gt;25.051058&lt;/td&gt; &lt;td&gt;181.596838&lt;/td&gt; &lt;td&gt;416.052710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;58.284812&lt;/td&gt; &lt;td&gt;17.174198&lt;/td&gt; &lt;td&gt;24.806072&lt;/td&gt; &lt;td&gt;102.473170&lt;/td&gt; &lt;td&gt;60.007924&lt;/td&gt; &lt;td&gt;10.291279&lt;/td&gt; &lt;td&gt;87.120150&lt;/td&gt; &lt;td&gt;130.651277&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;3000G Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt; 1292085.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt; 1179391.6 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt; 1234453.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt; 1611.779000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:01:15&lt;/td&gt; &lt;td&gt;09/29/2014 14:06:48&lt;/td&gt; &lt;td&gt;0:05:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:30:22&lt;/td&gt; &lt;td&gt;0:23:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:30&lt;/td&gt; &lt;td&gt;0:25:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:23&lt;/td&gt; &lt;td&gt;0:24:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:34&lt;/td&gt; &lt;td&gt;0:24:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:53&lt;/td&gt; &lt;td&gt;0:26:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:29:51&lt;/td&gt; &lt;td&gt;0:22:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:34&lt;/td&gt; &lt;td&gt;0:24:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:30:35&lt;/td&gt; &lt;td&gt;0:23:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:01:15&lt;/td&gt; &lt;td&gt;09/29/2014 14:01:35&lt;/td&gt; &lt;td&gt;0:00:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 14:06:49&lt;/td&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;0:00:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:16&lt;/td&gt; &lt;td&gt;09/29/2014 14:33:45&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:55&lt;/td&gt; &lt;td&gt;09/29/2014 14:12:28&lt;/td&gt; &lt;td&gt;0:05:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:12:29&lt;/td&gt; &lt;td&gt;09/29/2014 14:21:55&lt;/td&gt; &lt;td&gt;0:09:26&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:21:55&lt;/td&gt; &lt;td&gt;09/29/2014 14:27:40&lt;/td&gt; &lt;td&gt;0:05:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:27:43&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:14&lt;/td&gt; &lt;td&gt;0:03:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:31:14&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:51&lt;/td&gt; &lt;td&gt;0:00:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:31:51&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:52&lt;/td&gt; &lt;td&gt;0:01:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:32:52&lt;/td&gt; &lt;td&gt;09/29/2014 14:33:16&lt;/td&gt; &lt;td&gt;0:00:24&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;9.451169&lt;/td&gt; &lt;td&gt;3.644118&lt;/td&gt; &lt;td&gt;18.419151&lt;/td&gt; &lt;td&gt;1.404395&lt;/td&gt; &lt;td&gt;15.740525&lt;/td&gt; &lt;td&gt;2.085038&lt;/td&gt; &lt;td&gt;15.171847&lt;/td&gt; &lt;td&gt;25.400834&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;19.558041&lt;/td&gt; &lt;td&gt;6.607300&lt;/td&gt; &lt;td&gt;85.774410&lt;/td&gt; &lt;td&gt;4.503525&lt;/td&gt; &lt;td&gt;81.448472&lt;/td&gt; &lt;td&gt;11.976129&lt;/td&gt; &lt;td&gt;92.140470&lt;/td&gt; &lt;td&gt;145.743853&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;31.042019&lt;/td&gt; &lt;td&gt;7.877299&lt;/td&gt; &lt;td&gt;71.958033&lt;/td&gt; &lt;td&gt;8.862111&lt;/td&gt; &lt;td&gt;142.452144&lt;/td&gt; &lt;td&gt;18.489193&lt;/td&gt; &lt;td&gt;81.003310&lt;/td&gt; &lt;td&gt;85.856529&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;38.833612&lt;/td&gt; &lt;td&gt;12.440326&lt;/td&gt; &lt;td&gt;86.063103&lt;/td&gt; &lt;td&gt;7.165120&lt;/td&gt; &lt;td&gt;84.707025&lt;/td&gt; &lt;td&gt;16.931531&lt;/td&gt; &lt;td&gt;100.442710&lt;/td&gt; &lt;td&gt;122.411252&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;15.751913&lt;/td&gt; &lt;td&gt;33.026762&lt;/td&gt; &lt;td&gt;50.457193&lt;/td&gt; &lt;td&gt;7.064220&lt;/td&gt; &lt;td&gt;114.130257&lt;/td&gt; &lt;td&gt;5.992556&lt;/td&gt; &lt;td&gt;66.035959&lt;/td&gt; &lt;td&gt;84.596973&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;18.462884&lt;/td&gt; &lt;td&gt;28.047942&lt;/td&gt; &lt;td&gt;110.690543&lt;/td&gt; &lt;td&gt;16.566547&lt;/td&gt; &lt;td&gt;104.403789&lt;/td&gt; &lt;td&gt;5.303453&lt;/td&gt; &lt;td&gt;72.552640&lt;/td&gt; &lt;td&gt;402.383383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;17.858339&lt;/td&gt; &lt;td&gt;33.988800&lt;/td&gt; &lt;td&gt;110.431091&lt;/td&gt; &lt;td&gt;7.238431&lt;/td&gt; &lt;td&gt;72.229953&lt;/td&gt; &lt;td&gt;16.850955&lt;/td&gt; &lt;td&gt;68.231546&lt;/td&gt; &lt;td&gt;180.601000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;23.055572&lt;/td&gt; &lt;td&gt;17.044813&lt;/td&gt; &lt;td&gt;96.105520&lt;/td&gt; &lt;td&gt;8.941132&lt;/td&gt; &lt;td&gt;171.130879&lt;/td&gt; &lt;td&gt;8.423100&lt;/td&gt; &lt;td&gt;70.634541&lt;/td&gt; &lt;td&gt;147.261648&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;19.840798&lt;/td&gt; &lt;td&gt;13.860740&lt;/td&gt; &lt;td&gt;74.961175&lt;/td&gt; &lt;td&gt;16.171566&lt;/td&gt; &lt;td&gt;56.165875&lt;/td&gt; &lt;td&gt;5.904921&lt;/td&gt; &lt;td&gt;47.646217&lt;/td&gt; &lt;td&gt;125.991819&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;15.751913&lt;/td&gt; &lt;td&gt;6.607300&lt;/td&gt; &lt;td&gt;50.457193&lt;/td&gt; &lt;td&gt;4.503525&lt;/td&gt; &lt;td&gt;56.165875&lt;/td&gt; &lt;td&gt;5.303453&lt;/td&gt; &lt;td&gt;47.646217&lt;/td&gt; &lt;td&gt;84.596973&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;38.833612&lt;/td&gt; &lt;td&gt;33.988800&lt;/td&gt; &lt;td&gt;110.690543&lt;/td&gt; &lt;td&gt;16.566547&lt;/td&gt; &lt;td&gt;171.130879&lt;/td&gt; &lt;td&gt;18.489193&lt;/td&gt; &lt;td&gt;100.442710&lt;/td&gt; &lt;td&gt;402.383383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;23.050397&lt;/td&gt; &lt;td&gt;19.111748&lt;/td&gt; &lt;td&gt;85.805134&lt;/td&gt; &lt;td&gt;9.564082&lt;/td&gt; &lt;td&gt;103.333549&lt;/td&gt; &lt;td&gt;11.233980&lt;/td&gt; &lt;td&gt;74.835924&lt;/td&gt; &lt;td&gt;161.855807&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;54.766945&lt;/td&gt; &lt;td&gt;5.551163&lt;/td&gt; &lt;td&gt;29.216632&lt;/td&gt; &lt;td&gt;3.035008&lt;/td&gt; &lt;td&gt;52.816902&lt;/td&gt; &lt;td&gt;3.346243&lt;/td&gt; &lt;td&gt;15.767022&lt;/td&gt; &lt;td&gt;10.066112&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;130.666380&lt;/td&gt; &lt;td&gt;9.658277&lt;/td&gt; &lt;td&gt;49.332720&lt;/td&gt; &lt;td&gt;103.036705&lt;/td&gt; &lt;td&gt;194.520370&lt;/td&gt; &lt;td&gt;12.166344&lt;/td&gt; &lt;td&gt;65.144599&lt;/td&gt; &lt;td&gt;97.158571&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;254.754936&lt;/td&gt; &lt;td&gt;22.605298&lt;/td&gt; &lt;td&gt;38.102466&lt;/td&gt; &lt;td&gt;21.121168&lt;/td&gt; &lt;td&gt;300.467330&lt;/td&gt; &lt;td&gt;12.262318&lt;/td&gt; &lt;td&gt;108.203491&lt;/td&gt; &lt;td&gt;50.696657&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;283.761567&lt;/td&gt; &lt;td&gt;19.327164&lt;/td&gt; &lt;td&gt;73.414574&lt;/td&gt; &lt;td&gt;7.431651&lt;/td&gt; &lt;td&gt;183.121904&lt;/td&gt; &lt;td&gt;12.573854&lt;/td&gt; &lt;td&gt;73.814766&lt;/td&gt; &lt;td&gt;46.802493&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;290.341947&lt;/td&gt; &lt;td&gt;57.452026&lt;/td&gt; &lt;td&gt;58.354221&lt;/td&gt; &lt;td&gt;13.066162&lt;/td&gt; &lt;td&gt;189.263163&lt;/td&gt; &lt;td&gt;18.998781&lt;/td&gt; &lt;td&gt;121.269774&lt;/td&gt; &lt;td&gt;54.831406&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;81.787025&lt;/td&gt; &lt;td&gt;8.410538&lt;/td&gt; &lt;td&gt;79.822552&lt;/td&gt; &lt;td&gt;16.005077&lt;/td&gt; &lt;td&gt;190.730342&lt;/td&gt; &lt;td&gt;21.697136&lt;/td&gt; &lt;td&gt;100.456487&lt;/td&gt; &lt;td&gt;46.744884&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;202.558515&lt;/td&gt; &lt;td&gt;39.360009&lt;/td&gt; &lt;td&gt;74.519981&lt;/td&gt; &lt;td&gt;15.960756&lt;/td&gt; &lt;td&gt;137.321631&lt;/td&gt; &lt;td&gt;26.583824&lt;/td&gt; &lt;td&gt;57.537668&lt;/td&gt; &lt;td&gt;60.758997&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;226.790801&lt;/td&gt; &lt;td&gt;44.175536&lt;/td&gt; &lt;td&gt;73.992368&lt;/td&gt; &lt;td&gt;7.561897&lt;/td&gt; &lt;td&gt;182.853851&lt;/td&gt; &lt;td&gt;17.597471&lt;/td&gt; &lt;td&gt;31.128055&lt;/td&gt; &lt;td&gt;44.389893&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;275.423934&lt;/td&gt; &lt;td&gt;21.980040&lt;/td&gt; &lt;td&gt;60.538239&lt;/td&gt; &lt;td&gt;39.736622&lt;/td&gt; &lt;td&gt;173.574795&lt;/td&gt; &lt;td&gt;58.786316&lt;/td&gt; &lt;td&gt;95.124912&lt;/td&gt; &lt;td&gt;25.564108&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;81.787025&lt;/td&gt; &lt;td&gt;8.410538&lt;/td&gt; &lt;td&gt;38.102466&lt;/td&gt; &lt;td&gt;7.431651&lt;/td&gt; &lt;td&gt;137.321631&lt;/td&gt; &lt;td&gt;12.166344&lt;/td&gt; &lt;td&gt;31.128055&lt;/td&gt; &lt;td&gt;25.564108&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;290.341947&lt;/td&gt; &lt;td&gt;57.452026&lt;/td&gt; &lt;td&gt;79.822552&lt;/td&gt; &lt;td&gt;103.036705&lt;/td&gt; &lt;td&gt;300.467330&lt;/td&gt; &lt;td&gt;58.786316&lt;/td&gt; &lt;td&gt;121.269774&lt;/td&gt; &lt;td&gt;97.158571&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;218.260638&lt;/td&gt; &lt;td&gt;27.871111&lt;/td&gt; &lt;td&gt;63.509640&lt;/td&gt; &lt;td&gt;27.990005&lt;/td&gt; &lt;td&gt;193.981673&lt;/td&gt; &lt;td&gt;22.583255&lt;/td&gt; &lt;td&gt;81.584969&lt;/td&gt; &lt;td&gt;53.368376&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;13.620157&lt;/td&gt; &lt;td&gt;2.288504&lt;/td&gt; &lt;td&gt;4.166807&lt;/td&gt; &lt;td&gt;16.468447&lt;/td&gt; &lt;td&gt;9.991810&lt;/td&gt; &lt;td&gt;1.101775&lt;/td&gt; &lt;td&gt;20.152227&lt;/td&gt; &lt;td&gt;4.294680&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;44.026143&lt;/td&gt; &lt;td&gt;31.720525&lt;/td&gt; &lt;td&gt;25.684461&lt;/td&gt; &lt;td&gt;134.254716&lt;/td&gt; &lt;td&gt;30.797008&lt;/td&gt; &lt;td&gt;9.568594&lt;/td&gt; &lt;td&gt;24.328205&lt;/td&gt; &lt;td&gt;4.319533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;40.283148&lt;/td&gt; &lt;td&gt;9.970277&lt;/td&gt; &lt;td&gt;29.731019&lt;/td&gt; &lt;td&gt;133.083785&lt;/td&gt; &lt;td&gt;29.322194&lt;/td&gt; &lt;td&gt;8.859556&lt;/td&gt; &lt;td&gt;73.251098&lt;/td&gt; &lt;td&gt;249.850045&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;44.288244&lt;/td&gt; &lt;td&gt;18.914661&lt;/td&gt; &lt;td&gt;38.162762&lt;/td&gt; &lt;td&gt;144.458624&lt;/td&gt; &lt;td&gt;22.556235&lt;/td&gt; &lt;td&gt;6.184842&lt;/td&gt; &lt;td&gt;117.267234&lt;/td&gt; &lt;td&gt;445.700238&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;67.147744&lt;/td&gt; &lt;td&gt;6.649451&lt;/td&gt; &lt;td&gt;27.876825&lt;/td&gt; &lt;td&gt;59.226248&lt;/td&gt; &lt;td&gt;69.373248&lt;/td&gt; &lt;td&gt;44.478703&lt;/td&gt; &lt;td&gt;61.381724&lt;/td&gt; &lt;td&gt;282.608075&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;36.403227&lt;/td&gt; &lt;td&gt;12.226129&lt;/td&gt; &lt;td&gt;21.997683&lt;/td&gt; &lt;td&gt;95.912670&lt;/td&gt; &lt;td&gt;44.219799&lt;/td&gt; &lt;td&gt;21.117974&lt;/td&gt; &lt;td&gt;106.473817&lt;/td&gt; &lt;td&gt;97.896971&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;42.114038&lt;/td&gt; &lt;td&gt;30.805969&lt;/td&gt; &lt;td&gt;25.929027&lt;/td&gt; &lt;td&gt;51.658733&lt;/td&gt; &lt;td&gt;26.475662&lt;/td&gt; &lt;td&gt;34.816500&lt;/td&gt; &lt;td&gt;31.309953&lt;/td&gt; &lt;td&gt;5.608395&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;48.601889&lt;/td&gt; &lt;td&gt;18.708127&lt;/td&gt; &lt;td&gt;18.893532&lt;/td&gt; &lt;td&gt;132.558026&lt;/td&gt; &lt;td&gt;50.476383&lt;/td&gt; &lt;td&gt;12.309402&lt;/td&gt; &lt;td&gt;22.661371&lt;/td&gt; &lt;td&gt;37.610815&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;34.413417&lt;/td&gt; &lt;td&gt;34.709883&lt;/td&gt; &lt;td&gt;37.058335&lt;/td&gt; &lt;td&gt;121.710608&lt;/td&gt; &lt;td&gt;44.676485&lt;/td&gt; &lt;td&gt;9.449332&lt;/td&gt; &lt;td&gt;19.311945&lt;/td&gt; &lt;td&gt;4.420232&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;34.413417&lt;/td&gt; &lt;td&gt;6.649451&lt;/td&gt; &lt;td&gt;18.893532&lt;/td&gt; &lt;td&gt;51.658733&lt;/td&gt; &lt;td&gt;22.556235&lt;/td&gt; &lt;td&gt;6.184842&lt;/td&gt; &lt;td&gt;19.311945&lt;/td&gt; &lt;td&gt;4.319533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;67.147744&lt;/td&gt; &lt;td&gt;34.709883&lt;/td&gt; &lt;td&gt;38.162762&lt;/td&gt; &lt;td&gt;144.458624&lt;/td&gt; &lt;td&gt;69.373248&lt;/td&gt; &lt;td&gt;44.478703&lt;/td&gt; &lt;td&gt;117.267234&lt;/td&gt; &lt;td&gt;445.700238&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;44.659731&lt;/td&gt; &lt;td&gt;20.463128&lt;/td&gt; &lt;td&gt;28.166705&lt;/td&gt; &lt;td&gt;109.107926&lt;/td&gt; &lt;td&gt;39.737127&lt;/td&gt; &lt;td&gt;18.348113&lt;/td&gt; &lt;td&gt;56.998168&lt;/td&gt; &lt;td&gt;141.001788&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;3000G Run 3&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt; 1178534.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt; 1092936.2 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt; 1134928.4 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt; 1739.269000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:48&lt;/td&gt; &lt;td&gt;09/29/2014 14:40:59&lt;/td&gt; &lt;td&gt;0:07:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:10:02&lt;/td&gt; &lt;td&gt;0:28:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:07&lt;/td&gt; &lt;td&gt;0:28:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:17&lt;/td&gt; &lt;td&gt;0:28:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:55&lt;/td&gt; &lt;td&gt;0:28:51&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:39&lt;/td&gt; &lt;td&gt;0:28:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:46&lt;/td&gt; &lt;td&gt;0:28:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:58&lt;/td&gt; &lt;td&gt;0:28:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:08:58&lt;/td&gt; &lt;td&gt;0:27:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:48&lt;/td&gt; &lt;td&gt;09/29/2014 14:34:07&lt;/td&gt; &lt;td&gt;0:00:19&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 14:40:59&lt;/td&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;0:00:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:57&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:49&lt;/td&gt; &lt;td&gt;0:02:52&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:05&lt;/td&gt; &lt;td&gt;09/29/2014 14:47:39&lt;/td&gt; &lt;td&gt;0:06:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:47:40&lt;/td&gt; &lt;td&gt;09/29/2014 14:56:46&lt;/td&gt; &lt;td&gt;0:09:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:56:49&lt;/td&gt; &lt;td&gt;09/29/2014 15:03:19&lt;/td&gt; &lt;td&gt;0:06:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 15:03:24&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:45&lt;/td&gt; &lt;td&gt;0:03:21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:46&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:49&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:50&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:53&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 15:10:04&lt;/td&gt; &lt;td&gt;0:03:11&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;9.393632&lt;/td&gt; &lt;td&gt;5.001910&lt;/td&gt; &lt;td&gt;17.053567&lt;/td&gt; &lt;td&gt;1.427500&lt;/td&gt; &lt;td&gt;17.813839&lt;/td&gt; &lt;td&gt;2.230451&lt;/td&gt; &lt;td&gt;13.884490&lt;/td&gt; &lt;td&gt;25.610995&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;12.971454&lt;/td&gt; &lt;td&gt;9.383520&lt;/td&gt; &lt;td&gt;94.257760&lt;/td&gt; &lt;td&gt;1.603106&lt;/td&gt; &lt;td&gt;127.940946&lt;/td&gt; &lt;td&gt;20.791892&lt;/td&gt; &lt;td&gt;78.869819&lt;/td&gt; &lt;td&gt;138.521273&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;21.428177&lt;/td&gt; &lt;td&gt;31.431513&lt;/td&gt; &lt;td&gt;96.366083&lt;/td&gt; &lt;td&gt;5.611843&lt;/td&gt; &lt;td&gt;58.394596&lt;/td&gt; &lt;td&gt;11.279502&lt;/td&gt; &lt;td&gt;47.114473&lt;/td&gt; &lt;td&gt;407.135077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;23.377920&lt;/td&gt; &lt;td&gt;37.474814&lt;/td&gt; &lt;td&gt;83.640621&lt;/td&gt; &lt;td&gt;9.152178&lt;/td&gt; &lt;td&gt;71.186158&lt;/td&gt; &lt;td&gt;11.001543&lt;/td&gt; &lt;td&gt;46.763758&lt;/td&gt; &lt;td&gt;110.015662&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;49.580860&lt;/td&gt; &lt;td&gt;31.979940&lt;/td&gt; &lt;td&gt;87.662950&lt;/td&gt; &lt;td&gt;8.983661&lt;/td&gt; &lt;td&gt;68.052295&lt;/td&gt; &lt;td&gt;14.367631&lt;/td&gt; &lt;td&gt;59.266063&lt;/td&gt; &lt;td&gt;301.788652&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.483836&lt;/td&gt; &lt;td&gt;20.203772&lt;/td&gt; &lt;td&gt;391.980128&lt;/td&gt; &lt;td&gt;12.505446&lt;/td&gt; &lt;td&gt;77.966993&lt;/td&gt; &lt;td&gt;10.487869&lt;/td&gt; &lt;td&gt;52.989448&lt;/td&gt; &lt;td&gt;226.837637&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;38.104903&lt;/td&gt; &lt;td&gt;21.271630&lt;/td&gt; &lt;td&gt;84.689348&lt;/td&gt; &lt;td&gt;8.626460&lt;/td&gt; &lt;td&gt;86.620802&lt;/td&gt; &lt;td&gt;11.981171&lt;/td&gt; &lt;td&gt;69.182098&lt;/td&gt; &lt;td&gt;111.810485&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;20.243617&lt;/td&gt; &lt;td&gt;12.298692&lt;/td&gt; &lt;td&gt;99.547203&lt;/td&gt; &lt;td&gt;6.020951&lt;/td&gt; &lt;td&gt;151.584400&lt;/td&gt; &lt;td&gt;17.528287&lt;/td&gt; &lt;td&gt;62.037348&lt;/td&gt; &lt;td&gt;101.023802&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;22.808294&lt;/td&gt; &lt;td&gt;17.583072&lt;/td&gt; &lt;td&gt;59.180595&lt;/td&gt; &lt;td&gt;5.618565&lt;/td&gt; &lt;td&gt;123.108771&lt;/td&gt; &lt;td&gt;11.477376&lt;/td&gt; &lt;td&gt;42.485363&lt;/td&gt; &lt;td&gt;92.035709&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;12.971454&lt;/td&gt; &lt;td&gt;9.383520&lt;/td&gt; &lt;td&gt;59.180595&lt;/td&gt; &lt;td&gt;1.603106&lt;/td&gt; &lt;td&gt;58.394596&lt;/td&gt; &lt;td&gt;10.487869&lt;/td&gt; &lt;td&gt;42.485363&lt;/td&gt; &lt;td&gt;92.035709&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;49.580860&lt;/td&gt; &lt;td&gt;37.474814&lt;/td&gt; &lt;td&gt;391.980128&lt;/td&gt; &lt;td&gt;12.505446&lt;/td&gt; &lt;td&gt;151.584400&lt;/td&gt; &lt;td&gt;20.791892&lt;/td&gt; &lt;td&gt;78.869819&lt;/td&gt; &lt;td&gt;407.135077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;25.249883&lt;/td&gt; &lt;td&gt;22.703369&lt;/td&gt; &lt;td&gt;124.665586&lt;/td&gt; &lt;td&gt;7.265276&lt;/td&gt; &lt;td&gt;95.606870&lt;/td&gt; &lt;td&gt;13.614409&lt;/td&gt; &lt;td&gt;57.338546&lt;/td&gt; &lt;td&gt;186.146037&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;146.487681&lt;/td&gt; &lt;td&gt;6.798942&lt;/td&gt; &lt;td&gt;29.834475&lt;/td&gt; &lt;td&gt;3.177879&lt;/td&gt; &lt;td&gt;55.067866&lt;/td&gt; &lt;td&gt;4.503738&lt;/td&gt; &lt;td&gt;17.215591&lt;/td&gt; &lt;td&gt;9.333281&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;177.581204&lt;/td&gt; &lt;td&gt;44.178095&lt;/td&gt; &lt;td&gt;69.746005&lt;/td&gt; &lt;td&gt;12.306166&lt;/td&gt; &lt;td&gt;215.602727&lt;/td&gt; &lt;td&gt;30.443709&lt;/td&gt; &lt;td&gt;64.276384&lt;/td&gt; &lt;td&gt;45.266949&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;211.311651&lt;/td&gt; &lt;td&gt;27.403143&lt;/td&gt; &lt;td&gt;61.412478&lt;/td&gt; &lt;td&gt;12.173058&lt;/td&gt; &lt;td&gt;216.879170&lt;/td&gt; &lt;td&gt;18.272234&lt;/td&gt; &lt;td&gt;96.753886&lt;/td&gt; &lt;td&gt;35.587072&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;482.581456&lt;/td&gt; &lt;td&gt;68.663026&lt;/td&gt; &lt;td&gt;60.354163&lt;/td&gt; &lt;td&gt;13.408513&lt;/td&gt; &lt;td&gt;187.921639&lt;/td&gt; &lt;td&gt;17.469237&lt;/td&gt; &lt;td&gt;62.337222&lt;/td&gt; &lt;td&gt;31.706120&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;178.297373&lt;/td&gt; &lt;td&gt;23.711312&lt;/td&gt; &lt;td&gt;67.129677&lt;/td&gt; &lt;td&gt;15.216904&lt;/td&gt; &lt;td&gt;328.149575&lt;/td&gt; &lt;td&gt;20.258853&lt;/td&gt; &lt;td&gt;78.891201&lt;/td&gt; &lt;td&gt;84.852368&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;209.496498&lt;/td&gt; &lt;td&gt;28.346366&lt;/td&gt; &lt;td&gt;55.584081&lt;/td&gt; &lt;td&gt;9.644075&lt;/td&gt; &lt;td&gt;131.622351&lt;/td&gt; &lt;td&gt;24.171156&lt;/td&gt; &lt;td&gt;80.046801&lt;/td&gt; &lt;td&gt;43.625932&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;521.691639&lt;/td&gt; &lt;td&gt;24.126176&lt;/td&gt; &lt;td&gt;72.964805&lt;/td&gt; &lt;td&gt;15.311409&lt;/td&gt; &lt;td&gt;146.152570&lt;/td&gt; &lt;td&gt;34.748843&lt;/td&gt; &lt;td&gt;71.957130&lt;/td&gt; &lt;td&gt;58.470644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;580.320149&lt;/td&gt; &lt;td&gt;17.054563&lt;/td&gt; &lt;td&gt;56.172396&lt;/td&gt; &lt;td&gt;7.530832&lt;/td&gt; &lt;td&gt;200.100326&lt;/td&gt; &lt;td&gt;12.444021&lt;/td&gt; &lt;td&gt;25.910599&lt;/td&gt; &lt;td&gt;75.653693&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;472.231674&lt;/td&gt; &lt;td&gt;15.064398&lt;/td&gt; &lt;td&gt;89.875570&lt;/td&gt; &lt;td&gt;42.394675&lt;/td&gt; &lt;td&gt;166.589234&lt;/td&gt; &lt;td&gt;12.831209&lt;/td&gt; &lt;td&gt;81.697881&lt;/td&gt; &lt;td&gt;73.821769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;177.581204&lt;/td&gt; &lt;td&gt;15.064398&lt;/td&gt; &lt;td&gt;55.584081&lt;/td&gt; &lt;td&gt;7.530832&lt;/td&gt; &lt;td&gt;131.622351&lt;/td&gt; &lt;td&gt;12.444021&lt;/td&gt; &lt;td&gt;25.910599&lt;/td&gt; &lt;td&gt;31.706120&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;580.320149&lt;/td&gt; &lt;td&gt;68.663026&lt;/td&gt; &lt;td&gt;89.875570&lt;/td&gt; &lt;td&gt;42.394675&lt;/td&gt; &lt;td&gt;328.149575&lt;/td&gt; &lt;td&gt;34.748843&lt;/td&gt; &lt;td&gt;96.753886&lt;/td&gt; &lt;td&gt;84.852368&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;354.188955&lt;/td&gt; &lt;td&gt;31.068385&lt;/td&gt; &lt;td&gt;66.654897&lt;/td&gt; &lt;td&gt;15.998204&lt;/td&gt; &lt;td&gt;199.127199&lt;/td&gt; &lt;td&gt;21.329908&lt;/td&gt; &lt;td&gt;70.233888&lt;/td&gt; &lt;td&gt;56.123068&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;12.252670&lt;/td&gt; &lt;td&gt;2.593733&lt;/td&gt; &lt;td&gt;4.115862&lt;/td&gt; &lt;td&gt;16.895672&lt;/td&gt; &lt;td&gt;10.183350&lt;/td&gt; &lt;td&gt;1.240096&lt;/td&gt; &lt;td&gt;18.679685&lt;/td&gt; &lt;td&gt;4.876067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;356.740980&lt;/td&gt; &lt;td&gt;21.197870&lt;/td&gt; &lt;td&gt;30.422216&lt;/td&gt; &lt;td&gt;81.779038&lt;/td&gt; &lt;td&gt;65.468650&lt;/td&gt; &lt;td&gt;3.947503&lt;/td&gt; &lt;td&gt;63.933750&lt;/td&gt; &lt;td&gt;107.563796&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;54.087768&lt;/td&gt; &lt;td&gt;10.152604&lt;/td&gt; &lt;td&gt;34.940701&lt;/td&gt; &lt;td&gt;113.510640&lt;/td&gt; &lt;td&gt;70.908809&lt;/td&gt; &lt;td&gt;12.316233&lt;/td&gt; &lt;td&gt;109.091578&lt;/td&gt; &lt;td&gt;283.076004&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;52.807104&lt;/td&gt; &lt;td&gt;18.525982&lt;/td&gt; &lt;td&gt;13.740089&lt;/td&gt; &lt;td&gt;212.364908&lt;/td&gt; &lt;td&gt;16.413964&lt;/td&gt; &lt;td&gt;17.998809&lt;/td&gt; &lt;td&gt;58.653503&lt;/td&gt; &lt;td&gt;483.718271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;42.389062&lt;/td&gt; &lt;td&gt;36.157809&lt;/td&gt; &lt;td&gt;28.909260&lt;/td&gt; &lt;td&gt;86.427025&lt;/td&gt; &lt;td&gt;21.605419&lt;/td&gt; &lt;td&gt;7.608729&lt;/td&gt; &lt;td&gt;54.910853&lt;/td&gt; &lt;td&gt;331.074114&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;48.214794&lt;/td&gt; &lt;td&gt;15.778893&lt;/td&gt; &lt;td&gt;20.681799&lt;/td&gt; &lt;td&gt;130.560005&lt;/td&gt; &lt;td&gt;43.846752&lt;/td&gt; &lt;td&gt;33.905533&lt;/td&gt; &lt;td&gt;54.536966&lt;/td&gt; &lt;td&gt;139.563667&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;84.061840&lt;/td&gt; &lt;td&gt;26.224851&lt;/td&gt; &lt;td&gt;16.546432&lt;/td&gt; &lt;td&gt;117.265210&lt;/td&gt; &lt;td&gt;34.766856&lt;/td&gt; &lt;td&gt;39.037423&lt;/td&gt; &lt;td&gt;0.710642&lt;/td&gt; &lt;td&gt;1.645351&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;63.034890&lt;/td&gt; &lt;td&gt;15.966686&lt;/td&gt; &lt;td&gt;31.666488&lt;/td&gt; &lt;td&gt;112.689765&lt;/td&gt; &lt;td&gt;28.661943&lt;/td&gt; &lt;td&gt;12.828171&lt;/td&gt; &lt;td&gt;1.274731&lt;/td&gt; &lt;td&gt;1.780452&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;43.879104&lt;/td&gt; &lt;td&gt;8.596666&lt;/td&gt; &lt;td&gt;32.585746&lt;/td&gt; &lt;td&gt;177.928730&lt;/td&gt; &lt;td&gt;26.763334&lt;/td&gt; &lt;td&gt;6.112333&lt;/td&gt; &lt;td&gt;1.187693&lt;/td&gt; &lt;td&gt;0.533668&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;42.389062&lt;/td&gt; &lt;td&gt;8.596666&lt;/td&gt; &lt;td&gt;13.740089&lt;/td&gt; &lt;td&gt;81.779038&lt;/td&gt; &lt;td&gt;16.413964&lt;/td&gt; &lt;td&gt;3.947503&lt;/td&gt; &lt;td&gt;0.710642&lt;/td&gt; &lt;td&gt;0.533668&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;356.740980&lt;/td&gt; &lt;td&gt;36.157809&lt;/td&gt; &lt;td&gt;34.940701&lt;/td&gt; &lt;td&gt;212.364908&lt;/td&gt; &lt;td&gt;70.908809&lt;/td&gt; &lt;td&gt;39.037423&lt;/td&gt; &lt;td&gt;109.091578&lt;/td&gt; &lt;td&gt;483.718271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;93.151943&lt;/td&gt; &lt;td&gt;19.075170&lt;/td&gt; &lt;td&gt;26.186591&lt;/td&gt; &lt;td&gt;129.065665&lt;/td&gt; &lt;td&gt;38.554466&lt;/td&gt; &lt;td&gt;16.719342&lt;/td&gt; &lt;td&gt;43.037465&lt;/td&gt; &lt;td&gt;168.619415&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aac00620518&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabeaafeba8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd202f958&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:07.453735-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 19 of n): Scalability, 1000G, and 3000G</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-30#1822</atom:id>
  <atom:published>2014-09-30T20:33:29Z</atom:published>
  <atom:content type="html">&lt;p&gt;Scalability, specifically linear scalability, means that twice the data takes twice as long to process, or that double the gear processes the same data in half the time. This is only literally true for &amp;quot;embarrassingly parallel&amp;quot; workloads.&lt;/p&gt; &lt;p&gt;There are parts of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac693da068&quot;&gt;TPC-H&lt;/a&gt; which have an embarrassingly parallel nature, like &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac3757a2d8&quot;&gt;Q1&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac6ad4c0b8&quot;&gt;Q7&lt;/a&gt;. There are parts that are almost as easy, like Q14, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac116f1f88&quot;&gt;Q17&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aacaa6ec0b8&quot;&gt;Q19&lt;/a&gt;, and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aaca8c66f18&quot;&gt;Q21&lt;/a&gt;, where there is a big scan and a selective hash join with a hash table small enough to replicate everywhere. The scan scales linearly; building the hash does not, since it is done at single-server speed (once in each process). Some queries like &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac116f2728&quot;&gt;Q9&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac6a56bd28&quot;&gt;Q13&lt;/a&gt; end up doing a big cross-partition join which runs into communication overheads.&lt;/p&gt; &lt;p&gt;This is our first look at how performance behaves with bigger data and a larger platform. The results shown here are interesting but are not final. I bet I can do better; by how much is what we&amp;#39;ll find out soon enough.&lt;/p&gt; &lt;p&gt;We will here compare a 1000G setup on my desktop, and a 3000G setup at the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac6ad4c2b8&quot;&gt;CWI&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aac117f8cb8&quot;&gt;Scilens cluster&lt;/a&gt;. The former is 2 boxes of dual Xeon E5 2630, and the latter is 8 boxes of dual Xeon E5 2650v2. All things run from memory and both have QDR IB interconnect. Counting cores and clock, the CWI cluster is 6x larger.&lt;/p&gt; &lt;p&gt;As a rough approximation, for the worst queries, 6x the gear runs 3x the data in the same amount of real time. The 1000G setup has near full platform utilization and the 3000G setup has about half platform utilization. In both cases, running two instances of the same query at the same time takes twice as long.&lt;/p&gt; &lt;p&gt;We use &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aaca8c272f8&quot;&gt;Q9&lt;/a&gt; for this study. The plan makes a hash table of &lt;code&gt;part&lt;/code&gt; with 1/14 of all &lt;code&gt;parts&lt;/code&gt;, replicating to all processes. Then there is a hash table of &lt;code&gt;partsupp&lt;/code&gt; with a key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt;, and a dependent of &lt;code&gt;ps_supplycost&lt;/code&gt;. This is much larger than the &lt;code&gt;part&lt;/code&gt; hash table and is therefore partitioned on &lt;code&gt;ps_partkey&lt;/code&gt;. The build is for 1/14th of &lt;code&gt;partsupp&lt;/code&gt;. Then there is a scan of &lt;code&gt;lineitem&lt;/code&gt; filtered by the &lt;code&gt;part&lt;/code&gt; hash table; then a cross-partition join to the &lt;code&gt;partsupp&lt;/code&gt; hash table; then a cross partition join to &lt;code&gt;orders&lt;/code&gt;, this time by index; then a hash join on a replicated hash table of &lt;code&gt;supplier&lt;/code&gt;; then &lt;code&gt;nation&lt;/code&gt;; then aggregation. The aggregation is done in each slice; then the slices are added up at the end.&lt;/p&gt; &lt;p&gt;The plan could be made better by one fewer partition crossing. Now there is a crossing from &lt;code&gt;l_orderkey&lt;/code&gt; to &lt;code&gt;l_partkey&lt;/code&gt; and back to &lt;code&gt;o_orderkey&lt;/code&gt;. This would not be so if the cost model knew that the &lt;code&gt;partsupp&lt;/code&gt; always hits. The cost model thinks it hits 1/14 of the time, because it does not know that the selection on the build is exactly the same as on the probe.&lt;/p&gt; &lt;p&gt;For the present purposes, the extra crossing just serves to make the matter of interest more visible.&lt;/p&gt; &lt;p&gt;So, for the 1000G setup, we have 43.6 seconds (s) and &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 4 nodes, 44 s. 459 m/s 119788 KB/s 3120% cpu 0% read 19% clw threads 1r 0w 0i buffers 17622126 68 d 0 w 0 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;For the 3000G setup, we have 49.9 s and &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 16 nodes, 50 s. 49389 m/s 1801815 KB/s 7283% cpu 0% read 18% clw threads 1r 0w 0i buffers 135122893 15895255 d 0 w 17 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The platform utilization on the small system is better, at 31/48 (running/total threads); the large one has 73/256.&lt;/p&gt; &lt;p&gt;The large case is clearly network bound. If this were for CPU only, it should be done in half the time it takes the small system to do 1000G. &lt;/p&gt; &lt;p&gt;We confirm this by looking at write wait: 3940 seconds of thread time blocked on write over 50s of real time. The figures on the small one are 3.9s of thread time blocked for 39s of real time. The data transfer on the large one is 93 GB. &lt;/p&gt; &lt;p&gt;How to block less? One idea would be to write less. So we try compression; there is a Google snappy-based message compression option in Virtuoso. &lt;/p&gt; &lt;p&gt;We now get 39.6 s and&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;Cluster 16 nodes, 40 s. 65161 m/s 1239922 KB/s 10201% cpu 0% read 21% clw threads 1r 0w 0i buffers 52828440 172 d 0 w 0 pfs&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The write block time is 397 s of thread time over 39 s of real time, 10x better. The data transfer is 50.9 GB after compression. Snappy is somewhat effective for compression and very fast; in CPU profile, it is under 3% of Q9 on the small system. Gains on the small system are less, though, since blocking is not a big issue to start with.&lt;/p&gt; &lt;p&gt;This is still not full platform. But if the data transfer is further cut in half by a better plan, the situation will be quite good. Now we have 102/256 threads running, meaning that there could be another 40-50% of throughput to be added. The last 128 threads are second threads of a core, so count for roughly 30% of a real core.&lt;/p&gt; &lt;p&gt;The main cluster-specific operation is a send from one to many. This is now done by formulating the message to each recipient in a chain of string buffers; then, after all the messages are prepared, these are optionally compressed and sent to their recipient. This is needlessly simple: Compressing can proceed if ever there is a would-block situation on writing. If all the compression is done, then a blocked write should switch to another recipient, and only after all recipients have a would-block situation, then the thread can call-select with all descriptors and block on them collectively. There is a piece of code to this effect, but is not now being used. It has been seen to add no value in small cases, but could be useful here. &lt;/p&gt; &lt;p&gt;The IB fabric has been seen to do 1.8 GB/s bidirectionally on multiple independent point-to-point TCP links. This is about half the nominal 4 GB/s (40 Gbit/s with 10/8 encoding). So the aggregate throughputs that we see here are nowhere near the nominal spec of the network. Lower level interfaces and the occasional busy wait on the reading end could be tried to some advantage. We have not tried 10GbE either; but if that works at nominal speed, then 10GbE should also be good enough. We will try this at Amazon in due time.&lt;/p&gt; &lt;p&gt;In the meantime, there is a 3000G test made at the CWI cluster without message compression. The score is about 4x that of the single server at 300G using the same hardware. The run is with approximately half platform utilization. There are three runs of power plus throughput, the first run being cold.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;305,881.5&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,072,411.9&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;572,739.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,292,085.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,179,391.6&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,234,453.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,178,534.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,092,936.2&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,134,928.4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The numerical quantities summaries follow. One problem of the run is a high peak of query memory consumption leading to slowdown. Some parts should probably be done in multiple passes to keep the peak lower and not run into swapping. The details will have to be sorted out. This is a demonstration of capability; the perfected accomplishment is to follow.&lt;/p&gt; &lt;h2&gt;3000G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;305,881.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;1,072,411.9&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;572,739.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;1,772.554000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 12:54:52&lt;/td&gt; &lt;td&gt;09/29/2014 13:31:17&lt;/td&gt; &lt;td&gt;0:36:25&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:24&lt;/td&gt; &lt;td&gt;0:28:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:59&lt;/td&gt; &lt;td&gt;0:27:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:29&lt;/td&gt; &lt;td&gt;0:27:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:52&lt;/td&gt; &lt;td&gt;0:27:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:06&lt;/td&gt; &lt;td&gt;0:28:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:18&lt;/td&gt; &lt;td&gt;0:26:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;0:28:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:24&lt;/td&gt; &lt;td&gt;09/29/2014 13:58:50&lt;/td&gt; &lt;td&gt;0:27:26&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 12:54:52&lt;/td&gt; &lt;td&gt;09/29/2014 12:56:59&lt;/td&gt; &lt;td&gt;0:02:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 13:31:17&lt;/td&gt; &lt;td&gt;09/29/2014 13:31:23&lt;/td&gt; &lt;td&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:00:38&lt;/td&gt; &lt;td&gt;09/29/2014 14:01:11&lt;/td&gt; &lt;td&gt;0:00:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 13:31:25&lt;/td&gt; &lt;td&gt;09/29/2014 13:36:57&lt;/td&gt; &lt;td&gt;0:05:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 13:36:56&lt;/td&gt; &lt;td&gt;09/29/2014 13:47:02&lt;/td&gt; &lt;td&gt;0:10:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 13:47:03&lt;/td&gt; &lt;td&gt;09/29/2014 13:51:40&lt;/td&gt; &lt;td&gt;0:04:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 13:51:42&lt;/td&gt; &lt;td&gt;09/29/2014 13:56:40&lt;/td&gt; &lt;td&gt;0:04:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 13:56:40&lt;/td&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;0:02:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 13:59:25&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:10&lt;/td&gt; &lt;td&gt;0:00:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:00:11&lt;/td&gt; &lt;td&gt;09/29/2014 14:00:37&lt;/td&gt; &lt;td&gt;0:00:26&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;601.576975&lt;/td&gt; &lt;td&gt;90.803782&lt;/td&gt; &lt;td&gt;108.725110&lt;/td&gt; &lt;td&gt;177.112667&lt;/td&gt; &lt;td&gt;171.995572&lt;/td&gt; &lt;td&gt;2.098138&lt;/td&gt; &lt;td&gt;15.768311&lt;/td&gt; &lt;td&gt;152.511444&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;13.310341&lt;/td&gt; &lt;td&gt;32.722946&lt;/td&gt; &lt;td&gt;125.551415&lt;/td&gt; &lt;td&gt;1.912836&lt;/td&gt; &lt;td&gt;46.041675&lt;/td&gt; &lt;td&gt;13.294214&lt;/td&gt; &lt;td&gt;85.345068&lt;/td&gt; &lt;td&gt;165.424288&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;19.425885&lt;/td&gt; &lt;td&gt;9.248670&lt;/td&gt; &lt;td&gt;150.855556&lt;/td&gt; &lt;td&gt;7.085737&lt;/td&gt; &lt;td&gt;88.445566&lt;/td&gt; &lt;td&gt;10.490432&lt;/td&gt; &lt;td&gt;49.318554&lt;/td&gt; &lt;td&gt;322.500839&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;30.534391&lt;/td&gt; &lt;td&gt;14.273478&lt;/td&gt; &lt;td&gt;100.987791&lt;/td&gt; &lt;td&gt;59.341763&lt;/td&gt; &lt;td&gt;46.442443&lt;/td&gt; &lt;td&gt;9.613795&lt;/td&gt; &lt;td&gt;64.186196&lt;/td&gt; &lt;td&gt;146.324186&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;28.211213&lt;/td&gt; &lt;td&gt;37.134522&lt;/td&gt; &lt;td&gt;64.189335&lt;/td&gt; &lt;td&gt;10.931513&lt;/td&gt; &lt;td&gt;100.610673&lt;/td&gt; &lt;td&gt;9.929866&lt;/td&gt; &lt;td&gt;112.270530&lt;/td&gt; &lt;td&gt;108.489951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;29.226411&lt;/td&gt; &lt;td&gt;18.132589&lt;/td&gt; &lt;td&gt;95.245160&lt;/td&gt; &lt;td&gt;63.100068&lt;/td&gt; &lt;td&gt;115.663908&lt;/td&gt; &lt;td&gt;6.151231&lt;/td&gt; &lt;td&gt;46.251309&lt;/td&gt; &lt;td&gt;127.742471&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;30.750930&lt;/td&gt; &lt;td&gt;20.888658&lt;/td&gt; &lt;td&gt;108.894177&lt;/td&gt; &lt;td&gt;55.168565&lt;/td&gt; &lt;td&gt;82.016828&lt;/td&gt; &lt;td&gt;69.451493&lt;/td&gt; &lt;td&gt;65.161517&lt;/td&gt; &lt;td&gt;103.697733&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;13.462570&lt;/td&gt; &lt;td&gt;18.033847&lt;/td&gt; &lt;td&gt;32.065492&lt;/td&gt; &lt;td&gt;78.910373&lt;/td&gt; &lt;td&gt;202.998301&lt;/td&gt; &lt;td&gt;10.688279&lt;/td&gt; &lt;td&gt;47.167022&lt;/td&gt; &lt;td&gt;139.601948&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;24.354314&lt;/td&gt; &lt;td&gt;16.711503&lt;/td&gt; &lt;td&gt;112.008551&lt;/td&gt; &lt;td&gt;8.307098&lt;/td&gt; &lt;td&gt;126.849630&lt;/td&gt; &lt;td&gt;7.127605&lt;/td&gt; &lt;td&gt;51.083118&lt;/td&gt; &lt;td&gt;98.648077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;13.310341&lt;/td&gt; &lt;td&gt;9.248670&lt;/td&gt; &lt;td&gt;32.065492&lt;/td&gt; &lt;td&gt;1.912836&lt;/td&gt; &lt;td&gt;46.041675&lt;/td&gt; &lt;td&gt;6.151231&lt;/td&gt; &lt;td&gt;46.251309&lt;/td&gt; &lt;td&gt;98.648077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;30.750930&lt;/td&gt; &lt;td&gt;37.134522&lt;/td&gt; &lt;td&gt;150.855556&lt;/td&gt; &lt;td&gt;78.910373&lt;/td&gt; &lt;td&gt;202.998301&lt;/td&gt; &lt;td&gt;69.451493&lt;/td&gt; &lt;td&gt;112.270530&lt;/td&gt; &lt;td&gt;322.500839&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;23.659507&lt;/td&gt; &lt;td&gt;20.893277&lt;/td&gt; &lt;td&gt;98.724685&lt;/td&gt; &lt;td&gt;35.594744&lt;/td&gt; &lt;td&gt;101.133628&lt;/td&gt; &lt;td&gt;17.093364&lt;/td&gt; &lt;td&gt;65.097914&lt;/td&gt; &lt;td&gt;151.553687&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;92.991259&lt;/td&gt; &lt;td&gt;5.175922&lt;/td&gt; &lt;td&gt;42.238393&lt;/td&gt; &lt;td&gt;29.239879&lt;/td&gt; &lt;td&gt;367.805534&lt;/td&gt; &lt;td&gt;3.604910&lt;/td&gt; &lt;td&gt;15.557396&lt;/td&gt; &lt;td&gt;11.650267&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;149.502128&lt;/td&gt; &lt;td&gt;30.197806&lt;/td&gt; &lt;td&gt;50.786184&lt;/td&gt; &lt;td&gt;217.190836&lt;/td&gt; &lt;td&gt;283.545905&lt;/td&gt; &lt;td&gt;11.653171&lt;/td&gt; &lt;td&gt;73.321150&lt;/td&gt; &lt;td&gt;116.860455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;245.783668&lt;/td&gt; &lt;td&gt;22.278841&lt;/td&gt; &lt;td&gt;50.578731&lt;/td&gt; &lt;td&gt;36.301810&lt;/td&gt; &lt;td&gt;181.405269&lt;/td&gt; &lt;td&gt;32.236754&lt;/td&gt; &lt;td&gt;57.631764&lt;/td&gt; &lt;td&gt;61.540533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;377.782738&lt;/td&gt; &lt;td&gt;24.129319&lt;/td&gt; &lt;td&gt;84.097657&lt;/td&gt; &lt;td&gt;10.959661&lt;/td&gt; &lt;td&gt;171.698669&lt;/td&gt; &lt;td&gt;8.973519&lt;/td&gt; &lt;td&gt;54.532180&lt;/td&gt; &lt;td&gt;45.527142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;341.148908&lt;/td&gt; &lt;td&gt;74.358770&lt;/td&gt; &lt;td&gt;85.782399&lt;/td&gt; &lt;td&gt;43.116347&lt;/td&gt; &lt;td&gt;151.146233&lt;/td&gt; &lt;td&gt;22.870727&lt;/td&gt; &lt;td&gt;74.439693&lt;/td&gt; &lt;td&gt;51.871535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;72.259919&lt;/td&gt; &lt;td&gt;11.424035&lt;/td&gt; &lt;td&gt;79.310504&lt;/td&gt; &lt;td&gt;9.833135&lt;/td&gt; &lt;td&gt;562.871920&lt;/td&gt; &lt;td&gt;14.961209&lt;/td&gt; &lt;td&gt;127.861874&lt;/td&gt; &lt;td&gt;55.377721&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;373.301225&lt;/td&gt; &lt;td&gt;41.379753&lt;/td&gt; &lt;td&gt;81.983260&lt;/td&gt; &lt;td&gt;9.373200&lt;/td&gt; &lt;td&gt;95.039317&lt;/td&gt; &lt;td&gt;19.071346&lt;/td&gt; &lt;td&gt;76.159452&lt;/td&gt; &lt;td&gt;48.324504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;449.871952&lt;/td&gt; &lt;td&gt;16.099152&lt;/td&gt; &lt;td&gt;48.047940&lt;/td&gt; &lt;td&gt;8.559784&lt;/td&gt; &lt;td&gt;211.094730&lt;/td&gt; &lt;td&gt;10.569071&lt;/td&gt; &lt;td&gt;26.710228&lt;/td&gt; &lt;td&gt;72.571454&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;395.771006&lt;/td&gt; &lt;td&gt;33.537585&lt;/td&gt; &lt;td&gt;54.850876&lt;/td&gt; &lt;td&gt;141.526389&lt;/td&gt; &lt;td&gt;153.763316&lt;/td&gt; &lt;td&gt;12.997092&lt;/td&gt; &lt;td&gt;127.961975&lt;/td&gt; &lt;td&gt;57.100346&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;72.259919&lt;/td&gt; &lt;td&gt;11.424035&lt;/td&gt; &lt;td&gt;48.047940&lt;/td&gt; &lt;td&gt;8.559784&lt;/td&gt; &lt;td&gt;95.039317&lt;/td&gt; &lt;td&gt;8.973519&lt;/td&gt; &lt;td&gt;26.710228&lt;/td&gt; &lt;td&gt;45.527142&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;449.871952&lt;/td&gt; &lt;td&gt;74.358770&lt;/td&gt; &lt;td&gt;85.782399&lt;/td&gt; &lt;td&gt;217.190836&lt;/td&gt; &lt;td&gt;562.871920&lt;/td&gt; &lt;td&gt;32.236754&lt;/td&gt; &lt;td&gt;127.961975&lt;/td&gt; &lt;td&gt;116.860455&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;300.677693&lt;/td&gt; &lt;td&gt;31.675658&lt;/td&gt; &lt;td&gt;66.929694&lt;/td&gt; &lt;td&gt;59.607645&lt;/td&gt; &lt;td&gt;226.320670&lt;/td&gt; &lt;td&gt;16.666611&lt;/td&gt; &lt;td&gt;77.327289&lt;/td&gt; &lt;td&gt;63.646711&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;12.230334&lt;/td&gt; &lt;td&gt;70.991261&lt;/td&gt; &lt;td&gt;33.092797&lt;/td&gt; &lt;td&gt;17.517230&lt;/td&gt; &lt;td&gt;15.798438&lt;/td&gt; &lt;td&gt;19.743562&lt;/td&gt; &lt;td&gt;127.494687&lt;/td&gt; &lt;td&gt;5.893471&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;27.550293&lt;/td&gt; &lt;td&gt;14.970857&lt;/td&gt; &lt;td&gt;16.442806&lt;/td&gt; &lt;td&gt;111.138612&lt;/td&gt; &lt;td&gt;68.214095&lt;/td&gt; &lt;td&gt;7.884782&lt;/td&gt; &lt;td&gt;27.109441&lt;/td&gt; &lt;td&gt;6.087067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;43.277918&lt;/td&gt; &lt;td&gt;12.748690&lt;/td&gt; &lt;td&gt;22.681844&lt;/td&gt; &lt;td&gt;92.835566&lt;/td&gt; &lt;td&gt;84.416610&lt;/td&gt; &lt;td&gt;14.661934&lt;/td&gt; &lt;td&gt;151.094498&lt;/td&gt; &lt;td&gt;153.285076&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;129.696125&lt;/td&gt; &lt;td&gt;13.435663&lt;/td&gt; &lt;td&gt;14.674499&lt;/td&gt; &lt;td&gt;129.179966&lt;/td&gt; &lt;td&gt;39.176513&lt;/td&gt; &lt;td&gt;6.286296&lt;/td&gt; &lt;td&gt;181.596838&lt;/td&gt; &lt;td&gt;416.052710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;110.348816&lt;/td&gt; &lt;td&gt;7.080225&lt;/td&gt; &lt;td&gt;21.051910&lt;/td&gt; &lt;td&gt;85.758973&lt;/td&gt; &lt;td&gt;65.130356&lt;/td&gt; &lt;td&gt;7.292999&lt;/td&gt; &lt;td&gt;123.386514&lt;/td&gt; &lt;td&gt;151.000786&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;43.365006&lt;/td&gt; &lt;td&gt;9.847612&lt;/td&gt; &lt;td&gt;32.881770&lt;/td&gt; &lt;td&gt;94.752284&lt;/td&gt; &lt;td&gt;67.788314&lt;/td&gt; &lt;td&gt;9.035439&lt;/td&gt; &lt;td&gt;72.539334&lt;/td&gt; &lt;td&gt;223.967821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;34.534280&lt;/td&gt; &lt;td&gt;36.347298&lt;/td&gt; &lt;td&gt;27.849276&lt;/td&gt; &lt;td&gt;122.736244&lt;/td&gt; &lt;td&gt;51.447492&lt;/td&gt; &lt;td&gt;25.051058&lt;/td&gt; &lt;td&gt;80.452175&lt;/td&gt; &lt;td&gt;84.519426&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;48.021860&lt;/td&gt; &lt;td&gt;30.594474&lt;/td&gt; &lt;td&gt;22.522426&lt;/td&gt; &lt;td&gt;99.245893&lt;/td&gt; &lt;td&gt;73.076698&lt;/td&gt; &lt;td&gt;7.260729&lt;/td&gt; &lt;td&gt;38.585852&lt;/td&gt; &lt;td&gt;5.697277&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;29.484201&lt;/td&gt; &lt;td&gt;12.368769&lt;/td&gt; &lt;td&gt;40.344043&lt;/td&gt; &lt;td&gt;84.137820&lt;/td&gt; &lt;td&gt;30.813313&lt;/td&gt; &lt;td&gt;4.856991&lt;/td&gt; &lt;td&gt;22.196547&lt;/td&gt; &lt;td&gt;4.600057&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;27.550293&lt;/td&gt; &lt;td&gt;7.080225&lt;/td&gt; &lt;td&gt;14.674499&lt;/td&gt; &lt;td&gt;84.137820&lt;/td&gt; &lt;td&gt;30.813313&lt;/td&gt; &lt;td&gt;4.856991&lt;/td&gt; &lt;td&gt;22.196547&lt;/td&gt; &lt;td&gt;4.600057&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;129.696125&lt;/td&gt; &lt;td&gt;36.347298&lt;/td&gt; &lt;td&gt;40.344043&lt;/td&gt; &lt;td&gt;129.179966&lt;/td&gt; &lt;td&gt;84.416610&lt;/td&gt; &lt;td&gt;25.051058&lt;/td&gt; &lt;td&gt;181.596838&lt;/td&gt; &lt;td&gt;416.052710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;58.284812&lt;/td&gt; &lt;td&gt;17.174198&lt;/td&gt; &lt;td&gt;24.806072&lt;/td&gt; &lt;td&gt;102.473170&lt;/td&gt; &lt;td&gt;60.007924&lt;/td&gt; &lt;td&gt;10.291279&lt;/td&gt; &lt;td&gt;87.120150&lt;/td&gt; &lt;td&gt;130.651277&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;3000G Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt; 1292085.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt; 1179391.6 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt; 1234453.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt; 1611.779000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:01:15&lt;/td&gt; &lt;td&gt;09/29/2014 14:06:48&lt;/td&gt; &lt;td&gt;0:05:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:30:22&lt;/td&gt; &lt;td&gt;0:23:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:30&lt;/td&gt; &lt;td&gt;0:25:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:23&lt;/td&gt; &lt;td&gt;0:24:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:34&lt;/td&gt; &lt;td&gt;0:24:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:53&lt;/td&gt; &lt;td&gt;0:26:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:29:51&lt;/td&gt; &lt;td&gt;0:22:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:34&lt;/td&gt; &lt;td&gt;0:24:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 14:30:35&lt;/td&gt; &lt;td&gt;0:23:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:01:15&lt;/td&gt; &lt;td&gt;09/29/2014 14:01:35&lt;/td&gt; &lt;td&gt;0:00:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 14:06:49&lt;/td&gt; &lt;td&gt;09/29/2014 14:06:53&lt;/td&gt; &lt;td&gt;0:00:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:16&lt;/td&gt; &lt;td&gt;09/29/2014 14:33:45&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:06:55&lt;/td&gt; &lt;td&gt;09/29/2014 14:12:28&lt;/td&gt; &lt;td&gt;0:05:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:12:29&lt;/td&gt; &lt;td&gt;09/29/2014 14:21:55&lt;/td&gt; &lt;td&gt;0:09:26&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:21:55&lt;/td&gt; &lt;td&gt;09/29/2014 14:27:40&lt;/td&gt; &lt;td&gt;0:05:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:27:43&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:14&lt;/td&gt; &lt;td&gt;0:03:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:31:14&lt;/td&gt; &lt;td&gt;09/29/2014 14:31:51&lt;/td&gt; &lt;td&gt;0:00:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:31:51&lt;/td&gt; &lt;td&gt;09/29/2014 14:32:52&lt;/td&gt; &lt;td&gt;0:01:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:32:52&lt;/td&gt; &lt;td&gt;09/29/2014 14:33:16&lt;/td&gt; &lt;td&gt;0:00:24&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;9.451169&lt;/td&gt; &lt;td&gt;3.644118&lt;/td&gt; &lt;td&gt;18.419151&lt;/td&gt; &lt;td&gt;1.404395&lt;/td&gt; &lt;td&gt;15.740525&lt;/td&gt; &lt;td&gt;2.085038&lt;/td&gt; &lt;td&gt;15.171847&lt;/td&gt; &lt;td&gt;25.400834&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;19.558041&lt;/td&gt; &lt;td&gt;6.607300&lt;/td&gt; &lt;td&gt;85.774410&lt;/td&gt; &lt;td&gt;4.503525&lt;/td&gt; &lt;td&gt;81.448472&lt;/td&gt; &lt;td&gt;11.976129&lt;/td&gt; &lt;td&gt;92.140470&lt;/td&gt; &lt;td&gt;145.743853&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;31.042019&lt;/td&gt; &lt;td&gt;7.877299&lt;/td&gt; &lt;td&gt;71.958033&lt;/td&gt; &lt;td&gt;8.862111&lt;/td&gt; &lt;td&gt;142.452144&lt;/td&gt; &lt;td&gt;18.489193&lt;/td&gt; &lt;td&gt;81.003310&lt;/td&gt; &lt;td&gt;85.856529&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;38.833612&lt;/td&gt; &lt;td&gt;12.440326&lt;/td&gt; &lt;td&gt;86.063103&lt;/td&gt; &lt;td&gt;7.165120&lt;/td&gt; &lt;td&gt;84.707025&lt;/td&gt; &lt;td&gt;16.931531&lt;/td&gt; &lt;td&gt;100.442710&lt;/td&gt; &lt;td&gt;122.411252&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;15.751913&lt;/td&gt; &lt;td&gt;33.026762&lt;/td&gt; &lt;td&gt;50.457193&lt;/td&gt; &lt;td&gt;7.064220&lt;/td&gt; &lt;td&gt;114.130257&lt;/td&gt; &lt;td&gt;5.992556&lt;/td&gt; &lt;td&gt;66.035959&lt;/td&gt; &lt;td&gt;84.596973&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;18.462884&lt;/td&gt; &lt;td&gt;28.047942&lt;/td&gt; &lt;td&gt;110.690543&lt;/td&gt; &lt;td&gt;16.566547&lt;/td&gt; &lt;td&gt;104.403789&lt;/td&gt; &lt;td&gt;5.303453&lt;/td&gt; &lt;td&gt;72.552640&lt;/td&gt; &lt;td&gt;402.383383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;17.858339&lt;/td&gt; &lt;td&gt;33.988800&lt;/td&gt; &lt;td&gt;110.431091&lt;/td&gt; &lt;td&gt;7.238431&lt;/td&gt; &lt;td&gt;72.229953&lt;/td&gt; &lt;td&gt;16.850955&lt;/td&gt; &lt;td&gt;68.231546&lt;/td&gt; &lt;td&gt;180.601000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;23.055572&lt;/td&gt; &lt;td&gt;17.044813&lt;/td&gt; &lt;td&gt;96.105520&lt;/td&gt; &lt;td&gt;8.941132&lt;/td&gt; &lt;td&gt;171.130879&lt;/td&gt; &lt;td&gt;8.423100&lt;/td&gt; &lt;td&gt;70.634541&lt;/td&gt; &lt;td&gt;147.261648&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;19.840798&lt;/td&gt; &lt;td&gt;13.860740&lt;/td&gt; &lt;td&gt;74.961175&lt;/td&gt; &lt;td&gt;16.171566&lt;/td&gt; &lt;td&gt;56.165875&lt;/td&gt; &lt;td&gt;5.904921&lt;/td&gt; &lt;td&gt;47.646217&lt;/td&gt; &lt;td&gt;125.991819&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;15.751913&lt;/td&gt; &lt;td&gt;6.607300&lt;/td&gt; &lt;td&gt;50.457193&lt;/td&gt; &lt;td&gt;4.503525&lt;/td&gt; &lt;td&gt;56.165875&lt;/td&gt; &lt;td&gt;5.303453&lt;/td&gt; &lt;td&gt;47.646217&lt;/td&gt; &lt;td&gt;84.596973&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;38.833612&lt;/td&gt; &lt;td&gt;33.988800&lt;/td&gt; &lt;td&gt;110.690543&lt;/td&gt; &lt;td&gt;16.566547&lt;/td&gt; &lt;td&gt;171.130879&lt;/td&gt; &lt;td&gt;18.489193&lt;/td&gt; &lt;td&gt;100.442710&lt;/td&gt; &lt;td&gt;402.383383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;23.050397&lt;/td&gt; &lt;td&gt;19.111748&lt;/td&gt; &lt;td&gt;85.805134&lt;/td&gt; &lt;td&gt;9.564082&lt;/td&gt; &lt;td&gt;103.333549&lt;/td&gt; &lt;td&gt;11.233980&lt;/td&gt; &lt;td&gt;74.835924&lt;/td&gt; &lt;td&gt;161.855807&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;54.766945&lt;/td&gt; &lt;td&gt;5.551163&lt;/td&gt; &lt;td&gt;29.216632&lt;/td&gt; &lt;td&gt;3.035008&lt;/td&gt; &lt;td&gt;52.816902&lt;/td&gt; &lt;td&gt;3.346243&lt;/td&gt; &lt;td&gt;15.767022&lt;/td&gt; &lt;td&gt;10.066112&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;130.666380&lt;/td&gt; &lt;td&gt;9.658277&lt;/td&gt; &lt;td&gt;49.332720&lt;/td&gt; &lt;td&gt;103.036705&lt;/td&gt; &lt;td&gt;194.520370&lt;/td&gt; &lt;td&gt;12.166344&lt;/td&gt; &lt;td&gt;65.144599&lt;/td&gt; &lt;td&gt;97.158571&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;254.754936&lt;/td&gt; &lt;td&gt;22.605298&lt;/td&gt; &lt;td&gt;38.102466&lt;/td&gt; &lt;td&gt;21.121168&lt;/td&gt; &lt;td&gt;300.467330&lt;/td&gt; &lt;td&gt;12.262318&lt;/td&gt; &lt;td&gt;108.203491&lt;/td&gt; &lt;td&gt;50.696657&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;283.761567&lt;/td&gt; &lt;td&gt;19.327164&lt;/td&gt; &lt;td&gt;73.414574&lt;/td&gt; &lt;td&gt;7.431651&lt;/td&gt; &lt;td&gt;183.121904&lt;/td&gt; &lt;td&gt;12.573854&lt;/td&gt; &lt;td&gt;73.814766&lt;/td&gt; &lt;td&gt;46.802493&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;290.341947&lt;/td&gt; &lt;td&gt;57.452026&lt;/td&gt; &lt;td&gt;58.354221&lt;/td&gt; &lt;td&gt;13.066162&lt;/td&gt; &lt;td&gt;189.263163&lt;/td&gt; &lt;td&gt;18.998781&lt;/td&gt; &lt;td&gt;121.269774&lt;/td&gt; &lt;td&gt;54.831406&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;81.787025&lt;/td&gt; &lt;td&gt;8.410538&lt;/td&gt; &lt;td&gt;79.822552&lt;/td&gt; &lt;td&gt;16.005077&lt;/td&gt; &lt;td&gt;190.730342&lt;/td&gt; &lt;td&gt;21.697136&lt;/td&gt; &lt;td&gt;100.456487&lt;/td&gt; &lt;td&gt;46.744884&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;202.558515&lt;/td&gt; &lt;td&gt;39.360009&lt;/td&gt; &lt;td&gt;74.519981&lt;/td&gt; &lt;td&gt;15.960756&lt;/td&gt; &lt;td&gt;137.321631&lt;/td&gt; &lt;td&gt;26.583824&lt;/td&gt; &lt;td&gt;57.537668&lt;/td&gt; &lt;td&gt;60.758997&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;226.790801&lt;/td&gt; &lt;td&gt;44.175536&lt;/td&gt; &lt;td&gt;73.992368&lt;/td&gt; &lt;td&gt;7.561897&lt;/td&gt; &lt;td&gt;182.853851&lt;/td&gt; &lt;td&gt;17.597471&lt;/td&gt; &lt;td&gt;31.128055&lt;/td&gt; &lt;td&gt;44.389893&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;275.423934&lt;/td&gt; &lt;td&gt;21.980040&lt;/td&gt; &lt;td&gt;60.538239&lt;/td&gt; &lt;td&gt;39.736622&lt;/td&gt; &lt;td&gt;173.574795&lt;/td&gt; &lt;td&gt;58.786316&lt;/td&gt; &lt;td&gt;95.124912&lt;/td&gt; &lt;td&gt;25.564108&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;81.787025&lt;/td&gt; &lt;td&gt;8.410538&lt;/td&gt; &lt;td&gt;38.102466&lt;/td&gt; &lt;td&gt;7.431651&lt;/td&gt; &lt;td&gt;137.321631&lt;/td&gt; &lt;td&gt;12.166344&lt;/td&gt; &lt;td&gt;31.128055&lt;/td&gt; &lt;td&gt;25.564108&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;290.341947&lt;/td&gt; &lt;td&gt;57.452026&lt;/td&gt; &lt;td&gt;79.822552&lt;/td&gt; &lt;td&gt;103.036705&lt;/td&gt; &lt;td&gt;300.467330&lt;/td&gt; &lt;td&gt;58.786316&lt;/td&gt; &lt;td&gt;121.269774&lt;/td&gt; &lt;td&gt;97.158571&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;218.260638&lt;/td&gt; &lt;td&gt;27.871111&lt;/td&gt; &lt;td&gt;63.509640&lt;/td&gt; &lt;td&gt;27.990005&lt;/td&gt; &lt;td&gt;193.981673&lt;/td&gt; &lt;td&gt;22.583255&lt;/td&gt; &lt;td&gt;81.584969&lt;/td&gt; &lt;td&gt;53.368376&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;13.620157&lt;/td&gt; &lt;td&gt;2.288504&lt;/td&gt; &lt;td&gt;4.166807&lt;/td&gt; &lt;td&gt;16.468447&lt;/td&gt; &lt;td&gt;9.991810&lt;/td&gt; &lt;td&gt;1.101775&lt;/td&gt; &lt;td&gt;20.152227&lt;/td&gt; &lt;td&gt;4.294680&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;44.026143&lt;/td&gt; &lt;td&gt;31.720525&lt;/td&gt; &lt;td&gt;25.684461&lt;/td&gt; &lt;td&gt;134.254716&lt;/td&gt; &lt;td&gt;30.797008&lt;/td&gt; &lt;td&gt;9.568594&lt;/td&gt; &lt;td&gt;24.328205&lt;/td&gt; &lt;td&gt;4.319533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;40.283148&lt;/td&gt; &lt;td&gt;9.970277&lt;/td&gt; &lt;td&gt;29.731019&lt;/td&gt; &lt;td&gt;133.083785&lt;/td&gt; &lt;td&gt;29.322194&lt;/td&gt; &lt;td&gt;8.859556&lt;/td&gt; &lt;td&gt;73.251098&lt;/td&gt; &lt;td&gt;249.850045&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;44.288244&lt;/td&gt; &lt;td&gt;18.914661&lt;/td&gt; &lt;td&gt;38.162762&lt;/td&gt; &lt;td&gt;144.458624&lt;/td&gt; &lt;td&gt;22.556235&lt;/td&gt; &lt;td&gt;6.184842&lt;/td&gt; &lt;td&gt;117.267234&lt;/td&gt; &lt;td&gt;445.700238&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;67.147744&lt;/td&gt; &lt;td&gt;6.649451&lt;/td&gt; &lt;td&gt;27.876825&lt;/td&gt; &lt;td&gt;59.226248&lt;/td&gt; &lt;td&gt;69.373248&lt;/td&gt; &lt;td&gt;44.478703&lt;/td&gt; &lt;td&gt;61.381724&lt;/td&gt; &lt;td&gt;282.608075&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;36.403227&lt;/td&gt; &lt;td&gt;12.226129&lt;/td&gt; &lt;td&gt;21.997683&lt;/td&gt; &lt;td&gt;95.912670&lt;/td&gt; &lt;td&gt;44.219799&lt;/td&gt; &lt;td&gt;21.117974&lt;/td&gt; &lt;td&gt;106.473817&lt;/td&gt; &lt;td&gt;97.896971&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;42.114038&lt;/td&gt; &lt;td&gt;30.805969&lt;/td&gt; &lt;td&gt;25.929027&lt;/td&gt; &lt;td&gt;51.658733&lt;/td&gt; &lt;td&gt;26.475662&lt;/td&gt; &lt;td&gt;34.816500&lt;/td&gt; &lt;td&gt;31.309953&lt;/td&gt; &lt;td&gt;5.608395&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;48.601889&lt;/td&gt; &lt;td&gt;18.708127&lt;/td&gt; &lt;td&gt;18.893532&lt;/td&gt; &lt;td&gt;132.558026&lt;/td&gt; &lt;td&gt;50.476383&lt;/td&gt; &lt;td&gt;12.309402&lt;/td&gt; &lt;td&gt;22.661371&lt;/td&gt; &lt;td&gt;37.610815&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;34.413417&lt;/td&gt; &lt;td&gt;34.709883&lt;/td&gt; &lt;td&gt;37.058335&lt;/td&gt; &lt;td&gt;121.710608&lt;/td&gt; &lt;td&gt;44.676485&lt;/td&gt; &lt;td&gt;9.449332&lt;/td&gt; &lt;td&gt;19.311945&lt;/td&gt; &lt;td&gt;4.420232&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;34.413417&lt;/td&gt; &lt;td&gt;6.649451&lt;/td&gt; &lt;td&gt;18.893532&lt;/td&gt; &lt;td&gt;51.658733&lt;/td&gt; &lt;td&gt;22.556235&lt;/td&gt; &lt;td&gt;6.184842&lt;/td&gt; &lt;td&gt;19.311945&lt;/td&gt; &lt;td&gt;4.319533&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;67.147744&lt;/td&gt; &lt;td&gt;34.709883&lt;/td&gt; &lt;td&gt;38.162762&lt;/td&gt; &lt;td&gt;144.458624&lt;/td&gt; &lt;td&gt;69.373248&lt;/td&gt; &lt;td&gt;44.478703&lt;/td&gt; &lt;td&gt;117.267234&lt;/td&gt; &lt;td&gt;445.700238&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;44.659731&lt;/td&gt; &lt;td&gt;20.463128&lt;/td&gt; &lt;td&gt;28.166705&lt;/td&gt; &lt;td&gt;109.107926&lt;/td&gt; &lt;td&gt;39.737127&lt;/td&gt; &lt;td&gt;18.348113&lt;/td&gt; &lt;td&gt;56.998168&lt;/td&gt; &lt;td&gt;141.001788&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;3000G Run 3&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 29, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;3000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt; 1178534.1 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt; 1092936.2 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt; 1134928.4 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt; 1739.269000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:48&lt;/td&gt; &lt;td&gt;09/29/2014 14:40:59&lt;/td&gt; &lt;td&gt;0:07:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:10:02&lt;/td&gt; &lt;td&gt;0:28:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:07&lt;/td&gt; &lt;td&gt;0:28:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:17&lt;/td&gt; &lt;td&gt;0:28:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:55&lt;/td&gt; &lt;td&gt;0:28:51&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:39&lt;/td&gt; &lt;td&gt;0:28:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:46&lt;/td&gt; &lt;td&gt;0:28:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:58&lt;/td&gt; &lt;td&gt;0:28:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;09/29/2014 15:08:58&lt;/td&gt; &lt;td&gt;0:27:54&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/29/2014 14:33:48&lt;/td&gt; &lt;td&gt;09/29/2014 14:34:07&lt;/td&gt; &lt;td&gt;0:00:19&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/29/2014 14:40:59&lt;/td&gt; &lt;td&gt;09/29/2014 14:41:04&lt;/td&gt; &lt;td&gt;0:00:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:57&lt;/td&gt; &lt;td&gt;09/29/2014 15:09:49&lt;/td&gt; &lt;td&gt;0:02:52&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/29/2014 14:41:05&lt;/td&gt; &lt;td&gt;09/29/2014 14:47:39&lt;/td&gt; &lt;td&gt;0:06:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/29/2014 14:47:40&lt;/td&gt; &lt;td&gt;09/29/2014 14:56:46&lt;/td&gt; &lt;td&gt;0:09:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/29/2014 14:56:49&lt;/td&gt; &lt;td&gt;09/29/2014 15:03:19&lt;/td&gt; &lt;td&gt;0:06:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/29/2014 15:03:24&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:45&lt;/td&gt; &lt;td&gt;0:03:21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:46&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:49&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 7&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:50&lt;/td&gt; &lt;td&gt;09/29/2014 15:06:53&lt;/td&gt; &lt;td&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 8&lt;/th&gt; &lt;td&gt;09/29/2014 15:06:53&lt;/td&gt; &lt;td&gt;09/29/2014 15:10:04&lt;/td&gt; &lt;td&gt;0:03:11&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;9.393632&lt;/td&gt; &lt;td&gt;5.001910&lt;/td&gt; &lt;td&gt;17.053567&lt;/td&gt; &lt;td&gt;1.427500&lt;/td&gt; &lt;td&gt;17.813839&lt;/td&gt; &lt;td&gt;2.230451&lt;/td&gt; &lt;td&gt;13.884490&lt;/td&gt; &lt;td&gt;25.610995&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;12.971454&lt;/td&gt; &lt;td&gt;9.383520&lt;/td&gt; &lt;td&gt;94.257760&lt;/td&gt; &lt;td&gt;1.603106&lt;/td&gt; &lt;td&gt;127.940946&lt;/td&gt; &lt;td&gt;20.791892&lt;/td&gt; &lt;td&gt;78.869819&lt;/td&gt; &lt;td&gt;138.521273&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;21.428177&lt;/td&gt; &lt;td&gt;31.431513&lt;/td&gt; &lt;td&gt;96.366083&lt;/td&gt; &lt;td&gt;5.611843&lt;/td&gt; &lt;td&gt;58.394596&lt;/td&gt; &lt;td&gt;11.279502&lt;/td&gt; &lt;td&gt;47.114473&lt;/td&gt; &lt;td&gt;407.135077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;23.377920&lt;/td&gt; &lt;td&gt;37.474814&lt;/td&gt; &lt;td&gt;83.640621&lt;/td&gt; &lt;td&gt;9.152178&lt;/td&gt; &lt;td&gt;71.186158&lt;/td&gt; &lt;td&gt;11.001543&lt;/td&gt; &lt;td&gt;46.763758&lt;/td&gt; &lt;td&gt;110.015662&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;49.580860&lt;/td&gt; &lt;td&gt;31.979940&lt;/td&gt; &lt;td&gt;87.662950&lt;/td&gt; &lt;td&gt;8.983661&lt;/td&gt; &lt;td&gt;68.052295&lt;/td&gt; &lt;td&gt;14.367631&lt;/td&gt; &lt;td&gt;59.266063&lt;/td&gt; &lt;td&gt;301.788652&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.483836&lt;/td&gt; &lt;td&gt;20.203772&lt;/td&gt; &lt;td&gt;391.980128&lt;/td&gt; &lt;td&gt;12.505446&lt;/td&gt; &lt;td&gt;77.966993&lt;/td&gt; &lt;td&gt;10.487869&lt;/td&gt; &lt;td&gt;52.989448&lt;/td&gt; &lt;td&gt;226.837637&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;38.104903&lt;/td&gt; &lt;td&gt;21.271630&lt;/td&gt; &lt;td&gt;84.689348&lt;/td&gt; &lt;td&gt;8.626460&lt;/td&gt; &lt;td&gt;86.620802&lt;/td&gt; &lt;td&gt;11.981171&lt;/td&gt; &lt;td&gt;69.182098&lt;/td&gt; &lt;td&gt;111.810485&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;20.243617&lt;/td&gt; &lt;td&gt;12.298692&lt;/td&gt; &lt;td&gt;99.547203&lt;/td&gt; &lt;td&gt;6.020951&lt;/td&gt; &lt;td&gt;151.584400&lt;/td&gt; &lt;td&gt;17.528287&lt;/td&gt; &lt;td&gt;62.037348&lt;/td&gt; &lt;td&gt;101.023802&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;22.808294&lt;/td&gt; &lt;td&gt;17.583072&lt;/td&gt; &lt;td&gt;59.180595&lt;/td&gt; &lt;td&gt;5.618565&lt;/td&gt; &lt;td&gt;123.108771&lt;/td&gt; &lt;td&gt;11.477376&lt;/td&gt; &lt;td&gt;42.485363&lt;/td&gt; &lt;td&gt;92.035709&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;12.971454&lt;/td&gt; &lt;td&gt;9.383520&lt;/td&gt; &lt;td&gt;59.180595&lt;/td&gt; &lt;td&gt;1.603106&lt;/td&gt; &lt;td&gt;58.394596&lt;/td&gt; &lt;td&gt;10.487869&lt;/td&gt; &lt;td&gt;42.485363&lt;/td&gt; &lt;td&gt;92.035709&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;49.580860&lt;/td&gt; &lt;td&gt;37.474814&lt;/td&gt; &lt;td&gt;391.980128&lt;/td&gt; &lt;td&gt;12.505446&lt;/td&gt; &lt;td&gt;151.584400&lt;/td&gt; &lt;td&gt;20.791892&lt;/td&gt; &lt;td&gt;78.869819&lt;/td&gt; &lt;td&gt;407.135077&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;25.249883&lt;/td&gt; &lt;td&gt;22.703369&lt;/td&gt; &lt;td&gt;124.665586&lt;/td&gt; &lt;td&gt;7.265276&lt;/td&gt; &lt;td&gt;95.606870&lt;/td&gt; &lt;td&gt;13.614409&lt;/td&gt; &lt;td&gt;57.338546&lt;/td&gt; &lt;td&gt;186.146037&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;146.487681&lt;/td&gt; &lt;td&gt;6.798942&lt;/td&gt; &lt;td&gt;29.834475&lt;/td&gt; &lt;td&gt;3.177879&lt;/td&gt; &lt;td&gt;55.067866&lt;/td&gt; &lt;td&gt;4.503738&lt;/td&gt; &lt;td&gt;17.215591&lt;/td&gt; &lt;td&gt;9.333281&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;177.581204&lt;/td&gt; &lt;td&gt;44.178095&lt;/td&gt; &lt;td&gt;69.746005&lt;/td&gt; &lt;td&gt;12.306166&lt;/td&gt; &lt;td&gt;215.602727&lt;/td&gt; &lt;td&gt;30.443709&lt;/td&gt; &lt;td&gt;64.276384&lt;/td&gt; &lt;td&gt;45.266949&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;211.311651&lt;/td&gt; &lt;td&gt;27.403143&lt;/td&gt; &lt;td&gt;61.412478&lt;/td&gt; &lt;td&gt;12.173058&lt;/td&gt; &lt;td&gt;216.879170&lt;/td&gt; &lt;td&gt;18.272234&lt;/td&gt; &lt;td&gt;96.753886&lt;/td&gt; &lt;td&gt;35.587072&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;482.581456&lt;/td&gt; &lt;td&gt;68.663026&lt;/td&gt; &lt;td&gt;60.354163&lt;/td&gt; &lt;td&gt;13.408513&lt;/td&gt; &lt;td&gt;187.921639&lt;/td&gt; &lt;td&gt;17.469237&lt;/td&gt; &lt;td&gt;62.337222&lt;/td&gt; &lt;td&gt;31.706120&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;178.297373&lt;/td&gt; &lt;td&gt;23.711312&lt;/td&gt; &lt;td&gt;67.129677&lt;/td&gt; &lt;td&gt;15.216904&lt;/td&gt; &lt;td&gt;328.149575&lt;/td&gt; &lt;td&gt;20.258853&lt;/td&gt; &lt;td&gt;78.891201&lt;/td&gt; &lt;td&gt;84.852368&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;209.496498&lt;/td&gt; &lt;td&gt;28.346366&lt;/td&gt; &lt;td&gt;55.584081&lt;/td&gt; &lt;td&gt;9.644075&lt;/td&gt; &lt;td&gt;131.622351&lt;/td&gt; &lt;td&gt;24.171156&lt;/td&gt; &lt;td&gt;80.046801&lt;/td&gt; &lt;td&gt;43.625932&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;521.691639&lt;/td&gt; &lt;td&gt;24.126176&lt;/td&gt; &lt;td&gt;72.964805&lt;/td&gt; &lt;td&gt;15.311409&lt;/td&gt; &lt;td&gt;146.152570&lt;/td&gt; &lt;td&gt;34.748843&lt;/td&gt; &lt;td&gt;71.957130&lt;/td&gt; &lt;td&gt;58.470644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;580.320149&lt;/td&gt; &lt;td&gt;17.054563&lt;/td&gt; &lt;td&gt;56.172396&lt;/td&gt; &lt;td&gt;7.530832&lt;/td&gt; &lt;td&gt;200.100326&lt;/td&gt; &lt;td&gt;12.444021&lt;/td&gt; &lt;td&gt;25.910599&lt;/td&gt; &lt;td&gt;75.653693&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;472.231674&lt;/td&gt; &lt;td&gt;15.064398&lt;/td&gt; &lt;td&gt;89.875570&lt;/td&gt; &lt;td&gt;42.394675&lt;/td&gt; &lt;td&gt;166.589234&lt;/td&gt; &lt;td&gt;12.831209&lt;/td&gt; &lt;td&gt;81.697881&lt;/td&gt; &lt;td&gt;73.821769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;177.581204&lt;/td&gt; &lt;td&gt;15.064398&lt;/td&gt; &lt;td&gt;55.584081&lt;/td&gt; &lt;td&gt;7.530832&lt;/td&gt; &lt;td&gt;131.622351&lt;/td&gt; &lt;td&gt;12.444021&lt;/td&gt; &lt;td&gt;25.910599&lt;/td&gt; &lt;td&gt;31.706120&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;580.320149&lt;/td&gt; &lt;td&gt;68.663026&lt;/td&gt; &lt;td&gt;89.875570&lt;/td&gt; &lt;td&gt;42.394675&lt;/td&gt; &lt;td&gt;328.149575&lt;/td&gt; &lt;td&gt;34.748843&lt;/td&gt; &lt;td&gt;96.753886&lt;/td&gt; &lt;td&gt;84.852368&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;354.188955&lt;/td&gt; &lt;td&gt;31.068385&lt;/td&gt; &lt;td&gt;66.654897&lt;/td&gt; &lt;td&gt;15.998204&lt;/td&gt; &lt;td&gt;199.127199&lt;/td&gt; &lt;td&gt;21.329908&lt;/td&gt; &lt;td&gt;70.233888&lt;/td&gt; &lt;td&gt;56.123068&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;12.252670&lt;/td&gt; &lt;td&gt;2.593733&lt;/td&gt; &lt;td&gt;4.115862&lt;/td&gt; &lt;td&gt;16.895672&lt;/td&gt; &lt;td&gt;10.183350&lt;/td&gt; &lt;td&gt;1.240096&lt;/td&gt; &lt;td&gt;18.679685&lt;/td&gt; &lt;td&gt;4.876067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;356.740980&lt;/td&gt; &lt;td&gt;21.197870&lt;/td&gt; &lt;td&gt;30.422216&lt;/td&gt; &lt;td&gt;81.779038&lt;/td&gt; &lt;td&gt;65.468650&lt;/td&gt; &lt;td&gt;3.947503&lt;/td&gt; &lt;td&gt;63.933750&lt;/td&gt; &lt;td&gt;107.563796&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;54.087768&lt;/td&gt; &lt;td&gt;10.152604&lt;/td&gt; &lt;td&gt;34.940701&lt;/td&gt; &lt;td&gt;113.510640&lt;/td&gt; &lt;td&gt;70.908809&lt;/td&gt; &lt;td&gt;12.316233&lt;/td&gt; &lt;td&gt;109.091578&lt;/td&gt; &lt;td&gt;283.076004&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;52.807104&lt;/td&gt; &lt;td&gt;18.525982&lt;/td&gt; &lt;td&gt;13.740089&lt;/td&gt; &lt;td&gt;212.364908&lt;/td&gt; &lt;td&gt;16.413964&lt;/td&gt; &lt;td&gt;17.998809&lt;/td&gt; &lt;td&gt;58.653503&lt;/td&gt; &lt;td&gt;483.718271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;42.389062&lt;/td&gt; &lt;td&gt;36.157809&lt;/td&gt; &lt;td&gt;28.909260&lt;/td&gt; &lt;td&gt;86.427025&lt;/td&gt; &lt;td&gt;21.605419&lt;/td&gt; &lt;td&gt;7.608729&lt;/td&gt; &lt;td&gt;54.910853&lt;/td&gt; &lt;td&gt;331.074114&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;48.214794&lt;/td&gt; &lt;td&gt;15.778893&lt;/td&gt; &lt;td&gt;20.681799&lt;/td&gt; &lt;td&gt;130.560005&lt;/td&gt; &lt;td&gt;43.846752&lt;/td&gt; &lt;td&gt;33.905533&lt;/td&gt; &lt;td&gt;54.536966&lt;/td&gt; &lt;td&gt;139.563667&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;84.061840&lt;/td&gt; &lt;td&gt;26.224851&lt;/td&gt; &lt;td&gt;16.546432&lt;/td&gt; &lt;td&gt;117.265210&lt;/td&gt; &lt;td&gt;34.766856&lt;/td&gt; &lt;td&gt;39.037423&lt;/td&gt; &lt;td&gt;0.710642&lt;/td&gt; &lt;td&gt;1.645351&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 7&lt;/th&gt; &lt;td&gt;63.034890&lt;/td&gt; &lt;td&gt;15.966686&lt;/td&gt; &lt;td&gt;31.666488&lt;/td&gt; &lt;td&gt;112.689765&lt;/td&gt; &lt;td&gt;28.661943&lt;/td&gt; &lt;td&gt;12.828171&lt;/td&gt; &lt;td&gt;1.274731&lt;/td&gt; &lt;td&gt;1.780452&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 8&lt;/th&gt; &lt;td&gt;43.879104&lt;/td&gt; &lt;td&gt;8.596666&lt;/td&gt; &lt;td&gt;32.585746&lt;/td&gt; &lt;td&gt;177.928730&lt;/td&gt; &lt;td&gt;26.763334&lt;/td&gt; &lt;td&gt;6.112333&lt;/td&gt; &lt;td&gt;1.187693&lt;/td&gt; &lt;td&gt;0.533668&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;42.389062&lt;/td&gt; &lt;td&gt;8.596666&lt;/td&gt; &lt;td&gt;13.740089&lt;/td&gt; &lt;td&gt;81.779038&lt;/td&gt; &lt;td&gt;16.413964&lt;/td&gt; &lt;td&gt;3.947503&lt;/td&gt; &lt;td&gt;0.710642&lt;/td&gt; &lt;td&gt;0.533668&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;356.740980&lt;/td&gt; &lt;td&gt;36.157809&lt;/td&gt; &lt;td&gt;34.940701&lt;/td&gt; &lt;td&gt;212.364908&lt;/td&gt; &lt;td&gt;70.908809&lt;/td&gt; &lt;td&gt;39.037423&lt;/td&gt; &lt;td&gt;109.091578&lt;/td&gt; &lt;td&gt;483.718271&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;93.151943&lt;/td&gt; &lt;td&gt;19.075170&lt;/td&gt; &lt;td&gt;26.186591&lt;/td&gt; &lt;td&gt;129.065665&lt;/td&gt; &lt;td&gt;38.554466&lt;/td&gt; &lt;td&gt;16.719342&lt;/td&gt; &lt;td&gt;43.037465&lt;/td&gt; &lt;td&gt;168.619415&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aac00620518&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabeaafeba8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab51a83638&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac14161af8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:05:50.674672-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 18 of n): Cluster Dynamics</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-26#1821</atom:id>
  <atom:published>2014-09-26T21:07:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article is about how scale-out differs from single-server. This shows large effects of parameters whose very existence most would not anticipate, and some low level metrics for assessing these. The moral of the story is that this is the stuff which makes the difference between merely surviving scale-out and winning with it. The developer and DBA would not normally know about this; thus these things fall into the category of adaptive self-configuration expected from the DBMS. But since this series is about what makes performance, I will discuss the dynamics such as they are and how to play these.&lt;/p&gt; &lt;p&gt;We take the prototypical cross partition join in Q13: Make a hash table of all &lt;code&gt;customers&lt;/code&gt;, partitioned by &lt;code&gt;c_custkey&lt;/code&gt;. This is independently done with full parallelism in each partition. Scan the &lt;code&gt;orders&lt;/code&gt;, get the &lt;code&gt;customer&lt;/code&gt; (in a different partition), and flag the &lt;code&gt;customers&lt;/code&gt; that had at least one &lt;code&gt;order&lt;/code&gt;. Then, to get the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt;, return the &lt;code&gt;customers&lt;/code&gt; that were not flagged in the previous pass.&lt;/p&gt; &lt;p&gt;The single-server time in part 12 was 7.8 and 6.0 with a single user. We consider the better of the times. The difference is due to allocating memory on the first go; on the second go the memory is already in reserve.&lt;/p&gt; &lt;p&gt;With default settings, we get 4595 ms (microseconds), with per node resource utilization at:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; Cluster 4 nodes, 4 s. 112405 m/s 742602 KB/s 2749% cpu 0% read 4% clw threads 1r 0w 0i buffers 8577766 287874 d 0 w 0 pfs cl 1: 27867 m/s 185654 KB/s 733% cpu 0% read 4% clw threads 1r 0w 0i buffers 2144242 71757 d 0 w 0 pfs cl 2: 28149 m/s 185372 KB/s 672% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144640 71903 d 0 w 0 pfs cl 3: 28220 m/s 185621 KB/s 675% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144454 71962 d 0 w 0 pfs cl 4: 28150 m/s 185837 KB/s 667% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144430 72252 d 0 w 0 pfs &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The top line is the summary; the lines below are per-process. The &lt;code&gt;m/s&lt;/code&gt; is messages-per-second; &lt;code&gt;KB/s&lt;/code&gt; is interconnect traffic per second; &lt;code&gt;clw %&lt;/code&gt; is idle time spent waiting for a reply from another process. The cluster is set up with 4 processes across 2 machines, each with 2 NUMA nodes. Each process has affinity to the NUMA node, so local memory only. The time is reasonable in light of the overall CPU of 2700%. The maximum would be 4800% with all threads of all cores busy all the time.&lt;/p&gt; &lt;p&gt;The catch here is that we do not have a steady half-platform utilization all the time, but full platform peaks followed by synchronization barriers with very low utilization. So, we set the batch size differently:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; cl_exec (&amp;#39;__dbf_set (&amp;#39;&amp;#39;cl_dfg_batch_bytes&amp;#39;&amp;#39;, 50000000)&amp;#39;); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This means that we set, on each process, the &lt;code&gt;cl_dfg_batch_bytes&lt;/code&gt; to 50M from a default of 10M. The effect is that each scan of &lt;code&gt;orders&lt;/code&gt;, one thread per slice, 48 slices total, will produce 50MB worth of &lt;code&gt;o_custkeys&lt;/code&gt; to be sent to the other partition for getting the &lt;code&gt;customer&lt;/code&gt;. After each 50M, the thread stops and will produce the next batch when all are done and a global continue message is sent by the coordinator.&lt;/p&gt; &lt;p&gt;The time is now 3173 ms with:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; Cluster 4 nodes, 3 s. 158220 m/s 1054944 KB/s 3676% cpu 0% read 1% clw threads 1r 0w 0i buffers 8577766 287874 d 0 w 0 pfs cl 1: 39594 m/s 263962 KB/s 947% cpu 0% read 1% clw threads 1r 0w 0i buffers 2144242 71757 d 0 w 0 pfs cl 2: 39531 m/s 263476 KB/s 894% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144640 71903 d 0 w 0 pfs cl 3: 39523 m/s 263684 KB/s 933% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144454 71962 d 0 w 0 pfs cl 4: 39535 m/s 263586 KB/s 900% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144430 72252 d 0 w 0 pfs &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The platform utilization is better as we see. The throughput is nearly double that of the single-server, which is pretty good for a communication-heavy query.&lt;/p&gt; &lt;p&gt;This was done with a vector size of 10K. In other words, each partition gets 10K &lt;code&gt;o_custkeys&lt;/code&gt; and splits these 48 ways to go to every recipient. 1/4 are in the same process, 1/4 in a different process on the same machine, and 2/4 on a different machine. The recipient gets messages with an average of 208 &lt;code&gt;o_custkey&lt;/code&gt; values, puts them back together in batches of 10K, and passes these to the hash join with &lt;code&gt;customer&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;We try different vector sizes, such as 100K: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; cl_exec (&amp;#39;__dbf_set (&amp;#39;&amp;#39;dc_batch_sz&amp;#39;&amp;#39;, 100000)&amp;#39;); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;There are two metrics of interest here: The write block time, and the scheduling overhead. The write block time is microseconds, which increases whenever a thread must wait before it can write to a connection. The scheduling overhead is cumulative clocks spent by threads while waiting for a critical section that deals with dispatching messages to consumer threads. Long messages make blocking; short messages make frequent scheduling decisions.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; SELECT cl_sys_stat (&amp;#39;local_cll_clk&amp;#39;, clr=&amp;gt;1), cl_sys_stat (&amp;#39;write_block_usec&amp;#39;, clr=&amp;gt;1) ; &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt; &lt;code&gt;cl_sys_stat&lt;/code&gt; gets the counters from all processes and returns the sum. &lt;code&gt;clr=&amp;gt;1&lt;/code&gt; means that the counter is cleared after read.&lt;/p&gt; &lt;p&gt;We do Q13 with vector sizes of 10, 100, and 1000K.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Vector size&lt;/th&gt; &lt;th&gt;msec&lt;/th&gt; &lt;th&gt;mtx&lt;/th&gt; &lt;th&gt;wblock&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;10K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3297&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10,829,910,329&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;100K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3150&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,663,238,367&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;59,132&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1000K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3876&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;414,631,129&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,578,003&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;So, 100K seems to strike the best balance between scheduling and blocking on write.&lt;/p&gt; &lt;p&gt;The times are measured after several samples with each setting. The times stabilize after a few runs, as the appropriate size memory blocks are in reserve. Calling &lt;code&gt;mmap&lt;/code&gt; to allocate these on the first run with each size has a very high penalty, e.g., 60s for the first run with 1M vector size. We note that blocking on write is really bad even though 1/3 of the time there is no network and 2/3 of the time there is a fast network (QDR IB) with no other load. Further, the affinities are set so that the thread responsible for incoming messages is always on core. Result variability on consecutive runs is under 5%, which is similar to single-server behavior.&lt;/p&gt; &lt;p&gt;It would seem that a mutex, as bad as it is, is still better than a distributed cause for going off core (blocking on write). The latency for continuing a thread thus blocked is of course higher than the latency for continuing one that is waiting for a mutex.&lt;/p&gt; &lt;p&gt;We note that a cluster with more machines can take a longer vector size because a vector spreads out to more recipients. The key seems to be to set the message size so that blocking on write is not common. This is a possible adaptive execution feature. We have seen no particular benefit from SDP (Sockets Direct Protocol) and its zero copy. This is a TCP replacement that comes with the InfiniBand drivers.&lt;/p&gt; &lt;p&gt;We will next look at replication/partitioning tradeoffs for hash joins. Then we can look at full runs.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aac00620518&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabd70b7238&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd0b58938&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:25.032600-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 17 of n): 100G and 300G Runs on Dual Xeon E5 2650v2</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-26#1820</atom:id>
  <atom:published>2014-09-26T21:07:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is an update presenting sample results on a newer platform for a single-server configuration. This is to verify that performance scales with the addition of cores and clock speed. Further, we note that the jump from 100G to 300G changes very little about the score. 3x larger takes approximately 3x longer, as long as things are in memory.&lt;/p&gt; &lt;p&gt;The platform is one node of the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac007ba808&quot;&gt;CWI&lt;/a&gt; &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aac010f21a8&quot;&gt;cluster&lt;/a&gt; which was also used for the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1804&quot; id=&quot;link-id0x2aac007ba828&quot;&gt;500Gt RDF experiments reported on this blog&lt;/a&gt;. The specification is dual Xeon E5 2650v2 (8 core, 16 thread, 2.6 GHz) with 256 GB RAM. The disk setup is a RAID-0 of three 2 TB rotating disks.&lt;/p&gt; &lt;p&gt;For the 100G, we go from 240 to 395, which is about 1.64x. The new platform has 16 vs 12 cores and a clock of 2.6 as opposed to 2.3. This makes a multiplier of 1.5. The rest of the acceleration is probably attributable to faster memory clock. Anyway, the point of more speed from larger platform is made.&lt;/p&gt; &lt;p&gt;The top level scores per run are as follows; the numerical quantities summaries are appended.&lt;/p&gt; &lt;h3&gt;100G&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;391,000.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;401,029.4&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;395,983.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;388,746.2&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;404,189.3&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;396,392.6&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;300G&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;61,988.7&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;384,883.7&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;154,461.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;423,431.8&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;387,248.6&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;404,936.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;417,672.0&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;389,719.5&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;403,453.7&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The interested may reproduce the results using the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aabe9517e78&quot;&gt;feature/analytics branch&lt;/a&gt; of the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aabeb525948&quot;&gt;v7fasttrack git repository&lt;/a&gt; on &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aac007a2198&quot;&gt;GitHub&lt;/a&gt; as described in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac00e379f8&quot;&gt;Part 13&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;For the 300G runs, we note a much longer load time; see below, as this is seriously IO bound.&lt;/p&gt; &lt;p&gt;The first power test at 300G is a non-starter, even though this comes right after bulk load. Still, the data is not in working set and getting it from disk is simply an automatic disqualification, unless maybe one had 300 separate disks. This happens in TPC benchmarks, but not very often in the field. Looking at the first power run, the first queries take the longest, but by the time the power run starts, the working set is there. By an artifact of the metric (use of geometric mean for the power test), long queries are penalized less there than in the throughput run.&lt;/p&gt; &lt;p&gt;So, we run 3 executions instead of the prescribed 2, to have 2 executions from warm state.&lt;/p&gt; &lt;p&gt;To do 300G well in 256 GB of RAM, one needs either to use several SSDs, or to increase compression and keep all in memory, so no secondary storage at all. In order to keep all in memory, one could have stream-compression on string columns. Stream-compressing strings (e.g., &lt;code&gt;o_comment&lt;/code&gt;, &lt;code&gt;l_comment&lt;/code&gt;) does not pay if one is already in memory, but if stream-compressing strings eliminates going to secondary storage, then the win is sure.&lt;/p&gt; &lt;p&gt;As before, all caveats apply; the results are unaudited and for information only. Therefore we do not use the official metric name.&lt;/p&gt; &lt;h2&gt;100G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 15, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:04:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:15:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;0:11:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;391,000.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;401,029.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;395,983.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;98.846000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:01&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:28&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:06&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:07&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:07&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:04&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:08&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:01&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:03&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/15/2014 13:13:28&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:14:10&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:16&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:42&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:42&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:53&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:53&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:02&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:14:02&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:10&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:08&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.442477&lt;/td&gt; &lt;td&gt;0.304513&lt;/td&gt; &lt;td&gt;0.720263&lt;/td&gt; &lt;td&gt;0.351285&lt;/td&gt; &lt;td&gt;0.979414&lt;/td&gt; &lt;td&gt;0.479455&lt;/td&gt; &lt;td&gt;0.865992&lt;/td&gt; &lt;td&gt;0.875236&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.938133&lt;/td&gt; &lt;td&gt;0.920533&lt;/td&gt; &lt;td&gt;3.738724&lt;/td&gt; &lt;td&gt;2.769707&lt;/td&gt; &lt;td&gt;3.209728&lt;/td&gt; &lt;td&gt;1.339146&lt;/td&gt; &lt;td&gt;2.759384&lt;/td&gt; &lt;td&gt;3.626868&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.104738&lt;/td&gt; &lt;td&gt;0.952245&lt;/td&gt; &lt;td&gt;4.719658&lt;/td&gt; &lt;td&gt;0.865586&lt;/td&gt; &lt;td&gt;2.139267&lt;/td&gt; &lt;td&gt;0.850909&lt;/td&gt; &lt;td&gt;2.044402&lt;/td&gt; &lt;td&gt;2.600373&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;3.692119&lt;/td&gt; &lt;td&gt;1.024876&lt;/td&gt; &lt;td&gt;3.430172&lt;/td&gt; &lt;td&gt;1.579846&lt;/td&gt; &lt;td&gt;4.097845&lt;/td&gt; &lt;td&gt;1.859468&lt;/td&gt; &lt;td&gt;2.312921&lt;/td&gt; &lt;td&gt;6.238070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;5.419537&lt;/td&gt; &lt;td&gt;0.531571&lt;/td&gt; &lt;td&gt;2.116176&lt;/td&gt; &lt;td&gt;1.256836&lt;/td&gt; &lt;td&gt;4.787617&lt;/td&gt; &lt;td&gt;2.117995&lt;/td&gt; &lt;td&gt;3.517466&lt;/td&gt; &lt;td&gt;3.982180&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.167029&lt;/td&gt; &lt;td&gt;0.746720&lt;/td&gt; &lt;td&gt;3.157557&lt;/td&gt; &lt;td&gt;1.255182&lt;/td&gt; &lt;td&gt;3.004802&lt;/td&gt; &lt;td&gt;2.131963&lt;/td&gt; &lt;td&gt;3.648316&lt;/td&gt; &lt;td&gt;2.835751&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.692119&lt;/td&gt; &lt;td&gt;0.531571&lt;/td&gt; &lt;td&gt;2.116176&lt;/td&gt; &lt;td&gt;0.865586&lt;/td&gt; &lt;td&gt;2.139267&lt;/td&gt; &lt;td&gt;0.850909&lt;/td&gt; &lt;td&gt;2.044402&lt;/td&gt; &lt;td&gt;2.600373&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.419537&lt;/td&gt; &lt;td&gt;1.024876&lt;/td&gt; &lt;td&gt;4.719658&lt;/td&gt; &lt;td&gt;2.769707&lt;/td&gt; &lt;td&gt;4.787617&lt;/td&gt; &lt;td&gt;2.131963&lt;/td&gt; &lt;td&gt;3.648316&lt;/td&gt; &lt;td&gt;6.238070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.464311&lt;/td&gt; &lt;td&gt;0.835189&lt;/td&gt; &lt;td&gt;3.432457&lt;/td&gt; &lt;td&gt;1.545431&lt;/td&gt; &lt;td&gt;3.447852&lt;/td&gt; &lt;td&gt;1.659896&lt;/td&gt; &lt;td&gt;2.856498&lt;/td&gt; &lt;td&gt;3.856648&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.606044&lt;/td&gt; &lt;td&gt;1.117063&lt;/td&gt; &lt;td&gt;1.847930&lt;/td&gt; &lt;td&gt;0.618534&lt;/td&gt; &lt;td&gt;4.327600&lt;/td&gt; &lt;td&gt;1.110908&lt;/td&gt; &lt;td&gt;0.995289&lt;/td&gt; &lt;td&gt;0.975910&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;7.463593&lt;/td&gt; &lt;td&gt;4.686463&lt;/td&gt; &lt;td&gt;4.549733&lt;/td&gt; &lt;td&gt;4.168129&lt;/td&gt; &lt;td&gt;15.759178&lt;/td&gt; &lt;td&gt;5.247666&lt;/td&gt; &lt;td&gt;4.495030&lt;/td&gt; &lt;td&gt;4.075198&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.398552&lt;/td&gt; &lt;td&gt;5.170904&lt;/td&gt; &lt;td&gt;3.934405&lt;/td&gt; &lt;td&gt;1.880683&lt;/td&gt; &lt;td&gt;19.968787&lt;/td&gt; &lt;td&gt;3.767992&lt;/td&gt; &lt;td&gt;6.965337&lt;/td&gt; &lt;td&gt;3.849845&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;7.581069&lt;/td&gt; &lt;td&gt;4.109905&lt;/td&gt; &lt;td&gt;4.301159&lt;/td&gt; &lt;td&gt;2.123634&lt;/td&gt; &lt;td&gt;17.683200&lt;/td&gt; &lt;td&gt;5.383603&lt;/td&gt; &lt;td&gt;4.376887&lt;/td&gt; &lt;td&gt;2.854777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;9.927887&lt;/td&gt; &lt;td&gt;6.913209&lt;/td&gt; &lt;td&gt;3.351489&lt;/td&gt; &lt;td&gt;2.802724&lt;/td&gt; &lt;td&gt;16.985827&lt;/td&gt; &lt;td&gt;3.925148&lt;/td&gt; &lt;td&gt;4.691474&lt;/td&gt; &lt;td&gt;4.080586&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;7.035080&lt;/td&gt; &lt;td&gt;3.921425&lt;/td&gt; &lt;td&gt;6.844778&lt;/td&gt; &lt;td&gt;2.899238&lt;/td&gt; &lt;td&gt;14.839509&lt;/td&gt; &lt;td&gt;4.986742&lt;/td&gt; &lt;td&gt;6.629664&lt;/td&gt; &lt;td&gt;4.089547&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.035080&lt;/td&gt; &lt;td&gt;3.921425&lt;/td&gt; &lt;td&gt;3.351489&lt;/td&gt; &lt;td&gt;1.880683&lt;/td&gt; &lt;td&gt;14.839509&lt;/td&gt; &lt;td&gt;3.767992&lt;/td&gt; &lt;td&gt;4.376887&lt;/td&gt; &lt;td&gt;2.854777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;9.927887&lt;/td&gt; &lt;td&gt;6.913209&lt;/td&gt; &lt;td&gt;6.844778&lt;/td&gt; &lt;td&gt;4.168129&lt;/td&gt; &lt;td&gt;19.968787&lt;/td&gt; &lt;td&gt;5.383603&lt;/td&gt; &lt;td&gt;6.965337&lt;/td&gt; &lt;td&gt;4.089547&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.281236&lt;/td&gt; &lt;td&gt;4.960381&lt;/td&gt; &lt;td&gt;4.596313&lt;/td&gt; &lt;td&gt;2.774882&lt;/td&gt; &lt;td&gt;17.047300&lt;/td&gt; &lt;td&gt;4.662230&lt;/td&gt; &lt;td&gt;5.431678&lt;/td&gt; &lt;td&gt;3.789991&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.215956&lt;/td&gt; &lt;td&gt;0.745257&lt;/td&gt; &lt;td&gt;0.699801&lt;/td&gt; &lt;td&gt;1.281834&lt;/td&gt; &lt;td&gt;1.291110&lt;/td&gt; &lt;td&gt;0.518425&lt;/td&gt; &lt;td&gt;1.827192&lt;/td&gt; &lt;td&gt;1.014431&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.779854&lt;/td&gt; &lt;td&gt;2.383264&lt;/td&gt; &lt;td&gt;2.396793&lt;/td&gt; &lt;td&gt;6.130511&lt;/td&gt; &lt;td&gt;5.002700&lt;/td&gt; &lt;td&gt;1.968425&lt;/td&gt; &lt;td&gt;4.172437&lt;/td&gt; &lt;td&gt;2.427047&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;7.828176&lt;/td&gt; &lt;td&gt;1.833416&lt;/td&gt; &lt;td&gt;3.175649&lt;/td&gt; &lt;td&gt;4.785709&lt;/td&gt; &lt;td&gt;5.385834&lt;/td&gt; &lt;td&gt;1.403290&lt;/td&gt; &lt;td&gt;6.383005&lt;/td&gt; &lt;td&gt;6.366525&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;5.880139&lt;/td&gt; &lt;td&gt;1.797383&lt;/td&gt; &lt;td&gt;3.258024&lt;/td&gt; &lt;td&gt;5.601364&lt;/td&gt; &lt;td&gt;6.373216&lt;/td&gt; &lt;td&gt;1.977848&lt;/td&gt; &lt;td&gt;5.235542&lt;/td&gt; &lt;td&gt;6.385010&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;3.989621&lt;/td&gt; &lt;td&gt;1.252891&lt;/td&gt; &lt;td&gt;2.478303&lt;/td&gt; &lt;td&gt;4.678629&lt;/td&gt; &lt;td&gt;3.212176&lt;/td&gt; &lt;td&gt;2.740586&lt;/td&gt; &lt;td&gt;5.037995&lt;/td&gt; &lt;td&gt;3.911379&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.030440&lt;/td&gt; &lt;td&gt;2.010988&lt;/td&gt; &lt;td&gt;4.188428&lt;/td&gt; &lt;td&gt;6.221990&lt;/td&gt; &lt;td&gt;5.418788&lt;/td&gt; &lt;td&gt;2.187718&lt;/td&gt; &lt;td&gt;3.589915&lt;/td&gt; &lt;td&gt;3.517380&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.989621&lt;/td&gt; &lt;td&gt;1.252891&lt;/td&gt; &lt;td&gt;2.396793&lt;/td&gt; &lt;td&gt;4.678629&lt;/td&gt; &lt;td&gt;3.212176&lt;/td&gt; &lt;td&gt;1.403290&lt;/td&gt; &lt;td&gt;3.589915&lt;/td&gt; &lt;td&gt;2.427047&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;7.828176&lt;/td&gt; &lt;td&gt;2.383264&lt;/td&gt; &lt;td&gt;4.188428&lt;/td&gt; &lt;td&gt;6.221990&lt;/td&gt; &lt;td&gt;6.373216&lt;/td&gt; &lt;td&gt;2.740586&lt;/td&gt; &lt;td&gt;6.383005&lt;/td&gt; &lt;td&gt;6.385010&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.701646&lt;/td&gt; &lt;td&gt;1.855588&lt;/td&gt; &lt;td&gt;3.099439&lt;/td&gt; &lt;td&gt;5.483641&lt;/td&gt; &lt;td&gt;5.078543&lt;/td&gt; &lt;td&gt;2.055573&lt;/td&gt; &lt;td&gt;4.883779&lt;/td&gt; &lt;td&gt;4.521468&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;100G Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 15, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;87,312M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:04:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:15:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;0:11:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;388,746.2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;404,189.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;396,392.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;98.074000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:11&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:38&lt;/td&gt; &lt;td&gt;0:00:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:13&lt;/td&gt; &lt;td&gt;0:01:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:16&lt;/td&gt; &lt;td&gt;0:01:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:15&lt;/td&gt; &lt;td&gt;0:01:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:17&lt;/td&gt; &lt;td&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:15&lt;/td&gt; &lt;td&gt;0:01:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:11&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:12&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/15/2014 13:15:38&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:16:13&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:20&lt;/td&gt; &lt;td&gt;0:00:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:47&lt;/td&gt; &lt;td&gt;0:00:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:47&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:56&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:56&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:03&lt;/td&gt; &lt;td&gt;0:00:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:16:03&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:12&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.467681&lt;/td&gt; &lt;td&gt;0.277665&lt;/td&gt; &lt;td&gt;0.766102&lt;/td&gt; &lt;td&gt;0.365185&lt;/td&gt; &lt;td&gt;0.941206&lt;/td&gt; &lt;td&gt;0.549381&lt;/td&gt; &lt;td&gt;0.938998&lt;/td&gt; &lt;td&gt;0.803514&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.883169&lt;/td&gt; &lt;td&gt;1.488521&lt;/td&gt; &lt;td&gt;3.366920&lt;/td&gt; &lt;td&gt;1.627478&lt;/td&gt; &lt;td&gt;3.632321&lt;/td&gt; &lt;td&gt;2.065565&lt;/td&gt; &lt;td&gt;2.911138&lt;/td&gt; &lt;td&gt;2.444544&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;3.294589&lt;/td&gt; &lt;td&gt;1.138066&lt;/td&gt; &lt;td&gt;3.260775&lt;/td&gt; &lt;td&gt;1.899615&lt;/td&gt; &lt;td&gt;5.367725&lt;/td&gt; &lt;td&gt;1.820374&lt;/td&gt; &lt;td&gt;3.655119&lt;/td&gt; &lt;td&gt;2.186642&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;3.797641&lt;/td&gt; &lt;td&gt;0.995877&lt;/td&gt; &lt;td&gt;3.239690&lt;/td&gt; &lt;td&gt;2.483035&lt;/td&gt; &lt;td&gt;2.737690&lt;/td&gt; &lt;td&gt;1.505998&lt;/td&gt; &lt;td&gt;4.058083&lt;/td&gt; &lt;td&gt;4.268644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.099187&lt;/td&gt; &lt;td&gt;0.402685&lt;/td&gt; &lt;td&gt;4.704959&lt;/td&gt; &lt;td&gt;1.469825&lt;/td&gt; &lt;td&gt;5.367910&lt;/td&gt; &lt;td&gt;2.783018&lt;/td&gt; &lt;td&gt;2.706164&lt;/td&gt; &lt;td&gt;2.551061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;3.651273&lt;/td&gt; &lt;td&gt;1.598314&lt;/td&gt; &lt;td&gt;2.051899&lt;/td&gt; &lt;td&gt;1.283754&lt;/td&gt; &lt;td&gt;4.711897&lt;/td&gt; &lt;td&gt;1.519763&lt;/td&gt; &lt;td&gt;2.851300&lt;/td&gt; &lt;td&gt;2.484093&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.294589&lt;/td&gt; &lt;td&gt;0.402685&lt;/td&gt; &lt;td&gt;2.051899&lt;/td&gt; &lt;td&gt;1.283754&lt;/td&gt; &lt;td&gt;2.737690&lt;/td&gt; &lt;td&gt;1.505998&lt;/td&gt; &lt;td&gt;2.706164&lt;/td&gt; &lt;td&gt;2.186642&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;4.099187&lt;/td&gt; &lt;td&gt;1.598314&lt;/td&gt; &lt;td&gt;4.704959&lt;/td&gt; &lt;td&gt;2.483035&lt;/td&gt; &lt;td&gt;5.367910&lt;/td&gt; &lt;td&gt;2.783018&lt;/td&gt; &lt;td&gt;4.058083&lt;/td&gt; &lt;td&gt;4.268644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;3.745172&lt;/td&gt; &lt;td&gt;1.124693&lt;/td&gt; &lt;td&gt;3.324849&lt;/td&gt; &lt;td&gt;1.752741&lt;/td&gt; &lt;td&gt;4.363509&lt;/td&gt; &lt;td&gt;1.938944&lt;/td&gt; &lt;td&gt;3.236361&lt;/td&gt; &lt;td&gt;2.786997&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.734812&lt;/td&gt; &lt;td&gt;1.115539&lt;/td&gt; &lt;td&gt;1.679910&lt;/td&gt; &lt;td&gt;0.633239&lt;/td&gt; &lt;td&gt;4.391739&lt;/td&gt; &lt;td&gt;1.130082&lt;/td&gt; &lt;td&gt;1.137284&lt;/td&gt; &lt;td&gt;0.919646&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.271071&lt;/td&gt; &lt;td&gt;5.664855&lt;/td&gt; &lt;td&gt;3.377869&lt;/td&gt; &lt;td&gt;2.148228&lt;/td&gt; &lt;td&gt;16.046021&lt;/td&gt; &lt;td&gt;2.935643&lt;/td&gt; &lt;td&gt;4.897009&lt;/td&gt; &lt;td&gt;2.891040&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10.272523&lt;/td&gt; &lt;td&gt;4.578427&lt;/td&gt; &lt;td&gt;4.086788&lt;/td&gt; &lt;td&gt;2.312762&lt;/td&gt; &lt;td&gt;16.295728&lt;/td&gt; &lt;td&gt;2.714776&lt;/td&gt; &lt;td&gt;6.393897&lt;/td&gt; &lt;td&gt;2.414951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;7.095213&lt;/td&gt; &lt;td&gt;4.544636&lt;/td&gt; &lt;td&gt;4.073433&lt;/td&gt; &lt;td&gt;2.710320&lt;/td&gt; &lt;td&gt;18.789088&lt;/td&gt; &lt;td&gt;3.903873&lt;/td&gt; &lt;td&gt;5.471600&lt;/td&gt; &lt;td&gt;2.994184&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;7.567924&lt;/td&gt; &lt;td&gt;3.691088&lt;/td&gt; &lt;td&gt;3.951049&lt;/td&gt; &lt;td&gt;2.207944&lt;/td&gt; &lt;td&gt;18.189014&lt;/td&gt; &lt;td&gt;4.985841&lt;/td&gt; &lt;td&gt;6.568935&lt;/td&gt; &lt;td&gt;3.965322&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;8.173577&lt;/td&gt; &lt;td&gt;4.959777&lt;/td&gt; &lt;td&gt;4.736593&lt;/td&gt; &lt;td&gt;3.507469&lt;/td&gt; &lt;td&gt;17.106990&lt;/td&gt; &lt;td&gt;5.405699&lt;/td&gt; &lt;td&gt;7.357104&lt;/td&gt; &lt;td&gt;3.125788&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.095213&lt;/td&gt; &lt;td&gt;3.691088&lt;/td&gt; &lt;td&gt;3.377869&lt;/td&gt; &lt;td&gt;2.148228&lt;/td&gt; &lt;td&gt;16.046021&lt;/td&gt; &lt;td&gt;2.714776&lt;/td&gt; &lt;td&gt;4.897009&lt;/td&gt; &lt;td&gt;2.414951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;10.272523&lt;/td&gt; &lt;td&gt;5.664855&lt;/td&gt; &lt;td&gt;4.736593&lt;/td&gt; &lt;td&gt;3.507469&lt;/td&gt; &lt;td&gt;18.789088&lt;/td&gt; &lt;td&gt;5.405699&lt;/td&gt; &lt;td&gt;7.357104&lt;/td&gt; &lt;td&gt;3.965322&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.476062&lt;/td&gt; &lt;td&gt;4.687757&lt;/td&gt; &lt;td&gt;4.045146&lt;/td&gt; &lt;td&gt;2.577345&lt;/td&gt; &lt;td&gt;17.285368&lt;/td&gt; &lt;td&gt;3.989166&lt;/td&gt; &lt;td&gt;6.137709&lt;/td&gt; &lt;td&gt;3.078257&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.206347&lt;/td&gt; &lt;td&gt;0.792013&lt;/td&gt; &lt;td&gt;0.699476&lt;/td&gt; &lt;td&gt;1.349182&lt;/td&gt; &lt;td&gt;1.505387&lt;/td&gt; &lt;td&gt;0.543947&lt;/td&gt; &lt;td&gt;1.549135&lt;/td&gt; &lt;td&gt;0.824344&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.135036&lt;/td&gt; &lt;td&gt;1.873195&lt;/td&gt; &lt;td&gt;4.978155&lt;/td&gt; &lt;td&gt;5.988226&lt;/td&gt; &lt;td&gt;4.705365&lt;/td&gt; &lt;td&gt;1.211049&lt;/td&gt; &lt;td&gt;4.175947&lt;/td&gt; &lt;td&gt;3.579242&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;7.656125&lt;/td&gt; &lt;td&gt;2.229819&lt;/td&gt; &lt;td&gt;2.805272&lt;/td&gt; &lt;td&gt;6.629781&lt;/td&gt; &lt;td&gt;4.138014&lt;/td&gt; &lt;td&gt;1.423334&lt;/td&gt; &lt;td&gt;5.165700&lt;/td&gt; &lt;td&gt;3.197300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;6.385983&lt;/td&gt; &lt;td&gt;2.086301&lt;/td&gt; &lt;td&gt;3.450305&lt;/td&gt; &lt;td&gt;3.292353&lt;/td&gt; &lt;td&gt;5.503905&lt;/td&gt; &lt;td&gt;2.302992&lt;/td&gt; &lt;td&gt;4.860041&lt;/td&gt; &lt;td&gt;3.865383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;6.514967&lt;/td&gt; &lt;td&gt;2.876895&lt;/td&gt; &lt;td&gt;3.481100&lt;/td&gt; &lt;td&gt;1.629007&lt;/td&gt; &lt;td&gt;5.715903&lt;/td&gt; &lt;td&gt;2.121692&lt;/td&gt; &lt;td&gt;3.681208&lt;/td&gt; &lt;td&gt;3.347289&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.100205&lt;/td&gt; &lt;td&gt;2.400816&lt;/td&gt; &lt;td&gt;2.142291&lt;/td&gt; &lt;td&gt;4.710677&lt;/td&gt; &lt;td&gt;5.765320&lt;/td&gt; &lt;td&gt;1.616445&lt;/td&gt; &lt;td&gt;6.095817&lt;/td&gt; &lt;td&gt;3.007436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.100205&lt;/td&gt; &lt;td&gt;1.873195&lt;/td&gt; &lt;td&gt;2.142291&lt;/td&gt; &lt;td&gt;1.629007&lt;/td&gt; &lt;td&gt;4.138014&lt;/td&gt; &lt;td&gt;1.211049&lt;/td&gt; &lt;td&gt;3.681208&lt;/td&gt; &lt;td&gt;3.007436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;7.656125&lt;/td&gt; &lt;td&gt;2.876895&lt;/td&gt; &lt;td&gt;4.978155&lt;/td&gt; &lt;td&gt;6.629781&lt;/td&gt; &lt;td&gt;5.765320&lt;/td&gt; &lt;td&gt;2.302992&lt;/td&gt; &lt;td&gt;6.095817&lt;/td&gt; &lt;td&gt;3.865383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.958463&lt;/td&gt; &lt;td&gt;2.293405&lt;/td&gt; &lt;td&gt;3.371425&lt;/td&gt; &lt;td&gt;4.450009&lt;/td&gt; &lt;td&gt;5.165701&lt;/td&gt; &lt;td&gt;1.735102&lt;/td&gt; &lt;td&gt;4.795743&lt;/td&gt; &lt;td&gt;3.399330&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;61,988.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;384,883.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@300GB)&lt;/th&gt; &lt;td&gt;154,461.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;370.498000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:00:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:22:25&lt;/td&gt; &lt;td&gt;0:21:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:23&lt;/td&gt; &lt;td&gt;0:05:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:23&lt;/td&gt; &lt;td&gt;0:05:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:26&lt;/td&gt; &lt;td&gt;0:05:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:13&lt;/td&gt; &lt;td&gt;0:05:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:38&lt;/td&gt; &lt;td&gt;0:06:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:38&lt;/td&gt; &lt;td&gt;0:06:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:00:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:03:56&lt;/td&gt; &lt;td&gt;0:03:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:22:25&lt;/td&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:25:22&lt;/td&gt; &lt;td&gt;09/25/2014 19:25:58&lt;/td&gt; &lt;td&gt;0:00:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:23:11&lt;/td&gt; &lt;td&gt;0:00:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:23:10&lt;/td&gt; &lt;td&gt;09/25/2014 19:23:40&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:23:40&lt;/td&gt; &lt;td&gt;09/25/2014 19:24:21&lt;/td&gt; &lt;td&gt;0:00:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:24:21&lt;/td&gt; &lt;td&gt;09/25/2014 19:24:58&lt;/td&gt; &lt;td&gt;0:00:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:24:59&lt;/td&gt; &lt;td&gt;09/25/2014 19:25:22&lt;/td&gt; &lt;td&gt;0:00:23&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;183.735463&lt;/td&gt; &lt;td&gt;95.826361&lt;/td&gt; &lt;td&gt;79.826802&lt;/td&gt; &lt;td&gt;87.603164&lt;/td&gt; &lt;td&gt;47.099641&lt;/td&gt; &lt;td&gt;1.301704&lt;/td&gt; &lt;td&gt;2.606488&lt;/td&gt; &lt;td&gt;52.667426&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.400003&lt;/td&gt; &lt;td&gt;1.983777&lt;/td&gt; &lt;td&gt;15.839250&lt;/td&gt; &lt;td&gt;3.001843&lt;/td&gt; &lt;td&gt;15.593335&lt;/td&gt; &lt;td&gt;6.067716&lt;/td&gt; &lt;td&gt;8.870516&lt;/td&gt; &lt;td&gt;11.679706&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;12.634711&lt;/td&gt; &lt;td&gt;3.472203&lt;/td&gt; &lt;td&gt;13.683075&lt;/td&gt; &lt;td&gt;8.057952&lt;/td&gt; &lt;td&gt;16.500741&lt;/td&gt; &lt;td&gt;5.403771&lt;/td&gt; &lt;td&gt;11.181661&lt;/td&gt; &lt;td&gt;12.393932&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10.807287&lt;/td&gt; &lt;td&gt;3.793587&lt;/td&gt; &lt;td&gt;15.844244&lt;/td&gt; &lt;td&gt;3.214977&lt;/td&gt; &lt;td&gt;15.960600&lt;/td&gt; &lt;td&gt;7.099744&lt;/td&gt; &lt;td&gt;10.424530&lt;/td&gt; &lt;td&gt;21.001623&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;11.900829&lt;/td&gt; &lt;td&gt;3.741707&lt;/td&gt; &lt;td&gt;14.219904&lt;/td&gt; &lt;td&gt;5.616907&lt;/td&gt; &lt;td&gt;16.487144&lt;/td&gt; &lt;td&gt;14.229782&lt;/td&gt; &lt;td&gt;11.100193&lt;/td&gt; &lt;td&gt;8.769539&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.933423&lt;/td&gt; &lt;td&gt;2.916529&lt;/td&gt; &lt;td&gt;19.453452&lt;/td&gt; &lt;td&gt;5.258843&lt;/td&gt; &lt;td&gt;16.706269&lt;/td&gt; &lt;td&gt;7.948711&lt;/td&gt; &lt;td&gt;8.982104&lt;/td&gt; &lt;td&gt;17.566729&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;17.084445&lt;/td&gt; &lt;td&gt;0.738683&lt;/td&gt; &lt;td&gt;11.503079&lt;/td&gt; &lt;td&gt;8.324812&lt;/td&gt; &lt;td&gt;23.483917&lt;/td&gt; &lt;td&gt;20.101834&lt;/td&gt; &lt;td&gt;9.207737&lt;/td&gt; &lt;td&gt;10.311292&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;9.400003&lt;/td&gt; &lt;td&gt;0.738683&lt;/td&gt; &lt;td&gt;11.503079&lt;/td&gt; &lt;td&gt;3.001843&lt;/td&gt; &lt;td&gt;15.593335&lt;/td&gt; &lt;td&gt;5.403771&lt;/td&gt; &lt;td&gt;8.870516&lt;/td&gt; &lt;td&gt;8.769539&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;17.084445&lt;/td&gt; &lt;td&gt;3.793587&lt;/td&gt; &lt;td&gt;19.453452&lt;/td&gt; &lt;td&gt;8.324812&lt;/td&gt; &lt;td&gt;23.483917&lt;/td&gt; &lt;td&gt;20.101834&lt;/td&gt; &lt;td&gt;11.181661&lt;/td&gt; &lt;td&gt;21.001623&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;12.626783&lt;/td&gt; &lt;td&gt;2.774414&lt;/td&gt; &lt;td&gt;15.090501&lt;/td&gt; &lt;td&gt;5.579222&lt;/td&gt; &lt;td&gt;17.455334&lt;/td&gt; &lt;td&gt;10.141926&lt;/td&gt; &lt;td&gt;9.961123&lt;/td&gt; &lt;td&gt;13.620470&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;41.997798&lt;/td&gt; &lt;td&gt;2.727870&lt;/td&gt; &lt;td&gt;21.651730&lt;/td&gt; &lt;td&gt;25.704209&lt;/td&gt; &lt;td&gt;293.103984&lt;/td&gt; &lt;td&gt;3.171437&lt;/td&gt; &lt;td&gt;2.886688&lt;/td&gt; &lt;td&gt;5.298823&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;29.662265&lt;/td&gt; &lt;td&gt;22.788618&lt;/td&gt; &lt;td&gt;12.979253&lt;/td&gt; &lt;td&gt;7.121358&lt;/td&gt; &lt;td&gt;62.774323&lt;/td&gt; &lt;td&gt;22.132581&lt;/td&gt; &lt;td&gt;22.616793&lt;/td&gt; &lt;td&gt;21.625334&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;28.041750&lt;/td&gt; &lt;td&gt;22.481172&lt;/td&gt; &lt;td&gt;19.262140&lt;/td&gt; &lt;td&gt;5.790272&lt;/td&gt; &lt;td&gt;58.105179&lt;/td&gt; &lt;td&gt;16.809177&lt;/td&gt; &lt;td&gt;32.813330&lt;/td&gt; &lt;td&gt;12.692499&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;32.534297&lt;/td&gt; &lt;td&gt;15.460256&lt;/td&gt; &lt;td&gt;12.038047&lt;/td&gt; &lt;td&gt;7.012926&lt;/td&gt; &lt;td&gt;59.413740&lt;/td&gt; &lt;td&gt;18.540284&lt;/td&gt; &lt;td&gt;25.968635&lt;/td&gt; &lt;td&gt;16.716208&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;28.759993&lt;/td&gt; &lt;td&gt;15.123651&lt;/td&gt; &lt;td&gt;21.734471&lt;/td&gt; &lt;td&gt;6.920480&lt;/td&gt; &lt;td&gt;63.119744&lt;/td&gt; &lt;td&gt;12.848884&lt;/td&gt; &lt;td&gt;21.372432&lt;/td&gt; &lt;td&gt;11.662102&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;18.315308&lt;/td&gt; &lt;td&gt;21.781800&lt;/td&gt; &lt;td&gt;26.141212&lt;/td&gt; &lt;td&gt;8.230858&lt;/td&gt; &lt;td&gt;60.985590&lt;/td&gt; &lt;td&gt;22.369824&lt;/td&gt; &lt;td&gt;27.098660&lt;/td&gt; &lt;td&gt;25.283066&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;31.455961&lt;/td&gt; &lt;td&gt;27.078707&lt;/td&gt; &lt;td&gt;12.954580&lt;/td&gt; &lt;td&gt;11.081669&lt;/td&gt; &lt;td&gt;72.483462&lt;/td&gt; &lt;td&gt;12.376376&lt;/td&gt; &lt;td&gt;22.129120&lt;/td&gt; &lt;td&gt;11.439147&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;18.315308&lt;/td&gt; &lt;td&gt;15.123651&lt;/td&gt; &lt;td&gt;12.038047&lt;/td&gt; &lt;td&gt;5.790272&lt;/td&gt; &lt;td&gt;58.105179&lt;/td&gt; &lt;td&gt;12.376376&lt;/td&gt; &lt;td&gt;21.372432&lt;/td&gt; &lt;td&gt;11.439147&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;32.534297&lt;/td&gt; &lt;td&gt;27.078707&lt;/td&gt; &lt;td&gt;26.141212&lt;/td&gt; &lt;td&gt;11.081669&lt;/td&gt; &lt;td&gt;72.483462&lt;/td&gt; &lt;td&gt;22.369824&lt;/td&gt; &lt;td&gt;32.813330&lt;/td&gt; &lt;td&gt;25.283066&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;28.128262&lt;/td&gt; &lt;td&gt;20.785701&lt;/td&gt; &lt;td&gt;17.518284&lt;/td&gt; &lt;td&gt;7.692927&lt;/td&gt; &lt;td&gt;62.813673&lt;/td&gt; &lt;td&gt;17.512854&lt;/td&gt; &lt;td&gt;25.333162&lt;/td&gt; &lt;td&gt;16.569726&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;7.793403&lt;/td&gt; &lt;td&gt;81.545934&lt;/td&gt; &lt;td&gt;41.648484&lt;/td&gt; &lt;td&gt;4.638731&lt;/td&gt; &lt;td&gt;25.003179&lt;/td&gt; &lt;td&gt;0.536267&lt;/td&gt; &lt;td&gt;206.980380&lt;/td&gt; &lt;td&gt;2.501589&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;27.058060&lt;/td&gt; &lt;td&gt;3.894254&lt;/td&gt; &lt;td&gt;8.664394&lt;/td&gt; &lt;td&gt;25.315007&lt;/td&gt; &lt;td&gt;11.921265&lt;/td&gt; &lt;td&gt;3.561859&lt;/td&gt; &lt;td&gt;22.936601&lt;/td&gt; &lt;td&gt;13.235777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;25.718500&lt;/td&gt; &lt;td&gt;6.140657&lt;/td&gt; &lt;td&gt;8.856586&lt;/td&gt; &lt;td&gt;14.761290&lt;/td&gt; &lt;td&gt;11.870351&lt;/td&gt; &lt;td&gt;7.728217&lt;/td&gt; &lt;td&gt;13.882613&lt;/td&gt; &lt;td&gt;29.328859&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;15.896774&lt;/td&gt; &lt;td&gt;8.631035&lt;/td&gt; &lt;td&gt;15.742406&lt;/td&gt; &lt;td&gt;20.621604&lt;/td&gt; &lt;td&gt;13.370582&lt;/td&gt; &lt;td&gt;5.536313&lt;/td&gt; &lt;td&gt;14.677463&lt;/td&gt; &lt;td&gt;14.772753&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;22.458327&lt;/td&gt; &lt;td&gt;5.319241&lt;/td&gt; &lt;td&gt;11.973431&lt;/td&gt; &lt;td&gt;22.344017&lt;/td&gt; &lt;td&gt;11.534642&lt;/td&gt; &lt;td&gt;2.402683&lt;/td&gt; &lt;td&gt;24.214115&lt;/td&gt; &lt;td&gt;16.236299&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.407745&lt;/td&gt; &lt;td&gt;5.413278&lt;/td&gt; &lt;td&gt;8.800650&lt;/td&gt; &lt;td&gt;18.055743&lt;/td&gt; &lt;td&gt;17.528827&lt;/td&gt; &lt;td&gt;4.173171&lt;/td&gt; &lt;td&gt;15.927165&lt;/td&gt; &lt;td&gt;21.636801&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;8.069721&lt;/td&gt; &lt;td&gt;5.531066&lt;/td&gt; &lt;td&gt;13.233927&lt;/td&gt; &lt;td&gt;21.321389&lt;/td&gt; &lt;td&gt;7.622026&lt;/td&gt; &lt;td&gt;12.064182&lt;/td&gt; &lt;td&gt;11.457848&lt;/td&gt; &lt;td&gt;12.342336&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;8.069721&lt;/td&gt; &lt;td&gt;3.894254&lt;/td&gt; &lt;td&gt;8.664394&lt;/td&gt; &lt;td&gt;14.761290&lt;/td&gt; &lt;td&gt;7.622026&lt;/td&gt; &lt;td&gt;2.402683&lt;/td&gt; &lt;td&gt;11.457848&lt;/td&gt; &lt;td&gt;12.342336&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;27.058060&lt;/td&gt; &lt;td&gt;8.631035&lt;/td&gt; &lt;td&gt;15.742406&lt;/td&gt; &lt;td&gt;25.315007&lt;/td&gt; &lt;td&gt;17.528827&lt;/td&gt; &lt;td&gt;12.064182&lt;/td&gt; &lt;td&gt;24.214115&lt;/td&gt; &lt;td&gt;29.328859&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;18.768188&lt;/td&gt; &lt;td&gt;5.821588&lt;/td&gt; &lt;td&gt;11.211899&lt;/td&gt; &lt;td&gt;20.403175&lt;/td&gt; &lt;td&gt;12.307949&lt;/td&gt; &lt;td&gt;5.911071&lt;/td&gt; &lt;td&gt;17.182634&lt;/td&gt; &lt;td&gt;17.925471&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;423,431.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;387,248.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@300GB)&lt;/th&gt; &lt;td&gt;404,936.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;368.236000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:28:42&lt;/td&gt; &lt;td&gt;09/25/2014 19:29:58&lt;/td&gt; &lt;td&gt;0:01:16&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:04&lt;/td&gt; &lt;td&gt;0:06:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:00&lt;/td&gt; &lt;td&gt;0:06:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:06&lt;/td&gt; &lt;td&gt;0:06:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:07&lt;/td&gt; &lt;td&gt;0:06:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:35:53&lt;/td&gt; &lt;td&gt;0:05:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:08&lt;/td&gt; &lt;td&gt;0:06:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:28:41&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:46&lt;/td&gt; &lt;td&gt;0:00:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:29:58&lt;/td&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:32:23&lt;/td&gt; &lt;td&gt;09/25/2014 19:32:55&lt;/td&gt; &lt;td&gt;0:00:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:30:31&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:31&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:00&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:01&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:23&lt;/td&gt; &lt;td&gt;0:00:22&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:23&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:54&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:55&lt;/td&gt; &lt;td&gt;09/25/2014 19:32:23&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.197427&lt;/td&gt; &lt;td&gt;1.011516&lt;/td&gt; &lt;td&gt;2.535959&lt;/td&gt; &lt;td&gt;0.858781&lt;/td&gt; &lt;td&gt;2.857279&lt;/td&gt; &lt;td&gt;1.293530&lt;/td&gt; &lt;td&gt;2.682266&lt;/td&gt; &lt;td&gt;2.260502&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;15.467757&lt;/td&gt; &lt;td&gt;3.517499&lt;/td&gt; &lt;td&gt;13.820864&lt;/td&gt; &lt;td&gt;4.157259&lt;/td&gt; &lt;td&gt;13.141556&lt;/td&gt; &lt;td&gt;10.902710&lt;/td&gt; &lt;td&gt;16.899687&lt;/td&gt; &lt;td&gt;8.986535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;15.639991&lt;/td&gt; &lt;td&gt;6.026485&lt;/td&gt; &lt;td&gt;13.521624&lt;/td&gt; &lt;td&gt;3.918031&lt;/td&gt; &lt;td&gt;17.336458&lt;/td&gt; &lt;td&gt;1.975310&lt;/td&gt; &lt;td&gt;9.718194&lt;/td&gt; &lt;td&gt;15.165247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.891929&lt;/td&gt; &lt;td&gt;4.481383&lt;/td&gt; &lt;td&gt;15.322621&lt;/td&gt; &lt;td&gt;5.272911&lt;/td&gt; &lt;td&gt;15.266543&lt;/td&gt; &lt;td&gt;6.771253&lt;/td&gt; &lt;td&gt;13.430646&lt;/td&gt; &lt;td&gt;20.171084&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;14.560526&lt;/td&gt; &lt;td&gt;2.464157&lt;/td&gt; &lt;td&gt;11.567112&lt;/td&gt; &lt;td&gt;5.526629&lt;/td&gt; &lt;td&gt;20.531540&lt;/td&gt; &lt;td&gt;5.225971&lt;/td&gt; &lt;td&gt;16.288606&lt;/td&gt; &lt;td&gt;17.209475&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10.390577&lt;/td&gt; &lt;td&gt;3.549165&lt;/td&gt; &lt;td&gt;9.598328&lt;/td&gt; &lt;td&gt;8.783847&lt;/td&gt; &lt;td&gt;17.351211&lt;/td&gt; &lt;td&gt;6.308214&lt;/td&gt; &lt;td&gt;12.606512&lt;/td&gt; &lt;td&gt;13.035716&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;16.275922&lt;/td&gt; &lt;td&gt;4.086475&lt;/td&gt; &lt;td&gt;14.109963&lt;/td&gt; &lt;td&gt;4.385887&lt;/td&gt; &lt;td&gt;10.174709&lt;/td&gt; &lt;td&gt;6.703266&lt;/td&gt; &lt;td&gt;8.936217&lt;/td&gt; &lt;td&gt;16.798526&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;10.390577&lt;/td&gt; &lt;td&gt;2.464157&lt;/td&gt; &lt;td&gt;9.598328&lt;/td&gt; &lt;td&gt;3.918031&lt;/td&gt; &lt;td&gt;10.174709&lt;/td&gt; &lt;td&gt;1.975310&lt;/td&gt; &lt;td&gt;8.936217&lt;/td&gt; &lt;td&gt;8.986535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;16.275922&lt;/td&gt; &lt;td&gt;6.026485&lt;/td&gt; &lt;td&gt;15.322621&lt;/td&gt; &lt;td&gt;8.783847&lt;/td&gt; &lt;td&gt;20.531540&lt;/td&gt; &lt;td&gt;10.902710&lt;/td&gt; &lt;td&gt;16.899687&lt;/td&gt; &lt;td&gt;20.171084&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;14.537784&lt;/td&gt; &lt;td&gt;4.020861&lt;/td&gt; &lt;td&gt;12.990085&lt;/td&gt; &lt;td&gt;5.340761&lt;/td&gt; &lt;td&gt;15.633670&lt;/td&gt; &lt;td&gt;6.314454&lt;/td&gt; &lt;td&gt;12.979977&lt;/td&gt; &lt;td&gt;15.227764&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;8.300092&lt;/td&gt; &lt;td&gt;2.598145&lt;/td&gt; &lt;td&gt;5.168418&lt;/td&gt; &lt;td&gt;1.619399&lt;/td&gt; &lt;td&gt;11.958836&lt;/td&gt; &lt;td&gt;3.191672&lt;/td&gt; &lt;td&gt;3.097822&lt;/td&gt; &lt;td&gt;2.497410&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;26.412829&lt;/td&gt; &lt;td&gt;17.354745&lt;/td&gt; &lt;td&gt;12.942454&lt;/td&gt; &lt;td&gt;8.169447&lt;/td&gt; &lt;td&gt;58.600101&lt;/td&gt; &lt;td&gt;15.227942&lt;/td&gt; &lt;td&gt;32.985324&lt;/td&gt; &lt;td&gt;13.914978&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;34.523245&lt;/td&gt; &lt;td&gt;17.635531&lt;/td&gt; &lt;td&gt;15.193748&lt;/td&gt; &lt;td&gt;8.435375&lt;/td&gt; &lt;td&gt;62.442800&lt;/td&gt; &lt;td&gt;16.276300&lt;/td&gt; &lt;td&gt;26.533303&lt;/td&gt; &lt;td&gt;12.414575&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;25.334301&lt;/td&gt; &lt;td&gt;18.595422&lt;/td&gt; &lt;td&gt;11.663933&lt;/td&gt; &lt;td&gt;10.029387&lt;/td&gt; &lt;td&gt;63.664992&lt;/td&gt; &lt;td&gt;20.378320&lt;/td&gt; &lt;td&gt;24.760768&lt;/td&gt; &lt;td&gt;15.710589&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;36.971957&lt;/td&gt; &lt;td&gt;15.645673&lt;/td&gt; &lt;td&gt;14.672851&lt;/td&gt; &lt;td&gt;13.196301&lt;/td&gt; &lt;td&gt;58.214728&lt;/td&gt; &lt;td&gt;17.375053&lt;/td&gt; &lt;td&gt;26.581101&lt;/td&gt; &lt;td&gt;11.624989&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;30.891797&lt;/td&gt; &lt;td&gt;12.993365&lt;/td&gt; &lt;td&gt;14.089049&lt;/td&gt; &lt;td&gt;10.515091&lt;/td&gt; &lt;td&gt;65.232712&lt;/td&gt; &lt;td&gt;20.807026&lt;/td&gt; &lt;td&gt;26.920526&lt;/td&gt; &lt;td&gt;11.362095&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;38.143281&lt;/td&gt; &lt;td&gt;21.106772&lt;/td&gt; &lt;td&gt;15.152299&lt;/td&gt; &lt;td&gt;18.845766&lt;/td&gt; &lt;td&gt;66.240343&lt;/td&gt; &lt;td&gt;12.295624&lt;/td&gt; &lt;td&gt;22.510610&lt;/td&gt; &lt;td&gt;18.081103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;25.334301&lt;/td&gt; &lt;td&gt;12.993365&lt;/td&gt; &lt;td&gt;11.663933&lt;/td&gt; &lt;td&gt;8.169447&lt;/td&gt; &lt;td&gt;58.214728&lt;/td&gt; &lt;td&gt;12.295624&lt;/td&gt; &lt;td&gt;22.510610&lt;/td&gt; &lt;td&gt;11.362095&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;38.143281&lt;/td&gt; &lt;td&gt;21.106772&lt;/td&gt; &lt;td&gt;15.193748&lt;/td&gt; &lt;td&gt;18.845766&lt;/td&gt; &lt;td&gt;66.240343&lt;/td&gt; &lt;td&gt;20.807026&lt;/td&gt; &lt;td&gt;32.985324&lt;/td&gt; &lt;td&gt;18.081103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;32.046235&lt;/td&gt; &lt;td&gt;17.221918&lt;/td&gt; &lt;td&gt;13.952389&lt;/td&gt; &lt;td&gt;11.531894&lt;/td&gt; &lt;td&gt;62.399279&lt;/td&gt; &lt;td&gt;17.060044&lt;/td&gt; &lt;td&gt;26.715272&lt;/td&gt; &lt;td&gt;13.851388&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.016212&lt;/td&gt; &lt;td&gt;1.603004&lt;/td&gt; &lt;td&gt;1.836489&lt;/td&gt; &lt;td&gt;3.542383&lt;/td&gt; &lt;td&gt;3.901876&lt;/td&gt; &lt;td&gt;0.515102&lt;/td&gt; &lt;td&gt;4.759612&lt;/td&gt; &lt;td&gt;2.358873&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;22.162387&lt;/td&gt; &lt;td&gt;10.067834&lt;/td&gt; &lt;td&gt;15.772705&lt;/td&gt; &lt;td&gt;22.091355&lt;/td&gt; &lt;td&gt;12.974776&lt;/td&gt; &lt;td&gt;8.354196&lt;/td&gt; &lt;td&gt;19.342171&lt;/td&gt; &lt;td&gt;12.771250&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;25.647926&lt;/td&gt; &lt;td&gt;4.263008&lt;/td&gt; &lt;td&gt;11.590737&lt;/td&gt; &lt;td&gt;19.179326&lt;/td&gt; &lt;td&gt;17.899770&lt;/td&gt; &lt;td&gt;4.137031&lt;/td&gt; &lt;td&gt;15.720245&lt;/td&gt; &lt;td&gt;14.719776&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.511279&lt;/td&gt; &lt;td&gt;7.484608&lt;/td&gt; &lt;td&gt;20.735250&lt;/td&gt; &lt;td&gt;13.041037&lt;/td&gt; &lt;td&gt;17.139046&lt;/td&gt; &lt;td&gt;6.014141&lt;/td&gt; &lt;td&gt;16.234122&lt;/td&gt; &lt;td&gt;13.454647&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;19.297494&lt;/td&gt; &lt;td&gt;10.110707&lt;/td&gt; &lt;td&gt;10.907458&lt;/td&gt; &lt;td&gt;19.649066&lt;/td&gt; &lt;td&gt;15.206251&lt;/td&gt; &lt;td&gt;3.423503&lt;/td&gt; &lt;td&gt;11.268082&lt;/td&gt; &lt;td&gt;11.852223&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;17.445165&lt;/td&gt; &lt;td&gt;5.582309&lt;/td&gt; &lt;td&gt;15.266324&lt;/td&gt; &lt;td&gt;19.788382&lt;/td&gt; &lt;td&gt;14.245770&lt;/td&gt; &lt;td&gt;2.810949&lt;/td&gt; &lt;td&gt;16.601461&lt;/td&gt; &lt;td&gt;14.019717&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;25.115339&lt;/td&gt; &lt;td&gt;6.896503&lt;/td&gt; &lt;td&gt;11.661563&lt;/td&gt; &lt;td&gt;21.900028&lt;/td&gt; &lt;td&gt;5.520025&lt;/td&gt; &lt;td&gt;3.093050&lt;/td&gt; &lt;td&gt;15.436258&lt;/td&gt; &lt;td&gt;13.353446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;14.511279&lt;/td&gt; &lt;td&gt;4.263008&lt;/td&gt; &lt;td&gt;10.907458&lt;/td&gt; &lt;td&gt;13.041037&lt;/td&gt; &lt;td&gt;5.520025&lt;/td&gt; &lt;td&gt;2.810949&lt;/td&gt; &lt;td&gt;11.268082&lt;/td&gt; &lt;td&gt;11.852223&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;25.647926&lt;/td&gt; &lt;td&gt;10.110707&lt;/td&gt; &lt;td&gt;20.735250&lt;/td&gt; &lt;td&gt;22.091355&lt;/td&gt; &lt;td&gt;17.899770&lt;/td&gt; &lt;td&gt;8.354196&lt;/td&gt; &lt;td&gt;19.342171&lt;/td&gt; &lt;td&gt;14.719776&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;20.696598&lt;/td&gt; &lt;td&gt;7.400828&lt;/td&gt; &lt;td&gt;14.322339&lt;/td&gt; &lt;td&gt;19.274866&lt;/td&gt; &lt;td&gt;13.830940&lt;/td&gt; &lt;td&gt;4.638812&lt;/td&gt; &lt;td&gt;15.767057&lt;/td&gt; &lt;td&gt;13.361843&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G run 3:&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;258,888M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for &lt;br /&gt;Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;417,672.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;389,719.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite &lt;br /&gt;Query-per-Hour Metric &lt;br /&gt;(Qph@300GB)&lt;/th&gt; &lt;td&gt;403,453.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in &lt;br /&gt;Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;365.902000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:36:11&lt;/td&gt; &lt;td&gt;09/25/2014 19:37:29&lt;/td&gt; &lt;td&gt;0:01:18&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:13&lt;/td&gt; &lt;td&gt;0:05:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:31&lt;/td&gt; &lt;td&gt;0:05:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:37&lt;/td&gt; &lt;td&gt;0:06:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:33&lt;/td&gt; &lt;td&gt;0:06:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:32&lt;/td&gt; &lt;td&gt;0:06:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:37&lt;/td&gt; &lt;td&gt;0:06:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:36:12&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:16&lt;/td&gt; &lt;td&gt;0:00:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:37:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:37:31&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:40:02&lt;/td&gt; &lt;td&gt;09/25/2014 19:40:33&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:31&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:01&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:01&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:30&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:30&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:58&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:58&lt;/td&gt; &lt;td&gt;09/25/2014 19:39:27&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:39:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:40:01&lt;/td&gt; &lt;td&gt;0:00:34&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.305006&lt;/td&gt; &lt;td&gt;1.083442&lt;/td&gt; &lt;td&gt;2.502758&lt;/td&gt; &lt;td&gt;0.845763&lt;/td&gt; &lt;td&gt;2.840824&lt;/td&gt; &lt;td&gt;1.346166&lt;/td&gt; &lt;td&gt;2.659511&lt;/td&gt; &lt;td&gt;2.233550&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;11.513360&lt;/td&gt; &lt;td&gt;3.732513&lt;/td&gt; &lt;td&gt;14.530428&lt;/td&gt; &lt;td&gt;3.819517&lt;/td&gt; &lt;td&gt;14.821291&lt;/td&gt; &lt;td&gt;7.561547&lt;/td&gt; &lt;td&gt;10.435082&lt;/td&gt; &lt;td&gt;8.984230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;13.486433&lt;/td&gt; &lt;td&gt;3.373689&lt;/td&gt; &lt;td&gt;9.620363&lt;/td&gt; &lt;td&gt;3.914320&lt;/td&gt; &lt;td&gt;16.857542&lt;/td&gt; &lt;td&gt;5.837487&lt;/td&gt; &lt;td&gt;10.695443&lt;/td&gt; &lt;td&gt;17.901191&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;11.015942&lt;/td&gt; &lt;td&gt;1.780220&lt;/td&gt; &lt;td&gt;4.830412&lt;/td&gt; &lt;td&gt;9.073543&lt;/td&gt; &lt;td&gt;15.587709&lt;/td&gt; &lt;td&gt;9.661989&lt;/td&gt; &lt;td&gt;12.374931&lt;/td&gt; &lt;td&gt;15.262485&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;13.600461&lt;/td&gt; &lt;td&gt;0.820899&lt;/td&gt; &lt;td&gt;12.254226&lt;/td&gt; &lt;td&gt;7.799415&lt;/td&gt; &lt;td&gt;19.860761&lt;/td&gt; &lt;td&gt;13.145017&lt;/td&gt; &lt;td&gt;14.404345&lt;/td&gt; &lt;td&gt;11.807583&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.358000&lt;/td&gt; &lt;td&gt;3.885118&lt;/td&gt; &lt;td&gt;11.099935&lt;/td&gt; &lt;td&gt;4.845043&lt;/td&gt; &lt;td&gt;18.286721&lt;/td&gt; &lt;td&gt;6.424272&lt;/td&gt; &lt;td&gt;9.735255&lt;/td&gt; &lt;td&gt;15.041608&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;13.588873&lt;/td&gt; &lt;td&gt;3.789631&lt;/td&gt; &lt;td&gt;13.503399&lt;/td&gt; &lt;td&gt;5.130389&lt;/td&gt; &lt;td&gt;13.104065&lt;/td&gt; &lt;td&gt;3.517076&lt;/td&gt; &lt;td&gt;14.929079&lt;/td&gt; &lt;td&gt;19.831639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;11.015942&lt;/td&gt; &lt;td&gt;0.820899&lt;/td&gt; &lt;td&gt;4.830412&lt;/td&gt; &lt;td&gt;3.819517&lt;/td&gt; &lt;td&gt;13.104065&lt;/td&gt; &lt;td&gt;3.517076&lt;/td&gt; &lt;td&gt;9.735255&lt;/td&gt; &lt;td&gt;8.984230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;13.600461&lt;/td&gt; &lt;td&gt;3.885118&lt;/td&gt; &lt;td&gt;14.530428&lt;/td&gt; &lt;td&gt;9.073543&lt;/td&gt; &lt;td&gt;19.860761&lt;/td&gt; &lt;td&gt;13.145017&lt;/td&gt; &lt;td&gt;14.929079&lt;/td&gt; &lt;td&gt;19.831639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;12.760511&lt;/td&gt; &lt;td&gt;2.897012&lt;/td&gt; &lt;td&gt;10.973127&lt;/td&gt; &lt;td&gt;5.763705&lt;/td&gt; &lt;td&gt;16.419681&lt;/td&gt; &lt;td&gt;7.691231&lt;/td&gt; &lt;td&gt;12.095689&lt;/td&gt; &lt;td&gt;14.804789&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;8.553183&lt;/td&gt; &lt;td&gt;3.215484&lt;/td&gt; &lt;td&gt;4.652364&lt;/td&gt; &lt;td&gt;1.620089&lt;/td&gt; &lt;td&gt;11.936052&lt;/td&gt; &lt;td&gt;2.916132&lt;/td&gt; &lt;td&gt;3.219969&lt;/td&gt; &lt;td&gt;2.374276&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;29.441108&lt;/td&gt; &lt;td&gt;20.348266&lt;/td&gt; &lt;td&gt;9.994556&lt;/td&gt; &lt;td&gt;14.965432&lt;/td&gt; &lt;td&gt;60.537168&lt;/td&gt; &lt;td&gt;13.302875&lt;/td&gt; &lt;td&gt;30.159402&lt;/td&gt; &lt;td&gt;10.277570&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;41.799347&lt;/td&gt; &lt;td&gt;18.197400&lt;/td&gt; &lt;td&gt;16.773638&lt;/td&gt; &lt;td&gt;6.510347&lt;/td&gt; &lt;td&gt;67.461446&lt;/td&gt; &lt;td&gt;20.362328&lt;/td&gt; &lt;td&gt;0.109929&lt;/td&gt; &lt;td&gt;9.908769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;24.306937&lt;/td&gt; &lt;td&gt;20.555376&lt;/td&gt; &lt;td&gt;17.140758&lt;/td&gt; &lt;td&gt;16.715188&lt;/td&gt; &lt;td&gt;61.724168&lt;/td&gt; &lt;td&gt;22.469230&lt;/td&gt; &lt;td&gt;27.967206&lt;/td&gt; &lt;td&gt;13.434167&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;34.820796&lt;/td&gt; &lt;td&gt;11.795664&lt;/td&gt; &lt;td&gt;18.015120&lt;/td&gt; &lt;td&gt;7.176057&lt;/td&gt; &lt;td&gt;63.134711&lt;/td&gt; &lt;td&gt;11.427374&lt;/td&gt; &lt;td&gt;23.959842&lt;/td&gt; &lt;td&gt;16.759246&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;23.139366&lt;/td&gt; &lt;td&gt;12.655317&lt;/td&gt; &lt;td&gt;13.152401&lt;/td&gt; &lt;td&gt;7.258740&lt;/td&gt; &lt;td&gt;64.273225&lt;/td&gt; &lt;td&gt;22.854106&lt;/td&gt; &lt;td&gt;28.803059&lt;/td&gt; &lt;td&gt;12.832364&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;27.955059&lt;/td&gt; &lt;td&gt;24.633526&lt;/td&gt; &lt;td&gt;11.046285&lt;/td&gt; &lt;td&gt;5.995041&lt;/td&gt; &lt;td&gt;74.965966&lt;/td&gt; &lt;td&gt;15.636579&lt;/td&gt; &lt;td&gt;22.803890&lt;/td&gt; &lt;td&gt;13.221303&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;23.139366&lt;/td&gt; &lt;td&gt;11.795664&lt;/td&gt; &lt;td&gt;9.994556&lt;/td&gt; &lt;td&gt;5.995041&lt;/td&gt; &lt;td&gt;60.537168&lt;/td&gt; &lt;td&gt;11.427374&lt;/td&gt; &lt;td&gt;0.109929&lt;/td&gt; &lt;td&gt;9.908769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;41.799347&lt;/td&gt; &lt;td&gt;24.633526&lt;/td&gt; &lt;td&gt;18.015120&lt;/td&gt; &lt;td&gt;16.715188&lt;/td&gt; &lt;td&gt;74.965966&lt;/td&gt; &lt;td&gt;22.854106&lt;/td&gt; &lt;td&gt;30.159402&lt;/td&gt; &lt;td&gt;16.759246&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;30.243769&lt;/td&gt; &lt;td&gt;18.030925&lt;/td&gt; &lt;td&gt;14.353793&lt;/td&gt; &lt;td&gt;9.770134&lt;/td&gt; &lt;td&gt;65.349447&lt;/td&gt; &lt;td&gt;17.675415&lt;/td&gt; &lt;td&gt;22.300555&lt;/td&gt; &lt;td&gt;12.738903&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.298092&lt;/td&gt; &lt;td&gt;1.702071&lt;/td&gt; &lt;td&gt;1.894548&lt;/td&gt; &lt;td&gt;4.118591&lt;/td&gt; &lt;td&gt;3.922889&lt;/td&gt; &lt;td&gt;0.491145&lt;/td&gt; &lt;td&gt;4.519734&lt;/td&gt; &lt;td&gt;2.347913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;16.432222&lt;/td&gt; &lt;td&gt;6.908918&lt;/td&gt; &lt;td&gt;17.749058&lt;/td&gt; &lt;td&gt;18.756674&lt;/td&gt; &lt;td&gt;11.148628&lt;/td&gt; &lt;td&gt;5.464975&lt;/td&gt; &lt;td&gt;18.300673&lt;/td&gt; &lt;td&gt;12.972871&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;20.588544&lt;/td&gt; &lt;td&gt;4.387662&lt;/td&gt; &lt;td&gt;14.527229&lt;/td&gt; &lt;td&gt;23.844364&lt;/td&gt; &lt;td&gt;15.500462&lt;/td&gt; &lt;td&gt;15.543458&lt;/td&gt; &lt;td&gt;13.666574&lt;/td&gt; &lt;td&gt;15.240662&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.008049&lt;/td&gt; &lt;td&gt;6.222633&lt;/td&gt; &lt;td&gt;12.833421&lt;/td&gt; &lt;td&gt;22.811602&lt;/td&gt; &lt;td&gt;16.013232&lt;/td&gt; &lt;td&gt;9.449069&lt;/td&gt; &lt;td&gt;16.486111&lt;/td&gt; &lt;td&gt;12.974515&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;16.964699&lt;/td&gt; &lt;td&gt;8.106044&lt;/td&gt; &lt;td&gt;11.207675&lt;/td&gt; &lt;td&gt;22.483826&lt;/td&gt; &lt;td&gt;17.354675&lt;/td&gt; &lt;td&gt;4.641183&lt;/td&gt; &lt;td&gt;14.583941&lt;/td&gt; &lt;td&gt;13.679087&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;25.243144&lt;/td&gt; &lt;td&gt;7.359437&lt;/td&gt; &lt;td&gt;16.986615&lt;/td&gt; &lt;td&gt;19.855391&lt;/td&gt; &lt;td&gt;17.183725&lt;/td&gt; &lt;td&gt;5.750937&lt;/td&gt; &lt;td&gt;14.759597&lt;/td&gt; &lt;td&gt;13.052316&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;12.986721&lt;/td&gt; &lt;td&gt;10.160993&lt;/td&gt; &lt;td&gt;17.496662&lt;/td&gt; &lt;td&gt;19.267026&lt;/td&gt; &lt;td&gt;17.300224&lt;/td&gt; &lt;td&gt;4.955930&lt;/td&gt; &lt;td&gt;19.267721&lt;/td&gt; &lt;td&gt;15.421241&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;12.986721&lt;/td&gt; &lt;td&gt;4.387662&lt;/td&gt; &lt;td&gt;11.207675&lt;/td&gt; &lt;td&gt;18.756674&lt;/td&gt; &lt;td&gt;11.148628&lt;/td&gt; &lt;td&gt;4.641183&lt;/td&gt; &lt;td&gt;13.666574&lt;/td&gt; &lt;td&gt;12.972871&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;25.243144&lt;/td&gt; &lt;td&gt;10.160993&lt;/td&gt; &lt;td&gt;17.749058&lt;/td&gt; &lt;td&gt;23.844364&lt;/td&gt; &lt;td&gt;17.354675&lt;/td&gt; &lt;td&gt;15.543458&lt;/td&gt; &lt;td&gt;19.267721&lt;/td&gt; &lt;td&gt;15.421241&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;17.703896&lt;/td&gt; &lt;td&gt;7.190948&lt;/td&gt; &lt;td&gt;15.133443&lt;/td&gt; &lt;td&gt;21.169814&lt;/td&gt; &lt;td&gt;15.750158&lt;/td&gt; &lt;td&gt;7.634259&lt;/td&gt; &lt;td&gt;16.177436&lt;/td&gt; &lt;td&gt;13.890115&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabeaafeba8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x1d5023a8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd131ab08&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:30.150737-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 18 of n): Cluster Dynamics</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-26#1819</atom:id>
  <atom:published>2014-09-26T21:02:58Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article is about how scale-out differs from single-server. This shows large effects of parameters whose very existence most would not anticipate, and some low level metrics for assessing these. The moral of the story is that this is the stuff which makes the difference between merely surviving scale-out and winning with it. The developer and DBA would not normally know about this; thus these things fall into the category of adaptive self-configuration expected from the DBMS. But since this series is about what makes performance, I will discuss the dynamics such as they are and how to play these.&lt;/p&gt; &lt;p&gt;We take the prototypical cross partition join in Q13: Make a hash table of all &lt;code&gt;customers&lt;/code&gt;, partitioned by &lt;code&gt;c_custkey&lt;/code&gt;. This is independently done with full parallelism in each partition. Scan the &lt;code&gt;orders&lt;/code&gt;, get the &lt;code&gt;customer&lt;/code&gt; (in a different partition), and flag the &lt;code&gt;customers&lt;/code&gt; that had at least one &lt;code&gt;order&lt;/code&gt;. Then, to get the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt;, return the &lt;code&gt;customers&lt;/code&gt; that were not flagged in the previous pass.&lt;/p&gt; &lt;p&gt;The single-server time in part 12 was 7.8 and 6.0 with a single user. We consider the better of the times. The difference is due to allocating memory on the first go; on the second go the memory is already in reserve.&lt;/p&gt; &lt;p&gt;With default settings, we get 4595 ms (microseconds), with per node resource utilization at:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; Cluster 4 nodes, 4 s. 112405 m/s 742602 KB/s 2749% cpu 0% read 4% clw threads 1r 0w 0i buffers 8577766 287874 d 0 w 0 pfs cl 1: 27867 m/s 185654 KB/s 733% cpu 0% read 4% clw threads 1r 0w 0i buffers 2144242 71757 d 0 w 0 pfs cl 2: 28149 m/s 185372 KB/s 672% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144640 71903 d 0 w 0 pfs cl 3: 28220 m/s 185621 KB/s 675% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144454 71962 d 0 w 0 pfs cl 4: 28150 m/s 185837 KB/s 667% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144430 72252 d 0 w 0 pfs &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The top line is the summary; the lines below are per-process. The &lt;code&gt;m/s&lt;/code&gt; is messages-per-second; &lt;code&gt;KB/s&lt;/code&gt; is interconnect traffic per second; &lt;code&gt;clw %&lt;/code&gt; is idle time spent waiting for a reply from another process. The cluster is set up with 4 processes across 2 machines, each with 2 NUMA nodes. Each process has affinity to the NUMA node, so local memory only. The time is reasonable in light of the overall CPU of 2700%. The maximum would be 4800% with all threads of all cores busy all the time.&lt;/p&gt; &lt;p&gt;The catch here is that we do not have a steady half-platform utilization all the time, but full platform peaks followed by synchronization barriers with very low utilization. So, we set the batch size differently:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; cl_exec (&amp;#39;__dbf_set (&amp;#39;&amp;#39;cl_dfg_batch_bytes&amp;#39;&amp;#39;, 50000000)&amp;#39;); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This means that we set, on each process, the &lt;code&gt;cl_dfg_batch_bytes&lt;/code&gt; to 50M from a default of 10M. The effect is that each scan of &lt;code&gt;orders&lt;/code&gt;, one thread per slice, 48 slices total, will produce 50MB worth of &lt;code&gt;o_custkeys&lt;/code&gt; to be sent to the other partition for getting the &lt;code&gt;customer&lt;/code&gt;. After each 50M, the thread stops and will produce the next batch when all are done and a global continue message is sent by the coordinator.&lt;/p&gt; &lt;p&gt;The time is now 3173 ms with:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; Cluster 4 nodes, 3 s. 158220 m/s 1054944 KB/s 3676% cpu 0% read 1% clw threads 1r 0w 0i buffers 8577766 287874 d 0 w 0 pfs cl 1: 39594 m/s 263962 KB/s 947% cpu 0% read 1% clw threads 1r 0w 0i buffers 2144242 71757 d 0 w 0 pfs cl 2: 39531 m/s 263476 KB/s 894% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144640 71903 d 0 w 0 pfs cl 3: 39523 m/s 263684 KB/s 933% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144454 71962 d 0 w 0 pfs cl 4: 39535 m/s 263586 KB/s 900% cpu 0% read 0% clw threads 0r 0w 0i buffers 2144430 72252 d 0 w 0 pfs &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The platform utilization is better as we see. The throughput is nearly double that of the single-server, which is pretty good for a communication-heavy query.&lt;/p&gt; &lt;p&gt;This was done with a vector size of 10K. In other words, each partition gets 10K &lt;code&gt;o_custkeys&lt;/code&gt; and splits these 48 ways to go to every recipient. 1/4 are in the same process, 1/4 in a different process on the same machine, and 2/4 on a different machine. The recipient gets messages with an average of 208 &lt;code&gt;o_custkey&lt;/code&gt; values, puts them back together in batches of 10K, and passes these to the hash join with &lt;code&gt;customer&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;We try different vector sizes, such as 100K: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; cl_exec (&amp;#39;__dbf_set (&amp;#39;&amp;#39;dc_batch_sz&amp;#39;&amp;#39;, 100000)&amp;#39;); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;There are two metrics of interest here: The write block time, and the scheduling overhead. The write block time is microseconds, which increases whenever a thread must wait before it can write to a connection. The scheduling overhead is cumulative clocks spent by threads while waiting for a critical section that deals with dispatching messages to consumer threads. Long messages make blocking; short messages make frequent scheduling decisions.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; SELECT cl_sys_stat (&amp;#39;local_cll_clk&amp;#39;, clr=&amp;gt;1), cl_sys_stat (&amp;#39;write_block_usec&amp;#39;, clr=&amp;gt;1) ; &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt; &lt;code&gt;cl_sys_stat&lt;/code&gt; gets the counters from all processes and returns the sum. &lt;code&gt;clr=&amp;gt;1&lt;/code&gt; means that the counter is cleared after read.&lt;/p&gt; &lt;p&gt;We do Q13 with vector sizes of 10, 100, and 1000K.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Vector size&lt;/th&gt; &lt;th&gt;msec&lt;/th&gt; &lt;th&gt;mtx&lt;/th&gt; &lt;th&gt;wblock&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;10K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3297&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10,829,910,329&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;100K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3150&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,663,238,367&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;59,132&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1000K&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;3876&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;414,631,129&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,578,003&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;So, 100K seems to strike the best balance between scheduling and blocking on write.&lt;/p&gt; &lt;p&gt;The times are measured after several samples with each setting. The times stabilize after a few runs, as the appropriate size memory blocks are in reserve. Calling &lt;code&gt;mmap&lt;/code&gt; to allocate these on the first run with each size has a very high penalty, e.g., 60s for the first run with 1M vector size. We note that blocking on write is really bad even though 1/3 of the time there is no network and 2/3 of the time there is a fast network (QDR IB) with no other load. Further, the affinities are set so that the thread responsible for incoming messages is always on core. Result variability on consecutive runs is under 5%, which is similar to single-server behavior.&lt;/p&gt; &lt;p&gt;It would seem that a mutex, as bad as it is, is still better than a distributed cause for going off core (blocking on write). The latency for continuing a thread thus blocked is of course higher than the latency for continuing one that is waiting for a mutex.&lt;/p&gt; &lt;p&gt;We note that a cluster with more machines can take a longer vector size because a vector spreads out to more recipients. The key seems to be to set the message size so that blocking on write is not common. This is a possible adaptive execution feature. We have seen no particular benefit from SDP (Sockets Direct Protocol) and its zero copy. This is a TCP replacement that comes with the InfiniBand drivers.&lt;/p&gt; &lt;p&gt;We will next look at replication/partitioning tradeoffs for hash joins. Then we can look at full runs.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aac00620518&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aaca8027e88&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab5182ee48&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabf845ad68&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:09.183299-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 17 of n): 100G and 300G Runs on Dual Xeon E5 2650v2</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-26#1818</atom:id>
  <atom:published>2014-09-26T21:02:54Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is an update presenting sample results on a newer platform for a single-server configuration. This is to verify that performance scales with the addition of cores and clock speed. Further, we note that the jump from 100G to 300G changes very little about the score. 3x larger takes approximately 3x longer, as long as things are in memory.&lt;/p&gt; &lt;p&gt;The platform is one node of the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac002989b8&quot;&gt;CWI&lt;/a&gt; &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aabe8ca0848&quot;&gt;cluster&lt;/a&gt; which was also used for the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1804&quot; id=&quot;link-id0x2aac001ada18&quot;&gt;500Gt RDF experiments reported on this blog&lt;/a&gt;. The specification is dual Xeon E5 2650v2 (8 core, 16 thread, 2.6 GHz) with 256 GB RAM. The disk setup is a RAID-0 of three 2 TB rotating disks.&lt;/p&gt; &lt;p&gt;For the 100G, we go from 240 to 395, which is about 1.64x. The new platform has 16 vs 12 cores and a clock of 2.6 as opposed to 2.3. This makes a multiplier of 1.5. The rest of the acceleration is probably attributable to faster memory clock. Anyway, the point of more speed from larger platform is made.&lt;/p&gt; &lt;p&gt;The top level scores per run are as follows; the numerical quantities summaries are appended.&lt;/p&gt; &lt;h3&gt;100G&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;391,000.1&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;401,029.4&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;395,983.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;388,746.2&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;404,189.3&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;396,392.6&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;300G&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th&gt;Run&lt;/th&gt; &lt;th&gt;Power&lt;/th&gt; &lt;th&gt;Throughput&lt;/th&gt; &lt;th&gt;Composite &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;61,988.7&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;384,883.7&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;154,461.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;423,431.8&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;387,248.6&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;404,936.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Run 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;417,672.0&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;389,719.5&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;403,453.7&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The interested may reproduce the results using the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aabebc12d88&quot;&gt;feature/analytics branch&lt;/a&gt; of the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aabe9d1ec68&quot;&gt;v7fasttrack git repository&lt;/a&gt; on &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aabe83bbb28&quot;&gt;GitHub&lt;/a&gt; as described in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aabe9a230c8&quot;&gt;Part 13&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;For the 300G runs, we note a much longer load time; see below, as this is seriously IO bound.&lt;/p&gt; &lt;p&gt;The first power test at 300G is a non-starter, even though this comes right after bulk load. Still, the data is not in working set and getting it from disk is simply an automatic disqualification, unless maybe one had 300 separate disks. This happens in TPC benchmarks, but not very often in the field. Looking at the first power run, the first queries take the longest, but by the time the power run starts, the working set is there. By an artifact of the metric (use of geometric mean for the power test), long queries are penalized less there than in the throughput run.&lt;/p&gt; &lt;p&gt;So, we run 3 executions instead of the prescribed 2, to have 2 executions from warm state.&lt;/p&gt; &lt;p&gt;To do 300G well in 256 GB of RAM, one needs either to use several SSDs, or to increase compression and keep all in memory, so no secondary storage at all. In order to keep all in memory, one could have stream-compression on string columns. Stream-compressing strings (e.g., &lt;code&gt;o_comment&lt;/code&gt;, &lt;code&gt;l_comment&lt;/code&gt;) does not pay if one is already in memory, but if stream-compressing strings eliminates going to secondary storage, then the win is sure.&lt;/p&gt; &lt;p&gt;As before, all caveats apply; the results are unaudited and for information only. Therefore we do not use the official metric name.&lt;/p&gt; &lt;h2&gt;100G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 15, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:04:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:15:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;0:11:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;391,000.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;401,029.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;395,983.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;98.846000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:01&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:28&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:06&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:07&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:07&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:04&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:08&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:01:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:01&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:03&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/15/2014 13:13:28&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:14:10&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:16&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:29&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:42&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:42&lt;/td&gt; &lt;td&gt;09/15/2014 13:13:53&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:13:53&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:02&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:14:02&lt;/td&gt; &lt;td&gt;09/15/2014 13:14:10&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:08&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.442477&lt;/td&gt; &lt;td&gt;0.304513&lt;/td&gt; &lt;td&gt;0.720263&lt;/td&gt; &lt;td&gt;0.351285&lt;/td&gt; &lt;td&gt;0.979414&lt;/td&gt; &lt;td&gt;0.479455&lt;/td&gt; &lt;td&gt;0.865992&lt;/td&gt; &lt;td&gt;0.875236&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.938133&lt;/td&gt; &lt;td&gt;0.920533&lt;/td&gt; &lt;td&gt;3.738724&lt;/td&gt; &lt;td&gt;2.769707&lt;/td&gt; &lt;td&gt;3.209728&lt;/td&gt; &lt;td&gt;1.339146&lt;/td&gt; &lt;td&gt;2.759384&lt;/td&gt; &lt;td&gt;3.626868&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;4.104738&lt;/td&gt; &lt;td&gt;0.952245&lt;/td&gt; &lt;td&gt;4.719658&lt;/td&gt; &lt;td&gt;0.865586&lt;/td&gt; &lt;td&gt;2.139267&lt;/td&gt; &lt;td&gt;0.850909&lt;/td&gt; &lt;td&gt;2.044402&lt;/td&gt; &lt;td&gt;2.600373&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;3.692119&lt;/td&gt; &lt;td&gt;1.024876&lt;/td&gt; &lt;td&gt;3.430172&lt;/td&gt; &lt;td&gt;1.579846&lt;/td&gt; &lt;td&gt;4.097845&lt;/td&gt; &lt;td&gt;1.859468&lt;/td&gt; &lt;td&gt;2.312921&lt;/td&gt; &lt;td&gt;6.238070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;5.419537&lt;/td&gt; &lt;td&gt;0.531571&lt;/td&gt; &lt;td&gt;2.116176&lt;/td&gt; &lt;td&gt;1.256836&lt;/td&gt; &lt;td&gt;4.787617&lt;/td&gt; &lt;td&gt;2.117995&lt;/td&gt; &lt;td&gt;3.517466&lt;/td&gt; &lt;td&gt;3.982180&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.167029&lt;/td&gt; &lt;td&gt;0.746720&lt;/td&gt; &lt;td&gt;3.157557&lt;/td&gt; &lt;td&gt;1.255182&lt;/td&gt; &lt;td&gt;3.004802&lt;/td&gt; &lt;td&gt;2.131963&lt;/td&gt; &lt;td&gt;3.648316&lt;/td&gt; &lt;td&gt;2.835751&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.692119&lt;/td&gt; &lt;td&gt;0.531571&lt;/td&gt; &lt;td&gt;2.116176&lt;/td&gt; &lt;td&gt;0.865586&lt;/td&gt; &lt;td&gt;2.139267&lt;/td&gt; &lt;td&gt;0.850909&lt;/td&gt; &lt;td&gt;2.044402&lt;/td&gt; &lt;td&gt;2.600373&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;5.419537&lt;/td&gt; &lt;td&gt;1.024876&lt;/td&gt; &lt;td&gt;4.719658&lt;/td&gt; &lt;td&gt;2.769707&lt;/td&gt; &lt;td&gt;4.787617&lt;/td&gt; &lt;td&gt;2.131963&lt;/td&gt; &lt;td&gt;3.648316&lt;/td&gt; &lt;td&gt;6.238070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;4.464311&lt;/td&gt; &lt;td&gt;0.835189&lt;/td&gt; &lt;td&gt;3.432457&lt;/td&gt; &lt;td&gt;1.545431&lt;/td&gt; &lt;td&gt;3.447852&lt;/td&gt; &lt;td&gt;1.659896&lt;/td&gt; &lt;td&gt;2.856498&lt;/td&gt; &lt;td&gt;3.856648&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.606044&lt;/td&gt; &lt;td&gt;1.117063&lt;/td&gt; &lt;td&gt;1.847930&lt;/td&gt; &lt;td&gt;0.618534&lt;/td&gt; &lt;td&gt;4.327600&lt;/td&gt; &lt;td&gt;1.110908&lt;/td&gt; &lt;td&gt;0.995289&lt;/td&gt; &lt;td&gt;0.975910&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;7.463593&lt;/td&gt; &lt;td&gt;4.686463&lt;/td&gt; &lt;td&gt;4.549733&lt;/td&gt; &lt;td&gt;4.168129&lt;/td&gt; &lt;td&gt;15.759178&lt;/td&gt; &lt;td&gt;5.247666&lt;/td&gt; &lt;td&gt;4.495030&lt;/td&gt; &lt;td&gt;4.075198&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;9.398552&lt;/td&gt; &lt;td&gt;5.170904&lt;/td&gt; &lt;td&gt;3.934405&lt;/td&gt; &lt;td&gt;1.880683&lt;/td&gt; &lt;td&gt;19.968787&lt;/td&gt; &lt;td&gt;3.767992&lt;/td&gt; &lt;td&gt;6.965337&lt;/td&gt; &lt;td&gt;3.849845&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;7.581069&lt;/td&gt; &lt;td&gt;4.109905&lt;/td&gt; &lt;td&gt;4.301159&lt;/td&gt; &lt;td&gt;2.123634&lt;/td&gt; &lt;td&gt;17.683200&lt;/td&gt; &lt;td&gt;5.383603&lt;/td&gt; &lt;td&gt;4.376887&lt;/td&gt; &lt;td&gt;2.854777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;9.927887&lt;/td&gt; &lt;td&gt;6.913209&lt;/td&gt; &lt;td&gt;3.351489&lt;/td&gt; &lt;td&gt;2.802724&lt;/td&gt; &lt;td&gt;16.985827&lt;/td&gt; &lt;td&gt;3.925148&lt;/td&gt; &lt;td&gt;4.691474&lt;/td&gt; &lt;td&gt;4.080586&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;7.035080&lt;/td&gt; &lt;td&gt;3.921425&lt;/td&gt; &lt;td&gt;6.844778&lt;/td&gt; &lt;td&gt;2.899238&lt;/td&gt; &lt;td&gt;14.839509&lt;/td&gt; &lt;td&gt;4.986742&lt;/td&gt; &lt;td&gt;6.629664&lt;/td&gt; &lt;td&gt;4.089547&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.035080&lt;/td&gt; &lt;td&gt;3.921425&lt;/td&gt; &lt;td&gt;3.351489&lt;/td&gt; &lt;td&gt;1.880683&lt;/td&gt; &lt;td&gt;14.839509&lt;/td&gt; &lt;td&gt;3.767992&lt;/td&gt; &lt;td&gt;4.376887&lt;/td&gt; &lt;td&gt;2.854777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;9.927887&lt;/td&gt; &lt;td&gt;6.913209&lt;/td&gt; &lt;td&gt;6.844778&lt;/td&gt; &lt;td&gt;4.168129&lt;/td&gt; &lt;td&gt;19.968787&lt;/td&gt; &lt;td&gt;5.383603&lt;/td&gt; &lt;td&gt;6.965337&lt;/td&gt; &lt;td&gt;4.089547&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.281236&lt;/td&gt; &lt;td&gt;4.960381&lt;/td&gt; &lt;td&gt;4.596313&lt;/td&gt; &lt;td&gt;2.774882&lt;/td&gt; &lt;td&gt;17.047300&lt;/td&gt; &lt;td&gt;4.662230&lt;/td&gt; &lt;td&gt;5.431678&lt;/td&gt; &lt;td&gt;3.789991&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.215956&lt;/td&gt; &lt;td&gt;0.745257&lt;/td&gt; &lt;td&gt;0.699801&lt;/td&gt; &lt;td&gt;1.281834&lt;/td&gt; &lt;td&gt;1.291110&lt;/td&gt; &lt;td&gt;0.518425&lt;/td&gt; &lt;td&gt;1.827192&lt;/td&gt; &lt;td&gt;1.014431&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.779854&lt;/td&gt; &lt;td&gt;2.383264&lt;/td&gt; &lt;td&gt;2.396793&lt;/td&gt; &lt;td&gt;6.130511&lt;/td&gt; &lt;td&gt;5.002700&lt;/td&gt; &lt;td&gt;1.968425&lt;/td&gt; &lt;td&gt;4.172437&lt;/td&gt; &lt;td&gt;2.427047&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;7.828176&lt;/td&gt; &lt;td&gt;1.833416&lt;/td&gt; &lt;td&gt;3.175649&lt;/td&gt; &lt;td&gt;4.785709&lt;/td&gt; &lt;td&gt;5.385834&lt;/td&gt; &lt;td&gt;1.403290&lt;/td&gt; &lt;td&gt;6.383005&lt;/td&gt; &lt;td&gt;6.366525&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;5.880139&lt;/td&gt; &lt;td&gt;1.797383&lt;/td&gt; &lt;td&gt;3.258024&lt;/td&gt; &lt;td&gt;5.601364&lt;/td&gt; &lt;td&gt;6.373216&lt;/td&gt; &lt;td&gt;1.977848&lt;/td&gt; &lt;td&gt;5.235542&lt;/td&gt; &lt;td&gt;6.385010&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;3.989621&lt;/td&gt; &lt;td&gt;1.252891&lt;/td&gt; &lt;td&gt;2.478303&lt;/td&gt; &lt;td&gt;4.678629&lt;/td&gt; &lt;td&gt;3.212176&lt;/td&gt; &lt;td&gt;2.740586&lt;/td&gt; &lt;td&gt;5.037995&lt;/td&gt; &lt;td&gt;3.911379&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;5.030440&lt;/td&gt; &lt;td&gt;2.010988&lt;/td&gt; &lt;td&gt;4.188428&lt;/td&gt; &lt;td&gt;6.221990&lt;/td&gt; &lt;td&gt;5.418788&lt;/td&gt; &lt;td&gt;2.187718&lt;/td&gt; &lt;td&gt;3.589915&lt;/td&gt; &lt;td&gt;3.517380&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.989621&lt;/td&gt; &lt;td&gt;1.252891&lt;/td&gt; &lt;td&gt;2.396793&lt;/td&gt; &lt;td&gt;4.678629&lt;/td&gt; &lt;td&gt;3.212176&lt;/td&gt; &lt;td&gt;1.403290&lt;/td&gt; &lt;td&gt;3.589915&lt;/td&gt; &lt;td&gt;2.427047&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;7.828176&lt;/td&gt; &lt;td&gt;2.383264&lt;/td&gt; &lt;td&gt;4.188428&lt;/td&gt; &lt;td&gt;6.221990&lt;/td&gt; &lt;td&gt;6.373216&lt;/td&gt; &lt;td&gt;2.740586&lt;/td&gt; &lt;td&gt;6.383005&lt;/td&gt; &lt;td&gt;6.385010&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.701646&lt;/td&gt; &lt;td&gt;1.855588&lt;/td&gt; &lt;td&gt;3.099439&lt;/td&gt; &lt;td&gt;5.483641&lt;/td&gt; &lt;td&gt;5.078543&lt;/td&gt; &lt;td&gt;2.055573&lt;/td&gt; &lt;td&gt;4.883779&lt;/td&gt; &lt;td&gt;4.521468&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;100G Run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 15, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;87,312M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:04:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/15/2014 07:15:58&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;0:11:50&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;388,746.2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;404,189.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@100GB)&lt;/th&gt; &lt;td&gt;396,392.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;98.074000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:11&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:38&lt;/td&gt; &lt;td&gt;0:00:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:13&lt;/td&gt; &lt;td&gt;0:01:34&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:16&lt;/td&gt; &lt;td&gt;0:01:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:15&lt;/td&gt; &lt;td&gt;0:01:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:17&lt;/td&gt; &lt;td&gt;0:01:38&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:17:15&lt;/td&gt; &lt;td&gt;0:01:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:11&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:12&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/15/2014 13:15:38&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/15/2014 13:16:13&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:20&lt;/td&gt; &lt;td&gt;0:00:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:39&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:47&lt;/td&gt; &lt;td&gt;0:00:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:47&lt;/td&gt; &lt;td&gt;09/15/2014 13:15:56&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/15/2014 13:15:56&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:03&lt;/td&gt; &lt;td&gt;0:00:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/15/2014 13:16:03&lt;/td&gt; &lt;td&gt;09/15/2014 13:16:12&lt;/td&gt; &lt;td&gt;0:00:09&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.467681&lt;/td&gt; &lt;td&gt;0.277665&lt;/td&gt; &lt;td&gt;0.766102&lt;/td&gt; &lt;td&gt;0.365185&lt;/td&gt; &lt;td&gt;0.941206&lt;/td&gt; &lt;td&gt;0.549381&lt;/td&gt; &lt;td&gt;0.938998&lt;/td&gt; &lt;td&gt;0.803514&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;3.883169&lt;/td&gt; &lt;td&gt;1.488521&lt;/td&gt; &lt;td&gt;3.366920&lt;/td&gt; &lt;td&gt;1.627478&lt;/td&gt; &lt;td&gt;3.632321&lt;/td&gt; &lt;td&gt;2.065565&lt;/td&gt; &lt;td&gt;2.911138&lt;/td&gt; &lt;td&gt;2.444544&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;3.294589&lt;/td&gt; &lt;td&gt;1.138066&lt;/td&gt; &lt;td&gt;3.260775&lt;/td&gt; &lt;td&gt;1.899615&lt;/td&gt; &lt;td&gt;5.367725&lt;/td&gt; &lt;td&gt;1.820374&lt;/td&gt; &lt;td&gt;3.655119&lt;/td&gt; &lt;td&gt;2.186642&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;3.797641&lt;/td&gt; &lt;td&gt;0.995877&lt;/td&gt; &lt;td&gt;3.239690&lt;/td&gt; &lt;td&gt;2.483035&lt;/td&gt; &lt;td&gt;2.737690&lt;/td&gt; &lt;td&gt;1.505998&lt;/td&gt; &lt;td&gt;4.058083&lt;/td&gt; &lt;td&gt;4.268644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;4.099187&lt;/td&gt; &lt;td&gt;0.402685&lt;/td&gt; &lt;td&gt;4.704959&lt;/td&gt; &lt;td&gt;1.469825&lt;/td&gt; &lt;td&gt;5.367910&lt;/td&gt; &lt;td&gt;2.783018&lt;/td&gt; &lt;td&gt;2.706164&lt;/td&gt; &lt;td&gt;2.551061&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;3.651273&lt;/td&gt; &lt;td&gt;1.598314&lt;/td&gt; &lt;td&gt;2.051899&lt;/td&gt; &lt;td&gt;1.283754&lt;/td&gt; &lt;td&gt;4.711897&lt;/td&gt; &lt;td&gt;1.519763&lt;/td&gt; &lt;td&gt;2.851300&lt;/td&gt; &lt;td&gt;2.484093&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;3.294589&lt;/td&gt; &lt;td&gt;0.402685&lt;/td&gt; &lt;td&gt;2.051899&lt;/td&gt; &lt;td&gt;1.283754&lt;/td&gt; &lt;td&gt;2.737690&lt;/td&gt; &lt;td&gt;1.505998&lt;/td&gt; &lt;td&gt;2.706164&lt;/td&gt; &lt;td&gt;2.186642&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;4.099187&lt;/td&gt; &lt;td&gt;1.598314&lt;/td&gt; &lt;td&gt;4.704959&lt;/td&gt; &lt;td&gt;2.483035&lt;/td&gt; &lt;td&gt;5.367910&lt;/td&gt; &lt;td&gt;2.783018&lt;/td&gt; &lt;td&gt;4.058083&lt;/td&gt; &lt;td&gt;4.268644&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;3.745172&lt;/td&gt; &lt;td&gt;1.124693&lt;/td&gt; &lt;td&gt;3.324849&lt;/td&gt; &lt;td&gt;1.752741&lt;/td&gt; &lt;td&gt;4.363509&lt;/td&gt; &lt;td&gt;1.938944&lt;/td&gt; &lt;td&gt;3.236361&lt;/td&gt; &lt;td&gt;2.786997&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2.734812&lt;/td&gt; &lt;td&gt;1.115539&lt;/td&gt; &lt;td&gt;1.679910&lt;/td&gt; &lt;td&gt;0.633239&lt;/td&gt; &lt;td&gt;4.391739&lt;/td&gt; &lt;td&gt;1.130082&lt;/td&gt; &lt;td&gt;1.137284&lt;/td&gt; &lt;td&gt;0.919646&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.271071&lt;/td&gt; &lt;td&gt;5.664855&lt;/td&gt; &lt;td&gt;3.377869&lt;/td&gt; &lt;td&gt;2.148228&lt;/td&gt; &lt;td&gt;16.046021&lt;/td&gt; &lt;td&gt;2.935643&lt;/td&gt; &lt;td&gt;4.897009&lt;/td&gt; &lt;td&gt;2.891040&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;10.272523&lt;/td&gt; &lt;td&gt;4.578427&lt;/td&gt; &lt;td&gt;4.086788&lt;/td&gt; &lt;td&gt;2.312762&lt;/td&gt; &lt;td&gt;16.295728&lt;/td&gt; &lt;td&gt;2.714776&lt;/td&gt; &lt;td&gt;6.393897&lt;/td&gt; &lt;td&gt;2.414951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;7.095213&lt;/td&gt; &lt;td&gt;4.544636&lt;/td&gt; &lt;td&gt;4.073433&lt;/td&gt; &lt;td&gt;2.710320&lt;/td&gt; &lt;td&gt;18.789088&lt;/td&gt; &lt;td&gt;3.903873&lt;/td&gt; &lt;td&gt;5.471600&lt;/td&gt; &lt;td&gt;2.994184&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;7.567924&lt;/td&gt; &lt;td&gt;3.691088&lt;/td&gt; &lt;td&gt;3.951049&lt;/td&gt; &lt;td&gt;2.207944&lt;/td&gt; &lt;td&gt;18.189014&lt;/td&gt; &lt;td&gt;4.985841&lt;/td&gt; &lt;td&gt;6.568935&lt;/td&gt; &lt;td&gt;3.965322&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;8.173577&lt;/td&gt; &lt;td&gt;4.959777&lt;/td&gt; &lt;td&gt;4.736593&lt;/td&gt; &lt;td&gt;3.507469&lt;/td&gt; &lt;td&gt;17.106990&lt;/td&gt; &lt;td&gt;5.405699&lt;/td&gt; &lt;td&gt;7.357104&lt;/td&gt; &lt;td&gt;3.125788&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;7.095213&lt;/td&gt; &lt;td&gt;3.691088&lt;/td&gt; &lt;td&gt;3.377869&lt;/td&gt; &lt;td&gt;2.148228&lt;/td&gt; &lt;td&gt;16.046021&lt;/td&gt; &lt;td&gt;2.714776&lt;/td&gt; &lt;td&gt;4.897009&lt;/td&gt; &lt;td&gt;2.414951&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;10.272523&lt;/td&gt; &lt;td&gt;5.664855&lt;/td&gt; &lt;td&gt;4.736593&lt;/td&gt; &lt;td&gt;3.507469&lt;/td&gt; &lt;td&gt;18.789088&lt;/td&gt; &lt;td&gt;5.405699&lt;/td&gt; &lt;td&gt;7.357104&lt;/td&gt; &lt;td&gt;3.965322&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;8.476062&lt;/td&gt; &lt;td&gt;4.687757&lt;/td&gt; &lt;td&gt;4.045146&lt;/td&gt; &lt;td&gt;2.577345&lt;/td&gt; &lt;td&gt;17.285368&lt;/td&gt; &lt;td&gt;3.989166&lt;/td&gt; &lt;td&gt;6.137709&lt;/td&gt; &lt;td&gt;3.078257&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;1.206347&lt;/td&gt; &lt;td&gt;0.792013&lt;/td&gt; &lt;td&gt;0.699476&lt;/td&gt; &lt;td&gt;1.349182&lt;/td&gt; &lt;td&gt;1.505387&lt;/td&gt; &lt;td&gt;0.543947&lt;/td&gt; &lt;td&gt;1.549135&lt;/td&gt; &lt;td&gt;0.824344&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;5.135036&lt;/td&gt; &lt;td&gt;1.873195&lt;/td&gt; &lt;td&gt;4.978155&lt;/td&gt; &lt;td&gt;5.988226&lt;/td&gt; &lt;td&gt;4.705365&lt;/td&gt; &lt;td&gt;1.211049&lt;/td&gt; &lt;td&gt;4.175947&lt;/td&gt; &lt;td&gt;3.579242&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;7.656125&lt;/td&gt; &lt;td&gt;2.229819&lt;/td&gt; &lt;td&gt;2.805272&lt;/td&gt; &lt;td&gt;6.629781&lt;/td&gt; &lt;td&gt;4.138014&lt;/td&gt; &lt;td&gt;1.423334&lt;/td&gt; &lt;td&gt;5.165700&lt;/td&gt; &lt;td&gt;3.197300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;6.385983&lt;/td&gt; &lt;td&gt;2.086301&lt;/td&gt; &lt;td&gt;3.450305&lt;/td&gt; &lt;td&gt;3.292353&lt;/td&gt; &lt;td&gt;5.503905&lt;/td&gt; &lt;td&gt;2.302992&lt;/td&gt; &lt;td&gt;4.860041&lt;/td&gt; &lt;td&gt;3.865383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;6.514967&lt;/td&gt; &lt;td&gt;2.876895&lt;/td&gt; &lt;td&gt;3.481100&lt;/td&gt; &lt;td&gt;1.629007&lt;/td&gt; &lt;td&gt;5.715903&lt;/td&gt; &lt;td&gt;2.121692&lt;/td&gt; &lt;td&gt;3.681208&lt;/td&gt; &lt;td&gt;3.347289&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;4.100205&lt;/td&gt; &lt;td&gt;2.400816&lt;/td&gt; &lt;td&gt;2.142291&lt;/td&gt; &lt;td&gt;4.710677&lt;/td&gt; &lt;td&gt;5.765320&lt;/td&gt; &lt;td&gt;1.616445&lt;/td&gt; &lt;td&gt;6.095817&lt;/td&gt; &lt;td&gt;3.007436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;4.100205&lt;/td&gt; &lt;td&gt;1.873195&lt;/td&gt; &lt;td&gt;2.142291&lt;/td&gt; &lt;td&gt;1.629007&lt;/td&gt; &lt;td&gt;4.138014&lt;/td&gt; &lt;td&gt;1.211049&lt;/td&gt; &lt;td&gt;3.681208&lt;/td&gt; &lt;td&gt;3.007436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;7.656125&lt;/td&gt; &lt;td&gt;2.876895&lt;/td&gt; &lt;td&gt;4.978155&lt;/td&gt; &lt;td&gt;6.629781&lt;/td&gt; &lt;td&gt;5.765320&lt;/td&gt; &lt;td&gt;2.302992&lt;/td&gt; &lt;td&gt;6.095817&lt;/td&gt; &lt;td&gt;3.865383&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;5.958463&lt;/td&gt; &lt;td&gt;2.293405&lt;/td&gt; &lt;td&gt;3.371425&lt;/td&gt; &lt;td&gt;4.450009&lt;/td&gt; &lt;td&gt;5.165701&lt;/td&gt; &lt;td&gt;1.735102&lt;/td&gt; &lt;td&gt;4.795743&lt;/td&gt; &lt;td&gt;3.399330&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G Run 1&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;61,988.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;384,883.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@300GB)&lt;/th&gt; &lt;td&gt;154,461.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;370.498000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:00:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:22:25&lt;/td&gt; &lt;td&gt;0:21:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:23&lt;/td&gt; &lt;td&gt;0:05:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:23&lt;/td&gt; &lt;td&gt;0:05:56&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:26&lt;/td&gt; &lt;td&gt;0:05:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:13&lt;/td&gt; &lt;td&gt;0:05:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:38&lt;/td&gt; &lt;td&gt;0:06:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:38&lt;/td&gt; &lt;td&gt;0:06:11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:00:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:03:56&lt;/td&gt; &lt;td&gt;0:03:27&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:22:25&lt;/td&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:25:22&lt;/td&gt; &lt;td&gt;09/25/2014 19:25:58&lt;/td&gt; &lt;td&gt;0:00:36&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:22:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:23:11&lt;/td&gt; &lt;td&gt;0:00:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:23:10&lt;/td&gt; &lt;td&gt;09/25/2014 19:23:40&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:23:40&lt;/td&gt; &lt;td&gt;09/25/2014 19:24:21&lt;/td&gt; &lt;td&gt;0:00:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:24:21&lt;/td&gt; &lt;td&gt;09/25/2014 19:24:58&lt;/td&gt; &lt;td&gt;0:00:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:24:59&lt;/td&gt; &lt;td&gt;09/25/2014 19:25:22&lt;/td&gt; &lt;td&gt;0:00:23&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;183.735463&lt;/td&gt; &lt;td&gt;95.826361&lt;/td&gt; &lt;td&gt;79.826802&lt;/td&gt; &lt;td&gt;87.603164&lt;/td&gt; &lt;td&gt;47.099641&lt;/td&gt; &lt;td&gt;1.301704&lt;/td&gt; &lt;td&gt;2.606488&lt;/td&gt; &lt;td&gt;52.667426&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;9.400003&lt;/td&gt; &lt;td&gt;1.983777&lt;/td&gt; &lt;td&gt;15.839250&lt;/td&gt; &lt;td&gt;3.001843&lt;/td&gt; &lt;td&gt;15.593335&lt;/td&gt; &lt;td&gt;6.067716&lt;/td&gt; &lt;td&gt;8.870516&lt;/td&gt; &lt;td&gt;11.679706&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;12.634711&lt;/td&gt; &lt;td&gt;3.472203&lt;/td&gt; &lt;td&gt;13.683075&lt;/td&gt; &lt;td&gt;8.057952&lt;/td&gt; &lt;td&gt;16.500741&lt;/td&gt; &lt;td&gt;5.403771&lt;/td&gt; &lt;td&gt;11.181661&lt;/td&gt; &lt;td&gt;12.393932&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;10.807287&lt;/td&gt; &lt;td&gt;3.793587&lt;/td&gt; &lt;td&gt;15.844244&lt;/td&gt; &lt;td&gt;3.214977&lt;/td&gt; &lt;td&gt;15.960600&lt;/td&gt; &lt;td&gt;7.099744&lt;/td&gt; &lt;td&gt;10.424530&lt;/td&gt; &lt;td&gt;21.001623&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;11.900829&lt;/td&gt; &lt;td&gt;3.741707&lt;/td&gt; &lt;td&gt;14.219904&lt;/td&gt; &lt;td&gt;5.616907&lt;/td&gt; &lt;td&gt;16.487144&lt;/td&gt; &lt;td&gt;14.229782&lt;/td&gt; &lt;td&gt;11.100193&lt;/td&gt; &lt;td&gt;8.769539&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.933423&lt;/td&gt; &lt;td&gt;2.916529&lt;/td&gt; &lt;td&gt;19.453452&lt;/td&gt; &lt;td&gt;5.258843&lt;/td&gt; &lt;td&gt;16.706269&lt;/td&gt; &lt;td&gt;7.948711&lt;/td&gt; &lt;td&gt;8.982104&lt;/td&gt; &lt;td&gt;17.566729&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;17.084445&lt;/td&gt; &lt;td&gt;0.738683&lt;/td&gt; &lt;td&gt;11.503079&lt;/td&gt; &lt;td&gt;8.324812&lt;/td&gt; &lt;td&gt;23.483917&lt;/td&gt; &lt;td&gt;20.101834&lt;/td&gt; &lt;td&gt;9.207737&lt;/td&gt; &lt;td&gt;10.311292&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;9.400003&lt;/td&gt; &lt;td&gt;0.738683&lt;/td&gt; &lt;td&gt;11.503079&lt;/td&gt; &lt;td&gt;3.001843&lt;/td&gt; &lt;td&gt;15.593335&lt;/td&gt; &lt;td&gt;5.403771&lt;/td&gt; &lt;td&gt;8.870516&lt;/td&gt; &lt;td&gt;8.769539&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;17.084445&lt;/td&gt; &lt;td&gt;3.793587&lt;/td&gt; &lt;td&gt;19.453452&lt;/td&gt; &lt;td&gt;8.324812&lt;/td&gt; &lt;td&gt;23.483917&lt;/td&gt; &lt;td&gt;20.101834&lt;/td&gt; &lt;td&gt;11.181661&lt;/td&gt; &lt;td&gt;21.001623&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;12.626783&lt;/td&gt; &lt;td&gt;2.774414&lt;/td&gt; &lt;td&gt;15.090501&lt;/td&gt; &lt;td&gt;5.579222&lt;/td&gt; &lt;td&gt;17.455334&lt;/td&gt; &lt;td&gt;10.141926&lt;/td&gt; &lt;td&gt;9.961123&lt;/td&gt; &lt;td&gt;13.620470&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;41.997798&lt;/td&gt; &lt;td&gt;2.727870&lt;/td&gt; &lt;td&gt;21.651730&lt;/td&gt; &lt;td&gt;25.704209&lt;/td&gt; &lt;td&gt;293.103984&lt;/td&gt; &lt;td&gt;3.171437&lt;/td&gt; &lt;td&gt;2.886688&lt;/td&gt; &lt;td&gt;5.298823&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;29.662265&lt;/td&gt; &lt;td&gt;22.788618&lt;/td&gt; &lt;td&gt;12.979253&lt;/td&gt; &lt;td&gt;7.121358&lt;/td&gt; &lt;td&gt;62.774323&lt;/td&gt; &lt;td&gt;22.132581&lt;/td&gt; &lt;td&gt;22.616793&lt;/td&gt; &lt;td&gt;21.625334&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;28.041750&lt;/td&gt; &lt;td&gt;22.481172&lt;/td&gt; &lt;td&gt;19.262140&lt;/td&gt; &lt;td&gt;5.790272&lt;/td&gt; &lt;td&gt;58.105179&lt;/td&gt; &lt;td&gt;16.809177&lt;/td&gt; &lt;td&gt;32.813330&lt;/td&gt; &lt;td&gt;12.692499&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;32.534297&lt;/td&gt; &lt;td&gt;15.460256&lt;/td&gt; &lt;td&gt;12.038047&lt;/td&gt; &lt;td&gt;7.012926&lt;/td&gt; &lt;td&gt;59.413740&lt;/td&gt; &lt;td&gt;18.540284&lt;/td&gt; &lt;td&gt;25.968635&lt;/td&gt; &lt;td&gt;16.716208&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;28.759993&lt;/td&gt; &lt;td&gt;15.123651&lt;/td&gt; &lt;td&gt;21.734471&lt;/td&gt; &lt;td&gt;6.920480&lt;/td&gt; &lt;td&gt;63.119744&lt;/td&gt; &lt;td&gt;12.848884&lt;/td&gt; &lt;td&gt;21.372432&lt;/td&gt; &lt;td&gt;11.662102&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;18.315308&lt;/td&gt; &lt;td&gt;21.781800&lt;/td&gt; &lt;td&gt;26.141212&lt;/td&gt; &lt;td&gt;8.230858&lt;/td&gt; &lt;td&gt;60.985590&lt;/td&gt; &lt;td&gt;22.369824&lt;/td&gt; &lt;td&gt;27.098660&lt;/td&gt; &lt;td&gt;25.283066&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;31.455961&lt;/td&gt; &lt;td&gt;27.078707&lt;/td&gt; &lt;td&gt;12.954580&lt;/td&gt; &lt;td&gt;11.081669&lt;/td&gt; &lt;td&gt;72.483462&lt;/td&gt; &lt;td&gt;12.376376&lt;/td&gt; &lt;td&gt;22.129120&lt;/td&gt; &lt;td&gt;11.439147&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;18.315308&lt;/td&gt; &lt;td&gt;15.123651&lt;/td&gt; &lt;td&gt;12.038047&lt;/td&gt; &lt;td&gt;5.790272&lt;/td&gt; &lt;td&gt;58.105179&lt;/td&gt; &lt;td&gt;12.376376&lt;/td&gt; &lt;td&gt;21.372432&lt;/td&gt; &lt;td&gt;11.439147&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;32.534297&lt;/td&gt; &lt;td&gt;27.078707&lt;/td&gt; &lt;td&gt;26.141212&lt;/td&gt; &lt;td&gt;11.081669&lt;/td&gt; &lt;td&gt;72.483462&lt;/td&gt; &lt;td&gt;22.369824&lt;/td&gt; &lt;td&gt;32.813330&lt;/td&gt; &lt;td&gt;25.283066&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;28.128262&lt;/td&gt; &lt;td&gt;20.785701&lt;/td&gt; &lt;td&gt;17.518284&lt;/td&gt; &lt;td&gt;7.692927&lt;/td&gt; &lt;td&gt;62.813673&lt;/td&gt; &lt;td&gt;17.512854&lt;/td&gt; &lt;td&gt;25.333162&lt;/td&gt; &lt;td&gt;16.569726&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;7.793403&lt;/td&gt; &lt;td&gt;81.545934&lt;/td&gt; &lt;td&gt;41.648484&lt;/td&gt; &lt;td&gt;4.638731&lt;/td&gt; &lt;td&gt;25.003179&lt;/td&gt; &lt;td&gt;0.536267&lt;/td&gt; &lt;td&gt;206.980380&lt;/td&gt; &lt;td&gt;2.501589&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;27.058060&lt;/td&gt; &lt;td&gt;3.894254&lt;/td&gt; &lt;td&gt;8.664394&lt;/td&gt; &lt;td&gt;25.315007&lt;/td&gt; &lt;td&gt;11.921265&lt;/td&gt; &lt;td&gt;3.561859&lt;/td&gt; &lt;td&gt;22.936601&lt;/td&gt; &lt;td&gt;13.235777&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;25.718500&lt;/td&gt; &lt;td&gt;6.140657&lt;/td&gt; &lt;td&gt;8.856586&lt;/td&gt; &lt;td&gt;14.761290&lt;/td&gt; &lt;td&gt;11.870351&lt;/td&gt; &lt;td&gt;7.728217&lt;/td&gt; &lt;td&gt;13.882613&lt;/td&gt; &lt;td&gt;29.328859&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;15.896774&lt;/td&gt; &lt;td&gt;8.631035&lt;/td&gt; &lt;td&gt;15.742406&lt;/td&gt; &lt;td&gt;20.621604&lt;/td&gt; &lt;td&gt;13.370582&lt;/td&gt; &lt;td&gt;5.536313&lt;/td&gt; &lt;td&gt;14.677463&lt;/td&gt; &lt;td&gt;14.772753&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;22.458327&lt;/td&gt; &lt;td&gt;5.319241&lt;/td&gt; &lt;td&gt;11.973431&lt;/td&gt; &lt;td&gt;22.344017&lt;/td&gt; &lt;td&gt;11.534642&lt;/td&gt; &lt;td&gt;2.402683&lt;/td&gt; &lt;td&gt;24.214115&lt;/td&gt; &lt;td&gt;16.236299&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.407745&lt;/td&gt; &lt;td&gt;5.413278&lt;/td&gt; &lt;td&gt;8.800650&lt;/td&gt; &lt;td&gt;18.055743&lt;/td&gt; &lt;td&gt;17.528827&lt;/td&gt; &lt;td&gt;4.173171&lt;/td&gt; &lt;td&gt;15.927165&lt;/td&gt; &lt;td&gt;21.636801&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;8.069721&lt;/td&gt; &lt;td&gt;5.531066&lt;/td&gt; &lt;td&gt;13.233927&lt;/td&gt; &lt;td&gt;21.321389&lt;/td&gt; &lt;td&gt;7.622026&lt;/td&gt; &lt;td&gt;12.064182&lt;/td&gt; &lt;td&gt;11.457848&lt;/td&gt; &lt;td&gt;12.342336&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;8.069721&lt;/td&gt; &lt;td&gt;3.894254&lt;/td&gt; &lt;td&gt;8.664394&lt;/td&gt; &lt;td&gt;14.761290&lt;/td&gt; &lt;td&gt;7.622026&lt;/td&gt; &lt;td&gt;2.402683&lt;/td&gt; &lt;td&gt;11.457848&lt;/td&gt; &lt;td&gt;12.342336&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;27.058060&lt;/td&gt; &lt;td&gt;8.631035&lt;/td&gt; &lt;td&gt;15.742406&lt;/td&gt; &lt;td&gt;25.315007&lt;/td&gt; &lt;td&gt;17.528827&lt;/td&gt; &lt;td&gt;12.064182&lt;/td&gt; &lt;td&gt;24.214115&lt;/td&gt; &lt;td&gt;29.328859&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;18.768188&lt;/td&gt; &lt;td&gt;5.821588&lt;/td&gt; &lt;td&gt;11.211899&lt;/td&gt; &lt;td&gt;20.403175&lt;/td&gt; &lt;td&gt;12.307949&lt;/td&gt; &lt;td&gt;5.911071&lt;/td&gt; &lt;td&gt;17.182634&lt;/td&gt; &lt;td&gt;17.925471&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G run 2&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for&lt;br /&gt; Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;423,431.8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;387,248.6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite&lt;br /&gt; Query-per-Hour Metric&lt;br /&gt; (Qph@300GB)&lt;/th&gt; &lt;td&gt;404,936.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in&lt;br /&gt; Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;368.236000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:28:42&lt;/td&gt; &lt;td&gt;09/25/2014 19:29:58&lt;/td&gt; &lt;td&gt;0:01:16&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:04&lt;/td&gt; &lt;td&gt;0:06:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:00&lt;/td&gt; &lt;td&gt;0:06:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:06&lt;/td&gt; &lt;td&gt;0:06:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:07&lt;/td&gt; &lt;td&gt;0:06:07&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:35:53&lt;/td&gt; &lt;td&gt;0:05:53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:08&lt;/td&gt; &lt;td&gt;0:06:08&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:28:41&lt;/td&gt; &lt;td&gt;09/25/2014 19:28:46&lt;/td&gt; &lt;td&gt;0:00:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:29:58&lt;/td&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:32:23&lt;/td&gt; &lt;td&gt;09/25/2014 19:32:55&lt;/td&gt; &lt;td&gt;0:00:32&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:00&lt;/td&gt; &lt;td&gt;09/25/2014 19:30:31&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:30:31&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:00&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:01&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:23&lt;/td&gt; &lt;td&gt;0:00:22&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:23&lt;/td&gt; &lt;td&gt;09/25/2014 19:31:54&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:31:55&lt;/td&gt; &lt;td&gt;09/25/2014 19:32:23&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.197427&lt;/td&gt; &lt;td&gt;1.011516&lt;/td&gt; &lt;td&gt;2.535959&lt;/td&gt; &lt;td&gt;0.858781&lt;/td&gt; &lt;td&gt;2.857279&lt;/td&gt; &lt;td&gt;1.293530&lt;/td&gt; &lt;td&gt;2.682266&lt;/td&gt; &lt;td&gt;2.260502&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;15.467757&lt;/td&gt; &lt;td&gt;3.517499&lt;/td&gt; &lt;td&gt;13.820864&lt;/td&gt; &lt;td&gt;4.157259&lt;/td&gt; &lt;td&gt;13.141556&lt;/td&gt; &lt;td&gt;10.902710&lt;/td&gt; &lt;td&gt;16.899687&lt;/td&gt; &lt;td&gt;8.986535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;15.639991&lt;/td&gt; &lt;td&gt;6.026485&lt;/td&gt; &lt;td&gt;13.521624&lt;/td&gt; &lt;td&gt;3.918031&lt;/td&gt; &lt;td&gt;17.336458&lt;/td&gt; &lt;td&gt;1.975310&lt;/td&gt; &lt;td&gt;9.718194&lt;/td&gt; &lt;td&gt;15.165247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.891929&lt;/td&gt; &lt;td&gt;4.481383&lt;/td&gt; &lt;td&gt;15.322621&lt;/td&gt; &lt;td&gt;5.272911&lt;/td&gt; &lt;td&gt;15.266543&lt;/td&gt; &lt;td&gt;6.771253&lt;/td&gt; &lt;td&gt;13.430646&lt;/td&gt; &lt;td&gt;20.171084&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;14.560526&lt;/td&gt; &lt;td&gt;2.464157&lt;/td&gt; &lt;td&gt;11.567112&lt;/td&gt; &lt;td&gt;5.526629&lt;/td&gt; &lt;td&gt;20.531540&lt;/td&gt; &lt;td&gt;5.225971&lt;/td&gt; &lt;td&gt;16.288606&lt;/td&gt; &lt;td&gt;17.209475&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;10.390577&lt;/td&gt; &lt;td&gt;3.549165&lt;/td&gt; &lt;td&gt;9.598328&lt;/td&gt; &lt;td&gt;8.783847&lt;/td&gt; &lt;td&gt;17.351211&lt;/td&gt; &lt;td&gt;6.308214&lt;/td&gt; &lt;td&gt;12.606512&lt;/td&gt; &lt;td&gt;13.035716&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;16.275922&lt;/td&gt; &lt;td&gt;4.086475&lt;/td&gt; &lt;td&gt;14.109963&lt;/td&gt; &lt;td&gt;4.385887&lt;/td&gt; &lt;td&gt;10.174709&lt;/td&gt; &lt;td&gt;6.703266&lt;/td&gt; &lt;td&gt;8.936217&lt;/td&gt; &lt;td&gt;16.798526&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;10.390577&lt;/td&gt; &lt;td&gt;2.464157&lt;/td&gt; &lt;td&gt;9.598328&lt;/td&gt; &lt;td&gt;3.918031&lt;/td&gt; &lt;td&gt;10.174709&lt;/td&gt; &lt;td&gt;1.975310&lt;/td&gt; &lt;td&gt;8.936217&lt;/td&gt; &lt;td&gt;8.986535&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;16.275922&lt;/td&gt; &lt;td&gt;6.026485&lt;/td&gt; &lt;td&gt;15.322621&lt;/td&gt; &lt;td&gt;8.783847&lt;/td&gt; &lt;td&gt;20.531540&lt;/td&gt; &lt;td&gt;10.902710&lt;/td&gt; &lt;td&gt;16.899687&lt;/td&gt; &lt;td&gt;20.171084&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;14.537784&lt;/td&gt; &lt;td&gt;4.020861&lt;/td&gt; &lt;td&gt;12.990085&lt;/td&gt; &lt;td&gt;5.340761&lt;/td&gt; &lt;td&gt;15.633670&lt;/td&gt; &lt;td&gt;6.314454&lt;/td&gt; &lt;td&gt;12.979977&lt;/td&gt; &lt;td&gt;15.227764&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;8.300092&lt;/td&gt; &lt;td&gt;2.598145&lt;/td&gt; &lt;td&gt;5.168418&lt;/td&gt; &lt;td&gt;1.619399&lt;/td&gt; &lt;td&gt;11.958836&lt;/td&gt; &lt;td&gt;3.191672&lt;/td&gt; &lt;td&gt;3.097822&lt;/td&gt; &lt;td&gt;2.497410&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;26.412829&lt;/td&gt; &lt;td&gt;17.354745&lt;/td&gt; &lt;td&gt;12.942454&lt;/td&gt; &lt;td&gt;8.169447&lt;/td&gt; &lt;td&gt;58.600101&lt;/td&gt; &lt;td&gt;15.227942&lt;/td&gt; &lt;td&gt;32.985324&lt;/td&gt; &lt;td&gt;13.914978&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;34.523245&lt;/td&gt; &lt;td&gt;17.635531&lt;/td&gt; &lt;td&gt;15.193748&lt;/td&gt; &lt;td&gt;8.435375&lt;/td&gt; &lt;td&gt;62.442800&lt;/td&gt; &lt;td&gt;16.276300&lt;/td&gt; &lt;td&gt;26.533303&lt;/td&gt; &lt;td&gt;12.414575&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;25.334301&lt;/td&gt; &lt;td&gt;18.595422&lt;/td&gt; &lt;td&gt;11.663933&lt;/td&gt; &lt;td&gt;10.029387&lt;/td&gt; &lt;td&gt;63.664992&lt;/td&gt; &lt;td&gt;20.378320&lt;/td&gt; &lt;td&gt;24.760768&lt;/td&gt; &lt;td&gt;15.710589&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;36.971957&lt;/td&gt; &lt;td&gt;15.645673&lt;/td&gt; &lt;td&gt;14.672851&lt;/td&gt; &lt;td&gt;13.196301&lt;/td&gt; &lt;td&gt;58.214728&lt;/td&gt; &lt;td&gt;17.375053&lt;/td&gt; &lt;td&gt;26.581101&lt;/td&gt; &lt;td&gt;11.624989&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;30.891797&lt;/td&gt; &lt;td&gt;12.993365&lt;/td&gt; &lt;td&gt;14.089049&lt;/td&gt; &lt;td&gt;10.515091&lt;/td&gt; &lt;td&gt;65.232712&lt;/td&gt; &lt;td&gt;20.807026&lt;/td&gt; &lt;td&gt;26.920526&lt;/td&gt; &lt;td&gt;11.362095&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;38.143281&lt;/td&gt; &lt;td&gt;21.106772&lt;/td&gt; &lt;td&gt;15.152299&lt;/td&gt; &lt;td&gt;18.845766&lt;/td&gt; &lt;td&gt;66.240343&lt;/td&gt; &lt;td&gt;12.295624&lt;/td&gt; &lt;td&gt;22.510610&lt;/td&gt; &lt;td&gt;18.081103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;25.334301&lt;/td&gt; &lt;td&gt;12.993365&lt;/td&gt; &lt;td&gt;11.663933&lt;/td&gt; &lt;td&gt;8.169447&lt;/td&gt; &lt;td&gt;58.214728&lt;/td&gt; &lt;td&gt;12.295624&lt;/td&gt; &lt;td&gt;22.510610&lt;/td&gt; &lt;td&gt;11.362095&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;38.143281&lt;/td&gt; &lt;td&gt;21.106772&lt;/td&gt; &lt;td&gt;15.193748&lt;/td&gt; &lt;td&gt;18.845766&lt;/td&gt; &lt;td&gt;66.240343&lt;/td&gt; &lt;td&gt;20.807026&lt;/td&gt; &lt;td&gt;32.985324&lt;/td&gt; &lt;td&gt;18.081103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;32.046235&lt;/td&gt; &lt;td&gt;17.221918&lt;/td&gt; &lt;td&gt;13.952389&lt;/td&gt; &lt;td&gt;11.531894&lt;/td&gt; &lt;td&gt;62.399279&lt;/td&gt; &lt;td&gt;17.060044&lt;/td&gt; &lt;td&gt;26.715272&lt;/td&gt; &lt;td&gt;13.851388&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.016212&lt;/td&gt; &lt;td&gt;1.603004&lt;/td&gt; &lt;td&gt;1.836489&lt;/td&gt; &lt;td&gt;3.542383&lt;/td&gt; &lt;td&gt;3.901876&lt;/td&gt; &lt;td&gt;0.515102&lt;/td&gt; &lt;td&gt;4.759612&lt;/td&gt; &lt;td&gt;2.358873&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;22.162387&lt;/td&gt; &lt;td&gt;10.067834&lt;/td&gt; &lt;td&gt;15.772705&lt;/td&gt; &lt;td&gt;22.091355&lt;/td&gt; &lt;td&gt;12.974776&lt;/td&gt; &lt;td&gt;8.354196&lt;/td&gt; &lt;td&gt;19.342171&lt;/td&gt; &lt;td&gt;12.771250&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;25.647926&lt;/td&gt; &lt;td&gt;4.263008&lt;/td&gt; &lt;td&gt;11.590737&lt;/td&gt; &lt;td&gt;19.179326&lt;/td&gt; &lt;td&gt;17.899770&lt;/td&gt; &lt;td&gt;4.137031&lt;/td&gt; &lt;td&gt;15.720245&lt;/td&gt; &lt;td&gt;14.719776&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.511279&lt;/td&gt; &lt;td&gt;7.484608&lt;/td&gt; &lt;td&gt;20.735250&lt;/td&gt; &lt;td&gt;13.041037&lt;/td&gt; &lt;td&gt;17.139046&lt;/td&gt; &lt;td&gt;6.014141&lt;/td&gt; &lt;td&gt;16.234122&lt;/td&gt; &lt;td&gt;13.454647&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;19.297494&lt;/td&gt; &lt;td&gt;10.110707&lt;/td&gt; &lt;td&gt;10.907458&lt;/td&gt; &lt;td&gt;19.649066&lt;/td&gt; &lt;td&gt;15.206251&lt;/td&gt; &lt;td&gt;3.423503&lt;/td&gt; &lt;td&gt;11.268082&lt;/td&gt; &lt;td&gt;11.852223&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;17.445165&lt;/td&gt; &lt;td&gt;5.582309&lt;/td&gt; &lt;td&gt;15.266324&lt;/td&gt; &lt;td&gt;19.788382&lt;/td&gt; &lt;td&gt;14.245770&lt;/td&gt; &lt;td&gt;2.810949&lt;/td&gt; &lt;td&gt;16.601461&lt;/td&gt; &lt;td&gt;14.019717&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;25.115339&lt;/td&gt; &lt;td&gt;6.896503&lt;/td&gt; &lt;td&gt;11.661563&lt;/td&gt; &lt;td&gt;21.900028&lt;/td&gt; &lt;td&gt;5.520025&lt;/td&gt; &lt;td&gt;3.093050&lt;/td&gt; &lt;td&gt;15.436258&lt;/td&gt; &lt;td&gt;13.353446&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;14.511279&lt;/td&gt; &lt;td&gt;4.263008&lt;/td&gt; &lt;td&gt;10.907458&lt;/td&gt; &lt;td&gt;13.041037&lt;/td&gt; &lt;td&gt;5.520025&lt;/td&gt; &lt;td&gt;2.810949&lt;/td&gt; &lt;td&gt;11.268082&lt;/td&gt; &lt;td&gt;11.852223&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;25.647926&lt;/td&gt; &lt;td&gt;10.110707&lt;/td&gt; &lt;td&gt;20.735250&lt;/td&gt; &lt;td&gt;22.091355&lt;/td&gt; &lt;td&gt;17.899770&lt;/td&gt; &lt;td&gt;8.354196&lt;/td&gt; &lt;td&gt;19.342171&lt;/td&gt; &lt;td&gt;14.719776&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;20.696598&lt;/td&gt; &lt;td&gt;7.400828&lt;/td&gt; &lt;td&gt;14.322339&lt;/td&gt; &lt;td&gt;19.274866&lt;/td&gt; &lt;td&gt;13.830940&lt;/td&gt; &lt;td&gt;4.638812&lt;/td&gt; &lt;td&gt;15.767057&lt;/td&gt; &lt;td&gt;13.361843&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;300G run 3:&lt;/h2&gt; &lt;h3&gt;Virt-H Executive Summary&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td&gt;September 25, 2014&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td&gt;300&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td&gt;258,888M&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 16:38:20&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td&gt;09/25/2014 18:32:06&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td&gt;1:53:46&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for &lt;br /&gt;Throughput Test&lt;/th&gt; &lt;td&gt;6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td&gt;417,672.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td&gt;389,719.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite &lt;br /&gt;Query-per-Hour Metric &lt;br /&gt;(Qph@300GB)&lt;/th&gt; &lt;td&gt;403,453.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in &lt;br /&gt;Throughput Test (Ts)&lt;/th&gt; &lt;td&gt;365.902000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Duration of stream execution:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:36:11&lt;/td&gt; &lt;td&gt;09/25/2014 19:37:29&lt;/td&gt; &lt;td&gt;0:01:18&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:13&lt;/td&gt; &lt;td&gt;0:05:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:31&lt;/td&gt; &lt;td&gt;0:05:59&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:37&lt;/td&gt; &lt;td&gt;0:06:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:33&lt;/td&gt; &lt;td&gt;0:06:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:32&lt;/td&gt; &lt;td&gt;0:06:00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:32&lt;/td&gt; &lt;td&gt;09/25/2014 19:43:37&lt;/td&gt; &lt;td&gt;0:06:05&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;09/25/2014 19:36:12&lt;/td&gt; &lt;td&gt;09/25/2014 19:36:16&lt;/td&gt; &lt;td&gt;0:00:04&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;09/25/2014 19:37:29&lt;/td&gt; &lt;td&gt;09/25/2014 19:37:31&lt;/td&gt; &lt;td&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;09/25/2014 19:40:02&lt;/td&gt; &lt;td&gt;09/25/2014 19:40:33&lt;/td&gt; &lt;td&gt;0:00:31&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;09/25/2014 19:37:31&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:01&lt;/td&gt; &lt;td&gt;0:00:30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:01&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:30&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:30&lt;/td&gt; &lt;td&gt;09/25/2014 19:38:58&lt;/td&gt; &lt;td&gt;0:00:28&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;09/25/2014 19:38:58&lt;/td&gt; &lt;td&gt;09/25/2014 19:39:27&lt;/td&gt; &lt;td&gt;0:00:29&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 6&lt;/th&gt; &lt;td&gt;09/25/2014 19:39:27&lt;/td&gt; &lt;td&gt;09/25/2014 19:40:01&lt;/td&gt; &lt;td&gt;0:00:34&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Numerical Quantities Summary Timing Intervals in Seconds:&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.305006&lt;/td&gt; &lt;td&gt;1.083442&lt;/td&gt; &lt;td&gt;2.502758&lt;/td&gt; &lt;td&gt;0.845763&lt;/td&gt; &lt;td&gt;2.840824&lt;/td&gt; &lt;td&gt;1.346166&lt;/td&gt; &lt;td&gt;2.659511&lt;/td&gt; &lt;td&gt;2.233550&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;11.513360&lt;/td&gt; &lt;td&gt;3.732513&lt;/td&gt; &lt;td&gt;14.530428&lt;/td&gt; &lt;td&gt;3.819517&lt;/td&gt; &lt;td&gt;14.821291&lt;/td&gt; &lt;td&gt;7.561547&lt;/td&gt; &lt;td&gt;10.435082&lt;/td&gt; &lt;td&gt;8.984230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;13.486433&lt;/td&gt; &lt;td&gt;3.373689&lt;/td&gt; &lt;td&gt;9.620363&lt;/td&gt; &lt;td&gt;3.914320&lt;/td&gt; &lt;td&gt;16.857542&lt;/td&gt; &lt;td&gt;5.837487&lt;/td&gt; &lt;td&gt;10.695443&lt;/td&gt; &lt;td&gt;17.901191&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;11.015942&lt;/td&gt; &lt;td&gt;1.780220&lt;/td&gt; &lt;td&gt;4.830412&lt;/td&gt; &lt;td&gt;9.073543&lt;/td&gt; &lt;td&gt;15.587709&lt;/td&gt; &lt;td&gt;9.661989&lt;/td&gt; &lt;td&gt;12.374931&lt;/td&gt; &lt;td&gt;15.262485&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;13.600461&lt;/td&gt; &lt;td&gt;0.820899&lt;/td&gt; &lt;td&gt;12.254226&lt;/td&gt; &lt;td&gt;7.799415&lt;/td&gt; &lt;td&gt;19.860761&lt;/td&gt; &lt;td&gt;13.145017&lt;/td&gt; &lt;td&gt;14.404345&lt;/td&gt; &lt;td&gt;11.807583&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;13.358000&lt;/td&gt; &lt;td&gt;3.885118&lt;/td&gt; &lt;td&gt;11.099935&lt;/td&gt; &lt;td&gt;4.845043&lt;/td&gt; &lt;td&gt;18.286721&lt;/td&gt; &lt;td&gt;6.424272&lt;/td&gt; &lt;td&gt;9.735255&lt;/td&gt; &lt;td&gt;15.041608&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;13.588873&lt;/td&gt; &lt;td&gt;3.789631&lt;/td&gt; &lt;td&gt;13.503399&lt;/td&gt; &lt;td&gt;5.130389&lt;/td&gt; &lt;td&gt;13.104065&lt;/td&gt; &lt;td&gt;3.517076&lt;/td&gt; &lt;td&gt;14.929079&lt;/td&gt; &lt;td&gt;19.831639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;11.015942&lt;/td&gt; &lt;td&gt;0.820899&lt;/td&gt; &lt;td&gt;4.830412&lt;/td&gt; &lt;td&gt;3.819517&lt;/td&gt; &lt;td&gt;13.104065&lt;/td&gt; &lt;td&gt;3.517076&lt;/td&gt; &lt;td&gt;9.735255&lt;/td&gt; &lt;td&gt;8.984230&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;13.600461&lt;/td&gt; &lt;td&gt;3.885118&lt;/td&gt; &lt;td&gt;14.530428&lt;/td&gt; &lt;td&gt;9.073543&lt;/td&gt; &lt;td&gt;19.860761&lt;/td&gt; &lt;td&gt;13.145017&lt;/td&gt; &lt;td&gt;14.929079&lt;/td&gt; &lt;td&gt;19.831639&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;12.760511&lt;/td&gt; &lt;td&gt;2.897012&lt;/td&gt; &lt;td&gt;10.973127&lt;/td&gt; &lt;td&gt;5.763705&lt;/td&gt; &lt;td&gt;16.419681&lt;/td&gt; &lt;td&gt;7.691231&lt;/td&gt; &lt;td&gt;12.095689&lt;/td&gt; &lt;td&gt;14.804789&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right;&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;8.553183&lt;/td&gt; &lt;td&gt;3.215484&lt;/td&gt; &lt;td&gt;4.652364&lt;/td&gt; &lt;td&gt;1.620089&lt;/td&gt; &lt;td&gt;11.936052&lt;/td&gt; &lt;td&gt;2.916132&lt;/td&gt; &lt;td&gt;3.219969&lt;/td&gt; &lt;td&gt;2.374276&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;29.441108&lt;/td&gt; &lt;td&gt;20.348266&lt;/td&gt; &lt;td&gt;9.994556&lt;/td&gt; &lt;td&gt;14.965432&lt;/td&gt; &lt;td&gt;60.537168&lt;/td&gt; &lt;td&gt;13.302875&lt;/td&gt; &lt;td&gt;30.159402&lt;/td&gt; &lt;td&gt;10.277570&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;41.799347&lt;/td&gt; &lt;td&gt;18.197400&lt;/td&gt; &lt;td&gt;16.773638&lt;/td&gt; &lt;td&gt;6.510347&lt;/td&gt; &lt;td&gt;67.461446&lt;/td&gt; &lt;td&gt;20.362328&lt;/td&gt; &lt;td&gt;0.109929&lt;/td&gt; &lt;td&gt;9.908769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;24.306937&lt;/td&gt; &lt;td&gt;20.555376&lt;/td&gt; &lt;td&gt;17.140758&lt;/td&gt; &lt;td&gt;16.715188&lt;/td&gt; &lt;td&gt;61.724168&lt;/td&gt; &lt;td&gt;22.469230&lt;/td&gt; &lt;td&gt;27.967206&lt;/td&gt; &lt;td&gt;13.434167&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;34.820796&lt;/td&gt; &lt;td&gt;11.795664&lt;/td&gt; &lt;td&gt;18.015120&lt;/td&gt; &lt;td&gt;7.176057&lt;/td&gt; &lt;td&gt;63.134711&lt;/td&gt; &lt;td&gt;11.427374&lt;/td&gt; &lt;td&gt;23.959842&lt;/td&gt; &lt;td&gt;16.759246&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;23.139366&lt;/td&gt; &lt;td&gt;12.655317&lt;/td&gt; &lt;td&gt;13.152401&lt;/td&gt; &lt;td&gt;7.258740&lt;/td&gt; &lt;td&gt;64.273225&lt;/td&gt; &lt;td&gt;22.854106&lt;/td&gt; &lt;td&gt;28.803059&lt;/td&gt; &lt;td&gt;12.832364&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;27.955059&lt;/td&gt; &lt;td&gt;24.633526&lt;/td&gt; &lt;td&gt;11.046285&lt;/td&gt; &lt;td&gt;5.995041&lt;/td&gt; &lt;td&gt;74.965966&lt;/td&gt; &lt;td&gt;15.636579&lt;/td&gt; &lt;td&gt;22.803890&lt;/td&gt; &lt;td&gt;13.221303&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;23.139366&lt;/td&gt; &lt;td&gt;11.795664&lt;/td&gt; &lt;td&gt;9.994556&lt;/td&gt; &lt;td&gt;5.995041&lt;/td&gt; &lt;td&gt;60.537168&lt;/td&gt; &lt;td&gt;11.427374&lt;/td&gt; &lt;td&gt;0.109929&lt;/td&gt; &lt;td&gt;9.908769&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;41.799347&lt;/td&gt; &lt;td&gt;24.633526&lt;/td&gt; &lt;td&gt;18.015120&lt;/td&gt; &lt;td&gt;16.715188&lt;/td&gt; &lt;td&gt;74.965966&lt;/td&gt; &lt;td&gt;22.854106&lt;/td&gt; &lt;td&gt;30.159402&lt;/td&gt; &lt;td&gt;16.759246&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;30.243769&lt;/td&gt; &lt;td&gt;18.030925&lt;/td&gt; &lt;td&gt;14.353793&lt;/td&gt; &lt;td&gt;9.770134&lt;/td&gt; &lt;td&gt;65.349447&lt;/td&gt; &lt;td&gt;17.675415&lt;/td&gt; &lt;td&gt;22.300555&lt;/td&gt; &lt;td&gt;12.738903&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;margin-left:auto;margin-right:auto;text-align:right&quot;&gt; &lt;tr&gt; &lt;th&gt;Query&lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;4.298092&lt;/td&gt; &lt;td&gt;1.702071&lt;/td&gt; &lt;td&gt;1.894548&lt;/td&gt; &lt;td&gt;4.118591&lt;/td&gt; &lt;td&gt;3.922889&lt;/td&gt; &lt;td&gt;0.491145&lt;/td&gt; &lt;td&gt;4.519734&lt;/td&gt; &lt;td&gt;2.347913&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;16.432222&lt;/td&gt; &lt;td&gt;6.908918&lt;/td&gt; &lt;td&gt;17.749058&lt;/td&gt; &lt;td&gt;18.756674&lt;/td&gt; &lt;td&gt;11.148628&lt;/td&gt; &lt;td&gt;5.464975&lt;/td&gt; &lt;td&gt;18.300673&lt;/td&gt; &lt;td&gt;12.972871&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;20.588544&lt;/td&gt; &lt;td&gt;4.387662&lt;/td&gt; &lt;td&gt;14.527229&lt;/td&gt; &lt;td&gt;23.844364&lt;/td&gt; &lt;td&gt;15.500462&lt;/td&gt; &lt;td&gt;15.543458&lt;/td&gt; &lt;td&gt;13.666574&lt;/td&gt; &lt;td&gt;15.240662&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;14.008049&lt;/td&gt; &lt;td&gt;6.222633&lt;/td&gt; &lt;td&gt;12.833421&lt;/td&gt; &lt;td&gt;22.811602&lt;/td&gt; &lt;td&gt;16.013232&lt;/td&gt; &lt;td&gt;9.449069&lt;/td&gt; &lt;td&gt;16.486111&lt;/td&gt; &lt;td&gt;12.974515&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;16.964699&lt;/td&gt; &lt;td&gt;8.106044&lt;/td&gt; &lt;td&gt;11.207675&lt;/td&gt; &lt;td&gt;22.483826&lt;/td&gt; &lt;td&gt;17.354675&lt;/td&gt; &lt;td&gt;4.641183&lt;/td&gt; &lt;td&gt;14.583941&lt;/td&gt; &lt;td&gt;13.679087&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;25.243144&lt;/td&gt; &lt;td&gt;7.359437&lt;/td&gt; &lt;td&gt;16.986615&lt;/td&gt; &lt;td&gt;19.855391&lt;/td&gt; &lt;td&gt;17.183725&lt;/td&gt; &lt;td&gt;5.750937&lt;/td&gt; &lt;td&gt;14.759597&lt;/td&gt; &lt;td&gt;13.052316&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 6&lt;/th&gt; &lt;td&gt;12.986721&lt;/td&gt; &lt;td&gt;10.160993&lt;/td&gt; &lt;td&gt;17.496662&lt;/td&gt; &lt;td&gt;19.267026&lt;/td&gt; &lt;td&gt;17.300224&lt;/td&gt; &lt;td&gt;4.955930&lt;/td&gt; &lt;td&gt;19.267721&lt;/td&gt; &lt;td&gt;15.421241&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td&gt;12.986721&lt;/td&gt; &lt;td&gt;4.387662&lt;/td&gt; &lt;td&gt;11.207675&lt;/td&gt; &lt;td&gt;18.756674&lt;/td&gt; &lt;td&gt;11.148628&lt;/td&gt; &lt;td&gt;4.641183&lt;/td&gt; &lt;td&gt;13.666574&lt;/td&gt; &lt;td&gt;12.972871&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td&gt;25.243144&lt;/td&gt; &lt;td&gt;10.160993&lt;/td&gt; &lt;td&gt;17.749058&lt;/td&gt; &lt;td&gt;23.844364&lt;/td&gt; &lt;td&gt;17.354675&lt;/td&gt; &lt;td&gt;15.543458&lt;/td&gt; &lt;td&gt;19.267721&lt;/td&gt; &lt;td&gt;15.421241&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td&gt;17.703896&lt;/td&gt; &lt;td&gt;7.190948&lt;/td&gt; &lt;td&gt;15.133443&lt;/td&gt; &lt;td&gt;21.169814&lt;/td&gt; &lt;td&gt;15.750158&lt;/td&gt; &lt;td&gt;7.634259&lt;/td&gt; &lt;td&gt;16.177436&lt;/td&gt; &lt;td&gt;13.890115&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabeaafeba8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac68efcef8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab74c90428&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac0c39ad38&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:15.589027-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 16 of n): Introduction to Scale-Out</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-24#1817</atom:id>
  <atom:published>2014-09-24T17:05:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;So far, we have analyzed &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1a41d4f8&quot;&gt;TPC-H&lt;/a&gt; in a single-server, memory-only setting. We will now move to larger data and cluster implementations. In principle, TPC-H parallelizes well, so we should expect near-linear scalability; i.e., twice the gear runs twice as fast, or close enough.&lt;/p&gt; &lt;p&gt;In practice, things are not quite so simple. Larger data, particularly a different data-to-memory ratio, and the fact of having no shared memory, all play a role. There is also a network, so partitioned operations, which also existed in the single-server case, now have to send messages across machines, not across threads. For data loading and refreshes, there is generally no shared file system, so data distribution and parallelism have to be considered.&lt;/p&gt; &lt;p&gt;As an initial pass, we look at 100G and 1000G scales on the same test system as before. This is two machines, each with dual Xeon E5-2630, 192 GB RAM, 2 x 512 GB SSD, and QDR InfiniBand. We will also try other platforms, but if nothing else is said, this is the test system.&lt;/p&gt; &lt;p&gt;As of this writing, there is a working implementation, but it is not guaranteed to be optimal as yet. We will adjust it as we go through the workload. One outcome of the experiment will be a precise determination of the data-volume-to-RAM ratio that still gives good performance.&lt;/p&gt; &lt;p&gt; &lt;i&gt;A priori, &lt;/i&gt;we know of the following things that complicate life with clusters:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Distributed memory&lt;/b&gt; — The working set must be in memory for a run to have a competitive score. A cluster can have a lot of memory, and the data is such that it partitions very evenly, so this appears at first not a problem. The difficulty comes with query memory: If each machine has 1/16th of the total RAM and a hash table would be 1/64th of the working set, on a single-server it is no problem just building the hash table. On a scale-out system, the hash table would be 1/4 of the working set if replicated on each node, which will not fit, especially if there are many such hash tables at the same time. Two main approaches exist: The hash table can be partitioned, but this will force the probe to go cross-partition, which takes time. The other possibility is to build the hash table many times, each time with a fraction of the data, and to run the probe side many times. Since hash tables often have Bloom filters, it is sometimes possible to replicate the Bloom filter and partition the hash table. One has also heard of hash tables that go to secondary storage, but should this happen, the race is already lost; so, we do not go there.&lt;/p&gt; &lt;p&gt; We must evaluate different combinations of these techniques and have a cost model that accurately predicts the performance of each variant. Adding to realism is always safe but halfway difficult to do.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;NUMA&lt;/b&gt; — Most servers are &lt;a href=&quot;http://dbpedia.org/resource/Non-uniform_memory_access&quot; id=&quot;link-id0x2aabbef390d8&quot;&gt;NUMA (non-uniform memory architecture)&lt;/a&gt;, where each CPU socket has its own local memory. For single-server cases, we use all the memory for the process. Some implementations have special logic for memory affinity between threads. With scale-out there is the choice of having a server process per-NUMA-node or per-physical-machine. If per-NUMA-node, we are guaranteed only local memory accesses. This is a tradeoff to be evaluated.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Network and Scheduling&lt;/b&gt; — Execution on a cluster is always &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/vexqrparl.html&quot; id=&quot;link-id0x2aabbef26648&quot;&gt;vectored&lt;/a&gt;, for the simple reason that sending single-tuple messages is unfeasible in terms of performance. With an otherwise vectored architecture, the message batching required on a cluster comes naturally. However, the larger the cluster, the more partitions there are, which rapidly gets into shorter messages. Increasing the vector size is possible and messages become longer, but indefinite increase in vector size has drawbacks for cache locality and takes memory. To run well, each thread must stay on core. There are two ways of being taken off core ahead of time: Blocking for a mutex, and blocking for network. Lots of short messages run into scheduling overhead, since the recipient must decide what to do with each, which is not really possible without some sort of critical section. This is more efficient if messages are longer, as the decision time does not depend on message length. Longer messages are however liable to block on write at the sender side. So one pays in either case. This is another tradeoff to be balanced.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Flow control&lt;/b&gt; — A query is a pipeline of producers and consumers. Sometimes the consumer is in a different partition. The producer must not get indefinitely ahead of the consumer because this would run out of memory, but it must stay sufficiently ahead so as not to stop the consumer. In practice, there are synchronization barriers to check even progress. These will decrease platform utilization, because two threads never finish at exactly the same time. The price of not having these is having no cap on transient memory consumption.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Un-homogenous performance&lt;/b&gt; — Identical machines do not always perform identically. This is seen especially with disk, where wear on SSDs can affect write speed, and where uncontrollable hazards of data placement will get uneven read speeds on rotating media. Purely memory-bound performance is quite close, though. Un-anticipatable and uncontrollable hazards of scheduling cause different times of arrival of network messages, which introduces variation in run time on consecutive runs. Single-servers have some such variation from threading, but the effects are larger with a network.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The logical side of query optimization stays the same. Pushing down predicates is always good, and all the logical tricks with moving conditions between subqueries stay the same.&lt;/p&gt; &lt;p&gt;Schema design stays much the same, but there is the extra question of partitioning keys. In this implementation, there are only indices on identifiers, not on dates, for example. So, for a primary key to foreign key join, if there is an index on the foreign key, the index should be partitioned the same way as the primary key. So, joining from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;lineitem&lt;/code&gt; on &lt;code&gt;orderkey&lt;/code&gt; will be co-located. Joining from &lt;code&gt;customer&lt;/code&gt; to &lt;code&gt;orders&lt;/code&gt; by index will be colocated for the &lt;code&gt;c_custkey = o_custkey&lt;/code&gt; part (assuming an index on &lt;code&gt;o_custkey&lt;/code&gt;) and cross-partition for getting the &lt;code&gt;customer&lt;/code&gt; row on &lt;code&gt;c_custkey&lt;/code&gt;, supposing that the query needs some property of the &lt;code&gt;customer&lt;/code&gt; other than &lt;code&gt;c_custkey&lt;/code&gt; or &lt;code&gt;c_orderkey&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;A secondary question is the partition granularity. For good compression, nearby values should be consecutive, so here we leave the low 12 bits out of the partitioning. This has effect on bulk load and refreshes, for example, so that a batch of 10,000 &lt;code&gt;lineitems&lt;/code&gt;, ordered on &lt;code&gt;l_orderkey&lt;/code&gt; will go to only 2 or 3 distinct destinations, thus getting longer messages and longer insert batches, which is more efficient.&lt;/p&gt; &lt;p&gt;This is a quick overview of the wisdom so far. In subsequent installments, we will take a quantitative look at the tradeoffs and consider actual queries. As a conclusion, we will show a full run on a couple of different platforms, and likely provide Amazon machine images for the interested to see for themselves. &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/&quot; id=&quot;link-id0x2aabdd36fd68&quot;&gt;Virtuoso Cluster is not open source&lt;/a&gt;, but the cloud will provide easy access.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x18bd44b8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x854ee68&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x19773848&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac0421e0d8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:35.168159-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 16 of n): Introduction to Scale-Out</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-24#1816</atom:id>
  <atom:published>2014-09-24T17:05:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;So far, we have analyzed &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1a41d4f8&quot;&gt;TPC-H&lt;/a&gt; in a single-server, memory-only setting. We will now move to larger data and cluster implementations. In principle, TPC-H parallelizes well, so we should expect near-linear scalability; i.e., twice the gear runs twice as fast, or close enough.&lt;/p&gt; &lt;p&gt;In practice, things are not quite so simple. Larger data, particularly a different data-to-memory ratio, and the fact of having no shared memory, all play a role. There is also a network, so partitioned operations, which also existed in the single-server case, now have to send messages across machines, not across threads. For data loading and refreshes, there is generally no shared file system, so data distribution and parallelism have to be considered.&lt;/p&gt; &lt;p&gt;As an initial pass, we look at 100G and 1000G scales on the same test system as before. This is two machines, each with dual Xeon E5-2630, 192 GB RAM, 2 x 512 GB SSD, and QDR InfiniBand. We will also try other platforms, but if nothing else is said, this is the test system.&lt;/p&gt; &lt;p&gt;As of this writing, there is a working implementation, but it is not guaranteed to be optimal as yet. We will adjust it as we go through the workload. One outcome of the experiment will be a precise determination of the data-volume-to-RAM ratio that still gives good performance.&lt;/p&gt; &lt;p&gt; &lt;i&gt;A priori, &lt;/i&gt;we know of the following things that complicate life with clusters:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Distributed memory&lt;/b&gt; — The working set must be in memory for a run to have a competitive score. A cluster can have a lot of memory, and the data is such that it partitions very evenly, so this appears at first not a problem. The difficulty comes with query memory: If each machine has 1/16th of the total RAM and a hash table would be 1/64th of the working set, on a single-server it is no problem just building the hash table. On a scale-out system, the hash table would be 1/4 of the working set if replicated on each node, which will not fit, especially if there are many such hash tables at the same time. Two main approaches exist: The hash table can be partitioned, but this will force the probe to go cross-partition, which takes time. The other possibility is to build the hash table many times, each time with a fraction of the data, and to run the probe side many times. Since hash tables often have Bloom filters, it is sometimes possible to replicate the Bloom filter and partition the hash table. One has also heard of hash tables that go to secondary storage, but should this happen, the race is already lost; so, we do not go there.&lt;/p&gt; &lt;p&gt; We must evaluate different combinations of these techniques and have a cost model that accurately predicts the performance of each variant. Adding to realism is always safe but halfway difficult to do.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;NUMA&lt;/b&gt; — Most servers are &lt;a href=&quot;http://dbpedia.org/resource/Non-uniform_memory_access&quot; id=&quot;link-id0x2aabbef390d8&quot;&gt;NUMA (non-uniform memory architecture)&lt;/a&gt;, where each CPU socket has its own local memory. For single-server cases, we use all the memory for the process. Some implementations have special logic for memory affinity between threads. With scale-out there is the choice of having a server process per-NUMA-node or per-physical-machine. If per-NUMA-node, we are guaranteed only local memory accesses. This is a tradeoff to be evaluated.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Network and Scheduling&lt;/b&gt; — Execution on a cluster is always &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/vexqrparl.html&quot; id=&quot;link-id0x2aabbef26648&quot;&gt;vectored&lt;/a&gt;, for the simple reason that sending single-tuple messages is unfeasible in terms of performance. With an otherwise vectored architecture, the message batching required on a cluster comes naturally. However, the larger the cluster, the more partitions there are, which rapidly gets into shorter messages. Increasing the vector size is possible and messages become longer, but indefinite increase in vector size has drawbacks for cache locality and takes memory. To run well, each thread must stay on core. There are two ways of being taken off core ahead of time: Blocking for a mutex, and blocking for network. Lots of short messages run into scheduling overhead, since the recipient must decide what to do with each, which is not really possible without some sort of critical section. This is more efficient if messages are longer, as the decision time does not depend on message length. Longer messages are however liable to block on write at the sender side. So one pays in either case. This is another tradeoff to be balanced.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Flow control&lt;/b&gt; — A query is a pipeline of producers and consumers. Sometimes the consumer is in a different partition. The producer must not get indefinitely ahead of the consumer because this would run out of memory, but it must stay sufficiently ahead so as not to stop the consumer. In practice, there are synchronization barriers to check even progress. These will decrease platform utilization, because two threads never finish at exactly the same time. The price of not having these is having no cap on transient memory consumption.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Un-homogenous performance&lt;/b&gt; — Identical machines do not always perform identically. This is seen especially with disk, where wear on SSDs can affect write speed, and where uncontrollable hazards of data placement will get uneven read speeds on rotating media. Purely memory-bound performance is quite close, though. Un-anticipatable and uncontrollable hazards of scheduling cause different times of arrival of network messages, which introduces variation in run time on consecutive runs. Single-servers have some such variation from threading, but the effects are larger with a network.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The logical side of query optimization stays the same. Pushing down predicates is always good, and all the logical tricks with moving conditions between subqueries stay the same.&lt;/p&gt; &lt;p&gt;Schema design stays much the same, but there is the extra question of partitioning keys. In this implementation, there are only indices on identifiers, not on dates, for example. So, for a primary key to foreign key join, if there is an index on the foreign key, the index should be partitioned the same way as the primary key. So, joining from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;lineitem&lt;/code&gt; on &lt;code&gt;orderkey&lt;/code&gt; will be co-located. Joining from &lt;code&gt;customer&lt;/code&gt; to &lt;code&gt;orders&lt;/code&gt; by index will be colocated for the &lt;code&gt;c_custkey = o_custkey&lt;/code&gt; part (assuming an index on &lt;code&gt;o_custkey&lt;/code&gt;) and cross-partition for getting the &lt;code&gt;customer&lt;/code&gt; row on &lt;code&gt;c_custkey&lt;/code&gt;, supposing that the query needs some property of the &lt;code&gt;customer&lt;/code&gt; other than &lt;code&gt;c_custkey&lt;/code&gt; or &lt;code&gt;c_orderkey&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;A secondary question is the partition granularity. For good compression, nearby values should be consecutive, so here we leave the low 12 bits out of the partitioning. This has effect on bulk load and refreshes, for example, so that a batch of 10,000 &lt;code&gt;lineitems&lt;/code&gt;, ordered on &lt;code&gt;l_orderkey&lt;/code&gt; will go to only 2 or 3 distinct destinations, thus getting longer messages and longer insert batches, which is more efficient.&lt;/p&gt; &lt;p&gt;This is a quick overview of the wisdom so far. In subsequent installments, we will take a quantitative look at the tradeoffs and consider actual queries. As a conclusion, we will show a full run on a couple of different platforms, and likely provide Amazon machine images for the interested to see for themselves. &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/&quot; id=&quot;link-id0x2aabdd36fd68&quot;&gt;Virtuoso Cluster is not open source&lt;/a&gt;, but the cloud will provide easy access.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe9e5aaf8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe8468c28&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aaca9151718&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab74235cc8&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac100938b8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:22.354982-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 3 of 3): Conversations</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-08#1815</atom:id>
  <atom:published>2014-09-08T20:11:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was asked for an oracular statement about the future of &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2aab7fe44ae8&quot;&gt;relational database (RDBMS)&lt;/a&gt; at the conference. The answer, without doubt or hesitation, is that this is forever. But this does not mean that the RDBMS world would be immutable, quite the opposite.&lt;/p&gt; &lt;p&gt;The specializations converge. The RDBMS becomes more adaptable and less schema-first. Of course the RDBMS also take new data models beside the relational. &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aabe158ff18&quot;&gt;RDF&lt;/a&gt; and other property graph models, for instance.&lt;/p&gt; &lt;p&gt;The schema-last-ness is now well in evidence. For example, &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x2aab7fe865f8&quot;&gt;PostgreSQL&lt;/a&gt; has an &lt;i&gt;&lt;code&gt;hstore&lt;/code&gt;&lt;/i&gt; column type which is a list of key-value pairs. &lt;a href=&quot;http://dbpedia.org/resource/Vertica&quot; id=&quot;link-id0x2aabe021af48&quot;&gt;Vertica&lt;/a&gt; has a feature called &lt;i&gt;flex tables&lt;/i&gt; where a column can be added on a row-by-row basis.&lt;/p&gt; &lt;p&gt;Specialized indexing for text and geometries is a well established practice. However, dedicated IR systems, often &lt;a href=&quot;http://dbpedia.org/resource/Lucene&quot; id=&quot;link-id0x2aabe008f4e8&quot;&gt;Lucene&lt;/a&gt; derivatives, can offer more transparency in the IR domain for things like vector-space-models and hit-scoring. There is specialized faceted search support which is quite good. I do not know of an RDBMS that would do the exact same trick as Lucene for facets, but, of course, in the forever expanding scope of RDB, this is added easily enough.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/JSON&quot; id=&quot;link-id0x2aabfde79cb8&quot;&gt;JSON&lt;/a&gt; is all the rage in the web developer world. &lt;a href=&quot;https://www.linkedin.com/in/philarcher&quot; id=&quot;link-id0x2aab7fc19b88&quot;&gt;Phil Archer&lt;/a&gt; even said in his keynote, as a parody of the web developer: &amp;quot; I will never touch that crap of RDF or the semantic web; this is a pipe dream of reality ignoring academics and I will not have it. I will only use &lt;a href=&quot;http://dbpedia.org/resource/JSON-LD&quot; id=&quot;link-id0x2aabe229b9c8&quot;&gt;JSON-LD&lt;/a&gt;.&amp;quot;&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2aabe16aa168&quot;&gt;XML&lt;/a&gt; and JSON are much the same thing. While most databases have had XML support for over a decade, there is a crop of specialized JSON systems like &lt;a href=&quot;http://dbpedia.org/resource/MongoDB&quot; id=&quot;link-id0x2aabe0694fe8&quot;&gt;MongoDB&lt;/a&gt;. PostgreSQL also has a JSON datatype. Unsurprisingly, &lt;a href=&quot;http://dbpedia.org/resource/MarkLogic&quot; id=&quot;link-id0x2aabe0176298&quot;&gt;MarkLogic&lt;/a&gt; too has JSON, as this is pretty much the same thing as their core competence of XML.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab7deff0c8&quot;&gt;Virtuoso&lt;/a&gt;, too, naturally has a JSON parser, and mapping this to the native XML data type is a non-issue. This should probably be done.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x2aabe0d67928&quot;&gt;Stefano Bertolo&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/European_Commission&quot; id=&quot;link-id0x2aabe0ee7358&quot;&gt;EC&lt;/a&gt;, also &lt;a href=&quot;http://lod2.eu&quot; id=&quot;link-id0x2aabe1c462c8&quot;&gt;LOD2&lt;/a&gt; project officer, used the word Cambrian explosion when talking about the proliferation of new database approaches in recent years.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aabe3b55fc8&quot;&gt;Hadoop&lt;/a&gt; is a big factor in some environments. &lt;a href=&quot;http://www.actian.com/&quot; id=&quot;link-id0x2aab7f623e98&quot;&gt;Actian&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aac10774118&quot;&gt;Vector (née VectorWise)&lt;/a&gt;, for example, can use this as its file system. &lt;a href=&quot;http://dbpedia.org/resource/Hadoop_Distributed_File_System&quot; id=&quot;link-id0x2aabe215c028&quot;&gt;HDFS&lt;/a&gt; is singularly cumbersome for this but still not impossible and riding the Hadoop bandwagon makes this adaptation likely worthwhile.&lt;/p&gt; &lt;p&gt;Graphs are popular in database research. We have a good deal of exposure to this via &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aabe3a3bef8&quot;&gt;LDBC&lt;/a&gt;. Going back to an API for database access, as is often done in &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0x2aabfd289ec8&quot;&gt;graph database&lt;/a&gt;, can have its point, especially as a reaction to the opaque and sometimes hard to predict query optimization of declarative languages. This just keeps getting more complex, so a counter-reaction is understandable. APIs are good if crossed infrequently and bad otherwise. So, graph database APIs will develop vectoring, is my prediction and even recommendation in LDBC deliverables.&lt;/p&gt; &lt;p&gt;So, there are diverse responses to the same evolutionary pressures. These are of initial necessity one-off special-purpose systems, since the time to solution is manageable. Doing these things inside an RDBMS usually takes longer. The geek also likes to start from scratch. Well, not always, as there have been some cases of grafting some entirely non-&lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aabe26dfc68&quot;&gt;MySQL&lt;/a&gt;-like functionality, e.g. &lt;a href=&quot;http://dbpedia.org/resource/Infobright&quot; id=&quot;link-id0x2aabe3fb9468&quot;&gt;Infobright&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Kickfire&quot; id=&quot;link-id0x2aab7ec81888&quot;&gt;Kickfire&lt;/a&gt;, onto MySQL.&lt;/p&gt; &lt;p&gt;From the Virtuoso angle, adding new data and control structures has been done many times. There is no reason why this cannot continue. The next instances will consist of some graph processing (BSP, or Bulk Synchronous Processing) in the query languages. Another recent example is an interface for pluggable specialized content indices. One can make chemical structure indices, use alternate full text indices, etc., with this.&lt;/p&gt; &lt;p&gt;Most of this diversification has to do with physical design. The common logical side is a demand for more flexibility in schema and sometimes in scaling, e.g., various forms of elasticity in growing scale-out clusters, especially with the big web players.&lt;/p&gt; &lt;p&gt;The diversification is a fact, but the results tend to migrate into the RDBMS given enough time.&lt;/p&gt; &lt;p&gt;On the other hand, when a new species like the RDF store emerges, with products that do this and no other thing and are numerous enough to form a market, the RDBMS functionality seeps in. &lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aabe18f25c8&quot;&gt;Bigdata&lt;/a&gt; has a sort of multicolumn table feature, if I am not mistaken. We just heard about the wish for strict schema, views, and triggers. By all means.&lt;/p&gt; &lt;p&gt;From the Virtuoso angle, with structure awareness, the difference of &lt;a href=&quot;http://www.w3.org/SQL/&quot; id=&quot;link-id0x2aabfc9469d8&quot;&gt;SQL&lt;/a&gt; and RDF gradually fades, and any advance can be exploited to equal effect on either side.&lt;/p&gt; &lt;p&gt;Right now, I would say we have convergence when all the experimental streams feel many of the same necessities.&lt;/p&gt; &lt;p&gt;Of course you cannot have a semantic tech conference without the matter of the public &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aabfdc751f8&quot;&gt;SPARQL&lt;/a&gt; end point coming up. The answer is very simple: If you have operational need for SPARQL accessible data, you must have your own infrastructure. No public end points. Public end points are for lookups and discovery; sort of a dataset demo. If operational data is in all other instances the responsibility of the one running the operation, why should it be otherwise here? Outsourcing is of course possible, either for platform (&lt;a href=&quot;http://dbpedia.org/resource/Cloud_computing&quot; id=&quot;link-id0x2aabe17fbc48&quot;&gt;cloud&lt;/a&gt;) or software (&lt;a href=&quot;http://dbpedia.org/resource/Software_as_a_service&quot; id=&quot;link-id0x2aabe09ec158&quot;&gt;SaaS&lt;/a&gt;). To outsource something with a service level, the service level must be specifiable. A service level cannot be specified in terms of throughput with arbitrary queries but in terms of well defined transactions; hence the services world runs via APIs, as in the case of &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x2aabfd873108&quot;&gt;Open PHACTS&lt;/a&gt;. For arbitrary queries (i.e., analytics on demand), with the huge variation in performance dependent on query plans and configuration of schema, the best is to try these things with platform on demand in a cloud. Like this, there can be a clear understanding of performance, which cannot be had with an entirely uncontrolled concurrent utilization. For systems in constant operation, having one&amp;#39;s own equipment is cheaper, but still might be impossible to procure due to governance.&lt;/p&gt; &lt;p&gt;Having clarified this, the incentives for operators also become clearer. A public end point is a free evaluation; a SaaS deal or product sale is the commercial offering.&lt;/p&gt; &lt;p&gt;Anyway, common datasets like &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x2aabe0fe7a68&quot;&gt;DBpedia&lt;/a&gt; are available preconfigured on &lt;a href=&quot;http://dbpedia.org/resource/Amazon_Web_Services&quot; id=&quot;link-id0x2aabe1203a78&quot;&gt;AWS&lt;/a&gt; with a &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aabe223a398&quot;&gt;Virtuoso&lt;/a&gt; server. For larger data, there is a point to making ready-to-run cluster configurations available for evaluation, now that AWS has suitable equipment (e.g., dual E5 2670 with 240 GB RAM and SSD for USD 2.8 an hour). According to Amazon, up to five of these are available at a time without special request. We will try this during the fall and make the images available.&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1813&quot; id=&quot;link-id0x2aabe0a77d78&quot;&gt;SEMANTiCS 2014 (part 1): Keynote&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1814&quot; id=&quot;link-id0x2aabe08954a8&quot;&gt;SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SEMANTiCS 2014 (part 3): Conversations&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-09-08T16:11:10.206057-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 2 of 3): RDF Data Shapes</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-08#1814</atom:id>
  <atom:published>2014-09-08T19:22:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;The first keynote of &lt;a href=&quot;http://www.semantics.cc/&quot; id=&quot;link-id0x2aab7f183ee8&quot;&gt;Semantics 2014&lt;/a&gt; was by &lt;a href=&quot;https://www.linkedin.com/in/philarcher&quot; id=&quot;link-id0x2aabe103dba8&quot;&gt;Phil Archer&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web_Consortium&quot; id=&quot;link-id0x2aabe0eb90d8&quot;&gt;W3C&lt;/a&gt;, entitled &amp;quot;&lt;a href=&quot;http://www.semantics.cc/programme/talks/archer-10-years-of-archivement/&quot; id=&quot;link-id0x2aabe01e42d8&quot;&gt;10 Years of Achievement&lt;/a&gt;.&amp;quot; After my talk, in the questions, Phil brought up the matter of the upcoming W3C work group charter on &lt;a href=&quot;http://www.w3.org/2014/data-shapes/charter&quot; id=&quot;link-id0x2aab7f3ae098&quot;&gt;RDF Data Shapes&lt;/a&gt;. We had discussed this already at the reception the night before and I will here give some ideas about this.&lt;/p&gt; &lt;p&gt;After the talk, my answer was that naturally the existence of something that expressed the same sort of thing as &lt;a href=&quot;http://dbpedia.org/resource/Data_definition_language&quot; id=&quot;link-id0x2aab7f24cac8&quot;&gt;SQL DDL&lt;/a&gt;, with W3C backing, can only be a good thing and will give the structure awareness work by OpenLink in Virtuoso and probably others a more official seal of approval. Quite importantly, this will be a facilitator of interoperability and will raise this from a product specific optimization trick to a respectable, generally-approved piece of functionality.&lt;/p&gt; &lt;p&gt;This is the general gist of the matter and can hardly be otherwise. But underneath is a whole world of details, which we discussed at the reception.&lt;/p&gt; &lt;p&gt;Phil noted that there was controversy around whether a lightweight &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2aabe3a08a68&quot;&gt;OWL&lt;/a&gt;-style representation or &lt;a href=&quot;http://www.w3.org/Submission/spin-overview/&quot; id=&quot;link-id0x2aabe0a74268&quot;&gt;SPIN&lt;/a&gt; should function as the basis for data shapes.&lt;/p&gt; &lt;p&gt;Phil stated in the keynote that the W3C considered the RDF series of standards as good and complete, but would still have working groups for filling in gaps as these came up. This is what I had understood from my previous talks with him at the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aabe1cf4988&quot;&gt;Linking Geospatial Data&lt;/a&gt; workshop in London earlier this year.&lt;/p&gt; &lt;p&gt;So, against this backdrop, as well as what I had discussed with &lt;a href=&quot;https://www.linkedin.com/in/ralphhodgson&quot; id=&quot;link-id0x2aabe08d3d68&quot;&gt;Ralph Hodgson&lt;/a&gt; of &lt;a href=&quot;https://www.linkedin.com/company/topquadrant/&quot; id=&quot;link-id0x2aab7ed73958&quot;&gt;Top Quadrant&lt;/a&gt; at a previous &lt;a href=&quot;http://www.ldbc.eu:8090/display/TUC/Fourth+TUC+Meeting,+April+2014&quot; id=&quot;link-id0x2aab7f44daf8&quot;&gt;LDBC TUC meeting&lt;/a&gt; in Amsterdam, SPIN seems to me a good fit.&lt;/p&gt; &lt;p&gt;Now, it turns out that we are talking about two different use cases. Phil said that the RDF Data Shapes use case was about making explicit what applications required of data. For example, all products should have a unit price, and this should have one value that is a number.&lt;/p&gt; &lt;p&gt;The SPIN proposition on the other hand, as Ralph himself put it in the &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab7fd3d158&quot;&gt;LDBC&lt;/a&gt; meeting, is providing to the linked data space functionality that roughly corresponds to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabe06304d8&quot;&gt;SQL&lt;/a&gt; views. Well, this is one major point, but SPIN involves more than this.&lt;/p&gt; &lt;p&gt;So, is it DDL or views? These are quite different. I proposed to Phil that there was in fact little point in fighting over this; best to just have two profiles.&lt;/p&gt; &lt;p&gt;To be quite exact, even SQL DDL equivalence is tricky, since enforcing this requires a &lt;a href=&quot;http://dbpedia.org/resource/Database&quot; id=&quot;link-id0x2aabe0820508&quot;&gt;DBMS&lt;/a&gt;; consider, for instance, foreign key and check constraints. At the reception, Phil stressed that SPIN was certainly good but since it could not be conceived without a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aab7ded80f8&quot;&gt;SPARQL&lt;/a&gt; implementation, it was too heavy to use as a filter for an application that, for example, just processed a stream of triples.&lt;/p&gt; &lt;p&gt;The point, as I see it, is that there is a wish to have data shape enforcement, at least to a level, in a form that can apply to a stream without random access capability or general purpose query language. This can make sense for some big data style applications, like an &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2aab7ffe64e8&quot;&gt;ETL&lt;/a&gt;-stage pre-cooking of data before the application. Applications mostly run against a DBMS, but in some cases, this could be a specialized map-reduce or graph analytics job also, so no low cost random access.&lt;/p&gt; &lt;p&gt;My own take is that views are quite necessary, especially for complex query; this is why Virtuoso has the SPARQL macro extension. This will do, by query expansion, a large part of what general purpose inference will do, except for complex recursive cases. Simple recursive cases come down to transitivity and still fit the profile. SPIN is a more generic thing, but has a large intersection with SPARQL macro functionality.&lt;/p&gt; &lt;p&gt;My other take is that structure awareness needs a way of talking about structure. This is a use case that is clearly distinct from views.&lt;/p&gt; &lt;p&gt;A favorite example of mine is the business rule that a good customer is one that has ordered more than 5 times in the last year, for a total of more than so much, and has no returns or complaints. This can be stated as a macro or SPIN rule with some aggregates and existences. This cannot be stated in any of the OWL profiles. When presented with this, Phil said that this was not the use case. Fair enough. I would not want to describe what amounts to SQL DDL in these terms either.&lt;/p&gt; &lt;p&gt;A related topic that has come up in other conversations is the equivalent of the trigger. One use case of this is enforcement of business rules and complex access rights for updates. So, we see that the whole &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2aabe07f7ac8&quot;&gt;RDBMS&lt;/a&gt; repertoire is getting recreated.&lt;/p&gt; &lt;p&gt;Now, talking from the viewpoint of the structure-aware RDF store, or the triple-stream application for that matter, I will outline some of what data shapes should do. The triggers and views matter is left out, here.&lt;/p&gt; &lt;p&gt;The commonality of bulk-load, ETL, and stream processing, is that they should not rely on arbitrary database access. This would slow them down. Still, they must check the following sorts of things:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Data types &lt;/li&gt; &lt;li&gt; Presence of some required attributes &lt;/li&gt; &lt;li&gt; Cardinality — e.g., a person has no more than one date of birth &lt;/li&gt; &lt;li&gt; Ranges — e.g., a product&amp;#39;s price is a positive number; gender is male/female; etc. &lt;/li&gt; &lt;li&gt; Limited referential integrity — e.g., a product has one product type, and this is a subject of the RDF type product type. &lt;/li&gt; &lt;li&gt; Limited intra-subject checks — e.g.. delivery date is greater-than-or-equal-to ship date. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All these checks depend on previous triples about the subject; for example, these checks may be conditional on the subject having a certain RDF type. In a data model with a join per attribute, some joining cannot be excluded. Checking conditions that can be resolved one triple at a time is probably not enough, at least not for the structure-aware RDF store case.&lt;/p&gt; &lt;p&gt;But, to avoid arbitrary joins which would require a DBMS, we have to introduce a processing window. The triples in the window must be cross-checkable within the window. With RDF set semantics, some reference data may be replicated among processing windows (e.g., files) with no ill effect.&lt;/p&gt; &lt;p&gt;A version of foreign key declarations is useful. To fit within a processing window, complete enforcement may not be possible but the declaration should still be possible, a little like in SQL where one can turn off checking.&lt;/p&gt; &lt;p&gt;In SQL, it is conventional to name columns by prefixing them with an abbreviation of the table name. All the TPC schemas are like that, for example. Generally in coding, it is good to prefix names with data type or subsystem abbreviation. In RDF, this is not the practice. For reuse of vocabularies, where a property may occur in anything, the namespace or other prefix denotes where the property comes from, not where it occurs.&lt;/p&gt; &lt;p&gt;So, in TPC-H, &lt;code&gt;l_partkey&lt;/code&gt; and &lt;code&gt;ps_partkey&lt;/code&gt; are both foreign keys that refer to part, plus that &lt;code&gt;l_partkey&lt;/code&gt; is also a part of a composite foreign key to &lt;code&gt;partsupp&lt;/code&gt;. By RDF practices, these would be called &lt;code&gt;rdfh:hasPart&lt;/code&gt;. So, depending on which subject type we have, &lt;code&gt;rdfh:hasPart&lt;/code&gt; is 30:1 or 4:1. (distinct subjects:distinct objects) Due to this usage, the property&amp;#39;s features are not dependent only on the property, but on the property plus the subject/object where it occurs.&lt;/p&gt; &lt;p&gt;In the relational model, when there is a parent and a child item (one to many), the child item usually has a composite key prefixed with the parent&amp;#39;s key, with a distinguishing column appended, e.g., &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt;. In RDF, this is &lt;code&gt;rdfh:hasOrder&lt;/code&gt; as a property of the &lt;code&gt;lineitem&lt;/code&gt; subject. In SQL, there is no single part &lt;code&gt;lineitem&lt;/code&gt; subject at all, but in RDF, one must be made since everything must be referenceable with a single value. This does not have to matter very much, as long as it is possible to declare that &lt;code&gt;lineitems&lt;/code&gt; will be primarily accessed via their order. It is either this or a scan of all &lt;code&gt;lineitems&lt;/code&gt;. Sometimes a group of &lt;code&gt;lineitems&lt;/code&gt; are accessed by the composite foreign key of &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt;. There could be a composite index on these. Furthermore, for each &lt;code&gt;l_partkey, l_suppkey &lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt; there exists a &lt;code&gt;partsupp&lt;/code&gt;. In an RDF translation, the &lt;code&gt;rdfh:hasPart&lt;/code&gt; and &lt;code&gt;rdfh:hasSupplier&lt;/code&gt;, when they occur in a &lt;code&gt;lineitem&lt;/code&gt; subject, specify exactly one subject of type &lt;code&gt;partsupp&lt;/code&gt;. When they occur in a &lt;code&gt;partsupp&lt;/code&gt; subject, they are unique as a pair. Again, because names are not explicit as to where they occur and what role they play, the referential properties do not depend only on the name, but on the name plus included data shape. Declaring and checking all this is conventional in the mainstream and actually useful for query optimization also.&lt;/p&gt; &lt;p&gt;Take the other example of a social network where the &lt;code&gt;foaf:knows&lt;/code&gt; edge is qualified by a date when this edge was created. This may be by reification, or more usually by an &amp;quot;entitized&amp;quot; relationship where the &lt;code&gt;foaf:knows&lt;/code&gt; is made into a subject with the persons who know each other and the date of acquaintance as properties. In a SQL schema, this is a key &lt;code&gt;person1, person2 -&amp;gt; date&lt;/code&gt;. In RDF, there are two join steps to go from &lt;code&gt;person1&lt;/code&gt; to &lt;code&gt;person2&lt;/code&gt;; in SQL, 1. This is eliminated by saying that the &lt;code&gt;foaf:knows&lt;/code&gt; entity is usually referenced by the person1 Object or person2 Object, not the Subject identifier of the &lt;code&gt;foaf:knows&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This allows making the physical storage by &lt;code&gt;O, S, G -&amp;gt; O2, O3, …&lt;/code&gt;. A secondary index with &lt;code&gt;S, G, O&lt;/code&gt; still allows access by the mandatory subject identifier. In SQL, a structure like this is called a clustered table. In other words, the row is arranged contiguous with a key that is not necessarily the primary key.&lt;/p&gt; &lt;p&gt;So, identifying a clustering key in RDF can be important.&lt;/p&gt; &lt;p&gt;Identifying whether there are value-based accesses on a given &lt;code&gt;Object&lt;/code&gt; without making the &lt;code&gt;Object&lt;/code&gt; a clustering key is also important. This is equivalent to creating a secondary index in SQL. In the tradition of homogenous access by anything, such indexing may be on by default, except if the property is explicitly declared of low cardinality. For example, an index on gender makes no sense. The same is most often true of &lt;code&gt;rdfs:type&lt;/code&gt;. Some properties may have many distinct values (e.g., price), but are still not good for indexing, as this makes for the extreme difference in load time between SQL and the all-indexing RDF.&lt;/p&gt; &lt;p&gt;Identifying whether a column will be frequently updated is another useful thing. This will turn off indexing and use an easy-to-update physical representation. Plus, properties which are frequently updated are best put physically together. This may, for example, guide the choice between row-wise and column-wise representation. A customer&amp;#39;s account balance and orders year-to-date would be an example of such properties.&lt;/p&gt; &lt;p&gt;Some short string valued properties may be frequently returned or used as sorting keys. This requires accessing the literal via an ID in the dictionary table. Non-string literals, numbers, dates, etc., are always inlined (at least in most implementations), but strings are a special question. &lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aabe20460e8&quot;&gt;Bigdata&lt;/a&gt; and early versions of Virtuoso would inline short ones; later versions of Virtuoso would not. So specifying, per property/class combination, a length limit for an inlined string is very high gain and trivial to do. The &lt;a href=&quot;http://wifo5-03.informatik.uni-mannheim.de/bizer/berlinsparqlbenchmark/&quot; id=&quot;link-id0x2aabe1f9b678&quot;&gt;BSBM&lt;/a&gt; explore score at large scales can get a factor of 2 gain just from inlining one label. BSBM is out of its league here, but this is still really true and yields benefits across the board. The simpler the application, the greater the win.&lt;/p&gt; &lt;p&gt;If there are foreign keys, then data should be loaded with the referenced entities first. This makes dimensional clustering possible at load time. If the foreign key is frequently used for accessing the referencing item (for example, if customers are often accessed by country), then loading customers so that customers of the same country end up next to each other can result in great gains. The same applies to a time dimension, which in SQL is often done as a dimension table, but rarely so in linked data. Anyhow, if date is a frequent selection criterion, physically putting items in certain date ranges together can give great gains.&lt;/p&gt; &lt;p&gt;The trick here is not necessarily to index on date, but rather to use zone maps (aka min/max index). If nearby values are together, then just storing a min-max value for thousands of consecutive column values is very compact and fast to check, provided that the rows have nearby values. &lt;a href=&quot;http://www.actian.com&quot; id=&quot;link-id0x2aabe0c098b8&quot;&gt;Actian&lt;/a&gt; Vector&amp;#39;s (&lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aab7fc02998&quot;&gt;VectorWise&lt;/a&gt;) prowess in TPC-H is in part from smart use of date order in this style.&lt;/p&gt; &lt;p&gt;To recap, the data shapes desiderata from the viewpoint of guiding physical storage is as follows:&lt;/p&gt; &lt;p&gt;(I will use &amp;quot;data shape&amp;quot; to mean &amp;quot;characteristic set,&amp;quot; or &amp;quot;set of Subjects subject to the same set of constraints.&amp;quot; A Subject belonging to a data shape may be determined either by its &lt;code&gt;rdfs:type&lt;/code&gt; or by the fact of it having, within the processing window, all or some of a set of properties.)&lt;/p&gt; &lt;ul&gt; &lt;li&gt; All normal range, domain, cardinality, optionality, etc. — Specifically, declaring something as single valued (as with SQL&amp;#39;s &lt;code&gt;UNIQUE constraint) and mandatory (as with SQL&amp;#39;s &lt;code&gt;NOT NULL&lt;/code&gt; constraint) is good. &lt;/code&gt; &lt;/li&gt; &lt;li&gt; Primary access path — The Properties whose Objects are dominant access criteria is important &lt;/li&gt; &lt;li&gt; No-index — Declare that no index will be made on the Object of a Property within a data shape. &lt;/li&gt; &lt;li&gt; Inlined string — String values of up to so many characters in this data shape are inlined &lt;/li&gt; &lt;li&gt; Clustering key — The Subject identifiers will be picked to be correlated with the Object of this Property in this data shape. This can be qualified by a number of buckets (e.g., if dates are from 2000 to 2020, then this interval may be 100 buckets), with an exception bucket for out of range values. &lt;/li&gt; &lt;li&gt; No full text index — A string value will not need to be full text indexed in this Property even if full text indexing is generally on. &lt;/li&gt; &lt;li&gt; Full text index desired — This means that if the value of the property is a string, then the row must be locatable via this string. The string may or may not be inlined, but an index will exist on the literal ID of the string, e.g., POSG. &lt;/li&gt; &lt;li&gt; Co-location — This is akin to clustering but specifies, for a high cardinality Object, that the Subject identifier should be picked to fall in the same partition as the Object. The Object is typically a parent of the Subject being loaded; for example, the containing assembly of a sub-assembly. Traversing the assembly created in this way will be local on a scale-out system. This can also apply to geometries or text values: If primary access is by text or geo index, then the metadata represented as triples should be in the same partition as the entry in the full text/geo index. &lt;/li&gt; &lt;li&gt; Update group — A set of properties that will often change together. Implies no index and some form of co-location, plus update-friendly physical representation. Many update groups may exist, in which case they may or may not be collocated. &lt;/li&gt; &lt;li&gt; Composite foreign/primary key — A data shape can have a multicolumn foreign key, e.g., &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt; with the matching primary key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt; in &lt;code&gt;partsupp&lt;/code&gt;. This can be used for checking and for query optimization: Looking at &lt;code&gt;l_partkey&lt;/code&gt; and &lt;code&gt;l_suppkey&lt;/code&gt; as independent properties, the guess would be that there hardly ever exists a &lt;code&gt;partsupp&lt;/code&gt;, whereas one does always exist. The XML standards stack also has a notion of a composite key for random access on multiple attributes. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These things have the semantic of &amp;quot;hint for physical storage&amp;quot; and may all be ignored without effect on semantics, at least if the data is constraint-compliant to start with.&lt;/p&gt; &lt;p&gt;These things will have some degree of reference implementation through the evolution of Virtuoso structure awareness, though not necessarily immediately. These are, to the semanticist, surely dirty low-level disgraceful un-abstractions, some of the very abominations the early semanticists abhorred or were blissfully ignorant of when they first raised their revolutionary standard.&lt;/p&gt; &lt;p&gt;Still, these are well-established principles of the broader science of database. SQL does not standardize some of these, nor does it have much need to, as the use of these features is system-specific. The support varies widely and the performance impacts are diverse. However, since RDF excels as a reference model and as a data interchange format, giving these indications as hints to back-end systems cannot hurt, and can make a difference of night and day in load and query time.&lt;/p&gt; &lt;p&gt;As Phil Archer said, the idea of RDF Data Shapes is for an application to say that &amp;quot;it will barf if it gets data that is not like this.&amp;quot; An extension is for the data to say what the intended usage pattern is so that the system may optimize for this.&lt;/p&gt; &lt;p&gt;All these things may be learned from static analysis and workload traces. The danger of this is over-fitting a particular profile. This enters a gray area in benchmarking. For big data, if RDF is to be used as the logical model and the race is about highest absolute performance, never mind what the physical model ends up being, all this and more is necessary. And if one is stretching the envelope for scale, the race is always about highest absolute performance. For this reason, these things will figure at the leading edge with or without standardization. I would say that the build-up of experience in the RDBMS world is sufficient for these things to be included as hints in a profile of data shapes. The compliance cost will be nil if these are ignored, so for the W3C, these will not make the implementation effort for compliance with an eventual data shapes recommendation prohibitive.&lt;/p&gt; &lt;p&gt;The use case is primarily the data warehouse to go. If many departments or organizations publish data for eventual use by their peers, users within the organization may compose different combinations of extractions for different purposes. Exhaustive indexing of everything by default makes the process slow and needlessly expensive, as we have seen. Much of such exploration is bounded by load time. Federated approaches for analytics are just not good, even though they may work for infrequent lookups. If datasets are a commodity to be plugged in and out, the load and query investment must be minimized without the user/DBA having to run workload analysis and manual schema optimization. Therefore, bundling guidelines such as these with data shapes in a dataset manifest can do no harm and can in cases provide 10-50x gains in load speeds and 2-4x in space consumption, not to mention unbounded gains in query time, as good and bad plans easily differ by 10-100x, especially in analytics.&lt;/p&gt; &lt;p&gt;So, here is the pitch: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; Dramatic gains in ad hoc user experience &lt;/li&gt; &lt;li&gt; Minimal effort by data publishers, as much of the physical guidelines can be made from workload trace and dataset; the point is that the ad hoc user does not have to do this. &lt;/li&gt; &lt;li&gt; Great optimization potential for system vendors; low cost for initial compliance &lt;/li&gt; &lt;li&gt; Better understanding of the science of performance by the semantic community &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1813&quot; id=&quot;link-id0x2aabe1f87ad8&quot;&gt;SEMANTiCS 2014 (part 1): Keynote&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1815&quot; id=&quot;link-id0x1b13a308&quot;&gt;SEMANTiCS 2014 (part 3): Conversation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-10-29T13:31:37.019897-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 1 of 3): Keynote</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-09-08#1813</atom:id>
  <atom:published>2014-09-08T17:17:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was invited to give a keynote at &lt;a href=&quot;http://www.semantics.cc&quot; id=&quot;link-id0x2aab7f6caaf8&quot;&gt;SEMANTiCS 2014&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Leipzig&quot; id=&quot;link-id0x2aab7f8e74e8&quot;&gt;Leipzig&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x2aab7f3a8128&quot;&gt;Germany&lt;/a&gt; last Thursday. I will here recap some of the main points, and comment on some of the ensuing controversy. The talk was initially titled &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014&quot; id=&quot;link-id0x2aab7f3a81c8&quot;&gt;Virtuoso, the Prometheus of RDF&lt;/a&gt;&lt;/i&gt;. Well, mythical Prometheus did perform a service but ended up paying for it. Still, the mythical reference is sometimes used when talking of major breakthroughs and big-gain ambitions. In the &lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/2&quot; id=&quot;link-id0x2aab7f352808&quot;&gt;first slide&lt;/a&gt;, I changed it to &lt;a href=&quot;http://dbpedia.org/resource/Linked_data&quot; id=&quot;link-id0x2aab7f2b8158&quot;&gt;Linked Data&lt;/a&gt; at Dawn, which is less product specific and more a reflection on the state of the linked data enterprise at large.&lt;/p&gt; &lt;p&gt;The first part of the talk was under the heading of the promise and the practice. The promise we know well and find no fault with: Schema-last-ness, persistent unique identifiers, self-describing data, some but not too much inference. The applications usually involve some form of integration and often have a mix of strictly structured content with semi-structured or textual content.&lt;/p&gt; &lt;p&gt;These values are by now uncontroversial and embraced by many; however, most instances of this embracing do not occur in the context of RDF as such. For example, the big online systems on the web: all have some schema-last (key-value) functionality. Applications involving long-term data retention have diverse means of having persistent IDs and self description, from &lt;i&gt;UUIDs&lt;/i&gt; to having the table name in a column so that one can tell where a CSV dump came from.&lt;/p&gt; &lt;p&gt;The practice involves competing with diverse alternative technologies: SQL, key-value, information retrieval (often &lt;a href=&quot;http://dbpedia.org/resource/Lucene&quot; id=&quot;link-id0x2aab7f3529e8&quot;&gt;Lucene&lt;/a&gt;-derived). In some instances, graph databases occur as alternatives: Young semanticist, do or die.&lt;/p&gt; &lt;p&gt;In this race, linked data is often the prettiest and most flexible, but gets a hit on different aspects of performance and scalability. This is a database gig, and database is a performance game; make no mistake.&lt;/p&gt; &lt;p&gt;After these preliminaries we come to the &lt;i&gt;&amp;quot;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/9&quot; id=&quot;link-id0x2aab7ef90508&quot;&gt;RDF tax&lt;/a&gt;,&amp;quot;&lt;/i&gt; or the more or less intrinsic overheads of describing all as triples. The word &amp;quot;triple&amp;quot; is used by habit. In fact, we nearly always talk about quads, i.e., subject-predicate-object-graph (&lt;code&gt;SPOG&lt;/code&gt;). The next slide is provocatively titled the &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/10&quot; id=&quot;link-id0x2aab7f63ff58&quot;&gt;Bane of the Triple&lt;/a&gt;,&lt;/i&gt; and is about why having all as triples is, on the surface, much like relational, except it makes life hard, where tables make it at least manageable, if still not altogether trivial.&lt;/p&gt; &lt;p&gt;The very first statement on &lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/9&quot; id=&quot;link-id0x2aab7f0e8098&quot;&gt;the tax slide&lt;/a&gt; reads &amp;quot;90% of bad performance comes from non-optimal query plans.&amp;quot; If one does triples in the customary way (i.e., a table of quads plus dictionary tables to map URIs and literal strings to internal IDs), one incurs certain fixed costs.&lt;/p&gt; &lt;p&gt;These costs are deemed acceptable by users who deploy linked data. If these costs were not acceptable, the proof of concept would have already disqualified linked data.&lt;/p&gt; &lt;p&gt;The support cases that come my way are nearly always about things taking too much time. Much less frequently, are these about something unambiguously not working. Database has well defined semantics, so whether something works or not is clear cut.&lt;/p&gt; &lt;p&gt;So, support cases are overwhelmingly about query optimization. The problems fall in two categories:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; The plan is good in the end, but it takes much longer to make the plan than to execute it. &lt;/li&gt; &lt;li&gt; The plan either does the wrong things or does things in the wrong order, but produces a correct result. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Getting no plan at all or getting a clearly wrong result is much less frequent.&lt;/p&gt; &lt;p&gt;If the RDF overheads incurred with a good query plan were show stoppers, the show would have already stopped.&lt;/p&gt; &lt;p&gt;So, let&amp;#39;s look at this in more detail; then we will talk about the fixed overheads.&lt;/p&gt; &lt;p&gt;The join selectivity of triple patterns is correlated. Some properties occur together all the time; some occur rarely; some not at all. Some property values can be correlated, i.e., order number and order date. Capturing these by sampling in a multicolumn table is easy; capturing this in triples would require doing the join in the cost model, which is not done since it would further extend compilation times. When everything is a join, selectivity estimation errors build up fast. When everything is a join, the space of possible graph query plans explodes as opposed to tables; thus, while the full plan space can be covered with 7 tables, it cannot be covered with 18 triple patterns. This is not factorial (number of permutations). For different join types (index/hash) and the different compositions of the hash build side, this is much worse, in some nameless outer space fringe of non-polynomiality.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aab7f352ba8&quot;&gt;TPC-H&lt;/a&gt; can be run with success because the cost model hits the right plan every time. The primary reason for this is the fact that the schema and queries unambiguously suggest the structure, even without foreign key declarations. The other reason is that with a handful of tables, all plans can be reviewed, and the cost model reliably tells how many rows will result from each sequence of operations.&lt;/p&gt; &lt;p&gt;Try this with triples; you will know what I mean.&lt;/p&gt; &lt;p&gt;Now, some people have suggested purely rule-based models of SPARQL query compilation. These are arguably faster to run and more predictable. But the thing that must be done, yet will not be done with these, is the right trade-off between index and hash. This is the crux of the matter, and without this, one can forget about anything but lookups. The choice depends on reliable estimation of cardinality (number of rows, number of distinct keys) on either side of the join. Quantity, not pattern matching.&lt;/p&gt; &lt;p&gt;Well, many linked data applications are lookups. The graph database API world is sometimes attractive because it gives manual control. Map reduce in the analytical space is sometimes attractive for the same reason.&lt;/p&gt; &lt;p&gt;On the other hand, query languages also give manual control, but then this depends on system specific hints and cheats. People are often black and white: Either all declarative or all imperative. We stand for declarative, but still allow physical control of plan, like most DBMS.&lt;/p&gt; &lt;p&gt;To round off, I will give a concrete example:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { ?thing rdfs:label ?lbl . ?thing dc:title ?title . ?lbl bif:contains &amp;quot;gizmo&amp;quot; . ?title bif:contains &amp;quot;widget&amp;quot; . ?thing a xx:Document . ?thing dc:date ?dt . FILTER ( ?dt &amp;gt; &amp;quot;2014-01-01&amp;quot;^^xsd:date ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;There are two full text conditions, one date, and one class, all on the same subject. How do you do this? Most selective text first, then get the data and check, then check the second full text given the literal and the condition, then check the class? Wrong. If widgets and gizmos are both frequent and most documents new, this is very bad because using a text index to check for a specific ID having a specific string is not easily vectorable. So, the right plan is: Take the more selective text expression, then check the date and class for the results, put the &lt;code&gt;&lt;i&gt;?things&lt;/i&gt;&lt;/code&gt; in a hash table. Then do the less selective text condition, and drop the ones that are not in the hash table. Easily 10x better. Simple? In the end yes, but you do not know this unless you know the quantities.&lt;/p&gt; &lt;p&gt;This gives the general flavor of the problem. Doing this with TPC-H in RDF is way harder, but you catch my drift.&lt;/p&gt; &lt;p&gt;Each individual instance is do-able. Having closer and closer alignment between reality and prediction will improve the situation indefinitely, but since the space is as good as infinite there cannot be a guarantee of optimality except for toy cases.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Gordian_Knot&quot; id=&quot;link-id0x2aab7f4df478&quot;&gt;Gordian Knot&lt;/a&gt; shall not be defeated with pincers but by the sword.&lt;/p&gt; &lt;p&gt;We will come to this in a bit.&lt;/p&gt; &lt;p&gt;Now, let us talk of the fixed overheads. The embarrassments are in the query optimization domain; the daily grind, relative cost, and provisioning are in this one.&lt;/p&gt; &lt;p&gt;The overheads come from:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Indexing everything &lt;/li&gt; &lt;li&gt; Having literals and URI strings via dictionary &lt;/li&gt; &lt;li&gt; Having a join for every attribute &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These all fall under the category of having little to no physical design room.&lt;/p&gt; &lt;p&gt;In the indexing everything department, we load 100 GB TPC-H in 15 minutes in SQL with ordering only on primary keys and almost no other indexing. The equivalent with triples is around 12 hours. This data can be found on this blog (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab7f352c08&quot;&gt;TPC-H series&lt;/a&gt; and &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1769&quot; id=&quot;link-id0x2aab7f3a81e8&quot;&gt;Meeting the Challenges of Linked Data in the Enterprise&lt;/a&gt;&lt;/i&gt;). This is on the order of confusing a screwdriver with a hammer. If the nail is not too big, the wood not too hard, and you hit it just right — the nail might still go in. The RDF bulk load is close to the fastest possible given the general constraints of what it does. The same logic is used for the record-breaking 15 minutes of TPC-H bulk load, so the code is good. But indexing everything is just silly.&lt;/p&gt; &lt;p&gt;The second, namely the dictionary of URIs and literals, is a dual edge. I talked to &lt;a href=&quot;http://www.linkedin.com/pub/bryan-thompson/30/390/54b&quot; id=&quot;link-id0x2aab7f0e8058&quot;&gt;Bryan Thompson&lt;/a&gt; of &lt;a href=&quot;http://www.systap.com/about&quot; id=&quot;link-id0x2aab7f6cacd8&quot;&gt;SYSTAP&lt;/a&gt; (&lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aab7f3a3df8&quot;&gt;Bigdata&lt;/a&gt; RDF store) in &lt;a href=&quot;http://dbpedia.org/page/Washington,_D.C.&quot; id=&quot;link-id0x2aab7f290278&quot;&gt;D.C.&lt;/a&gt; at the &lt;a href=&quot;http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?reload=true&amp;amp;punumber=6226952&quot; id=&quot;link-id0x2aab7fa3e688&quot;&gt;ICDE&lt;/a&gt; there. He said that they do short strings inline and long ones via dictionary. I said we used to do the same but stopped in the interest of better compression. What is best depends on workload and working-set-to-memory ratio. But if you must make the choice once and for all, or at least as a database-wide global setting, you are between a rock and a hard place. Physical vs. logical design, again.&lt;/p&gt; &lt;p&gt;The other aspect of this is the applications that do regexps on URI strings or literals. Doing this is like driving a Formula 1 race in reverse gear. Use a text index. Always. This is why most implementations have one even though SPARQL itself makes no provisions for this. If you really need regexps, and on supposedly opaque URIs at that, tokenize them and put them in a text index as a text literal. Or if an inverted-file-word index is really not what you need, use a trigram one. So far, nobody has wanted one hard enough for us to offer this, even though this is easy enough. But special indices for special data types (e.g., chemical structure) are sometimes wanted, and we have a generic solution for all this, to be introduced shortly on this blog. Again, physical design.&lt;/p&gt; &lt;p&gt;I deliberately name the self-join-per-attribute point last, even though this is often the first and only intrinsic overhead that is named. True, if the physical model is triples, each attribute is a join against the triple table. Vectored execution and right use of hash-join help, though. The Star Schema Benchmark SQL to SPARQL gap is only 2.5x, as &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aab7eebb0b8&quot;&gt;documented last year on this blog&lt;/a&gt;. This makes SPARQL win by 100+x against &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aab7fa3e6e8&quot;&gt;MySQL&lt;/a&gt; and lose by only 0.8x against column store pioneer &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x2aab7f82e4c8&quot;&gt;MonetDB&lt;/a&gt;. Let it be said that this is so far the best case and that the gap is wider in pretty much all other cases. This gap is well and truly due to the self-join matter, even after the self-joins are done vectored, local, ordered; in one word, &lt;i&gt;right.&lt;/i&gt; The literal and URI translation matter plays no role here. The needless indexing hurts at load but has no effect at query time, since none of the bloat participates in the running. Again, physical design.&lt;/p&gt; &lt;p&gt;Triples are done right, so?&lt;/p&gt; &lt;p&gt;In the summer of 2013, after the Star Schema results, it became clear that maybe further gains could be had and query optimization made smoother and more predictable, but that these would be paths of certain progress but with diminishing returns per effort. No, not the pincers; give me the sword. So, between fall 2013 and spring 2014, aside from doing diverse maintenance, I did the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab7f32ca38&quot;&gt;TPC-H series&lt;/a&gt;. This is the proficiency run for big league databases; the America&amp;#39;s Cup, not a regatta on the semantic lake.&lt;/p&gt; &lt;p&gt;Even if the audience is principally Linked Data, the baseline must be that of the senior science of SQL.&lt;/p&gt; &lt;p&gt;It stands to reason and has been demonstrated by extensive experimentation at &lt;a href=&quot;http://www.cwi.nl&quot; id=&quot;link-id0x2aab7f589578&quot;&gt;CWI&lt;/a&gt; that RDF data, by and large, has structure. This structure will carry linked data through the last mile to being a real runner against the alternative technologies (SQL, IR, key value) mentioned earlier.&lt;/p&gt; &lt;p&gt;The operative principles have been mentioned earlier and are set forth on the slides. In forthcoming articles I will display some results.&lt;/p&gt; &lt;p&gt;One important proposal for structure awareness was by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x2aab7f589318&quot;&gt;Thomas Neumann&lt;/a&gt; in an &lt;a href=&quot;https://domino.mpi-inf.mpg.de/intranet/ag5/ag5publ.nsf/0/AD3DBAFA6FB90DD2C1257593002FF3DF/$file/rdf3x.pdf&quot; id=&quot;link-id0x2aab7ec91688&quot;&gt;RDF3X paper introducing characteristic sets&lt;/a&gt;. There, the application was creation of more predictable cost estimates. Neumann correctly saw this as possibly the greatest barrier to predictable RDF performance. &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aab7f32cb58&quot;&gt;Peter Boncz&lt;/a&gt; and I discussed the use of this for physical optimization once when driving back to &lt;a href=&quot;http://dbpedia.org/resource/Amsterdam&quot; id=&quot;link-id0x2aab7f589378&quot;&gt;Amsterdam&lt;/a&gt; from a &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2aab7eebaff8&quot;&gt;LOD2&lt;/a&gt; review in &lt;a href=&quot;http://dbpedia.org/resource/Luxembourg&quot; id=&quot;link-id0x2aab7f589478&quot;&gt;Luxembourg&lt;/a&gt;. &lt;a href=&quot;http://homepages.cwi.nl/~duc/&quot; id=&quot;link-id0x2aab7f589498&quot;&gt;Pham Minh Duc&lt;/a&gt; of CWI did much of the schema discovery research, documented in the now published LOD2 book (&lt;i&gt;&lt;a href=&quot;http://link.springer.com/book/10.1007%2F978-3-319-09846-3&quot; id=&quot;link-id0x2aab7f589538&quot;&gt;Linked Open Data -- Creating Knowledge Out of Interlinked Data&lt;/a&gt;&lt;/i&gt;). The initial Virtuoso implementation had to wait for the TPC-H and general squeezing of the quads model to be near complete. It will likely turn out that the greatest gain of all with structure awareness will be bringing optimization predictability to SQL levels. This will open the whole bag of tricks known to data warehousing to safe deployment for linked data. Of course, much of this has to do with exploiting physical layout; hence it also needs the physical model to be adapted. Many of these techniques have high negative impact if used in the wrong place; hence the cost model must guess right. But they work in SQL and, as per Thomas Neumann&amp;#39;s initial vision, there is no reason why these would not do so in a schema-less model if adapted in a smart enough manner.&lt;/p&gt; &lt;p&gt;All this gives rise to some sociological or psychological observations. &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x2aab7f5892f8&quot;&gt;Jens Lehmann&lt;/a&gt; asked me why now, why not earlier; after all, over the years many people have suggested property tables and other structured representations. This is now because there is no further breakthroughs within an undifferentiated physical model.&lt;/p&gt; &lt;p&gt;For completeness, we must here mention other approaches to alternative, if still undifferentiated, physical models. A number of research papers mention memory-only, pointer-based (i.e., no index, no hash-join) implementations of triples or quads. Some of these are on graph processing frameworks, some stand-alone. &lt;a href=&quot;http://www.yarcdata.com&quot; id=&quot;link-id0x2aab7f589258&quot;&gt;Yarc Data&lt;/a&gt; is a commercial implementation that falls in this category. These may have higher top speeds than column stores, even after all vectoring and related optimizations. However the space utilization is perforce larger than with optimum column compression and this plus the requirement of 100% in memory makes these more expensive to scale. The linked data proposition is usually about integration, and this implies initially large data even if not all ends up being used.&lt;/p&gt; &lt;p&gt;The graph analytics, pointer-based item will be specially good for a per-application extraction, as suggested by &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Corporation&quot; id=&quot;link-id0x2aab7f5893f8&quot;&gt;Oracle&lt;/a&gt; in their paper at &lt;a href=&quot;http://event.cwi.nl/grades2013/&quot; id=&quot;link-id0x2aab7f589518&quot;&gt;GRADES 13&lt;/a&gt;. No doubt this will come under discussion at &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab7f589558&quot;&gt;LDBC&lt;/a&gt;, where Oracle Labs is now a participant.&lt;/p&gt; &lt;p&gt;But back to physical model. What we have in mind is relational column store — multicolumn-ordered column-wise compressed tables — a bit like &lt;a href=&quot;http://www.vertica.com&quot; id=&quot;link-id0x2aab7f589598&quot;&gt;Vertica&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab7f589918&quot;&gt;Virtuoso&lt;/a&gt; in SQL mode for the regular parts and quads for the rest. What is big is regular, since a big thing perforce comes from something that happens a lot, like click streams, commercial transactions, instrument readings. For the 8-lane-motorway of regular data, you get the F1 racer with the hardcore best in column store tech. When the autobahn ends and turns into the mountain trail, the engine morphs into a dirt bike.&lt;/p&gt; &lt;p&gt;This is complex enough, and until all the easy gains have been extracted from quads, there is little incentive. Plus this has the prerequisite of quads done right, plus the need for top of the line relational capability for not falling on your face once the speedway begins.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://world.marklogic.com/locations/amsterdam/speakers/stephen-buxton/&quot; id=&quot;link-id0x2aab7f589838&quot;&gt;Steve Buxton&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/MarkLogic&quot; id=&quot;link-id0x2aab7f5891b8&quot;&gt;MarkLogic&lt;/a&gt; gave a talk right before mine. Coming from a document-centric world, it stands to reason that MarkLogic would have a whole continuum of different mixes between SPARQL and document oriented queries. Steve correctly observed that some users found this great; others found this a near blasphemy, an unholy heterodoxy of confusing distinct principles.&lt;/p&gt; &lt;p&gt;This is our experience as well, since usage of &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2aab7f36c368&quot;&gt;XML&lt;/a&gt; fragments in SPARQL with &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x2aab7f5896d8&quot;&gt;XPath&lt;/a&gt; and such things in Virtuoso is possible but very seldom practiced. This is not the same as MarkLogic, though, as MarkLogic is about triples-in-documents, and the Virtuoso take is more like documents-in-triples. Not to mention that use of SQL and stored procedures in Virtuoso is rare among the SPARQL users.&lt;/p&gt; &lt;p&gt;The whole thing about the absence of physical design in RDF is a related, but broader instance of such purism.&lt;/p&gt; &lt;p&gt;In my talk, I had a slide titled &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/17&quot; id=&quot;link-id0x2aab7f4baba8&quot;&gt;The Cycle of Adventure&lt;/a&gt;,&lt;/i&gt; generally philosophizing on the dynamics of innovation. All progress begins with an irritation with the status quo; to mention a few examples: the No-SQL rebellion; the rejection of parallel SQL database in favor of key-value and map-reduce; the admission that central schema authority at web scale is impossible; the anti-ACID stance when having wide-area geographies to deal with. The stage of radicalism tends to discard the baby with the bathwater. But when the purists have their own enclave, free of the noxious corruption of the rejected world, they find that life is hard and defects of human character persist, even when all subscribe to the same religion. Of course, here we may have further splinter groups. After this, the dogma adapts to reality: the truly valuable insights of the original rebellion gain in appreciation, and the extremism becomes more moderate. Finally there is integration with mainstream, which becomes enriched by new content.&lt;/p&gt; &lt;p&gt;By the time the term Linked Data came to broad use, the RDF enterprise had its break-away colonies that started to shed some of the initial zeal. By now, we have the last phase of reconciliation in its early stages.&lt;/p&gt; &lt;p&gt;This process is in principle complete when linked data is no longer a radical bet, but a technology to be routinely applied to data when the nature of the data fits the profile. The structure awareness and other technology discussed here will mostly eliminate the differential in deployment cost.&lt;/p&gt; &lt;p&gt;The spreading perception of an expertise gap in this domain will even-out the cost in terms of personnel. The flexibility gains that were the initial drive for the movement will be more widely enjoyed when these factors fuel broader adoption.&lt;/p&gt; &lt;p&gt;To help this along, we have &lt;a href=&quot;http://ldbcouncil.org&quot; id=&quot;link-id0x2aab7f4baac8&quot;&gt;LDBC, the Linked Data Benchmark Council&lt;/a&gt;, with the agenda of creating industry consensus on measuring progress across the linked data and graph DB frontiers. I duly invited MarkLogic to join.&lt;/p&gt; &lt;p&gt;There were many other interesting conversations at the conference, I will later comment on these.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; SEMANTiCS 2014 (part 1): Keynote&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1814&quot; id=&quot;link-id0x2aab7f4ba9e8&quot;&gt;SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1815&quot; id=&quot;link-id0x1baff828&quot;&gt;SEMANTiCS 2014 (part 3): Conversation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-09-08T16:12:46.770-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 3 of 3): Conversations</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-07#1812</atom:id>
  <atom:published>2014-09-07T17:54:16Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was asked for an oracular statement about the future of &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2aabe22b2ef8&quot;&gt;relational database (RDBMS)&lt;/a&gt; at the conference. The answer, without doubt or hesitation, is that this is forever. But this does not mean that the RDBMS world would be immutable, quite the opposite.&lt;/p&gt; &lt;p&gt;The specializations converge. The RDBMS becomes more adaptable and less schema-first. Of course the RDBMS also take new data models beside the relational. &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aabfe2a02e8&quot;&gt;RDF&lt;/a&gt; and other property graph models, for instance.&lt;/p&gt; &lt;p&gt;The schema-last-ness is now well in evidence. For example, &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x2aabe06ebcf8&quot;&gt;PostgreSQL&lt;/a&gt; has an &lt;i&gt;&lt;code&gt;hstore&lt;/code&gt;&lt;/i&gt; column type which is a list of key-value pairs. &lt;a href=&quot;http://dbpedia.org/resource/Vertica&quot; id=&quot;link-id0x2aabf4750a98&quot;&gt;Vertica&lt;/a&gt; has a feature called &lt;i&gt;flex tables&lt;/i&gt; where a column can be added on a row-by-row basis.&lt;/p&gt; &lt;p&gt;Specialized indexing for text and geometries is a well established practice. However, dedicated IR systems, often &lt;a href=&quot;http://dbpedia.org/resource/Lucene&quot; id=&quot;link-id0x2aabe1e34f18&quot;&gt;Lucene&lt;/a&gt; derivatives, can offer more transparency in the IR domain for things like vector-space-models and hit-scoring. There is specialized faceted search support which is quite good. I do not know of an RDBMS that would do the exact same trick as Lucene for facets, but, of course, in the forever expanding scope of RDB, this is added easily enough.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/JSON&quot; id=&quot;link-id0x2aabe0021578&quot;&gt;JSON&lt;/a&gt; is all the rage in the web developer world. &lt;a href=&quot;https://www.linkedin.com/in/philarcher&quot; id=&quot;link-id0x2aabfdfacf88&quot;&gt;Phil Archer&lt;/a&gt; even said in his keynote, as a parody of the web developer: &amp;quot; I will never touch that crap of RDF or the semantic web; this is a pipe dream of reality ignoring academics and I will not have it. I will only use &lt;a href=&quot;http://dbpedia.org/resource/JSON-LD&quot; id=&quot;link-id0x2aabfc9baea8&quot;&gt;JSON-LD&lt;/a&gt;.&amp;quot;&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2aabe38e34a8&quot;&gt;XML&lt;/a&gt; and JSON are much the same thing. While most databases have had XML support for over a decade, there is a crop of specialized JSON systems like &lt;a href=&quot;http://dbpedia.org/resource/MongoDB&quot; id=&quot;link-id0x2aabe17f25f8&quot;&gt;MongoDB&lt;/a&gt;. PostgreSQL also has a JSON datatype. Unsurprisingly, &lt;a href=&quot;http://dbpedia.org/resource/MarkLogic&quot; id=&quot;link-id0x2aabe06204e8&quot;&gt;MarkLogic&lt;/a&gt; too has JSON, as this is pretty much the same thing as their core competence of XML.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabe098c068&quot;&gt;Virtuoso&lt;/a&gt;, too, naturally has a JSON parser, and mapping this to the native XML data type is a non-issue. This should probably be done.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x2aabfdbcfa48&quot;&gt;Stefano Bertolo&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/European_Commission&quot; id=&quot;link-id0x2aabe1f79dd8&quot;&gt;EC&lt;/a&gt;, also &lt;a href=&quot;http://lod2.eu&quot; id=&quot;link-id0x2aabe220d658&quot;&gt;LOD2&lt;/a&gt; project officer, used the word Cambrian explosion when talking about the proliferation of new database approaches in recent years.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Apache_Hadoop&quot; id=&quot;link-id0x2aabfd687d78&quot;&gt;Hadoop&lt;/a&gt; is a big factor in some environments. &lt;a href=&quot;http://www.actian.com/&quot; id=&quot;link-id0x2aabe1c5d218&quot;&gt;Actian&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aab7f733468&quot;&gt;Vector (née VectorWise)&lt;/a&gt;, for example, can use this as its file system. &lt;a href=&quot;http://dbpedia.org/resource/Hadoop_Distributed_File_System&quot; id=&quot;link-id0x2aabe1ced978&quot;&gt;HDFS&lt;/a&gt; is singularly cumbersome for this but still not impossible and riding the Hadoop bandwagon makes this adaptation likely worthwhile.&lt;/p&gt; &lt;p&gt;Graphs are popular in database research. We have a good deal of exposure to this via &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab7f55c6d8&quot;&gt;LDBC&lt;/a&gt;. Going back to an API for database access, as is often done in &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0x2aabe17383b8&quot;&gt;graph database&lt;/a&gt;, can have its point, especially as a reaction to the opaque and sometimes hard to predict query optimization of declarative languages. This just keeps getting more complex, so a counter-reaction is understandable. APIs are good if crossed infrequently and bad otherwise. So, graph database APIs will develop vectoring, is my prediction and even recommendation in LDBC deliverables.&lt;/p&gt; &lt;p&gt;So, there are diverse responses to the same evolutionary pressures. These are of initial necessity one-off special-purpose systems, since the time to solution is manageable. Doing these things inside an RDBMS usually takes longer. The geek also likes to start from scratch. Well, not always, as there have been some cases of grafting some entirely non-&lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aabfe29b628&quot;&gt;MySQL&lt;/a&gt;-like functionality, e.g. &lt;a href=&quot;http://dbpedia.org/resource/Infobright&quot; id=&quot;link-id0x2aab7f9e0338&quot;&gt;Infobright&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Kickfire&quot; id=&quot;link-id0x2aabe314aa88&quot;&gt;Kickfire&lt;/a&gt;, onto MySQL.&lt;/p&gt; &lt;p&gt;From the Virtuoso angle, adding new data and control structures has been done many times. There is no reason why this cannot continue. The next instances will consist of some graph processing (BSP, or Bulk Synchronous Processing) in the query languages. Another recent example is an interface for pluggable specialized content indices. One can make chemical structure indices, use alternate full text indices, etc., with this.&lt;/p&gt; &lt;p&gt;Most of this diversification has to do with physical design. The common logical side is a demand for more flexibility in schema and sometimes in scaling, e.g., various forms of elasticity in growing scale-out clusters, especially with the big web players.&lt;/p&gt; &lt;p&gt;The diversification is a fact, but the results tend to migrate into the RDBMS given enough time.&lt;/p&gt; &lt;p&gt;On the other hand, when a new species like the RDF store emerges, with products that do this and no other thing and are numerous enough to form a market, the RDBMS functionality seeps in. &lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aabfd94e978&quot;&gt;Bigdata&lt;/a&gt; has a sort of multicolumn table feature, if I am not mistaken. We just heard about the wish for strict schema, views, and triggers. By all means.&lt;/p&gt; &lt;p&gt;From the Virtuoso angle, with structure awareness, the difference of &lt;a href=&quot;http://www.w3.org/SQL/&quot; id=&quot;link-id0x2aabe33bba48&quot;&gt;SQL&lt;/a&gt; and RDF gradually fades, and any advance can be exploited to equal effect on either side.&lt;/p&gt; &lt;p&gt;Right now, I would say we have convergence when all the experimental streams feel many of the same necessities.&lt;/p&gt; &lt;p&gt;Of course you cannot have a semantic tech conference without the matter of the public &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aabe0fcfce8&quot;&gt;SPARQL&lt;/a&gt; end point coming up. The answer is very simple: If you have operational need for SPARQL accessible data, you must have your own infrastructure. No public end points. Public end points are for lookups and discovery; sort of a dataset demo. If operational data is in all other instances the responsibility of the one running the operation, why should it be otherwise here? Outsourcing is of course possible, either for platform (&lt;a href=&quot;http://dbpedia.org/resource/Cloud_computing&quot; id=&quot;link-id0x2aabe1f6ec38&quot;&gt;cloud&lt;/a&gt;) or software (&lt;a href=&quot;http://dbpedia.org/resource/Software_as_a_service&quot; id=&quot;link-id0x2aabe1d1c388&quot;&gt;SaaS&lt;/a&gt;). To outsource something with a service level, the service level must be specifiable. A service level cannot be specified in terms of throughput with arbitrary queries but in terms of well defined transactions; hence the services world runs via APIs, as in the case of &lt;a href=&quot;http://dbpedia.org/resource/OpenPHACTS&quot; id=&quot;link-id0x2aabf45b03e8&quot;&gt;Open PHACTS&lt;/a&gt;. For arbitrary queries (i.e., analytics on demand), with the huge variation in performance dependent on query plans and configuration of schema, the best is to try these things with platform on demand in a cloud. Like this, there can be a clear understanding of performance, which cannot be had with an entirely uncontrolled concurrent utilization. For systems in constant operation, having one&amp;#39;s own equipment is cheaper, but still might be impossible to procure due to governance.&lt;/p&gt; &lt;p&gt;Having clarified this, the incentives for operators also become clearer. A public end point is a free evaluation; a SaaS deal or product sale is the commercial offering.&lt;/p&gt; &lt;p&gt;Anyway, common datasets like &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x2aab7fa73dc8&quot;&gt;DBpedia&lt;/a&gt; are available preconfigured on &lt;a href=&quot;http://dbpedia.org/resource/Amazon_Web_Services&quot; id=&quot;link-id0x2aabe1b38bf8&quot;&gt;AWS&lt;/a&gt; with a &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aabe17f2598&quot;&gt;Virtuoso&lt;/a&gt; server. For larger data, there is a point to making ready-to-run cluster configurations available for evaluation, now that AWS has suitable equipment (e.g., dual E5 2670 with 240 GB RAM and SSD for USD 2.8 an hour). According to Amazon, up to five of these are available at a time without special request. We will try this during the fall and make the images available.&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1813&quot; id=&quot;link-id0x2aabe156c7d8&quot;&gt;SEMANTiCS 2014 (part 1): Keynote&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1814&quot; id=&quot;link-id0x2aabe1f88178&quot;&gt;SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SEMANTiCS 2014 (part 3): Conversations&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-09-08T16:12:34.860931-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 2 of 3): RDF Data Shapes</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-07#1811</atom:id>
  <atom:published>2014-09-07T17:13:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;The first keynote of &lt;a href=&quot;http://www.semantics.cc/&quot; id=&quot;link-id0x2aab7f183ee8&quot;&gt;Semantics 2014&lt;/a&gt; was by &lt;a href=&quot;https://www.linkedin.com/in/philarcher&quot; id=&quot;link-id0x2aabe103dba8&quot;&gt;Phil Archer&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web_Consortium&quot; id=&quot;link-id0x2aabe0eb90d8&quot;&gt;W3C&lt;/a&gt;, entitled &amp;quot;&lt;a href=&quot;http://www.semantics.cc/programme/talks/archer-10-years-of-archivement/&quot; id=&quot;link-id0x2aabe01e42d8&quot;&gt;10 Years of Achievement&lt;/a&gt;.&amp;quot; After my talk, in the questions, Phil brought up the matter of the upcoming W3C work group charter on &lt;a href=&quot;http://www.w3.org/2014/data-shapes/charter&quot; id=&quot;link-id0x2aab7f3ae098&quot;&gt;RDF Data Shapes&lt;/a&gt;. We had discussed this already at the reception the night before and I will here give some ideas about this.&lt;/p&gt; &lt;p&gt;After the talk, my answer was that naturally the existence of something that expressed the same sort of thing as &lt;a href=&quot;http://dbpedia.org/resource/Data_definition_language&quot; id=&quot;link-id0x2aab7f24cac8&quot;&gt;SQL DDL&lt;/a&gt;, with W3C backing, can only be a good thing and will give the structure awareness work by OpenLink in Virtuoso and probably others a more official seal of approval. Quite importantly, this will be a facilitator of interoperability and will raise this from a product specific optimization trick to a respectable, generally-approved piece of functionality.&lt;/p&gt; &lt;p&gt;This is the general gist of the matter and can hardly be otherwise. But underneath is a whole world of details, which we discussed at the reception.&lt;/p&gt; &lt;p&gt;Phil noted that there was controversy around whether a lightweight &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2aabe3a08a68&quot;&gt;OWL&lt;/a&gt;-style representation or &lt;a href=&quot;http://www.w3.org/Submission/spin-overview/&quot; id=&quot;link-id0x2aabe0a74268&quot;&gt;SPIN&lt;/a&gt; should function as the basis for data shapes.&lt;/p&gt; &lt;p&gt;Phil stated in the keynote that the W3C considered the RDF series of standards as good and complete, but would still have working groups for filling in gaps as these came up. This is what I had understood from my previous talks with him at the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aabe1cf4988&quot;&gt;Linking Geospatial Data&lt;/a&gt; workshop in London earlier this year.&lt;/p&gt; &lt;p&gt;So, against this backdrop, as well as what I had discussed with &lt;a href=&quot;https://www.linkedin.com/in/ralphhodgson&quot; id=&quot;link-id0x2aabe08d3d68&quot;&gt;Ralph Hodgson&lt;/a&gt; of &lt;a href=&quot;https://www.linkedin.com/company/topquadrant/&quot; id=&quot;link-id0x2aab7ed73958&quot;&gt;Top Quadrant&lt;/a&gt; at a previous &lt;a href=&quot;http://www.ldbc.eu:8090/display/TUC/Fourth+TUC+Meeting,+April+2014&quot; id=&quot;link-id0x2aab7f44daf8&quot;&gt;LDBC TUC meeting&lt;/a&gt; in Amsterdam, SPIN seems to me a good fit.&lt;/p&gt; &lt;p&gt;Now, it turns out that we are talking about two different use cases. Phil said that the RDF Data Shapes use case was about making explicit what applications required of data. For example, all products should have a unit price, and this should have one value that is a number.&lt;/p&gt; &lt;p&gt;The SPIN proposition on the other hand, as Ralph himself put it in the &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab7fd3d158&quot;&gt;LDBC&lt;/a&gt; meeting, is providing to the linked data space functionality that roughly corresponds to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabe06304d8&quot;&gt;SQL&lt;/a&gt; views. Well, this is one major point, but SPIN involves more than this.&lt;/p&gt; &lt;p&gt;So, is it DDL or views? These are quite different. I proposed to Phil that there was in fact little point in fighting over this; best to just have two profiles.&lt;/p&gt; &lt;p&gt;To be quite exact, even SQL DDL equivalence is tricky, since enforcing this requires a &lt;a href=&quot;http://dbpedia.org/resource/Database&quot; id=&quot;link-id0x2aabe0820508&quot;&gt;DBMS&lt;/a&gt;; consider, for instance, foreign key and check constraints. At the reception, Phil stressed that SPIN was certainly good but since it could not be conceived without a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2aab7ded80f8&quot;&gt;SPARQL&lt;/a&gt; implementation, it was too heavy to use as a filter for an application that, for example, just processed a stream of triples.&lt;/p&gt; &lt;p&gt;The point, as I see it, is that there is a wish to have data shape enforcement, at least to a level, in a form that can apply to a stream without random access capability or general purpose query language. This can make sense for some big data style applications, like an &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2aab7ffe64e8&quot;&gt;ETL&lt;/a&gt;-stage pre-cooking of data before the application. Applications mostly run against a DBMS, but in some cases, this could be a specialized map-reduce or graph analytics job also, so no low cost random access.&lt;/p&gt; &lt;p&gt;My own take is that views are quite necessary, especially for complex query; this is why Virtuoso has the SPARQL macro extension. This will do, by query expansion, a large part of what general purpose inference will do, except for complex recursive cases. Simple recursive cases come down to transitivity and still fit the profile. SPIN is a more generic thing, but has a large intersection with SPARQL macro functionality.&lt;/p&gt; &lt;p&gt;My other take is that structure awareness needs a way of talking about structure. This is a use case that is clearly distinct from views.&lt;/p&gt; &lt;p&gt;A favorite example of mine is the business rule that a good customer is one that has ordered more than 5 times in the last year, for a total of more than so much, and has no returns or complaints. This can be stated as a macro or SPIN rule with some aggregates and existences. This cannot be stated in any of the OWL profiles. When presented with this, Phil said that this was not the use case. Fair enough. I would not want to describe what amounts to SQL DDL in these terms either.&lt;/p&gt; &lt;p&gt;A related topic that has come up in other conversations is the equivalent of the trigger. One use case of this is enforcement of business rules and complex access rights for updates. So, we see that the whole &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2aabe07f7ac8&quot;&gt;RDBMS&lt;/a&gt; repertoire is getting recreated.&lt;/p&gt; &lt;p&gt;Now, talking from the viewpoint of the structure-aware RDF store, or the triple-stream application for that matter, I will outline some of what data shapes should do. The triggers and views matter is left out, here.&lt;/p&gt; &lt;p&gt;The commonality of bulk-load, ETL, and stream processing, is that they should not rely on arbitrary database access. This would slow them down. Still, they must check the following sorts of things:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Data types &lt;/li&gt; &lt;li&gt; Presence of some required attributes &lt;/li&gt; &lt;li&gt; Cardinality — e.g., a person has no more than one date of birth &lt;/li&gt; &lt;li&gt; Ranges — e.g., a product&amp;#39;s price is a positive number; gender is male/female; etc. &lt;/li&gt; &lt;li&gt; Limited referential integrity — e.g., a product has one product type, and this is a subject of the RDF type product type. &lt;/li&gt; &lt;li&gt; Limited intra-subject checks — e.g.. delivery date is greater-than-or-equal-to ship date. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All these checks depend on previous triples about the subject; for example, these checks may be conditional on the subject having a certain RDF type. In a data model with a join per attribute, some joining cannot be excluded. Checking conditions that can be resolved one triple at a time is probably not enough, at least not for the structure-aware RDF store case.&lt;/p&gt; &lt;p&gt;But, to avoid arbitrary joins which would require a DBMS, we have to introduce a processing window. The triples in the window must be cross-checkable within the window. With RDF set semantics, some reference data may be replicated among processing windows (e.g., files) with no ill effect.&lt;/p&gt; &lt;p&gt;A version of foreign key declarations is useful. To fit within a processing window, complete enforcement may not be possible but the declaration should still be possible, a little like in SQL where one can turn off checking.&lt;/p&gt; &lt;p&gt;In SQL, it is conventional to name columns by prefixing them with an abbreviation of the table name. All the TPC schemas are like that, for example. Generally in coding, it is good to prefix names with data type or subsystem abbreviation. In RDF, this is not the practice. For reuse of vocabularies, where a property may occur in anything, the namespace or other prefix denotes where the property comes from, not where it occurs.&lt;/p&gt; &lt;p&gt;So, in TPC-H, &lt;code&gt;l_partkey&lt;/code&gt; and &lt;code&gt;ps_partkey&lt;/code&gt; are both foreign keys that refer to part, plus that &lt;code&gt;l_partkey&lt;/code&gt; is also a part of a composite foreign key to &lt;code&gt;partsupp&lt;/code&gt;. By RDF practices, these would be called &lt;code&gt;rdfh:hasPart&lt;/code&gt;. So, depending on which subject type we have, &lt;code&gt;rdfh:hasPart&lt;/code&gt; is 30:1 or 4:1. (distinct subjects:distinct objects) Due to this usage, the property&amp;#39;s features are not dependent only on the property, but on the property plus the subject/object where it occurs.&lt;/p&gt; &lt;p&gt;In the relational model, when there is a parent and a child item (one to many), the child item usually has a composite key prefixed with the parent&amp;#39;s key, with a distinguishing column appended, e.g., &lt;code&gt;l_orderkey, l_linenumber&lt;/code&gt;. In RDF, this is &lt;code&gt;rdfh:hasOrder&lt;/code&gt; as a property of the &lt;code&gt;lineitem&lt;/code&gt; subject. In SQL, there is no single part &lt;code&gt;lineitem&lt;/code&gt; subject at all, but in RDF, one must be made since everything must be referenceable with a single value. This does not have to matter very much, as long as it is possible to declare that &lt;code&gt;lineitems&lt;/code&gt; will be primarily accessed via their order. It is either this or a scan of all &lt;code&gt;lineitems&lt;/code&gt;. Sometimes a group of &lt;code&gt;lineitems&lt;/code&gt; are accessed by the composite foreign key of &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt;. There could be a composite index on these. Furthermore, for each &lt;code&gt;l_partkey, l_suppkey &lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt; there exists a &lt;code&gt;partsupp&lt;/code&gt;. In an RDF translation, the &lt;code&gt;rdfh:hasPart&lt;/code&gt; and &lt;code&gt;rdfh:hasSupplier&lt;/code&gt;, when they occur in a &lt;code&gt;lineitem&lt;/code&gt; subject, specify exactly one subject of type &lt;code&gt;partsupp&lt;/code&gt;. When they occur in a &lt;code&gt;partsupp&lt;/code&gt; subject, they are unique as a pair. Again, because names are not explicit as to where they occur and what role they play, the referential properties do not depend only on the name, but on the name plus included data shape. Declaring and checking all this is conventional in the mainstream and actually useful for query optimization also.&lt;/p&gt; &lt;p&gt;Take the other example of a social network where the &lt;code&gt;foaf:knows&lt;/code&gt; edge is qualified by a date when this edge was created. This may be by reification, or more usually by an &amp;quot;entitized&amp;quot; relationship where the &lt;code&gt;foaf:knows&lt;/code&gt; is made into a subject with the persons who know each other and the date of acquaintance as properties. In a SQL schema, this is a key &lt;code&gt;person1, person2 -&amp;gt; date&lt;/code&gt;. In RDF, there are two join steps to go from &lt;code&gt;person1&lt;/code&gt; to &lt;code&gt;person2&lt;/code&gt;; in SQL, 1. This is eliminated by saying that the &lt;code&gt;foaf:knows&lt;/code&gt; entity is usually referenced by the person1 Object or person2 Object, not the Subject identifier of the &lt;code&gt;foaf:knows&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;This allows making the physical storage by &lt;code&gt;O, S, G -&amp;gt; O2, O3, …&lt;/code&gt;. A secondary index with &lt;code&gt;S, G, O&lt;/code&gt; still allows access by the mandatory subject identifier. In SQL, a structure like this is called a clustered table. In other words, the row is arranged contiguous with a key that is not necessarily the primary key.&lt;/p&gt; &lt;p&gt;So, identifying a clustering key in RDF can be important.&lt;/p&gt; &lt;p&gt;Identifying whether there are value-based accesses on a given &lt;code&gt;Object&lt;/code&gt; without making the &lt;code&gt;Object&lt;/code&gt; a clustering key is also important. This is equivalent to creating a secondary index in SQL. In the tradition of homogenous access by anything, such indexing may be on by default, except if the property is explicitly declared of low cardinality. For example, an index on gender makes no sense. The same is most often true of &lt;code&gt;rdfs:type&lt;/code&gt;. Some properties may have many distinct values (e.g., price), but are still not good for indexing, as this makes for the extreme difference in load time between SQL and the all-indexing RDF.&lt;/p&gt; &lt;p&gt;Identifying whether a column will be frequently updated is another useful thing. This will turn off indexing and use an easy-to-update physical representation. Plus, properties which are frequently updated are best put physically together. This may, for example, guide the choice between row-wise and column-wise representation. A customer&amp;#39;s account balance and orders year-to-date would be an example of such properties.&lt;/p&gt; &lt;p&gt;Some short string valued properties may be frequently returned or used as sorting keys. This requires accessing the literal via an ID in the dictionary table. Non-string literals, numbers, dates, etc., are always inlined (at least in most implementations), but strings are a special question. &lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aabfca038e8&quot;&gt;Bigdata&lt;/a&gt; and early versions of Virtuoso would inline short ones; later versions of Virtuoso would not. So specifying, per property/class combination, a length limit for an inlined string is very high gain and trivial to do. The &lt;a href=&quot;http://wifo5-03.informatik.uni-mannheim.de/bizer/berlinsparqlbenchmark/&quot; id=&quot;link-id0x2aabe1f9b678&quot;&gt;BSBM&lt;/a&gt; explore score at large scales can get a factor of 2 gain just from inlining one label. BSBM is out of its league here, but this is still really true and yields benefits across the board. The simpler the application, the greater the win.&lt;/p&gt; &lt;p&gt;If there are foreign keys, then data should be loaded with the referenced entities first. This makes dimensional clustering possible at load time. If the foreign key is frequently used for accessing the referencing item (for example, if customers are often accessed by country), then loading customers so that customers of the same country end up next to each other can result in great gains. The same applies to a time dimension, which in SQL is often done as a dimension table, but rarely so in linked data. Anyhow, if date is a frequent selection criterion, physically putting items in certain date ranges together can give great gains.&lt;/p&gt; &lt;p&gt;The trick here is not necessarily to index on date, but rather to use zone maps (aka min/max index). If nearby values are together, then just storing a min-max value for thousands of consecutive column values is very compact and fast to check, provided that the rows have nearby values. &lt;a href=&quot;http://www.actian.com&quot; id=&quot;link-id0x2aabe0c098b8&quot;&gt;Actian&lt;/a&gt; Vector&amp;#39;s (&lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aab7fc02998&quot;&gt;VectorWise&lt;/a&gt;) prowess in TPC-H is in part from smart use of date order in this style.&lt;/p&gt; &lt;p&gt;To recap, the data shapes desiderata from the viewpoint of guiding physical storage is as follows:&lt;/p&gt; &lt;p&gt;(I will use &amp;quot;data shape&amp;quot; to mean &amp;quot;characteristic set,&amp;quot; or &amp;quot;set of Subjects subject to the same set of constraints.&amp;quot; A Subject belonging to a data shape may be determined either by its &lt;code&gt;rdfs:type&lt;/code&gt; or by the fact of it having, within the processing window, all or some of a set of properties.)&lt;/p&gt; &lt;ul&gt; &lt;li&gt; All normal range, domain, cardinality, optionality, etc. — Specifically, declaring something as single valued (as with SQL&amp;#39;s &lt;code&gt;UNIQUE constraint) and mandatory (as with SQL&amp;#39;s &lt;code&gt;NOT NULL&lt;/code&gt; constraint) is good. &lt;/code&gt; &lt;/li&gt; &lt;li&gt; Primary access path — The Properties whose Objects are dominant access criteria is important &lt;/li&gt; &lt;li&gt; No-index — Declare that no index will be made on the Object of a Property within a data shape. &lt;/li&gt; &lt;li&gt; Inlined string — String values of up to so many characters in this data shape are inlined &lt;/li&gt; &lt;li&gt; Clustering key — The Subject identifiers will be picked to be correlated with the Object of this Property in this data shape. This can be qualified by a number of buckets (e.g., if dates are from 2000 to 2020, then this interval may be 100 buckets), with an exception bucket for out of range values. &lt;/li&gt; &lt;li&gt; No full text index — A string value will not need to be full text indexed in this Property even if full text indexing is generally on. &lt;/li&gt; &lt;li&gt; Full text index desired — This means that if the value of the property is a string, then the row must be locatable via this string. The string may or may not be inlined, but an index will exist on the literal ID of the string, e.g., POSG. &lt;/li&gt; &lt;li&gt; Co-location — This is akin to clustering but specifies, for a high cardinality Object, that the Subject identifier should be picked to fall in the same partition as the Object. The Object is typically a parent of the Subject being loaded; for example, the containing assembly of a sub-assembly. Traversing the assembly created in this way will be local on a scale-out system. This can also apply to geometries or text values: If primary access is by text or geo index, then the metadata represented as triples should be in the same partition as the entry in the full text/geo index. &lt;/li&gt; &lt;li&gt; Update group — A set of properties that will often change together. Implies no index and some form of co-location, plus update-friendly physical representation. Many update groups may exist, in which case they may or may not be collocated. &lt;/li&gt; &lt;li&gt; Composite foreign/primary key — A data shape can have a multicolumn foreign key, e.g., &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt; with the matching primary key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt; in &lt;code&gt;partsupp&lt;/code&gt;. This can be used for checking and for query optimization: Looking at &lt;code&gt;l_partkey&lt;/code&gt; and &lt;code&gt;l_suppkey&lt;/code&gt; as independent properties, the guess would be that there hardly ever exists a &lt;code&gt;partsupp&lt;/code&gt;, whereas one does always exist. The XML standards stack also has a notion of a composite key for random access on multiple attributes. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These things have the semantic of &amp;quot;hint for physical storage&amp;quot; and may all be ignored without effect on semantics, at least if the data is constraint-compliant to start with.&lt;/p&gt; &lt;p&gt;These things will have some degree of reference implementation through the evolution of Virtuoso structure awareness, though not necessarily immediately. These are, to the semanticist, surely dirty low-level disgraceful un-abstractions, some of the very abominations the early semanticists abhorred or were blissfully ignorant of when they first raised their revolutionary standard.&lt;/p&gt; &lt;p&gt;Still, these are well-established principles of the broader science of database. SQL does not standardize some of these, nor does it have much need to, as the use of these features is system-specific. The support varies widely and the performance impacts are diverse. However, since RDF excels as a reference model and as a data interchange format, giving these indications as hints to back-end systems cannot hurt, and can make a difference of night and day in load and query time.&lt;/p&gt; &lt;p&gt;As Phil Archer said, the idea of RDF Data Shapes is for an application to say that &amp;quot;it will barf if it gets data that is not like this.&amp;quot; An extension is for the data to say what the intended usage pattern is so that the system may optimize for this.&lt;/p&gt; &lt;p&gt;All these things may be learned from static analysis and workload traces. The danger of this is over-fitting a particular profile. This enters a gray area in benchmarking. For big data, if RDF is to be used as the logical model and the race is about highest absolute performance, never mind what the physical model ends up being, all this and more is necessary. And if one is stretching the envelope for scale, the race is always about highest absolute performance. For this reason, these things will figure at the leading edge with or without standardization. I would say that the build-up of experience in the RDBMS world is sufficient for these things to be included as hints in a profile of data shapes. The compliance cost will be nil if these are ignored, so for the W3C, these will not make the implementation effort for compliance with an eventual data shapes recommendation prohibitive.&lt;/p&gt; &lt;p&gt;The use case is primarily the data warehouse to go. If many departments or organizations publish data for eventual use by their peers, users within the organization may compose different combinations of extractions for different purposes. Exhaustive indexing of everything by default makes the process slow and needlessly expensive, as we have seen. Much of such exploration is bounded by load time. Federated approaches for analytics are just not good, even though they may work for infrequent lookups. If datasets are a commodity to be plugged in and out, the load and query investment must be minimized without the user/DBA having to run workload analysis and manual schema optimization. Therefore, bundling guidelines such as these with data shapes in a dataset manifest can do no harm and can in cases provide 10-50x gains in load speeds and 2-4x in space consumption, not to mention unbounded gains in query time, as good and bad plans easily differ by 10-100x, especially in analytics.&lt;/p&gt; &lt;p&gt;So, here is the pitch: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; Dramatic gains in ad hoc user experience &lt;/li&gt; &lt;li&gt; Minimal effort by data publishers, as much of the physical guidelines can be made from workload trace and dataset; the point is that the ad hoc user does not have to do this. &lt;/li&gt; &lt;li&gt; Great optimization potential for system vendors; low cost for initial compliance &lt;/li&gt; &lt;li&gt; Better understanding of the science of performance by the semantic community &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1813&quot; id=&quot;link-id0x2aabe1f87ad8&quot;&gt;SEMANTiCS 2014 (part 1): Keynote&lt;/a&gt; &lt;/li&gt; &lt;li&gt; SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1815&quot; id=&quot;link-id0x2aabe12fb048&quot;&gt;SEMANTiCS 2014 (part 3): Conversation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-10-29T13:31:54.399768-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SEMANTiCS 2014 (part 1 of 3): Keynote</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-09-06#1810</atom:id>
  <atom:published>2014-09-07T00:44:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was invited to give a keynote at &lt;a href=&quot;http://www.semantics.cc&quot; id=&quot;link-id0x2aab7f0f1c28&quot;&gt;SEMANTiCS 2014&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Leipzig&quot; id=&quot;link-id0x2aab7ef64778&quot;&gt;Leipzig&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x2aab7f488268&quot;&gt;Germany&lt;/a&gt; last Thursday. I will here recap some of the main points, and comment on some of the ensuing controversy. The talk was initially titled &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014&quot; id=&quot;link-id0x2aab7f3af178&quot;&gt;Virtuoso, the Prometheus of RDF&lt;/a&gt;&lt;/i&gt;. Well, mythical Prometheus did perform a service but ended up paying for it. Still, the mythical reference is sometimes used when talking of major breakthroughs and big-gain ambitions. In the &lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/2&quot; id=&quot;link-id0x2aab7ef4a308&quot;&gt;first slide&lt;/a&gt;, I changed it to &lt;a href=&quot;http://dbpedia.org/resource/Linked_data&quot; id=&quot;link-id0x2aab7f510bb8&quot;&gt;Linked Data&lt;/a&gt; at Dawn, which is less product specific and more a reflection on the state of the linked data enterprise at large.&lt;/p&gt; &lt;p&gt;The first part of the talk was under the heading of the promise and the practice. The promise we know well and find no fault with: Schema-last-ness, persistent unique identifiers, self-describing data, some but not too much inference. The applications usually involve some form of integration and often have a mix of strictly structured content with semi-structured or textual content.&lt;/p&gt; &lt;p&gt;These values are by now uncontroversial and embraced by many; however, most instances of this embracing do not occur in the context of RDF as such. For example, the big online systems on the web: all have some schema-last (key-value) functionality. Applications involving long-term data retention have diverse means of having persistent IDs and self description, from &lt;i&gt;UUIDs&lt;/i&gt; to having the table name in a column so that one can tell where a CSV dump came from.&lt;/p&gt; &lt;p&gt;The practice involves competing with diverse alternative technologies: SQL, key-value, information retrieval (often &lt;a href=&quot;http://dbpedia.org/resource/Lucene&quot; id=&quot;link-id0x2aab7f503868&quot;&gt;Lucene&lt;/a&gt;-derived). In some instances, graph databases occur as alternatives: Young semanticist, do or die.&lt;/p&gt; &lt;p&gt;In this race, linked data is often the prettiest and most flexible, but gets a hit on different aspects of performance and scalability. This is a database gig, and database is a performance game; make no mistake.&lt;/p&gt; &lt;p&gt;After these preliminaries we come to the &lt;i&gt;&amp;quot;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/9&quot; id=&quot;link-id0x2aab7f59e228&quot;&gt;RDF tax&lt;/a&gt;,&amp;quot;&lt;/i&gt; or the more or less intrinsic overheads of describing all as triples. The word &amp;quot;triple&amp;quot; is used by habit. In fact, we nearly always talk about quads, i.e., subject-predicate-object-graph (&lt;code&gt;SPOG&lt;/code&gt;). The next slide is provocatively titled the &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/10&quot; id=&quot;link-id0x2aab7f456428&quot;&gt;Bane of the Triple&lt;/a&gt;,&lt;/i&gt; and is about why having all as triples is, on the surface, much like relational, except it makes life hard, where tables make it at least manageable, if still not altogether trivial.&lt;/p&gt; &lt;p&gt;The very first statement on &lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/9&quot; id=&quot;link-id0x2aab7f07f6e8&quot;&gt;the tax slide&lt;/a&gt; reads &amp;quot;90% of bad performance comes from non-optimal query plans.&amp;quot; If one does triples in the customary way (i.e., a table of quads plus dictionary tables to map URIs and literal strings to internal IDs), one incurs certain fixed costs.&lt;/p&gt; &lt;p&gt;These costs are deemed acceptable by users who deploy linked data. If these costs were not acceptable, the proof of concept would have already disqualified linked data.&lt;/p&gt; &lt;p&gt;The support cases that come my way are nearly always about things taking too much time. Much less frequently, are these about something unambiguously not working. Database has well defined semantics, so whether something works or not is clear cut.&lt;/p&gt; &lt;p&gt;So, support cases are overwhelmingly about query optimization. The problems fall in two categories:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; The plan is good in the end, but it takes much longer to make the plan than to execute it. &lt;/li&gt; &lt;li&gt; The plan either does the wrong things or does things in the wrong order, but produces a correct result. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Getting no plan at all or getting a clearly wrong result is much less frequent.&lt;/p&gt; &lt;p&gt;If the RDF overheads incurred with a good query plan were show stoppers, the show would have already stopped.&lt;/p&gt; &lt;p&gt;So, let&amp;#39;s look at this in more detail; then we will talk about the fixed overheads.&lt;/p&gt; &lt;p&gt;The join selectivity of triple patterns is correlated. Some properties occur together all the time; some occur rarely; some not at all. Some property values can be correlated, i.e., order number and order date. Capturing these by sampling in a multicolumn table is easy; capturing this in triples would require doing the join in the cost model, which is not done since it would further extend compilation times. When everything is a join, selectivity estimation errors build up fast. When everything is a join, the space of possible graph query plans explodes as opposed to tables; thus, while the full plan space can be covered with 7 tables, it cannot be covered with 18 triple patterns. This is not factorial (number of permutations). For different join types (index/hash) and the different compositions of the hash build side, this is much worse, in some nameless outer space fringe of non-polynomiality.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aab7ec91108&quot;&gt;TPC-H&lt;/a&gt; can be run with success because the cost model hits the right plan every time. The primary reason for this is the fact that the schema and queries unambiguously suggest the structure, even without foreign key declarations. The other reason is that with a handful of tables, all plans can be reviewed, and the cost model reliably tells how many rows will result from each sequence of operations.&lt;/p&gt; &lt;p&gt;Try this with triples; you will know what I mean.&lt;/p&gt; &lt;p&gt;Now, some people have suggested purely rule-based models of SPARQL query compilation. These are arguably faster to run and more predictable. But the thing that must be done, yet will not be done with these, is the right trade-off between index and hash. This is the crux of the matter, and without this, one can forget about anything but lookups. The choice depends on reliable estimation of cardinality (number of rows, number of distinct keys) on either side of the join. Quantity, not pattern matching.&lt;/p&gt; &lt;p&gt;Well, many linked data applications are lookups. The graph database API world is sometimes attractive because it gives manual control. Map reduce in the analytical space is sometimes attractive for the same reason.&lt;/p&gt; &lt;p&gt;On the other hand, query languages also give manual control, but then this depends on system specific hints and cheats. People are often black and white: Either all declarative or all imperative. We stand for declarative, but still allow physical control of plan, like most DBMS.&lt;/p&gt; &lt;p&gt;To round off, I will give a concrete example:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { ?thing rdfs:label ?lbl . ?thing dc:title ?title . ?lbl bif:contains &amp;quot;gizmo&amp;quot; . ?title bif:contains &amp;quot;widget&amp;quot; . ?thing a xx:Document . ?thing dc:date ?dt . FILTER ( ?dt &amp;gt; &amp;quot;2014-01-01&amp;quot;^^xsd:date ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;There are two full text conditions, one date, and one class, all on the same subject. How do you do this? Most selective text first, then get the data and check, then check the second full text given the literal and the condition, then check the class? Wrong. If widgets and gizmos are both frequent and most documents new, this is very bad because using a text index to check for a specific ID having a specific string is not easily vectorable. So, the right plan is: Take the more selective text expression, then check the date and class for the results, put the &lt;code&gt;&lt;i&gt;?things&lt;/i&gt;&lt;/code&gt; in a hash table. Then do the less selective text condition, and drop the ones that are not in the hash table. Easily 10x better. Simple? In the end yes, but you do not know this unless you know the quantities.&lt;/p&gt; &lt;p&gt;This gives the general flavor of the problem. Doing this with TPC-H in RDF is way harder, but you catch my drift.&lt;/p&gt; &lt;p&gt;Each individual instance is do-able. Having closer and closer alignment between reality and prediction will improve the situation indefinitely, but since the space is as good as infinite there cannot be a guarantee of optimality except for toy cases.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Gordian_Knot&quot; id=&quot;link-id0x2aab7f03acb8&quot;&gt;Gordian Knot&lt;/a&gt; shall not be defeated with pincers but by the sword.&lt;/p&gt; &lt;p&gt;We will come to this in a bit.&lt;/p&gt; &lt;p&gt;Now, let us talk of the fixed overheads. The embarrassments are in the query optimization domain; the daily grind, relative cost, and provisioning are in this one.&lt;/p&gt; &lt;p&gt;The overheads come from:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Indexing everything &lt;/li&gt; &lt;li&gt; Having literals and URI strings via dictionary &lt;/li&gt; &lt;li&gt; Having a join for every attribute &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These all fall under the category of having little to no physical design room.&lt;/p&gt; &lt;p&gt;In the indexing everything department, we load 100 GB TPC-H in 15 minutes in SQL with ordering only on primary keys and almost no other indexing. The equivalent with triples is around 12 hours. This data can be found on this blog (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab7ef220e8&quot;&gt;TPC-H series&lt;/a&gt; and &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1769&quot; id=&quot;link-id0x2aab7f6881a8&quot;&gt;Meeting the Challenges of Linked Data in the Enterprise&lt;/a&gt;&lt;/i&gt;). This is on the order of confusing a screwdriver with a hammer. If the nail is not too big, the wood not too hard, and you hit it just right — the nail might still go in. The RDF bulk load is close to the fastest possible given the general constraints of what it does. The same logic is used for the record-breaking 15 minutes of TPC-H bulk load, so the code is good. But indexing everything is just silly.&lt;/p&gt; &lt;p&gt;The second, namely the dictionary of URIs and literals, is a dual edge. I talked to &lt;a href=&quot;http://www.linkedin.com/pub/bryan-thompson/30/390/54b&quot; id=&quot;link-id0x2aab7ec1cab8&quot;&gt;Bryan Thompson&lt;/a&gt; of &lt;a href=&quot;http://www.systap.com/about&quot; id=&quot;link-id0x2aab7ef42808&quot;&gt;SYSTAP&lt;/a&gt; (&lt;a href=&quot;http://bigdata.com/bigdata&quot; id=&quot;link-id0x2aab7ef42248&quot;&gt;Bigdata&lt;/a&gt; RDF store) in &lt;a href=&quot;http://dbpedia.org/page/Washington,_D.C.&quot; id=&quot;link-id0x2aab7fa84ce8&quot;&gt;D.C.&lt;/a&gt; at the &lt;a href=&quot;http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?reload=true&amp;amp;punumber=6226952&quot; id=&quot;link-id0x2aab7f6cd528&quot;&gt;ICDE&lt;/a&gt; there. He said that they do short strings inline and long ones via dictionary. I said we used to do the same but stopped in the interest of better compression. What is best depends on workload and working-set-to-memory ratio. But if you must make the choice once and for all, or at least as a database-wide global setting, you are between a rock and a hard place. Physical vs. logical design, again.&lt;/p&gt; &lt;p&gt;The other aspect of this is the applications that do regexps on URI strings or literals. Doing this is like driving a Formula 1 race in reverse gear. Use a text index. Always. This is why most implementations have one even though SPARQL itself makes no provisions for this. If you really need regexps, and on supposedly opaque URIs at that, tokenize them and put them in a text index as a text literal. Or if an inverted-file-word index is really not what you need, use a trigram one. So far, nobody has wanted one hard enough for us to offer this, even though this is easy enough. But special indices for special data types (e.g., chemical structure) are sometimes wanted, and we have a generic solution for all this, to be introduced shortly on this blog. Again, physical design.&lt;/p&gt; &lt;p&gt;I deliberately name the self-join-per-attribute point last, even though this is often the first and only intrinsic overhead that is named. True, if the physical model is triples, each attribute is a join against the triple table. Vectored execution and right use of hash-join help, though. The Star Schema Benchmark SQL to SPARQL gap is only 2.5x, as &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aab7ec7cc68&quot;&gt;documented last year on this blog&lt;/a&gt;. This makes SPARQL win by 100+x against &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aab7f3a6148&quot;&gt;MySQL&lt;/a&gt; and lose by only 0.8x against column store pioneer &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x2aab7f342508&quot;&gt;MonetDB&lt;/a&gt;. Let it be said that this is so far the best case and that the gap is wider in pretty much all other cases. This gap is well and truly due to the self-join matter, even after the self-joins are done vectored, local, ordered; in one word, &lt;i&gt;right.&lt;/i&gt; The literal and URI translation matter plays no role here. The needless indexing hurts at load but has no effect at query time, since none of the bloat participates in the running. Again, physical design.&lt;/p&gt; &lt;p&gt;Triples are done right, so?&lt;/p&gt; &lt;p&gt;In the summer of 2013, after the Star Schema results, it became clear that maybe further gains could be had and query optimization made smoother and more predictable, but that these would be paths of certain progress but with diminishing returns per effort. No, not the pincers; give me the sword. So, between fall 2013 and spring 2014, aside from doing diverse maintenance, I did the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aab7f6caad8&quot;&gt;TPC-H series&lt;/a&gt;. This is the proficiency run for big league databases; the America&amp;#39;s Cup, not a regatta on the semantic lake.&lt;/p&gt; &lt;p&gt;Even if the audience is principally Linked Data, the baseline must be that of the senior science of SQL.&lt;/p&gt; &lt;p&gt;It stands to reason and has been demonstrated by extensive experimentation at &lt;a href=&quot;http://www.cwi.nl&quot; id=&quot;link-id0x2aab7eed20b8&quot;&gt;CWI&lt;/a&gt; that RDF data, by and large, has structure. This structure will carry linked data through the last mile to being a real runner against the alternative technologies (SQL, IR, key value) mentioned earlier.&lt;/p&gt; &lt;p&gt;The operative principles have been mentioned earlier and are set forth on the slides. In forthcoming articles I will display some results.&lt;/p&gt; &lt;p&gt;One important proposal for structure awareness was by &lt;a href=&quot;https://www.linkedin.com/pub/thomas-neumann/2/35/189&quot; id=&quot;link-id0x2aab7f6ee928&quot;&gt;Thomas Neumann&lt;/a&gt; in an &lt;a href=&quot;https://domino.mpi-inf.mpg.de/intranet/ag5/ag5publ.nsf/0/AD3DBAFA6FB90DD2C1257593002FF3DF/$file/rdf3x.pdf&quot; id=&quot;link-id0x2aab7f3a2d38&quot;&gt;RDF3X paper introducing characteristic sets&lt;/a&gt;. There, the application was creation of more predictable cost estimates. Neumann correctly saw this as possibly the greatest barrier to predictable RDF performance. &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aab7f8b9218&quot;&gt;Peter Boncz&lt;/a&gt; and I discussed the use of this for physical optimization once when driving back to &lt;a href=&quot;http://dbpedia.org/resource/Amsterdam&quot; id=&quot;link-id0x2aab7f9e9ab8&quot;&gt;Amsterdam&lt;/a&gt; from a &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2aab7f59dfa8&quot;&gt;LOD2&lt;/a&gt; review in &lt;a href=&quot;http://dbpedia.org/resource/Luxembourg&quot; id=&quot;link-id0x2aab7f06bd98&quot;&gt;Luxembourg&lt;/a&gt;. &lt;a href=&quot;http://homepages.cwi.nl/~duc/&quot; id=&quot;link-id0x2aab7ec98078&quot;&gt;Pham Minh Duc&lt;/a&gt; of CWI did much of the schema discovery research, documented in the now published LOD2 book (&lt;i&gt;&lt;a href=&quot;http://link.springer.com/book/10.1007%2F978-3-319-09846-3&quot; id=&quot;link-id0x2aab7f293f78&quot;&gt;Linked Open Data -- Creating Knowledge Out of Interlinked Data&lt;/a&gt;&lt;/i&gt;). The initial Virtuoso implementation had to wait for the TPC-H and general squeezing of the quads model to be near complete. It will likely turn out that the greatest gain of all with structure awareness will be bringing optimization predictability to SQL levels. This will open the whole bag of tricks known to data warehousing to safe deployment for linked data. Of course, much of this has to do with exploiting physical layout; hence it also needs the physical model to be adapted. Many of these techniques have high negative impact if used in the wrong place; hence the cost model must guess right. But they work in SQL and, as per Thomas Neumann&amp;#39;s initial vision, there is no reason why these would not do so in a schema-less model if adapted in a smart enough manner.&lt;/p&gt; &lt;p&gt;All this gives rise to some sociological or psychological observations. &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x2aab7f1e1af8&quot;&gt;Jens Lehmann&lt;/a&gt; asked me why now, why not earlier; after all, over the years many people have suggested property tables and other structured representations. This is now because there is no further breakthroughs within an undifferentiated physical model.&lt;/p&gt; &lt;p&gt;For completeness, we must here mention other approaches to alternative, if still undifferentiated, physical models. A number of research papers mention memory-only, pointer-based (i.e., no index, no hash-join) implementations of triples or quads. Some of these are on graph processing frameworks, some stand-alone. &lt;a href=&quot;http://www.yarcdata.com&quot; id=&quot;link-id0x2aab7f455638&quot;&gt;Yarc Data&lt;/a&gt; is a commercial implementation that falls in this category. These may have higher top speeds than column stores, even after all vectoring and related optimizations. However the space utilization is perforce larger than with optimum column compression and this plus the requirement of 100% in memory makes these more expensive to scale. The linked data proposition is usually about integration, and this implies initially large data even if not all ends up being used.&lt;/p&gt; &lt;p&gt;The graph analytics, pointer-based item will be specially good for a per-application extraction, as suggested by &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Corporation&quot; id=&quot;link-id0x2aab7eed1fd8&quot;&gt;Oracle&lt;/a&gt; in their paper at &lt;a href=&quot;http://event.cwi.nl/grades2013/&quot; id=&quot;link-id0x2aab7f1c3e98&quot;&gt;GRADES 13&lt;/a&gt;. No doubt this will come under discussion at &lt;a href=&quot;http://ldbcouncil.org/&quot; id=&quot;link-id0x2aab7f11ebd8&quot;&gt;LDBC&lt;/a&gt;, where Oracle Labs is now a participant.&lt;/p&gt; &lt;p&gt;But back to physical model. What we have in mind is relational column store — multicolumn-ordered column-wise compressed tables — a bit like &lt;a href=&quot;http://www.vertica.com&quot; id=&quot;link-id0x2aab7f0f19a8&quot;&gt;Vertica&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aab7f3138d8&quot;&gt;Virtuoso&lt;/a&gt; in SQL mode for the regular parts and quads for the rest. What is big is regular, since a big thing perforce comes from something that happens a lot, like click streams, commercial transactions, instrument readings. For the 8-lane-motorway of regular data, you get the F1 racer with the hardcore best in column store tech. When the autobahn ends and turns into the mountain trail, the engine morphs into a dirt bike.&lt;/p&gt; &lt;p&gt;This is complex enough, and until all the easy gains have been extracted from quads, there is little incentive. Plus this has the prerequisite of quads done right, plus the need for top of the line relational capability for not falling on your face once the speedway begins.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://world.marklogic.com/locations/amsterdam/speakers/stephen-buxton/&quot; id=&quot;link-id0x2aab7f688468&quot;&gt;Steve Buxton&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/MarkLogic&quot; id=&quot;link-id0x2aab7f1b7b18&quot;&gt;MarkLogic&lt;/a&gt; gave a talk right before mine. Coming from a document-centric world, it stands to reason that MarkLogic would have a whole continuum of different mixes between SPARQL and document oriented queries. Steve correctly observed that some users found this great; others found this a near blasphemy, an unholy heterodoxy of confusing distinct principles.&lt;/p&gt; &lt;p&gt;This is our experience as well, since usage of &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2aab7f06c298&quot;&gt;XML&lt;/a&gt; fragments in SPARQL with &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x2aab7ec1d7e8&quot;&gt;XPath&lt;/a&gt; and such things in Virtuoso is possible but very seldom practiced. This is not the same as MarkLogic, though, as MarkLogic is about triples-in-documents, and the Virtuoso take is more like documents-in-triples. Not to mention that use of SQL and stored procedures in Virtuoso is rare among the SPARQL users.&lt;/p&gt; &lt;p&gt;The whole thing about the absence of physical design in RDF is a related, but broader instance of such purism.&lt;/p&gt; &lt;p&gt;In my talk, I had a slide titled &lt;i&gt;&lt;a href=&quot;http://www.slideshare.net/kidehen/ogl-semantic-leipzigsemantics2014/17&quot; id=&quot;link-id0x2aab7e0bec18&quot;&gt;The Cycle of Adventure&lt;/a&gt;,&lt;/i&gt; generally philosophizing on the dynamics of innovation. All progress begins with an irritation with the status quo; to mention a few examples: the No-SQL rebellion; the rejection of parallel SQL database in favor of key-value and map-reduce; the admission that central schema authority at web scale is impossible; the anti-ACID stance when having wide-area geographies to deal with. The stage of radicalism tends to discard the baby with the bathwater. But when the purists have their own enclave, free of the noxious corruption of the rejected world, they find that life is hard and defects of human character persist, even when all subscribe to the same religion. Of course, here we may have further splinter groups. After this, the dogma adapts to reality: the truly valuable insights of the original rebellion gain in appreciation, and the extremism becomes more moderate. Finally there is integration with mainstream, which becomes enriched by new content.&lt;/p&gt; &lt;p&gt;By the time the term Linked Data came to broad use, the RDF enterprise had its break-away colonies that started to shed some of the initial zeal. By now, we have the last phase of reconciliation in its early stages.&lt;/p&gt; &lt;p&gt;This process is in principle complete when linked data is no longer a radical bet, but a technology to be routinely applied to data when the nature of the data fits the profile. The structure awareness and other technology discussed here will mostly eliminate the differential in deployment cost.&lt;/p&gt; &lt;p&gt;The spreading perception of an expertise gap in this domain will even-out the cost in terms of personnel. The flexibility gains that were the initial drive for the movement will be more widely enjoyed when these factors fuel broader adoption.&lt;/p&gt; &lt;p&gt;To help this along, we have &lt;a href=&quot;http://ldbcouncil.org&quot; id=&quot;link-id0x2aab7efeb4d8&quot;&gt;LDBC, the Linked Data Benchmark Council&lt;/a&gt;, with the agenda of creating industry consensus on measuring progress across the linked data and graph DB frontiers. I duly invited MarkLogic to join.&lt;/p&gt; &lt;p&gt;There were many other interesting conversations at the conference, I will later comment on these.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;SEMANTiCS 2014 Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; SEMANTiCS 2014 (part 1): Keynote&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1814&quot; id=&quot;link-id0x2aab7f6fdcc8&quot;&gt;SEMANTiCS 2014 (part 2): RDF Data Shapes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1815&quot; id=&quot;link-id0x2aab7f7b4e88&quot;&gt;SEMANTiCS 2014 (part 3): Conversation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-09-08T16:12:23.246649-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 3 of n): The 500 Giga-triple Runs</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-08-29#1809</atom:id>
  <atom:published>2014-08-29T16:50:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the evening of day 8, we have kernel settings in the cluster changed to allow more &lt;code&gt;mmaps&lt;/code&gt;. At this point, we notice that the dataset is missing the implied &lt;code&gt;types&lt;/code&gt; of &lt;code&gt;products&lt;/code&gt;; i.e., the most specific &lt;code&gt;type&lt;/code&gt; is given but its superclasses are not directly associated with the &lt;code&gt;product&lt;/code&gt;. We have always run this with this unique inference materialized, which is also how the data generator makes the data, with the right switch. But the switch was not used. So a further 10 Gt (Giga-triples) are added, by running a SQL script to make the superclasses explicit.&lt;/p&gt; &lt;p&gt;At this point, we run BSBM &lt;i&gt;explore&lt;/i&gt; for the first time. To what degree does the 37.5 Gt predict the 500 Gt behavior? First, there is an overflow that causes a query plan cost to come out negative if the default graph is specified. This is a bona fide software bug you don&amp;#39;t get unless a sample is quite large. Also, we note that starting the databases takes a few minutes due to disk. Further, the first query takes a long time to compile, again because of sampling the database for overall statistics.&lt;/p&gt; &lt;p&gt;The statistics are therefore gathered by running a few queries, and then saved. Subsequent runs will reload the stats from the file system, saving some minutes of start time. There is a function for this, &lt;code&gt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_stat_import.html&quot; id=&quot;link-id0x2aabc6382718&quot;&gt;stat_import&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_stat_export.html&quot; id=&quot;link-id0x2aabf4834688&quot;&gt;stat_export&lt;/a&gt;&lt;/code&gt;. These are used for a similar purpose by some users.&lt;/p&gt; &lt;p&gt;On day 10, Wednesday August 20, we have some results of BSBM &lt;i&gt;explore&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Then, we get into BSBM &lt;i&gt;updates&lt;/i&gt;. The BSBM generator makes an update dataset, but it cannot be made large enough. The BSBM test driver suite is by now hated and feared in equal measure. Is it bad in and of itself? Depends. It was certainly not made for large data. Anyway, no fix will be attempted this time. Instead, a couple of SQL procedures are made to drive a random update workload. These can run long enough to get a steady state with warm cache, which is what any OLTP measurement needs.&lt;/p&gt; &lt;p&gt;On day 12, some updates are measured, with a one hour ramp-up to steady-state, but these are not quite the right mix, since these are &lt;code&gt;products&lt;/code&gt; only and the mix needs to contain &lt;code&gt;offers&lt;/code&gt; and &lt;code&gt;reviews&lt;/code&gt; also. The first steady-state rate was 109 Kt/s, a full 50x less than the bulk load, but then this was very badly bound by latency. So, the updates are adjusted to have more variety. The final measurement was on day 17. Now the steady-state rate is 2563 Kt/s, which is better but still quite bound by network. By adding diversity to the dataset, we get slammed by a sharp rise in warm-up time (now 2 hours to be at 230 Kt/s), at which point we launch the &lt;i&gt;explore&lt;/i&gt; mix to be timed during &lt;i&gt;update&lt;/i&gt;. Time is short and we do not want to find out exactly how long it takes to get the plateau in insert rate. As it happens, the &lt;i&gt;explore&lt;/i&gt; mix is hardly slowed down by the &lt;i&gt;updates&lt;/i&gt;, but the &lt;i&gt;updates&lt;/i&gt; get hit worse, so that the rate goes to about 1/3 of what it was, then comes back up when the &lt;i&gt;explore&lt;/i&gt; is finished. Finally, half an hour after this, there is a steady state of 263 Kt/s &lt;i&gt;update&lt;/i&gt; rate.&lt;/p&gt; &lt;p&gt;Of course, the main object of the festivities is still the &lt;i&gt;business intelligence&lt;/i&gt; (BI) mix. This is our (specifically, Orri&amp;#39;s) own invention from years back, subsequently formulated in SPARQL by &lt;a href=&quot;http://www.fu-berlin.de/&quot; id=&quot;link-id0x2aabf519c648&quot;&gt;FU Berlin&lt;/a&gt; (&lt;a href=&quot;http://www.wiwiss.fu-berlin.de/en/fachbereich/bwl/pwo/bizer/team/SchultzAndreas.html&quot; id=&quot;link-id0x2aabc6711de8&quot;&gt;Andreas Schultz&lt;/a&gt;). Well, it is already something to do big joins with 150 Gt, all on index and vectored random access, as was done in January 2013, the last time results were published on the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aabc64b5438&quot;&gt;CWI&lt;/a&gt; &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aabc610c9d8&quot;&gt;cluster&lt;/a&gt;. You may remember that there was &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x2aabc63f7cc8&quot;&gt;an aborted attempt in January 2014&lt;/a&gt;. So now, with the LOD2 end date under two weeks away, we will take the BI racer out for a spin with 500 Gt. This is now a very different proposition from Jan 2013, as we have by now done the whole &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabf4ecc6f8&quot;&gt;TPC-H&lt;/a&gt; work &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabc6447a18&quot;&gt;documented on this blog&lt;/a&gt;. This serves to show, &lt;i&gt;inter alia,&lt;/i&gt; that we can run with the best in the much bigger and harder mainstream database sports. The full benefits of this will be realized for the semantic data public still this year, so this is more than personal vanity.&lt;/p&gt; &lt;p&gt;So we will see. The BI mix is not exactly TPC-H, but what is good for one is good for the other. Checking that the plans are good on the 37 Gt scale model is done around day 12. On day 13, we try this on the larger cluster. You never know — pushing the envelope, even when you know what you are doing and have written the whole thing, is still a dive in the fog. Claiming otherwise would be a lie lacking credibility. The iceberg which first emerges is overflow and partition skew. Well, there can be a lot of messages if all messages go via the same path. So we make the data structure different and retry and now die from out of memory. On the scale model, this looks like a little imbalance you don&amp;#39;t bother to notice; at 13x scale, this kills. So, as is the case with most database problems, the query plan is bad. Instead of using a &lt;code&gt;PSOG&lt;/code&gt; index, it uses a &lt;code&gt;POSG&lt;/code&gt; index, and there is a constant for &lt;code&gt;O&lt;/code&gt;. Partitioning is on either &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;O&lt;/code&gt;, whichever is first. Not hard to fix, but still needs a cost-model adjustment to penalize low-cardinality partition columns. This is something you don&amp;#39;t get with TPC-H, where there are hardly any indices. Once this is fixed there are other problems, such as Q5, which we ended up leaving out. The scale model is good; the large one does not produce a plan, because some search-space corner is visited that is not visited in the scale model, due to different ratios of things in the cost model. Could be a couple of days to track; this is complex stuff. So we dropped it. It is not a big part of the metric, and its omission is immaterial to the broader claim of handling 500 Gt in all safety and comfort. The moral is: never get stuck; only do what is predictable, insofar as anything in this shadowy frontier is such.&lt;/p&gt; &lt;p&gt;So, on days 15 and 16, the BI mix that is reported was run. The multiuser score was negatively impacted by memory skew, so some swapping on one of the nodes, but the run finished in about 2 hours anyway. The peak of transient memory consumption is another thing that you cannot forecast with exact precision. There is no model for that; the query streams are in random order, and you just have to try. And it is a few hours per iteration, so you don&amp;#39;t want to be stuck doing that either. A rerun would get a higher multiuser BI score; maybe one will be made but not before all the rest is wrapped up.&lt;/p&gt; &lt;p&gt;Now we are talking 2 hours, versus 9 hours with the 150 Gt set back in January 2013. So 3.3x the data, 4.5x less time, 1.5x the gear. This comes out at one order of magnitude. With a better score from better memory balance and some other fixes, a 15x improvement for BSBM BI is in the cards.&lt;/p&gt; &lt;p&gt;The final &lt;i&gt;explore&lt;/i&gt; runs were made on day 18, while writing the report to be published at the LOD2 deliverables repository. The report contains in depth discussion on the query plans and diverse database tricks and their effectiveness.&lt;/p&gt; &lt;p&gt;The overall moral of this trip into these uncharted spaces is this: Expect things to break. You have to be the designer and author of the system to take it past its limits. You will cut it or you won&amp;#39;t, and nobody can do anything about it, not with the best intentions, nor even with the best expertise, which both were present. This is true of the last minute daredevil stuff like this; if you have a year full time instead of the last 20 days of a project, all is quite different, and these things are more leisurely. This might then become a committee affair, though, which has different problems. In the end, the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabf48373a8&quot;&gt;Virtuoso DBMS&lt;/a&gt; has never thrown anything at us we could not handle. The uncertainty in trips of this sort is with the hardware platform, of which we had to &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabc753df48&quot;&gt;replace 2 units to get on the way&lt;/a&gt;, and with how fast you can locate and fix a software problem. So you pick the quickest ones and leave the uncertain aside. There is another category of rare events like network failures that in theory cannot happen. Yet they do. So, to program a cluster, you have to have some recovery things for these. We saw &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aab709be078&quot;&gt;a couple of these along the way&lt;/a&gt;. Duplication of these can take days, and whether this correlates with specific links or is a bona fide software thing is time consuming to prove, and getting into this is a sure way to lose the race. These seem to be load peaks outside of steady-state; steady-state is in fact very steady once it is there. Except at the start, network glitches were not a big factor in these experiments. The bulk of these went away after replacing a machine. After this we twice witnessed something that cannot exist but knew better than to get stuck with that. Neither incident happened again. This is days of running at a cross sectional 1 GB/s of traffic. These are the truly unpredictable, and, in a crash course like this, can sink the whole gig no matter how good you are.&lt;/p&gt; &lt;p&gt;Thanks are due to CWI and especially &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aab728cbd38&quot;&gt;Peter Boncz&lt;/a&gt; for providing the race track as well as advice and support.&lt;/p&gt; &lt;p&gt;In the next installments of this series, we will look at how schema and characteristic sets will deliver the promise of RDF without its cost. All the experiments so far were done with a quads table, as always before. So we could say that the present level is close to the limit of the achievable within this physical model. The future lies beyond the misconception of triples/quads as primary physical model.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1804&quot; id=&quot;link-id0x2aabf5507888&quot;&gt; LOD2 Finale (part 1): RDF Before The Dawn&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabf5175be8&quot;&gt; LOD2 Finale (part 2): The 500 Giga-triples&lt;/a&gt; &lt;/li&gt; &lt;li&gt; LOD2 Finale (part 3): The 500 Giga-triple Runs&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-29T12:50:05.038492-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 3 of n): The 500 Giga-triple Runs</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-08-29#1808</atom:id>
  <atom:published>2014-08-29T16:49:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the evening of day 8, we have kernel settings in the cluster changed to allow more &lt;code&gt;mmaps&lt;/code&gt;. At this point, we notice that the dataset is missing the implied &lt;code&gt;types&lt;/code&gt; of &lt;code&gt;products&lt;/code&gt;; i.e., the most specific &lt;code&gt;type&lt;/code&gt; is given but its superclasses are not directly associated with the &lt;code&gt;product&lt;/code&gt;. We have always run this with this unique inference materialized, which is also how the data generator makes the data, with the right switch. But the switch was not used. So a further 10 Gt (Giga-triples) are added, by running a SQL script to make the superclasses explicit.&lt;/p&gt; &lt;p&gt;At this point, we run BSBM &lt;i&gt;explore&lt;/i&gt; for the first time. To what degree does the 37.5 Gt predict the 500 Gt behavior? First, there is an overflow that causes a query plan cost to come out negative if the default graph is specified. This is a bona fide software bug you don&amp;#39;t get unless a sample is quite large. Also, we note that starting the databases takes a few minutes due to disk. Further, the first query takes a long time to compile, again because of sampling the database for overall statistics.&lt;/p&gt; &lt;p&gt;The statistics are therefore gathered by running a few queries, and then saved. Subsequent runs will reload the stats from the file system, saving some minutes of start time. There is a function for this, &lt;code&gt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_stat_import.html&quot; id=&quot;link-id0x2aabc6382718&quot;&gt;stat_import&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_stat_export.html&quot; id=&quot;link-id0x2aabf4834688&quot;&gt;stat_export&lt;/a&gt;&lt;/code&gt;. These are used for a similar purpose by some users.&lt;/p&gt; &lt;p&gt;On day 10, Wednesday August 20, we have some results of BSBM &lt;i&gt;explore&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Then, we get into BSBM &lt;i&gt;updates&lt;/i&gt;. The BSBM generator makes an update dataset, but it cannot be made large enough. The BSBM test driver suite is by now hated and feared in equal measure. Is it bad in and of itself? Depends. It was certainly not made for large data. Anyway, no fix will be attempted this time. Instead, a couple of SQL procedures are made to drive a random update workload. These can run long enough to get a steady state with warm cache, which is what any OLTP measurement needs.&lt;/p&gt; &lt;p&gt;On day 12, some updates are measured, with a one hour ramp-up to steady-state, but these are not quite the right mix, since these are &lt;code&gt;products&lt;/code&gt; only and the mix needs to contain &lt;code&gt;offers&lt;/code&gt; and &lt;code&gt;reviews&lt;/code&gt; also. The first steady-state rate was 109 Kt/s, a full 50x less than the bulk load, but then this was very badly bound by latency. So, the updates are adjusted to have more variety. The final measurement was on day 17. Now the steady-state rate is 2563 Kt/s, which is better but still quite bound by network. By adding diversity to the dataset, we get slammed by a sharp rise in warm-up time (now 2 hours to be at 230 Kt/s), at which point we launch the &lt;i&gt;explore&lt;/i&gt; mix to be timed during &lt;i&gt;update&lt;/i&gt;. Time is short and we do not want to find out exactly how long it takes to get the plateau in insert rate. As it happens, the &lt;i&gt;explore&lt;/i&gt; mix is hardly slowed down by the &lt;i&gt;updates&lt;/i&gt;, but the &lt;i&gt;updates&lt;/i&gt; get hit worse, so that the rate goes to about 1/3 of what it was, then comes back up when the &lt;i&gt;explore&lt;/i&gt; is finished. Finally, half an hour after this, there is a steady state of 263 Kt/s &lt;i&gt;update&lt;/i&gt; rate.&lt;/p&gt; &lt;p&gt;Of course, the main object of the festivities is still the &lt;i&gt;business intelligence&lt;/i&gt; (BI) mix. This is our (specifically, Orri&amp;#39;s) own invention from years back, subsequently formulated in SPARQL by &lt;a href=&quot;http://www.fu-berlin.de/&quot; id=&quot;link-id0x2aabf519c648&quot;&gt;FU Berlin&lt;/a&gt; (&lt;a href=&quot;http://www.wiwiss.fu-berlin.de/en/fachbereich/bwl/pwo/bizer/team/SchultzAndreas.html&quot; id=&quot;link-id0x2aabc6711de8&quot;&gt;Andreas Schultz&lt;/a&gt;). Well, it is already something to do big joins with 150 Gt, all on index and vectored random access, as was done in January 2013, the last time results were published on the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aabc64b5438&quot;&gt;CWI&lt;/a&gt; &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aabc610c9d8&quot;&gt;cluster&lt;/a&gt;. You may remember that there was &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x2aabc63f7cc8&quot;&gt;an aborted attempt in January 2014&lt;/a&gt;. So now, with the LOD2 end date under two weeks away, we will take the BI racer out for a spin with 500 Gt. This is now a very different proposition from Jan 2013, as we have by now done the whole &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabf4ecc6f8&quot;&gt;TPC-H&lt;/a&gt; work &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabc6447a18&quot;&gt;documented on this blog&lt;/a&gt;. This serves to show, &lt;i&gt;inter alia,&lt;/i&gt; that we can run with the best in the much bigger and harder mainstream database sports. The full benefits of this will be realized for the semantic data public still this year, so this is more than personal vanity.&lt;/p&gt; &lt;p&gt;So we will see. The BI mix is not exactly TPC-H, but what is good for one is good for the other. Checking that the plans are good on the 37 Gt scale model is done around day 12. On day 13, we try this on the larger cluster. You never know — pushing the envelope, even when you know what you are doing and have written the whole thing, is still a dive in the fog. Claiming otherwise would be a lie lacking credibility. The iceberg which first emerges is overflow and partition skew. Well, there can be a lot of messages if all messages go via the same path. So we make the data structure different and retry and now die from out of memory. On the scale model, this looks like a little imbalance you don&amp;#39;t bother to notice; at 13x scale, this kills. So, as is the case with most database problems, the query plan is bad. Instead of using a &lt;code&gt;PSOG&lt;/code&gt; index, it uses a &lt;code&gt;POSG&lt;/code&gt; index, and there is a constant for &lt;code&gt;O&lt;/code&gt;. Partitioning is on either &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;O&lt;/code&gt;, whichever is first. Not hard to fix, but still needs a cost-model adjustment to penalize low-cardinality partition columns. This is something you don&amp;#39;t get with TPC-H, where there are hardly any indices. Once this is fixed there are other problems, such as Q5, which we ended up leaving out. The scale model is good; the large one does not produce a plan, because some search-space corner is visited that is not visited in the scale model, due to different ratios of things in the cost model. Could be a couple of days to track; this is complex stuff. So we dropped it. It is not a big part of the metric, and its omission is immaterial to the broader claim of handling 500 Gt in all safety and comfort. The moral is: never get stuck; only do what is predictable, insofar as anything in this shadowy frontier is such.&lt;/p&gt; &lt;p&gt;So, on days 15 and 16, the BI mix that is reported was run. The multiuser score was negatively impacted by memory skew, so some swapping on one of the nodes, but the run finished in about 2 hours anyway. The peak of transient memory consumption is another thing that you cannot forecast with exact precision. There is no model for that; the query streams are in random order, and you just have to try. And it is a few hours per iteration, so you don&amp;#39;t want to be stuck doing that either. A rerun would get a higher multiuser BI score; maybe one will be made but not before all the rest is wrapped up.&lt;/p&gt; &lt;p&gt;Now we are talking 2 hours, versus 9 hours with the 150 Gt set back in January 2013. So 3.3x the data, 4.5x less time, 1.5x the gear. This comes out at one order of magnitude. With a better score from better memory balance and some other fixes, a 15x improvement for BSBM BI is in the cards.&lt;/p&gt; &lt;p&gt;The final &lt;i&gt;explore&lt;/i&gt; runs were made on day 18, while writing the report to be published at the LOD2 deliverables repository. The report contains in depth discussion on the query plans and diverse database tricks and their effectiveness.&lt;/p&gt; &lt;p&gt;The overall moral of this trip into these uncharted spaces is this: Expect things to break. You have to be the designer and author of the system to take it past its limits. You will cut it or you won&amp;#39;t, and nobody can do anything about it, not with the best intentions, nor even with the best expertise, which both were present. This is true of the last minute daredevil stuff like this; if you have a year full time instead of the last 20 days of a project, all is quite different, and these things are more leisurely. This might then become a committee affair, though, which has different problems. In the end, the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabf48373a8&quot;&gt;Virtuoso DBMS&lt;/a&gt; has never thrown anything at us we could not handle. The uncertainty in trips of this sort is with the hardware platform, of which we had to &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabc753df48&quot;&gt;replace 2 units to get on the way&lt;/a&gt;, and with how fast you can locate and fix a software problem. So you pick the quickest ones and leave the uncertain aside. There is another category of rare events like network failures that in theory cannot happen. Yet they do. So, to program a cluster, you have to have some recovery things for these. We saw &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aab709be078&quot;&gt;a couple of these along the way&lt;/a&gt;. Duplication of these can take days, and whether this correlates with specific links or is a bona fide software thing is time consuming to prove, and getting into this is a sure way to lose the race. These seem to be load peaks outside of steady-state; steady-state is in fact very steady once it is there. Except at the start, network glitches were not a big factor in these experiments. The bulk of these went away after replacing a machine. After this we twice witnessed something that cannot exist but knew better than to get stuck with that. Neither incident happened again. This is days of running at a cross sectional 1 GB/s of traffic. These are the truly unpredictable, and, in a crash course like this, can sink the whole gig no matter how good you are.&lt;/p&gt; &lt;p&gt;Thanks are due to CWI and especially &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aab728cbd38&quot;&gt;Peter Boncz&lt;/a&gt; for providing the race track as well as advice and support.&lt;/p&gt; &lt;p&gt;In the next installments of this series, we will look at how schema and characteristic sets will deliver the promise of RDF without its cost. All the experiments so far were done with a quads table, as always before. So we could say that the present level is close to the limit of the achievable within this physical model. The future lies beyond the misconception of triples/quads as primary physical model.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1804&quot; id=&quot;link-id0x2aabf5507888&quot;&gt; LOD2 Finale (part 1): RDF Before The Dawn&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabf5175be8&quot;&gt; LOD2 Finale (part 2): The 500 Giga-triples&lt;/a&gt; &lt;/li&gt; &lt;li&gt; LOD2 Finale (part 3): The 500 Giga-triple Runs&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-29T12:49:53.491880-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 2 of n): The 500 Giga-triples</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-08-18#1807</atom:id>
  <atom:published>2014-08-18T20:55:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;No epic is complete without a descent into hell. Enter the &lt;i&gt;historia calamitatum&lt;/i&gt; of the 500 Giga-triples (Gt) at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x15b8cbb8&quot;&gt;CWI&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x15ead658&quot;&gt;Scilens&lt;/a&gt; cluster.&lt;/p&gt; &lt;p&gt;Now, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x15a53918&quot;&gt;from last time&lt;/a&gt;, we know to generate the data without 10 GB of namespace prefixes per file and with many short files. So we have 1.5 TB of gzipped data in 40,000 files, spread over 12 machines. The data generator has again been modified. Now the generation was about 4 days. Also from last time, we know to treat small integers specially when they occur as partition keys: 1 and 2 are very common values and skew becomes severe if they all go to the same partition; hence consecutive small &lt;code&gt;INTs&lt;/code&gt; each go to a different partition, but for larger ones the low 8 bits are ignored, which is good for compression: Consecutive values must fall in consecutive places, but not for small &lt;code&gt;INTs&lt;/code&gt;. Another uniquely brain-dead feature of the BSBM generator has also been rectified: When generating multiple files, the program would put things in files in a round-robin manner, instead of putting consecutive numbers in consecutive places, which is how every other data generator or exporter does it. This impacts bulk load locality and as you, dear reader, ought to know by now, performance comes from (1) locality and (2) parallelism.&lt;/p&gt; &lt;p&gt;The machines are similar to last time: each a dual E5 2650 v2 with 256 GB RAM and QDR InfiniBand (IB). No SSD this time, but a slightly higher clock than last time; anyway, a different set of machines.&lt;/p&gt; &lt;p&gt;The first experiment is with triples, so no characteristic sets, no schema.&lt;/p&gt; &lt;p&gt;So, first day (Monday), we notice that one cannot allocate more than 9 GB of memory. Then we figure out that it cannot be done with &lt;code&gt;malloc&lt;/code&gt;, whether in small or large pieces, but it can with &lt;code&gt;mmap&lt;/code&gt;. Ain&amp;#39;t seen that before. One day shot. Then, towards the end of day 2, load begins. But it does not run for more than 15 minutes before a network error causes the whole thing to abort. All subsequent tries die within 15 minutes. Then, in the morning of day 3, we switch from IB to Gigabit Ethernet (GigE). For loading this is all the same; the maximal aggregate throughput is 800 MB/s, which is around 40% of the nominal bidirectional capacity of 12 GigE&amp;#39;s. So, it works better, for 30 minutes, and one can even stop the load and do a checkpoint. But after resuming, one box just dies; does not even respond to ping. We change this to another. After this, still running on GigE, there are no more network errors. So, at the end of day 3, maybe 10% of the data are in. But now it takes 2h21min to make a checkpoint, i.e., make the loaded data durable on disk. One of the boxes manages to write 2 MB/s to a RAID-0 of three 2 TB drives. Bad disk, seen such before. The data can however be read back once the write is finally done.&lt;/p&gt; &lt;p&gt;Well, this is a non-starter. So, by mid-day of day 4, another machine has been replaced. Now writing to disk is possible within expected delays.&lt;/p&gt; &lt;p&gt;In the afternoon of day 4, the load rate is about 4.3 Mega-triples (Mt) per second, all going in RAM.&lt;/p&gt; &lt;p&gt;In the evening of day 4, adding more files to load in parallel increases the load rate to between 4.9 and 5.2 Mt/s. This is about as fast as this will go, since the load is not exactly even. This comes from the RDF stupidity of keeping an index on everything, so even object values where an index is useless get indexed, leading to some load peaks. For example, there is an index on &lt;code&gt;POSG&lt;/code&gt; for triples were the predicate is &lt;code&gt;rdf:type&lt;/code&gt; and the object is a common type. Use of characteristic sets will stop this nonsense.&lt;/p&gt; &lt;p&gt;But let us not get ahead of the facts: At 9:10 PM of day 4, the whole cluster goes unreachable. No, this is not a software crash or swapping; this also affects boxes on which nothing of the experiment was running. A whole night of running is shot. &lt;/p&gt; &lt;p&gt;A previous scale model experiment of loading 37.5 Gt in 192 GB of RAM, paging to a pair of 2 TB disks, has been done a week before. This finishes in time, keeping a load rate of above 400 Kt/s on a 12-core box.&lt;/p&gt; &lt;p&gt;At 10AM on day 5 (Friday), the cluster is rebooted; a whole night&amp;#39;s run missed. The cluster starts and takes about 30 minutes to get to its former 5 Mt/s load rate. We now try switching the network back to InfiniBand. The whole ethernet network seemed to have crashed at 9PM on day 4. This is of course unexplained but the experiment had been driving the ethernet at about half its cross-sectional throughput, so maybe a switch crashed. We will never know. We will now try IB rather than risk this happening again, especially since if it did repeat, the whole weekend would be shot, as we would have to wait for the admin to reboot the lot on Monday (day 8).&lt;/p&gt; &lt;p&gt;So, at noon on day 5, the cluster is restarted with IB. The cruising speed is now 6.2 Mt/s, thanks to the faster network. The cross sectional throughput is about 960 MB/s, up from 720 MB/s, which accounts for the difference. CPU load is correspondingly up. This is still not full platform since there is load unbalance as noted above.&lt;/p&gt; &lt;p&gt;At 9PM on day 5, the rate is around 5.7 Mt/s with the peak node at 1500% CPU out of a possible 1600%. The next one is under 800%, which is just to show what it means to index everything. In specific, the node that has the highest CPU is the one in whose partition the &lt;code&gt;bsbm:offer&lt;/code&gt; class falls, so that there is a local peak since one of every 9 or so triples says that something is an &lt;code&gt;offer&lt;/code&gt;. The stupidity of the triple store is to index garbage like this to begin with. The reason why the performance is still good is that a &lt;code&gt;POSG&lt;/code&gt; index where &lt;code&gt;P&lt;/code&gt; and &lt;code&gt;O&lt;/code&gt; are fixed and the &lt;code&gt;S&lt;/code&gt; is densely ascending is very good, with everything but the &lt;code&gt;S&lt;/code&gt; represented as run lengths and the &lt;code&gt;S&lt;/code&gt; as bitmaps. Still, no representation at all is better for performance than even the most efficient representation.&lt;/p&gt; &lt;p&gt;The journey consists of 3 different parts. At 10PM, the 3rd and last part is started. The triples have more literals, but the load is more even. The cruising speed is 4.3 Mt/s down from 6.2, but the data has a different shape, including more literals.&lt;/p&gt; &lt;p&gt;The last stretch of the data is about reviews. This stretch of the data has less skew. So we increase parallelism, running 8 x 24 files at a time. The load rate goes above 6.3 Mt/s.&lt;/p&gt; &lt;p&gt;At 6:45 in the morning of day 6, the data is all loaded. The count of triples is 490.0 billion. If the load were done in a single stretch without stops and reconfiguration, it would likely go in under 24h. The average rate for a 4 hour sample between midnight and 4AM of day 6 is 6.8 MT/s. The resulting database files add up to 10.9 TB, with about 20% of the volume in unallocated pages.&lt;/p&gt; &lt;p&gt;At this time, noon of day 6, we find that some cross-partition joins need more distinct pieces of memory than the default kernel settings allow per process. A large number of partitions makes a large number of sometimes long messages which makes many &lt;code&gt;mmaps&lt;/code&gt;. So we will wait until morning of day 8 (Monday) for the administrator to set these. In the meantime, we analyze the behavior of the workload on the 37 Gt scale model cluster on my desktop.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a id=&quot;link-id0x2aabe4b591b8&quot;&gt;Indexing everything&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Having literals and URI strings via dictionary &lt;/li&gt; &lt;li&gt; Having a join for every attribute &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-09-06T20:48:58.008009-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 1 of n): RDF Before The Dawn</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-08-18#1806</atom:id>
  <atom:published>2014-08-18T20:55:52Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://lod2.eu/Welcome.html&quot; id=&quot;link-id0x2aabceb4bed8&quot;&gt;LOD2 FP7&lt;/a&gt; ends at the end of August, 2014. This post begins a series that will crown the project with a grand finale, another decisive step towards the project’s chief goal of giving RDF and linked data performance parity with SQL systems.&lt;/p&gt; &lt;p&gt;In a nutshell, LOD2 went like this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Triples were done right, taking the best of the column store world and adapting it to &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabf08d88b8&quot;&gt;RDF&lt;/a&gt;. This is now in widespread use.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2aabf08cc318&quot;&gt;SQL&lt;/a&gt; was done right, as I have described in detail in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabf0880b28&quot;&gt;TPC-H series&lt;/a&gt;. This is generally available as open source in &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aabf086a3e8&quot;&gt;v7fasttrack&lt;/a&gt;. SQL is the senior science and a runner-up like sem-tech will not carry the day without mastering this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;RDF is now breaking free of the triple store. RDF is a very general, minimalistic way of talking about things. It is not a prescription on how to do database. Confusing these two things has given rise to RDF’s relative cost against alternatives. To cap off LOD2, we will have the flexibility of triples with the speed of the best SQL.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;In this post we will look at accomplishments so far and outline what is to follow during August. We will also look at what in fact constitutes the RDF overhead, why this is presently so, and why this does not have to stay thus.&lt;/p&gt; &lt;p&gt;This series will be of special interest to anybody concerned with RDF efficiency and scalability.&lt;/p&gt; &lt;p&gt;At the beginning of LOD2, I wrote &lt;a href=&quot;http://www.openlinksw.com/www.openlinksw.com/weblog/oerling/?id=1627&quot; id=&quot;link-id0x2aabcfb37208&quot;&gt;a blog post discussing the RDF technology and its planned revolution in terms of the legend of Perseus&lt;/a&gt;. The classics give us exemplars and archetypes, but actual histories seldom follow them one-to-one; rather, events may have a fractal nature where subplots reproduce the overall scheme of the containing story.&lt;/p&gt; &lt;p&gt;So it is also with LOD2: The Promethean pattern of fetching the fire (state of the art of the column store) from the gods (the DB world) and bringing it to fuel the campfires of the primitive semantic tribes is one phase, but it is not the totality. This is successfully concluded, and Virtuoso 7 is widely used at present. Space efficiency gains are about 3x over the previous, with performance gains anywhere from 3 to 100x. As pointed out in the Star Schema Benchmark series (&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aabf08c5b08&quot;&gt;part 1&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1733&quot; id=&quot;link-id0x2aabf086a528&quot;&gt;part 2&lt;/a&gt;), in the good case one can run circles in SPARQL around anything but the best SQL analytics databases.&lt;/p&gt; &lt;p&gt;In the larger scheme of things, this is just preparation. In the classical pattern, there is the call or the crisis: Presently this is that having done triples about as right as they can be done, the mediocre in SQL can be vanquished, but the best cannot. Then there is the actual preparation: Perseus talking to Athena and receiving the shield of polished brass and the winged sandals. In the present case, this is my second pilgrimage to Mount Database, consisting of the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabf081f358&quot;&gt;TPC-H series&lt;/a&gt;. Now, the incense has been burned and libations offered at each of the 22 stations. This is not reading papers, but personally making one of the best-ever implementations of this foundational workload. This establishes Virtuoso as one of the top-of-the-line SQL analytics engines. The RDF public, which is anyway the principal Virtuoso constituency today, may ask what this does for them.&lt;/p&gt; &lt;p&gt;Well, without this step, the LOD2 goal of performance parity with SQL would be both meaningless and unattainable. The goal of parity is worth something only if you compare the RDF contestant to the very best SQL. And the comparison cannot possibly be successful unless it incorporates the very same hard core of down-to-the-metal competence the SQL world has been pursuing now for over forty years.&lt;/p&gt; &lt;p&gt;It is now time to cut the Gorgon’s head. The knowledge and prerequisite conditions exist.&lt;/p&gt; &lt;p&gt;The epic story is mostly about principles. If it is about personal combat, the persons stand for values and principles rather than for individuals. Here the enemy is actually an illusion, an error of perception, that has kept RDF in chains all this time. Yes, RDF is defined as a data model with triples in named graphs, i.e., quads. If nothing else is said, an RDF Store is a thing that can take arbitrary triples and retrieve them with SPARQL. The naïve implementation is to store things as rows in a quad table, indexed in any number of ways. There have been other approaches suggested, such as property tables or materialized views of some joins, but these tend to flush the baby with the bathwater: If RDF is used in the first place, it is used for its schema-less-ness and for having global identifiers. In some cases, there is also some inference, but the matter of schema-less-ness and identifiers predominates.&lt;/p&gt; &lt;p&gt;We need to go beyond a triple table and a dictionary of URI names while maintaining the present semantics and flexibility. Nobody said that physical structure needs to follow this. Everybody just implements things this way because this is the minimum that will in any case be required. Combining this with a SQL database for some other part of the data/workload hits basically insoluble problems of impedance mismatch between the SQL and SPARQL type systems, maybe using multiple servers for different parts of a query, etc. But if you own one of the hottest SQL racers in DB city and can make it do anything you want, most of these problems fall away.&lt;/p&gt; &lt;p&gt;The idea is simple: Put the &lt;i&gt;de facto&lt;/i&gt; rectangular part of RDF data into tables; do not naively index everything in places where an index gives no benefit; keep the irregular or sparse part of the data as quads. Optimize queries according to the table-like structure, as that is where the volume is and where getting the best plan is a make or break matter, as we saw in the TPC-H series. Then, execute in a way where the details of the physical plan track the data; i.e., sometimes the operator is on a table, sometimes on triples, for the long tail of exceptions.&lt;/p&gt; &lt;p&gt;In the next articles we will look at how this works and what the gains are.&lt;/p&gt; &lt;p&gt;These experiments will for the first time showcase the &lt;i&gt;adaptive schema&lt;/i&gt; features of the Virtuoso RDF store. Some of these features will be commercial only, but the interested will be able to reproduce the single server experiments themselves using the v7fasttrack open source preview. This will be updated around the second week of September to give a preview of this with BSBM and possibly some other datasets, e.g., Uniprot. Performance gains for regular datasets will be very large.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; LOD2 Finale (part 1): RDF Before The Dawn&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabf08c6048&quot;&gt; LOD2 Finale (part 2): The 500 Giga-triples&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1808&quot; id=&quot;link-id0x2aabc37bf8e8&quot;&gt; LOD2 Finale (part 3): The 500 Giga-triple Runs&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-29T12:50:47.730911-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 2 of n): The 500 Giga-triples</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-08-18#1805</atom:id>
  <atom:published>2014-08-18T20:54:38Z</atom:published>
  <atom:content type="html">&lt;p&gt;No epic is complete without a descent into hell. Enter the &lt;i&gt;historia calamitatum&lt;/i&gt; of the 500 Giga-triples (Gt) at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x15b8cbb8&quot;&gt;CWI&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x15ead658&quot;&gt;Scilens&lt;/a&gt; cluster.&lt;/p&gt; &lt;p&gt;Now, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x15a53918&quot;&gt;from last time&lt;/a&gt;, we know to generate the data without 10 GB of namespace prefixes per file and with many short files. So we have 1.5 TB of gzipped data in 40,000 files, spread over 12 machines. The data generator has again been modified. Now the generation was about 4 days. Also from last time, we know to treat small integers specially when they occur as partition keys: 1 and 2 are very common values and skew becomes severe if they all go to the same partition; hence consecutive small &lt;code&gt;INTs&lt;/code&gt; each go to a different partition, but for larger ones the low 8 bits are ignored, which is good for compression: Consecutive values must fall in consecutive places, but not for small &lt;code&gt;INTs&lt;/code&gt;. Another uniquely brain-dead feature of the BSBM generator has also been rectified: When generating multiple files, the program would put things in files in a round-robin manner, instead of putting consecutive numbers in consecutive places, which is how every other data generator or exporter does it. This impacts bulk load locality and as you, dear reader, ought to know by now, performance comes from (1) locality and (2) parallelism.&lt;/p&gt; &lt;p&gt;The machines are similar to last time: each a dual E5 2650 v2 with 256 GB RAM and QDR InfiniBand (IB). No SSD this time, but a slightly higher clock than last time; anyway, a different set of machines.&lt;/p&gt; &lt;p&gt;The first experiment is with triples, so no characteristic sets, no schema.&lt;/p&gt; &lt;p&gt;So, first day (Monday), we notice that one cannot allocate more than 9 GB of memory. Then we figure out that it cannot be done with &lt;code&gt;malloc&lt;/code&gt;, whether in small or large pieces, but it can with &lt;code&gt;mmap&lt;/code&gt;. Ain&amp;#39;t seen that before. One day shot. Then, towards the end of day 2, load begins. But it does not run for more than 15 minutes before a network error causes the whole thing to abort. All subsequent tries die within 15 minutes. Then, in the morning of day 3, we switch from IB to Gigabit Ethernet (GigE). For loading this is all the same; the maximal aggregate throughput is 800 MB/s, which is around 40% of the nominal bidirectional capacity of 12 GigE&amp;#39;s. So, it works better, for 30 minutes, and one can even stop the load and do a checkpoint. But after resuming, one box just dies; does not even respond to ping. We change this to another. After this, still running on GigE, there are no more network errors. So, at the end of day 3, maybe 10% of the data are in. But now it takes 2h21min to make a checkpoint, i.e., make the loaded data durable on disk. One of the boxes manages to write 2 MB/s to a RAID-0 of three 2 TB drives. Bad disk, seen such before. The data can however be read back once the write is finally done.&lt;/p&gt; &lt;p&gt;Well, this is a non-starter. So, by mid-day of day 4, another machine has been replaced. Now writing to disk is possible within expected delays.&lt;/p&gt; &lt;p&gt;In the afternoon of day 4, the load rate is about 4.3 Mega-triples (Mt) per second, all going in RAM.&lt;/p&gt; &lt;p&gt;In the evening of day 4, adding more files to load in parallel increases the load rate to between 4.9 and 5.2 Mt/s. This is about as fast as this will go, since the load is not exactly even. This comes from the RDF stupidity of keeping an index on everything, so even object values where an index is useless get indexed, leading to some load peaks. For example, there is an index on &lt;code&gt;POSG&lt;/code&gt; for triples were the predicate is &lt;code&gt;rdf:type&lt;/code&gt; and the object is a common type. Use of characteristic sets will stop this nonsense.&lt;/p&gt; &lt;p&gt;But let us not get ahead of the facts: At 9:10 PM of day 4, the whole cluster goes unreachable. No, this is not a software crash or swapping; this also affects boxes on which nothing of the experiment was running. A whole night of running is shot. &lt;/p&gt; &lt;p&gt;A previous scale model experiment of loading 37.5 Gt in 192 GB of RAM, paging to a pair of 2 TB disks, has been done a week before. This finishes in time, keeping a load rate of above 400 Kt/s on a 12-core box.&lt;/p&gt; &lt;p&gt;At 10AM on day 5 (Friday), the cluster is rebooted; a whole night&amp;#39;s run missed. The cluster starts and takes about 30 minutes to get to its former 5 Mt/s load rate. We now try switching the network back to InfiniBand. The whole ethernet network seemed to have crashed at 9PM on day 4. This is of course unexplained but the experiment had been driving the ethernet at about half its cross-sectional throughput, so maybe a switch crashed. We will never know. We will now try IB rather than risk this happening again, especially since if it did repeat, the whole weekend would be shot, as we would have to wait for the admin to reboot the lot on Monday (day 8).&lt;/p&gt; &lt;p&gt;So, at noon on day 5, the cluster is restarted with IB. The cruising speed is now 6.2 Mt/s, thanks to the faster network. The cross sectional throughput is about 960 MB/s, up from 720 MB/s, which accounts for the difference. CPU load is correspondingly up. This is still not full platform since there is load unbalance as noted above.&lt;/p&gt; &lt;p&gt;At 9PM on day 5, the rate is around 5.7 Mt/s with the peak node at 1500% CPU out of a possible 1600%. The next one is under 800%, which is just to show what it means to index everything. In specific, the node that has the highest CPU is the one in whose partition the &lt;code&gt;bsbm:offer&lt;/code&gt; class falls, so that there is a local peak since one of every 9 or so triples says that something is an &lt;code&gt;offer&lt;/code&gt;. The stupidity of the triple store is to index garbage like this to begin with. The reason why the performance is still good is that a &lt;code&gt;POSG&lt;/code&gt; index where &lt;code&gt;P&lt;/code&gt; and &lt;code&gt;O&lt;/code&gt; are fixed and the &lt;code&gt;S&lt;/code&gt; is densely ascending is very good, with everything but the &lt;code&gt;S&lt;/code&gt; represented as run lengths and the &lt;code&gt;S&lt;/code&gt; as bitmaps. Still, no representation at all is better for performance than even the most efficient representation.&lt;/p&gt; &lt;p&gt;The journey consists of 3 different parts. At 10PM, the 3rd and last part is started. The triples have more literals, but the load is more even. The cruising speed is 4.3 Mt/s down from 6.2, but the data has a different shape, including more literals.&lt;/p&gt; &lt;p&gt;The last stretch of the data is about reviews. This stretch of the data has less skew. So we increase parallelism, running 8 x 24 files at a time. The load rate goes above 6.3 Mt/s.&lt;/p&gt; &lt;p&gt;At 6:45 in the morning of day 6, the data is all loaded. The count of triples is 490.0 billion. If the load were done in a single stretch without stops and reconfiguration, it would likely go in under 24h. The average rate for a 4 hour sample between midnight and 4AM of day 6 is 6.8 MT/s. The resulting database files add up to 10.9 TB, with about 20% of the volume in unallocated pages.&lt;/p&gt; &lt;p&gt;At this time, noon of day 6, we find that some cross-partition joins need more distinct pieces of memory than the default kernel settings allow per process. A large number of partitions makes a large number of sometimes long messages which makes many &lt;code&gt;mmaps&lt;/code&gt;. So we will wait until morning of day 8 (Monday) for the administrator to set these. In the meantime, we analyze the behavior of the workload on the 37 Gt scale model cluster on my desktop.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1804&quot; id=&quot;link-id0x1623e958&quot;&gt; LOD2 Finale (part 1): RDF Before The Dawn&lt;/a&gt; &lt;/li&gt; &lt;li&gt; LOD2 Finale (part 2): The 500 Giga-triples&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1808&quot; id=&quot;link-id0x2aabec4df498&quot;&gt; LOD2 Finale (part 3): The 500 Giga-triple Runs&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-29T12:50:27.602886-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Finale (part 1 of n): RDF Before The Dawn</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-08-18#1804</atom:id>
  <atom:published>2014-08-18T20:54:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://lod2.eu/Welcome.html&quot; id=&quot;link-id0x2aabceb4bed8&quot;&gt;LOD2 FP7&lt;/a&gt; ends at the end of August, 2014. This post begins a series that will crown the project with a grand finale, another decisive step towards the project’s chief goal of giving RDF and linked data performance parity with SQL systems.&lt;/p&gt; &lt;p&gt;In a nutshell, LOD2 went like this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Triples were done right, taking the best of the column store world and adapting it to &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabf08d88b8&quot;&gt;RDF&lt;/a&gt;. This is now in widespread use.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2aabf08cc318&quot;&gt;SQL&lt;/a&gt; was done right, as I have described in detail in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabf0880b28&quot;&gt;TPC-H series&lt;/a&gt;. This is generally available as open source in &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aabf086a3e8&quot;&gt;v7fasttrack&lt;/a&gt;. SQL is the senior science and a runner-up like sem-tech will not carry the day without mastering this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;RDF is now breaking free of the triple store. RDF is a very general, minimalistic way of talking about things. It is not a prescription on how to do database. Confusing these two things has given rise to RDF’s relative cost against alternatives. To cap off LOD2, we will have the flexibility of triples with the speed of the best SQL.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;In this post we will look at accomplishments so far and outline what is to follow during August. We will also look at what in fact constitutes the RDF overhead, why this is presently so, and why this does not have to stay thus.&lt;/p&gt; &lt;p&gt;This series will be of special interest to anybody concerned with RDF efficiency and scalability.&lt;/p&gt; &lt;p&gt;At the beginning of LOD2, I wrote &lt;a href=&quot;http://www.openlinksw.com/www.openlinksw.com/weblog/oerling/?id=1627&quot; id=&quot;link-id0x2aabcfb37208&quot;&gt;a blog post discussing the RDF technology and its planned revolution in terms of the legend of Perseus&lt;/a&gt;. The classics give us exemplars and archetypes, but actual histories seldom follow them one-to-one; rather, events may have a fractal nature where subplots reproduce the overall scheme of the containing story.&lt;/p&gt; &lt;p&gt;So it is also with LOD2: The Promethean pattern of fetching the fire (state of the art of the column store) from the gods (the DB world) and bringing it to fuel the campfires of the primitive semantic tribes is one phase, but it is not the totality. This is successfully concluded, and Virtuoso 7 is widely used at present. Space efficiency gains are about 3x over the previous, with performance gains anywhere from 3 to 100x. As pointed out in the Star Schema Benchmark series (&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aabf08c5b08&quot;&gt;part 1&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1733&quot; id=&quot;link-id0x2aabf086a528&quot;&gt;part 2&lt;/a&gt;), in the good case one can run circles in SPARQL around anything but the best SQL analytics databases.&lt;/p&gt; &lt;p&gt;In the larger scheme of things, this is just preparation. In the classical pattern, there is the call or the crisis: Presently this is that having done triples about as right as they can be done, the mediocre in SQL can be vanquished, but the best cannot. Then there is the actual preparation: Perseus talking to Athena and receiving the shield of polished brass and the winged sandals. In the present case, this is my second pilgrimage to Mount Database, consisting of the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aabf081f358&quot;&gt;TPC-H series&lt;/a&gt;. Now, the incense has been burned and libations offered at each of the 22 stations. This is not reading papers, but personally making one of the best-ever implementations of this foundational workload. This establishes Virtuoso as one of the top-of-the-line SQL analytics engines. The RDF public, which is anyway the principal Virtuoso constituency today, may ask what this does for them.&lt;/p&gt; &lt;p&gt;Well, without this step, the LOD2 goal of performance parity with SQL would be both meaningless and unattainable. The goal of parity is worth something only if you compare the RDF contestant to the very best SQL. And the comparison cannot possibly be successful unless it incorporates the very same hard core of down-to-the-metal competence the SQL world has been pursuing now for over forty years.&lt;/p&gt; &lt;p&gt;It is now time to cut the Gorgon’s head. The knowledge and prerequisite conditions exist.&lt;/p&gt; &lt;p&gt;The epic story is mostly about principles. If it is about personal combat, the persons stand for values and principles rather than for individuals. Here the enemy is actually an illusion, an error of perception, that has kept RDF in chains all this time. Yes, RDF is defined as a data model with triples in named graphs, i.e., quads. If nothing else is said, an RDF Store is a thing that can take arbitrary triples and retrieve them with SPARQL. The naïve implementation is to store things as rows in a quad table, indexed in any number of ways. There have been other approaches suggested, such as property tables or materialized views of some joins, but these tend to flush the baby with the bathwater: If RDF is used in the first place, it is used for its schema-less-ness and for having global identifiers. In some cases, there is also some inference, but the matter of schema-less-ness and identifiers predominates.&lt;/p&gt; &lt;p&gt;We need to go beyond a triple table and a dictionary of URI names while maintaining the present semantics and flexibility. Nobody said that physical structure needs to follow this. Everybody just implements things this way because this is the minimum that will in any case be required. Combining this with a SQL database for some other part of the data/workload hits basically insoluble problems of impedance mismatch between the SQL and SPARQL type systems, maybe using multiple servers for different parts of a query, etc. But if you own one of the hottest SQL racers in DB city and can make it do anything you want, most of these problems fall away.&lt;/p&gt; &lt;p&gt;The idea is simple: Put the &lt;i&gt;de facto&lt;/i&gt; rectangular part of RDF data into tables; do not naively index everything in places where an index gives no benefit; keep the irregular or sparse part of the data as quads. Optimize queries according to the table-like structure, as that is where the volume is and where getting the best plan is a make or break matter, as we saw in the TPC-H series. Then, execute in a way where the details of the physical plan track the data; i.e., sometimes the operator is on a table, sometimes on triples, for the long tail of exceptions.&lt;/p&gt; &lt;p&gt;In the next articles we will look at how this works and what the gains are.&lt;/p&gt; &lt;p&gt;These experiments will for the first time showcase the &lt;i&gt;adaptive schema&lt;/i&gt; features of the Virtuoso RDF store. Some of these features will be commercial only, but the interested will be able to reproduce the single server experiments themselves using the v7fasttrack open source preview. This will be updated around the second week of September to give a preview of this with BSBM and possibly some other datasets, e.g., Uniprot. Performance gains for regular datasets will be very large.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt;LOD2 Finale Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; LOD2 Finale (part 1): RDF Before The Dawn&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1805&quot; id=&quot;link-id0x2aabf08c6048&quot;&gt; LOD2 Finale (part 2): The 500 Giga-triples&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1808&quot; id=&quot;link-id0x2aabec790038&quot;&gt; LOD2 Finale (part 3): The 500 Giga-triple Runs&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-29T12:50:31.754399-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 15 of n): TPC-H and the Science of Hash</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-05-28#1803</atom:id>
  <atom:published>2014-05-28T21:12:18Z</atom:published>
  <atom:content type="html">&lt;p&gt;This piece is dedicated to &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aac213639d8&quot;&gt;Peter Boncz&lt;/a&gt;, architect of &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x2aac22b5bc88&quot;&gt;Actian Vector&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x2aac22b5bc28&quot;&gt;MonetDB&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Query optimization is hard. It is a set of mutually interacting tricks and special cases. Execution is also hard, but there the tricks do not interact quite as much or as unpredictably. So, if there is a few percent of score to be had from optimization of either execution or query, I will take execution first. It is less likely to break things and will probably benefit a larger set of use cases.&lt;/p&gt; &lt;p&gt;As we see from the profile in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac2287c4f8&quot;&gt;the previous article&lt;/a&gt;, hash join is the main piece of execution in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac2287c4b8&quot;&gt;TPC-H&lt;/a&gt;. So between the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac2287c498&quot;&gt;article on late projection&lt;/a&gt; and the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2287c408&quot;&gt;first result preview&lt;/a&gt;, I changed the hash table used in &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/page/Hash_join&quot; id=&quot;link-id0x2aac21e835e8&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt; from cuckoo to linear.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s see how the hash tables work: &lt;a href=&quot;http://dbpedia.org/page/Cuckoo_hashing&quot; id=&quot;link-id0x2aac20599e98&quot;&gt;Cuckoo hash&lt;/a&gt; is a scheme where an entry can be in one of two possible places in the table. If a new entry is inserted and either of the possible places is unoccupied, it goes there. If both are occupied, it could be that one contains an entry whose other possible location is free -- and then that entry may be relocated. Thus an insert may push the previous occupant of the place somewhere else, which in turn may push another, and so on. It may happen that an insert is still not possible, in which case the entry to insert goes into an exceptions list.&lt;/p&gt; &lt;p&gt;To look up an entry, you get a hash number, and use different fields of it to pick the two places. Look in one, then the other, then the exceptions. If there is no match and the table is reasonably close to capacity, you will have looked in at least 3 widely-separated places to determine the absence of a match. In practice, the hash table consists on a prime number of distinct arrays of a fixed size (partitions), and each partition has its own exception list. A modulo of the hash number picks the array, then two further modulos of different parts of the number pick the places in the array.&lt;/p&gt; &lt;p&gt;In most cases in TPC-H, the hash joins are selective; i.e., most items on the probe side find no match in the hash table.&lt;/p&gt; &lt;p&gt;So, quite often you have 3 cache misses to show that there is no hit. This is, at least in theory, quite bad.&lt;/p&gt; &lt;p&gt;There are &lt;a href=&quot;http://dbpedia.org/page/Bloom_filter&quot; id=&quot;link-id0x2aac22b2ffb8&quot;&gt;Bloom filters&lt;/a&gt; before the hash table. The Bloom filter will prune most of the probes that would miss. A Bloom filter is an array of bits. Given a hash number, the Bloom filter will very efficiently tell you whether the entry is sure &lt;i&gt;not&lt;/i&gt; to be in the hash table. If the Bloom filter says it &lt;i&gt;can&lt;/i&gt; be in the hash table, you must look.&lt;/p&gt; &lt;p&gt;In the Virtuoso case, for each entry in the hash table, the Bloom filter has 8 bits. The Bloom check uses a field of the hash number to pick a 64-bit word from the Bloom filter. Then different fields of the hash number are used to set up-to 4 bits in a 64-bit bit-mask. When building the hash table, the masks are OR-ed into the Bloom filter. When probing, before looking in the hash table, the system checks to see if the bits corresponding to the hash number are all on in the appropriate word. If they are not, the hash lookup is sure to miss.&lt;/p&gt; &lt;p&gt;Most expositions of Bloom filters talk about setting two bits for every value. With two bits set, we found 8 bits-per-value to work best. More bits makes a larger filter and misses the cache more; fewer bits makes too many collisions, and the Bloom filter produces too many false positives. A significant finding is that with 8 bits-per-value, setting 4 bits instead of 2 causes the filter to be twice as selective. The simple trick of setting 4 bits cuts the number of hash lookups for items that passed the Bloom filter to half in many selective hash joins. Examples are the many joins of &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; or &lt;code&gt;supplier&lt;/code&gt; where there is a condition on the smaller table.&lt;/p&gt; &lt;p&gt;Still, even with Bloom filters, a cuckoo hash will make too many cache misses.&lt;/p&gt; &lt;p&gt;So, enter &lt;a href=&quot;http://dbpedia.org/page/Linear_hashing&quot; id=&quot;link-id0x2aac2219ccc8&quot;&gt;linear hash&lt;/a&gt;. The idea is simple: The hash number picks a place in an array. Either the entry being sought is in the vicinity, or it is not in the hash table. If the vicinity is full of other entries, the entry can still be in an exception list.&lt;/p&gt; &lt;p&gt;With this and cuckoo alike, there are 3 different variants of hash table:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;A set of single unique integers&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A single-integer key with 0 or more dependent values, possibly with a next link if the key is not unique&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A key of &lt;i&gt;n&lt;/i&gt; arbitrary values, 0 or more dependent values, optional next link if the key is not unique&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;In the first case, the hash table is an array of values; in the two other cases, it is an array of pointers. But since a pointer is 64 bits, of which the high 16 are not in the address space of x86_64, these high bits can be used to keep a part of the hash number. It will be necessary to dereference the pointer only if the high bits match the hash number. This means that nearly all lookups that do not find a match are handled with a single cache miss.&lt;/p&gt; &lt;p&gt;Each cache miss brings in a cache line of 8 words. The lookup starts at a point given by the hash number and wraps around at the end of the cache line. Only in the case that all 8 words are occupied but do not match does one need to look at the exceptions. There is one exception list for each partition of the hash table, like in the cuckoo scheme.&lt;/p&gt; &lt;p&gt;A hash lookup is always done on a vector of keys; the loop that takes most of the time is in fact the Bloom filter check. It goes as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; #define CHB_VAR(n) \ uint64 h##n, w##n, mask##n; #define CHB_INIT(n, i) \ MHASH_STEP_1 (h##n, i); \ w##n = bf[BF_WORD (h##n, sz)]; \ mask##n = BF_MASK (h##n); #define CHB_CK(n) \ { matches[mfill] = inx + n; \ mfill += (w##n &amp;amp; mask##n) == mask##n; } for (inx = inx; inx &amp;lt; last; inx ++) { CHB_VAR (0); CHB_INIT (0, REF ((ce_first + sizeof (ELT_T) * inx))); CHB_CK (0); } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the perfect loop for out-of-order execution. Now, I have tried every variation you can imagine, and this does not get better. The loop calculates a hash number, fetches the corresponding word from the Bloom filter, calculates a mask, stores the index of the key in a results array, and increments the results counter if all the bits were set. There is no control dependency anywhere, just a data dependency between successive iterations; i.e., to know where the result must go, you must know if the previous was a hit.&lt;/p&gt; &lt;p&gt;You can unroll this loop very easily, so, for example, take 4 keys, do the numbers, fetch the words, and then check them one after the other. One would think this would have more misses in flight at any one time, which it does. But it does not run any faster.&lt;/p&gt; &lt;p&gt;Maybe the loop is too long. Circumstantial evidence suggests that short loops are better for instruction prefetching. So, one can also make a loop that gets any number of words of the Bloom filter and puts them in one local array and the hash numbers in another array. A subsequent loop then reads the hash number, calculates the mask, and checks if there is a hit. In this way one can generate as many misses as one wants and check them as late as one wants. It so happens that doing 8 misses and then checking them is better than either 4 or 16. But 8 is still marginally worse than the loop first mentioned.&lt;/p&gt; &lt;p&gt;One can also vary the test. Instead of adding a truth value to the result counter, one can have&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;if ((word &amp;amp; mask) == mask) result[fill++] = inx;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;There is no clear difference between predication (incrementing the fill by truth value) and a conditional jump. The theory of out-of-order execution would predict predication to be better, but the difference is lost in measurement noise. This is true on both Intel Nehalem (Xeon 55xx) and Sandy Bridge (E5 26xx), but could be different on other architectures.&lt;/p&gt; &lt;p&gt;The multicore scalability of the test will give some information about platform utilization.&lt;/p&gt; &lt;p&gt;This is the ultimately simplified selective hash join:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT COUNT (*) FROM lineitem, part WHERE l_partkey = p_partkey AND p_size &amp;lt; 15 ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the second simplest hash join but misses the cache much more; since this now has a key and a dependent part in the hash table, there is an extra pointer to follow, and the hash entry is two words plus the pointer to these in the hash table array.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT SUM (p_retailprice) FROM lineitem, part WHERE l_partkey = p_partkey AND p_size &amp;lt; 15 ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;By adjusting the number of parts selected, we can vary the Bloom filter selectivity and the size of the hash table. Below, we show the times for the two queries with single-thread and 24-thread execution, with different percentages of the &lt;code&gt;part&lt;/code&gt; table on the build side of the hash join. All runs are against warm 100G TPC-H on the same test system as in the rest of the TPC-H series (dual Xeon E5-2630).&lt;/p&gt; &lt;p&gt;This table compares the performance of the linear and cuckoo implementations on the above queries (count vs. sum) on either 24 threads or 1 thread. Four data points are given for different sizes of hash table, given as percentage of the &lt;code&gt;part&lt;/code&gt; table (having 400K - 20M entries) in the hash table. The rightmost column, which represents the case where the entire &lt;code&gt;part&lt;/code&gt; table is on the build side does not have a Bloom filter; the other cases do. The Bloom bits are 8/4 for linear and 8/2 for cuckoo. The times are all in milliseconds, and the thousands separator is a comma.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Hash type&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;Query type&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;Threads&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;2% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;10% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;30% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;100% &lt;br /&gt; (ms)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,204&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,683&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3,100&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6,214&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,261&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,447&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5,059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13,086&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15,286&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;22,451&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;38,863&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;66,722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;17,575&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;33,664&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;81,927&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;179,013&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,849&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,840&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,105&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6,203&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,833&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,903&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9,446&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;19,652&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;25,146&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;39,064&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;57,383&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;85,105&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;33,647&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;67,089&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;121,989&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;240,941&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We clearly see cache effects on the two first lines, where the &lt;code&gt;SUM&lt;/code&gt; and &lt;code&gt;COUNT&lt;/code&gt; run in almost the same time on a small hash table but have a 2x difference on the larger hash table. The instruction path length is not very different for &lt;code&gt;SUM&lt;/code&gt; and &lt;code&gt;COUNT&lt;/code&gt;, but the memory footprint has a 3x difference. &lt;/p&gt; &lt;p&gt;We note that the SMP scalability of linear is slightly better, contrasting the ratio of 24-thread &lt;code&gt;SUM&lt;/code&gt; to single-thread &lt;code&gt;SUM&lt;/code&gt;. Both numbers are over 12x, indicating net benefit from core multithreading. (The test system has 12 physical cores.) The linear hash systematically outperforms cuckoo, understandably, since it makes a smaller net number of cache misses. The overall effect on the TPC-H score is noticeable, at around 15-20K units of composite score at 100G.&lt;/p&gt; &lt;p&gt;In conclusion, the Virtuoso hash join implementation is certainly on the level, with only small gains to be expected from further vectoring and prefetching. These results may be reproduced using the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aac22b45068&quot;&gt;v7fasttrack&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x2aac22b45028&quot;&gt;Virtuoso Open Source&lt;/a&gt; releases from &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aac22b44fc8&quot;&gt;GitHub&lt;/a&gt;; &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/develop/7&quot; id=&quot;link-id0x2aac20ead1d8&quot;&gt;develop/7&lt;/a&gt; for cuckoo and &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aac20ead1b8&quot;&gt;feature/analytics&lt;/a&gt; for linear hash.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x69cacf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabdcc22658&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x18d1d108&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabe8f39e58&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab64065478&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:43.081730-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 15 of n): TPC-H and the Science of Hash</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-05-28#1802</atom:id>
  <atom:published>2014-05-28T21:11:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;This piece is dedicated to &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aac213639d8&quot;&gt;Peter Boncz&lt;/a&gt;, architect of &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x2aac22b5bc88&quot;&gt;Actian Vector&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x2aac22b5bc28&quot;&gt;MonetDB&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Query optimization is hard. It is a set of mutually interacting tricks and special cases. Execution is also hard, but there the tricks do not interact quite as much or as unpredictably. So, if there is a few percent of score to be had from optimization of either execution or query, I will take execution first. It is less likely to break things and will probably benefit a larger set of use cases.&lt;/p&gt; &lt;p&gt;As we see from the profile in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac2287c4f8&quot;&gt;the previous article&lt;/a&gt;, hash join is the main piece of execution in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac2287c4b8&quot;&gt;TPC-H&lt;/a&gt;. So between the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac2287c498&quot;&gt;article on late projection&lt;/a&gt; and the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2287c408&quot;&gt;first result preview&lt;/a&gt;, I changed the hash table used in &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/page/Hash_join&quot; id=&quot;link-id0x2aac21e835e8&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt; from cuckoo to linear.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s see how the hash tables work: &lt;a href=&quot;http://dbpedia.org/page/Cuckoo_hashing&quot; id=&quot;link-id0x2aac20599e98&quot;&gt;Cuckoo hash&lt;/a&gt; is a scheme where an entry can be in one of two possible places in the table. If a new entry is inserted and either of the possible places is unoccupied, it goes there. If both are occupied, it could be that one contains an entry whose other possible location is free -- and then that entry may be relocated. Thus an insert may push the previous occupant of the place somewhere else, which in turn may push another, and so on. It may happen that an insert is still not possible, in which case the entry to insert goes into an exceptions list.&lt;/p&gt; &lt;p&gt;To look up an entry, you get a hash number, and use different fields of it to pick the two places. Look in one, then the other, then the exceptions. If there is no match and the table is reasonably close to capacity, you will have looked in at least 3 widely-separated places to determine the absence of a match. In practice, the hash table consists on a prime number of distinct arrays of a fixed size (partitions), and each partition has its own exception list. A modulo of the hash number picks the array, then two further modulos of different parts of the number pick the places in the array.&lt;/p&gt; &lt;p&gt;In most cases in TPC-H, the hash joins are selective; i.e., most items on the probe side find no match in the hash table.&lt;/p&gt; &lt;p&gt;So, quite often you have 3 cache misses to show that there is no hit. This is, at least in theory, quite bad.&lt;/p&gt; &lt;p&gt;There are &lt;a href=&quot;http://dbpedia.org/page/Bloom_filter&quot; id=&quot;link-id0x2aac22b2ffb8&quot;&gt;Bloom filters&lt;/a&gt; before the hash table. The Bloom filter will prune most of the probes that would miss. A Bloom filter is an array of bits. Given a hash number, the Bloom filter will very efficiently tell you whether the entry is sure &lt;i&gt;not&lt;/i&gt; to be in the hash table. If the Bloom filter says it &lt;i&gt;can&lt;/i&gt; be in the hash table, you must look.&lt;/p&gt; &lt;p&gt;In the Virtuoso case, for each entry in the hash table, the Bloom filter has 8 bits. The Bloom check uses a field of the hash number to pick a 64-bit word from the Bloom filter. Then different fields of the hash number are used to set up-to 4 bits in a 64-bit bit-mask. When building the hash table, the masks are OR-ed into the Bloom filter. When probing, before looking in the hash table, the system checks to see if the bits corresponding to the hash number are all on in the appropriate word. If they are not, the hash lookup is sure to miss.&lt;/p&gt; &lt;p&gt;Most expositions of Bloom filters talk about setting two bits for every value. With two bits set, we found 8 bits-per-value to work best. More bits makes a larger filter and misses the cache more; fewer bits makes too many collisions, and the Bloom filter produces too many false positives. A significant finding is that with 8 bits-per-value, setting 4 bits instead of 2 causes the filter to be twice as selective. The simple trick of setting 4 bits cuts the number of hash lookups for items that passed the Bloom filter to half in many selective hash joins. Examples are the many joins of &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; or &lt;code&gt;supplier&lt;/code&gt; where there is a condition on the smaller table.&lt;/p&gt; &lt;p&gt;Still, even with Bloom filters, a cuckoo hash will make too many cache misses.&lt;/p&gt; &lt;p&gt;So, enter &lt;a href=&quot;http://dbpedia.org/page/Linear_hashing&quot; id=&quot;link-id0x2aac2219ccc8&quot;&gt;linear hash&lt;/a&gt;. The idea is simple: The hash number picks a place in an array. Either the entry being sought is in the vicinity, or it is not in the hash table. If the vicinity is full of other entries, the entry can still be in an exception list.&lt;/p&gt; &lt;p&gt;With this and cuckoo alike, there are 3 different variants of hash table:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;A set of single unique integers&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A single-integer key with 0 or more dependent values, possibly with a next link if the key is not unique&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A key of &lt;i&gt;n&lt;/i&gt; arbitrary values, 0 or more dependent values, optional next link if the key is not unique&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;In the first case, the hash table is an array of values; in the two other cases, it is an array of pointers. But since a pointer is 64 bits, of which the high 16 are not in the address space of x86_64, these high bits can be used to keep a part of the hash number. It will be necessary to dereference the pointer only if the high bits match the hash number. This means that nearly all lookups that do not find a match are handled with a single cache miss.&lt;/p&gt; &lt;p&gt;Each cache miss brings in a cache line of 8 words. The lookup starts at a point given by the hash number and wraps around at the end of the cache line. Only in the case that all 8 words are occupied but do not match does one need to look at the exceptions. There is one exception list for each partition of the hash table, like in the cuckoo scheme.&lt;/p&gt; &lt;p&gt;A hash lookup is always done on a vector of keys; the loop that takes most of the time is in fact the Bloom filter check. It goes as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; #define CHB_VAR(n) \ uint64 h##n, w##n, mask##n; #define CHB_INIT(n, i) \ MHASH_STEP_1 (h##n, i); \ w##n = bf[BF_WORD (h##n, sz)]; \ mask##n = BF_MASK (h##n); #define CHB_CK(n) \ { matches[mfill] = inx + n; \ mfill += (w##n &amp;amp; mask##n) == mask##n; } for (inx = inx; inx &amp;lt; last; inx ++) { CHB_VAR (0); CHB_INIT (0, REF ((ce_first + sizeof (ELT_T) * inx))); CHB_CK (0); } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the perfect loop for out-of-order execution. Now, I have tried every variation you can imagine, and this does not get better. The loop calculates a hash number, fetches the corresponding word from the Bloom filter, calculates a mask, stores the index of the key in a results array, and increments the results counter if all the bits were set. There is no control dependency anywhere, just a data dependency between successive iterations; i.e., to know where the result must go, you must know if the previous was a hit.&lt;/p&gt; &lt;p&gt;You can unroll this loop very easily, so, for example, take 4 keys, do the numbers, fetch the words, and then check them one after the other. One would think this would have more misses in flight at any one time, which it does. But it does not run any faster.&lt;/p&gt; &lt;p&gt;Maybe the loop is too long. Circumstantial evidence suggests that short loops are better for instruction prefetching. So, one can also make a loop that gets any number of words of the Bloom filter and puts them in one local array and the hash numbers in another array. A subsequent loop then reads the hash number, calculates the mask, and checks if there is a hit. In this way one can generate as many misses as one wants and check them as late as one wants. It so happens that doing 8 misses and then checking them is better than either 4 or 16. But 8 is still marginally worse than the loop first mentioned.&lt;/p&gt; &lt;p&gt;One can also vary the test. Instead of adding a truth value to the result counter, one can have&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;if ((word &amp;amp; mask) == mask) result[fill++] = inx;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;There is no clear difference between predication (incrementing the fill by truth value) and a conditional jump. The theory of out-of-order execution would predict predication to be better, but the difference is lost in measurement noise. This is true on both Intel Nehalem (Xeon 55xx) and Sandy Bridge (E5 26xx), but could be different on other architectures.&lt;/p&gt; &lt;p&gt;The multicore scalability of the test will give some information about platform utilization.&lt;/p&gt; &lt;p&gt;This is the ultimately simplified selective hash join:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT COUNT (*) FROM lineitem, part WHERE l_partkey = p_partkey AND p_size &amp;lt; 15 ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the second simplest hash join but misses the cache much more; since this now has a key and a dependent part in the hash table, there is an extra pointer to follow, and the hash entry is two words plus the pointer to these in the hash table array.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT SUM (p_retailprice) FROM lineitem, part WHERE l_partkey = p_partkey AND p_size &amp;lt; 15 ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;By adjusting the number of parts selected, we can vary the Bloom filter selectivity and the size of the hash table. Below, we show the times for the two queries with single-thread and 24-thread execution, with different percentages of the &lt;code&gt;part&lt;/code&gt; table on the build side of the hash join. All runs are against warm 100G TPC-H on the same test system as in the rest of the TPC-H series (dual Xeon E5-2630).&lt;/p&gt; &lt;p&gt;This table compares the performance of the linear and cuckoo implementations on the above queries (count vs. sum) on either 24 threads or 1 thread. Four data points are given for different sizes of hash table, given as percentage of the &lt;code&gt;part&lt;/code&gt; table (having 400K - 20M entries) in the hash table. The rightmost column, which represents the case where the entire &lt;code&gt;part&lt;/code&gt; table is on the build side does not have a Bloom filter; the other cases do. The Bloom bits are 8/4 for linear and 8/2 for cuckoo. The times are all in milliseconds, and the thousands separator is a comma.&lt;/p&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Hash type&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;Query type&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;Threads&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;2% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;10% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;30% &lt;br /&gt; (ms)&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;100% &lt;br /&gt; (ms)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,204&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,683&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3,100&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6,214&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,261&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,447&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5,059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13,086&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15,286&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;22,451&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;38,863&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;66,722&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Linear&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;17,575&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;33,664&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;81,927&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;179,013&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;1,849&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,840&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,105&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6,203&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;24&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2,833&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4,903&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9,446&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;19,652&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;COUNT&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;25,146&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;39,064&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;57,383&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;85,105&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:center&quot;&gt;Cuckoo&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;&lt;code&gt;SUM&lt;/code&gt;&lt;/th&gt; &lt;th style=&quot;text-align:center&quot;&gt;1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;33,647&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;67,089&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;121,989&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;240,941&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We clearly see cache effects on the two first lines, where the &lt;code&gt;SUM&lt;/code&gt; and &lt;code&gt;COUNT&lt;/code&gt; run in almost the same time on a small hash table but have a 2x difference on the larger hash table. The instruction path length is not very different for &lt;code&gt;SUM&lt;/code&gt; and &lt;code&gt;COUNT&lt;/code&gt;, but the memory footprint has a 3x difference. &lt;/p&gt; &lt;p&gt;We note that the SMP scalability of linear is slightly better, contrasting the ratio of 24-thread &lt;code&gt;SUM&lt;/code&gt; to single-thread &lt;code&gt;SUM&lt;/code&gt;. Both numbers are over 12x, indicating net benefit from core multithreading. (The test system has 12 physical cores.) The linear hash systematically outperforms cuckoo, understandably, since it makes a smaller net number of cache misses. The overall effect on the TPC-H score is noticeable, at around 15-20K units of composite score at 100G.&lt;/p&gt; &lt;p&gt;In conclusion, the Virtuoso hash join implementation is certainly on the level, with only small gains to be expected from further vectoring and prefetching. These results may be reproduced using the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aac22b45068&quot;&gt;v7fasttrack&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x2aac22b45028&quot;&gt;Virtuoso Open Source&lt;/a&gt; releases from &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aac22b44fc8&quot;&gt;GitHub&lt;/a&gt;; &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/develop/7&quot; id=&quot;link-id0x2aac20ead1d8&quot;&gt;develop/7&lt;/a&gt; for cuckoo and &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aac20ead1b8&quot;&gt;feature/analytics&lt;/a&gt; for linear hash.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x8a7ec38&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe9bdeb28&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe9801c28&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabf6e3f3e8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac10002308&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:34.680582-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 14 of n): Virtuoso TPC-H Implementation Analysis</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-05-01#1801</atom:id>
  <atom:published>2014-05-01T17:07:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1798&quot; id=&quot;link-id0x2aac10209c18&quot;&gt;the previous article&lt;/a&gt; we saw an unofficial result of running the full workload. Here we will look more closely at the performance profile.&lt;/p&gt; &lt;p&gt;In this article we look at what the server actually does. The &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20140501TPCHImplementationAnalysis&quot; id=&quot;link-id0x2aac10912a48&quot;&gt;execution profiles for all the queries&lt;/a&gt; are available for download. To experiment with parallelism, you may &lt;a href=&quot;https://github.com/v7fasttrack/&quot; id=&quot;link-id0x2aabbfc25fc8&quot;&gt;download the software&lt;/a&gt; and run it locally. An Amazon image may be provided later.&lt;/p&gt; &lt;h2&gt;Execution Profile&lt;/h2&gt; &lt;p&gt;Below is the top of the &lt;code&gt;oprofile&lt;/code&gt; output for a run of the 22 queries with qualification parameters against the 100G database. The operation in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabbc954738&quot;&gt;TPC-H&lt;/a&gt; terms is given under each heading.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;CPU: Intel Sandy Bridge microarchitecture, speed 2299.98 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 samples % symbol name 1406009 9.5117 ce_vec_int_range_hash&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter before selective hash join where selective hash join is best or only condition on a scan, e.g., &lt;code&gt;lineitem&lt;/code&gt; scan where &lt;code&gt;l_partkey&lt;/code&gt; checked against a Bloom filter &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;730935 4.9448 ce_vec_int_sets_hash&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter check where another condition is applied first, e.g., &lt;code&gt;lineitem&lt;/code&gt; scan with condition on &lt;code&gt;l_shipdate&lt;/code&gt;, then Bloom filter check on &lt;code&gt;l_partkey&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;617091 4.1746 hash_source_chash_input_1i_n&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Q13 right outer hash join with probe from &lt;code&gt;orders&lt;/code&gt;, build from &lt;code&gt;customer&lt;/code&gt;, &lt;code&gt;NOT EXISTS&lt;/code&gt; test in Q16 &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;586938 3.9706 cs_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Generic reading of a column, all queries&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;536273 3.6279 ce_intd_range_ltgt&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Date range comparison, most queries, e.g., Q1, 3, 4, 5, 6, 7, 8, 20&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;479898 3.2465 cha_cmp_1i&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Q13 &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt;, Q15 &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;S_suppkey&lt;/code&gt;. Indicates missing the cache on high cardinality &lt;code&gt;GROUP BY&lt;/code&gt; single &lt;code&gt;INT&lt;/code&gt; grouping key&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;473721 3.2047 cha_inline_1i_n_int&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Selective hash join after prefiltering with Bloom filter. Check only that key in hash table, no dependent part. For example Q8, Q9, Q17, Q20, with &lt;code&gt;lineitem&lt;/code&gt; filtered by &lt;code&gt;part&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;463723 3.1371 ce_dict_generic_range_filter&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Range condition on low cardinality column (dictionary encoded), e.g., &lt;code&gt;l_quantity&lt;/code&gt;, &lt;code&gt;l_discount&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;425149 2.8761 cha_inline_1i_int&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join check that a single &lt;code&gt;INT&lt;/code&gt; key with a dependent part is in a hash table, fetch the dependent part for hits&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;365040 2.4695 setp_chash_run&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- &lt;code&gt;GROUP BY&lt;/code&gt;, e.g., &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt; in Q13&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;359645 2.4330 clrg_partition_dc&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Partitioning a vector of values, occurs in all high cardinality &lt;code&gt;GROUP BYs&lt;/code&gt;, e.g., Q13, Q15&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;349473 2.3642 gb_aggregate&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Updating aggregates after the grouping keys are resolved, e.g., Q1&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;331926 2.2455 ce_dict_any_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching non-contiguous dictionary encoded strings, e.g., &lt;code&gt;l_returnflag&lt;/code&gt;, &lt;code&gt;l_linestatus&lt;/code&gt; in Q1 &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;316731 2.1427 cha_insert_1i&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Building a hash join hash table from a 1 &lt;code&gt;INT&lt;/code&gt; key to a dependent part, e.g., Q14 from &lt;code&gt;l_partkey&lt;/code&gt; to &lt;code&gt;lineitems&lt;/code&gt; in a time window with a given &lt;code&gt;l_partkey&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;286865 1.9406 ce_search_rld&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Index lookup for run length delta compressed keys, e.g., &lt;code&gt;l_orderkey&lt;/code&gt;, &lt;code&gt;ps_partkey&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;231390 1.5654 cha_insert&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Build of a hash join hash table for multipart keys, e.g., hash join with &lt;code&gt;partsupp&lt;/code&gt; (Q9) or &lt;code&gt;lineitem&lt;/code&gt; (Q17, Q20) on build side &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;224070 1.5158 ce_dict_int64_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching a non-contiguous set of double column values from dictionary encoding, e.g., &lt;code&gt;l_discount&lt;/code&gt;, &lt;code&gt;l_quantity&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;218506 1.4782 ce_intd_any_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching a non-contiguous set of date column values, e.g., &lt;code&gt;l_shipdate&lt;/code&gt; in Q9&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;200686 1.3576 page_wait_access&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Translating page numbers into buffers in buffer pool for column access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;198854 1.3452 itc_col_seg&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Generic part of table scan/index access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;197645 1.3371 cha_insert_1i_n&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join build for hash tables with a 1 &lt;code&gt;INT&lt;/code&gt; key and no dependent, e.g., &lt;code&gt;lineitem&lt;/code&gt; to &lt;code&gt;part&lt;/code&gt; join in Q9, Q17, Q20&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;195300 1.3212 cha_bloom_unroll_a&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter for hash based in predicate &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;192309 1.3010 hash_source_chash_input&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join probe with multi-part key, e.g., Q9 against &lt;code&gt;partsupp&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;191313 1.2942 strstr_sse42&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- SSE 4.2 substring match, e.g. &lt;code&gt;NOT LIKE&lt;/code&gt; condition in Q13&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;186325 1.2605 itc_fetch_col_vec&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Translating page numbers into buffers in buffer pool for column access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;159198 1.0770 ce_vec_int64_sets_decode&lt;/code&gt; &lt;/pre&gt; &lt;blockquote&gt; &lt;i&gt;-- Fetching non-contiguous 64-bit values from array represented column, e.g., &lt;code&gt;l_extendedprice&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;/blockquote&gt; &lt;p&gt;So what does TPC-H do? It is all selective hash joins. Then it is table scans with a condition on a &lt;code&gt;DATE&lt;/code&gt; column. The &lt;code&gt;DATE&lt;/code&gt; column part is because this implementation does not order the big tables (&lt;code&gt;lineitem&lt;/code&gt;, &lt;code&gt;orders&lt;/code&gt;) on their &lt;code&gt;DATE&lt;/code&gt; columns. Third, TPC-H does big &lt;code&gt;GROUP BYs&lt;/code&gt;, with Q13 representing most of this; all other &lt;code&gt;GROUP BYs&lt;/code&gt; have at least 10x fewer groups. Then it just extracts column values, most often after selecting the rows on some condition; quite often the condition is a foreign key column of the row finding a hit in a hash table. This last is called &lt;i&gt;invisible hash join.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Then there are some index lookups, but there the join is usually a merge pattern, like reading &lt;code&gt;orders&lt;/code&gt; in order of &lt;code&gt;o_orderkey&lt;/code&gt; and then getting &lt;code&gt;l_orderkey&lt;/code&gt; matches from &lt;code&gt;lineitem&lt;/code&gt; (e.g., Q21). Then there are quite often partitioning operations, i.e., many threads produce tuples and these tuples go to a consumer thread selected based on a partitioning column on the tuple. This is also called exchange. This is in all the high cardinality &lt;code&gt;GROUP BYs&lt;/code&gt; and in the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; of Q13.&lt;/p&gt; &lt;p&gt;Whether the implementation is RAM-only or paging from disk makes next to no difference. &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabbef46ec8&quot;&gt;Virtuoso&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aac103dc588&quot;&gt;Actian Vector&lt;/a&gt; both have a buffer pool, with Virtuoso using substantially smaller pages (8K vs. 256K or 512K). The page-number-to-buffer translation and the latching that goes with it is under 3% (&lt;code&gt;itc_fetch_col_vec&lt;/code&gt;, &lt;code&gt;page_wait_access&lt;/code&gt;). Of course, actually accessing secondary storage will kill the score, but checking that something is in memory is safe as long as this is always a hit.&lt;/p&gt; &lt;p&gt;So, once the query plans are right, the problem resolves into a few different loops. The bulk of the effort in making a TPC-H implementation is in query optimization so that the right loops run in the right order. I will further explain what the loops should contain in the next article.&lt;/p&gt; &lt;p&gt;Many of the functions seen in the profile are instantiations of a template for a specific data type. There are also different templates for variants of a data structure, like a hash table with different keys.&lt;/p&gt; &lt;p&gt;Compilation is a way of generating exactly the right loop for any set of data types. We do not find much need for this here, though. The type-specific operations that are in fact needed are anticipatable and can be predefined based on templates.&lt;/p&gt; &lt;h2&gt;Future Gains &lt;/h2&gt; &lt;p&gt;There are possible gains in the following domains:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Query optimization - Q15, Q17 do some work in duplicate, so reuse will roughly cut the time in half. In addition to reuse, there is a possibility to convert a scalar subquery into a derived table with a &lt;code&gt;GROUP BY&lt;/code&gt; (decorrelation). Decorrelation also applies in Q20. Reuse will give some 10-12K more score; decorrelation is probably below measurement noise.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Group join - Merging the &lt;code&gt;GROUP BY&lt;/code&gt; and the hash probe in Q13 will save 2% of time on throughput, maybe 5K more score.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Better parallelism in power test - A good power test takes 42s, and 5 times the work takes 165s, so the platform utilization of the power test is roughly 4/5. This could be slightly better. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Non-uniform_memory_access&quot; id=&quot;link-id0x2aabbf0dc408&quot;&gt;NUMA&lt;/a&gt; - Up to 20% performance gains have been seen on scale-out configurations from binding a process to one CPU socket. This gain will be readily seen in a scale-out setting when running one process per physical CPU. Gains in the NUMA department are rather fickle and fragile and are worth less in real life than in benchmarks. So I would say that work in single-server NUMA optimization is not immediately needed since scale-out configurations will get these gains as soon as one sets affinities for processes. But whether binding processes to CPUs makes sense depends on how even the workload is. TPC-H is even, but reality is less so.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In principle, a composite score of a good run could go from 250K to 280K by diverse incremental improvements. There is some noise in run times, so two consecutive runs can deviate by a few percent, which is already significant when talking of small improvements. &lt;/p&gt; &lt;h2&gt;Larger Scales&lt;/h2&gt; &lt;p&gt;For a 100 GB run with 5 throughput streams, the peak query memory consumption is 3.5 GB. This includes all the &lt;code&gt;GROUP BY&lt;/code&gt; and hash join tables that are made. Q13 is the most expensive in terms of space and allocates a peak of 1 GB for a single execution. This is trivial in comparison with the working set. But at 100x greater scale (10,000 GB or 10 TB) this becomes about 630 GB, as there will be a minimum of 9 concurrent streams instead of 5.&lt;/p&gt; &lt;p&gt;Now 10 TB is clearly a scale-out size, so the 630 GB transient memory is not on a single machine. &lt;/p&gt; &lt;p&gt;Still going to large scale-out will change the nature of some queries and introduce significant data transfer. We will know soon enough. &lt;/p&gt; &lt;h2&gt;Problems of the Metric &lt;/h2&gt; &lt;p&gt;A small-scale TPC-H, e.g., 100 GB, starts to have features of a lookup workload. This means that there is high variability between consecutive executions, and that the pre-execution state of the system does have large effect on a measurement.&lt;/p&gt; &lt;p&gt;The rules say that power test follows bulk load with maybe some checking of correctness of load in between. The bulk load is basically unregulated and usually will include statistics gathering.&lt;/p&gt; &lt;p&gt;The first power test shows significant variation, anything from 220 K to 240 K, while the second power test is steadily around 255 K. Since the reported score is the lower of the two, the biggest return to the implementor is in making sure the first power test is good.&lt;/p&gt; &lt;p&gt;The second throughput test is usually 5-10 K higher than the first; the throughput test is less sensitive. The difference does not come from I/O, but from system time for memory allocation. The memory and the same quantities and block sizes is reused by the second run.&lt;/p&gt; &lt;p&gt;A good power run is 42s from 100% warm RAM. A power run that gets the data from the OS disk buffers is 70s or so. A power run that gets data from SSD is worse, maybe 120s. &lt;/p&gt; &lt;p&gt;To cite an example, increasing the buffer pool size from 64 GB to 72 GB gets the first post-load power test from 120-150K to 230-240K while having no appreciable effect on subsequent tests. The effect is exacerbated by the fact that the power score is based on a geometric mean of run times. Very short queries (e.g., Q2) vary between consecutive in-memory executions from 120ms to 220ms. A similar variation occurs in Q13 which is on either side of 6s. Due to geometric mean, the same variability has very different impact depending on which query it hits. A Q2 that reads data from out of process can take 2s instead of the expected under 200ms. This kills the score even if a delay of 1.8s as such did not. So increasing the buffer pool in the example just serves to make sure the small &lt;code&gt;supplier&lt;/code&gt; table is in memory. Fetching it from the OS is simply not an option in the first Q2 even if it were an option in a longer running query. Remember, the the lower of the two scores is reported, and the first power test will be bad unless it is somehow primed by some trick like bulk load order.&lt;/p&gt; &lt;p&gt;When differences between implementations are small, variation between consecutive runs becomes important. This is why OLTP benchmarks are required to run for a relatively long time and only measure the steady state portion. This would also be appropriate for small TPC-H runs.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;Query performance reduces to a few loops when all the conditions are right. Getting the conditions to be right depends on query optimization and the right architecture choices. These results would be unthinkable without vectored execution and a compressed column store design. These in and of themselves guarantee nothing unless all plans are right. A previous Virtuoso 7 takes over 10x longer because of bad plans and missing some key execution techniques like the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; in Q13 and partitioned &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Last summer, we did runs of the much simpler Star Schema Benchmark. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1733&quot; id=&quot;link-id0x2aabbceaa7b8&quot;&gt;results were very good&lt;/a&gt;, because the engine had the much smaller set of tricks and the right plans. Repeating these tests now would show some gains from a still better hash join but nothing dramatic.&lt;/p&gt; &lt;p&gt;In the next article we will look at the finer points of hash join. After this we move to larger scales and clusters.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x1a521418&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabded72328&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x14a32e98&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac3589ec88&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab521c9cb8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:47.821517-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 14 of n): Virtuoso TPC-H Implementation Analysis</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-05-01#1800</atom:id>
  <atom:published>2014-05-01T17:03:38Z</atom:published>
  <atom:content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1798&quot; id=&quot;link-id0x2aac10209c18&quot;&gt;the previous article&lt;/a&gt; we saw an unofficial result of running the full workload. Here we will look more closely at the performance profile.&lt;/p&gt; &lt;p&gt;In this article we look at what the server actually does. The &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20140501TPCHImplementationAnalysis&quot; id=&quot;link-id0x2aac10912a48&quot;&gt;execution profiles for all the queries&lt;/a&gt; are available for download. To experiment with parallelism, you may &lt;a href=&quot;https://github.com/v7fasttrack/&quot; id=&quot;link-id0x2aabbfc25fc8&quot;&gt;download the software&lt;/a&gt; and run it locally. An Amazon image may be provided later.&lt;/p&gt; &lt;h2&gt;Execution Profile&lt;/h2&gt; &lt;p&gt;Below is the top of the &lt;code&gt;oprofile&lt;/code&gt; output for a run of the 22 queries with qualification parameters against the 100G database. The operation in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabbc954738&quot;&gt;TPC-H&lt;/a&gt; terms is given under each heading.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;CPU: Intel Sandy Bridge microarchitecture, speed 2299.98 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 samples % symbol name 1406009 9.5117 ce_vec_int_range_hash&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter before selective hash join where selective hash join is best or only condition on a scan, e.g., &lt;code&gt;lineitem&lt;/code&gt; scan where &lt;code&gt;l_partkey&lt;/code&gt; checked against a Bloom filter &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;730935 4.9448 ce_vec_int_sets_hash&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter check where another condition is applied first, e.g., &lt;code&gt;lineitem&lt;/code&gt; scan with condition on &lt;code&gt;l_shipdate&lt;/code&gt;, then Bloom filter check on &lt;code&gt;l_partkey&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;617091 4.1746 hash_source_chash_input_1i_n&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Q13 right outer hash join with probe from &lt;code&gt;orders&lt;/code&gt;, build from &lt;code&gt;customer&lt;/code&gt;, &lt;code&gt;NOT EXISTS&lt;/code&gt; test in Q16 &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;586938 3.9706 cs_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Generic reading of a column, all queries&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;536273 3.6279 ce_intd_range_ltgt&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Date range comparison, most queries, e.g., Q1, 3, 4, 5, 6, 7, 8, 20&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;479898 3.2465 cha_cmp_1i&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Q13 &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt;, Q15 &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;S_suppkey&lt;/code&gt;. Indicates missing the cache on high cardinality &lt;code&gt;GROUP BY&lt;/code&gt; single &lt;code&gt;INT&lt;/code&gt; grouping key&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;473721 3.2047 cha_inline_1i_n_int&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Selective hash join after prefiltering with Bloom filter. Check only that key in hash table, no dependent part. For example Q8, Q9, Q17, Q20, with &lt;code&gt;lineitem&lt;/code&gt; filtered by &lt;code&gt;part&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;463723 3.1371 ce_dict_generic_range_filter&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Range condition on low cardinality column (dictionary encoded), e.g., &lt;code&gt;l_quantity&lt;/code&gt;, &lt;code&gt;l_discount&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;425149 2.8761 cha_inline_1i_int&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join check that a single &lt;code&gt;INT&lt;/code&gt; key with a dependent part is in a hash table, fetch the dependent part for hits&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;365040 2.4695 setp_chash_run&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- &lt;code&gt;GROUP BY&lt;/code&gt;, e.g., &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt; in Q13&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;359645 2.4330 clrg_partition_dc&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Partitioning a vector of values, occurs in all high cardinality &lt;code&gt;GROUP BYs&lt;/code&gt;, e.g., Q13, Q15&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;349473 2.3642 gb_aggregate&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Updating aggregates after the grouping keys are resolved, e.g., Q1&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;331926 2.2455 ce_dict_any_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching non-contiguous dictionary encoded strings, e.g., &lt;code&gt;l_returnflag&lt;/code&gt;, &lt;code&gt;l_linestatus&lt;/code&gt; in Q1 &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;316731 2.1427 cha_insert_1i&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Building a hash join hash table from a 1 &lt;code&gt;INT&lt;/code&gt; key to a dependent part, e.g., Q14 from &lt;code&gt;l_partkey&lt;/code&gt; to &lt;code&gt;lineitems&lt;/code&gt; in a time window with a given &lt;code&gt;l_partkey&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;286865 1.9406 ce_search_rld&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Index lookup for run length delta compressed keys, e.g., &lt;code&gt;l_orderkey&lt;/code&gt;, &lt;code&gt;ps_partkey&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;231390 1.5654 cha_insert&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Build of a hash join hash table for multipart keys, e.g., hash join with &lt;code&gt;partsupp&lt;/code&gt; (Q9) or &lt;code&gt;lineitem&lt;/code&gt; (Q17, Q20) on build side &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;224070 1.5158 ce_dict_int64_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching a non-contiguous set of double column values from dictionary encoding, e.g., &lt;code&gt;l_discount&lt;/code&gt;, &lt;code&gt;l_quantity&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;218506 1.4782 ce_intd_any_sets_decode&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Fetching a non-contiguous set of date column values, e.g., &lt;code&gt;l_shipdate&lt;/code&gt; in Q9&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;200686 1.3576 page_wait_access&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Translating page numbers into buffers in buffer pool for column access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;198854 1.3452 itc_col_seg&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Generic part of table scan/index access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;197645 1.3371 cha_insert_1i_n&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join build for hash tables with a 1 &lt;code&gt;INT&lt;/code&gt; key and no dependent, e.g., &lt;code&gt;lineitem&lt;/code&gt; to &lt;code&gt;part&lt;/code&gt; join in Q9, Q17, Q20&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;195300 1.3212 cha_bloom_unroll_a&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Bloom filter for hash based in predicate &lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;192309 1.3010 hash_source_chash_input&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Hash join probe with multi-part key, e.g., Q9 against &lt;code&gt;partsupp&lt;/code&gt;&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;191313 1.2942 strstr_sse42&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- SSE 4.2 substring match, e.g. &lt;code&gt;NOT LIKE&lt;/code&gt; condition in Q13&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;186325 1.2605 itc_fetch_col_vec&lt;/code&gt; &lt;/pre&gt;&lt;blockquote&gt; &lt;i&gt;-- Translating page numbers into buffers in buffer pool for column access&lt;/i&gt; &lt;/blockquote&gt; &lt;pre&gt;&lt;code&gt;159198 1.0770 ce_vec_int64_sets_decode&lt;/code&gt; &lt;/pre&gt; &lt;blockquote&gt; &lt;i&gt;-- Fetching non-contiguous 64-bit values from array represented column, e.g., &lt;code&gt;l_extendedprice&lt;/code&gt; &lt;/i&gt; &lt;/blockquote&gt; &lt;/blockquote&gt; &lt;p&gt;So what does TPC-H do? It is all selective hash joins. Then it is table scans with a condition on a &lt;code&gt;DATE&lt;/code&gt; column. The &lt;code&gt;DATE&lt;/code&gt; column part is because this implementation does not order the big tables (&lt;code&gt;lineitem&lt;/code&gt;, &lt;code&gt;orders&lt;/code&gt;) on their &lt;code&gt;DATE&lt;/code&gt; columns. Third, TPC-H does big &lt;code&gt;GROUP BYs&lt;/code&gt;, with Q13 representing most of this; all other &lt;code&gt;GROUP BYs&lt;/code&gt; have at least 10x fewer groups. Then it just extracts column values, most often after selecting the rows on some condition; quite often the condition is a foreign key column of the row finding a hit in a hash table. This last is called &lt;i&gt;invisible hash join.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Then there are some index lookups, but there the join is usually a merge pattern, like reading &lt;code&gt;orders&lt;/code&gt; in order of &lt;code&gt;o_orderkey&lt;/code&gt; and then getting &lt;code&gt;l_orderkey&lt;/code&gt; matches from &lt;code&gt;lineitem&lt;/code&gt; (e.g., Q21). Then there are quite often partitioning operations, i.e., many threads produce tuples and these tuples go to a consumer thread selected based on a partitioning column on the tuple. This is also called exchange. This is in all the high cardinality &lt;code&gt;GROUP BYs&lt;/code&gt; and in the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; of Q13.&lt;/p&gt; &lt;p&gt;Whether the implementation is RAM-only or paging from disk makes next to no difference. &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabbef46ec8&quot;&gt;Virtuoso&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aac103dc588&quot;&gt;Actian Vector&lt;/a&gt; both have a buffer pool, with Virtuoso using substantially smaller pages (8K vs. 256K or 512K). The page-number-to-buffer translation and the latching that goes with it is under 3% (&lt;code&gt;itc_fetch_col_vec&lt;/code&gt;, &lt;code&gt;page_wait_access&lt;/code&gt;). Of course, actually accessing secondary storage will kill the score, but checking that something is in memory is safe as long as this is always a hit.&lt;/p&gt; &lt;p&gt;So, once the query plans are right, the problem resolves into a few different loops. The bulk of the effort in making a TPC-H implementation is in query optimization so that the right loops run in the right order. I will further explain what the loops should contain in the next article.&lt;/p&gt; &lt;p&gt;Many of the functions seen in the profile are instantiations of a template for a specific data type. There are also different templates for variants of a data structure, like a hash table with different keys.&lt;/p&gt; &lt;p&gt;Compilation is a way of generating exactly the right loop for any set of data types. We do not find much need for this here, though. The type-specific operations that are in fact needed are anticipatable and can be predefined based on templates.&lt;/p&gt; &lt;h2&gt;Future Gains &lt;/h2&gt; &lt;p&gt;There are possible gains in the following domains:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Query optimization - Q15, Q17 do some work in duplicate, so reuse will roughly cut the time in half. In addition to reuse, there is a possibility to convert a scalar subquery into a derived table with a &lt;code&gt;GROUP BY&lt;/code&gt; (decorrelation). Decorrelation also applies in Q20. Reuse will give some 10-12K more score; decorrelation is probably below measurement noise.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Group join - Merging the &lt;code&gt;GROUP BY&lt;/code&gt; and the hash probe in Q13 will save 2% of time on throughput, maybe 5K more score.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Better parallelism in power test - A good power test takes 42s, and 5 times the work takes 165s, so the platform utilization of the power test is roughly 4/5. This could be slightly better. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Non-uniform_memory_access&quot; id=&quot;link-id0x2aabbf0dc408&quot;&gt;NUMA&lt;/a&gt; - Up to 20% performance gains have been seen on scale-out configurations from binding a process to one CPU socket. This gain will be readily seen in a scale-out setting when running one process per physical CPU. Gains in the NUMA department are rather fickle and fragile and are worth less in real life than in benchmarks. So I would say that work in single-server NUMA optimization is not immediately needed since scale-out configurations will get these gains as soon as one sets affinities for processes. But whether binding processes to CPUs makes sense depends on how even the workload is. TPC-H is even, but reality is less so.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In principle, a composite score of a good run could go from 250K to 280K by diverse incremental improvements. There is some noise in run times, so two consecutive runs can deviate by a few percent, which is already significant when talking of small improvements. &lt;/p&gt; &lt;h2&gt;Larger Scales&lt;/h2&gt; &lt;p&gt;For a 100 GB run with 5 throughput streams, the peak query memory consumption is 3.5 GB. This includes all the &lt;code&gt;GROUP BY&lt;/code&gt; and hash join tables that are made. Q13 is the most expensive in terms of space and allocates a peak of 1 GB for a single execution. This is trivial in comparison with the working set. But at 100x greater scale (10,000 GB or 10 TB) this becomes about 630 GB, as there will be a minimum of 9 concurrent streams instead of 5.&lt;/p&gt; &lt;p&gt;Now 10 TB is clearly a scale-out size, so the 630 GB transient memory is not on a single machine. &lt;/p&gt; &lt;p&gt;Still going to large scale-out will change the nature of some queries and introduce significant data transfer. We will know soon enough. &lt;/p&gt; &lt;h2&gt;Problems of the Metric &lt;/h2&gt; &lt;p&gt;A small-scale TPC-H, e.g., 100 GB, starts to have features of a lookup workload. This means that there is high variability between consecutive executions, and that the pre-execution state of the system does have large effect on a measurement.&lt;/p&gt; &lt;p&gt;The rules say that power test follows bulk load with maybe some checking of correctness of load in between. The bulk load is basically unregulated and usually will include statistics gathering.&lt;/p&gt; &lt;p&gt;The first power test shows significant variation, anything from 220 K to 240 K, while the second power test is steadily around 255 K. Since the reported score is the lower of the two, the biggest return to the implementor is in making sure the first power test is good.&lt;/p&gt; &lt;p&gt;The second throughput test is usually 5-10 K higher than the first; the throughput test is less sensitive. The difference does not come from I/O, but from system time for memory allocation. The memory and the same quantities and block sizes is reused by the second run.&lt;/p&gt; &lt;p&gt;A good power run is 42s from 100% warm RAM. A power run that gets the data from the OS disk buffers is 70s or so. A power run that gets data from SSD is worse, maybe 120s. &lt;/p&gt; &lt;p&gt;To cite an example, increasing the buffer pool size from 64 GB to 72 GB gets the first post-load power test from 120-150K to 230-240K while having no appreciable effect on subsequent tests. The effect is exacerbated by the fact that the power score is based on a geometric mean of run times. Very short queries (e.g., Q2) vary between consecutive in-memory executions from 120ms to 220ms. A similar variation occurs in Q13 which is on either side of 6s. Due to geometric mean, the same variability has very different impact depending on which query it hits. A Q2 that reads data from out of process can take 2s instead of the expected under 200ms. This kills the score even if a delay of 1.8s as such did not. So increasing the buffer pool in the example just serves to make sure the small &lt;code&gt;supplier&lt;/code&gt; table is in memory. Fetching it from the OS is simply not an option in the first Q2 even if it were an option in a longer running query. Remember, the the lower of the two scores is reported, and the first power test will be bad unless it is somehow primed by some trick like bulk load order.&lt;/p&gt; &lt;p&gt;When differences between implementations are small, variation between consecutive runs becomes important. This is why OLTP benchmarks are required to run for a relatively long time and only measure the steady state portion. This would also be appropriate for small TPC-H runs.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;Query performance reduces to a few loops when all the conditions are right. Getting the conditions to be right depends on query optimization and the right architecture choices. These results would be unthinkable without vectored execution and a compressed column store design. These in and of themselves guarantee nothing unless all plans are right. A previous Virtuoso 7 takes over 10x longer because of bad plans and missing some key execution techniques like the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; in Q13 and partitioned &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Last summer, we did runs of the much simpler Star Schema Benchmark. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1733&quot; id=&quot;link-id0x2aabbceaa7b8&quot;&gt;results were very good&lt;/a&gt;, because the engine had the much smaller set of tricks and the right plans. Repeating these tests now would show some gains from a still better hash join but nothing dramatic.&lt;/p&gt; &lt;p&gt;In the next article we will look at the finer points of hash join. After this we move to larger scales and clusters.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac349bc698&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac347508c8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac347b2098&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac34f71318&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac346fa748&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac349de568&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac34725b28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac36adde48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac34a7e368&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac348581b8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac344340c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac34ee7058&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac34d388b8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0xfa3c378&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabeb9f3b48&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aac00a05758&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab79ee5de8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd2285048&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:41.706498-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 13 of n): Virtuoso TPC-H Kit Now on V7 Fast Track</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-04-28#1799</atom:id>
  <atom:published>2014-04-28T16:10:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article shows how you can reproduce the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac307f0348&quot;&gt;TPC-H&lt;/a&gt; experiments from the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac30c9eed8&quot;&gt;previous posts&lt;/a&gt; in this series.&lt;/p&gt; &lt;p&gt;All the code is in the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aac5ab2e128&quot;&gt;feature/analytics branch&lt;/a&gt; of the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aac79d948a8&quot;&gt;v7fasttrack git repository&lt;/a&gt; on &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aac5ae175e8&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Prerequisites&lt;/h2&gt; &lt;p&gt;Start by checking out and compiling Virtuoso Open Source (VOS).&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; git clone https://github.com/v7fasttrack/virtuoso-opensource cd virtuoso-opensource git checkout feature/analytics ./autogen.sh export CFLAGS=&amp;quot;-msse4.2 -DSSE42&amp;quot; ./configure make -j 24 make install &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The system should be an x86_64, &lt;a href=&quot;http://dbpedia.org/resource/Core_i7&quot; id=&quot;link-id0x2aac6ccb0048&quot;&gt;Intel Core i7&lt;/a&gt; or later, with &lt;a href=&quot;http://dbpedia.org/resource/SSE4&quot; id=&quot;link-id0x2aac6d3ec688&quot;&gt;SSE 4.2&lt;/a&gt; support. (Running without SSE 4.2 is possible, but for better score you need to define it before doing configure.) The gcc may be any that supports SSE 4.2.&lt;/p&gt; &lt;p&gt;To have a good result, the system should have at least 96 GB of RAM and SSD.&lt;/p&gt; &lt;p&gt;To get a good load time, both the database files and the CSV files made by &lt;code&gt;dbgen&lt;/code&gt; should be on SSD.&lt;/p&gt; &lt;h2&gt;Running TPC-H&lt;/h2&gt; &lt;h3&gt;Set up&lt;/h3&gt; &lt;p&gt;Copy the &lt;code&gt;binsrc/tests/tpc-h&lt;/code&gt; directory from the check-out to an SSD, if it is not already on one. Set &lt;code&gt;$HOME&lt;/code&gt; to point to the root directory of the check-out. Rename the &lt;code&gt;virtuoso.ini-100G&lt;/code&gt; in the &lt;code&gt;tpc-h&lt;/code&gt; directory to &lt;code&gt;virtuoso.ini&lt;/code&gt;. Edit the database file paths in the &lt;code&gt;virtuoso.ini&lt;/code&gt;. Where it says --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Segment1 = 1024, /1s1/dbs/tpch100cp-1.db = q1, /1s2/dbs/tpch100cp-2.db = q2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- change the file names, and add or remove files as appropriate, each file with a different &lt;code&gt;= q&lt;i&gt;n&lt;/i&gt;&lt;/code&gt;, until you have one file per independent device. If this is a RAID, one file per distinct device in the RAID usually brings improvement. Edit the &lt;code&gt;TransactionFile&lt;/code&gt; entry, and replace &lt;code&gt;/1s2/dbs/&lt;/code&gt; with a suitable path.&lt;/p&gt; &lt;p&gt;Edit &lt;code&gt;ThreadsPerQuery&lt;/code&gt; to be the number of threads on the machine. For i7, this is double the number of cores; your environment may vary. &lt;code&gt;AsyncQueueMaxThreads&lt;/code&gt; should be set to double &lt;code&gt;ThreadsPerQuery&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The memory settings (&lt;code&gt;NumberOfBuffers&lt;/code&gt; and &lt;code&gt;MaxDirtyBuffers&lt;/code&gt;) are OK for 100G scale. For larger scale, make the memory settings correspondingly larger, not to exceed 75% of system memory. Count 8.5 KB per buffer. If you have less memory, you can decrease these. If so, the first power test will be hit the worst, so the scores will not be as good.&lt;/p&gt; &lt;p&gt;The default BIOS settings are usually OK. Disabling prefetch of adjacent cache line does not help, and turning off core threads does not help either.&lt;/p&gt; &lt;p&gt;For 100G, the data files for loading will take 100 GB, and the database files will take 88 GB divided among however many files. Be sure there is enough space before you start.&lt;/p&gt; &lt;h3&gt;Generate the data&lt;/h3&gt; &lt;p&gt;In the &lt;code&gt;tpc-h&lt;/code&gt; directory (copy of &lt;code&gt;binsrc/tests/tpc-h&lt;/code&gt;) --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./gen.sh 100 5 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first parameter is the scale factor; the second is the number of streams to use in the throughput test; the last is the number of consecutive test runs. The minimum number of streams is 5 for 100G; each successive scale adds one more. A larger number of streams is allowed, but will not make a better result in this case. A test always consists of 2 runs; you could specify more, but the extra tests will not influence the score.&lt;/p&gt; &lt;p&gt;Making the data files takes the longest time. You may run &lt;code&gt;dbgen&lt;/code&gt; multithreaded to make the dataset in parallel, but then the load scripts will have to be changed to match.&lt;/p&gt; &lt;h3&gt;Run the load&lt;/h3&gt; &lt;p&gt;Start Virtuoso.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./load.sh 100 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Looking at &lt;code&gt;iostat&lt;/code&gt;, you will see a read rate of about 140 MB/s from the source files.&lt;/p&gt; &lt;h3&gt;Run the test&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./run.sh 100 5 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The parameters have the same meaning as in &lt;code&gt;gen.sh&lt;/code&gt;, and the same values must be specified.&lt;/p&gt; &lt;h2&gt;Outputs&lt;/h2&gt; &lt;p&gt;The run produces two main files, &lt;code&gt;report1.txt&lt;/code&gt; and &lt;code&gt;report2.txt&lt;/code&gt;. These are the numerical quantity summaries for the first and second run. Additionally, there are output files for each query stream. The &lt;code&gt;suppfiles.sh&lt;/code&gt; script can be used to collect the supporting files archive for a TPC-H full disclosure report.&lt;/p&gt; &lt;p&gt;The database is left running. To reuse the loaded data for another experiment, kill the Virtuoso process, delete the transaction log, and restart. This will have the data in the post-load state. To get warm cache, use the &lt;code&gt;warm.sql&lt;/code&gt; script in the &lt;code&gt;tpc-h&lt;/code&gt; directory.&lt;/p&gt; &lt;p&gt;On the test system used in this series, 12 core E5 at 2.3GHz, we expect 240K for the first run and 250K for the second. With a top-of-the-line E5, we expect around 400K. For an 8-core 2.26GHz Nehalem, we expect 150K.&lt;/p&gt; &lt;p&gt;If you get scores that are significantly different, something is broken; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/virtuoso-devel&quot; id=&quot;link-id0x2aac309efa88&quot;&gt;we would like to know about this&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;If you have this audited according to the TPC rules, you will be allowed to call this a TPC-H result. Without such audit, the result should be labeled Virt-H.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac6eb05828&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac6d1e0968&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac6e5afef8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac3d8ccbc8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac79669d78&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac79c4aee8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac7914f948&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac30e1a9c8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac79f4af68&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac78c36c48&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab7a1ef0f8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac6ff591d8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac34cfd578&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x19166398&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabcb5a6c08&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x187e86a8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabf7c73ca8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab64084868&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:52.503337-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 13 of n): Virtuoso TPC-H Kit Now on V7 Fast Track</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-04-28#1798</atom:id>
  <atom:published>2014-04-28T16:09:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article shows how you can reproduce the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac307f0348&quot;&gt;TPC-H&lt;/a&gt; experiments from the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac30c9eed8&quot;&gt;previous posts&lt;/a&gt; in this series.&lt;/p&gt; &lt;p&gt;All the code is in the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource/tree/feature/analytics&quot; id=&quot;link-id0x2aac5ab2e128&quot;&gt;feature/analytics branch&lt;/a&gt; of the &lt;a href=&quot;https://github.com/v7fasttrack&quot; id=&quot;link-id0x2aac79d948a8&quot;&gt;v7fasttrack git repository&lt;/a&gt; on &lt;a href=&quot;https://github.com/&quot; id=&quot;link-id0x2aac5ae175e8&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Prerequisites&lt;/h2&gt; &lt;p&gt;Start by checking out and compiling Virtuoso Open Source (VOS).&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; git clone https://github.com/v7fasttrack/virtuoso-opensource cd virtuoso-opensource git checkout feature/analytics ./autogen.sh export CFLAGS=&amp;quot;-msse4.2 -DSSE42&amp;quot; ./configure make -j 24 make install &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The system should be an x86_64, &lt;a href=&quot;http://dbpedia.org/resource/Core_i7&quot; id=&quot;link-id0x2aac6ccb0048&quot;&gt;Intel Core i7&lt;/a&gt; or later, with &lt;a href=&quot;http://dbpedia.org/resource/SSE4&quot; id=&quot;link-id0x2aac790d77f8&quot;&gt;SSE 4.2&lt;/a&gt; support. (Running without SSE 4.2 is possible, but for better score you need to define it before doing configure.) The gcc may be any that supports SSE 4.2.&lt;/p&gt; &lt;p&gt;To have a good result, the system should have at least 96 GB of RAM and SSD.&lt;/p&gt; &lt;p&gt;To get a good load time, both the database files and the CSV files made by &lt;code&gt;dbgen&lt;/code&gt; should be on SSD.&lt;/p&gt; &lt;h2&gt;Running TPC-H&lt;/h2&gt; &lt;h3&gt;Set up&lt;/h3&gt; &lt;p&gt;Copy the &lt;code&gt;binsrc/tests/tpc-h&lt;/code&gt; directory from the check-out to an SSD, if it is not already on one. Set &lt;code&gt;$HOME&lt;/code&gt; to point to the root directory of the check-out. Rename the &lt;code&gt;virtuoso.ini-100G&lt;/code&gt; in the &lt;code&gt;tpc-h&lt;/code&gt; directory to &lt;code&gt;virtuoso.ini&lt;/code&gt;. Edit the database file paths in the &lt;code&gt;virtuoso.ini&lt;/code&gt;. Where it says --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Segment1 = 1024, /1s1/dbs/tpch100cp-1.db = q1, /1s2/dbs/tpch100cp-2.db = q2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- change the file names, and add or remove files as appropriate, each file with a different &lt;code&gt;= q&lt;i&gt;n&lt;/i&gt;&lt;/code&gt;, until you have one file per independent device. If this is a RAID, one file per distinct device in the RAID usually brings improvement. Edit the &lt;code&gt;TransactionFile&lt;/code&gt; entry, and replace &lt;code&gt;/1s2/dbs/&lt;/code&gt; with a suitable path.&lt;/p&gt; &lt;p&gt;Edit &lt;code&gt;ThreadsPerQuery&lt;/code&gt; to be the number of threads on the machine. For i7, this is double the number of cores; your environment may vary. &lt;code&gt;AsyncQueueMaxThreads&lt;/code&gt; should be set to double &lt;code&gt;ThreadsPerQuery&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The memory settings (&lt;code&gt;NumberOfBuffers&lt;/code&gt; and &lt;code&gt;MaxDirtyBuffers&lt;/code&gt;) are OK for 100G scale. For larger scale, make the memory settings correspondingly larger, not to exceed 75% of system memory. Count 8.5 KB per buffer. If you have less memory, you can decrease these. If so, the first power test will be hit the worst, so the scores will not be as good.&lt;/p&gt; &lt;p&gt;The default BIOS settings are usually OK. Disabling prefetch of adjacent cache line does not help, and turning off core threads does not help either.&lt;/p&gt; &lt;p&gt;For 100G, the data files for loading will take 100 GB, and the database files will take 88 GB divided among however many files. Be sure there is enough space before you start.&lt;/p&gt; &lt;h3&gt;Generate the data&lt;/h3&gt; &lt;p&gt;In the &lt;code&gt;tpc-h&lt;/code&gt; directory (copy of &lt;code&gt;binsrc/tests/tpc-h&lt;/code&gt;) --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./gen.sh 100 5 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first parameter is the scale factor; the second is the number of streams to use in the throughput test; the last is the number of consecutive test runs. The minimum number of streams is 5 for 100G; each successive scale adds one more. A larger number of streams is allowed, but will not make a better result in this case. A test always consists of 2 runs; you could specify more, but the extra tests will not influence the score.&lt;/p&gt; &lt;p&gt;Making the data files takes the longest time. You may run &lt;code&gt;dbgen&lt;/code&gt; multithreaded to make the dataset in parallel, but then the load scripts will have to be changed to match.&lt;/p&gt; &lt;h3&gt;Run the load&lt;/h3&gt; &lt;p&gt;Start Virtuoso.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./load.sh 100 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Looking at &lt;code&gt;iostat&lt;/code&gt;, you will see a read rate of about 140 MB/s from the source files.&lt;/p&gt; &lt;h3&gt;Run the test&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ./run.sh 100 5 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The parameters have the same meaning as in &lt;code&gt;gen.sh&lt;/code&gt;, and the same values must be specified.&lt;/p&gt; &lt;h2&gt;Outputs&lt;/h2&gt; &lt;p&gt;The run produces two main files, &lt;code&gt;report1.txt&lt;/code&gt; and &lt;code&gt;report2.txt&lt;/code&gt;. These are the numerical quantity summaries for the first and second run. Additionally, there are output files for each query stream. The &lt;code&gt;suppfiles.sh&lt;/code&gt; script can be used to collect the supporting files archive for a TPC-H full disclosure report.&lt;/p&gt; &lt;p&gt;The database is left running. To reuse the loaded data for another experiment, kill the Virtuoso process, delete the transaction log, and restart. This will have the data in the post-load state. To get warm cache, use the &lt;code&gt;warm.sql&lt;/code&gt; script in the &lt;code&gt;tpc-h&lt;/code&gt; directory.&lt;/p&gt; &lt;p&gt;On the test system used in this series, 12 core E5 at 2.3GHz, we expect 240K for the first run and 250K for the second. With a top-of-the-line E5, we expect around 400K. For an 8-core 2.26GHz Nehalem, we expect 150K.&lt;/p&gt; &lt;p&gt;If you get scores that are significantly different, something is broken; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/virtuoso-devel&quot; id=&quot;link-id0x2aac309efa88&quot;&gt;we would like to know about this&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;If you have this audited according to the TPC rules, you will be allowed to call this a TPC-H result. Without such audit, the result should be labeled Virt-H.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac6eb05828&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac6d1e0968&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac6e5afef8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac3d8ccbc8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac79669d78&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac79c4aee8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac7914f948&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac30e1a9c8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac79f4af68&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac78c36c48&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab7a1ef0f8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac6ff591d8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x19d784a8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabea8bd858&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x14a92388&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabd6a12f48&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab51599bb8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:49.199708-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 12 of n): TPC-H: Result Preview</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-04-22#1797</atom:id>
  <atom:published>2014-04-22T15:33:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this article, we look at the 100 GB single-server results for the whole workload. We will call this &lt;i&gt;Virt-H&lt;/i&gt; instead of &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabdeab62f8&quot;&gt;TPC-H&lt;/a&gt;&lt;/i&gt; in order to comply with the TPC rules: Use of the TPC-H label requires an audit.&lt;/p&gt; &lt;p&gt;The test consists of a bulk load followed by two runs. Each run consists of a single user power test and a multi-user throughput test. The number of users in the throughput test is up to the test sponsor but must be at least 5 for the 100 GB scale. The reported score is the lower of the two scores.&lt;/p&gt; &lt;h2&gt;Result Summary &lt;/h2&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100 GB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;dbgen&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;version 2.15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Lload time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Composite qph&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;241,482.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;System Availability Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-22&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The price/performance is left open. The hardware costs about 5000 euros and the software is open source so the cost per performance would be a minimum of 0.02 euros per qph at 100G. This is not compliant with the TPC pricing rules though. These require 3 year maintenance contracts for all parts.&lt;/p&gt; &lt;p&gt;The software configuration did not use RAID. Otherwise the software would be auditable to the best of my knowledge. The hardware would have to be the same from Dell, HP, or other large brand to satisfy the TPC pricing rule.&lt;/p&gt; &lt;h2&gt;Executive Summaries of Each Run&lt;/h2&gt; &lt;h3&gt;Run 1&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;1 TB / 87,496 MB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:17:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for Throughput Test&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;239,785.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;243,191.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite Query-per-Hour Metric (Qph@100GB)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;241,482.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in Throughput Test (Ts)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;162.935000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Duration of stream execution&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:17:46&lt;/td&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:47&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:40&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:40&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:06&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:10&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:16&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:17:46&lt;/td&gt; &lt;td&gt;2014-04-21 21:17:49&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;2014-04-21 21:17:50&lt;/td&gt; &lt;td&gt;2014-04-21 21:17:51&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:25&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:38&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:18:48&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:49&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:01&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:01&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:13&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:25&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Numerical Quantities Summary -- Timing Intervals in Seconds&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.311882&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.383459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.143286&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.439926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.594027&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.736482&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.440826&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.198925&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.192341&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.952574&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.184940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.194804&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.998207&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.122059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.962717&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.773401&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.354001&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.191604&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.238262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.770639&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.782669&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.357578&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.034697&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.354747&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.489788&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.585291&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.645022&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.358926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.904636&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.220767&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.694622&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.431067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.609555&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.066582&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.740518&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.503038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.439980&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.424101&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.404849&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.256317&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.346825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.787459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391000&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.151059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.974037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.932079&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.191782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.619255&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.192341&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.952574&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.238262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.194804&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.974037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.357578&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.034697&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.619255&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.346825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.787459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.740518&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.358926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.439980&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.122059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.191782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.431067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.998502&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.316702&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.239948&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.395693&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.019906&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.211317&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.257733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.686957&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.476940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.004782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.070967&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.015134&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.995799&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.142581&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.989357&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.581758&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.351299&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.719765&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.157236&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.156379&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.566067&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.028898&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.146883&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.954105&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.341359&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.265949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.289724&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.249435&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.370577&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.262650&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.684574&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.597277&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.783821&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.944240&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.214661&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.253991&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.742896&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.701709&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.801641&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.612070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.126494&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.533748&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.733828&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.021583&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.423207&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.358223&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.866477&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.421209&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.040726&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.799425&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.908758&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.342975&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.934672&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.455598&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.258504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.421209&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.783821&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.533748&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.289724&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.021583&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.370577&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.028898&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.801641&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.612070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.040726&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.265949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.733828&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.249435&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.934672&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.455598&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.258504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.587192&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.189892&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.252625&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.660841&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.204873&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.007484&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.161416&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.351616&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.258070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.981896&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.161602&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.933124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.203497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.042949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.349407&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.296630&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213340&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.070175&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.662723&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.260503&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.792825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.323136&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.296430&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.939927&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.754827&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.895688&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.413773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.529466&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.288539&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.717479&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.222082&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.135510&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.486809&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.615640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.426936&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.274289&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.706145&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.402654&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.278881&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.260483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.604905&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.735042&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.627039&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.343302&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.242370&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.492640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.503095&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.698821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.221733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.670036&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.866626&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.108081&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.428098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.282014&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213320&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.088321&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213340&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.615640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.413773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.343302&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.288539&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.717479&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.503095&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.698821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.754827&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.735042&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.426936&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.108081&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.428098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.282014&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.222082&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.260483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.856323&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.197316&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.799419&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.303128&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.491595&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.443585&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.702762&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.024612&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Run 2&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;1 TB / 87,496 MB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:17:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for Throughput Test&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;257,944.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;240,998.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite Query-per-Hour Metric (Qph@100GB)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;249,327.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in Throughput Test (Ts)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;164.417000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Duration of stream execution&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:20&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:01&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:44&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:46&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:20&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:22&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&amp;amp;$160;&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:22&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:23&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:49&lt;/td&gt; &lt;td&gt;2014-04-21 21:23:04&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:01&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:14&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:14&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:27&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:26&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:39&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:39&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:49&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:10&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Numerical Quantities Summary -- Timing Intervals in Seconds&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.437262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.227516&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.172620&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.541201&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.542084&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.743255&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.459368&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.183166&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.205225&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.499833&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.854558&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.818087&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.920773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.347414&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.446411&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.723247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.833803&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.659051&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.023266&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.123523&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.358200&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.371315&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.772453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.978415&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.308935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.662744&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.573807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.000859&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.282467&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391930&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.280472&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.852718&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.791856&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.421592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.953592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.688037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.949038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.098282&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.153124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.824209&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.537098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.760386&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.308982&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.299178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.882695&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.652497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.383128&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.178447&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.205225&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.421592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.308982&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.299178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.358200&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.652497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.153124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.723247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.537098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.760386&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.573807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.000859&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.949038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391930&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.772453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.178447&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.335383&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.800721&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.542841&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.985937&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.078635&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.372288&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.407118&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.311407&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.441940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.948770&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.154384&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.148494&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.014453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.647725&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.437587&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.585284&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;14.127674&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.824844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.100679&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.586457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.216115&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.587547&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.859152&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.829869&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.102880&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.676986&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.887327&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.796729&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.847035&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.146757&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.408922&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.641239&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.678701&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.786427&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.221883&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.692321&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.434916&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.219745&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.706585&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.985421&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.182807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.667618&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.875264&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;27.547492&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.438075&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.065924&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.895070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.913707&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.662703&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.657333&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.282895&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.126612&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.963691&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.138564&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.962654&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.913707&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.786427&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.667618&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.692321&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.126612&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.219745&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.829869&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.102880&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.182807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.221883&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.875264&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.434916&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.963691&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.138564&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.895070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.961677&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.826753&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.306968&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.846733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;26.634434&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.958705&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.138461&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.607083&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.275267&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.139390&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.165591&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.073658&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.261869&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.703055&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.327755&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.146501&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.720792&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.428528&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.651645&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.841610&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.710473&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.595879&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.783844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.800103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.532257&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.312755&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.182661&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.666967&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.383983&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.414853&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.570509&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.539598&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.578779&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.342352&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.155356&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.925493&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.590047&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.612912&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.497542&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.638512&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.967178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.173935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.382803&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.082562&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.744671&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.074768&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.577794&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.435140&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.438581&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.551124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.375607&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.339441&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.201650&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.982935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.334306&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.404017&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.578779&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.173935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.651645&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.925493&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.590047&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.414853&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.334306&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.404017&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.720792&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.428528&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.375607&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.841610&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.383983&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.074768&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.783844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.638512&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.847517&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.961739&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.549614&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.371215&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.926165&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.336269&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.152799&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.163474&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;Details of System Under Test (SUT)&lt;/h2&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt;&lt;h3&gt;Hardware&lt;/h3&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Chassis&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;Supermicro 2U&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Motherboard&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;Supermicro X9DR3-LN4F+&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;CPU&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2 x Intel Xeon E5-2630 @ 2.3 GHz &lt;br /&gt;(6 cores, 12 threads each; &lt;br /&gt;total 12 cores, 24 threads)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;RAM&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;192 GB DDR3 (24 x 8 GB, 1066MHz)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Storage&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2 x Crucial 512 GB SSD&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt;&lt;h3&gt;Software&lt;/h3&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;DBMS&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/&quot; id=&quot;link-id0x2aabde830908&quot;&gt;Virtuoso Open Source&lt;/a&gt; 7.11.3209 &lt;br /&gt; (feature/analytics on &lt;a href=&quot;https://github.com/v7fasttrack/&quot; id=&quot;link-id0x2aabf8012028&quot;&gt;v7fasttrack on GitHub&lt;/a&gt;)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;OS&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;CentOS 6.2&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;This experiment places &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabfaa9a6b8&quot;&gt;Virtuoso&lt;/a&gt; in the ballpark with Actian Vector (formerly branded &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aabf9649118&quot;&gt;Vectorwise&lt;/a&gt;), which has dominated the TPC-H score board in recent years. The published Vector results are on more cores and/or faster clock; one would have to run on the exact same platform to make precise comparisons. &lt;/p&gt; &lt;p&gt;Virtuoso ups the ante by providing this level of performance in open source. For a comparison with &lt;a href=&quot;http://dbpedia.org/resource/EXASOL&quot; id=&quot;link-id0x2aabfa689d98&quot;&gt;EXASolution&lt;/a&gt; and Actian Matrix (formerly &lt;a href=&quot;http://dbpedia.org/resource/ParAccel&quot; id=&quot;link-id0x2aabdee3a0e8&quot;&gt;ParAccel&lt;/a&gt;), we will have to go to the Virtuoso scale-out configuration, to follow shortly.&lt;/p&gt; &lt;p&gt;The next articles will provide a detailed analysis of performance and instructions for reproducing the results. The run outputs and scripts are &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20140422TPCHResultsPreview&quot; id=&quot;link-id0x2aabfb0e67f8&quot;&gt;available for download&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x1cbe1308&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aabdf302818&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac65be5358&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac312f46d8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x710ece8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab74622528&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabc933d038&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aab725ea578&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac042d2928&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:09:58.952030-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 12 of n): TPC-H: Result Preview</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-04-22#1796</atom:id>
  <atom:published>2014-04-22T15:30:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this article, we look at the 100 GB single-server results for the whole workload. We will call this &lt;i&gt;Virt-H&lt;/i&gt; instead of &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabdeab62f8&quot;&gt;TPC-H&lt;/a&gt;&lt;/i&gt; in order to comply with the TPC rules: Use of the TPC-H label requires an audit.&lt;/p&gt; &lt;p&gt;The test consists of a bulk load followed by two runs. Each run consists of a single user power test and a multi-user throughput test. The number of users in the throughput test is up to the test sponsor but must be at least 5 for the 100 GB scale. The reported score is the lower of the two scores.&lt;/p&gt; &lt;h2&gt;Result Summary &lt;/h2&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100 GB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;dbgen&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;version 2.15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Lload time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Composite qph&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;241,482.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;System Availability Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-22&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The price/performance is left open. The hardware costs about 5000 euros and the software is open source so the cost per performance would be a minimum of 0.02 euros per qph at 100G. This is not compliant with the TPC pricing rules though. These require 3 year maintenance contracts for all parts.&lt;/p&gt; &lt;p&gt;The software configuration did not use RAID. Otherwise the software would be auditable to the best of my knowledge. The hardware would have to be the same from Dell, HP, or other large brand to satisfy the TPC pricing rule.&lt;/p&gt; &lt;h2&gt;Executive Summaries of Each Run&lt;/h2&gt; &lt;h3&gt;Run 1&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;1 TB / 87,496 MB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:17:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for Throughput Test&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;239,785.1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;243,191.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite Query-per-Hour Metric (Qph@100GB)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;241,482.3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in Throughput Test (Ts)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;162.935000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Duration of stream execution&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:17:46&lt;/td&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:47&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:40&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:40&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:06&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:33&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:10&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:37&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:16&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:17:46&lt;/td&gt; &lt;td&gt;2014-04-21 21:17:49&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:03&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;td&gt;2014-04-21 21:17:50&lt;/td&gt; &lt;td&gt;2014-04-21 21:17:51&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:25&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:38&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:33&lt;/td&gt; &lt;td&gt;2014-04-21 21:18:48&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:18:49&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:01&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:01&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:13&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:19:13&lt;/td&gt; &lt;td&gt;2014-04-21 21:19:25&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:12&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Numerical Quantities Summary -- Timing Intervals in Seconds&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.311882&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.383459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.143286&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.439926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.594027&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.736482&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.440826&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.198925&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.192341&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.952574&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.184940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.194804&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.998207&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.122059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.962717&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.773401&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.354001&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.191604&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.238262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.770639&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.782669&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.357578&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.034697&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.354747&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.489788&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.585291&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.645022&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.358926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.904636&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.220767&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.694622&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.431067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.609555&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.066582&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.740518&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.503038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.439980&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.424101&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.404849&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.256317&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.346825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.787459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391000&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.151059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.974037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.932079&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.191782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.619255&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.192341&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.952574&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.238262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.194804&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.974037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.357578&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.034697&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.619255&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.346825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.787459&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.740518&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.358926&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.439980&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.122059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.191782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.431067&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.998502&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.316702&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.239948&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.395693&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.019906&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.211317&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.257733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.686957&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.476940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.004782&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.070967&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.015134&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.995799&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.142581&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.989357&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.581758&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.351299&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657059&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.719765&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.157236&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.156379&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.566067&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.028898&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.146883&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.954105&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.341359&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.265949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.289724&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.249435&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.370577&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.262650&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.684574&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.597277&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.783821&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.944240&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.214661&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.253991&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.742896&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.701709&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.801641&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.612070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.126494&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.533748&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.733828&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.021583&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.423207&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.358223&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.866477&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.421209&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.040726&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.799425&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.908758&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.342975&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.934672&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.455598&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.258504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.421209&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.783821&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.533748&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.289724&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;23.021583&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.370577&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.028898&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.801641&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.612070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.040726&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.265949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.733828&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;25.249435&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.934672&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.455598&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.258504&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.587192&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.189892&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.252625&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.660841&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.204873&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.007484&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.161416&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.351616&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.258070&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.981896&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.161602&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.933124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.203497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.042949&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.349407&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.296630&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213340&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.070175&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.662723&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.260503&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.792825&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.323136&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.296430&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.939927&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.754827&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.895688&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.413773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.529466&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.288539&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.717479&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.222082&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.135510&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.486809&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.615640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.426936&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.274289&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.706145&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.402654&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.278881&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.260483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.604905&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.735042&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.627039&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.343302&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.242370&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.492640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.503095&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.698821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.221733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.670036&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.866626&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.108081&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.428098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.282014&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213320&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.088321&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.213340&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.615640&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.413773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.343302&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.288539&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.717479&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.503095&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.698821&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.754827&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.735042&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.426936&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.108081&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.428098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.282014&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.222082&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.260483&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.856323&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.197316&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.799419&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.303128&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.491595&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.443585&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.702762&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.024612&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Run 2&lt;/h3&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Report Date&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Scale Factor&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;100&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Total Data Storage/Database Size&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;1 TB / 87,496 MB&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Start of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:02:43&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;End of Database Load&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2014-04-21 21:17:45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Database Load Time&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;0:15:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Query Streams for Throughput Test&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Power&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;257,944.7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Throughput&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;240,998.0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Virt-H Composite Query-per-Hour Metric (Qph@100GB)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;249,327.4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Measurement Interval in Throughput Test (Ts)&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;164.417000 seconds&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Duration of stream execution&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Start Date/Time&lt;/th&gt; &lt;th&gt;End Date/Time&lt;/th&gt; &lt;th&gt;Duration&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:20&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:01&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:41&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:41&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:39&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:44&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:02&lt;/td&gt; &lt;td&gt;2014-04-21 21:24:46&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:02:44&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 0&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:20&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:22&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:02&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&amp;amp;$160;&lt;/th&gt; &lt;td&gt;2014-04-21 21:21:22&lt;/td&gt; &lt;td&gt;2014-04-21 21:21:23&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:01&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 1&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:49&lt;/td&gt; &lt;td&gt;2014-04-21 21:23:04&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:15&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 2&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:01&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:14&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 3&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:14&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:27&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 4&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:26&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:39&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:13&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Refresh 5&lt;/th&gt; &lt;td&gt;2014-04-21 21:22:39&lt;/td&gt; &lt;td&gt;2014-04-21 21:22:49&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0:00:10&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h4&gt;Numerical Quantities Summary -- Timing Intervals in Seconds&lt;/h4&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q1&lt;/th&gt; &lt;th&gt;Q2&lt;/th&gt; &lt;th&gt;Q3&lt;/th&gt; &lt;th&gt;Q4&lt;/th&gt; &lt;th&gt;Q5&lt;/th&gt; &lt;th&gt;Q6&lt;/th&gt; &lt;th&gt;Q7&lt;/th&gt; &lt;th&gt;Q8&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.437262&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.227516&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.172620&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.541201&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.542084&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.743255&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.459368&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.183166&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.205225&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.499833&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.854558&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.818087&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.920773&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.347414&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.446411&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.723247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.833803&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.659051&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.023266&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.123523&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.358200&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.371315&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.772453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.978415&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.308935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.662744&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.573807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.000859&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.282467&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391930&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.280472&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.852718&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.791856&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.421592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.953592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.688037&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.949038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.098282&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.153124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.824209&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.537098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.760386&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.308982&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.299178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.882695&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.652497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.383128&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.178447&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.205225&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.421592&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.308982&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.299178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.358200&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.652497&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.153124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.723247&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.537098&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.760386&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.573807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.000859&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.949038&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.391930&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.772453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.178447&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.335383&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.800721&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.542841&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.985937&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.078635&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.372288&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.407118&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.311407&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q9&lt;/th&gt; &lt;th&gt;Q10&lt;/th&gt; &lt;th&gt;Q11&lt;/th&gt; &lt;th&gt;Q12&lt;/th&gt; &lt;th&gt;Q13&lt;/th&gt; &lt;th&gt;Q14&lt;/th&gt; &lt;th&gt;Q15&lt;/th&gt; &lt;th&gt;Q16&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.441940&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.948770&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.154384&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.148494&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.014453&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.647725&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.437587&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.585284&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;14.127674&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.824844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.100679&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.586457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.216115&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.587547&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.859152&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.829869&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.102880&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.676986&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.887327&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.796729&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.847035&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.146757&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.408922&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.641239&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;15.678701&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.786427&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.221883&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.692321&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.434916&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.219745&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.706585&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;11.985421&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.182807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.667618&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.875264&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;27.547492&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.438075&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.065924&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.895070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.913707&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.662703&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.657333&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.282895&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.126612&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.963691&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.138564&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.962654&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.913707&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.786427&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.667618&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.692321&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;24.126612&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.657457&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.219745&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.829869&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;16.102880&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.182807&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.221883&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.875264&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;28.434916&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.963691&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.138564&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.895070&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.961677&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.826753&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.306968&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.846733&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;26.634434&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.958705&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.138461&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.607083&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt; &lt;/th&gt; &lt;th&gt;Q17&lt;/th&gt; &lt;th&gt;Q18&lt;/th&gt; &lt;th&gt;Q19&lt;/th&gt; &lt;th&gt;Q20&lt;/th&gt; &lt;th&gt;Q21&lt;/th&gt; &lt;th&gt;Q22&lt;/th&gt; &lt;th&gt;RF1&lt;/th&gt; &lt;th&gt;RF2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 0&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.275267&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.139390&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.165591&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.073658&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.261869&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;0.703055&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.327755&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.146501&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 1&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.720792&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.428528&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.651645&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.841610&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.710473&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.595879&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.783844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.800103&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 2&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;12.532257&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.312755&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.182661&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.666967&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.383983&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.414853&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.570509&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.539598&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 3&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.578779&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.342352&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.155356&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.925493&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.590047&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.612912&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.497542&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.638512&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 4&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.967178&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.173935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.382803&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;5.082562&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.744671&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.074768&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.577794&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.435140&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Stream 5&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.438581&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.551124&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.375607&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.339441&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.201650&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.982935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.334306&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.404017&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Min Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.578779&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.173935&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.651645&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.925493&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.590047&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;1.414853&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.334306&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.404017&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Max Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;13.720792&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.428528&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.375607&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.841610&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.383983&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;3.074768&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;9.783844&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.638512&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Avg Qi&lt;/th&gt; &lt;td style=&quot;text-align:right&quot;&gt;10.847517&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.961739&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;6.549614&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.371215&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;7.926165&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;2.336269&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;8.152799&lt;/td&gt; &lt;td style=&quot;text-align:right&quot;&gt;4.163474&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;Details of System Under Test (SUT)&lt;/h2&gt; &lt;table style=&quot;padding:10px;border-spacing:10px;&quot;&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt;&lt;h3&gt;Hardware&lt;/h3&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Chassis&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;Supermicro 2U&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Motherboard&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;Supermicro X9DR3-LN4F+&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;CPU&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2 x Intel Xeon E5-2630 @ 2.3 GHz &lt;br /&gt;(6 cores, 12 threads each; &lt;br /&gt;total 12 cores, 24 threads)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;RAM&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;192 GB DDR3 (24 x 8 GB, 1066MHz)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;Storage&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;2 x Crucial 512 GB SSD&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:left&quot;&gt;&lt;h3&gt;Software&lt;/h3&gt; &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;DBMS&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/&quot; id=&quot;link-id0x2aabde830908&quot;&gt;Virtuoso Open Source&lt;/a&gt; 7.11.3209 &lt;br /&gt; (feature/analytics on &lt;a href=&quot;https://github.com/v7fasttrack/&quot; id=&quot;link-id0x2aabf8012028&quot;&gt;v7fasttrack on GitHub&lt;/a&gt;)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th style=&quot;text-align:right&quot;&gt;OS&lt;/th&gt; &lt;td style=&quot;text-align:center&quot;&gt;CentOS 6.2&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;This experiment places &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabfaa9a6b8&quot;&gt;Virtuoso&lt;/a&gt; in the ballpark with Actian Vector (formerly branded &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aabf9649118&quot;&gt;Vectorwise&lt;/a&gt;), which has dominated the TPC-H score board in recent years. The published Vector results are on more cores and/or faster clock; one would have to run on the exact same platform to make precise comparisons. &lt;/p&gt; &lt;p&gt;Virtuoso ups the ante by providing this level of performance in open source. For a comparison with &lt;a href=&quot;http://dbpedia.org/resource/EXASOL&quot; id=&quot;link-id0x2aabfa689d98&quot;&gt;EXASolution&lt;/a&gt; and Actian Matrix (formerly &lt;a href=&quot;http://dbpedia.org/resource/ParAccel&quot; id=&quot;link-id0x2aabdee3a0e8&quot;&gt;ParAccel&lt;/a&gt;), we will have to go to the Virtuoso scale-out configuration, to follow shortly.&lt;/p&gt; &lt;p&gt;The next articles will provide a detailed analysis of performance and instructions for reproducing the results. The run outputs and scripts are &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFiles20140422TPCHResultsPreview&quot; id=&quot;link-id0x2aabfb0e67f8&quot;&gt;available for download&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x1cbe1308&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aabdf302818&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac7533f0c8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0xba10998&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x19da8318&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0xe9fec78&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0xc87ada8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabd6e8dee8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac04bd3b48&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:06:58.564111-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 11 of n): TPC-H Q2, Q10 - Late Projection</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-04-07#1795</atom:id>
  <atom:published>2014-04-07T16:30:54Z</atom:published>
  <atom:content type="html">&lt;p&gt;Analytics is generally about making something small out of something large. This reduction is obtained by a &lt;code&gt;TOP k&lt;/code&gt; operator (i.e., show only the 10 best by some metric) and/or by grouping and aggregation (i.e., for a set of items, show some attributes of these items and a sum, count, or other aggregate of dependent items for each).&lt;/p&gt; &lt;p&gt;In this installment we will look at &lt;i&gt;late projection,&lt;/i&gt; also sometimes known as &lt;i&gt;late materialization.&lt;/i&gt; If many attributes are returned and there is a cutoff of some sort, then the query does not need to be concerned about attributes on which there are no conditions, except for fetching them at the last moment, only for the entities which in fact will be returned to the user.&lt;/p&gt; &lt;p&gt;We look at &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac3c57d488&quot;&gt;TPC-H&lt;/a&gt; Q2 and Q10.&lt;/p&gt; &lt;h3&gt;Q2:&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment FROM part, supplier, partsupp, nation, region WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey AND p_size = 15 AND p_type LIKE &amp;#39;%BRASS&amp;#39; AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey AND r_name = &amp;#39;EUROPE&amp;#39; AND ps_supplycost = ( SELECT MIN(ps_supplycost) FROM partsupp, supplier, nation, region WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey AND r_name = &amp;#39;EUROPE&amp;#39; ) ORDER BY s_acctbal DESC, n_name, s_name, p_partkey &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to return information about &lt;code&gt;parts&lt;/code&gt; and &lt;code&gt;suppliers&lt;/code&gt;, such that the &lt;code&gt;part&lt;/code&gt; is available from a &lt;code&gt;supplier&lt;/code&gt; in Europe, and the &lt;code&gt;supplier&lt;/code&gt; has the lowest &lt;code&gt;price&lt;/code&gt; for the &lt;code&gt;part&lt;/code&gt; among all European &lt;code&gt;suppliers&lt;/code&gt;.&lt;/p&gt; &lt;h3&gt;Q10:&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 20 c_custkey, c_name, SUM(l_extendedprice * (1 - l_discount)) AS revenue, c_acctbal, n_name, c_address, c_phone, c_comment FROM customer, orders, lineitem, nation WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate &amp;gt;= CAST (&amp;#39;1993-10-01&amp;#39; AS DATE) AND o_orderdate &amp;lt; DATEADD (&amp;#39;month&amp;#39;, 3, CAST (&amp;#39;1993-10-01&amp;#39; AS DATE)) AND l_returnflag = &amp;#39;R&amp;#39; AND c_nationkey = n_nationkey GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment ORDER BY revenue DESC &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to list the &lt;code&gt;customers&lt;/code&gt; who cause the greatest loss of revenue in a given quarter by returning &lt;code&gt;items&lt;/code&gt; ordered in said quarter.&lt;/p&gt; &lt;p&gt;We notice that both queries return many columns on which there are no conditions, and that both have a cap on returned rows. The difference is that in Q2 the major &lt;code&gt;ORDER BY&lt;/code&gt; is on a grouping column, and in Q10 it is on the aggregate of the &lt;code&gt;GROUP BY&lt;/code&gt;. Thus the &lt;code&gt;TOP k&lt;/code&gt; trick discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac1e584578&quot;&gt;the previous article&lt;/a&gt; does apply to Q2 but not to Q10.&lt;/p&gt; &lt;p&gt;The profile for Q2 follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6.1e-05% fanout 1 input 1 rows time 1.1% fanout 1 input 1 rows { hash filler Subquery 27 { time 0.0012% fanout 1 input 1 rows REGION 1 rows(t10.R_REGIONKEY) R_NAME = &amp;lt;c EUROPE&amp;gt; time 0.00045% fanout 5 input 1 rows NATION 5 rows(t9.N_NATIONKEY) N_REGIONKEY = t10.R_REGIONKEY time 1.6% fanout 40107 input 5 rows SUPPLIER 4.2e+04 rows(t8.S_SUPPKEY) S_NATIONKEY = t9.N_NATIONKEY After code: 0: t8.S_SUPPKEY := := artm t8.S_SUPPKEY 4: BReturn 0 time 0.1% fanout 0 input 200535 rows Sort hf 49 (t8.S_SUPPKEY) } } time 0.0004% fanout 1 input 1 rows { fork time 21% fanout 79591 input 1 rows PART 8e+04 rows(.P_PARTKEY) P_TYPE LIKE &amp;lt;c %BRASS&amp;gt; LIKE &amp;lt;c &amp;#3;&amp;#5;&amp;gt; , P_SIZE = 15 time 44% fanout 0.591889 input 79591 rows Precode: 0: { time 0.083% fanout 1 input 79591 rows time 0.13% fanout 1 input 79591 rows { fork time 24% fanout 0.801912 input 79591 rows PARTSUPP 3.5 rows(.PS_SUPPKEY, .PS_SUPPLYCOST) inlined PS_PARTKEY = k_.P_PARTKEY hash partition+bloom by 62 (tmp)hash join merged always card 0.2 -&amp;gt; () time 1.3% fanout 0 input 63825 rows Hash source 49 merged into ts not partitionable 0.2 rows(.PS_SUPPKEY) -&amp;gt; () After code: 0: min min.PS_SUPPLYCOSTset no set_ctr 5: BReturn 0 } After code: 0: aggregate := := artm min 4: BReturn 0 time 0.19% fanout 0 input 79591 rows Subquery Select(aggregate) } 8: BReturn 0 PARTSUPP 5e-08 rows(.PS_SUPPKEY) inlined PS_PARTKEY = k_.P_PARTKEY PS_SUPPLYCOST = k_scalar time 5.9% fanout 0.247023 input 47109 rows SUPPLIER unq 0.9 rows (.S_ACCTBAL, .S_NATIONKEY, .S_NAME, .S_SUPPKEY) inlined S_SUPPKEY = .PS_SUPPKEY top k on S_ACCTBAL time 0.077% fanout 1 input 11637 rows NATION unq 1 rows (.N_REGIONKEY, .N_NAME) inlined N_NATIONKEY = .S_NATIONKEY time 0.051% fanout 1 input 11637 rows REGION unq 0.2 rows () inlined R_REGIONKEY = .N_REGIONKEY R_NAME = &amp;lt;c EUROPE&amp;gt; time 0.42% fanout 0 input 11637 rows Sort (.S_ACCTBAL, .N_NAME, .S_NAME, .P_PARTKEY) -&amp;gt; (.S_SUPPKEY) } time 0.0016% fanout 100 input 1 rows top order by read (.S_SUPPKEY, .P_PARTKEY, .N_NAME, .S_NAME, .S_ACCTBAL) time 0.02% fanout 1 input 100 rows PART unq 0.95 rows (.P_MFGR) inlined P_PARTKEY = .P_PARTKEY time 0.054% fanout 1 input 100 rows SUPPLIER unq 1 rows (.S_PHONE, .S_ADDRESS, .S_COMMENT) inlined S_SUPPKEY = k_.S_SUPPKEY time 6.7e-05% fanout 0 input 100 rows Select (.S_ACCTBAL, .S_NAME, .N_NAME, .P_PARTKEY, .P_MFGR, .S_ADDRESS, .S_PHONE, .S_COMMENT) } 128 msec 1007% cpu, 196992 rnd 2.53367e+07 seq 50.4135% same seg 45.3574% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The query starts with a scan looking for the qualifying &lt;code&gt;parts&lt;/code&gt;. It then looks for the best &lt;code&gt;price&lt;/code&gt; for each &lt;code&gt;part&lt;/code&gt; from a European &lt;code&gt;supplier&lt;/code&gt;. All the European &lt;code&gt;suppliers&lt;/code&gt; have been previously put in a hash table by the hash filler subquery at the start of the plan. Thus, to find the minimum &lt;code&gt;price&lt;/code&gt;, the query takes the &lt;code&gt;partsupp&lt;/code&gt; for the &lt;code&gt;part&lt;/code&gt; by index, and then eliminates all non-European &lt;code&gt;suppliers&lt;/code&gt; by a selective hash join. After this, there is a second index lookup on &lt;code&gt;partsupp&lt;/code&gt; where we look for the &lt;code&gt;part&lt;/code&gt; and the &lt;code&gt;price&lt;/code&gt; equal to the minimum &lt;code&gt;price&lt;/code&gt; found earlier. These operations could in principle be merged, as the minimum &lt;code&gt;price&lt;/code&gt; &lt;code&gt;partsupp&lt;/code&gt; has already been seen. The gain would not be very large, though.&lt;/p&gt; &lt;p&gt;Here we note that the cost model guesses that very few rows will survive the check of &lt;code&gt;ps_supplycost =&lt;/code&gt; minimum &lt;code&gt;cost&lt;/code&gt;. It does not know that the minimum is not just any value, but one of the values that do occur in the &lt;code&gt;ps_supplycost&lt;/code&gt; column for the part. Because of this, the remainder of the plan is carried out by index, which is just as well. The point is that if very few rows of input are expected, it is not worthwhile to make a hash table for a hash join. The hash table made for the European &lt;code&gt;suppliers&lt;/code&gt; could be reused here, maybe with some small gain. It would however need more columns, which might make it not worthwhile. We note that the major order with the &lt;code&gt;TOP k&lt;/code&gt; is on the &lt;code&gt;supplier&lt;/code&gt; &lt;code&gt;s_acctbal&lt;/code&gt;, hence as soon as there are 100 &lt;code&gt;suppliers&lt;/code&gt; found, one can add a restriction on the &lt;code&gt;s_acctbal&lt;/code&gt; for subsequent ones.&lt;/p&gt; &lt;p&gt;At the end of the plan, after the &lt;code&gt;TOP k ORDER BY&lt;/code&gt; and the reading of the results, we have a separate index-based lookup for getting only the columns that are returned. We note that this is done on 100 rows whereas the previous operations are done on tens-of-thousands of rows. The &lt;code&gt;TOP k&lt;/code&gt; restriction produces some benefit, but it is relatively late in the plan, and not many operations follow it.&lt;/p&gt; &lt;p&gt;The plan is easily good enough, with only small space for improvement. Q2 is one of the fastest queries of the set. &lt;/p&gt; &lt;p&gt;Let us now consider the execution of Q10:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 1.1e-06% fanout 1 input 1 rows time 4.4e-05% fanout 1 input 1 rows { hash filler time 1.6e-05% fanout 25 input 1 rows NATION 25 rows(.N_NATIONKEY, .N_NAME) time 6.7e-06% fanout 0 input 25 rows Sort hf 35 (.N_NATIONKEY) -&amp;gt; (.N_NAME) } time 1.5e-06% fanout 1 input 1 rows { fork time 2.4e-06% fanout 1 input 1 rows { fork time 13% fanout 5.73038e+06 input 1 rows ORDERS 5.1e+06 rows(.O_ORDERKEY, .O_CUSTKEY) O_ORDERDATE &amp;gt;= &amp;lt;c 1993-10-01&amp;gt; &amp;lt; &amp;lt;c 1994-01-01&amp;gt; time 4.8% fanout 2.00042 input 5.73038e+06 rows LINEITEM 1.1 rows(.L_EXTENDEDPRICE, .L_DISCOUNT) inlined L_ORDERKEY = .O_ORDERKEY L_RETURNFLAG = &amp;lt;c R&amp;gt; time 25% fanout 1 input 1.14632e+07 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 CUSTOMER unq 1 rows (.C_NATIONKEY, .C_CUSTKEY) inlined C_CUSTKEY = k_.O_CUSTKEY hash partition+bloom by 39 (tmp)hash join merged always card 1 -&amp;gt; (.N_NAME) time 0.0023% fanout 1 input 1.14632e+07 rows Hash source 35 merged into ts 1 rows(.C_NATIONKEY) -&amp;gt; (.N_NAME) time 2.3% fanout 1 input 1.14632e+07 rows Stage 2 time 3.6% fanout 0 input 1.14632e+07 rows Sort (q_.C_CUSTKEY, .N_NAME) -&amp;gt; (temp) } time 0.6% fanout 3.88422e+06 input 1 rows group by read node (.C_CUSTKEY, .N_NAME, revenue)in each partition slice time 0.57% fanout 0 input 3.88422e+06 rows Sort (revenue) -&amp;gt; (.N_NAME, .C_CUSTKEY) } time 6.9e-06% fanout 20 input 1 rows top order by read (.N_NAME, revenue, .C_CUSTKEY) time 0.00036% fanout 1 input 20 rows CUSTOMER unq 1 rows (.C_PHONE, .C_NAME, .C_ACCTBAL, .C_ADDRESS, .C_COMMENT) inlined C_CUSTKEY = .C_CUSTKEY time 1.1e-06% fanout 0 input 20 rows Select (.C_CUSTKEY, .C_NAME, revenue, .C_ACCTBAL, .N_NAME, .C_ADDRESS, .C_PHONE, .C_COMMENT) } 2153 msec 2457% cpu, 1.71845e+07 rnd 1.67177e+08 seq 76.3221% same seg 21.1204% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The plan is by index, except for the lookup of &lt;code&gt;nation name&lt;/code&gt; for the &lt;code&gt;customer&lt;/code&gt;. The most selective condition is on &lt;code&gt;order date&lt;/code&gt;, followed by the &lt;code&gt;returnflag&lt;/code&gt; on &lt;code&gt;lineitem&lt;/code&gt;. Getting the &lt;code&gt;customer&lt;/code&gt; by index turns out to be better than by hash, even though almost all &lt;code&gt;customers&lt;/code&gt; are hit. See the input cardinality above the first &lt;code&gt;customer&lt;/code&gt; entry in the plan -- over 10M. The key point here is that only the &lt;code&gt;c_custkey&lt;/code&gt; and &lt;code&gt;c_nationkey&lt;/code&gt; get fetched, which saves a lot of time. In fact the &lt;code&gt;c_custkey&lt;/code&gt; is needless since this is anyway equal to the &lt;code&gt;o_custkey&lt;/code&gt;, but this makes little difference.&lt;/p&gt; &lt;p&gt;One could argue that &lt;code&gt;customer&lt;/code&gt; should be between &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt; in &lt;code&gt;join&lt;/code&gt; order. Doing this would lose the &lt;code&gt;ORDER BY&lt;/code&gt; on &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt;, but would prevent some &lt;code&gt;customer&lt;/code&gt; rows from being hit twice for a single &lt;code&gt;order&lt;/code&gt;. The difference would not be large, though. For a scale-out setting, one definitely wants to have &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt; without &lt;code&gt;customer&lt;/code&gt; in between if the former are partitioned on the same key.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;c_nationkey&lt;/code&gt; is next translated into a &lt;code&gt;n_name&lt;/code&gt; by hash, and there is a partitioned &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt;. The &lt;code&gt;GROUP BY&lt;/code&gt; is partitioned because there are many different &lt;code&gt;c_custkey&lt;/code&gt; values (155M for 100G scale). &lt;/p&gt; &lt;p&gt;The most important trick is fetching all the many dependent columns of &lt;code&gt;c_custkey&lt;/code&gt; only after the &lt;code&gt;TOP k ORDER BY&lt;/code&gt;. The last access to &lt;code&gt;customer&lt;/code&gt; in the plan does this and is only executed on 20 rows.&lt;/p&gt; &lt;p&gt;Without the &lt;code&gt;TOP k&lt;/code&gt; trick, the plan is identical, except that the dependent columns are fetched for nearly all &lt;code&gt;customers&lt;/code&gt;. If this is done, the run time is 16s, which is bad enough to sink the whole score.&lt;/p&gt; &lt;p&gt;There is another approach to the challenge of this query: If foreign keys are declared and enforced, the system will know that every &lt;code&gt;order&lt;/code&gt; has an actually existing &lt;code&gt;customer&lt;/code&gt; and that every &lt;code&gt;customer&lt;/code&gt; has a &lt;code&gt;country&lt;/code&gt;. If so, the whole &lt;code&gt;GROUP BY&lt;/code&gt; and &lt;code&gt;TOP k&lt;/code&gt; can be done without any reference to &lt;code&gt;customer&lt;/code&gt;, which is a notch better still, at least for this query. In this implementation, we do not declare foreign keys, thus the database must check that the &lt;code&gt;customer&lt;/code&gt; and its &lt;code&gt;country&lt;/code&gt; in fact exist before doing the &lt;code&gt;GROUP BY&lt;/code&gt;. This makes the late projection trick mandatory, but does save the expense of checking foreign keys on updates. In both cases, the optimizer must recognize that the columns to be fetched at the end (late projected) are functionally dependent on a grouping key (&lt;code&gt;c_custkey&lt;/code&gt;).&lt;/p&gt; &lt;p&gt;The late projection trick is generally useful, since almost all applications aside from bulk data export have some sort of limit on result set size. A column store especially benefits from this, since some columns of a row can be read without even coming near to other ones. A row store can also benefit from this in the form of decreased intermediate result size. This is especially good when returning long columns, such as text fields or blobs, on which there are most often no search conditions. If there are conditions of such, then these will most often be implemented via a special text index and not a scan.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;In the next installment we will have a look at the overall 100G single server performance. After this we will recap the tricks so far. Then it will be time to look at implications of scale out for performance and run at larger scales. After the relational ground has been covered, we can look at implications of schema-lastness, i.e., triples for this type of workload.&lt;/p&gt; &lt;p&gt;So, while the most salient tricks have been at least briefly mentioned, we are far from having exhausted this most foundational of database topics.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x1cbe1308&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x15391cb8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac7a7d96d8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac30610368&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x16bd8ba8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabde5ee298&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x170500c8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x1ae9f688&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac04120018&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:19.696678-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 11 of n): TPC-H Q2, Q10 - Late Projection</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-04-07#1793</atom:id>
  <atom:published>2014-04-07T16:28:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;Analytics is generally about making something small out of something large. This reduction is obtained by a &lt;code&gt;TOP k&lt;/code&gt; operator (i.e., show only the 10 best by some metric) and/or by grouping and aggregation (i.e., for a set of items, show some attributes of these items and a sum, count, or other aggregate of dependent items for each).&lt;/p&gt; &lt;p&gt;In this installment we will look at &lt;i&gt;late projection,&lt;/i&gt; also sometimes known as &lt;i&gt;late materialization.&lt;/i&gt; If many attributes are returned and there is a cutoff of some sort, then the query does not need to be concerned about attributes on which there are no conditions, except for fetching them at the last moment, only for the entities which in fact will be returned to the user.&lt;/p&gt; &lt;p&gt;We look at &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac3c57d488&quot;&gt;TPC-H&lt;/a&gt; Q2 and Q10.&lt;/p&gt; &lt;h3&gt;Q2:&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment FROM part, supplier, partsupp, nation, region WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey AND p_size = 15 AND p_type LIKE &amp;#39;%BRASS&amp;#39; AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey AND r_name = &amp;#39;EUROPE&amp;#39; AND ps_supplycost = ( SELECT MIN(ps_supplycost) FROM partsupp, supplier, nation, region WHERE p_partkey = ps_partkey AND s_suppkey = ps_suppkey AND s_nationkey = n_nationkey AND n_regionkey = r_regionkey AND r_name = &amp;#39;EUROPE&amp;#39; ) ORDER BY s_acctbal DESC, n_name, s_name, p_partkey &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to return information about &lt;code&gt;parts&lt;/code&gt; and &lt;code&gt;suppliers&lt;/code&gt;, such that the &lt;code&gt;part&lt;/code&gt; is available from a &lt;code&gt;supplier&lt;/code&gt; in Europe, and the &lt;code&gt;supplier&lt;/code&gt; has the lowest &lt;code&gt;price&lt;/code&gt; for the &lt;code&gt;part&lt;/code&gt; among all European &lt;code&gt;suppliers&lt;/code&gt;.&lt;/p&gt; &lt;h3&gt;Q10:&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 20 c_custkey, c_name, SUM(l_extendedprice * (1 - l_discount)) AS revenue, c_acctbal, n_name, c_address, c_phone, c_comment FROM customer, orders, lineitem, nation WHERE c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate &amp;gt;= CAST (&amp;#39;1993-10-01&amp;#39; AS DATE) AND o_orderdate &amp;lt; DATEADD (&amp;#39;month&amp;#39;, 3, CAST (&amp;#39;1993-10-01&amp;#39; AS DATE)) AND l_returnflag = &amp;#39;R&amp;#39; AND c_nationkey = n_nationkey GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment ORDER BY revenue DESC &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to list the &lt;code&gt;customers&lt;/code&gt; who cause the greatest loss of revenue in a given quarter by returning &lt;code&gt;items&lt;/code&gt; ordered in said quarter.&lt;/p&gt; &lt;p&gt;We notice that both queries return many columns on which there are no conditions, and that both have a cap on returned rows. The difference is that in Q2 the major &lt;code&gt;ORDER BY&lt;/code&gt; is on a grouping column, and in Q10 it is on the aggregate of the &lt;code&gt;GROUP BY&lt;/code&gt;. Thus the &lt;code&gt;TOP k&lt;/code&gt; trick discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac1e584578&quot;&gt;the previous article&lt;/a&gt; does apply to Q2 but not to Q10.&lt;/p&gt; &lt;p&gt;The profile for Q2 follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6.1e-05% fanout 1 input 1 rows time 1.1% fanout 1 input 1 rows { hash filler Subquery 27 { time 0.0012% fanout 1 input 1 rows REGION 1 rows(t10.R_REGIONKEY) R_NAME = &amp;lt;c EUROPE&amp;gt; time 0.00045% fanout 5 input 1 rows NATION 5 rows(t9.N_NATIONKEY) N_REGIONKEY = t10.R_REGIONKEY time 1.6% fanout 40107 input 5 rows SUPPLIER 4.2e+04 rows(t8.S_SUPPKEY) S_NATIONKEY = t9.N_NATIONKEY After code: 0: t8.S_SUPPKEY := := artm t8.S_SUPPKEY 4: BReturn 0 time 0.1% fanout 0 input 200535 rows Sort hf 49 (t8.S_SUPPKEY) } } time 0.0004% fanout 1 input 1 rows { fork time 21% fanout 79591 input 1 rows PART 8e+04 rows(.P_PARTKEY) P_TYPE LIKE &amp;lt;c %BRASS&amp;gt; LIKE &amp;lt;c &amp;#3;&amp;#5;&amp;gt; , P_SIZE = 15 time 44% fanout 0.591889 input 79591 rows Precode: 0: { time 0.083% fanout 1 input 79591 rows time 0.13% fanout 1 input 79591 rows { fork time 24% fanout 0.801912 input 79591 rows PARTSUPP 3.5 rows(.PS_SUPPKEY, .PS_SUPPLYCOST) inlined PS_PARTKEY = k_.P_PARTKEY hash partition+bloom by 62 (tmp)hash join merged always card 0.2 -&amp;gt; () time 1.3% fanout 0 input 63825 rows Hash source 49 merged into ts not partitionable 0.2 rows(.PS_SUPPKEY) -&amp;gt; () After code: 0: min min.PS_SUPPLYCOSTset no set_ctr 5: BReturn 0 } After code: 0: aggregate := := artm min 4: BReturn 0 time 0.19% fanout 0 input 79591 rows Subquery Select(aggregate) } 8: BReturn 0 PARTSUPP 5e-08 rows(.PS_SUPPKEY) inlined PS_PARTKEY = k_.P_PARTKEY PS_SUPPLYCOST = k_scalar time 5.9% fanout 0.247023 input 47109 rows SUPPLIER unq 0.9 rows (.S_ACCTBAL, .S_NATIONKEY, .S_NAME, .S_SUPPKEY) inlined S_SUPPKEY = .PS_SUPPKEY top k on S_ACCTBAL time 0.077% fanout 1 input 11637 rows NATION unq 1 rows (.N_REGIONKEY, .N_NAME) inlined N_NATIONKEY = .S_NATIONKEY time 0.051% fanout 1 input 11637 rows REGION unq 0.2 rows () inlined R_REGIONKEY = .N_REGIONKEY R_NAME = &amp;lt;c EUROPE&amp;gt; time 0.42% fanout 0 input 11637 rows Sort (.S_ACCTBAL, .N_NAME, .S_NAME, .P_PARTKEY) -&amp;gt; (.S_SUPPKEY) } time 0.0016% fanout 100 input 1 rows top order by read (.S_SUPPKEY, .P_PARTKEY, .N_NAME, .S_NAME, .S_ACCTBAL) time 0.02% fanout 1 input 100 rows PART unq 0.95 rows (.P_MFGR) inlined P_PARTKEY = .P_PARTKEY time 0.054% fanout 1 input 100 rows SUPPLIER unq 1 rows (.S_PHONE, .S_ADDRESS, .S_COMMENT) inlined S_SUPPKEY = k_.S_SUPPKEY time 6.7e-05% fanout 0 input 100 rows Select (.S_ACCTBAL, .S_NAME, .N_NAME, .P_PARTKEY, .P_MFGR, .S_ADDRESS, .S_PHONE, .S_COMMENT) } 128 msec 1007% cpu, 196992 rnd 2.53367e+07 seq 50.4135% same seg 45.3574% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The query starts with a scan looking for the qualifying &lt;code&gt;parts&lt;/code&gt;. It then looks for the best &lt;code&gt;price&lt;/code&gt; for each &lt;code&gt;part&lt;/code&gt; from a European &lt;code&gt;supplier&lt;/code&gt;. All the European &lt;code&gt;suppliers&lt;/code&gt; have been previously put in a hash table by the hash filler subquery at the start of the plan. Thus, to find the minimum &lt;code&gt;price&lt;/code&gt;, the query takes the &lt;code&gt;partsupp&lt;/code&gt; for the &lt;code&gt;part&lt;/code&gt; by index, and then eliminates all non-European &lt;code&gt;suppliers&lt;/code&gt; by a selective hash join. After this, there is a second index lookup on &lt;code&gt;partsupp&lt;/code&gt; where we look for the &lt;code&gt;part&lt;/code&gt; and the &lt;code&gt;price&lt;/code&gt; equal to the minimum &lt;code&gt;price&lt;/code&gt; found earlier. These operations could in principle be merged, as the minimum &lt;code&gt;price&lt;/code&gt; &lt;code&gt;partsupp&lt;/code&gt; has already been seen. The gain would not be very large, though.&lt;/p&gt; &lt;p&gt;Here we note that the cost model guesses that very few rows will survive the check of &lt;code&gt;ps_supplycost =&lt;/code&gt; minimum &lt;code&gt;cost&lt;/code&gt;. It does not know that the minimum is not just any value, but one of the values that do occur in the &lt;code&gt;ps_supplycost&lt;/code&gt; column for the part. Because of this, the remainder of the plan is carried out by index, which is just as well. The point is that if very few rows of input are expected, it is not worthwhile to make a hash table for a hash join. The hash table made for the European &lt;code&gt;suppliers&lt;/code&gt; could be reused here, maybe with some small gain. It would however need more columns, which might make it not worthwhile. We note that the major order with the &lt;code&gt;TOP k&lt;/code&gt; is on the &lt;code&gt;supplier&lt;/code&gt; &lt;code&gt;s_acctbal&lt;/code&gt;, hence as soon as there are 100 &lt;code&gt;suppliers&lt;/code&gt; found, one can add a restriction on the &lt;code&gt;s_acctbal&lt;/code&gt; for subsequent ones.&lt;/p&gt; &lt;p&gt;At the end of the plan, after the &lt;code&gt;TOP k ORDER BY&lt;/code&gt; and the reading of the results, we have a separate index-based lookup for getting only the columns that are returned. We note that this is done on 100 rows whereas the previous operations are done on tens-of-thousands of rows. The &lt;code&gt;TOP k&lt;/code&gt; restriction produces some benefit, but it is relatively late in the plan, and not many operations follow it.&lt;/p&gt; &lt;p&gt;The plan is easily good enough, with only small space for improvement. Q2 is one of the fastest queries of the set. &lt;/p&gt; &lt;p&gt;Let us now consider the execution of Q10:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 1.1e-06% fanout 1 input 1 rows time 4.4e-05% fanout 1 input 1 rows { hash filler time 1.6e-05% fanout 25 input 1 rows NATION 25 rows(.N_NATIONKEY, .N_NAME) time 6.7e-06% fanout 0 input 25 rows Sort hf 35 (.N_NATIONKEY) -&amp;gt; (.N_NAME) } time 1.5e-06% fanout 1 input 1 rows { fork time 2.4e-06% fanout 1 input 1 rows { fork time 13% fanout 5.73038e+06 input 1 rows ORDERS 5.1e+06 rows(.O_ORDERKEY, .O_CUSTKEY) O_ORDERDATE &amp;gt;= &amp;lt;c 1993-10-01&amp;gt; &amp;lt; &amp;lt;c 1994-01-01&amp;gt; time 4.8% fanout 2.00042 input 5.73038e+06 rows LINEITEM 1.1 rows(.L_EXTENDEDPRICE, .L_DISCOUNT) inlined L_ORDERKEY = .O_ORDERKEY L_RETURNFLAG = &amp;lt;c R&amp;gt; time 25% fanout 1 input 1.14632e+07 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 CUSTOMER unq 1 rows (.C_NATIONKEY, .C_CUSTKEY) inlined C_CUSTKEY = k_.O_CUSTKEY hash partition+bloom by 39 (tmp)hash join merged always card 1 -&amp;gt; (.N_NAME) time 0.0023% fanout 1 input 1.14632e+07 rows Hash source 35 merged into ts 1 rows(.C_NATIONKEY) -&amp;gt; (.N_NAME) time 2.3% fanout 1 input 1.14632e+07 rows Stage 2 time 3.6% fanout 0 input 1.14632e+07 rows Sort (q_.C_CUSTKEY, .N_NAME) -&amp;gt; (temp) } time 0.6% fanout 3.88422e+06 input 1 rows group by read node (.C_CUSTKEY, .N_NAME, revenue)in each partition slice time 0.57% fanout 0 input 3.88422e+06 rows Sort (revenue) -&amp;gt; (.N_NAME, .C_CUSTKEY) } time 6.9e-06% fanout 20 input 1 rows top order by read (.N_NAME, revenue, .C_CUSTKEY) time 0.00036% fanout 1 input 20 rows CUSTOMER unq 1 rows (.C_PHONE, .C_NAME, .C_ACCTBAL, .C_ADDRESS, .C_COMMENT) inlined C_CUSTKEY = .C_CUSTKEY time 1.1e-06% fanout 0 input 20 rows Select (.C_CUSTKEY, .C_NAME, revenue, .C_ACCTBAL, .N_NAME, .C_ADDRESS, .C_PHONE, .C_COMMENT) } 2153 msec 2457% cpu, 1.71845e+07 rnd 1.67177e+08 seq 76.3221% same seg 21.1204% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The plan is by index, except for the lookup of &lt;code&gt;nation name&lt;/code&gt; for the &lt;code&gt;customer&lt;/code&gt;. The most selective condition is on &lt;code&gt;order date&lt;/code&gt;, followed by the &lt;code&gt;returnflag&lt;/code&gt; on &lt;code&gt;lineitem&lt;/code&gt;. Getting the &lt;code&gt;customer&lt;/code&gt; by index turns out to be better than by hash, even though almost all &lt;code&gt;customers&lt;/code&gt; are hit. See the input cardinality above the first &lt;code&gt;customer&lt;/code&gt; entry in the plan -- over 10M. The key point here is that only the &lt;code&gt;c_custkey&lt;/code&gt; and &lt;code&gt;c_nationkey&lt;/code&gt; get fetched, which saves a lot of time. In fact the &lt;code&gt;c_custkey&lt;/code&gt; is needless since this is anyway equal to the &lt;code&gt;o_custkey&lt;/code&gt;, but this makes little difference.&lt;/p&gt; &lt;p&gt;One could argue that &lt;code&gt;customer&lt;/code&gt; should be between &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt; in &lt;code&gt;join&lt;/code&gt; order. Doing this would lose the &lt;code&gt;ORDER BY&lt;/code&gt; on &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt;, but would prevent some &lt;code&gt;customer&lt;/code&gt; rows from being hit twice for a single &lt;code&gt;order&lt;/code&gt;. The difference would not be large, though. For a scale-out setting, one definitely wants to have &lt;code&gt;orders&lt;/code&gt; and &lt;code&gt;lineitem&lt;/code&gt; without &lt;code&gt;customer&lt;/code&gt; in between if the former are partitioned on the same key.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;c_nationkey&lt;/code&gt; is next translated into a &lt;code&gt;n_name&lt;/code&gt; by hash, and there is a partitioned &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt;. The &lt;code&gt;GROUP BY&lt;/code&gt; is partitioned because there are many different &lt;code&gt;c_custkey&lt;/code&gt; values (155M for 100G scale). &lt;/p&gt; &lt;p&gt;The most important trick is fetching all the many dependent columns of &lt;code&gt;c_custkey&lt;/code&gt; only after the &lt;code&gt;TOP k ORDER BY&lt;/code&gt;. The last access to &lt;code&gt;customer&lt;/code&gt; in the plan does this and is only executed on 20 rows.&lt;/p&gt; &lt;p&gt;Without the &lt;code&gt;TOP k&lt;/code&gt; trick, the plan is identical, except that the dependent columns are fetched for nearly all &lt;code&gt;customers&lt;/code&gt;. If this is done, the run time is 16s, which is bad enough to sink the whole score.&lt;/p&gt; &lt;p&gt;There is another approach to the challenge of this query: If foreign keys are declared and enforced, the system will know that every &lt;code&gt;order&lt;/code&gt; has an actually existing &lt;code&gt;customer&lt;/code&gt; and that every &lt;code&gt;customer&lt;/code&gt; has a &lt;code&gt;country&lt;/code&gt;. If so, the whole &lt;code&gt;GROUP BY&lt;/code&gt; and &lt;code&gt;TOP k&lt;/code&gt; can be done without any reference to &lt;code&gt;customer&lt;/code&gt;, which is a notch better still, at least for this query. In this implementation, we do not declare foreign keys, thus the database must check that the &lt;code&gt;customer&lt;/code&gt; and its &lt;code&gt;country&lt;/code&gt; in fact exist before doing the &lt;code&gt;GROUP BY&lt;/code&gt;. This makes the late projection trick mandatory, but does save the expense of checking foreign keys on updates. In both cases, the optimizer must recognize that the columns to be fetched at the end (late projected) are functionally dependent on a grouping key (&lt;code&gt;c_custkey&lt;/code&gt;).&lt;/p&gt; &lt;p&gt;The late projection trick is generally useful, since almost all applications aside from bulk data export have some sort of limit on result set size. A column store especially benefits from this, since some columns of a row can be read without even coming near to other ones. A row store can also benefit from this in the form of decreased intermediate result size. This is especially good when returning long columns, such as text fields or blobs, on which there are most often no search conditions. If there are conditions of such, then these will most often be implemented via a special text index and not a scan.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;In the next installment we will have a look at the overall 100G single server performance. After this we will recap the tricks so far. Then it will be time to look at implications of scale out for performance and run at larger scales. After the relational ground has been covered, we can look at implications of schema-lastness, i.e., triples for this type of workload.&lt;/p&gt; &lt;p&gt;So, while the most salient tricks have been at least briefly mentioned, we are far from having exhausted this most foundational of database topics.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x1cbe1308&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H Q9, Q17, Q20 - Predicate Games &lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2adc6e88&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac67c7d218&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x11055068&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x1927ecf8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe8549578&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x94fc248&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac83875dd8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab6ef1afd8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:07.568642-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>OpenPHACTS in Vienna</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-31#1792</atom:id>
  <atom:published>2014-03-31T15:49:54Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/hugh-williams/0/1a0/559&quot; id=&quot;link-id0x1d043058&quot;&gt;Hugh Williams&lt;/a&gt; and I (&lt;a href=&quot;http://www.linkedin.com/in/orrierling&quot; id=&quot;link-id0x1ce71de8&quot;&gt;Orri Erling&lt;/a&gt;) went to the &lt;a href=&quot;http://www.OpenPHACTS.org/&quot; id=&quot;link-id0xcc549f8&quot;&gt;Open PHACTS&lt;/a&gt; &lt;a href=&quot;http://www.OpenPHACTS.org/news-and-events/news-archive/2014/344-7th-steering-committee-meeting-held&quot; id=&quot;link-id0x19e23b68&quot;&gt;Steering Committee meeting&lt;/a&gt; in Vienna last week. I am a great fan of Open PHACTS; the meetings are fun, with a great team spirit, and there is always something new to learn.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.few.vu.nl/~pgroth/&quot; id=&quot;link-id0x2257d818&quot;&gt;Paul Groth&lt;/a&gt; gave a talk about the stellar success of the the initial term of Open PHACTS.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Three releases of platform and data&lt;/li&gt; &lt;li&gt;18 applications&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openphactsfoundation.org/&quot; id=&quot;link-id0x1e33a478&quot;&gt;Open PHACTS Foundation&lt;/a&gt; for sustainable exploitation and further development of the platform&lt;/li&gt; &lt;li&gt;Superb culture of collaboration &lt;ul&gt; &lt;li&gt;great team spirit&lt;/li&gt; &lt;li&gt;great output from distributed organization&lt;/li&gt; &lt;li&gt;lots of face-to-face time&lt;/li&gt; &lt;li&gt;example to every other big collaborative project&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;quot;The reincarnation of &lt;a href=&quot;http://dbpedia.org/page/Steve_Jobs&quot; id=&quot;link-id0x1e8009c8&quot;&gt;Steve Jobs&lt;/a&gt;,&amp;quot; commented someone from the audience. &amp;quot;Except I am a nice guy,&amp;quot; retorted Paul. &lt;/p&gt; &lt;p&gt;Commented one attendee, &amp;quot;The semantic web…., I just was in Boston at a semantic web meeting – so nerdy, something to make you walk out of the room… so it is a definite victory for Open PHACTS and why not also semantic web, that something based on these principles actually works.&amp;quot;&lt;/p&gt; &lt;p&gt;It is a win anyhow, so I did not say anything at the meeting. So I will say something here, where I have more space as the message bears repeating.&lt;/p&gt; &lt;p&gt;We share part of the perception, so we hardly ever say &amp;quot;semantic web.&amp;quot; The word is &amp;quot;linked data,&amp;quot; and it means flexible schema and global identifiers. &lt;i&gt;Flexible schema&lt;/i&gt; means that everything does not have to be modeled upfront. &lt;i&gt;Global identifiers&lt;/i&gt; means that data, when transferred out of its silo of origin, remains interpretable and self-describing, so you can mix it with other data without things getting confused. &lt;i&gt;&amp;quot;Desiloization&amp;quot;&lt;/i&gt; is a wonderful new word for describing this.&lt;/p&gt; &lt;p&gt;This ties right into &lt;a href=&quot;http://datafairport.org/&quot; id=&quot;link-id0x20a450f8&quot;&gt;FAIRport&lt;/a&gt; and FAIR data: &lt;a href=&quot;http://dbpedia.org/page/Findability&quot; id=&quot;link-id0x1f32bb68&quot;&gt;Findable&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Accessibility&quot; id=&quot;link-id0x1eb7ca28&quot;&gt;Accessible&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Interoperability&quot; id=&quot;link-id0x1ea03c68&quot;&gt;Interoperable&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Reusability&quot; id=&quot;link-id0x20c78888&quot;&gt;Reusable&lt;/a&gt;. &lt;a href=&quot;http://dbpedia.org/page/Barend_Mons&quot; id=&quot;link-id0xb2ca558&quot;&gt;Barend Mons&lt;/a&gt; talked a lot about this: &lt;i&gt;open&lt;/i&gt; just means downloadable; &lt;i&gt;fair&lt;/i&gt; means something you can do science with. Barend’s take is that &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x20767568&quot;&gt;RDF&lt;/a&gt; with a &lt;a href=&quot;http://dbpedia.org/page/Uniform_resource_identifier&quot; id=&quot;link-id0x19586538&quot;&gt;URI&lt;/a&gt; for everything is the super wire format for exchanging data. When you process it, you will diversely cook it, so an RDF store is one destination but not the only possibility. It has been said before: there is a range of choices between storing triples verbatim, and making application specific extractions, including ones with a schema, whether graph DB or relational.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://nanopub.org/&quot; id=&quot;link-id0x156cfef8&quot;&gt;Nanopublications&lt;/a&gt; are also moving ahead. &lt;a href=&quot;http://ch.linkedin.com/pub/christine-chichester/3/9a0/85b&quot; id=&quot;link-id0x15928e48&quot;&gt;Christine Chichester&lt;/a&gt; told me about pending publications involving Open PHACTS nanopublictions about post-translation modification of proteins and their expression in different tissues. So there are nanopublications out there and they can be joined, just as intended. Victory of e-science and data integration.&lt;/p&gt; &lt;p&gt;The Open PHACTS project is now officially extended for another two-year term, bringing the total duration to five years. The Open PHACTS Foundation exists as a legal entity and has its first members. This is meant to be a non-profit industry association for sharing of pre-competitive data and services around these between players in the pharma space, in industry as well as academia. There are press releases to follow in due time.&lt;/p&gt; &lt;p&gt;I am looking forward to more Open PHACTS. From the &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x1270cb58&quot;&gt;OpenLink&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x204c2dd8&quot;&gt;Virtuoso&lt;/a&gt; side, there are directly relevant developments that will enter production in the next few months, including query caching discussed &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1771&quot; id=&quot;link-id0x1de0fcb8&quot;&gt;earlier on this blog&lt;/a&gt;, as well as running on the TPC-H tuned analytics branch for overall better query optimization. Adaptive schema is something of evident value to Open PHACTS, as much of the integrated data comes from relational sources, so is regular enough. Therefore taking advantage of this for storage cannot hurt. We will see this still within the scope of the project extension.&lt;/p&gt; &lt;p&gt;Otherwise, more cooperation in formulating the queries for the business questions will also help.&lt;/p&gt; &lt;p&gt;All in all, Open PHACTS is the celebrated beauty queen of all the &lt;a href=&quot;http://dbpedia.org/page/Innovative_Medicines_Initiative&quot; id=&quot;link-id0x20ae59d8&quot;&gt;Innovative Medicine Initiative&lt;/a&gt;, it would seem. Superbly connected, unparalleled logo cloud, actually working and useful data integration, delivering on time on all in fact very complex business questions.&lt;/p&gt;</atom:content>
  <atom:updated>2014-03-31T11:49:54.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>OpenPHACTS in Vienna</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-31#1791</atom:id>
  <atom:published>2014-03-31T15:49:44Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/hugh-williams/0/1a0/559&quot; id=&quot;link-id0x1d043058&quot;&gt;Hugh Williams&lt;/a&gt; and I (&lt;a href=&quot;http://www.linkedin.com/in/orrierling&quot; id=&quot;link-id0x1ce71de8&quot;&gt;Orri Erling&lt;/a&gt;) went to the &lt;a href=&quot;http://www.OpenPHACTS.org/&quot; id=&quot;link-id0xcc549f8&quot;&gt;Open PHACTS&lt;/a&gt; &lt;a href=&quot;http://www.OpenPHACTS.org/news-and-events/news-archive/2014/344-7th-steering-committee-meeting-held&quot; id=&quot;link-id0x19e23b68&quot;&gt;Steering Committee meeting&lt;/a&gt; in Vienna last week. I am a great fan of Open PHACTS; the meetings are fun, with a great team spirit, and there is always something new to learn.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.few.vu.nl/~pgroth/&quot; id=&quot;link-id0x2257d818&quot;&gt;Paul Groth&lt;/a&gt; gave a talk about the stellar success of the the initial term of Open PHACTS.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Three releases of platform and data&lt;/li&gt; &lt;li&gt;18 applications&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openphactsfoundation.org/&quot; id=&quot;link-id0x1e33a478&quot;&gt;Open PHACTS Foundation&lt;/a&gt; for sustainable exploitation and further development of the platform&lt;/li&gt; &lt;li&gt;Superb culture of collaboration &lt;ul&gt; &lt;li&gt;great team spirit&lt;/li&gt; &lt;li&gt;great output from distributed organization&lt;/li&gt; &lt;li&gt;lots of face-to-face time&lt;/li&gt; &lt;li&gt;example to every other big collaborative project&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;quot;The reincarnation of &lt;a href=&quot;http://dbpedia.org/page/Steve_Jobs&quot; id=&quot;link-id0x1e8009c8&quot;&gt;Steve Jobs&lt;/a&gt;,&amp;quot; commented someone from the audience. &amp;quot;Except I am a nice guy,&amp;quot; retorted Paul. &lt;/p&gt; &lt;p&gt;Commented one attendee, &amp;quot;The semantic web…., I just was in Boston at a semantic web meeting – so nerdy, something to make you walk out of the room… so it is a definite victory for Open PHACTS and why not also semantic web, that something based on these principles actually works.&amp;quot;&lt;/p&gt; &lt;p&gt;It is a win anyhow, so I did not say anything at the meeting. So I will say something here, where I have more space as the message bears repeating.&lt;/p&gt; &lt;p&gt;We share part of the perception, so we hardly ever say &amp;quot;semantic web.&amp;quot; The word is &amp;quot;linked data,&amp;quot; and it means flexible schema and global identifiers. &lt;i&gt;Flexible schema&lt;/i&gt; means that everything does not have to be modeled upfront. &lt;i&gt;Global identifiers&lt;/i&gt; means that data, when transferred out of its silo of origin, remains interpretable and self-describing, so you can mix it with other data without things getting confused. &lt;i&gt;&amp;quot;Desiloization&amp;quot;&lt;/i&gt; is a wonderful new word for describing this.&lt;/p&gt; &lt;p&gt;This ties right into &lt;a href=&quot;http://datafairport.org/&quot; id=&quot;link-id0x20a450f8&quot;&gt;FAIRport&lt;/a&gt; and FAIR data: &lt;a href=&quot;http://dbpedia.org/page/Findability&quot; id=&quot;link-id0x1f32bb68&quot;&gt;Findable&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Accessibility&quot; id=&quot;link-id0x1eb7ca28&quot;&gt;Accessible&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Interoperability&quot; id=&quot;link-id0x1ea03c68&quot;&gt;Interoperable&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/page/Reusability&quot; id=&quot;link-id0x20c78888&quot;&gt;Reusable&lt;/a&gt;. &lt;a href=&quot;http://dbpedia.org/page/Barend_Mons&quot; id=&quot;link-id0xb2ca558&quot;&gt;Barend Mons&lt;/a&gt; talked a lot about this: &lt;i&gt;open&lt;/i&gt; just means downloadable; &lt;i&gt;fair&lt;/i&gt; means something you can do science with. Barend’s take is that &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x20767568&quot;&gt;RDF&lt;/a&gt; with a &lt;a href=&quot;http://dbpedia.org/page/Uniform_resource_identifier&quot; id=&quot;link-id0x19586538&quot;&gt;URI&lt;/a&gt; for everything is the super wire format for exchanging data. When you process it, you will diversely cook it, so an RDF store is one destination but not the only possibility. It has been said before: there is a range of choices between storing triples verbatim, and making application specific extractions, including ones with a schema, whether graph DB or relational.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://nanopub.org/&quot; id=&quot;link-id0x156cfef8&quot;&gt;Nanopublications&lt;/a&gt; are also moving ahead. &lt;a href=&quot;http://ch.linkedin.com/pub/christine-chichester/3/9a0/85b&quot; id=&quot;link-id0x15928e48&quot;&gt;Christine Chichester&lt;/a&gt; told me about pending publications involving Open PHACTS nanopublictions about post-translation modification of proteins and their expression in different tissues. So there are nanopublications out there and they can be joined, just as intended. Victory of e-science and data integration.&lt;/p&gt; &lt;p&gt;The Open PHACTS project is now officially extended for another two-year term, bringing the total duration to five years. The Open PHACTS Foundation exists as a legal entity and has its first members. This is meant to be a non-profit industry association for sharing of pre-competitive data and services around these between players in the pharma space, in industry as well as academia. There are press releases to follow in due time.&lt;/p&gt; &lt;p&gt;I am looking forward to more Open PHACTS. From the &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x1270cb58&quot;&gt;OpenLink&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x204c2dd8&quot;&gt;Virtuoso&lt;/a&gt; side, there are directly relevant developments that will enter production in the next few months, including query caching discussed &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1771&quot; id=&quot;link-id0x1de0fcb8&quot;&gt;earlier on this blog&lt;/a&gt;, as well as running on the TPC-H tuned analytics branch for overall better query optimization. Adaptive schema is something of evident value to Open PHACTS, as much of the integrated data comes from relational sources, so is regular enough. Therefore taking advantage of this for storage cannot hurt. We will see this still within the scope of the project extension.&lt;/p&gt; &lt;p&gt;Otherwise, more cooperation in formulating the queries for the business questions will also help.&lt;/p&gt; &lt;p&gt;All in all, Open PHACTS is the celebrated beauty queen of all the &lt;a href=&quot;http://dbpedia.org/page/Innovative_Medicines_Initiative&quot; id=&quot;link-id0x20ae59d8&quot;&gt;Innovative Medicine Initiative&lt;/a&gt;, it would seem. Superbly connected, unparalleled logo cloud, actually working and useful data integration, delivering on time on all in fact very complex business questions.&lt;/p&gt;</atom:content>
  <atom:updated>2014-03-31T11:49:44-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 10 of n): TPC-H Q9, Q17, Q20 - Predicate Games</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-20#1790</atom:id>
  <atom:published>2014-03-20T20:03:34Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x24011b28&quot;&gt;TPC-H&lt;/a&gt; is a hash join game. The rules do allow indices, but maintaining these takes time, and indices will quickly result in non-local access patterns. Indices also take space. Besides, somebody must know what indices to create, which is not obvious. Thus, it is best if a &lt;a href=&quot;http://dbpedia.org/resource/Business_intelligence&quot; id=&quot;link-id0xf2d8b08&quot;&gt;BI&lt;/a&gt; data warehouse works without.&lt;/p&gt; &lt;p&gt;Once you go to &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x135b9dc8&quot;&gt;hash join&lt;/a&gt;, one side of the join will be materialized, which takes space, which &lt;i&gt;ipso facto&lt;/i&gt; is bad. So, the predicate games are about moving conditions so that the hash table made for the hash join will be as small as possible. Only items that may in fact be retrieved should be put in the hash table. If you know that the query deals with shipments of green &lt;code&gt;parts&lt;/code&gt;, putting &lt;code&gt;lineitems&lt;/code&gt; of &lt;code&gt;parts&lt;/code&gt; that are not green in a hash table makes no sense since only green ones are being looked for.&lt;/p&gt; &lt;p&gt;So, let&amp;#39;s consider Q9. The query is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT nation, o_year, SUM(amount) AS sum_profit FROM ( SELECT n_name AS nation, EXTRACT ( YEAR FROM o_orderdate ) AS o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount FROM part, supplier, lineitem, partsupp, orders, nation WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey AND ps_partkey = l_partkey AND p_partkey = l_partkey AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey AND p_name like &amp;#39;%green%&amp;#39; ) AS profit GROUP BY nation, o_year ORDER BY nation, o_year DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to calculate profit from the sale of a type of &lt;code&gt;part&lt;/code&gt;, broken down by &lt;code&gt;year&lt;/code&gt; and supplier &lt;code&gt;nation&lt;/code&gt;. All &lt;code&gt;orders&lt;/code&gt;, &lt;code&gt;lineitems&lt;/code&gt;, &lt;code&gt;partsupps&lt;/code&gt;, and &lt;code&gt;suppliers&lt;/code&gt; involving the &lt;code&gt;parts&lt;/code&gt; of interest are visited. This is one of the longest running of the queries. The query is restricted by &lt;code&gt;part&lt;/code&gt; only, and the condition selects 1/17 of all &lt;code&gt;parts&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The execution plan is below. First the plan builds hash tables of all &lt;code&gt;nations&lt;/code&gt; and &lt;code&gt;suppliers&lt;/code&gt;. We expect to do frequent lookups, thus making a hash is faster than using the index. &lt;code&gt;Partsupp&lt;/code&gt; is the 3rd largest table in the database. This has a primary key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt;, referenced by the compound foreign key &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt;. This could be accessed by index, but we expect to hit each &lt;code&gt;partsupp&lt;/code&gt; row multiple times, hence hash is better. We further note that only &lt;code&gt;partsupp&lt;/code&gt; rows where the &lt;code&gt;part&lt;/code&gt; satisfies the condition will contribute to the result. Thus we import the join with &lt;code&gt;part&lt;/code&gt; into the hash build. The &lt;code&gt;ps_partkey&lt;/code&gt; is not directly joined to &lt;code&gt;p_partkey&lt;/code&gt;, but rather the system must understand that this follows from &lt;code&gt;l_partkey = ps_partkey&lt;/code&gt; and &lt;code&gt;l_partkey = p_partkey&lt;/code&gt;. In this way, the hash table is 1/17th of the size it would otherwise be, which is a crucial gain.&lt;/p&gt; &lt;p&gt;Looking further into the plan, we note a scan of &lt;code&gt;lineitem&lt;/code&gt; followed by a hash join with &lt;code&gt;part&lt;/code&gt;. Restricting the build of the &lt;code&gt;partsupp&lt;/code&gt; hash would have the same effect, hence &lt;code&gt;part&lt;/code&gt; is here used twice while it occurs only once in the query. This is deliberate, since the selective hash join with &lt;code&gt;part&lt;/code&gt; restricts &lt;code&gt;lineitem&lt;/code&gt; faster than the more complex hash join with a 2 part key &lt;code&gt;(l_partkey, l_suppkey)&lt;/code&gt;. Both joins perform the identical restriction, but doing the &lt;code&gt;part&lt;/code&gt; first is faster since this becomes a single-key, invisible hash join, merged into the &lt;code&gt;lineitem&lt;/code&gt; scan, done before even accessing the &lt;code&gt;l_suppkey&lt;/code&gt; and other columns.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 3.9e-06% fanout 1 input 1 rows time 4.7e-05% fanout 1 input 1 rows { hash filler time 3.6e-05% fanout 25 input 1 rows NATION 25 rows(.N_NATIONKEY, nation) time 8.8e-06% fanout 0 input 25 rows Sort hf 35 (.N_NATIONKEY) -&amp;gt; (nation) } time 0.16% fanout 1 input 1 rows { hash filler time 0.011% fanout 1e+06 input 1 rows SUPPLIER 1e+06 rows(.S_SUPPKEY, .S_NATIONKEY) time 0.03% fanout 0 input 1e+06 rows Sort hf 49 (.S_SUPPKEY) -&amp;gt; (.S_NATIONKEY) } time 0.57% fanout 1 input 1 rows { hash filler Subquery 58 { time 1.6% fanout 1.17076e+06 input 1 rows PART 1.2e+06 rows(t1.P_PARTKEY) P_NAME LIKE &amp;lt;c %green%&amp;gt; LIKE &amp;lt;c &amp;#5;&amp;gt; time 1.1% fanout 4 input 1.17076e+06 rows PARTSUPP 3.9 rows(t4.PS_SUPPKEY, t4.PS_PARTKEY, t4.PS_SUPPLYCOST) inlined PS_PARTKEY = t1.P_PARTKEY After code: 0: t4.PS_SUPPKEY := := artm t4.PS_SUPPKEY 4: t4.PS_PARTKEY := := artm t4.PS_PARTKEY 8: t1.P_PARTKEY := := artm t1.P_PARTKEY 12: t4.PS_SUPPLYCOST := := artm t4.PS_SUPPLYCOST 16: BReturn 0 time 0.33% fanout 0 input 4.68305e+06 rows Sort hf 82 (t4.PS_SUPPKEY, t4.PS_PARTKEY) -&amp;gt; (t1.P_PARTKEY, t4.PS_SUPPLYCOST) } } time 0.18% fanout 1 input 1 rows { hash filler time 1.6% fanout 1.17076e+06 input 1 rows PART 1.2e+06 rows(.P_PARTKEY) P_NAME LIKE &amp;lt;c %green%&amp;gt; LIKE &amp;lt;c &amp;#5;&amp;gt; time 0.017% fanout 0 input 1.17076e+06 rows Sort hf 101 (.P_PARTKEY) } time 5.1e-06% fanout 1 input 1 rows { fork time 4.1e-06% fanout 1 input 1 rows { fork time 59% fanout 3.51125e+07 input 1 rows LINEITEM 6e+08 rows(.L_PARTKEY, .L_ORDERKEY, .L_SUPPKEY, .L_EXTENDEDPRICE, .L_DISCOUNT, .L_QUANTITY) hash partition+bloom by 108 (tmp)hash join merged always card 0.058 -&amp;gt; () hash partition+bloom by 56 (tmp)hash join merged always card 1 -&amp;gt; (.S_NATIONKEY) time 0.18% fanout 1 input 3.51125e+07 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 Hash source 101 merged into ts 0.058 rows(.L_PARTKEY) -&amp;gt; () time 17% fanout 1 input 3.51125e+07 rows Hash source 82 0.057 rows(.L_SUPPKEY, .L_PARTKEY) -&amp;gt; ( &amp;lt;none&amp;gt; , .PS_SUPPLYCOST) time 6.2% fanout 1 input 3.51125e+07 rows Precode: 0: temp := artm .PS_SUPPLYCOST * .L_QUANTITY 4: temp := artm temp - temp 8: BReturn 0 ORDERS unq 1 rows (.O_ORDERDATE) inlined O_ORDERKEY = k_.L_ORDERKEY time 0.0055% fanout 1 input 3.51125e+07 rows Hash source 49 merged into ts 1 rows(k_.L_SUPPKEY) -&amp;gt; (.S_NATIONKEY) time 3.5% fanout 1 input 3.51125e+07 rows Hash source 35 1 rows(k_.S_NATIONKEY) -&amp;gt; (nation) time 8.8% fanout 0 input 3.51125e+07 rows Precode: 0: o_year := Call year (.O_ORDERDATE) 5: BReturn 0 Sort (nation, o_year) -&amp;gt; (temp) } time 4.7e-05% fanout 175 input 1 rows group by read node (nation, o_year, sum_profit) time 0.00028% fanout 0 input 175 rows Sort (nation, o_year) -&amp;gt; (sum_profit) } time 2.2e-05% fanout 175 input 1 rows Key from temp (nation, o_year, sum_profit) time 1.6e-06% fanout 0 input 175 rows Select (nation, o_year, sum_profit) } 6114 msec 1855% cpu, 3.62624e+07 rnd 6.44384e+08 seq 99.6068% same seg 0.357328% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;6.1s is a good score for this query. When executing the same in 5 parallel invocations, the fastest ends in 13.7s and the slowest in 27.6s. For five concurrent executions, the peak transient memory utilization is 4.7 GB for the hash tables, which is very reasonable.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;Let us next consider Q17.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT SUM(l_extendedprice) / 7.0 AS avg_yearly FROM lineitem, part WHERE p_partkey = l_partkey AND p_brand = &amp;#39;Brand#23&amp;#39; AND p_container = &amp;#39;MED BOX&amp;#39; AND l_quantity &amp;lt; ( SELECT 2e-1 * AVG(l_quantity) FROM lineitem WHERE l_partkey = p_partkey ) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Deceptively simple? This calculates the total value of small &lt;code&gt;orders&lt;/code&gt; (below 1/5 of average quantity for the &lt;code&gt;part&lt;/code&gt;) for all &lt;code&gt;parts&lt;/code&gt; of a given &lt;code&gt;brand&lt;/code&gt; with a specific &lt;code&gt;container&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;If there is an index on &lt;code&gt;l_partkey&lt;/code&gt;, the plan is easy enough: Take the &lt;code&gt;parts&lt;/code&gt;, look up the average &lt;code&gt;quantity&lt;/code&gt; for each, then recheck &lt;code&gt;lineitem&lt;/code&gt; and add up the small &lt;code&gt;lineitems&lt;/code&gt;. This takes about 1s. But we do not want indices for this workload.&lt;/p&gt; &lt;p&gt;If we made a hash from &lt;code&gt;l_partkey&lt;/code&gt; to &lt;code&gt;l_quantity&lt;/code&gt; for all &lt;code&gt;lineitems&lt;/code&gt;, we could run out of space, and this would take so long the race would be automatically lost on this point alone. The trick is to import the restriction on &lt;code&gt;l_partkey&lt;/code&gt; into the hash build. This gives us a plan that does a scan of &lt;code&gt;lineitem&lt;/code&gt; twice, doing a very selective hash join (few &lt;code&gt;parts&lt;/code&gt;). There is a lookup for the &lt;code&gt;average&lt;/code&gt; for each &lt;code&gt;lineitem&lt;/code&gt; with the &lt;code&gt;part&lt;/code&gt;. The &lt;code&gt;average&lt;/code&gt; is calculated potentially several times.&lt;/p&gt; &lt;p&gt;The below plan is workable but better is possible: We notice that the very selective join need be done just once; it is cheaper to remember the result than to do it twice, and the result is not large. The other trick is that the correlated subquery can be rewritten as &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ... FROM lineitem, part, ( SELECT l_partkey, 0.2 * AVG (l_quantity) AS qty FROM lineitem, part ... ) f WHERE l_partkey = f.l_partkey ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;In this form, one can put the entire derived table &lt;code&gt;f&lt;/code&gt; on the build side of a hash join. In this way, the &lt;code&gt;average&lt;/code&gt; is never done more than once per &lt;code&gt;part&lt;/code&gt;. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 7.9e-06% fanout 1 input 1 rows time 0.0031% fanout 1 input 1 rows { hash filler time 0.27% fanout 20031 input 1 rows PART 2e+04 rows(.P_PARTKEY) P_BRAND = &amp;lt;c Brand#23&amp;gt; , P_CONTAINER = &amp;lt;c MED BOX&amp;gt; time 0.00047% fanout 0 input 20031 rows Sort hf 34 (.P_PARTKEY) } time 0.1% fanout 1 input 1 rows { hash filler Subquery 40 { time 46% fanout 600982 input 1 rows LINEITEM 6e+08 rows(t4.L_PARTKEY, t4.L_QUANTITY) hash partition+bloom by 38 (tmp)hash join merged always card 0.001 -&amp;gt; () time 0.0042% fanout 1 input 600982 rows Hash source 34 merged into ts not partitionable 0.001 rows(t4.L_PARTKEY) -&amp;gt; () After code: 0: t4.L_PARTKEY := := artm t4.L_PARTKEY 4: t4.L_QUANTITY := := artm t4.L_QUANTITY 8: BReturn 0 time 0.059% fanout 0 input 600982 rows Sort hf 62 (t4.L_PARTKEY) -&amp;gt; (t4.L_QUANTITY) } } time 6.8e-05% fanout 1 input 1 rows { fork time 46% fanout 600982 input 1 rows LINEITEM 6e+08 rows(.L_PARTKEY, .L_QUANTITY, .L_EXTENDEDPRICE) hash partition+bloom by 38 (tmp)hash join merged always card 0.00052 -&amp;gt; () time 0.00021% fanout 1 input 600982 rows Hash source 34 merged into ts 0.00052 rows(.L_PARTKEY) -&amp;gt; () Precode: 0: .P_PARTKEY := := artm .L_PARTKEY 4: BReturn 0 END Node After test: 0: { time 0.038% fanout 1 input 600982 rows time 0.17% fanout 1 input 600982 rows { fork time 6.8% fanout 0 input 600982 rows Hash source 62 not partitionable 0.03 rows(k_.P_PARTKEY) -&amp;gt; (.L_QUANTITY) After code: 0: sum sum.L_QUANTITYset no set_ctr 5: sum count 1 set no set_ctr 10: BReturn 0 } After code: 0: temp := artm sum / count 4: temp := artm 0.2 * temp 8: aggregate := := artm temp 12: BReturn 0 time 0.042% fanout 0 input 600982 rows Subquery Select(aggregate) } 8: if (.L_QUANTITY &amp;lt; scalar) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 After code: 0: sum sum.L_EXTENDEDPRICE 5: BReturn 0 } After code: 0: avg_yearly := artm sum / 7 4: BReturn 0 time 4.6e-06% fanout 0 input 1 rows Select (avg_yearly) } 2695 msec 1996% cpu, 3 rnd 1.18242e+09 seq 0% same seg 0% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;2.7s is tolerable, but if this drags down the overall score by too much, we know that a 2+x improvement is readily available. Playing the rest of the tricks would result in the hash plan almost catching up with the 1s execution time of the index-based plan. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;Q20 is not very long-running, but it is maybe the hardest to optimize of the lot. But as usual, failure to recognize its most salient traps will automatically lose the race, so pay attention.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_name, s_address FROM supplier, nation WHERE s_suppkey IN ( SELECT ps_suppkey FROM partsupp WHERE ps_partkey IN ( SELECT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39; ) AND ps_availqty &amp;gt; ( SELECT 0.5 * SUM(l_quantity) FROM lineitem WHERE l_partkey = ps_partkey AND l_suppkey = ps_suppkey AND l_shipdate &amp;gt;= CAST (&amp;#39;1994-01-01&amp;#39; AS DATE) AND l_shipdate &amp;lt; DATEADD (&amp;#39;year&amp;#39;, 1, CAST (&amp;#39;1994-01-01&amp;#39; AS DATE)) ) ) AND s_nationkey = n_nationkey AND n_name = &amp;#39;CANADA&amp;#39; ORDER BY s_name &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This identifies &lt;code&gt;suppliers&lt;/code&gt; that have &lt;code&gt;parts&lt;/code&gt; in stock in excess of half a year&amp;#39;s shipments of said &lt;code&gt;part&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The use of &lt;code&gt;IN&lt;/code&gt; to denote a &lt;code&gt;join&lt;/code&gt; is the first catch. The second is joining to &lt;code&gt;lineitem&lt;/code&gt; by hash without building an overly large hash table. We know that &lt;code&gt;IN&lt;/code&gt; becomes &lt;code&gt;EXISTS&lt;/code&gt; which in turn can become a &lt;code&gt;join&lt;/code&gt; as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem WHERE l_partkey IN ( SELECT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39; ) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- is --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem WHERE EXISTS ( SELECT p_partkey FROM part WHERE p_partkey = l_partkey AND p_name LIKE &amp;#39;forest%&amp;#39;) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- is --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem, ( SELECT DISTINCT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39;) f WHERE l_partkey = f.p_partkey ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;But since &lt;code&gt;p_partkey&lt;/code&gt; is unique, the &lt;code&gt;DISTINCT&lt;/code&gt; drops off and we have.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem, part WHERE p_name LIKE &amp;#39;forest% AND l_partkey = f.p_partkey ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;You see, the innermost &lt;code&gt;IN&lt;/code&gt; with the &lt;code&gt;ps_partkey&lt;/code&gt; goes through all these changes, and just becomes a &lt;code&gt;join&lt;/code&gt;. The outermost &lt;code&gt;IN&lt;/code&gt; stays as a distinct derived table, since &lt;code&gt;ps_suppkey&lt;/code&gt; is not unique, and the meaning of &lt;code&gt;IN&lt;/code&gt; is not to return a given &lt;code&gt;supplier&lt;/code&gt; more than once.&lt;/p&gt; &lt;p&gt;The derived table is flattened and the &lt;code&gt;DISTINCT&lt;/code&gt; is done partitioned; hence the stage node in front of the distinct. A &lt;code&gt;DISTINCT&lt;/code&gt; can be multithreaded, if each thread gets a specific subset of all the keys. The stage node is an exchange of tuples between several threads. Each thread then does a &lt;code&gt;TOP k&lt;/code&gt; sort. The &lt;code&gt;TOP k&lt;/code&gt; trick &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x1ecc67c8&quot;&gt;we saw in Q18&lt;/a&gt; is used, but does not contribute much here. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 8.2e-06% fanout 1 input 1 rows time 0.00017% fanout 1 input 1 rows { hash filler time 6.1e-05% fanout 1 input 1 rows NATION 1 rows(.N_NATIONKEY) N_NAME = &amp;lt;c CANADA&amp;gt; time 1.2e-05% fanout 0 input 1 rows Sort hf 34 (.N_NATIONKEY) } time 0.073% fanout 1 input 1 rows { hash filler time 4.1% fanout 240672 input 1 rows PART 2.4e+05 rows(t74.P_PARTKEY) P_NAME LIKE &amp;lt;c forest%&amp;gt; LIKE &amp;lt;c &amp;#6;&amp;gt; time 0.011% fanout 0 input 240672 rows Sort hf 47 (t74.P_PARTKEY) } time 0.69% fanout 1 input 1 rows { hash filler Subquery 56 { time 42% fanout 1.09657e+06 input 1 rows LINEITEM 9.1e+07 rows(t76.L_PARTKEY, t76.L_SUPPKEY, t76.L_QUANTITY) L_SHIPDATE &amp;gt;= &amp;lt;c 1994-01-01&amp;gt; &amp;lt; &amp;lt;c 1995-01-01&amp;gt; hash partition+bloom by 54 (tmp)hash join merged always card 0.012 -&amp;gt; () time 0.022% fanout 1 input 1.09657e+06 rows Hash source 47 merged into ts not partitionable 0.012 rows(t76.L_PARTKEY) -&amp;gt; () After code: 0: t76.L_PARTKEY := := artm t76.L_PARTKEY 4: t76.L_SUPPKEY := := artm t76.L_SUPPKEY 8: t76.L_QUANTITY := := artm t76.L_QUANTITY 12: BReturn 0 time 0.22% fanout 0 input 1.09657e+06 rows Sort hf 80 (t76.L_PARTKEY, t76.L_SUPPKEY) -&amp;gt; (t76.L_QUANTITY) } } time 2.1e-05% fanout 1 input 1 rows time 3.2e-05% fanout 1 input 1 rows { fork time 5.3% fanout 240672 input 1 rows PART 2.4e+05 rows(t6.P_PARTKEY) P_NAME LIKE &amp;lt;c forest%&amp;gt; LIKE &amp;lt;c &amp;#6;&amp;gt; time 1.9% fanout 4 input 240672 rows PARTSUPP 1.2 rows(t4.PS_AVAILQTY, t4.PS_PARTKEY, t4.PS_SUPPKEY) inlined PS_PARTKEY = t6.P_PARTKEY time 16% fanout 0.680447 input 962688 rows END Node After test: 0: { time 0.08% fanout 1 input 962688 rows time 9.4% fanout 1 input 962688 rows { fork time 3.6% fanout 0 input 962688 rows Hash source 80 0.013 rows(k_t4.PS_PARTKEY, k_t4.PS_SUPPKEY) -&amp;gt; (t8.L_QUANTITY) After code: 0: sum sumt8.L_QUANTITYset no set_ctr 5: BReturn 0 } After code: 0: temp := artm 0.5 * sum 4: aggregate := := artm temp 8: BReturn 0 time 0.85% fanout 0 input 962688 rows Subquery Select(aggregate) } 8: if (t4.PS_AVAILQTY &amp;gt; scalar) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 time 1% fanout 1 input 655058 rows Stage 2 time 0.071% fanout 1 input 655058 rows Distinct (q_t4.PS_SUPPKEY) After code: 0: PS_SUPPKEY := := artm t4.PS_SUPPKEY 4: BReturn 0 time 0.016% fanout 1 input 655058 rows Subquery Select(PS_SUPPKEY) time 3.2% fanout 0.0112845 input 655058 rows SUPPLIER unq 0.075 rows (.S_NAME, .S_NATIONKEY, .S_ADDRESS) inlined S_SUPPKEY = PS_SUPPKEY hash partition+bloom by 38 (tmp)hash join merged always card 0.04 -&amp;gt; () top k on S_NAME time 0.0012% fanout 1 input 7392 rows Hash source 34 merged into ts 0.04 rows(.S_NATIONKEY) -&amp;gt; () time 0.074% fanout 0 input 7392 rows Sort (.S_NAME) -&amp;gt; (.S_ADDRESS) } time 0.00013% fanout 100 input 1 rows top order by read (.S_NAME, .S_ADDRESS) time 5e-06% fanout 0 input 100 rows Select (.S_NAME, .S_ADDRESS) } 1777 msec 1355% cpu, 894483 rnd 6.39422e+08 seq 79.1214% same seg 19.3093% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1.8s is sufficient, and in the ballpark with &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2329ad38&quot;&gt;VectorWise&lt;/a&gt;. Some further gain is possible, as the &lt;code&gt;lineitem&lt;/code&gt; hash table can also be restricted by &lt;code&gt;supplier&lt;/code&gt;; after all, only 1/25 of all &lt;code&gt;suppliers&lt;/code&gt; are in the end considered. Further simplifications are possible. Another 20% of time could be saved. The tricks are however quite complex and specific, and there are easier gains to be had -- for example, in reusing intermediates in Q17 and Q15. &lt;/p&gt; &lt;p&gt;The next installment will discuss late projection and some miscellaneous tricks not mentioned so far. After this, we are ready to take an initial look at the performance of the system as a whole.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1d054778&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2b837ad8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac0b666eb8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac342ee378&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x53991f8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe97e35b8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x14e2b818&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x1b0ecf18&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac051f7f68&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:25.712710-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 10 of n): TPC-H Q9, Q17, Q20 - Predicate Games</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-20#1789</atom:id>
  <atom:published>2014-03-20T20:01:54Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x24011b28&quot;&gt;TPC-H&lt;/a&gt; is a hash join game. The rules do allow indices, but maintaining these takes time, and indices will quickly result in non-local access patterns. Indices also take space. Besides, somebody must know what indices to create, which is not obvious. Thus, it is best if a &lt;a href=&quot;http://dbpedia.org/resource/Business_intelligence&quot; id=&quot;link-id0xf2d8b08&quot;&gt;BI&lt;/a&gt; data warehouse works without.&lt;/p&gt; &lt;p&gt;Once you go to &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x135b9dc8&quot;&gt;hash join&lt;/a&gt;, one side of the join will be materialized, which takes space, which &lt;i&gt;ipso facto&lt;/i&gt; is bad. So, the predicate games are about moving conditions so that the hash table made for the hash join will be as small as possible. Only items that may in fact be retrieved should be put in the hash table. If you know that the query deals with shipments of green &lt;code&gt;parts&lt;/code&gt;, putting &lt;code&gt;lineitems&lt;/code&gt; of &lt;code&gt;parts&lt;/code&gt; that are not green in a hash table makes no sense since only green ones are being looked for.&lt;/p&gt; &lt;p&gt;So, let&amp;#39;s consider Q9. The query is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT nation, o_year, SUM(amount) AS sum_profit FROM ( SELECT n_name AS nation, EXTRACT ( YEAR FROM o_orderdate ) AS o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount FROM part, supplier, lineitem, partsupp, orders, nation WHERE s_suppkey = l_suppkey AND ps_suppkey = l_suppkey AND ps_partkey = l_partkey AND p_partkey = l_partkey AND o_orderkey = l_orderkey AND s_nationkey = n_nationkey AND p_name like &amp;#39;%green%&amp;#39; ) AS profit GROUP BY nation, o_year ORDER BY nation, o_year DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent is to calculate profit from the sale of a type of &lt;code&gt;part&lt;/code&gt;, broken down by &lt;code&gt;year&lt;/code&gt; and supplier &lt;code&gt;nation&lt;/code&gt;. All &lt;code&gt;orders&lt;/code&gt;, &lt;code&gt;lineitems&lt;/code&gt;, &lt;code&gt;partsupps&lt;/code&gt;, and &lt;code&gt;suppliers&lt;/code&gt; involving the &lt;code&gt;parts&lt;/code&gt; of interest are visited. This is one of the longest running of the queries. The query is restricted by &lt;code&gt;part&lt;/code&gt; only, and the condition selects 1/17 of all &lt;code&gt;parts&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The execution plan is below. First the plan builds hash tables of all &lt;code&gt;nations&lt;/code&gt; and &lt;code&gt;suppliers&lt;/code&gt;. We expect to do frequent lookups, thus making a hash is faster than using the index. &lt;code&gt;Partsupp&lt;/code&gt; is the 3rd largest table in the database. This has a primary key of &lt;code&gt;ps_partkey, ps_suppkey&lt;/code&gt;, referenced by the compound foreign key &lt;code&gt;l_partkey, l_suppkey&lt;/code&gt; in &lt;code&gt;lineitem&lt;/code&gt;. This could be accessed by index, but we expect to hit each &lt;code&gt;partsupp&lt;/code&gt; row multiple times, hence hash is better. We further note that only &lt;code&gt;partsupp&lt;/code&gt; rows where the &lt;code&gt;part&lt;/code&gt; satisfies the condition will contribute to the result. Thus we import the join with &lt;code&gt;part&lt;/code&gt; into the hash build. The &lt;code&gt;ps_partkey&lt;/code&gt; is not directly joined to &lt;code&gt;p_partkey&lt;/code&gt;, but rather the system must understand that this follows from &lt;code&gt;l_partkey = ps_partkey&lt;/code&gt; and &lt;code&gt;l_partkey = p_partkey&lt;/code&gt;. In this way, the hash table is 1/17th of the size it would otherwise be, which is a crucial gain.&lt;/p&gt; &lt;p&gt;Looking further into the plan, we note a scan of &lt;code&gt;lineitem&lt;/code&gt; followed by a hash join with &lt;code&gt;part&lt;/code&gt;. Restricting the build of the &lt;code&gt;partsupp&lt;/code&gt; hash would have the same effect, hence &lt;code&gt;part&lt;/code&gt; is here used twice while it occurs only once in the query. This is deliberate, since the selective hash join with &lt;code&gt;part&lt;/code&gt; restricts &lt;code&gt;lineitem&lt;/code&gt; faster than the more complex hash join with a 2 part key &lt;code&gt;(l_partkey, l_suppkey)&lt;/code&gt;. Both joins perform the identical restriction, but doing the &lt;code&gt;part&lt;/code&gt; first is faster since this becomes a single-key, invisible hash join, merged into the &lt;code&gt;lineitem&lt;/code&gt; scan, done before even accessing the &lt;code&gt;l_suppkey&lt;/code&gt; and other columns.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 3.9e-06% fanout 1 input 1 rows time 4.7e-05% fanout 1 input 1 rows { hash filler time 3.6e-05% fanout 25 input 1 rows NATION 25 rows(.N_NATIONKEY, nation) time 8.8e-06% fanout 0 input 25 rows Sort hf 35 (.N_NATIONKEY) -&amp;gt; (nation) } time 0.16% fanout 1 input 1 rows { hash filler time 0.011% fanout 1e+06 input 1 rows SUPPLIER 1e+06 rows(.S_SUPPKEY, .S_NATIONKEY) time 0.03% fanout 0 input 1e+06 rows Sort hf 49 (.S_SUPPKEY) -&amp;gt; (.S_NATIONKEY) } time 0.57% fanout 1 input 1 rows { hash filler Subquery 58 { time 1.6% fanout 1.17076e+06 input 1 rows PART 1.2e+06 rows(t1.P_PARTKEY) P_NAME LIKE &amp;lt;c %green%&amp;gt; LIKE &amp;lt;c &amp;#5;&amp;gt; time 1.1% fanout 4 input 1.17076e+06 rows PARTSUPP 3.9 rows(t4.PS_SUPPKEY, t4.PS_PARTKEY, t4.PS_SUPPLYCOST) inlined PS_PARTKEY = t1.P_PARTKEY After code: 0: t4.PS_SUPPKEY := := artm t4.PS_SUPPKEY 4: t4.PS_PARTKEY := := artm t4.PS_PARTKEY 8: t1.P_PARTKEY := := artm t1.P_PARTKEY 12: t4.PS_SUPPLYCOST := := artm t4.PS_SUPPLYCOST 16: BReturn 0 time 0.33% fanout 0 input 4.68305e+06 rows Sort hf 82 (t4.PS_SUPPKEY, t4.PS_PARTKEY) -&amp;gt; (t1.P_PARTKEY, t4.PS_SUPPLYCOST) } } time 0.18% fanout 1 input 1 rows { hash filler time 1.6% fanout 1.17076e+06 input 1 rows PART 1.2e+06 rows(.P_PARTKEY) P_NAME LIKE &amp;lt;c %green%&amp;gt; LIKE &amp;lt;c &amp;#5;&amp;gt; time 0.017% fanout 0 input 1.17076e+06 rows Sort hf 101 (.P_PARTKEY) } time 5.1e-06% fanout 1 input 1 rows { fork time 4.1e-06% fanout 1 input 1 rows { fork time 59% fanout 3.51125e+07 input 1 rows LINEITEM 6e+08 rows(.L_PARTKEY, .L_ORDERKEY, .L_SUPPKEY, .L_EXTENDEDPRICE, .L_DISCOUNT, .L_QUANTITY) hash partition+bloom by 108 (tmp)hash join merged always card 0.058 -&amp;gt; () hash partition+bloom by 56 (tmp)hash join merged always card 1 -&amp;gt; (.S_NATIONKEY) time 0.18% fanout 1 input 3.51125e+07 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 Hash source 101 merged into ts 0.058 rows(.L_PARTKEY) -&amp;gt; () time 17% fanout 1 input 3.51125e+07 rows Hash source 82 0.057 rows(.L_SUPPKEY, .L_PARTKEY) -&amp;gt; ( &amp;lt;none&amp;gt; , .PS_SUPPLYCOST) time 6.2% fanout 1 input 3.51125e+07 rows Precode: 0: temp := artm .PS_SUPPLYCOST * .L_QUANTITY 4: temp := artm temp - temp 8: BReturn 0 ORDERS unq 1 rows (.O_ORDERDATE) inlined O_ORDERKEY = k_.L_ORDERKEY time 0.0055% fanout 1 input 3.51125e+07 rows Hash source 49 merged into ts 1 rows(k_.L_SUPPKEY) -&amp;gt; (.S_NATIONKEY) time 3.5% fanout 1 input 3.51125e+07 rows Hash source 35 1 rows(k_.S_NATIONKEY) -&amp;gt; (nation) time 8.8% fanout 0 input 3.51125e+07 rows Precode: 0: o_year := Call year (.O_ORDERDATE) 5: BReturn 0 Sort (nation, o_year) -&amp;gt; (temp) } time 4.7e-05% fanout 175 input 1 rows group by read node (nation, o_year, sum_profit) time 0.00028% fanout 0 input 175 rows Sort (nation, o_year) -&amp;gt; (sum_profit) } time 2.2e-05% fanout 175 input 1 rows Key from temp (nation, o_year, sum_profit) time 1.6e-06% fanout 0 input 175 rows Select (nation, o_year, sum_profit) } 6114 msec 1855% cpu, 3.62624e+07 rnd 6.44384e+08 seq 99.6068% same seg 0.357328% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;6.1s is a good score for this query. When executing the same in 5 parallel invocations, the fastest ends in 13.7s and the slowest in 27.6s. For five concurrent executions, the peak transient memory utilization is 4.7 GB for the hash tables, which is very reasonable.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;Let us next consider Q17.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT SUM(l_extendedprice) / 7.0 AS avg_yearly FROM lineitem, part WHERE p_partkey = l_partkey AND p_brand = &amp;#39;Brand#23&amp;#39; AND p_container = &amp;#39;MED BOX&amp;#39; AND l_quantity &amp;lt; ( SELECT 2e-1 * AVG(l_quantity) FROM lineitem WHERE l_partkey = p_partkey ) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Deceptively simple? This calculates the total value of small &lt;code&gt;orders&lt;/code&gt; (below 1/5 of average quantity for the &lt;code&gt;part&lt;/code&gt;) for all &lt;code&gt;parts&lt;/code&gt; of a given &lt;code&gt;brand&lt;/code&gt; with a specific &lt;code&gt;container&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;If there is an index on &lt;code&gt;l_partkey&lt;/code&gt;, the plan is easy enough: Take the &lt;code&gt;parts&lt;/code&gt;, look up the average &lt;code&gt;quantity&lt;/code&gt; for each, then recheck &lt;code&gt;lineitem&lt;/code&gt; and add up the small &lt;code&gt;lineitems&lt;/code&gt;. This takes about 1s. But we do not want indices for this workload.&lt;/p&gt; &lt;p&gt;If we made a hash from &lt;code&gt;l_partkey&lt;/code&gt; to &lt;code&gt;l_quantity&lt;/code&gt; for all &lt;code&gt;lineitems&lt;/code&gt;, we could run out of space, and this would take so long the race would be automatically lost on this point alone. The trick is to import the restriction on &lt;code&gt;l_partkey&lt;/code&gt; into the hash build. This gives us a plan that does a scan of &lt;code&gt;lineitem&lt;/code&gt; twice, doing a very selective hash join (few &lt;code&gt;parts&lt;/code&gt;). There is a lookup for the &lt;code&gt;average&lt;/code&gt; for each &lt;code&gt;lineitem&lt;/code&gt; with the &lt;code&gt;part&lt;/code&gt;. The &lt;code&gt;average&lt;/code&gt; is calculated potentially several times.&lt;/p&gt; &lt;p&gt;The below plan is workable but better is possible: We notice that the very selective join need be done just once; it is cheaper to remember the result than to do it twice, and the result is not large. The other trick is that the correlated subquery can be rewritten as &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ... FROM lineitem, part, ( SELECT l_partkey, 0.2 * AVG (l_quantity) AS qty FROM lineitem, part ... ) f WHERE l_partkey = f.l_partkey ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;In this form, one can put the entire derived table &lt;code&gt;f&lt;/code&gt; on the build side of a hash join. In this way, the &lt;code&gt;average&lt;/code&gt; is never done more than once per &lt;code&gt;part&lt;/code&gt;. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 7.9e-06% fanout 1 input 1 rows time 0.0031% fanout 1 input 1 rows { hash filler time 0.27% fanout 20031 input 1 rows PART 2e+04 rows(.P_PARTKEY) P_BRAND = &amp;lt;c Brand#23&amp;gt; , P_CONTAINER = &amp;lt;c MED BOX&amp;gt; time 0.00047% fanout 0 input 20031 rows Sort hf 34 (.P_PARTKEY) } time 0.1% fanout 1 input 1 rows { hash filler Subquery 40 { time 46% fanout 600982 input 1 rows LINEITEM 6e+08 rows(t4.L_PARTKEY, t4.L_QUANTITY) hash partition+bloom by 38 (tmp)hash join merged always card 0.001 -&amp;gt; () time 0.0042% fanout 1 input 600982 rows Hash source 34 merged into ts not partitionable 0.001 rows(t4.L_PARTKEY) -&amp;gt; () After code: 0: t4.L_PARTKEY := := artm t4.L_PARTKEY 4: t4.L_QUANTITY := := artm t4.L_QUANTITY 8: BReturn 0 time 0.059% fanout 0 input 600982 rows Sort hf 62 (t4.L_PARTKEY) -&amp;gt; (t4.L_QUANTITY) } } time 6.8e-05% fanout 1 input 1 rows { fork time 46% fanout 600982 input 1 rows LINEITEM 6e+08 rows(.L_PARTKEY, .L_QUANTITY, .L_EXTENDEDPRICE) hash partition+bloom by 38 (tmp)hash join merged always card 0.00052 -&amp;gt; () time 0.00021% fanout 1 input 600982 rows Hash source 34 merged into ts 0.00052 rows(.L_PARTKEY) -&amp;gt; () Precode: 0: .P_PARTKEY := := artm .L_PARTKEY 4: BReturn 0 END Node After test: 0: { time 0.038% fanout 1 input 600982 rows time 0.17% fanout 1 input 600982 rows { fork time 6.8% fanout 0 input 600982 rows Hash source 62 not partitionable 0.03 rows(k_.P_PARTKEY) -&amp;gt; (.L_QUANTITY) After code: 0: sum sum.L_QUANTITYset no set_ctr 5: sum count 1 set no set_ctr 10: BReturn 0 } After code: 0: temp := artm sum / count 4: temp := artm 0.2 * temp 8: aggregate := := artm temp 12: BReturn 0 time 0.042% fanout 0 input 600982 rows Subquery Select(aggregate) } 8: if (.L_QUANTITY &amp;lt; scalar) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 After code: 0: sum sum.L_EXTENDEDPRICE 5: BReturn 0 } After code: 0: avg_yearly := artm sum / 7 4: BReturn 0 time 4.6e-06% fanout 0 input 1 rows Select (avg_yearly) } 2695 msec 1996% cpu, 3 rnd 1.18242e+09 seq 0% same seg 0% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;2.7s is tolerable, but if this drags down the overall score by too much, we know that a 2+x improvement is readily available. Playing the rest of the tricks would result in the hash plan almost catching up with the 1s execution time of the index-based plan. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;Q20 is not very long-running, but it is maybe the hardest to optimize of the lot. But as usual, failure to recognize its most salient traps will automatically lose the race, so pay attention.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_name, s_address FROM supplier, nation WHERE s_suppkey IN ( SELECT ps_suppkey FROM partsupp WHERE ps_partkey IN ( SELECT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39; ) AND ps_availqty &amp;gt; ( SELECT 0.5 * SUM(l_quantity) FROM lineitem WHERE l_partkey = ps_partkey AND l_suppkey = ps_suppkey AND l_shipdate &amp;gt;= CAST (&amp;#39;1994-01-01&amp;#39; AS DATE) AND l_shipdate &amp;lt; DATEADD (&amp;#39;year&amp;#39;, 1, CAST (&amp;#39;1994-01-01&amp;#39; AS DATE)) ) ) AND s_nationkey = n_nationkey AND n_name = &amp;#39;CANADA&amp;#39; ORDER BY s_name &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This identifies &lt;code&gt;suppliers&lt;/code&gt; that have &lt;code&gt;parts&lt;/code&gt; in stock in excess of half a year&amp;#39;s shipments of said &lt;code&gt;part&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The use of &lt;code&gt;IN&lt;/code&gt; to denote a &lt;code&gt;join&lt;/code&gt; is the first catch. The second is joining to &lt;code&gt;lineitem&lt;/code&gt; by hash without building an overly large hash table. We know that &lt;code&gt;IN&lt;/code&gt; becomes &lt;code&gt;EXISTS&lt;/code&gt; which in turn can become a &lt;code&gt;join&lt;/code&gt; as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem WHERE l_partkey IN ( SELECT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39; ) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- is --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem WHERE EXISTS ( SELECT p_partkey FROM part WHERE p_partkey = l_partkey AND p_name LIKE &amp;#39;forest%&amp;#39;) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- is --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem, ( SELECT DISTINCT p_partkey FROM part WHERE p_name LIKE &amp;#39;forest%&amp;#39;) f WHERE l_partkey = f.p_partkey ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;But since &lt;code&gt;p_partkey&lt;/code&gt; is unique, the &lt;code&gt;DISTINCT&lt;/code&gt; drops off and we have.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_suppkey FROM lineitem, part WHERE p_name LIKE &amp;#39;forest% AND l_partkey = f.p_partkey ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;You see, the innermost &lt;code&gt;IN&lt;/code&gt; with the &lt;code&gt;ps_partkey&lt;/code&gt; goes through all these changes, and just becomes a &lt;code&gt;join&lt;/code&gt;. The outermost &lt;code&gt;IN&lt;/code&gt; stays as a distinct derived table, since &lt;code&gt;ps_suppkey&lt;/code&gt; is not unique, and the meaning of &lt;code&gt;IN&lt;/code&gt; is not to return a given &lt;code&gt;supplier&lt;/code&gt; more than once.&lt;/p&gt; &lt;p&gt;The derived table is flattened and the &lt;code&gt;DISTINCT&lt;/code&gt; is done partitioned; hence the stage node in front of the distinct. A &lt;code&gt;DISTINCT&lt;/code&gt; can be multithreaded, if each thread gets a specific subset of all the keys. The stage node is an exchange of tuples between several threads. Each thread then does a &lt;code&gt;TOP k&lt;/code&gt; sort. The &lt;code&gt;TOP k&lt;/code&gt; trick &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x1ecc67c8&quot;&gt;we saw in Q18&lt;/a&gt; is used, but does not contribute much here. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 8.2e-06% fanout 1 input 1 rows time 0.00017% fanout 1 input 1 rows { hash filler time 6.1e-05% fanout 1 input 1 rows NATION 1 rows(.N_NATIONKEY) N_NAME = &amp;lt;c CANADA&amp;gt; time 1.2e-05% fanout 0 input 1 rows Sort hf 34 (.N_NATIONKEY) } time 0.073% fanout 1 input 1 rows { hash filler time 4.1% fanout 240672 input 1 rows PART 2.4e+05 rows(t74.P_PARTKEY) P_NAME LIKE &amp;lt;c forest%&amp;gt; LIKE &amp;lt;c &amp;#6;&amp;gt; time 0.011% fanout 0 input 240672 rows Sort hf 47 (t74.P_PARTKEY) } time 0.69% fanout 1 input 1 rows { hash filler Subquery 56 { time 42% fanout 1.09657e+06 input 1 rows LINEITEM 9.1e+07 rows(t76.L_PARTKEY, t76.L_SUPPKEY, t76.L_QUANTITY) L_SHIPDATE &amp;gt;= &amp;lt;c 1994-01-01&amp;gt; &amp;lt; &amp;lt;c 1995-01-01&amp;gt; hash partition+bloom by 54 (tmp)hash join merged always card 0.012 -&amp;gt; () time 0.022% fanout 1 input 1.09657e+06 rows Hash source 47 merged into ts not partitionable 0.012 rows(t76.L_PARTKEY) -&amp;gt; () After code: 0: t76.L_PARTKEY := := artm t76.L_PARTKEY 4: t76.L_SUPPKEY := := artm t76.L_SUPPKEY 8: t76.L_QUANTITY := := artm t76.L_QUANTITY 12: BReturn 0 time 0.22% fanout 0 input 1.09657e+06 rows Sort hf 80 (t76.L_PARTKEY, t76.L_SUPPKEY) -&amp;gt; (t76.L_QUANTITY) } } time 2.1e-05% fanout 1 input 1 rows time 3.2e-05% fanout 1 input 1 rows { fork time 5.3% fanout 240672 input 1 rows PART 2.4e+05 rows(t6.P_PARTKEY) P_NAME LIKE &amp;lt;c forest%&amp;gt; LIKE &amp;lt;c &amp;#6;&amp;gt; time 1.9% fanout 4 input 240672 rows PARTSUPP 1.2 rows(t4.PS_AVAILQTY, t4.PS_PARTKEY, t4.PS_SUPPKEY) inlined PS_PARTKEY = t6.P_PARTKEY time 16% fanout 0.680447 input 962688 rows END Node After test: 0: { time 0.08% fanout 1 input 962688 rows time 9.4% fanout 1 input 962688 rows { fork time 3.6% fanout 0 input 962688 rows Hash source 80 0.013 rows(k_t4.PS_PARTKEY, k_t4.PS_SUPPKEY) -&amp;gt; (t8.L_QUANTITY) After code: 0: sum sumt8.L_QUANTITYset no set_ctr 5: BReturn 0 } After code: 0: temp := artm 0.5 * sum 4: aggregate := := artm temp 8: BReturn 0 time 0.85% fanout 0 input 962688 rows Subquery Select(aggregate) } 8: if (t4.PS_AVAILQTY &amp;gt; scalar) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 time 1% fanout 1 input 655058 rows Stage 2 time 0.071% fanout 1 input 655058 rows Distinct (q_t4.PS_SUPPKEY) After code: 0: PS_SUPPKEY := := artm t4.PS_SUPPKEY 4: BReturn 0 time 0.016% fanout 1 input 655058 rows Subquery Select(PS_SUPPKEY) time 3.2% fanout 0.0112845 input 655058 rows SUPPLIER unq 0.075 rows (.S_NAME, .S_NATIONKEY, .S_ADDRESS) inlined S_SUPPKEY = PS_SUPPKEY hash partition+bloom by 38 (tmp)hash join merged always card 0.04 -&amp;gt; () top k on S_NAME time 0.0012% fanout 1 input 7392 rows Hash source 34 merged into ts 0.04 rows(.S_NATIONKEY) -&amp;gt; () time 0.074% fanout 0 input 7392 rows Sort (.S_NAME) -&amp;gt; (.S_ADDRESS) } time 0.00013% fanout 100 input 1 rows top order by read (.S_NAME, .S_ADDRESS) time 5e-06% fanout 0 input 100 rows Select (.S_NAME, .S_ADDRESS) } 1777 msec 1355% cpu, 894483 rnd 6.39422e+08 seq 79.1214% same seg 19.3093% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1.8s is sufficient, and in the ballpark with &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2329ad38&quot;&gt;VectorWise&lt;/a&gt;. Some further gain is possible, as the &lt;code&gt;lineitem&lt;/code&gt; hash table can also be restricted by &lt;code&gt;supplier&lt;/code&gt;; after all, only 1/25 of all &lt;code&gt;suppliers&lt;/code&gt; are in the end considered. Further simplifications are possible. Another 20% of time could be saved. The tricks are however quite complex and specific, and there are easier gains to be had -- for example, in reusing intermediates in Q17 and Q15. &lt;/p&gt; &lt;p&gt;The next installment will discuss late projection and some miscellaneous tricks not mentioned so far. After this, we are ready to take an initial look at the performance of the system as a whole.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x142d4f68&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0xf3282f8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x20ffa438&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x25c97448&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1e70db48&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x14592b38&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x144af558&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x17d64988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x172c9668&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H Q18, Ordered Aggregation, and Top K&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aab6beee348&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aabf9e9bf78&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac748db938&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0xb56b548&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x18a88838&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe842fd18&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabebf52f68&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabf677a8d8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab6df52238&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:14.784424-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-18#1788</atom:id>
  <atom:published>2014-03-18T14:45:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last Friday (2014-03-14) I gave a talk about &lt;a href=&quot;http://geoknow.eu&quot; id=&quot;link-id0x2aabc3ce6228&quot;&gt;GeoKnow&lt;/a&gt; at the &lt;a href=&quot;http://www.copernicus.eu/pages-secondaires/events/event-detail/?tx_julleevents_pi1%5BshowUid%5D=533&amp;amp;cHash=6b72b992422ee703f83e7c6de4c7e697&quot; id=&quot;link-id0x2aabc3ce6288&quot;&gt;EC Copernicus Big Data workshop&lt;/a&gt;. This was a trial run for more streamlined messaging. I have, aside the practice of geekcraft, occupied myself with questions of communication these last weeks.&lt;/p&gt; &lt;p&gt;The clear take-home from London and Brussels alike is that these events have full days and 4 or more talks an hour. It is not quite TV commercial spots yet but it is going in this direction.&lt;/p&gt; &lt;p&gt;If you say something complex, little will get across unless the audience already knows what you will be saying.&lt;/p&gt; &lt;p&gt;I had a set of slides from &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x2aabc3ce6368&quot;&gt;Jens Lehmann&lt;/a&gt;, the GeoKnow project coordinator, for whom I was standing in. Now these are a fine rendition of the description of work. What is wrong with partners, work packages, objectives, etc? Nothing, except everybody has them.&lt;/p&gt; &lt;p&gt;I recall the old story about the journalist and the Zen master: The Zen master repeatedly advises the reporter to cut the story in half. We get the same from PR professionals, &amp;quot;If it is short, they have at least thought about what should go in there,&amp;quot; said one recently, talking of pitches and messages. The other advice was to use pictures. And to have a personal dimension to it.&lt;/p&gt; &lt;p&gt;Enter &amp;quot;Ms. Globe&amp;quot; and &amp;quot;Mr. Cube&amp;quot;. &lt;a href=&quot;http://nl.linkedin.com/pub/frans-knibbe/5a/93/409&quot; id=&quot;link-id0x2aabc3ce6488&quot;&gt;Frans Knibbe&lt;/a&gt; of &lt;a href=&quot;http://www.geodan.nl/&quot; id=&quot;link-id0x2aabc3ce6568&quot;&gt;Geodan&lt;/a&gt; gave the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aabc3ce65c8&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop&amp;#39;s most memorable talk entitled &lt;a href=&quot;http://www.w3.org/2014/03/lgd/Frans&quot; id=&quot;link-id0x2aabc3ce6628&quot;&gt;&amp;quot;Linked Data and Geoinformatics - a love story&amp;quot; (pdf)&lt;/a&gt; about the excitement and the pitfalls of the burgeoning courtship of Ms. Globe (geoinformatics) and Mr. Cube (semantic technology). They get to talking, later Ms. Globe thinks to herself... &amp;quot;Desiloisazation, explicit semantics, integrated metadata...&amp;quot; Mr. Cube, young upstart now approaching a more experienced and sophisticated lady, dreams of finally making an entry into adult society, &amp;quot;critical mass, global scope, relevant applications...&amp;quot; There is a vibration in the air.&lt;/p&gt; &lt;p&gt;So, with &lt;a href=&quot;http://nl.linkedin.com/pub/frans-knibbe/5a/93/409&quot; id=&quot;link-id0x2aabc3ce66a8&quot;&gt;Frans Knibbe&lt;/a&gt;&amp;#39;s gracious permission &lt;a href=&quot;http://www.slideshare.net/OpenLinkSoftware/geo-knowcopernicusbigdataworkshopbrusselsmarch2014-32446207&quot; id=&quot;link-id0x2aabc3ce6648&quot;&gt;I borrowed the storyline and some of the pictures&lt;/a&gt;. &lt;/p&gt; &lt;div style=&quot;margin: 0 auto; text-align: center&quot;&gt; &lt;iframe align=&quot;middle&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/32446207&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;We ought to make a series of cartoons about the couple. There will be twists and turns in the story to come. &lt;p&gt;Mr. Cube is not Ms. Globe&amp;#39;s first lover, though; there is also rich and worldly Mr. Table. How will Mr. Cube prove himself? The eternal question... Well, not by moping around, not by wise-cracking about semantics, no. By boldly setting out upon a journey to fetch the Golden Fleece from beyond the crashing rocks. &amp;quot;Column store, vectored execution, scale out, data clustering, adaptive schema...&amp;quot; he affirms, with growing confidence.&lt;/p&gt; &lt;p&gt;This is where the story stands, right now. &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2aabc3ce6768&quot;&gt;Virtuoso&lt;/a&gt; run circles around &lt;a href=&quot;http://postgis.net/&quot; id=&quot;link-id0x2aabc3ce6808&quot;&gt;PostGIS&lt;/a&gt; doing aggregations and lookups on geometries in a map-scrolling scenario (GeoKnow&amp;#39;s &lt;a href=&quot;https://github.com/GeoKnow/GeoBenchLab&quot; id=&quot;link-id0x2aabc3ce6868&quot;&gt;GeoBenchLab&lt;/a&gt;). Virtuoso &lt;a href=&quot;http://en.wikipedia.org/wiki/SPARQL&quot; id=&quot;link-id0x2aabdd806b48&quot;&gt;SPARQL&lt;/a&gt; outperforms PostGIS &lt;a href=&quot;http://en.wikipedia.org/wiki/SQL&quot; id=&quot;link-id0x2aabdd806ba8&quot;&gt;SQL&lt;/a&gt; against planet-scale &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdd806c08&quot;&gt;OpenStreetMap&lt;/a&gt;; Virtuoso SQL goes 5-10x faster still.&lt;/p&gt; &lt;p&gt;Mr Cube is fast on the draw, but still some corners can be smoothed out.&lt;/p&gt; &lt;p&gt;Later in GeoKnow, there will be still more speed but also near parity between SQL and SPARQL via taking advantage of data regularity in guiding physical storage. If it is big, it is bound to have repeating structure.&lt;/p&gt; &lt;p&gt;The love story grows more real by the day. To be consummated still within GeoKnow.&lt;/p&gt; &lt;p&gt;Talking of databases has the great advantage that this has been a performance game from the start. There are few people who need convincing about the desirability of performance, as this also makes for lower cost and more flexibility on the application side.&lt;/p&gt; &lt;p&gt;But this is not all there is to it.&lt;/p&gt; &lt;p&gt;In Brussels, the public was about E-science (Earth observation). In science, it is understood that qualitative aspects can be even more crucial. I told the story about an E-science-oriented workshop I attended in America years ago. The practitioners, from high energy physics to life sciences to climate, had invariably come across the need for self-description of data and for schema-last. This was essentially never provided by &lt;a href=&quot;http://en.wikipedia.org/wiki/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd806fe8&quot;&gt;RDF&lt;/a&gt;, except for some life science cases. Rather, we had one-off schemes, ranging from key-value pairs to putting the table name in a column of the same table to preserve the origin across data export.&lt;/p&gt; &lt;p&gt;Explicit semantics and integrated metadata are important, Ms. Globe knows, but she cannot sacrifice operational capacity for this. So it is more than a &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms.ttl%23DBMS&quot; id=&quot;link-id0x2aabdd8070e8&quot;&gt;DBMS&lt;/a&gt; or even data model choice -- there must be a solid tool chain for data integration and visualization. GeoKnow provides many tools in this space.&lt;/p&gt; &lt;p&gt;Some of these, such as the &lt;a href=&quot;http://svn.aksw.org/papers/2011/WWW_LIMES/public.pdf&quot; id=&quot;link-id0x2aabdd807148&quot;&gt;LIMES entity matching framework (pdf)&lt;/a&gt; are probably close to the best there is. For other parts, the SQL-based products with hundreds of person years invested in user interaction are simply unbeatable.&lt;/p&gt; &lt;p&gt;In these cases, the world can continue to talk SQL. If the regular part of the data is in fact tables already, so much the better. You connect to Virtuoso via SQL, just like to PostGIS or &lt;a href=&quot;http://www.oracle.com/technetwork/database/options/spatialandgraph/overview/index.html&quot; id=&quot;link-id0x2aabdd807168&quot;&gt;Oracle Spatial&lt;/a&gt;, and talk &lt;a href=&quot;http://en.wikipedia.org/wiki/Simple_Features&quot; id=&quot;link-id0x2aabdd807268&quot;&gt;SQL MM&lt;/a&gt;. The triples, in the sense of flexible annotation and integrated metadata, stay there; you just do not see them if you do not want them.&lt;/p&gt; &lt;p&gt; There are possibilities all right. In the coming months I will showcase some of the progress, starting with a detailed look at the OpenStreetMap experiments we have made in GeoKnow.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabdd807428&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x2aabdd8074e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabdd8075a8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:52:29-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-18#1787</atom:id>
  <atom:published>2014-03-18T14:45:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://okfn.org/&quot; id=&quot;link-id0x2aabc38976f8&quot;&gt;Open Knowledge Foundation&lt;/a&gt; (OKFN) held a &lt;a href=&quot;http://www.eventbrite.co.uk/e/london-open-data-meetup-march-2014-tickets-10574052275&quot; id=&quot;link-id0x2aabdd08bb18&quot;&gt;London Open Data Meetup&lt;/a&gt; in the evening of the first day of the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x127f1648&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop. The event was, as they themselves put it, at the amazing open concept office of OKFN at the &lt;a href=&quot;http://blog.okfn.org/2011/06/23/okfns-london-office-opens-at-the-centre-for-creative-collaboration/&quot; id=&quot;link-id0x2aabc2ffb288&quot;&gt;Center for Creative Collaboration&lt;/a&gt; in Central London. What could sound cooler? True, OKFN threw a good party, with ever engaging and charismatic founder &lt;a href=&quot;http://okfn.org/about/team/#rufus-pollock-8212-founder&quot; id=&quot;link-id0x2aabc2bbdd68&quot;&gt;Rufus Pollock&lt;/a&gt; presiding. &lt;a href=&quot;http://philarcher.org/&quot; id=&quot;link-id0x2aabc37081d8&quot;&gt;Phil Archer&lt;/a&gt; noted, only half in jest, that OKFN was so influential, visible, had the ear of government and public alike, etc., that it put &lt;a href=&quot;http://www.w3.org/&quot; id=&quot;link-id0x2aabc3cabb58&quot;&gt;W3C&lt;/a&gt; to shame.&lt;/p&gt; &lt;p&gt;Now, OKFN is a party in the &lt;a href=&quot;http://lod2.ec&quot; id=&quot;link-id0x2aabdd5e9ab8&quot;&gt;LOD2&lt;/a&gt; FP7 project, so I have over the years met people from there on and off. In LOD2, OKFN is praised to the skies for its visibility and influence and outreach and sometimes, in passing, critiqued for not publishing enough &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd60e5b8&quot;&gt;RDF&lt;/a&gt;, let alone five star linked data.&lt;/p&gt; &lt;p&gt;As it happens, &lt;a href=&quot;http://dbpedia.org/page/Comma-separated_values&quot; id=&quot;link-id0x128d93d8&quot;&gt;CSV&lt;/a&gt; rules, and even the W3C will, it appears, undertake to standardize a CSV-to-RDF mapping. As far as I am concerned, as long as there is no alignment of identifiers or vocabulary, whether a thing is CSV or exactly equivalent RDF, there is no great difference, except that CSV is smaller and loads into Excel.&lt;/p&gt; &lt;p&gt;For OKFN, which has a mission of opening data, insisting on any particular format would just hinder the cause.&lt;/p&gt; &lt;p&gt;What do we learn from this? OKFN is praised not only for government relations but also for developer friendliness. Lobbying for open data is something I can understand, but how do you do developer relations? This is not like talking to customers, where the customer wants to do something and it is usually possible to give some kind of advice or recommendation on how they can use our technology for the purpose.&lt;/p&gt; &lt;p&gt;Are &lt;a href=&quot;http://dbpedia.org/page/JSON&quot; id=&quot;link-id0x2aabc1987188&quot;&gt;JSON&lt;/a&gt; and &lt;a href=&quot;https://www.mongodb.org/&quot; id=&quot;link-id0x2aabc10ba4e8&quot;&gt;Mongo DB&lt;/a&gt; the key? A well renowned database guy once said that to be with the times, JSON is your data model, &lt;a href=&quot;http://hadoop.apache.org/&quot; id=&quot;link-id0x2aabdd60e488&quot;&gt;Hadoop&lt;/a&gt; your file system, Mongo DB your database, and &lt;a href=&quot;http://en.wikipedia.org/wiki/JavaScript&quot; id=&quot;link-id0x2aabdcc71938&quot;&gt;JavaScript&lt;/a&gt; your language, and failing this, you are an old fart, a legacy suit, well, some uncool fossil.&lt;/p&gt; &lt;p&gt;The key is not limited to JSON. More generally, it is zero time to some result and no learning curve. Some people will sacrifice almost anything for this, such as the possibility of doing arbitrary joins. People will even write code, even lots of it, if it only happens to be in their framework of choice.&lt;/p&gt; &lt;p&gt;Phil again deplored the early fiasco of RDF messaging. &amp;quot;Triples are not so difficult. It is not true that RDF has a very steep learning curve.&amp;quot; I would have to agree. The earlier gaffes of the &lt;a href=&quot;http://dbpedia.org/resource/RDF/XML&quot; id=&quot;link-id0x2aabc316f4f8&quot;&gt;RDF/XML&lt;/a&gt; syntax and the infamous &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web_Stack&quot; id=&quot;link-id0x2aabc1a85bb8&quot;&gt;semantic web layer cake&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/File:Semantic-web-stack.png&quot; id=&quot;link-id0x2aabdcdbb248&quot;&gt;diagram&lt;/a&gt; now lie buried and unlamented; let them be.&lt;/p&gt; &lt;p&gt;Generating user experience from data or schema is an old mirage that has never really worked out. The imagined gain from eliminating application writing has however continued to fascinate IT minds and attempts in this direction have never really ceased. The lesson of history seems to be that coding is not to be eliminated, but that it should have fast turnaround time and immediately visible results.&lt;/p&gt; &lt;p&gt;And since this is the age of data, databases should follow this lead. Schema-last is a good point, maybe adding JSON alongside &lt;a href=&quot;http://en.wikipedia.org/wiki/XML&quot; id=&quot;link-id0x1b8e638&quot;&gt;XML&lt;/a&gt; as an object type in RDF might not be so bad. There are already XML functions, so why not the analog for JSON? Just don&amp;#39;t mention XML to the JSON folks...&lt;/p&gt; &lt;p&gt;How does this relate to OKFN? Well, in the first instance this is the cultural impression I received from the meetup, but in a broader sense these factors are critical to realizing the full potential of OKFN&amp;#39;s successes so far. OKFN is a data opening advocacy group; it is not a domain-specific think tank or special interest group. The data owners and their consultants will do analytics and even data integration if they see enough benefit in this, all in the established ways. However, the widespread opening of data does create possibilities that did not exist before. Actual benefits depend in great part on constant lowering of access barriers, and on a commitment by publishers to keep the data up to date, so that developers can build more than just a one-off mashup.&lt;/p&gt; &lt;p&gt;True, there are government users of open data, since there is a productivity gain in already having the neighboring department&amp;#39;s data opened to a point; one does no longer have to go through red tape to gain access to it.&lt;/p&gt; &lt;p&gt;For an application ecosystem to keep growing on the base of tens of thousands of very heterogeneous datasets coming into the open, continuing to lower barriers is key. This is a very different task from making faster and faster databases or of optimizing a particular business process, and it demands different thinking.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabdd4ac8c8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x19a93298&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabc353fe38&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:45:43-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-18#1786</atom:id>
  <atom:published>2014-03-18T14:45:38Z</atom:published>
  <atom:content type="html">&lt;p&gt;I had a conversation with &lt;a href=&quot;http://uk.linkedin.com/in/andyseaborne&quot; id=&quot;link-id0x2aabc2be7ef8&quot;&gt;Andy Seaborne&lt;/a&gt; of &lt;a href=&quot;http://www.epimorphics.com/&quot; id=&quot;link-id0x2aabdcdec268&quot;&gt;Epimorphics&lt;/a&gt;, initial founder of the &lt;a href=&quot;http://jena.apache.org/&quot; id=&quot;link-id0x12a38db8&quot;&gt;Jena RDF Framework&lt;/a&gt; tool chain and editor of many &lt;a href=&quot;https://www.w3.org/&quot; id=&quot;link-id0x2aabdd5cdcd8&quot;&gt;W3C&lt;/a&gt; recommendations, among which the two &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x2aabc3cabb58&quot;&gt;SPARQL&lt;/a&gt;s. We exchanged some news; I told Andy about our progress in cutting the &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdc894518&quot;&gt;RDF&lt;/a&gt;-to-&lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2aabc33b0138&quot;&gt;SQL&lt;/a&gt; performance penalty and doing more and better SQL tricks. Andy asked me if there were use cases doing analytics over RDF, not in the business intelligence sense, but in the sense of machine learning or discovery of structure. There is, in effect, such work, notably in data set summarization and description. A part of this has to do with learning the schema, like one would if wanting to put triples into tables when appropriate. &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aabc0ef1518&quot;&gt;CWI&lt;/a&gt; in &lt;a href=&quot;http://lod2.ec&quot; id=&quot;link-id0x2aabdc620178&quot;&gt;LOD2&lt;/a&gt; has worked in this direction, as has &lt;a href=&quot;http://www.deri.ie/&quot; id=&quot;link-id0x2aabc2df7e88&quot;&gt;DERI&lt;/a&gt; (&lt;a href=&quot;http://www.deri.ie/users/giovanni-tummarello&quot; id=&quot;link-id0x2aabc8076d58&quot;&gt;Giovanni Tummarello&lt;/a&gt;&amp;#39;s team), in the context of giving hints to SPARQL query writers. I would also mention &lt;a href=&quot;http://dws.informatik.uni-mannheim.de/en/people/professors/prof-dr-christian-bizer/&quot; id=&quot;link-id0x2aabc2a41468&quot;&gt;Chris Bizer&lt;/a&gt; &lt;i&gt;et al.,&lt;/i&gt; at University of Mannheim, with their data integration work, which is all about similarity detection in a schema-less world, e.g., the 150M HTML tables in the Common Crawl, briefly mentioned in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x2aabc2c90ee8&quot;&gt;previous blog&lt;/a&gt;. &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x993aea8&quot;&gt;Jens Lehmann&lt;/a&gt; from University of Leipzig has also done work in learning a schema from the data, this time in OWL.&lt;/p&gt; &lt;p&gt;Andy was later on a panel where &lt;a href=&quot;http://philarcher.org/&quot; id=&quot;link-id0x2aabc10baba8&quot;&gt;Phil Archer&lt;/a&gt; asked him whether SPARQL was slow by nature or whether this was a matter of bad implementations. Andy answered approximately as follows: &amp;quot;If you allow for arbitrary &lt;i&gt;ad hoc&lt;/i&gt; structure, you will always pay something for this. However, if you tell the engine what your data is like, it is no different from executing SQL.&amp;quot; This is essentially the gist of our conversation. Most likely we will make this happen via adaptive schema for the regular part and exceptions as quads.&lt;/p&gt; &lt;p&gt;Later I talked with Phil about the &amp;quot;SPARQL is slow&amp;quot; meme. The fact is that &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2aabdd227d98&quot;&gt;Virtuoso&lt;/a&gt; SPARQL will outperform or match &lt;a href=&quot;http://postgis.net/&quot; id=&quot;link-id0x2aabdd41f238&quot;&gt;PostGIS&lt;/a&gt; SQL for Geospatial lookups against the &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdc7fbae8&quot;&gt;OpenStreetMap&lt;/a&gt; dataset. Virtuoso SQL will win by a factor of 5 to 10. Still, the SPARQL is slow meme is not entirely without a basis in fact. I would say that the really blatant cases that give SPARQL a bad name are query optimization problems. With 50 triple patterns in a query there are 50-factorial ways of getting a bad plan. This is where the catastrophic failures of 100+ times worse than SQL come from. The regular penalty of doing triples vs tables is somewhere between 2.5 (&lt;a href=&quot;http://people.aifb.kit.edu/bka/ssb-benchmark/&quot; id=&quot;link-id0x13912118&quot;&gt;Star Schema Benchmark&lt;/a&gt;) and 10 (lookups with many literals), quite acceptable for many applications. Some really bad cases can occur with regular expressions on URI strings or literals, but then, if this is the core of the application, it should use a different data model or an &lt;a href=&quot;http://dbpedia.org/resource/N-gram&quot; id=&quot;link-id0x2aabca30d8d8&quot;&gt;&lt;i&gt;n&lt;/i&gt;-gram&lt;/a&gt; index.&lt;/p&gt; &lt;p&gt;The solutions, including more dependable query plan choice, will flow from adaptive schema which essentially reduces RDF back into relational, however without forcing schema first and with accommodation for exceptions in the data.&lt;/p&gt; &lt;p&gt;Phil noted here that there already exist many (so far, proprietary) ways of describing the shape of a graph. He said there would be a W3C activity for converging these. If so, a vocabulary that can express relationships, the types of related entities, their cardinalities, etc., comes close to a SQL schema and its statistics. Such a thing can be the output of data analysis, or the input to a query optimizer or storage engine, for using a schema where one in fact exists. Like this, there is no reason why things would be less predictable than with SQL. The idea of a re-convergence of data models is definitely in the air; this is in no sense limited to us.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabc13c08e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabc2bd21e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabdd6840e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:45:38.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-18#1785</atom:id>
  <atom:published>2014-03-18T14:45:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/&quot; id=&quot;link-id0x2aabdd526b38&quot;&gt;W3C&lt;/a&gt; (World Wide Web Consortium) and &lt;a href=&quot;http://www.opengeospatial.org/&quot; id=&quot;link-id0x2aabdd526af8&quot;&gt;OGC&lt;/a&gt; (Open Geospatial Consortium) organized the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aab69bcf828&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop in London this week. The &lt;a href=&quot;http://geoknow.eu&quot; id=&quot;link-id0x2aab69bcf7e8&quot;&gt;GeoKnow project&lt;/a&gt; was represented by &lt;a href=&quot;http://aksw.org/ClausStadler.html&quot; id=&quot;link-id0x2aab69bcf7a8&quot;&gt;Claus Stadler&lt;/a&gt; of &lt;a href=&quot;http://www.zv.uni-leipzig.de/&quot; id=&quot;link-id0x2aabc3d44088&quot;&gt;Universität Leipzig&lt;/a&gt;, and Hugh Williams and myself (Orri Erling) from &lt;a href=&quot;http://www.openlinksw.com&quot; id=&quot;link-id0x2aabc3d44068&quot;&gt;OpenLink Software&lt;/a&gt;. The &lt;a href=&quot;http://okfn.org/&quot; id=&quot;link-id0x2aabc36fe418&quot;&gt;Open Knowledge Foundation&lt;/a&gt; (OKFN) also held an &lt;a href=&quot;http://www.eventbrite.co.uk/e/london-open-data-meetup-march-2014-tickets-10574052275&quot; id=&quot;link-id0x2aabc36fe3f8&quot;&gt;Open Data Meetup&lt;/a&gt; in the evening of the first day of the workshop.&lt;/p&gt; &lt;p&gt;Reporting on each talk and the many highly diverse topics addressed is beyond the scope of this article; for this you can go to the program and the slides that will be online. Instead, I will talk about questions that to me seemed to be in the air, and about some conversations I had with the relevant people.&lt;/p&gt; &lt;p&gt;The trend in events like this is towards shorter and shorter talks and more and more interaction. In this workshop, talks were given in series of three talks with all questions at the end, with all the presenters on stage. This is not a bad idea since we get a panel-like effect where many presenters can address the same question. If the subject matter allows, a panel is my preferred format.&lt;/p&gt; &lt;h3&gt;Web services or SPARQL? Is GeoSPARQL good? Is it about Linked Data or about ontologies?&lt;/h3&gt; &lt;p&gt;Geospatial data tends to be exposed via web services, e.g., WFS (&lt;a href=&quot;http://dbpedia.org/page/Web_Feature_Service&quot; id=&quot;link-id0x2aabdc7781e8&quot;&gt;Web Feature Service&lt;/a&gt;). This allows item retrieval on a lookup basis and some predefined filtering, transformation, and content negotiation. Capabilities vary; OGC now has WFS 2.0, and there are open source implementations that do a fair job of providing the functionality.&lt;/p&gt; &lt;p&gt;Of course, a real query language is much more expressive, but a service API is more scalable, as people say. What they mean is that an API is more predictable. For pretty much any complex data task, a query language is near-infinitely more efficient than going back-and-forth, often on a wide area network, via an API. So, as &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x2aabdc778188&quot;&gt;Andreas Harth&lt;/a&gt; put it: for data publishers, make an API; an open &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x2aabdd45cbd8&quot;&gt;SPARQL&lt;/a&gt; endpoint is too &amp;quot;brave,&amp;quot; [Andreas&amp;#39; word, with the meaning of foolhardy]. When you analyze, he continued, then you load it into a endpoint, but you use your own. Any &lt;a href=&quot;http://dbpedia.org/page/Quality_of_service&quot; id=&quot;link-id0x2aabdd45cbb8&quot;&gt;quality of service&lt;/a&gt; terms must be formulated with respect to a fixed workload, this is not meaningful with &lt;i&gt;ad hoc&lt;/i&gt; queries in an expressive language. Things like anytime semantics (return whatever is found within a time limit) are only good for a first interactive look, not for applications.&lt;/p&gt; &lt;p&gt;Should the application go to the data or the reverse? Some data is big and moving it is not self-evident. A culture of datasets being hosted on a cloud may be forming. Of course some linked data like DBpedia has for a long time been available as &lt;a href=&quot;http://kidehen.blogspot.co.uk/2014/03/preloaded-preconfigured-dbpedia.html&quot; id=&quot;link-id0x2aabdc6fbd48&quot;&gt;Amazon images&lt;/a&gt;. Recently, &lt;a href=&quot;http://www.sindicetech.com/&quot; id=&quot;link-id0x2aabdc6fbce8&quot;&gt;SindiceTech&lt;/a&gt; has made a &lt;a href=&quot;http://www.sindicetech.com/2/post/2014/02/sindicetech-freebase-distribution-launched-on-google-developers-live.html&quot; id=&quot;link-id0x2aabdc6fbca8&quot;&gt;similar packaging&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Freebase&quot; id=&quot;link-id0x2aabdd1b5c58&quot;&gt;Freebase&lt;/a&gt;. The data of interest here is larger and its target audience is more specific, on the e-science side.&lt;/p&gt; &lt;p&gt;How should geometries be modeled? I have met the &lt;a href=&quot;http://dbpedia.org/page/GeoSPARQL&quot; id=&quot;link-id0x2aabdd1b5bf8&quot;&gt;GeoSPARQL&lt;/a&gt; and the &lt;a href=&quot;http://dbpedia.org/page/Simple_Features&quot; id=&quot;link-id0x2aabdc6fcaf8&quot;&gt;SQL MM&lt;/a&gt; on which it is based with a sense of relief, as these are reasonable things that can be efficiently implemented. There are proposals where points have URIs, and linestrings are ordered sets of points, and collections are actual trees with &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd661c28&quot;&gt;RDF&lt;/a&gt; subjects as nodes. As a standard, such a thing is beyond horrible, as it hits all the RDF penalties and overheads full force, and promises easily 10x worse space consumption and 100x worse run times compared to the sweetly reasonable GeoSPARQL. One presenter said that cases of actually hanging attributes off points of complex geometries had been heard of but were, in his words, anecdotal. He posed a question to the audience about use cases where points in fact needed separately addressable identities. Several cases did emerge, involving, for example, different measurement certainties for different points on on a trajectory trace obtained by radar. Applications that need data of this sort will perforce be very domain specific. &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdd581008&quot;&gt;OpenStreetMap&lt;/a&gt; (OSM) itself is a bit like this, but there the points that have individual identity also have predominantly non-geometry attributes and stand for actually-distinct entities. OSM being a practical project, these are then again collapsed into linestrings for cases where this is more efficient. The OGC data types themselves have up to 4 dimensions, of which the 4th could be used as an identifier of a point in the event this really were needed. If so, this would likely be empty for most points and would compress away if the data representation were done right.&lt;/p&gt; &lt;p&gt;For data publishing, Andreas proposed to give OGC geometries URIs, i.e., the borders of a country can be more or less precisely modeled, and the large polygon may have different versions and provenances. This is reasonable enough, as long as the geometries are big. For applications, one will then collapse the &lt;code&gt;1:n&lt;/code&gt; between entity and its geometry into a &lt;code&gt;1:1&lt;/code&gt;. In the end, when you make an application, even an RDF one, you do not just throw all the data in a bucket and write queries against that. Some alignment and transformation is generally involved.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x2aabc02fa778&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabdd11e238&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabdd59c448&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:45:32.000021-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-18#1784</atom:id>
  <atom:published>2014-03-18T14:20:31Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last Friday (2014-03-14) I gave a talk about &lt;a href=&quot;http://geoknow.eu&quot; id=&quot;link-id0x2aabc3ce6228&quot;&gt;GeoKnow&lt;/a&gt; at the &lt;a href=&quot;http://www.copernicus.eu/pages-secondaires/events/event-detail/?tx_julleevents_pi1%5BshowUid%5D=533&amp;amp;cHash=6b72b992422ee703f83e7c6de4c7e697&quot; id=&quot;link-id0x2aabc3ce6288&quot;&gt;EC Copernicus Big Data workshop&lt;/a&gt;. This was a trial run for more streamlined messaging. I have, aside the practice of geekcraft, occupied myself with questions of communication these last weeks.&lt;/p&gt; &lt;p&gt;The clear take-home from London and Brussels alike is that these events have full days and 4 or more talks an hour. It is not quite TV commercial spots yet but it is going in this direction.&lt;/p&gt; &lt;p&gt;If you say something complex, little will get across unless the audience already knows what you will be saying.&lt;/p&gt; &lt;p&gt;I had a set of slides from &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x2aabc3ce6368&quot;&gt;Jens Lehmann&lt;/a&gt;, the GeoKnow project coordinator, for whom I was standing in. Now these are a fine rendition of the description of work. What is wrong with partners, work packages, objectives, etc? Nothing, except everybody has them.&lt;/p&gt; &lt;p&gt;I recall the old story about the journalist and the Zen master: The Zen master repeatedly advises the reporter to cut the story in half. We get the same from PR professionals, &amp;quot;If it is short, they have at least thought about what should go in there,&amp;quot; said one recently, talking of pitches and messages. The other advice was to use pictures. And to have a personal dimension to it.&lt;/p&gt; &lt;p&gt;Enter &amp;quot;Ms. Globe&amp;quot; and &amp;quot;Mr. Cube&amp;quot;. &lt;a href=&quot;http://nl.linkedin.com/pub/frans-knibbe/5a/93/409&quot; id=&quot;link-id0x2aabc3ce6488&quot;&gt;Frans Knibbe&lt;/a&gt; of &lt;a href=&quot;http://www.geodan.nl/&quot; id=&quot;link-id0x2aabc3ce6568&quot;&gt;Geodan&lt;/a&gt; gave the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aabc3ce65c8&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop&amp;#39;s most memorable talk entitled &lt;a href=&quot;http://www.w3.org/2014/03/lgd/Frans&quot; id=&quot;link-id0x2aabc3ce6628&quot;&gt;&amp;quot;Linked Data and Geoinformatics - a love story&amp;quot; (pdf)&lt;/a&gt; about the excitement and the pitfalls of the burgeoning courtship of Ms. Globe (geoinformatics) and Mr. Cube (semantic technology). They get to talking, later Ms. Globe thinks to herself... &amp;quot;Desiloisazation, explicit semantics, integrated metadata...&amp;quot; Mr. Cube, young upstart now approaching a more experienced and sophisticated lady, dreams of finally making an entry into adult society, &amp;quot;critical mass, global scope, relevant applications...&amp;quot; There is a vibration in the air.&lt;/p&gt; &lt;p&gt;So, with &lt;a href=&quot;http://nl.linkedin.com/pub/frans-knibbe/5a/93/409&quot; id=&quot;link-id0x2aabc3ce66a8&quot;&gt;Frans Knibbe&lt;/a&gt;&amp;#39;s gracious permission &lt;a href=&quot;http://www.slideshare.net/OpenLinkSoftware/geo-knowcopernicusbigdataworkshopbrusselsmarch2014-32446207&quot; id=&quot;link-id0x2aabc3ce6648&quot;&gt;I borrowed the storyline and some of the pictures&lt;/a&gt;. &lt;/p&gt; &lt;div style=&quot;margin: 0 auto; text-align: center&quot;&gt; &lt;iframe align=&quot;middle&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/32446207&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt; &lt;/iframe&gt; &lt;/div&gt;We ought to make a series of cartoons about the couple. There will be twists and turns in the story to come. &lt;p&gt;Mr. Cube is not Ms. Globe&amp;#39;s first lover, though; there is also rich and worldly Mr. Table. How will Mr. Cube prove himself? The eternal question... Well, not by moping around, not by wise-cracking about semantics, no. By boldly setting out upon a journey to fetch the Golden Fleece from beyond the crashing rocks. &amp;quot;Column store, vectored execution, scale out, data clustering, adaptive schema...&amp;quot; he affirms, with growing confidence.&lt;/p&gt; &lt;p&gt;This is where the story stands, right now. &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2aabc3ce6768&quot;&gt;Virtuoso&lt;/a&gt; run circles around &lt;a href=&quot;http://postgis.net/&quot; id=&quot;link-id0x2aabc3ce6808&quot;&gt;PostGIS&lt;/a&gt; doing aggregations and lookups on geometries in a map-scrolling scenario (GeoKnow&amp;#39;s &lt;a href=&quot;https://github.com/GeoKnow/GeoBenchLab&quot; id=&quot;link-id0x2aabc3ce6868&quot;&gt;GeoBenchLab&lt;/a&gt;). Virtuoso &lt;a href=&quot;http://en.wikipedia.org/wiki/SPARQL&quot; id=&quot;link-id0x2aabdd806b48&quot;&gt;SPARQL&lt;/a&gt; outperforms PostGIS &lt;a href=&quot;http://en.wikipedia.org/wiki/SQL&quot; id=&quot;link-id0x2aabdd806ba8&quot;&gt;SQL&lt;/a&gt; against planet-scale &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdd806c08&quot;&gt;OpenStreetMap&lt;/a&gt;; Virtuoso SQL goes 5-10x faster still.&lt;/p&gt; &lt;p&gt;Mr Cube is fast on the draw, but still some corners can be smoothed out.&lt;/p&gt; &lt;p&gt;Later in GeoKnow, there will be still more speed but also near parity between SQL and SPARQL via taking advantage of data regularity in guiding physical storage. If it is big, it is bound to have repeating structure.&lt;/p&gt; &lt;p&gt;The love story grows more real by the day. To be consummated still within GeoKnow.&lt;/p&gt; &lt;p&gt;Talking of databases has the great advantage that this has been a performance game from the start. There are few people who need convincing about the desirability of performance, as this also makes for lower cost and more flexibility on the application side.&lt;/p&gt; &lt;p&gt;But this is not all there is to it.&lt;/p&gt; &lt;p&gt;In Brussels, the public was about E-science (Earth observation). In science, it is understood that qualitative aspects can be even more crucial. I told the story about an E-science-oriented workshop I attended in America years ago. The practitioners, from high energy physics to life sciences to climate, had invariably come across the need for self-description of data and for schema-last. This was essentially never provided by &lt;a href=&quot;http://en.wikipedia.org/wiki/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd806fe8&quot;&gt;RDF&lt;/a&gt;, except for some life science cases. Rather, we had one-off schemes, ranging from key-value pairs to putting the table name in a column of the same table to preserve the origin across data export.&lt;/p&gt; &lt;p&gt;Explicit semantics and integrated metadata are important, Ms. Globe knows, but she cannot sacrifice operational capacity for this. So it is more than a &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms.ttl%23DBMS&quot; id=&quot;link-id0x2aabdd8070e8&quot;&gt;DBMS&lt;/a&gt; or even data model choice -- there must be a solid tool chain for data integration and visualization. GeoKnow provides many tools in this space.&lt;/p&gt; &lt;p&gt;Some of these, such as the &lt;a href=&quot;http://svn.aksw.org/papers/2011/WWW_LIMES/public.pdf&quot; id=&quot;link-id0x2aabdd807148&quot;&gt;LIMES entity matching framework (pdf)&lt;/a&gt; are probably close to the best there is. For other parts, the SQL-based products with hundreds of person years invested in user interaction are simply unbeatable.&lt;/p&gt; &lt;p&gt;In these cases, the world can continue to talk SQL. If the regular part of the data is in fact tables already, so much the better. You connect to Virtuoso via SQL, just like to PostGIS or &lt;a href=&quot;http://www.oracle.com/technetwork/database/options/spatialandgraph/overview/index.html&quot; id=&quot;link-id0x2aabdd807168&quot;&gt;Oracle Spatial&lt;/a&gt;, and talk &lt;a href=&quot;http://en.wikipedia.org/wiki/Simple_Features&quot; id=&quot;link-id0x2aabdd807268&quot;&gt;SQL MM&lt;/a&gt;. The triples, in the sense of flexible annotation and integrated metadata, stay there; you just do not see them if you do not want them.&lt;/p&gt; &lt;p&gt; There are possibilities all right. In the coming months I will showcase some of the progress, starting with a detailed look at the OpenStreetMap experiments we have made in GeoKnow.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabdd807428&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x2aabdd8074e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabdd8075a8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:52:22.000013-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-18#1783</atom:id>
  <atom:published>2014-03-18T14:20:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://okfn.org/&quot; id=&quot;link-id0x2aabc38976f8&quot;&gt;Open Knowledge Foundation&lt;/a&gt; (OKFN) held a &lt;a href=&quot;http://www.eventbrite.co.uk/e/london-open-data-meetup-march-2014-tickets-10574052275&quot; id=&quot;link-id0x2aabdd08bb18&quot;&gt;London Open Data Meetup&lt;/a&gt; in the evening of the first day of the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x127f1648&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop. The event was, as they themselves put it, at the amazing open concept office of OKFN at the &lt;a href=&quot;http://blog.okfn.org/2011/06/23/okfns-london-office-opens-at-the-centre-for-creative-collaboration/&quot; id=&quot;link-id0x2aabc2ffb288&quot;&gt;Center for Creative Collaboration&lt;/a&gt; in Central London. What could sound cooler? True, OKFN threw a good party, with ever engaging and charismatic founder &lt;a href=&quot;http://okfn.org/about/team/#rufus-pollock-8212-founder&quot; id=&quot;link-id0x2aabc2bbdd68&quot;&gt;Rufus Pollock&lt;/a&gt; presiding. &lt;a href=&quot;http://philarcher.org/&quot; id=&quot;link-id0x2aabc37081d8&quot;&gt;Phil Archer&lt;/a&gt; noted, only half in jest, that OKFN was so influential, visible, had the ear of government and public alike, etc., that it put &lt;a href=&quot;http://www.w3.org/&quot; id=&quot;link-id0x2aabc3cabb58&quot;&gt;W3C&lt;/a&gt; to shame.&lt;/p&gt; &lt;p&gt;Now, OKFN is a party in the &lt;a href=&quot;http://lod2.ec&quot; id=&quot;link-id0x2aabdd5e9ab8&quot;&gt;LOD2&lt;/a&gt; FP7 project, so I have over the years met people from there on and off. In LOD2, OKFN is praised to the skies for its visibility and influence and outreach and sometimes, in passing, critiqued for not publishing enough &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd60e5b8&quot;&gt;RDF&lt;/a&gt;, let alone five star linked data.&lt;/p&gt; &lt;p&gt;As it happens, &lt;a href=&quot;http://dbpedia.org/page/Comma-separated_values&quot; id=&quot;link-id0x128d93d8&quot;&gt;CSV&lt;/a&gt; rules, and even the W3C will, it appears, undertake to standardize a CSV-to-RDF mapping. As far as I am concerned, as long as there is no alignment of identifiers or vocabulary, whether a thing is CSV or exactly equivalent RDF, there is no great difference, except that CSV is smaller and loads into Excel.&lt;/p&gt; &lt;p&gt;For OKFN, which has a mission of opening data, insisting on any particular format would just hinder the cause.&lt;/p&gt; &lt;p&gt;What do we learn from this? OKFN is praised not only for government relations but also for developer friendliness. Lobbying for open data is something I can understand, but how do you do developer relations? This is not like talking to customers, where the customer wants to do something and it is usually possible to give some kind of advice or recommendation on how they can use our technology for the purpose.&lt;/p&gt; &lt;p&gt;Are &lt;a href=&quot;http://dbpedia.org/page/JSON&quot; id=&quot;link-id0x2aabc1987188&quot;&gt;JSON&lt;/a&gt; and &lt;a href=&quot;https://www.mongodb.org/&quot; id=&quot;link-id0x2aabc10ba4e8&quot;&gt;Mongo DB&lt;/a&gt; the key? A well renowned database guy once said that to be with the times, JSON is your data model, &lt;a href=&quot;http://hadoop.apache.org/&quot; id=&quot;link-id0x2aabdd60e488&quot;&gt;Hadoop&lt;/a&gt; your file system, Mongo DB your database, and &lt;a href=&quot;http://en.wikipedia.org/wiki/JavaScript&quot; id=&quot;link-id0x2aabdcc71938&quot;&gt;JavaScript&lt;/a&gt; your language, and failing this, you are an old fart, a legacy suit, well, some uncool fossil.&lt;/p&gt; &lt;p&gt;The key is not limited to JSON. More generally, it is zero time to some result and no learning curve. Some people will sacrifice almost anything for this, such as the possibility of doing arbitrary joins. People will even write code, even lots of it, if it only happens to be in their framework of choice.&lt;/p&gt; &lt;p&gt;Phil again deplored the early fiasco of RDF messaging. &amp;quot;Triples are not so difficult. It is not true that RDF has a very steep learning curve.&amp;quot; I would have to agree. The earlier gaffes of the &lt;a href=&quot;http://dbpedia.org/resource/RDF/XML&quot; id=&quot;link-id0x2aabc316f4f8&quot;&gt;RDF/XML&lt;/a&gt; syntax and the infamous &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web_Stack&quot; id=&quot;link-id0x2aabc1a85bb8&quot;&gt;semantic web layer cake&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/File:Semantic-web-stack.png&quot; id=&quot;link-id0x2aabdcdbb248&quot;&gt;diagram&lt;/a&gt; now lie buried and unlamented; let them be.&lt;/p&gt; &lt;p&gt;Generating user experience from data or schema is an old mirage that has never really worked out. The imagined gain from eliminating application writing has however continued to fascinate IT minds and attempts in this direction have never really ceased. The lesson of history seems to be that coding is not to be eliminated, but that it should have fast turnaround time and immediately visible results.&lt;/p&gt; &lt;p&gt;And since this is the age of data, databases should follow this lead. Schema-last is a good point, maybe adding JSON alongside &lt;a href=&quot;http://en.wikipedia.org/wiki/XML&quot; id=&quot;link-id0x1b8e638&quot;&gt;XML&lt;/a&gt; as an object type in RDF might not be so bad. There are already XML functions, so why not the analog for JSON? Just don&amp;#39;t mention XML to the JSON folks...&lt;/p&gt; &lt;p&gt;How does this relate to OKFN? Well, in the first instance this is the cultural impression I received from the meetup, but in a broader sense these factors are critical to realizing the full potential of OKFN&amp;#39;s successes so far. OKFN is a data opening advocacy group; it is not a domain-specific think tank or special interest group. The data owners and their consultants will do analytics and even data integration if they see enough benefit in this, all in the established ways. However, the widespread opening of data does create possibilities that did not exist before. Actual benefits depend in great part on constant lowering of access barriers, and on a commitment by publishers to keep the data up to date, so that developers can build more than just a one-off mashup.&lt;/p&gt; &lt;p&gt;True, there are government users of open data, since there is a productivity gain in already having the neighboring department&amp;#39;s data opened to a point; one does no longer have to go through red tape to gain access to it.&lt;/p&gt; &lt;p&gt;For an application ecosystem to keep growing on the base of tens of thousands of very heterogeneous datasets coming into the open, continuing to lower barriers is key. This is a very different task from making faster and faster databases or of optimizing a particular business process, and it demands different thinking.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabdd4ac8c8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x19a93298&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabc353fe38&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:22:46-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-18#1782</atom:id>
  <atom:published>2014-03-18T14:20:25Z</atom:published>
  <atom:content type="html">&lt;p&gt;I had a conversation with &lt;a href=&quot;http://uk.linkedin.com/in/andyseaborne&quot; id=&quot;link-id0x2aabc2be7ef8&quot;&gt;Andy Seaborne&lt;/a&gt; of &lt;a href=&quot;http://www.epimorphics.com/&quot; id=&quot;link-id0x2aabdcdec268&quot;&gt;Epimorphics&lt;/a&gt;, initial founder of the &lt;a href=&quot;http://jena.apache.org/&quot; id=&quot;link-id0x12a38db8&quot;&gt;Jena RDF Framework&lt;/a&gt; tool chain and editor of many &lt;a href=&quot;https://www.w3.org/&quot; id=&quot;link-id0x2aabdd5cdcd8&quot;&gt;W3C&lt;/a&gt; recommendations, among which the two &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x2aabc3cabb58&quot;&gt;SPARQL&lt;/a&gt;s. We exchanged some news; I told Andy about our progress in cutting the &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdc894518&quot;&gt;RDF&lt;/a&gt;-to-&lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2aabc33b0138&quot;&gt;SQL&lt;/a&gt; performance penalty and doing more and better SQL tricks. Andy asked me if there were use cases doing analytics over RDF, not in the business intelligence sense, but in the sense of machine learning or discovery of structure. There is, in effect, such work, notably in data set summarization and description. A part of this has to do with learning the schema, like one would if wanting to put triples into tables when appropriate. &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aabc0ef1518&quot;&gt;CWI&lt;/a&gt; in &lt;a href=&quot;http://lod2.ec&quot; id=&quot;link-id0x2aabdc620178&quot;&gt;LOD2&lt;/a&gt; has worked in this direction, as has &lt;a href=&quot;http://www.deri.ie/&quot; id=&quot;link-id0x2aabc2df7e88&quot;&gt;DERI&lt;/a&gt; (&lt;a href=&quot;http://www.deri.ie/users/giovanni-tummarello&quot; id=&quot;link-id0x2aabc8076d58&quot;&gt;Giovanni Tummarello&lt;/a&gt;&amp;#39;s team), in the context of giving hints to SPARQL query writers. I would also mention &lt;a href=&quot;http://dws.informatik.uni-mannheim.de/en/people/professors/prof-dr-christian-bizer/&quot; id=&quot;link-id0x2aabc2a41468&quot;&gt;Chris Bizer&lt;/a&gt; &lt;i&gt;et al.,&lt;/i&gt; at University of Mannheim, with their data integration work, which is all about similarity detection in a schema-less world, e.g., the 150M HTML tables in the Common Crawl, briefly mentioned in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x2aabc2c90ee8&quot;&gt;previous blog&lt;/a&gt;. &lt;a href=&quot;http://jens-lehmann.org/&quot; id=&quot;link-id0x993aea8&quot;&gt;Jens Lehmann&lt;/a&gt; from University of Leipzig has also done work in learning a schema from the data, this time in OWL.&lt;/p&gt; &lt;p&gt;Andy was later on a panel where &lt;a href=&quot;http://philarcher.org/&quot; id=&quot;link-id0x2aabc10baba8&quot;&gt;Phil Archer&lt;/a&gt; asked him whether SPARQL was slow by nature or whether this was a matter of bad implementations. Andy answered approximately as follows: &amp;quot;If you allow for arbitrary &lt;i&gt;ad hoc&lt;/i&gt; structure, you will always pay something for this. However, if you tell the engine what your data is like, it is no different from executing SQL.&amp;quot; This is essentially the gist of our conversation. Most likely we will make this happen via adaptive schema for the regular part and exceptions as quads.&lt;/p&gt; &lt;p&gt;Later I talked with Phil about the &amp;quot;SPARQL is slow&amp;quot; meme. The fact is that &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2aabdd227d98&quot;&gt;Virtuoso&lt;/a&gt; SPARQL will outperform or match &lt;a href=&quot;http://postgis.net/&quot; id=&quot;link-id0x2aabdd41f238&quot;&gt;PostGIS&lt;/a&gt; SQL for Geospatial lookups against the &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdc7fbae8&quot;&gt;OpenStreetMap&lt;/a&gt; dataset. Virtuoso SQL will win by a factor of 5 to 10. Still, the SPARQL is slow meme is not entirely without a basis in fact. I would say that the really blatant cases that give SPARQL a bad name are query optimization problems. With 50 triple patterns in a query there are 50-factorial ways of getting a bad plan. This is where the catastrophic failures of 100+ times worse than SQL come from. The regular penalty of doing triples vs tables is somewhere between 2.5 (&lt;a href=&quot;http://people.aifb.kit.edu/bka/ssb-benchmark/&quot; id=&quot;link-id0x13912118&quot;&gt;Star Schema Benchmark&lt;/a&gt;) and 10 (lookups with many literals), quite acceptable for many applications. Some really bad cases can occur with regular expressions on URI strings or literals, but then, if this is the core of the application, it should use a different data model or an &lt;a href=&quot;http://dbpedia.org/resource/N-gram&quot; id=&quot;link-id0x2aabca30d8d8&quot;&gt;&lt;i&gt;n&lt;/i&gt;-gram&lt;/a&gt; index.&lt;/p&gt; &lt;p&gt;The solutions, including more dependable query plan choice, will flow from adaptive schema which essentially reduces RDF back into relational, however without forcing schema first and with accommodation for exceptions in the data.&lt;/p&gt; &lt;p&gt;Phil noted here that there already exist many (so far, proprietary) ways of describing the shape of a graph. He said there would be a W3C activity for converging these. If so, a vocabulary that can express relationships, the types of related entities, their cardinalities, etc., comes close to a SQL schema and its statistics. Such a thing can be the output of data analysis, or the input to a query optimizer or storage engine, for using a schema where one in fact exists. Like this, there is no reason why things would be less predictable than with SQL. The idea of a re-convergence of data models is definitely in the air; this is in no sense limited to us.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1781&quot; id=&quot;link-id0x2aabc13c08e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabc2bd21e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabdd6840e8&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-08-20T17:35:43.158051-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-18#1781</atom:id>
  <atom:published>2014-03-18T14:20:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/&quot; id=&quot;link-id0x2aabdd526b38&quot;&gt;W3C&lt;/a&gt; (World Wide Web Consortium) and &lt;a href=&quot;http://www.opengeospatial.org/&quot; id=&quot;link-id0x2aabdd526af8&quot;&gt;OGC&lt;/a&gt; (Open Geospatial Consortium) organized the &lt;a href=&quot;http://www.w3.org/2014/03/lgd/&quot; id=&quot;link-id0x2aab69bcf828&quot;&gt;Linked Geospatial Data 2014&lt;/a&gt; workshop in London this week. The &lt;a href=&quot;http://geoknow.eu&quot; id=&quot;link-id0x2aab69bcf7e8&quot;&gt;GeoKnow project&lt;/a&gt; was represented by &lt;a href=&quot;http://aksw.org/ClausStadler.html&quot; id=&quot;link-id0x2aab69bcf7a8&quot;&gt;Claus Stadler&lt;/a&gt; of &lt;a href=&quot;http://www.zv.uni-leipzig.de/&quot; id=&quot;link-id0x2aabc3d44088&quot;&gt;Universität Leipzig&lt;/a&gt;, and Hugh Williams and myself (Orri Erling) from &lt;a href=&quot;http://www.openlinksw.com&quot; id=&quot;link-id0x2aabc3d44068&quot;&gt;OpenLink Software&lt;/a&gt;. The &lt;a href=&quot;http://okfn.org/&quot; id=&quot;link-id0x2aabc36fe418&quot;&gt;Open Knowledge Foundation&lt;/a&gt; (OKFN) also held an &lt;a href=&quot;http://www.eventbrite.co.uk/e/london-open-data-meetup-march-2014-tickets-10574052275&quot; id=&quot;link-id0x2aabc36fe3f8&quot;&gt;Open Data Meetup&lt;/a&gt; in the evening of the first day of the workshop.&lt;/p&gt; &lt;p&gt;Reporting on each talk and the many highly diverse topics addressed is beyond the scope of this article; for this you can go to the program and the slides that will be online. Instead, I will talk about questions that to me seemed to be in the air, and about some conversations I had with the relevant people.&lt;/p&gt; &lt;p&gt;The trend in events like this is towards shorter and shorter talks and more and more interaction. In this workshop, talks were given in series of three talks with all questions at the end, with all the presenters on stage. This is not a bad idea since we get a panel-like effect where many presenters can address the same question. If the subject matter allows, a panel is my preferred format.&lt;/p&gt; &lt;h3&gt;Web services or SPARQL? Is GeoSPARQL good? Is it about Linked Data or about ontologies?&lt;/h3&gt; &lt;p&gt;Geospatial data tends to be exposed via web services, e.g., WFS (&lt;a href=&quot;http://dbpedia.org/page/Web_Feature_Service&quot; id=&quot;link-id0x2aabdc7781e8&quot;&gt;Web Feature Service&lt;/a&gt;). This allows item retrieval on a lookup basis and some predefined filtering, transformation, and content negotiation. Capabilities vary; OGC now has WFS 2.0, and there are open source implementations that do a fair job of providing the functionality.&lt;/p&gt; &lt;p&gt;Of course, a real query language is much more expressive, but a service API is more scalable, as people say. What they mean is that an API is more predictable. For pretty much any complex data task, a query language is near-infinitely more efficient than going back-and-forth, often on a wide area network, via an API. So, as &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x2aabdc778188&quot;&gt;Andreas Harth&lt;/a&gt; put it: for data publishers, make an API; an open &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x2aabdd45cbd8&quot;&gt;SPARQL&lt;/a&gt; endpoint is too &amp;quot;brave,&amp;quot; [Andreas&amp;#39; word, with the meaning of foolhardy]. When you analyze, he continued, then you load it into a endpoint, but you use your own. Any &lt;a href=&quot;http://dbpedia.org/page/Quality_of_service&quot; id=&quot;link-id0x2aabdd45cbb8&quot;&gt;quality of service&lt;/a&gt; terms must be formulated with respect to a fixed workload, this is not meaningful with &lt;i&gt;ad hoc&lt;/i&gt; queries in an expressive language. Things like anytime semantics (return whatever is found within a time limit) are only good for a first interactive look, not for applications.&lt;/p&gt; &lt;p&gt;Should the application go to the data or the reverse? Some data is big and moving it is not self-evident. A culture of datasets being hosted on a cloud may be forming. Of course some linked data like DBpedia has for a long time been available as &lt;a href=&quot;http://kidehen.blogspot.co.uk/2014/03/preloaded-preconfigured-dbpedia.html&quot; id=&quot;link-id0x2aabdc6fbd48&quot;&gt;Amazon images&lt;/a&gt;. Recently, &lt;a href=&quot;http://www.sindicetech.com/&quot; id=&quot;link-id0x2aabdc6fbce8&quot;&gt;SindiceTech&lt;/a&gt; has made a &lt;a href=&quot;http://www.sindicetech.com/2/post/2014/02/sindicetech-freebase-distribution-launched-on-google-developers-live.html&quot; id=&quot;link-id0x2aabdc6fbca8&quot;&gt;similar packaging&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Freebase&quot; id=&quot;link-id0x2aabdd1b5c58&quot;&gt;Freebase&lt;/a&gt;. The data of interest here is larger and its target audience is more specific, on the e-science side.&lt;/p&gt; &lt;p&gt;How should geometries be modeled? I have met the &lt;a href=&quot;http://dbpedia.org/page/GeoSPARQL&quot; id=&quot;link-id0x2aabdd1b5bf8&quot;&gt;GeoSPARQL&lt;/a&gt; and the &lt;a href=&quot;http://dbpedia.org/page/Simple_Features&quot; id=&quot;link-id0x2aabdc6fcaf8&quot;&gt;SQL MM&lt;/a&gt; on which it is based with a sense of relief, as these are reasonable things that can be efficiently implemented. There are proposals where points have URIs, and linestrings are ordered sets of points, and collections are actual trees with &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2aabdd661c28&quot;&gt;RDF&lt;/a&gt; subjects as nodes. As a standard, such a thing is beyond horrible, as it hits all the RDF penalties and overheads full force, and promises easily 10x worse space consumption and 100x worse run times compared to the sweetly reasonable GeoSPARQL. One presenter said that cases of actually hanging attributes off points of complex geometries had been heard of but were, in his words, anecdotal. He posed a question to the audience about use cases where points in fact needed separately addressable identities. Several cases did emerge, involving, for example, different measurement certainties for different points on on a trajectory trace obtained by radar. Applications that need data of this sort will perforce be very domain specific. &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabdd581008&quot;&gt;OpenStreetMap&lt;/a&gt; (OSM) itself is a bit like this, but there the points that have individual identity also have predominantly non-geometry attributes and stand for actually-distinct entities. OSM being a practical project, these are then again collapsed into linestrings for cases where this is more efficient. The OGC data types themselves have up to 4 dimensions, of which the 4th could be used as an identifier of a point in the event this really were needed. If so, this would likely be empty for most points and would compress away if the data representation were done right.&lt;/p&gt; &lt;p&gt;For data publishing, Andreas proposed to give OGC geometries URIs, i.e., the borders of a country can be more or less precisely modeled, and the large polygon may have different versions and provenances. This is reasonable enough, as long as the geometries are big. For applications, one will then collapse the &lt;code&gt;1:n&lt;/code&gt; between entity and its geometry into a &lt;code&gt;1:1&lt;/code&gt;. In the end, when you make an application, even an RDF one, you do not just throw all the data in a bucket and write queries against that. Some alignment and transformation is generally involved.&lt;/p&gt; &lt;h3&gt;Linked Geospatial Data 2014 Workshop posts:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; Linked Geospatial Data 2014 Workshop, Part 1: Web Services or SPARQL Modeling?&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1782&quot; id=&quot;link-id0x2aabc02fa778&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 2: Is SPARQL Slow?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1783&quot; id=&quot;link-id0x2aabdd11e238&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 3: The Stellar Reach of OKFN&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1784&quot; id=&quot;link-id0x2aabdd59c448&quot;&gt;Linked Geospatial Data 2014 Workshop, Part 4: GeoKnow, London, Brussels, The Message&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-03-18T10:22:43.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 9 of n): TPC-H Q18, Ordered Aggregation, and Top K</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-03-17#1780</atom:id>
  <atom:published>2014-03-17T16:41:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here return to polishing the cutting edge, the high geekcraft of database. We will look at more of the wonders of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x256ad6b8&quot;&gt;TPC-H&lt;/a&gt; and cover two more tricks. The experts can skip the preliminaries and go to the query profiles; for the others, there is some explanation first.&lt;/p&gt; &lt;p&gt;From the TPC-H specification:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, SUM ( l_quantity ) FROM customer, orders, lineitem WHERE o_orderkey IN ( SELECT l_orderkey FROM lineitem GROUP BY l_orderkey HAVING SUM ( l_quantity ) &amp;gt; 312 ) AND c_custkey = o_custkey AND o_orderkey = l_orderkey GROUP BY c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice ORDER BY o_totalprice DESC, o_orderdate &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent of the query is to return &lt;code&gt;order&lt;/code&gt; and &lt;code&gt;customer&lt;/code&gt; information for cases where an &lt;code&gt;order&lt;/code&gt; involves a large quantity of &lt;code&gt;items&lt;/code&gt;, with highest-value &lt;code&gt;orders&lt;/code&gt; first. &lt;/p&gt; &lt;p&gt;We note that the only restriction in the query is the one on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt; in the &lt;code&gt;IN&lt;/code&gt; subquery. Everything else is a full scan or a &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Join_(SQL)&quot; id=&quot;link-id0x19919558&quot;&gt;JOIN&lt;/a&gt;&lt;/code&gt; on a &lt;a href=&quot;http://dbpedia.org/page/Foreign_key&quot; id=&quot;link-id0x1fc089f8&quot;&gt;foreign key&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Now, the first query optimization rule of thumb could be summarized as &lt;i&gt;start from the small.&lt;/i&gt; &lt;i&gt;Small&lt;/i&gt; here means something that is restricted; it does not mean small table. Smallest is the one from which the highest percentage is dropped via a condition that does not depend on other tables.&lt;/p&gt; &lt;p&gt;The next rule of thumb is to try starting from the large, if the large has a restricting &lt;code&gt;join&lt;/code&gt;; for example, scan all the &lt;code&gt;lineitems&lt;/code&gt; and hash join to &lt;code&gt;parts&lt;/code&gt; that are green and of a given brand. In this case, the idea is to make a hash table from the small side and sequentially scan the large side, dropping everything that does not match something in the hash table.&lt;/p&gt; &lt;p&gt;The only restriction here is on &lt;code&gt;orders&lt;/code&gt; via a &lt;code&gt;join&lt;/code&gt; on &lt;code&gt;lineitem&lt;/code&gt;. So, the &lt;code&gt;IN&lt;/code&gt; subquery can be flattened, so as to read like --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ... FROM ( SELECT l_orderkey, SUM ( l_quantity ) FROM lineitem GROUP BY l_orderkey HAVING SUM ( l_quantity ) &amp;gt; 312 ) f, orders, customer, lineitem WHERE f.l_orderkey = o_orderkey .... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The above (left to right) is the best &lt;code&gt;JOIN&lt;/code&gt; order for this type of plan. We start from the restriction, and for all the rest the &lt;code&gt;JOIN&lt;/code&gt; is foreign key to primary key, sometimes &lt;code&gt;n:1&lt;/code&gt; (&lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;), sometimes &lt;code&gt;1:n&lt;/code&gt; (&lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;lineitem&lt;/code&gt;). A &lt;code&gt;1:n&lt;/code&gt; is usually best by index; an &lt;code&gt;n:1&lt;/code&gt; can be better by hash if there are enough tuples on the n side to make it worthwhile to build the hash table.&lt;/p&gt; &lt;p&gt;We note that the first &lt;code&gt;GROUP BY&lt;/code&gt; makes a very large number of groups, e.g., 150M at 100 Gtriple scale. We also note that if &lt;code&gt;lineitem&lt;/code&gt; is ordered so that the &lt;code&gt;lineitems&lt;/code&gt; of a single &lt;code&gt;order&lt;/code&gt; are together, the &lt;code&gt;GROUP BY&lt;/code&gt; is ordered. In other words, once you have seen a specific value of &lt;code&gt;l_orderkey&lt;/code&gt; change to the next, you will not see the old value again. In this way, the groups do not have to be remembered for all time. The &lt;code&gt;GROUP BY&lt;/code&gt; produces a stream of results as the scan of &lt;code&gt;lineitem&lt;/code&gt; proceeds.&lt;/p&gt; &lt;p&gt;Considering vectored execution, the &lt;code&gt;GROUP BY&lt;/code&gt; does remember a bunch of groups, up to a vector size worth, so that output from the &lt;code&gt;GROUP BY&lt;/code&gt; is done in large enough batches, not a tuple at a time.&lt;/p&gt; &lt;p&gt;Considering parallelization, the scan of &lt;code&gt;lineitem&lt;/code&gt; must be split in such a way that all &lt;code&gt;lineitems&lt;/code&gt; with the same &lt;code&gt;l_orderkey&lt;/code&gt; get processed by the same thread. If this is the case, all threads will produce an independent stream of results that is guaranteed to need no merge with the output of another thread.&lt;/p&gt; &lt;p&gt;So, we can try this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6e-06% fanout 1 input 1 rows time 4.5% fanout 1 input 1 rows { hash filler &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Make a hash table from &lt;code&gt;c_custkey&lt;/code&gt; to &lt;code&gt;c_name&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.99% fanout 1.5e+07 input 1 rows CUSTOMER 1.5e+07 rows(.C_CUSTKEY, .C_NAME) time 0.81% fanout 0 input 1.5e+07 rows Sort hf 35 (.C_CUSTKEY) -&amp;gt; (.C_NAME) } time 2.2e-05% fanout 1 input 1 rows time 1.6e-05% fanout 1 input 1 rows { fork time 5.2e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Scan &lt;code&gt;lineitem&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 10% fanout 6.00038e+08 input 1 rows LINEITEM 6e+08 rows(t5.L_ORDERKEY, t5.L_QUANTITY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Ordered &lt;code&gt;GROUP BY&lt;/code&gt; (streaming with duplicates) &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 73% fanout 1.17743e-05 input 6.00038e+08 rows Sort streaming with duplicates (t5.L_ORDERKEY) -&amp;gt; (t5.L_QUANTITY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The ordered aggregation above emits a batch of results every so often, having accumulated 20K or so groups (&lt;code&gt;DISTINCT l_orderkey&lt;/code&gt;&amp;#39;s)&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The operator below reads the batch and sends it onward, the &lt;code&gt;GROUP BY&lt;/code&gt; hash table for the next batch.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 10% fanout 21231.4 input 7065 rows group by read node (t5.L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 After code: 0: L_ORDERKEY := := artm t5.L_ORDERKEY 4: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- This marks the end of the flattened &lt;code&gt;IN&lt;/code&gt; subquery. 1063 out of 150M groups survive the test on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The main difficulty of Q18 is guessing that this condition is this selective.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.0013% fanout 1 input 1063 rows Subquery Select(L_ORDERKEY) time 0.058% fanout 1 input 1063 rows ORDERS unq 0.97 rows (.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE) inlined O_ORDERKEY = L_ORDERKEY hash partition+bloom by 42 (tmp)hash join merged always card 0.99 -&amp;gt; (.C_NAME) time 0.0029% fanout 1 input 1063 rows Hash source 35 merged into ts 0.99 rows(.O_CUSTKEY) -&amp;gt; (.C_NAME) After code: 0: .C_CUSTKEY := := artm .O_CUSTKEY 4: BReturn 0 time 0.018% fanout 7 input 1063 rows LINEITEM 4.3 rows(.L_QUANTITY) inlined L_ORDERKEY = .O_ORDERKEY time 0.011% fanout 0 input 7441 rows Sort (.C_CUSTKEY, .O_ORDERKEY) -&amp;gt; (.L_QUANTITY, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) } time 0.00026% fanout 1063 input 1 rows group by read node (.C_CUSTKEY, .O_ORDERKEY, aggregate, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.00061% fanout 0 input 1063 rows Sort (.O_TOTALPRICE, .O_ORDERDATE) -&amp;gt; (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, aggregate) } time 1.7e-05% fanout 100 input 1 rows top order by read (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) time 1.2e-06% fanout 0 input 100 rows Select (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) } 6351 msec 1470% cpu, 2151 rnd 6.14898e+08 seq 0.185874% same seg 1.57993% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;What is wrong with this? The result is not bad, in the ballpark with &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x257913e8&quot;&gt;VectorWise&lt;/a&gt; published results (4.9s on a slightly faster box), but better is possible. We note that there is a hash join from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;. Only 1K &lt;code&gt;customers&lt;/code&gt; of 15M get hit. The whole hash table of 15M entries is built in vain. Let&amp;#39;s cheat and declare the &lt;code&gt;join&lt;/code&gt; to be by &lt;code&gt;index&lt;/code&gt;. Cheats like this are not allowed in an official run but here we are just looking. So we change the mention of the &lt;code&gt;customer&lt;/code&gt; table in the &lt;code&gt;FROM&lt;/code&gt; clause from &lt;code&gt;FROM ... customer, ...&lt;/code&gt; to &lt;code&gt;FROM ... customer TABLE OPTION (loop), ...&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 1.4e-06% fanout 1 input 1 rows time 9e-07% fanout 1 input 1 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here was the hash build in the previous plan; now we start direct with the scan of &lt;code&gt;lineitem&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 2.2e-06% fanout 1 input 1 rows { fork time 2.3e-06% fanout 1 input 1 rows { fork time 11% fanout 6.00038e+08 input 1 rows LINEITEM 6e+08 rows(t5.L_ORDERKEY, t5.L_QUANTITY) time 78% fanout 1.17743e-05 input 6.00038e+08 rows Sort streaming with duplicates (t5.L_ORDERKEY) -&amp;gt; (t5.L_QUANTITY) time 11% fanout 21231.4 input 7065 rows group by read node (t5.L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 After code: 0: L_ORDERKEY := := artm t5.L_ORDERKEY 4: BReturn 0 time 0.0014% fanout 1 input 1063 rows Subquery Select(L_ORDERKEY) time 0.051% fanout 1 input 1063 rows ORDERS unq 0.97 rows (.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE) inlined O_ORDERKEY = L_ORDERKEY &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- We note that getting the 1063 &lt;code&gt;customers&lt;/code&gt; by index takes no time, and there is no hash table to build &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.023% fanout 1 input 1063 rows CUSTOMER unq 0.99 rows (.C_CUSTKEY, .C_NAME) inlined C_CUSTKEY = .O_CUSTKEY time 0.021% fanout 7 input 1063 rows LINEITEM 4.3 rows(.L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The rest is identical to the previous plan, cut for brevity &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 3852 msec 2311% cpu, 3213 rnd 5.99907e+08 seq 0.124456% same seg 1.08899% same pg Compilation: 1 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We save over 2s of real time. But the problem is how to know that very few &lt;code&gt;customers&lt;/code&gt; will be hit. One could make a calculation that &lt;code&gt;l_quantity&lt;/code&gt; is between 1 and 50, and that an &lt;code&gt;order&lt;/code&gt; has an average of 4 &lt;code&gt;lineitems&lt;/code&gt; with a maximum of 7. For the &lt;code&gt;SUM&lt;/code&gt; to be over 312, only &lt;code&gt;orders&lt;/code&gt; with 7 &lt;code&gt;lineitems&lt;/code&gt; are eligible, and even so the &lt;code&gt;l_quantities&lt;/code&gt; must all be high. Assuming flat distributions, which here happens to be the case, one could estimate that the condition selects very few &lt;code&gt;orders&lt;/code&gt;. The problem is that real data with this kind of regularity is sight unseen, so such a trick, while allowed, would just work for benchmarks.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;As it happens, there is a better way. We also note that the query selects the &lt;code&gt;TOP 100 orders&lt;/code&gt; with the highest &lt;code&gt;o_totalprice&lt;/code&gt;. This is a very common pattern; there is almost always a &lt;code&gt;TOP k&lt;/code&gt; clause in analytics queries unless they &lt;code&gt;GROUP BY&lt;/code&gt; something that is known to be of low cardinality, like nation or year.&lt;/p&gt; &lt;p&gt;If the ordering falls on a grouping column, as soon as there are enough groups generated to fill a &lt;code&gt;TOP 100&lt;/code&gt;, one can take the lowest &lt;code&gt;o_totalprice&lt;/code&gt; as a limit and add this into the query as an extra restriction. Every time the &lt;code&gt;TOP 100&lt;/code&gt; changes, the condition becomes more selective, as the 100th highest &lt;code&gt;o_totalprice&lt;/code&gt; increases.&lt;/p&gt; &lt;p&gt;Sometimes the ordering falls on the aggregation result, which is not known until the aggregation is finished. However, in lookup-style queries, it is common to take the latest-so-many events or just the &lt;code&gt;TOP k&lt;/code&gt; items by some metric. In these cases, pushing the &lt;code&gt;TOP k&lt;/code&gt; restriction down into the selection always works.&lt;/p&gt; &lt;p&gt;So, we try this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 4e-06% fanout 1 input 1 rows time 6.1e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The plan begins with &lt;code&gt;orders&lt;/code&gt;, as we now expect a selection on &lt;code&gt;o_totalprice&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- We see that out of 150M &lt;code&gt;orders&lt;/code&gt;, a little over 10M survive the &lt;code&gt;o_totalprice&lt;/code&gt; selection, which gets more restrictive as the query proceeds. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 33% fanout 1.00628e+07 input 1 rows ORDERS 4.3e+04 rows(.O_TOTALPRICE, .O_ORDERKEY, .O_CUSTKEY, .O_ORDERDATE) top k on O_TOTALPRICE time 32% fanout 3.50797e-05 input 1.00628e+07 rows END Node After test: 0: if ({ &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;IN&lt;/code&gt; subquery is here kept as a subquery, not flattened. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 0.42% fanout 1 input 1.00628e+07 rows time 11% fanout 4.00136 input 1.00628e+07 rows LINEITEM 4 rows(.L_ORDERKEY, .L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY time 21% fanout 2.55806e-05 input 4.02649e+07 rows Sort streaming with duplicates (set_ctr, .L_ORDERKEY) -&amp;gt; (.L_QUANTITY) time 2.4% fanout 9769.72 input 1030 rows group by read node (gb_set_no, .L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 time 0.00047% fanout 0 input 353 rows Subquery Select( &lt;none&gt; ) } ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 &lt;/none&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here we see that fewer &lt;code&gt;customers&lt;/code&gt; are accessed than in the non-&lt;code&gt;TOP k&lt;/code&gt; plans, since there is an extra cut on &lt;code&gt;o_totalprice&lt;/code&gt; that takes effect earlier &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.013% fanout 1 input 353 rows CUSTOMER unq 1 rows (.C_CUSTKEY, .C_NAME) inlined C_CUSTKEY = k_.O_CUSTKEY time 0.0079% fanout 7 input 353 rows LINEITEM 4 rows(.L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY time 0.0063% fanout 0.0477539 input 2471 rows Sort streaming with duplicates (.C_CUSTKEY, .O_ORDERKEY) -&amp;gt; (.L_QUANTITY, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.0088% fanout 2.99153 input 118 rows group by read node (.C_CUSTKEY, .O_ORDERKEY, aggregate, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.0063% fanout 0 input 353 rows Sort (.O_TOTALPRICE, .O_ORDERDATE) -&amp;gt; (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, aggregate) } time 8.5e-05% fanout 100 input 1 rows top order by read (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) time 2.7e-06% fanout 0 input 100 rows Select (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) } 949 msec 2179% cpu, 1.00486e+07 rnd 4.71013e+07 seq 99.9267% same seg 0.0318055% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Here we see that the time is about 4x better than with the cheat version. We note that about 10M of 1.5e8 &lt;code&gt;orders&lt;/code&gt; get considered. After going through the first 10% or so of &lt;code&gt;orders&lt;/code&gt;, there is a &lt;code&gt;TOP 100&lt;/code&gt;, and a condition on &lt;code&gt;o_totalprice&lt;/code&gt; that will drop most &lt;code&gt;orders&lt;/code&gt; can be introduced.&lt;/p&gt; &lt;p&gt;If we set the condition on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;quantity&lt;/code&gt; so that no &lt;code&gt;orders&lt;/code&gt; match, there is no &lt;code&gt;TOP k&lt;/code&gt; at any point, and we get a time of 6.8s, which is a little worse than the initial time with the flattened &lt;code&gt;IN&lt;/code&gt;. But since the &lt;code&gt;TOP k&lt;/code&gt; trick does not allocate memory, it is relatively safe even in cases where it does not help.&lt;/p&gt; &lt;p&gt;We can argue that the &lt;code&gt;TOP k&lt;/code&gt; pushdown trick is more robust than guessing the selectivity of a &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt;. Further, it applies to a broad range of lookup queries, while the &lt;code&gt;SUM&lt;/code&gt; trick applies to only TPC-H Q18, or close enough. Thus, the &lt;code&gt;TOP k&lt;/code&gt; trick is safer and more generic. &lt;/p&gt; &lt;p&gt;We are approaching the end of the TPC-H blog series, with still two families of tricks to consider, namely, moving predicates between subqueries, and late projection. After this we will look at results and the overall picture.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2248e18&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x241bd578&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x5dcfd38&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x7fe33c8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x23036cb8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x113fd508&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x23446f28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x148aee58&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aabf0e42c58&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1e6c0338&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2bb7d2f8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac6eb08118&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac304469f8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x1a8e5d48&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x17f75d48&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0xfe9fe98&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac657476a8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac0407cd98&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:34.804262-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 9 of n): TPC-H Q18, Ordered Aggregation, and Top K</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-03-17#1779</atom:id>
  <atom:published>2014-03-17T16:41:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here return to polishing the cutting edge, the high geekcraft of database. We will look at more of the wonders of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x256ad6b8&quot;&gt;TPC-H&lt;/a&gt; and cover two more tricks. The experts can skip the preliminaries and go to the query profiles; for the others, there is some explanation first.&lt;/p&gt; &lt;p&gt;From the TPC-H specification:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, SUM ( l_quantity ) FROM customer, orders, lineitem WHERE o_orderkey IN ( SELECT l_orderkey FROM lineitem GROUP BY l_orderkey HAVING SUM ( l_quantity ) &amp;gt; 312 ) AND c_custkey = o_custkey AND o_orderkey = l_orderkey GROUP BY c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice ORDER BY o_totalprice DESC, o_orderdate &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The intent of the query is to return &lt;code&gt;order&lt;/code&gt; and &lt;code&gt;customer&lt;/code&gt; information for cases where an &lt;code&gt;order&lt;/code&gt; involves a large quantity of &lt;code&gt;items&lt;/code&gt;, with highest-value &lt;code&gt;orders&lt;/code&gt; first. &lt;/p&gt; &lt;p&gt;We note that the only restriction in the query is the one on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt; in the &lt;code&gt;IN&lt;/code&gt; subquery. Everything else is a full scan or a &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Join_(SQL)&quot; id=&quot;link-id0x19919558&quot;&gt;JOIN&lt;/a&gt;&lt;/code&gt; on a &lt;a href=&quot;http://dbpedia.org/page/Foreign_key&quot; id=&quot;link-id0x1fc089f8&quot;&gt;foreign key&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Now, the first query optimization rule of thumb could be summarized as &lt;i&gt;start from the small.&lt;/i&gt; &lt;i&gt;Small&lt;/i&gt; here means something that is restricted; it does not mean small table. Smallest is the one from which the highest percentage is dropped via a condition that does not depend on other tables.&lt;/p&gt; &lt;p&gt;The next rule of thumb is to try starting from the large, if the large has a restricting &lt;code&gt;join&lt;/code&gt;; for example, scan all the &lt;code&gt;lineitems&lt;/code&gt; and hash join to &lt;code&gt;parts&lt;/code&gt; that are green and of a given brand. In this case, the idea is to make a hash table from the small side and sequentially scan the large side, dropping everything that does not match something in the hash table.&lt;/p&gt; &lt;p&gt;The only restriction here is on &lt;code&gt;orders&lt;/code&gt; via a &lt;code&gt;join&lt;/code&gt; on &lt;code&gt;lineitem&lt;/code&gt;. So, the &lt;code&gt;IN&lt;/code&gt; subquery can be flattened, so as to read like --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ... FROM ( SELECT l_orderkey, SUM ( l_quantity ) FROM lineitem GROUP BY l_orderkey HAVING SUM ( l_quantity ) &amp;gt; 312 ) f, orders, customer, lineitem WHERE f.l_orderkey = o_orderkey .... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The above (left to right) is the best &lt;code&gt;JOIN&lt;/code&gt; order for this type of plan. We start from the restriction, and for all the rest the &lt;code&gt;JOIN&lt;/code&gt; is foreign key to primary key, sometimes &lt;code&gt;n:1&lt;/code&gt; (&lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;), sometimes &lt;code&gt;1:n&lt;/code&gt; (&lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;lineitem&lt;/code&gt;). A &lt;code&gt;1:n&lt;/code&gt; is usually best by index; an &lt;code&gt;n:1&lt;/code&gt; can be better by hash if there are enough tuples on the n side to make it worthwhile to build the hash table.&lt;/p&gt; &lt;p&gt;We note that the first &lt;code&gt;GROUP BY&lt;/code&gt; makes a very large number of groups, e.g., 150M at 100 Gtriple scale. We also note that if &lt;code&gt;lineitem&lt;/code&gt; is ordered so that the &lt;code&gt;lineitems&lt;/code&gt; of a single &lt;code&gt;order&lt;/code&gt; are together, the &lt;code&gt;GROUP BY&lt;/code&gt; is ordered. In other words, once you have seen a specific value of &lt;code&gt;l_orderkey&lt;/code&gt; change to the next, you will not see the old value again. In this way, the groups do not have to be remembered for all time. The &lt;code&gt;GROUP BY&lt;/code&gt; produces a stream of results as the scan of &lt;code&gt;lineitem&lt;/code&gt; proceeds.&lt;/p&gt; &lt;p&gt;Considering vectored execution, the &lt;code&gt;GROUP BY&lt;/code&gt; does remember a bunch of groups, up to a vector size worth, so that output from the &lt;code&gt;GROUP BY&lt;/code&gt; is done in large enough batches, not a tuple at a time.&lt;/p&gt; &lt;p&gt;Considering parallelization, the scan of &lt;code&gt;lineitem&lt;/code&gt; must be split in such a way that all &lt;code&gt;lineitems&lt;/code&gt; with the same &lt;code&gt;l_orderkey&lt;/code&gt; get processed by the same thread. If this is the case, all threads will produce an independent stream of results that is guaranteed to need no merge with the output of another thread.&lt;/p&gt; &lt;p&gt;So, we can try this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6e-06% fanout 1 input 1 rows time 4.5% fanout 1 input 1 rows { hash filler &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Make a hash table from &lt;code&gt;c_custkey&lt;/code&gt; to &lt;code&gt;c_name&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.99% fanout 1.5e+07 input 1 rows CUSTOMER 1.5e+07 rows(.C_CUSTKEY, .C_NAME) time 0.81% fanout 0 input 1.5e+07 rows Sort hf 35 (.C_CUSTKEY) -&amp;gt; (.C_NAME) } time 2.2e-05% fanout 1 input 1 rows time 1.6e-05% fanout 1 input 1 rows { fork time 5.2e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Scan &lt;code&gt;lineitem&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 10% fanout 6.00038e+08 input 1 rows LINEITEM 6e+08 rows(t5.L_ORDERKEY, t5.L_QUANTITY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Ordered &lt;code&gt;GROUP BY&lt;/code&gt; (streaming with duplicates) &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 73% fanout 1.17743e-05 input 6.00038e+08 rows Sort streaming with duplicates (t5.L_ORDERKEY) -&amp;gt; (t5.L_QUANTITY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The ordered aggregation above emits a batch of results every so often, having accumulated 20K or so groups (&lt;code&gt;DISTINCT l_orderkey&lt;/code&gt;&amp;#39;s)&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The operator below reads the batch and sends it onward, the &lt;code&gt;GROUP BY&lt;/code&gt; hash table for the next batch.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 10% fanout 21231.4 input 7065 rows group by read node (t5.L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 After code: 0: L_ORDERKEY := := artm t5.L_ORDERKEY 4: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- This marks the end of the flattened &lt;code&gt;IN&lt;/code&gt; subquery. 1063 out of 150M groups survive the test on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The main difficulty of Q18 is guessing that this condition is this selective.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.0013% fanout 1 input 1063 rows Subquery Select(L_ORDERKEY) time 0.058% fanout 1 input 1063 rows ORDERS unq 0.97 rows (.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE) inlined O_ORDERKEY = L_ORDERKEY hash partition+bloom by 42 (tmp)hash join merged always card 0.99 -&amp;gt; (.C_NAME) time 0.0029% fanout 1 input 1063 rows Hash source 35 merged into ts 0.99 rows(.O_CUSTKEY) -&amp;gt; (.C_NAME) After code: 0: .C_CUSTKEY := := artm .O_CUSTKEY 4: BReturn 0 time 0.018% fanout 7 input 1063 rows LINEITEM 4.3 rows(.L_QUANTITY) inlined L_ORDERKEY = .O_ORDERKEY time 0.011% fanout 0 input 7441 rows Sort (.C_CUSTKEY, .O_ORDERKEY) -&amp;gt; (.L_QUANTITY, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) } time 0.00026% fanout 1063 input 1 rows group by read node (.C_CUSTKEY, .O_ORDERKEY, aggregate, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.00061% fanout 0 input 1063 rows Sort (.O_TOTALPRICE, .O_ORDERDATE) -&amp;gt; (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, aggregate) } time 1.7e-05% fanout 100 input 1 rows top order by read (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) time 1.2e-06% fanout 0 input 100 rows Select (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) } 6351 msec 1470% cpu, 2151 rnd 6.14898e+08 seq 0.185874% same seg 1.57993% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;What is wrong with this? The result is not bad, in the ballpark with &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x257913e8&quot;&gt;VectorWise&lt;/a&gt; published results (4.9s on a slightly faster box), but better is possible. We note that there is a hash join from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;. Only 1K &lt;code&gt;customers&lt;/code&gt; of 15M get hit. The whole hash table of 15M entries is built in vain. Let&amp;#39;s cheat and declare the &lt;code&gt;join&lt;/code&gt; to be by &lt;code&gt;index&lt;/code&gt;. Cheats like this are not allowed in an official run but here we are just looking. So we change the mention of the &lt;code&gt;customer&lt;/code&gt; table in the &lt;code&gt;FROM&lt;/code&gt; clause from &lt;code&gt;FROM ... customer, ...&lt;/code&gt; to &lt;code&gt;FROM ... customer TABLE OPTION (loop), ...&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 1.4e-06% fanout 1 input 1 rows time 9e-07% fanout 1 input 1 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here was the hash build in the previous plan; now we start direct with the scan of &lt;code&gt;lineitem&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 2.2e-06% fanout 1 input 1 rows { fork time 2.3e-06% fanout 1 input 1 rows { fork time 11% fanout 6.00038e+08 input 1 rows LINEITEM 6e+08 rows(t5.L_ORDERKEY, t5.L_QUANTITY) time 78% fanout 1.17743e-05 input 6.00038e+08 rows Sort streaming with duplicates (t5.L_ORDERKEY) -&amp;gt; (t5.L_QUANTITY) time 11% fanout 21231.4 input 7065 rows group by read node (t5.L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 After code: 0: L_ORDERKEY := := artm t5.L_ORDERKEY 4: BReturn 0 time 0.0014% fanout 1 input 1063 rows Subquery Select(L_ORDERKEY) time 0.051% fanout 1 input 1063 rows ORDERS unq 0.97 rows (.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE) inlined O_ORDERKEY = L_ORDERKEY &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- We note that getting the 1063 &lt;code&gt;customers&lt;/code&gt; by index takes no time, and there is no hash table to build &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.023% fanout 1 input 1063 rows CUSTOMER unq 0.99 rows (.C_CUSTKEY, .C_NAME) inlined C_CUSTKEY = .O_CUSTKEY time 0.021% fanout 7 input 1063 rows LINEITEM 4.3 rows(.L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The rest is identical to the previous plan, cut for brevity &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 3852 msec 2311% cpu, 3213 rnd 5.99907e+08 seq 0.124456% same seg 1.08899% same pg Compilation: 1 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We save over 2s of real time. But the problem is how to know that very few &lt;code&gt;customers&lt;/code&gt; will be hit. One could make a calculation that &lt;code&gt;l_quantity&lt;/code&gt; is between 1 and 50, and that an &lt;code&gt;order&lt;/code&gt; has an average of 4 &lt;code&gt;lineitems&lt;/code&gt; with a maximum of 7. For the &lt;code&gt;SUM&lt;/code&gt; to be over 312, only &lt;code&gt;orders&lt;/code&gt; with 7 &lt;code&gt;lineitems&lt;/code&gt; are eligible, and even so the &lt;code&gt;l_quantities&lt;/code&gt; must all be high. Assuming flat distributions, which here happens to be the case, one could estimate that the condition selects very few &lt;code&gt;orders&lt;/code&gt;. The problem is that real data with this kind of regularity is sight unseen, so such a trick, while allowed, would just work for benchmarks.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;*           *           *           *           *&lt;/p&gt; &lt;p&gt;As it happens, there is a better way. We also note that the query selects the &lt;code&gt;TOP 100 orders&lt;/code&gt; with the highest &lt;code&gt;o_totalprice&lt;/code&gt;. This is a very common pattern; there is almost always a &lt;code&gt;TOP k&lt;/code&gt; clause in analytics queries unless they &lt;code&gt;GROUP BY&lt;/code&gt; something that is known to be of low cardinality, like nation or year.&lt;/p&gt; &lt;p&gt;If the ordering falls on a grouping column, as soon as there are enough groups generated to fill a &lt;code&gt;TOP 100&lt;/code&gt;, one can take the lowest &lt;code&gt;o_totalprice&lt;/code&gt; as a limit and add this into the query as an extra restriction. Every time the &lt;code&gt;TOP 100&lt;/code&gt; changes, the condition becomes more selective, as the 100th highest &lt;code&gt;o_totalprice&lt;/code&gt; increases.&lt;/p&gt; &lt;p&gt;Sometimes the ordering falls on the aggregation result, which is not known until the aggregation is finished. However, in lookup-style queries, it is common to take the latest-so-many events or just the &lt;code&gt;TOP k&lt;/code&gt; items by some metric. In these cases, pushing the &lt;code&gt;TOP k&lt;/code&gt; restriction down into the selection always works.&lt;/p&gt; &lt;p&gt;So, we try this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 4e-06% fanout 1 input 1 rows time 6.1e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The plan begins with &lt;code&gt;orders&lt;/code&gt;, as we now expect a selection on &lt;code&gt;o_totalprice&lt;/code&gt; &lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- We see that out of 150M &lt;code&gt;orders&lt;/code&gt;, a little over 10M survive the &lt;code&gt;o_totalprice&lt;/code&gt; selection, which gets more restrictive as the query proceeds. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 33% fanout 1.00628e+07 input 1 rows ORDERS 4.3e+04 rows(.O_TOTALPRICE, .O_ORDERKEY, .O_CUSTKEY, .O_ORDERDATE) top k on O_TOTALPRICE time 32% fanout 3.50797e-05 input 1.00628e+07 rows END Node After test: 0: if ({ &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;IN&lt;/code&gt; subquery is here kept as a subquery, not flattened. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 0.42% fanout 1 input 1.00628e+07 rows time 11% fanout 4.00136 input 1.00628e+07 rows LINEITEM 4 rows(.L_ORDERKEY, .L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY time 21% fanout 2.55806e-05 input 4.02649e+07 rows Sort streaming with duplicates (set_ctr, .L_ORDERKEY) -&amp;gt; (.L_QUANTITY) time 2.4% fanout 9769.72 input 1030 rows group by read node (gb_set_no, .L_ORDERKEY, aggregate) END Node After test: 0: if (aggregate &amp;gt; 312 ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 time 0.00047% fanout 0 input 353 rows Subquery Select( &lt;none&gt; ) } ) then 4 else 5 unkn 5 4: BReturn 1 5: BReturn 0 &lt;/none&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here we see that fewer &lt;code&gt;customers&lt;/code&gt; are accessed than in the non-&lt;code&gt;TOP k&lt;/code&gt; plans, since there is an extra cut on &lt;code&gt;o_totalprice&lt;/code&gt; that takes effect earlier &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.013% fanout 1 input 353 rows CUSTOMER unq 1 rows (.C_CUSTKEY, .C_NAME) inlined C_CUSTKEY = k_.O_CUSTKEY time 0.0079% fanout 7 input 353 rows LINEITEM 4 rows(.L_QUANTITY) inlined L_ORDERKEY = k_.O_ORDERKEY time 0.0063% fanout 0.0477539 input 2471 rows Sort streaming with duplicates (.C_CUSTKEY, .O_ORDERKEY) -&amp;gt; (.L_QUANTITY, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.0088% fanout 2.99153 input 118 rows group by read node (.C_CUSTKEY, .O_ORDERKEY, aggregate, .O_TOTALPRICE, .O_ORDERDATE, .C_NAME) time 0.0063% fanout 0 input 353 rows Sort (.O_TOTALPRICE, .O_ORDERDATE) -&amp;gt; (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, aggregate) } time 8.5e-05% fanout 100 input 1 rows top order by read (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) time 2.7e-06% fanout 0 input 100 rows Select (.C_NAME, .C_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_TOTALPRICE, aggregate) } 949 msec 2179% cpu, 1.00486e+07 rnd 4.71013e+07 seq 99.9267% same seg 0.0318055% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Here we see that the time is about 4x better than with the cheat version. We note that about 10M of 1.5e8 &lt;code&gt;orders&lt;/code&gt; get considered. After going through the first 10% or so of &lt;code&gt;orders&lt;/code&gt;, there is a &lt;code&gt;TOP 100&lt;/code&gt;, and a condition on &lt;code&gt;o_totalprice&lt;/code&gt; that will drop most &lt;code&gt;orders&lt;/code&gt; can be introduced.&lt;/p&gt; &lt;p&gt;If we set the condition on the &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;quantity&lt;/code&gt; so that no &lt;code&gt;orders&lt;/code&gt; match, there is no &lt;code&gt;TOP k&lt;/code&gt; at any point, and we get a time of 6.8s, which is a little worse than the initial time with the flattened &lt;code&gt;IN&lt;/code&gt;. But since the &lt;code&gt;TOP k&lt;/code&gt; trick does not allocate memory, it is relatively safe even in cases where it does not help.&lt;/p&gt; &lt;p&gt;We can argue that the &lt;code&gt;TOP k&lt;/code&gt; pushdown trick is more robust than guessing the selectivity of a &lt;code&gt;SUM&lt;/code&gt; of &lt;code&gt;l_quantity&lt;/code&gt;. Further, it applies to a broad range of lookup queries, while the &lt;code&gt;SUM&lt;/code&gt; trick applies to only TPC-H Q18, or close enough. Thus, the &lt;code&gt;TOP k&lt;/code&gt; trick is safer and more generic. &lt;/p&gt; &lt;p&gt;We are approaching the end of the TPC-H blog series, with still two families of tricks to consider, namely, moving predicates between subqueries, and late projection. After this we will look at results and the overall picture.&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; (TPC-H) Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2248e18&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x241bd578&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x5dcfd38&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x7fe33c8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x23036cb8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x113fd508&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x23446f28&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x148aee58&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac0ff1b258&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1ed06068&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac112545d8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac6ffdaa48&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0xb138588&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x18371518&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe9ec1af8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aac00f9a958&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabcac19228&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd0bbd438&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:23.062020-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Plenary and Open Data Meet-up in Mannheim</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-02-26#1778</atom:id>
  <atom:published>2014-02-26T20:38:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was a &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2d6bfc28&quot;&gt;LOD2&lt;/a&gt; plenary meeting hosted by &lt;a href=&quot;http://www.bizer.de/&quot; id=&quot;link-id0x296a4c18&quot;&gt;Chris Bizer&lt;/a&gt; from the &lt;a href=&quot;http://lod2.eu/Partner/fub.html&quot; id=&quot;link-id0x2ec8dd58&quot;&gt;University of Mannheim&lt;/a&gt; this week.&lt;/p&gt; &lt;p&gt;The plenary meeting was preceded by a &lt;a href=&quot;http://www.meetup.com/OpenKnowledgeFoundation/Mannheim-DE/1092882/&quot; id=&quot;link-id0x2aac23993228&quot;&gt;Linked Open Data Meetup&lt;/a&gt; with talks from &lt;a href=&quot;http://dbpedia.org/page/Springer_Science+Business_Media&quot; id=&quot;link-id0x2bc7f2a8&quot;&gt;Springer&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Fluid_Operations&quot; id=&quot;link-id0x1b077a48&quot;&gt;fluid Operations&lt;/a&gt;, and several LOD2 partners (&lt;a href=&quot;http://lod2.eu/Partner/ulei.html&quot; id=&quot;link-id0x2aac269eb678&quot;&gt;Universität Leipzig&lt;/a&gt;, &lt;a href=&quot;http://lod2.eu/Partner/fub.html&quot; id=&quot;link-id0x2aac26cf1fb8&quot;&gt;University of Mannheim&lt;/a&gt;, the &lt;a href=&quot;http://lod2.eu/Partner/swc.html&quot; id=&quot;link-id0x2aac25abb8f8&quot;&gt;Semantic Web Company&lt;/a&gt;, and &lt;a href=&quot;http://lod2.eu/Partner/wkd.html&quot; id=&quot;link-id0x300c2308&quot;&gt;Wolters Kluwer Deutschland GmbH (WKD)&lt;/a&gt;).&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://lod2.eu/Partner/wkd.html&quot; id=&quot;link-id0x300c2308&quot;&gt;Wolters Kluwer Deutschland GmbH (WKD)&lt;/a&gt; gave a presentation on the content production pipeline of their legal publications and their experiences in incorporating LOD2 technologies for content enrichment. This is a very successful LOD2 use case and demonstrates the value of &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms.ttl%23LinkedData&quot; id=&quot;link-id0x10705738&quot;&gt;linked data&lt;/a&gt; for the information industry.&lt;/p&gt; &lt;p&gt;Springer gave a talk about their interest in linked data for enriching the Lecture Notes in Computer Science product. Also conference proceedings could be enhanced with structured &lt;a href=&quot;http://www.openlinksw.com/href&quot; id=&quot;link-id0x19279a98&quot;&gt;metadata&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2c1e8c38&quot;&gt;RDF&lt;/a&gt;. I asked about nanopublications. The comment was that content authors might perceive nanopublications as an extra imposition. On the other hand, in the life sciences field there is a lot of enthusiasm for the idea. We will see; anyway, biology will likely lead the way for nanopublications. I referred &lt;a href=&quot;http://www.linkedin.com/in/aliaksandrbirukou&quot; id=&quot;link-id0x2ba061b8&quot;&gt;Aliaksandr Birukou&lt;/a&gt; of Springer to the companies &lt;a href=&quot;http://www.linkedin.com/company/euretos&quot; id=&quot;link-id0x2bcc5dc8&quot;&gt;Euretos&lt;/a&gt; and its parent S&amp;amp;T in Delft, Netherlands, and to &lt;a href=&quot;http://dbpedia.org/resource/Barend_Mons&quot; id=&quot;link-id0x2e4a9918&quot;&gt;Barend Mons&lt;/a&gt;, scientific director of &lt;a href=&quot;http://dbpedia.org/page/Netherlands_Bioinformatics_Centre&quot; id=&quot;link-id0x2b2dc518&quot;&gt;NBIC&lt;/a&gt;, the Netherlands Bioinformatics Centre. These are among the founding fathers of the Nano Republic, as they themselves put it.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://bis.informatik.uni-leipzig.de/SebastianHellmann&quot; id=&quot;link-id0x2aac3c5cbcb8&quot;&gt;Sebastian Hellman&lt;/a&gt; gave a talk on efforts to set up the &lt;i&gt;DBpedia Foundation&lt;/i&gt; as a not-for-profit organization, hopefully in the next 10 days, to aid in the sustainability and growth of the &lt;a href=&quot;http://dbpedia.org/&quot; id=&quot;link-id0x2aac3ceb18e8&quot;&gt;DBpedia project&lt;/a&gt;. The Foundation would identify stakeholders, their interests, and ways to generate income to further improve DBpedia. Planned areas of improvement include the development of high-availability value-added DBpedia services with &lt;a href=&quot;http://dbpedia.org/page/Quality_of_service&quot; id=&quot;link-id0x2aac3c86f938&quot;&gt;quality of service (QoS)&lt;/a&gt; agreements for enterprise users; additional tools in the DBpedia stack to support improved and cost-efficient data curation and &lt;a href=&quot;http://wiki.dbpedia.org/Internationalization/&quot; id=&quot;link-id0x2aac27b1f388&quot;&gt;internationalization&lt;/a&gt;; and improved documentation, tutorials, and support to speed uptake.&lt;/p&gt; &lt;p&gt;I had a word with &lt;a href=&quot;http://www.linkedin.com/pub/peter-haase/0/100/90b&quot; id=&quot;link-id0x2b5ae2c8&quot;&gt;Peter Haase&lt;/a&gt; of fluid Operations about the &lt;a href=&quot;http://www.optique-project.eu/&quot; id=&quot;link-id0x2abfee08&quot;&gt;Optique project&lt;/a&gt; and their cloud management offerings. The claim is to do ontology-directed querying over thousands of terabytes of heterogenous data. This turns out to be a full-force attempt at large scale &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2e1dac08&quot;&gt;SQL&lt;/a&gt; federation with ontology-directed query rewriting for covering &lt;a href=&quot;http://www.w3.org/TR/owl2-profiles/#OWL_2_QL&quot; id=&quot;link-id0x31883b48&quot;&gt;OWL 2 QL&lt;/a&gt; semantics. With &lt;a href=&quot;http://dbpedia.org/page/Ian_Horrocks&quot; id=&quot;link-id0x321f9f48&quot;&gt;Ian Horrocks&lt;/a&gt; of Oxford leading the ontology side, the matter is in good hands. Still the matter is not without its problems. Simple lookups can be directed to the data but if there are terabytes of it, it is more likely that &lt;a href=&quot;http://dbpedia.org/page/Aggregate_function&quot; id=&quot;link-id0x1c8bf838&quot;&gt;aggregations&lt;/a&gt; are what is desired. Federated aggregation tends to move a lot of data. So the problems are as they ever were. However, if the analytics are already done and stored in the relational space, finding these based on ontologies is a worthwhile thing for streamlining end user access to information.&lt;/p&gt; &lt;p&gt;The LOD2 plenary itself was structured in the usual way, covering the work packages in two parallel tracks. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/wp-content/uploads/2014/02/group-LOD2-Plenary-Mannheim.jpg&quot; id=&quot;link-id0x2aac2605aab8&quot;&gt;&lt;img title=&quot;LOD2 Plenary Group Photo, Mannheim, February 2014&quot; src=&quot;http://lod2.eu/BlogPost/wp-content/uploads/2014/02/group-LOD2-Plenary-Mannheim.jpg&quot; alt=&quot;LOD2 Plenary Group Photo, Mannheim, February 2014&quot; height=&quot;320&quot; /&gt; &lt;/a&gt; &lt;br /&gt; LOD2 Plenary Group Photo, Mannheim, February 2014&lt;/p&gt; &lt;p&gt;On the database side, the final victory will be won by going to adaptive schema for RDF. We brought the RDF penalty against relational to a factor of 2.5 for common analytics style queries, e.g., Star Schema Benchmark. This is a comparison to &lt;a href=&quot;http://dbpedia.org/page/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2f1aef48&quot;&gt;Virtuoso&lt;/a&gt; SQL, which offers very high performance in this workload, over 2x the speed of column store pioneer &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x25e019f8&quot;&gt;MonetDB&lt;/a&gt; and 300x &lt;a href=&quot;http://dbpedia.org/page/MySQL&quot; id=&quot;link-id0x26670158&quot;&gt;MySQL&lt;/a&gt;. So this is where matters stand. To move them significantly forward, exploitation of structure for guiding physical storage will be needed. Also the project still has to deliver the 500 Gtriple results. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x300bca28&quot;&gt;experiments around Christmas&lt;/a&gt; at CWI support the possibility, but they are not final. Putting triples into tables when the triples in fact form table-shaped structures, which is the case most of the time, may turn out to be necessary for this. At least, this will be a significant help.&lt;/p&gt; &lt;p&gt;Be the case as it may, using a table schema for regularly shaped data, while preserving the RDF quad flexibility, would essentially abolish the RDF tax and bring the LOD2 project to a glorious conclusion in August.&lt;/p&gt; &lt;p&gt;I took the poetic license to compare the data journey into RDF and back to the Egyptian myth of Osiris: The data gets shut in a silo and then gets cut into 14 pieces; and subsequently thrown into the Nile (i.e., the LOD cloud, or the CKAN catalog). Grief-stricken Isis sees what is become of her love: She patiently reassembles the pieces, reconstructing Osiris in fact so well that he sires her a child, hawk-headed Horus, who proceeds to reclaim his father’s honor. (See, Isis means Intelligent Structured Information Storage.)&lt;/p&gt; &lt;p&gt;I had many interesting conversations with Chris Bizer about his research in data integration, working with the 150M HTML tables in the common crawl. The idea is to resolve references and combine data from the tables. Interestingly enough, the data model in these situations is basically triples, while these are generally not stored as RDF but in Lucene. This makes sense due to the string-matching nature of the task. There appears to be opportunity in bringing together the state of the art in database, meaning the very highly optimized column-store and vectored execution in Virtuoso with the search-style workload found in instance matching and other data integration tasks. The promise goes in the direction of very fast &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2f21cfb8&quot;&gt;ETL&lt;/a&gt; and subsequent discovery of structural commonalities and enrichment possibilities. This is also not infinitely far from the schema discovery that one may do in order to adaptively optimize storage based on the data.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/volha-bryl/10/451/333&quot; id=&quot;link-id0x2f0cceb8&quot;&gt;Volha Bryl&lt;/a&gt; gave a very good overview of the Mannheim work in the data integration domain. For example, learning data fusion rules from examples of successful conflict resolution seems very promising. Learning text extraction rules from examples is also interesting. The problem of data integration is that the tasks are very heterogenous and therefore data integration suites have very large numbers of distinct tools. This is labor intensive but there is progress in automation. An error-free, or near enough, data product remains case by case and has human curation but automatic methods seem, based on Volha’s and Chris’ presentation, to be in the ballpark for statistics.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/in/giovannitummarello&quot; id=&quot;link-id0x24ebe6d8&quot;&gt;Giovanni Tummarello&lt;/a&gt; of &lt;a href=&quot;http://insight-centre.org/&quot; id=&quot;link-id0x312ab898&quot;&gt;Insight&lt;/a&gt;/&lt;a href=&quot;http://www.sindicetech.com/&quot; id=&quot;link-id0x300ba528&quot;&gt;SindiceTech&lt;/a&gt;, always the life of the party, presented his &lt;a href=&quot;http://dbpedia.org/page/Apache_Solr&quot; id=&quot;link-id0x2c299518&quot;&gt;Solr&lt;/a&gt;-based relational faceted browser. The idea is to show and drill down by facets over a set of related tables; in the demo, this was investments, investment targets, and investors. You can look at the data from any of the points and restrict the search based on attributes of any. Well, this is what a database does, right? That is so, but the Sindice tool is on top of Solr and actually materializes joins into a document. This blows up the data but has all the things colocated so it can even run from disk. We also talked about the &lt;a href=&quot;http://www.sindicetech.com/overview.html&quot; id=&quot;link-id0x2e061af8&quot;&gt;Knowledge Graph&lt;/a&gt; package Sindice offers on the Google cloud, this time a Virtuoso application. &lt;/p&gt; &lt;p&gt;We hope that negotiations between SindiceTech and Insight (formerly &lt;a href=&quot;http://dbpedia.org/page/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x2ac45b48&quot;&gt;DERI&lt;/a&gt;) around open sourcing the &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x256ad4f8&quot;&gt;SPARQL&lt;/a&gt; editor and other items come to a successful conclusion. The SPARQL editor especially would be of general interest to the RDF community. It is noteworthy that there is no SPARQL query builder in common use out there (even &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x26a4acb8&quot;&gt;OpenLink&lt;/a&gt;&amp;#39;s own open source &lt;a href=&quot;http://oat.openlinksw.com/index.html?isparql&quot; id=&quot;link-id0x2faa4398&quot;&gt;iSPARQL&lt;/a&gt; has been largely (but &lt;a href=&quot;http://answers.semanticweb.com/answer_link/13502/&quot; id=&quot;link-id0x2dedb8a8&quot;&gt;not entirely!&lt;/a&gt;) overlooked and misunderstood, though it&amp;#39;s been available as part of the &lt;a href=&quot;http://www.openlinksw.com/RPC2&quot; id=&quot;link-id0x17cab798&quot;&gt;OpenLink Ajax Toolkit&lt;/a&gt; for several years). OK, a query builder is useful when there is schema. But if the schema is an SQL one, as will be the case if RDF is adaptively stored, then any SQL query builder can be applied to the regular portion of the data. 40 years of calendar time and millennia of person years have gone into making SQL front ends and these will become applicable overnight; Virtuoso does speak SQL, as you may know.&lt;/p&gt; &lt;p&gt;I had the breakout session about the database work in LOD2. What will be done is clear enough, the execution side is very good, and our coverage of the infinite space of query optimization continues to grow. One more revolution for storage may come about, as suggested above. There is not very much to discuss, just to execute. So I used the time to explain how you run &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT SUM ( l_extendedprice ) FROM lineitem , part WHERE l_partkey = p_partkey AND p_name LIKE &amp;#39;%green%&amp;#39;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Simple query, right? Sure, but application guys or sem-heads generally have no clue about how these in fact need to be done. I have the probably foolish belief that a little understanding of database, especially in the RDF space which does get hit by every query optimization problem, would be helpful. At least one would know what goes wrong. So I explained to Giovanni, who is in fact a good geek, that this is a hash join, and with only a little prompting he suggested that you should also put a Bloom filter in front of the hash. Good. So in the bar after dinner I was told I ought to teach. Maybe. But the students would have to be very fast and motivated. Anyway, the take-home message is that the DBMS must figure it out. In the SQL space this is easier, and of course, if most of RDF reduces to this, then RDF too will be more predictable in this department.&lt;/p&gt; &lt;p&gt;I talked with &lt;a href=&quot;http://www.linkedin.com/in/martinkaltenboeck&quot; id=&quot;link-id0x2303ff58&quot;&gt;Martin Kaltenböck&lt;/a&gt; of the &lt;a href=&quot;http://www.linkedin.com/company/919714&quot; id=&quot;link-id0x2e5a5908&quot;&gt;Semantic Web Company&lt;/a&gt; about his brilliant networking accomplishments around organizing the &lt;a href=&quot;http://www.data-forum.eu/&quot; id=&quot;link-id0x2d39f418&quot;&gt;European Data Forum&lt;/a&gt; and other activities. Martin is a great ambassador and lobbyist for linked data across Europe. Great work, also in generating visibility for LOD2.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/page/European_Union&quot; id=&quot;link-id0x2ef83908&quot;&gt;EU&lt;/a&gt; in general, thanks in great part to &lt;a href=&quot;http://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x25ef47c8&quot;&gt;Stefano Bertolo&lt;/a&gt;’s long term push in this direction, is putting increasing emphasis on measuring progress in the research it funds. This is one of the messages from the LOD2 review also. Database is the domain of performance race &lt;i&gt;par excellence;&lt;/i&gt; the matters on that side are well attended to by &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0xe514b98&quot;&gt;LDBC&lt;/a&gt; and, of course, the unimpeachably authoritative &lt;a href=&quot;http://dbpedia.org/page/TPC&quot; id=&quot;link-id0x2b4a1ac8&quot;&gt;TPC&lt;/a&gt;, among others. In other domains, measurement is harder, as it involves a human-curated ground truth for any extraction, linking, or other integration. There is good work in both Mannheim and Leipzig in these areas, and I may at some point take a closer look, but for now it is appropriate to stick to core database.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-27T10:57:43.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Plenary and Open Data Meet-up in Mannheim</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-02-26#1777</atom:id>
  <atom:published>2014-02-26T20:37:52Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was a &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2d6bfc28&quot;&gt;LOD2&lt;/a&gt; plenary meeting hosted by &lt;a href=&quot;http://www.bizer.de/&quot; id=&quot;link-id0x296a4c18&quot;&gt;Chris Bizer&lt;/a&gt; from the &lt;a href=&quot;http://lod2.eu/Partner/fub.html&quot; id=&quot;link-id0x2ec8dd58&quot;&gt;University of Mannheim&lt;/a&gt; this week.&lt;/p&gt; &lt;p&gt;The plenary meeting was preceded by a &lt;a href=&quot;http://www.meetup.com/OpenKnowledgeFoundation/Mannheim-DE/1092882/&quot; id=&quot;link-id0x3301ff08&quot;&gt;Linked Open Data Meetup&lt;/a&gt; with talks from &lt;a href=&quot;http://dbpedia.org/page/Springer_Science+Business_Media&quot; id=&quot;link-id0x2bc7f2a8&quot;&gt;Springer&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Fluid_Operations&quot; id=&quot;link-id0x1b077a48&quot;&gt;fluid Operations&lt;/a&gt;, and several LOD2 partners (&lt;a href=&quot;http://lod2.eu/Partner/ulei.html&quot; id=&quot;link-id0x341e6678&quot;&gt;Universität Leipzig&lt;/a&gt;, &lt;a href=&quot;http://lod2.eu/Partner/fub.html&quot; id=&quot;link-id0x316e4998&quot;&gt;University of Mannheim&lt;/a&gt;, the &lt;a href=&quot;http://lod2.eu/Partner/swc.html&quot; id=&quot;link-id0x353bbe58&quot;&gt;Semantic Web Company&lt;/a&gt;, and &lt;a href=&quot;http://lod2.eu/Partner/wkd.html&quot; id=&quot;link-id0x300c2308&quot;&gt;Wolters Kluwer Deutschland GmbH (WKD)&lt;/a&gt;).&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://lod2.eu/Partner/wkd.html&quot; id=&quot;link-id0x300c2308&quot;&gt;Wolters Kluwer Deutschland GmbH (WKD)&lt;/a&gt; gave a presentation on the content production pipeline of their legal publications and their experiences in incorporating LOD2 technologies for content enrichment. This is a very successful LOD2 use case and demonstrates the value of &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms.ttl%23LinkedData&quot; id=&quot;link-id0x10705738&quot;&gt;linked data&lt;/a&gt; for the information industry.&lt;/p&gt; &lt;p&gt;Springer gave a talk about their interest in linked data for enriching the Lecture Notes in Computer Science product. Also conference proceedings could be enhanced with structured &lt;a href=&quot;http://www.openlinksw.com/href&quot; id=&quot;link-id0x19279a98&quot;&gt;metadata&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x2c1e8c38&quot;&gt;RDF&lt;/a&gt;. I asked about nanopublications. The comment was that content authors might perceive nanopublications as an extra imposition. On the other hand, in the life sciences field there is a lot of enthusiasm for the idea. We will see; anyway, biology will likely lead the way for nanopublications. I referred &lt;a href=&quot;http://www.linkedin.com/in/aliaksandrbirukou&quot; id=&quot;link-id0x2ba061b8&quot;&gt;Aliaksandr Birukou&lt;/a&gt; of Springer to the companies &lt;a href=&quot;http://www.linkedin.com/company/euretos&quot; id=&quot;link-id0x2bcc5dc8&quot;&gt;Euretos&lt;/a&gt; and its parent S&amp;amp;T in Delft, Netherlands, and to &lt;a href=&quot;http://dbpedia.org/resource/Barend_Mons&quot; id=&quot;link-id0x2e4a9918&quot;&gt;Barend Mons&lt;/a&gt;, scientific director of &lt;a href=&quot;http://dbpedia.org/page/Netherlands_Bioinformatics_Centre&quot; id=&quot;link-id0x2b2dc518&quot;&gt;NBIC&lt;/a&gt;, the Netherlands Bioinformatics Centre. These are among the founding fathers of the Nano Republic, as they themselves put it.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://bis.informatik.uni-leipzig.de/SebastianHellmann&quot; id=&quot;link-id0x355af288&quot;&gt;Sebastian Hellman&lt;/a&gt; gave a talk on efforts to set up the &lt;i&gt;DBpedia Foundation&lt;/i&gt; as a not-for-profit organization, hopefully in the next 10 days, to aid in the sustainability and growth of the &lt;a href=&quot;http://dbpedia.org/&quot; id=&quot;link-id0x30931d88&quot;&gt;DBpedia project&lt;/a&gt;. The Foundation would identify stakeholders, their interests, and ways to generate income to further improve DBpedia. Planned areas of improvement include the development of high-availability value-added DBpedia services with &lt;a href=&quot;http://dbpedia.org/page/Quality_of_service&quot; id=&quot;link-id0x2c4cbe88&quot;&gt;quality of service (QoS)&lt;/a&gt; agreements for enterprise users; additional tools in the DBpedia stack to support improved and cost-efficient data curation and &lt;a href=&quot;http://wiki.dbpedia.org/Internationalization/&quot; id=&quot;link-id0x339f6168&quot;&gt;internationalization&lt;/a&gt;; and improved documentation, tutorials, and support to speed uptake.&lt;/p&gt; &lt;p&gt;I had a word with &lt;a href=&quot;http://www.linkedin.com/pub/peter-haase/0/100/90b&quot; id=&quot;link-id0x2b5ae2c8&quot;&gt;Peter Haase&lt;/a&gt; of fluid Operations about the &lt;a href=&quot;http://www.optique-project.eu/&quot; id=&quot;link-id0x2abfee08&quot;&gt;Optique project&lt;/a&gt; and their cloud management offerings. The claim is to do ontology-directed querying over thousands of terabytes of heterogenous data. This turns out to be a full-force attempt at large scale &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2e1dac08&quot;&gt;SQL&lt;/a&gt; federation with ontology-directed query rewriting for covering &lt;a href=&quot;http://www.w3.org/TR/owl2-profiles/#OWL_2_QL&quot; id=&quot;link-id0x31883b48&quot;&gt;OWL 2 QL&lt;/a&gt; semantics. With &lt;a href=&quot;http://dbpedia.org/page/Ian_Horrocks&quot; id=&quot;link-id0x321f9f48&quot;&gt;Ian Horrocks&lt;/a&gt; of Oxford leading the ontology side, the matter is in good hands. Still the matter is not without its problems. Simple lookups can be directed to the data but if there are terabytes of it, it is more likely that &lt;a href=&quot;http://dbpedia.org/page/Aggregate_function&quot; id=&quot;link-id0x1c8bf838&quot;&gt;aggregations&lt;/a&gt; are what is desired. Federated aggregation tends to move a lot of data. So the problems are as they ever were. However, if the analytics are already done and stored in the relational space, finding these based on ontologies is a worthwhile thing for streamlining end user access to information.&lt;/p&gt; &lt;p&gt;The LOD2 plenary itself was structured in the usual way, covering the work packages in two parallel tracks. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/wp-content/uploads/2014/02/group-LOD2-Plenary-Mannheim.jpg&quot; id=&quot;link-id0x9e18678&quot;&gt;&lt;img title=&quot;LOD2 Plenary Group Photo, Mannheim, February 2014&quot; src=&quot;http://lod2.eu/BlogPost/wp-content/uploads/2014/02/group-LOD2-Plenary-Mannheim.jpg&quot; alt=&quot;LOD2 Plenary Group Photo, Mannheim, February 2014&quot; height=&quot;320&quot; /&gt; &lt;/a&gt; &lt;br /&gt; LOD2 Plenary Group Photo, Mannheim, February 2014&lt;/p&gt; &lt;p&gt;On the database side, the final victory will be won by going to adaptive schema for RDF. We brought the RDF penalty against relational to a factor of 2.5 for common analytics style queries, e.g., Star Schema Benchmark. This is a comparison to &lt;a href=&quot;http://dbpedia.org/page/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2f1aef48&quot;&gt;Virtuoso&lt;/a&gt; SQL, which offers very high performance in this workload, over 2x the speed of column store pioneer &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x25e019f8&quot;&gt;MonetDB&lt;/a&gt; and 300x &lt;a href=&quot;http://dbpedia.org/page/MySQL&quot; id=&quot;link-id0x26670158&quot;&gt;MySQL&lt;/a&gt;. So this is where matters stand. To move them significantly forward, exploitation of structure for guiding physical storage will be needed. Also the project still has to deliver the 500 Gtriple results. The &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x300bca28&quot;&gt;experiments around Christmas&lt;/a&gt; at CWI support the possibility, but they are not final. Putting triples into tables when the triples in fact form table-shaped structures, which is the case most of the time, may turn out to be necessary for this. At least, this will be a significant help.&lt;/p&gt; &lt;p&gt;Be the case as it may, using a table schema for regularly shaped data, while preserving the RDF quad flexibility, would essentially abolish the RDF tax and bring the LOD2 project to a glorious conclusion in August.&lt;/p&gt; &lt;p&gt;I took the poetic license to compare the data journey into RDF and back to the Egyptian myth of Osiris: The data gets shut in a silo and then gets cut into 14 pieces; and subsequently thrown into the Nile (i.e., the LOD cloud, or the CKAN catalog). Grief-stricken Isis sees what is become of her love: She patiently reassembles the pieces, reconstructing Osiris in fact so well that he sires her a child, hawk-headed Horus, who proceeds to reclaim his father’s honor. (See, Isis means Intelligent Structured Information Storage.)&lt;/p&gt; &lt;p&gt;I had many interesting conversations with Chris Bizer about his research in data integration, working with the 150M HTML tables in the common crawl. The idea is to resolve references and combine data from the tables. Interestingly enough, the data model in these situations is basically triples, while these are generally not stored as RDF but in Lucene. This makes sense due to the string-matching nature of the task. There appears to be opportunity in bringing together the state of the art in database, meaning the very highly optimized column-store and vectored execution in Virtuoso with the search-style workload found in instance matching and other data integration tasks. The promise goes in the direction of very fast &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2f21cfb8&quot;&gt;ETL&lt;/a&gt; and subsequent discovery of structural commonalities and enrichment possibilities. This is also not infinitely far from the schema discovery that one may do in order to adaptively optimize storage based on the data.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/volha-bryl/10/451/333&quot; id=&quot;link-id0x2f0cceb8&quot;&gt;Volha Bryl&lt;/a&gt; gave a very good overview of the Mannheim work in the data integration domain. For example, learning data fusion rules from examples of successful conflict resolution seems very promising. Learning text extraction rules from examples is also interesting. The problem of data integration is that the tasks are very heterogenous and therefore data integration suites have very large numbers of distinct tools. This is labor intensive but there is progress in automation. An error-free, or near enough, data product remains case by case and has human curation but automatic methods seem, based on Volha’s and Chris’ presentation, to be in the ballpark for statistics.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/in/giovannitummarello&quot; id=&quot;link-id0x24ebe6d8&quot;&gt;Giovanni Tummarello&lt;/a&gt; of &lt;a href=&quot;http://insight-centre.org/&quot; id=&quot;link-id0x312ab898&quot;&gt;Insight&lt;/a&gt;/&lt;a href=&quot;http://www.sindicetech.com/&quot; id=&quot;link-id0x300ba528&quot;&gt;SindiceTech&lt;/a&gt;, always the life of the party, presented his &lt;a href=&quot;http://dbpedia.org/page/Apache_Solr&quot; id=&quot;link-id0x2c299518&quot;&gt;Solr&lt;/a&gt;-based relational faceted browser. The idea is to show and drill down by facets over a set of related tables; in the demo, this was investments, investment targets, and investors. You can look at the data from any of the points and restrict the search based on attributes of any. Well, this is what a database does, right? That is so, but the Sindice tool is on top of Solr and actually materializes joins into a document. This blows up the data but has all the things colocated so it can even run from disk. We also talked about the &lt;a href=&quot;http://www.sindicetech.com/overview.html&quot; id=&quot;link-id0x2e061af8&quot;&gt;Knowledge Graph&lt;/a&gt; package Sindice offers on the Google cloud, this time a Virtuoso application. &lt;/p&gt; &lt;p&gt;We hope that negotiations between SindiceTech and Insight (formerly &lt;a href=&quot;http://dbpedia.org/page/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x2ac45b48&quot;&gt;DERI&lt;/a&gt;) around open sourcing the &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x256ad4f8&quot;&gt;SPARQL&lt;/a&gt; editor and other items come to a successful conclusion. The SPARQL editor especially would be of general interest to the RDF community. It is noteworthy that there is no SPARQL query builder in common use out there (even &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x26a4acb8&quot;&gt;OpenLink&lt;/a&gt;&amp;#39;s own open source &lt;a href=&quot;http://oat.openlinksw.com/index.html?isparql&quot; id=&quot;link-id0x2faa4398&quot;&gt;iSPARQL&lt;/a&gt; has been largely (but &lt;a href=&quot;http://answers.semanticweb.com/answer_link/13502/&quot; id=&quot;link-id0x2dedb8a8&quot;&gt;not entirely!&lt;/a&gt;) overlooked and misunderstood, though it&amp;#39;s been available as part of the &lt;a href=&quot;http://www.openlinksw.com/RPC2&quot; id=&quot;link-id0x17cab798&quot;&gt;OpenLink Ajax Toolkit&lt;/a&gt; for several years). OK, a query builder is useful when there is schema. But if the schema is an SQL one, as will be the case if RDF is adaptively stored, then any SQL query builder can be applied to the regular portion of the data. 40 years of calendar time and millennia of person years have gone into making SQL front ends and these will become applicable overnight; Virtuoso does speak SQL, as you may know.&lt;/p&gt; &lt;p&gt;I had the breakout session about the database work in LOD2. What will be done is clear enough, the execution side is very good, and our coverage of the infinite space of query optimization continues to grow. One more revolution for storage may come about, as suggested above. There is not very much to discuss, just to execute. So I used the time to explain how you run &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT SUM ( l_extendedprice ) FROM lineitem , part WHERE l_partkey = p_partkey AND p_name LIKE &amp;#39;%green%&amp;#39;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Simple query, right? Sure, but application guys or sem-heads generally have no clue about how these in fact need to be done. I have the probably foolish belief that a little understanding of database, especially in the RDF space which does get hit by every query optimization problem, would be helpful. At least one would know what goes wrong. So I explained to Giovanni, who is in fact a good geek, that this is a hash join, and with only a little prompting he suggested that you should also put a Bloom filter in front of the hash. Good. So in the bar after dinner I was told I ought to teach. Maybe. But the students would have to be very fast and motivated. Anyway, the take-home message is that the DBMS must figure it out. In the SQL space this is easier, and of course, if most of RDF reduces to this, then RDF too will be more predictable in this department.&lt;/p&gt; &lt;p&gt;I talked with &lt;a href=&quot;http://www.linkedin.com/in/martinkaltenboeck&quot; id=&quot;link-id0x2303ff58&quot;&gt;Martin Kaltenböck&lt;/a&gt; of the &lt;a href=&quot;http://www.linkedin.com/company/919714&quot; id=&quot;link-id0x2e5a5908&quot;&gt;Semantic Web Company&lt;/a&gt; about his brilliant networking accomplishments around organizing the &lt;a href=&quot;http://www.data-forum.eu/&quot; id=&quot;link-id0x2d39f418&quot;&gt;European Data Forum&lt;/a&gt; and other activities. Martin is a great ambassador and lobbyist for linked data across Europe. Great work, also in generating visibility for LOD2.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/page/European_Union&quot; id=&quot;link-id0x2ef83908&quot;&gt;EU&lt;/a&gt; in general, thanks in great part to &lt;a href=&quot;http://www.linkedin.com/in/stefanobertolo&quot; id=&quot;link-id0x25ef47c8&quot;&gt;Stefano Bertolo&lt;/a&gt;’s long term push in this direction, is putting increasing emphasis on measuring progress in the research it funds. This is one of the messages from the LOD2 review also. Database is the domain of performance race &lt;i&gt;par excellence;&lt;/i&gt; the matters on that side are well attended to by &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0xe514b98&quot;&gt;LDBC&lt;/a&gt; and, of course, the unimpeachably authoritative &lt;a href=&quot;http://dbpedia.org/page/TPC&quot; id=&quot;link-id0x2b4a1ac8&quot;&gt;TPC&lt;/a&gt;, among others. In other domains, measurement is harder, as it involves a human-curated ground truth for any extraction, linking, or other integration. There is good work in both Mannheim and Leipzig in these areas, and I may at some point take a closer look, but for now it is appropriate to stick to core database.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-27T10:57:35-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Initiating V7 Fast Track: &quot;File Tables&quot; feature now in Virtuoso Open Source!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-02-20#1776</atom:id>
  <atom:published>2014-02-20T19:43:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &amp;quot;file tables&amp;quot; feature first introduced in the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac3994bd88&quot;&gt;TPC-H&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac39531e48&quot;&gt;bulk load article&lt;/a&gt; is now available on the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource&quot; id=&quot;link-id0x2aac3a229148&quot;&gt;v7fasttrack clone&lt;/a&gt; of the &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x2aac3a8bee58&quot;&gt;Virtuoso repository on GitHub&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To check out —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;$ git clone https://github.com/v7fasttrack/virtuoso-opensource.git v7fasttrack &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The v7fasttrack tree &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSBuild&quot; id=&quot;link-id0x2aac3abeaac8&quot;&gt;compiles just like the main Virtuoso tree&lt;/a&gt;. Its content is substantially the same today, except for the file tables feature. There is a diff with the main tree which now consists mostly of white space, since the Fast Track tree is automatically indented with the Linux indent utility each time it is updated, and the Virtuoso tree is not.&lt;/p&gt; &lt;p&gt;Ongoing maintenance and previews of new features will be added to this tree as and when they become available.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s now look at the &amp;quot;file tables&amp;quot; feature.&lt;/p&gt; &lt;p&gt;You can use any &lt;a href=&quot;http://dbpedia.org/page/Comma-separated_values&quot; id=&quot;link-id0x2aac3abeaa68&quot;&gt;CSV file&lt;/a&gt; like a table, as &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/sqlbulkloadoperations.html&quot; id=&quot;link-id0x2aac39cf71a8&quot;&gt;described in the documentation&lt;/a&gt;. The TPC-H data generator (&lt;a href=&quot;http://www.tpc.org/tpch/spec/tpch_2_16_0.zip&quot; id=&quot;link-id0x2aac3abeab88&quot;&gt;complete source ZIP&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/dbgen2.16.zip&quot; id=&quot;link-id0x2aac3abea9e8&quot;&gt;ZIP of just the dbgen source&lt;/a&gt;) is a convenient place to start to try things out.&lt;/p&gt; &lt;p&gt;To generate the qualification database, run —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbgen -s 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This makes 8 CSV files called &lt;code&gt;*.tbl&lt;/code&gt;. You can use these scripts to load them into Virtuoso —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/schema.sql&quot; id=&quot;link-id0x2aabf5535268&quot;&gt;schema.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ldschema.sql&quot; id=&quot;link-id0x2aac388381c8&quot;&gt;ldschema.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ld.sql&quot; id=&quot;link-id0x2aac3a59c258&quot;&gt;ld.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To verify the load, do —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT COUNT (*) FROM lineitem_f ; SELECT COUNT (*) FROM lineitem ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To try different combinations of tables and CSV files, you can, for example, do —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT COUNT (*) FROM lineitem, part_f WHERE l_partkey = p_partkey AND p_name LIKE &amp;#39;%green%&amp;#39; ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This counts shipments of green parts, using the file as the &lt;code&gt;part&lt;/code&gt; table. You can then replace the &lt;code&gt;part_f&lt;/code&gt; with &lt;code&gt;part&lt;/code&gt; to join against the database. The database will be a little faster but the file is also pretty fast since the smaller table (&lt;code&gt;part&lt;/code&gt;) is on the build side of a hash join and the scan of &lt;code&gt;lineitem&lt;/code&gt; is the same in either case.&lt;/p&gt; &lt;p&gt;You can now replace &lt;code&gt;lineitem&lt;/code&gt; with &lt;code&gt;lineitem_f&lt;/code&gt; and you will see a larger difference. This is still reasonably fast since the &lt;code&gt;lineitem&lt;/code&gt; file is scanned in parallel.&lt;/p&gt; &lt;p&gt;You can try the different TPC-H queries against tables and files. To get the perfect plans you will need the analytics branch which will be made available shortly via this same GitHub channel.&lt;/p&gt; &lt;p&gt;You can also try RDFizing the files using the scripts in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1769&quot; id=&quot;link-id0x2aac39cb7b48&quot;&gt;the Enterprise Linked Data article&lt;/a&gt; from earlier this year. The qualification database should go in about 15 minutes on a commodity server and make some 120M triples. In the article, the data came from another server, but it can just as well come from files. These two scripts from that article have been adapted for loading from files —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ldfile.sql&quot; id=&quot;link-id0x2aac3973b038&quot;&gt;ldfile.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/sql_rdf.sql&quot; id=&quot;link-id0x2aac39199f98&quot;&gt;sql_rdf.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To try this, execute the following commands in iSQL —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;LOAD sql_rdf.sql; RDF_VIEW_SYNC_TO_PHYSICAL ( &amp;#39;http://example.com/tpcd&amp;#39; , 1 , , &amp;quot;urn:example.com:tpcd&amp;quot; , 2 , 0 ) ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To verify the result —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;sparql SELECT ?c COUNT (*) WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY DESC 2 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt;</atom:content>
  <atom:updated>2014-02-20T14:43:22.000003-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Initiating V7 Fast Track: &quot;File Tables&quot; feature now in Virtuoso Open Source!</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-02-20#1775</atom:id>
  <atom:published>2014-02-20T19:43:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &amp;quot;file tables&amp;quot; feature first introduced in the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac3994bd88&quot;&gt;TPC-H&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac39531e48&quot;&gt;bulk load article&lt;/a&gt; is now available on the &lt;a href=&quot;https://github.com/v7fasttrack/virtuoso-opensource&quot; id=&quot;link-id0x2aac3a229148&quot;&gt;v7fasttrack clone&lt;/a&gt; of the &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x2aac3a8bee58&quot;&gt;Virtuoso repository on GitHub&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To check out —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;$ git clone https://github.com/v7fasttrack/virtuoso-opensource.git v7fasttrack &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The v7fasttrack tree &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSBuild&quot; id=&quot;link-id0x2aac3abeaac8&quot;&gt;compiles just like the main Virtuoso tree&lt;/a&gt;. Its content is substantially the same today, except for the file tables feature. There is a diff with the main tree which now consists mostly of white space, since the Fast Track tree is automatically indented with the Linux indent utility each time it is updated, and the Virtuoso tree is not.&lt;/p&gt; &lt;p&gt;Ongoing maintenance and previews of new features will be added to this tree as and when they become available.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s now look at the &amp;quot;file tables&amp;quot; feature.&lt;/p&gt; &lt;p&gt;You can use any &lt;a href=&quot;http://dbpedia.org/page/Comma-separated_values&quot; id=&quot;link-id0x2aac3abeaa68&quot;&gt;CSV file&lt;/a&gt; like a table, as &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/sqlbulkloadoperations.html&quot; id=&quot;link-id0x2aac39cf71a8&quot;&gt;described in the documentation&lt;/a&gt;. The TPC-H data generator (&lt;a href=&quot;http://www.tpc.org/tpch/spec/tpch_2_16_0.zip&quot; id=&quot;link-id0x2aac3abeab88&quot;&gt;complete source ZIP&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/dbgen2.16.zip&quot; id=&quot;link-id0x2aac3abea9e8&quot;&gt;ZIP of just the dbgen source&lt;/a&gt;) is a convenient place to start to try things out.&lt;/p&gt; &lt;p&gt;To generate the qualification database, run —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbgen -s 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This makes 8 CSV files called &lt;code&gt;*.tbl&lt;/code&gt;. You can use these scripts to load them into Virtuoso —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/schema.sql&quot; id=&quot;link-id0x2aabf5535268&quot;&gt;schema.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ldschema.sql&quot; id=&quot;link-id0x2aac388381c8&quot;&gt;ldschema.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ld.sql&quot; id=&quot;link-id0x2aac3a59c258&quot;&gt;ld.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To verify the load, do —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT COUNT (*) FROM lineitem_f ; SELECT COUNT (*) FROM lineitem ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To try different combinations of tables and CSV files, you can, for example, do —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT COUNT (*) FROM lineitem, part_f WHERE l_partkey = p_partkey AND p_name LIKE &amp;#39;%green%&amp;#39; ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This counts shipments of green parts, using the file as the &lt;code&gt;part&lt;/code&gt; table. You can then replace the &lt;code&gt;part_f&lt;/code&gt; with &lt;code&gt;part&lt;/code&gt; to join against the database. The database will be a little faster but the file is also pretty fast since the smaller table (&lt;code&gt;part&lt;/code&gt;) is on the build side of a hash join and the scan of &lt;code&gt;lineitem&lt;/code&gt; is the same in either case.&lt;/p&gt; &lt;p&gt;You can now replace &lt;code&gt;lineitem&lt;/code&gt; with &lt;code&gt;lineitem_f&lt;/code&gt; and you will see a larger difference. This is still reasonably fast since the &lt;code&gt;lineitem&lt;/code&gt; file is scanned in parallel.&lt;/p&gt; &lt;p&gt;You can try the different TPC-H queries against tables and files. To get the perfect plans you will need the analytics branch which will be made available shortly via this same GitHub channel.&lt;/p&gt; &lt;p&gt;You can also try RDFizing the files using the scripts in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1769&quot; id=&quot;link-id0x2aac39cb7b48&quot;&gt;the Enterprise Linked Data article&lt;/a&gt; from earlier this year. The qualification database should go in about 15 minutes on a commodity server and make some 120M triples. In the article, the data came from another server, but it can just as well come from files. These two scripts from that article have been adapted for loading from files —&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/ldfile.sql&quot; id=&quot;link-id0x2aac3973b038&quot;&gt;ldfile.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;li&gt; &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesInitiatingV7FastTrack/sql_rdf.sql&quot; id=&quot;link-id0x2aac39199f98&quot;&gt;sql_rdf.sql &lt;/a&gt; &lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To try this, execute the following commands in iSQL —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;LOAD sql_rdf.sql; RDF_VIEW_SYNC_TO_PHYSICAL ( &amp;#39;http://example.com/tpcd&amp;#39; , 1 , , &amp;quot;urn:example.com:tpcd&amp;quot; , 2 , 0 ) ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To verify the result —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;sparql SELECT ?c COUNT (*) WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY DESC 2 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt;</atom:content>
  <atom:updated>2014-02-20T14:43:10.000018-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Fast Track and the Ways of Open Source</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-02-14#1774</atom:id>
  <atom:published>2014-02-14T14:40:55Z</atom:published>
  <atom:content type="html">&lt;p&gt;I recall a couple of years back, in a LOD2 project review, one of the reviewers made a comment to the effect that OpenLink&amp;#39;s open source strategy was in essence autistic. More precisely, that OpenLink made some things, released these at unanticipatable times, and lacked community engagement.&lt;/p&gt; &lt;p&gt;Since then the situation has improved somewhat with the &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x2c6d45f8&quot;&gt;code being on github&lt;/a&gt; and kept more or less up to date with maintenance.&lt;/p&gt; &lt;p&gt;There is no reason why users should not get bug fixes when they are made, nor why users should not get functionality previews.&lt;/p&gt; &lt;p&gt;Introducing v7fasttrack, a clone of the git repository, where maintenance goes real time, and where early releases of functionality are available for experimentation.&lt;/p&gt; &lt;p&gt;It is open kitchen, folks. You will see us slice the fish and mix the curry right in the dining room. You will see epic feats of pizza flipping -- something to regale your grandchildren with.&lt;/p&gt; &lt;p&gt;You will still have to place your orders with your waiter; we still won&amp;#39;t have time to be on most lists and such but at least you will get the dish while it&amp;#39;s hot.&lt;/p&gt; &lt;p&gt;In the immediate future, the &amp;quot;file-as-table&amp;quot; feature will be introduced via this channel. This is the capability to make CSV files look like tables, which was mentioned in the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2d780628&quot;&gt;TPC-H&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x2aac3ade8538&quot;&gt;bulk load article.&lt;/a&gt; This is key to bulk loading 100GB in 15 minutes on a single commodity server.&lt;/p&gt; &lt;p&gt;The query caching feature mentioned in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1771&quot; id=&quot;link-id0x2daa4898&quot;&gt;the previous blog post&lt;/a&gt; is the next candidate for availability in this channel. If you have repeating long queries that do lookups with under a million triples or so, compile times will dominate and this will give significant acceleration.&lt;/p&gt; &lt;p&gt;The largest item to come is the availability of the analytics branch that has been discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac3875e4f8&quot;&gt;the TPC-H series&lt;/a&gt;. It is basically complete, with implementations of most tricks discussed in the TPC TC paper, &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x2c3c94e8&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;These are structured as branches, with safe maintenance to one side, and new features which potentially break things in their own branch. For example, with a much smarter optimizer in the analytics branch, it is conceivable some applications will get worse plans at first even if the benchmarks are good. Anyway, experimentation is safe.&lt;/p&gt; &lt;p&gt;These will be introduced in future blog posts, and the relevant documentation will be in the archive. The &lt;a href=&quot;http://dbpedia.org/resource/Docbook&quot; id=&quot;link-id0x2c0bcf98&quot;&gt;DocBook&lt;/a&gt; XML form will come later.&lt;/p&gt; &lt;p&gt;These features will migrate to the regular git in time. But you will not have to hold your breath waiting for this.&lt;/p&gt; &lt;p&gt;The next action is the publishing of the file table feature on the fast track. There will be a post on this next week.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-14T09:46:10.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Fast Track and the Ways of Open Source</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-02-14#1773</atom:id>
  <atom:published>2014-02-14T14:40:48Z</atom:published>
  <atom:content type="html">&lt;p&gt;I recall a couple of years back, in a LOD2 project review, one of the reviewers made a comment to the effect that OpenLink&amp;#39;s open source strategy was in essence autistic. More precisely, that OpenLink made some things, released these at unanticipatable times, and lacked community engagement.&lt;/p&gt; &lt;p&gt;Since then the situation has improved somewhat with the &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x2c6d45f8&quot;&gt;code being on github&lt;/a&gt; and kept more or less up to date with maintenance.&lt;/p&gt; &lt;p&gt;There is no reason why users should not get bug fixes when they are made, nor why users should not get functionality previews.&lt;/p&gt; &lt;p&gt;Introducing v7fasttrack, a clone of the git repository, where maintenance goes real time, and where early releases of functionality are available for experimentation.&lt;/p&gt; &lt;p&gt;It is open kitchen, folks. You will see us slice the fish and mix the curry right in the dining room. You will see epic feats of pizza flipping -- something to regale your grandchildren with.&lt;/p&gt; &lt;p&gt;You will still have to place your orders with your waiter; we still won&amp;#39;t have time to be on most lists and such but at least you will get the dish while it&amp;#39;s hot.&lt;/p&gt; &lt;p&gt;In the immediate future, the &amp;quot;file-as-table&amp;quot; feature will be introduced via this channel. This is the capability to make CSV files look like tables, which was mentioned in the &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2d780628&quot;&gt;TPC-H&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1767&quot; id=&quot;link-id0x2aac3ade8538&quot;&gt;bulk load article.&lt;/a&gt; This is key to bulk loading 100GB in 15 minutes on a single commodity server.&lt;/p&gt; &lt;p&gt;The query caching feature mentioned in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1771&quot; id=&quot;link-id0x2daa4898&quot;&gt;the previous blog post&lt;/a&gt; is the next candidate for availability in this channel. If you have repeating long queries that do lookups with under a million triples or so, compile times will dominate and this will give significant acceleration.&lt;/p&gt; &lt;p&gt;The largest item to come is the availability of the analytics branch that has been discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac3875e4f8&quot;&gt;the TPC-H series&lt;/a&gt;. It is basically complete, with implementations of most tricks discussed in the TPC TC paper, &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x2c3c94e8&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;These are structured as branches, with safe maintenance to one side, and new features which potentially break things in their own branch. For example, with a much smarter optimizer in the analytics branch, it is conceivable some applications will get worse plans at first even if the benchmarks are good. Anyway, experimentation is safe.&lt;/p&gt; &lt;p&gt;These will be introduced in future blog posts, and the relevant documentation will be in the archive. The &lt;a href=&quot;http://dbpedia.org/resource/Docbook&quot; id=&quot;link-id0x2c0bcf98&quot;&gt;DocBook&lt;/a&gt; XML form will come later.&lt;/p&gt; &lt;p&gt;These features will migrate to the regular git in time. But you will not have to hold your breath waiting for this.&lt;/p&gt; &lt;p&gt;The next action is the publishing of the file table feature on the fast track. There will be a post on this next week.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-14T09:43:24.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Query Plan Cache and Lookups</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-02-03#1772</atom:id>
  <atom:published>2014-02-03T16:13:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;Performance of &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms5.ttl%23RDF&quot; id=&quot;link-id0x21debd98&quot;&gt;RDF&lt;/a&gt; and other graph workloads may easily be limited by query compilation time. Query compilation time tends to increase as more complex optimizations are added, thus simply streamlining compilation is not the answer. All applications we have come across make queries by instantiating templates and plugging in different literals and different combinations of predefined search conditions. The &lt;a href=&quot;http://dbpedia.org/resource/DBMS&quot; id=&quot;link-id0x26f5c928&quot;&gt;DBMS&lt;/a&gt; will see a few hundred distinct queries, but they may come each time with different literals.&lt;/p&gt; &lt;p&gt;So reusing query plans between invocations is a natural optimization. This works especially well with lookup workloads, or when the data is small. Analytics tends to be dominated by run time, but lookups that touch at most a million or so triples will often be bound by compilation time, especially if these have tens of triple patterns.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s consider the following from &lt;a href=&quot;http://www.openphacts.org/about-open-phacts/about-open-phacts&quot; id=&quot;link-id0x24336408&quot;&gt;Open PHACTS&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;sparql PREFIX chembl: &amp;lt;http://rdf.ebi.ac.uk/terms/chembl#&amp;gt; PREFIX dcterms: &amp;lt;http://purl.org/dc/terms/&amp;gt; PREFIX skos: &amp;lt;http://www.w3.org/2004/02/skos/core#&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; PREFIX owl: &amp;lt;http://www.w3.org/2002/07/owl#&amp;gt; PREFIX bibo: &amp;lt;http://purl.org/ontology/bibo/&amp;gt; PREFIX cheminf: &amp;lt;http://semanticscience.org/resource/&amp;gt; PREFIX obo: &amp;lt;http://purl.obolibrary.org/obo/&amp;gt; PREFIX qudt: &amp;lt;http://qudt.org/1.1/schema/qudt#&amp;gt; SELECT DISTINCT ?item WHERE { VALUES ?chembl_target_uri { &amp;lt;http://rdf.ebi.ac.uk/resource/chembl/target/CHEMBL5451&amp;gt; } GRAPH &amp;lt;http://www.ebi.ac.uk/chembl&amp;gt; { ?assay_uri chembl:hasTarget ?chembl_target_uri . ?assay_uri chembl:hasActivity ?item . ?item chembl:hasMolecule ?compound_chembl . ?chembl_target_uri a ?target_type . OPTIONAL { ?chembl_target_uri dcterms:title ?target_name_chembl } OPTIONAL { ?chembl_target_uri chembl:organismName ?target_organism } OPTIONAL { ?chembl_target_uri chembl:hasTargetComponent ?protein . GRAPH &amp;lt;http://www.conceptwiki.org&amp;gt; { ?cw_target skos:exactMatch ?protein ; skos:prefLabel ?protein_name } } OPTIONAL { ?assay_uri chembl:organismName ?assay_organism } OPTIONAL { ?assay_uri dcterms:description ?assay_description } OPTIONAL { ?assay_uri chembl:assayTestType ?assay_type } OPTIONAL { ?item chembl:publishedType ?published_type } OPTIONAL { ?item chembl:publishedRelation ?published_relation } OPTIONAL { ?item chembl:publishedValue ?published_value } OPTIONAL { ?item chembl:publishedUnits ?published_unit } OPTIONAL { ?item chembl:standardType ?activity_type } OPTIONAL { ?item chembl:standardRelation ?activity_relation } OPTIONAL { ?item chembl:standardValue ?standard_value . BIND ( xsd:decimal( ?standard_value ) AS ?activity_value ) } OPTIONAL { ?item chembl:standardUnits ?activity_unit } OPTIONAL { ?item chembl:hasQUDT ?qudt_uri } OPTIONAL { ?item chembl:pChembl ?pChembl } OPTIONAL { ?item chembl:activityComment ?act_comment } OPTIONAL { ?item chembl:hasDocument ?doc_uri . OPTIONAL { ?doc_uri owl:sameAs ?doi } OPTIONAL { ?doc_uri bibo:pmid ?pmid } } } GRAPH &amp;lt;http://ops.rsc.org&amp;gt; { ?compound_ocrs skos:exactMatch ?compound_chembl . ?compound_ocrs cheminf:CHEMINF_000396 ?inchi ; cheminf:CHEMINF_000399 ?inchi_key ; cheminf:CHEMINF_000018 ?smiles . OPTIONAL { [] obo:IAO_0000136 ?compound_ocrs ; a cheminf:CHEMINF_000484 ; qudt:numericValue ?molweight . } OPTIONAL { [] obo:IAO_0000136 ?compound_ocrs ; a cheminf:CHEMINF_000367 ; qudt:numericValue ?num_ro5_violations . } } ?compound_cw skos:exactMatch ?compound_ocrs ; skos:prefLabel ?compound_name } ORDER BY ?item LIMIT 10 OFFSET 0 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is quite typical. More complex ones have been seen, with many unions on top.&lt;/p&gt; &lt;p&gt;We run this with profile on warm cache, no plan reuse in effect. The database is Open PHACTS OPS from this January.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;profile (&amp;#39;sparql prefix ....&amp;#39;); ... 15 msec 4% cpu, 15688 rnd 9547 seq 91.8669% same seg 4.62107% same pg Compilation: 313 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The compilation time is over 20x longer than the execution. We see from the top line that the execution did 15K random lookups and retrieved 9K rows sequentially.&lt;/p&gt; &lt;p&gt;We enable plan reuse and rerun:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 14 msec 58% cpu, 15688 rnd 9547 seq 91.8669% same seg 4.62107% same pg Compilation: 0 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The compile time is now gone. This is an especially large win. With a set of 31 queries from Open PHACTS, each repeated over many different parameter bindings, the gains from query caching are a speedup of 1.5x. More details may be published after VU Amsterdam, which does the data management for Open PHACTS, following publication of the benchmark data and queries. The present figures are an order of magnitude better than the figures from last fall, which will also be in the publication.&lt;/p&gt; &lt;p&gt;With query plan caching, the same plan will be reused as long as the literals in the new query have approximately the same selectivity as the ones which were present when the plan was first made. In this way, if a different plan is in fact needed, one will be made. The same query text can have many alternative plans for different selectivities of search conditions.&lt;/p&gt; &lt;p&gt;In this way, plan reuse may work better than prepared statements. Anyway, prepared statements do not exist in the &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x26869b68&quot;&gt;SPARQL&lt;/a&gt; query language. In &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2540acc8&quot;&gt;SQL&lt;/a&gt; they do, but then the optimizer does not know the values the parameters will have.&lt;/p&gt; &lt;p&gt;The overhead of plan reuse, as opposed to parameterized prepared statements, is relatively low. The cache remembers the sampling that was done when the plan was first made. The same samples are taken with the new literals plugged in. If the cardinalities are within a settable percentage (e.g., 20% of the original), the plan is assumed to be applicable. On the other hand, with prepared parameterized statements, there is no sampling at all, but then the plan might be worse due to less information being available to the optimizer. &lt;/p&gt; &lt;p&gt;Publishing is another type of workload where compile times easily form a large percentage of the total. The queries are shorter than in the biology case, since the modeling tends to be simpler and there are less distinct sources being queried. The frequency of the queries is higher though, and each might touch only some tens of triples.&lt;/p&gt; &lt;p&gt;The query caching feature will be included in forthcoming &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x26292b98&quot;&gt;Virtuoso&lt;/a&gt; updates, and will not require operator intervention nor changes to configurations or applications. The feature will be controlled by a few settings in &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#VIRTINI&quot; id=&quot;link-id0x20edd4c8&quot;&gt;the configuration file&lt;/a&gt;, but the defaults will work for almost all cases.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-03T11:13:20.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Query Plan Cache and Lookups</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-02-03#1771</atom:id>
  <atom:published>2014-02-03T16:13:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;Performance of &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms5.ttl%23RDF&quot; id=&quot;link-id0x21debd98&quot;&gt;RDF&lt;/a&gt; and other graph workloads may easily be limited by query compilation time. Query compilation time tends to increase as more complex optimizations are added, thus simply streamlining compilation is not the answer. All applications we have come across make queries by instantiating templates and plugging in different literals and different combinations of predefined search conditions. The &lt;a href=&quot;http://dbpedia.org/resource/DBMS&quot; id=&quot;link-id0x26f5c928&quot;&gt;DBMS&lt;/a&gt; will see a few hundred distinct queries, but they may come each time with different literals.&lt;/p&gt; &lt;p&gt;So reusing query plans between invocations is a natural optimization. This works especially well with lookup workloads, or when the data is small. Analytics tends to be dominated by run time, but lookups that touch at most a million or so triples will often be bound by compilation time, especially if these have tens of triple patterns.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s consider the following from &lt;a href=&quot;http://www.openphacts.org/about-open-phacts/about-open-phacts&quot; id=&quot;link-id0x24336408&quot;&gt;Open PHACTS&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;sparql PREFIX chembl: &amp;lt;http://rdf.ebi.ac.uk/terms/chembl#&amp;gt; PREFIX dcterms: &amp;lt;http://purl.org/dc/terms/&amp;gt; PREFIX skos: &amp;lt;http://www.w3.org/2004/02/skos/core#&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; PREFIX owl: &amp;lt;http://www.w3.org/2002/07/owl#&amp;gt; PREFIX bibo: &amp;lt;http://purl.org/ontology/bibo/&amp;gt; PREFIX cheminf: &amp;lt;http://semanticscience.org/resource/&amp;gt; PREFIX obo: &amp;lt;http://purl.obolibrary.org/obo/&amp;gt; PREFIX qudt: &amp;lt;http://qudt.org/1.1/schema/qudt#&amp;gt; SELECT DISTINCT ?item WHERE { VALUES ?chembl_target_uri { &amp;lt;http://rdf.ebi.ac.uk/resource/chembl/target/CHEMBL5451&amp;gt; } GRAPH &amp;lt;http://www.ebi.ac.uk/chembl&amp;gt; { ?assay_uri chembl:hasTarget ?chembl_target_uri . ?assay_uri chembl:hasActivity ?item . ?item chembl:hasMolecule ?compound_chembl . ?chembl_target_uri a ?target_type . OPTIONAL { ?chembl_target_uri dcterms:title ?target_name_chembl } OPTIONAL { ?chembl_target_uri chembl:organismName ?target_organism } OPTIONAL { ?chembl_target_uri chembl:hasTargetComponent ?protein . GRAPH &amp;lt;http://www.conceptwiki.org&amp;gt; { ?cw_target skos:exactMatch ?protein ; skos:prefLabel ?protein_name } } OPTIONAL { ?assay_uri chembl:organismName ?assay_organism } OPTIONAL { ?assay_uri dcterms:description ?assay_description } OPTIONAL { ?assay_uri chembl:assayTestType ?assay_type } OPTIONAL { ?item chembl:publishedType ?published_type } OPTIONAL { ?item chembl:publishedRelation ?published_relation } OPTIONAL { ?item chembl:publishedValue ?published_value } OPTIONAL { ?item chembl:publishedUnits ?published_unit } OPTIONAL { ?item chembl:standardType ?activity_type } OPTIONAL { ?item chembl:standardRelation ?activity_relation } OPTIONAL { ?item chembl:standardValue ?standard_value . BIND ( xsd:decimal( ?standard_value ) AS ?activity_value ) } OPTIONAL { ?item chembl:standardUnits ?activity_unit } OPTIONAL { ?item chembl:hasQUDT ?qudt_uri } OPTIONAL { ?item chembl:pChembl ?pChembl } OPTIONAL { ?item chembl:activityComment ?act_comment } OPTIONAL { ?item chembl:hasDocument ?doc_uri . OPTIONAL { ?doc_uri owl:sameAs ?doi } OPTIONAL { ?doc_uri bibo:pmid ?pmid } } } GRAPH &amp;lt;http://ops.rsc.org&amp;gt; { ?compound_ocrs skos:exactMatch ?compound_chembl . ?compound_ocrs cheminf:CHEMINF_000396 ?inchi ; cheminf:CHEMINF_000399 ?inchi_key ; cheminf:CHEMINF_000018 ?smiles . OPTIONAL { [] obo:IAO_0000136 ?compound_ocrs ; a cheminf:CHEMINF_000484 ; qudt:numericValue ?molweight . } OPTIONAL { [] obo:IAO_0000136 ?compound_ocrs ; a cheminf:CHEMINF_000367 ; qudt:numericValue ?num_ro5_violations . } } ?compound_cw skos:exactMatch ?compound_ocrs ; skos:prefLabel ?compound_name } ORDER BY ?item LIMIT 10 OFFSET 0 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is quite typical. More complex ones have been seen, with many unions on top.&lt;/p&gt; &lt;p&gt;We run this with profile on warm cache, no plan reuse in effect. The database is Open PHACTS OPS from this January.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;profile (&amp;#39;sparql prefix ....&amp;#39;); ... 15 msec 4% cpu, 15688 rnd 9547 seq 91.8669% same seg 4.62107% same pg Compilation: 313 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The compilation time is over 20x longer than the execution. We see from the top line that the execution did 15K random lookups and retrieved 9K rows sequentially.&lt;/p&gt; &lt;p&gt;We enable plan reuse and rerun:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 14 msec 58% cpu, 15688 rnd 9547 seq 91.8669% same seg 4.62107% same pg Compilation: 0 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The compile time is now gone. This is an especially large win. With a set of 31 queries from Open PHACTS, each repeated over many different parameter bindings, the gains from query caching are a speedup of 1.5x. More details may be published after VU Amsterdam, which does the data management for Open PHACTS, following publication of the benchmark data and queries. The present figures are an order of magnitude better than the figures from last fall, which will also be in the publication.&lt;/p&gt; &lt;p&gt;With query plan caching, the same plan will be reused as long as the literals in the new query have approximately the same selectivity as the ones which were present when the plan was first made. In this way, if a different plan is in fact needed, one will be made. The same query text can have many alternative plans for different selectivities of search conditions.&lt;/p&gt; &lt;p&gt;In this way, plan reuse may work better than prepared statements. Anyway, prepared statements do not exist in the &lt;a href=&quot;http://dbpedia.org/page/SPARQL&quot; id=&quot;link-id0x26869b68&quot;&gt;SPARQL&lt;/a&gt; query language. In &lt;a href=&quot;http://dbpedia.org/page/SQL&quot; id=&quot;link-id0x2540acc8&quot;&gt;SQL&lt;/a&gt; they do, but then the optimizer does not know the values the parameters will have.&lt;/p&gt; &lt;p&gt;The overhead of plan reuse, as opposed to parameterized prepared statements, is relatively low. The cache remembers the sampling that was done when the plan was first made. The same samples are taken with the new literals plugged in. If the cardinalities are within a settable percentage (e.g., 20% of the original), the plan is assumed to be applicable. On the other hand, with prepared parameterized statements, there is no sampling at all, but then the plan might be worse due to less information being available to the optimizer. &lt;/p&gt; &lt;p&gt;Publishing is another type of workload where compile times easily form a large percentage of the total. The queries are shorter than in the biology case, since the modeling tends to be simpler and there are less distinct sources being queried. The frequency of the queries is higher though, and each might touch only some tens of triples.&lt;/p&gt; &lt;p&gt;The query caching feature will be included in forthcoming &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x26292b98&quot;&gt;Virtuoso&lt;/a&gt; updates, and will not require operator intervention nor changes to configurations or applications. The feature will be controlled by a few settings in &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#VIRTINI&quot; id=&quot;link-id0x20edd4c8&quot;&gt;the configuration file&lt;/a&gt;, but the defaults will work for almost all cases.&lt;/p&gt;</atom:content>
  <atom:updated>2014-02-03T11:13:08-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Meeting the Challenges of Linked Data in the Enterprise</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-01-17#1770</atom:id>
  <atom:published>2014-01-17T16:49:12Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1af2a938&quot;&gt;A few blogs back&lt;/a&gt;, I was talking about the comeback of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabf9d7bd18&quot;&gt;SQL&lt;/a&gt; (i.e., relational) &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x2aabf97e4228&quot;&gt;federation&lt;/a&gt;. True, &lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x18276d18&quot;&gt;Virtuoso has always had that&lt;/a&gt;, but in the general perception, it is primarily known for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x97fad48&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms4.ttl%23LinkedData&quot; id=&quot;link-id0x1c21d6f8&quot;&gt;Linked Data&lt;/a&gt;. Now these two areas of functionality are combined in a way that makes sense and can provide real performance, often surpassing the relational installed base while running &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c1f9138&quot;&gt;SPARQL&lt;/a&gt; with no predefined schema.&lt;/p&gt; &lt;p&gt;So, we take our standard &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1b1f6828&quot;&gt;TPC-H&lt;/a&gt; 100 GB dataset and turn it into RDF. We adjust the schema a little, so that each &lt;code&gt;customer&lt;/code&gt;, its &lt;code&gt;orders&lt;/code&gt;, and the &lt;code&gt;lineitems&lt;/code&gt; of those orders go into a per-customer graph. The &lt;code&gt;part&lt;/code&gt;, &lt;code&gt;partsupp&lt;/code&gt;, and other tables will all go into a public graph. The per-customer graph can be used as a security label; for example, if there is customer self-service access to the warehouse, or if the access is compartmentalized by areas of responsibility (e.g., customer countries or market segments).&lt;/p&gt; &lt;p&gt;We use two Virtuoso processes. The first contains the TPC-H 100G dataset, the same that was discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aabe462fe78&quot;&gt;the TPC-H bulk load article&lt;/a&gt;. The second process attaches the tables from the first via SQL federation, and constructs an RDF translation into its RDF store. The mapping is made with an RDF view, also known as a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtRdb2RDFViewsGeneration&quot; id=&quot;link-id0x1b637708&quot;&gt;Linked Data View&lt;/a&gt;. The initial RDF view can be generated from the relational schema, then edited for the selection of properties. If there are modeling or unit changes in the mapping, these are easiest done with SQL views, in which case the RDF mapping is made on top of the views, not the actual tables. The SQL views reside on the same server that has the RDF views, so no write access to the source database is needed.&lt;/p&gt; &lt;p&gt;The server configuration is found in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/virtuoso.ini&quot; id=&quot;link-id0x181e9df8&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt;. This is for 4 disks and 192 GB RAM, so if you try this, make sure you have at least this much or use an accordingly scaled down dataset.&lt;/p&gt; &lt;p&gt;The data is defined by loading the scripts:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; LOAD &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/att2.sql&quot; id=&quot;link-id0x191fb5d8&quot;&gt;att2.sql&lt;/a&gt; ; SQL&amp;gt; LOAD &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/sql_rdf_rdfh11.sql&quot; id=&quot;link-id0x1b63ef68&quot;&gt;sql_rdf_rdfh11.sql&lt;/a&gt; ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first attaches the tables from the source server; the second defines the mapping from tables to triples. The final script (below) starts the actual ETL.&lt;/p&gt; &lt;p&gt;We set the default vector size to 200,000. Experience shows this is good for this sort of operation, and may save some 20% of time.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; __dbf_set (&amp;#39;dc_batch_sz&amp;#39;, 200000) ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We run the transformation: The commands are in the &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/rdb2rdf_rdfh11_1.sql&quot; id=&quot;link-id0x2aabfa9dd5e8&quot;&gt;rdb2rdf_rdfh11_1.sql&lt;/a&gt;&lt;/code&gt; script, discussed below. The &lt;code&gt;ld_meter_run&lt;/code&gt; starts a thread to record the load rate every 30 seconds.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; LOAD /mvi/te/suite/tpc-d/rdb2rdf_rdfh11_1.sql &amp;amp; SQL&amp;gt; ld_meter_run (30) &amp;amp; Done. -- 40686670 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The load is non-transactional bulk load, so needs an explicit checkpoint to make the result durable.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; checkpoint ; Done. -- 1858934 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- we check the result &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; sparql SELECT COUNT (*) WHERE { ?s ?p ?o } ; 11869611740 SQL&amp;gt; sparql SELECT ?p COUNT (*) WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY DESC 2 LIMIT 200 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Predicate URI&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;number of triples&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;881,038,747&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_order&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_part&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_number&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_discount&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_linestatus&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_quantity&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_extendedprice&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_commitdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_supplier&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_tax&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_returnflag&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_receiptdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipinstruct&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipmode&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_clerk&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_customer_of&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderstatus&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_totalprice&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderpriority&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_shippriority&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_has_supplier&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_availqty&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_supplycost&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_has_part&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_type&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_size&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_container&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_mfgr&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_partkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_brand&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://xmlns.com/foaf/0.1/phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_acctbal&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_mktsegment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_custkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_has_nation&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_address&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#n_nation_of&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_has_nation&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_acctbal&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_address&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_suppkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;...&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt; &lt;i&gt;We calculate the ETL speed:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; SELECT 11869611740 / ( ( 1858934 + 40686670 ) / 1000.0 ) ; 278985.620700084549276&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;11.8 hours, at just under 280 Kt/s, end-to-end. Worse has been heard of. This is a small single-server speed, on the usual test system with dual Xeon E5 2630, 192G RAM. A single-server for double the price might get double throughput. Beyond this, scale out is clearly the better deal. An elastic cluster will get throughput linear to the count of machines for this type of workload.&lt;/p&gt; &lt;p&gt;This shows that deploying mid-size enterprise data as RDF is a job that goes easily overnight with a commodity box, reading directly from the source system; no file-system-based staging areas are needed.&lt;/p&gt; &lt;p&gt;The dataset is 600M order lines; 150M orders; 15M customers; 20M parts, each with 4 suppliers; 1M total suppliers. You can contrast this to what you have in-house to get a rough estimate of what your own DW would come to.&lt;/p&gt; &lt;p&gt;Later, we will use this dataset to illustrate how to scope queries to security categories with graph-level security. Of course, this dataset also provides a point of SQL-to-SPARQL comparison for the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x1c477548&quot;&gt;ongoing TPC-H series&lt;/a&gt;. There will be more installments in not too long.&lt;/p&gt;</atom:content>
  <atom:updated>2014-01-17T16:52:06-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Meeting the Challenges of Linked Data in the Enterprise</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-01-17#1769</atom:id>
  <atom:published>2014-01-17T16:21:27Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1af2a938&quot;&gt;A few blogs back&lt;/a&gt;, I was talking about the comeback of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabf9d7bd18&quot;&gt;SQL&lt;/a&gt; (i.e., relational) &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x2aabf97e4228&quot;&gt;federation&lt;/a&gt;. True, &lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x18276d18&quot;&gt;Virtuoso has always had that&lt;/a&gt;, but in the general perception, it is primarily known for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x97fad48&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://kingsley.idehen.net/describe/?url=http%3A%2F%2Fkingsley.idehen.net%2FDAV%2Fhome%2Fkidehen%2FPublic%2FLinked%2520Data%2520Documents%2FGlossaryOfTerms4.ttl%23LinkedData&quot; id=&quot;link-id0x1c21d6f8&quot;&gt;Linked Data&lt;/a&gt;. Now these two areas of functionality are combined in a way that makes sense and can provide real performance, often surpassing the relational installed base while running &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c1f9138&quot;&gt;SPARQL&lt;/a&gt; with no predefined schema.&lt;/p&gt; &lt;p&gt;So, we take our standard &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1b1f6828&quot;&gt;TPC-H&lt;/a&gt; 100 GB dataset and turn it into RDF. We adjust the schema a little, so that each &lt;code&gt;customer&lt;/code&gt;, its &lt;code&gt;orders&lt;/code&gt;, and the &lt;code&gt;lineitems&lt;/code&gt; of those orders go into a per-customer graph. The &lt;code&gt;part&lt;/code&gt;, &lt;code&gt;partsupp&lt;/code&gt;, and other tables will all go into a public graph. The per-customer graph can be used as a security label; for example, if there is customer self-service access to the warehouse, or if the access is compartmentalized by areas of responsibility (e.g., customer countries or market segments).&lt;/p&gt; &lt;p&gt;We use two Virtuoso processes. The first contains the TPC-H 100G dataset, the same that was discussed in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aabe462fe78&quot;&gt;the TPC-H bulk load article&lt;/a&gt;. The second process attaches the tables from the first via SQL federation, and constructs an RDF translation into its RDF store. The mapping is made with an RDF view, also known as a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtRdb2RDFViewsGeneration&quot; id=&quot;link-id0x1b637708&quot;&gt;Linked Data View&lt;/a&gt;. The initial RDF view can be generated from the relational schema, then edited for the selection of properties. If there are modeling or unit changes in the mapping, these are easiest done with SQL views, in which case the RDF mapping is made on top of the views, not the actual tables. The SQL views reside on the same server that has the RDF views, so no write access to the source database is needed.&lt;/p&gt; &lt;p&gt;The server configuration is found in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/virtuoso.ini&quot; id=&quot;link-id0x181e9df8&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt;. This is for 4 disks and 192 GB RAM, so if you try this, make sure you have at least this much or use an accordingly scaled down dataset.&lt;/p&gt; &lt;p&gt;The data is defined by loading the scripts:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; LOAD &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/att2.sql&quot; id=&quot;link-id0x191fb5d8&quot;&gt;att2.sql&lt;/a&gt; ; SQL&amp;gt; LOAD &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/sql_rdf_rdfh11.sql&quot; id=&quot;link-id0x1b63ef68&quot;&gt;sql_rdf_rdfh11.sql&lt;/a&gt; ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first attaches the tables from the source server; the second defines the mapping from tables to triples. The final script (below) starts the actual ETL.&lt;/p&gt; &lt;p&gt;We set the default vector size to 200,000. Experience shows this is good for this sort of operation, and may save some 20% of time.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; __dbf_set (&amp;#39;dc_batch_sz&amp;#39;, 200000) ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We run the transformation: The commands are in the &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/BlogFilesEnterpriseLinkedDataMadePossible/rdb2rdf_rdfh11_1.sql&quot; id=&quot;link-id0x2aabfa9dd5e8&quot;&gt;rdb2rdf_rdfh11_1.sql&lt;/a&gt;&lt;/code&gt; script, discussed below. The &lt;code&gt;ld_meter_run&lt;/code&gt; starts a thread to record the load rate every 30 seconds.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; LOAD /mvi/te/suite/tpc-d/rdb2rdf_rdfh11_1.sql &amp;amp; SQL&amp;gt; ld_meter_run (30) &amp;amp; Done. -- 40686670 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The load is non-transactional bulk load, so needs an explicit checkpoint to make the result durable.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; checkpoint ; Done. -- 1858934 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- we check the result &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; sparql SELECT COUNT (*) WHERE { ?s ?p ?o } ; 11869611740 SQL&amp;gt; sparql SELECT ?p COUNT (*) WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY DESC 2 LIMIT 200 ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Predicate URI&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;number of triples&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;881,038,747&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_order&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_part&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_number&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_discount&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_linestatus&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_quantity&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_extendedprice&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_commitdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_has_supplier&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_tax&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_returnflag&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_receiptdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipinstruct&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#l_shipmode&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;600,037,902&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_clerk&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_customer_of&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderstatus&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_totalprice&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderpriority&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_orderdate&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#o_shippriority&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;150,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_has_supplier&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_availqty&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_supplycost&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#ps_has_part&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;80,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_type&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_size&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_container&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_mfgr&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_partkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_brand&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#p_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;20,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://xmlns.com/foaf/0.1/phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_acctbal&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_mktsegment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_custkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_has_nation&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_address&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#c_phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#n_nation_of&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_has_nation&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_acctbal&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_name&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_address&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_comment&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_suppkey&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;http://lod2.eu/schemas/rdfh#s_phone&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1,000,000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;...&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt; &lt;i&gt;We calculate the ETL speed:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SQL&amp;gt; SELECT 11869611740 / ( ( 1858934 + 40686670 ) / 1000.0 ) ; 278985.620700084549276&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;11.8 hours, at just under 280 Kt/s, end-to-end. Worse has been heard of. This is a small single-server speed, on the usual test system with dual Xeon E5 2630, 192G RAM. A single-server for double the price might get double throughput. Beyond this, scale out is clearly the better deal. An elastic cluster will get throughput linear to the count of machines for this type of workload.&lt;/p&gt; &lt;p&gt;This shows that deploying mid-size enterprise data as RDF is a job that goes easily overnight with a commodity box, reading directly from the source system; no file-system-based staging areas are needed.&lt;/p&gt; &lt;p&gt;The dataset is 600M order lines; 150M orders; 15M customers; 20M parts, each with 4 suppliers; 1M total suppliers. You can contrast this to what you have in-house to get a rough estimate of what your own DW would come to.&lt;/p&gt; &lt;p&gt;Later, we will use this dataset to illustrate how to scope queries to security categories with graph-level security. Of course, this dataset also provides a point of SQL-to-SPARQL comparison for the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x1c477548&quot;&gt;ongoing TPC-H series&lt;/a&gt;. There will be more installments in not too long.&lt;/p&gt;</atom:content>
  <atom:updated>2014-01-17T16:52:01-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>500 Billion Triples Bulk Load Experiment</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2014-01-06#1768</atom:id>
  <atom:published>2014-01-06T16:50:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;Before Christmas, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x2aac7cd09d38&quot;&gt;I wrote about a rerun of BSBM&lt;/a&gt; to check how it works before doing it on 500 Giga-triples (&amp;quot;Gt&amp;quot;) at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac69ec7a88&quot;&gt;CWI&lt;/a&gt;. Now we can talk about the experiment with CWI&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aac7c8c2778&quot;&gt;Scilens&lt;/a&gt; cluster. The specs are in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x37286678&quot;&gt;the previous post&lt;/a&gt;. This is a cautionary tale about large data on one hand, and about high load speed on the other.&lt;/p&gt; &lt;p&gt;The BSBM generator and driver are an ever-fresh source of new terrors. The nature of the gig is that you have a window to do your experiment in, and that involves first generating the test data. It is somewhere around 3 TB of gzipped files. It took a whole week to make the files. During that time of course you want to anticipate what&amp;#39;s going to break with the queries. So while the generator was going, we loaded 50 renamed replicas of the 10 Gt dataset. At partial capacity, we may add, because 4 boxes had half memory taken by the BSBM generator. We hate that program. Of course nobody gives a damn about it so it has been maintained in the worst way possible; for example, the way its cluster version generates slices of data is by having every instance actually generate the full data set, but only write 1 out of so many items to the output. So no amount of capacity will make it faster. As for BSBM itself, if you generate 10 Gt once and occasionally use this as test data, it does not inconvenience you so much. Then, of course, the test driver was patched to generate queries against renamed replicas of a dataset. But then the new driver would not read the dataset summary files made by the previous driver, because of Java class versions. 8 hours to regenerate 10 Gt. A real train wreck. This is by far not the end of it but we are out of space. So on with it; may that program be buried.&lt;/p&gt; &lt;p&gt;In the end, the 2000 gz files with the 500 Gt in them were complete. Then it turns out each file has tens of millions of namespace prefixes at the beginning. So, starting to load a file grows the process by some 9 GB just for the prefixes. So, out of 256 GB of RAM per box, there are about 72 GB taken by the prefixes, if you load 8 files in parallel on each. Well, one could do a &lt;code&gt;sed&lt;/code&gt; script to unzip, expand the prefixes, and rezip, and the file would not be any bigger; but it would be a day to run.&lt;/p&gt; &lt;p&gt;So, anyway with 12 boxes, 24 processes, and (in principle) 384 threads, the load rate is between 3 and 4 million triples per second (&amp;quot;Mt/s&amp;quot;). With 2 boxes, it is 630 Kt/s, so you would say this is scalable. Near enough to linear; the 2 boxes have 12 cores and 2.3GHz, Scilens has 16 at 2.0GHz; close enough.&lt;/p&gt; &lt;p&gt;For the 3-4 Mt rate, there is an average of 200 threads running. This is not full platform, as there&amp;#39;s the 2nd thread of each core idle for the most part. Adding the second thread usually adds some 30% throughput. A high of 5 Mt/s could be had if going to full CPU, but doubling the files being loaded would run out of memory because of the namespace prefixes. See, it is sheer luck that the BSBM thing, inept as it is, is still marginally usable, despite the prefixes and the horrible generator. A bit worse still, and it would have been a non-starter. It comes from the times when RDF just meant inept database, so scalability clearly was not in its design objectives.&lt;/p&gt; &lt;p&gt;With 96 files being loaded across the cluster, we got the run stats below for a couple of 4 minute windows. In each, the data size at time of the sample is between 50 Gt and 100 Gt. The long line is the cluster status summary; the tables below are load rates in the windows between timestamps, so, growth in triple count as triples per second (tps) since the previous sample.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Cluster 24 nodes, 240 s. 18866 m/s 692017 KB/s 21842% cpu 7% read 95% clw threads 356r 0w 114i buffers 99250961 97503789 d 2275 w 0 pfs &lt;/code&gt; &lt;/blockquote&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;load rate &lt;br /&gt; (tps)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;timestamp&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,853,915.028323892     &lt;/td&gt; &lt;td&gt;2014-01-04 08:38:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,245,681.678456353&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,680,757.080973009&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:06 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,138,599.125958298&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:03 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,887,272.575808064&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,093,772.082515462&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,399,343.552149284&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:06 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,184,758.045998296&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:03 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,884,665.444851716&lt;/td&gt; &lt;td&gt;2014-01-04 08:36:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,197,270.027036035&lt;/td&gt; &lt;td&gt;2014-01-04 08:36:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Some hours later --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Cluster 24 nodes, 240 s. 14601 m/s 506784 KB/s 19721% cpu 61% read 1310% clw threads 374r 0w 126i buffers 189886490 107378792 d 1983 w 18 pfs&lt;/code&gt; &lt;/blockquote&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;load rate &lt;br /&gt; (tps)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;timestamp&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,757.708076397     &lt;/td&gt; &lt;td&gt;2014-01-04 11:49:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,274,119.596013466&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,318,539.715342822&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,318,701.609946335&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,127,730.142328589&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,127,731.608946369&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,572.647578414&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,622.779240692&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2,872,466.21779274&lt;/td&gt; &lt;td&gt;2014-01-04 11:47:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2,872,495.383487217&lt;/td&gt; &lt;td&gt;2014-01-04 11:47:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Pretty good. I don&amp;#39;t know of others coming even close.&lt;/p&gt; &lt;p&gt;Next we will look at query plans and scalability in query processing.&lt;/p&gt;</atom:content>
  <atom:updated>2014-01-06T17:47:28-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>500 Billion Triples Bulk Load Experiment</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2014-01-06#1767</atom:id>
  <atom:published>2014-01-06T16:49:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;Before Christmas, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x2aac7cd09d38&quot;&gt;I wrote about a rerun of BSBM&lt;/a&gt; to check how it works before doing it on 500 Giga-triples (&amp;quot;Gt&amp;quot;) at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2aac69ec7a88&quot;&gt;CWI&lt;/a&gt;. Now we can talk about the experiment with CWI&amp;#39;s &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x2aac7c8c2778&quot;&gt;Scilens&lt;/a&gt; cluster. The specs are in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1763&quot; id=&quot;link-id0x37286678&quot;&gt;the previous post&lt;/a&gt;. This is a cautionary tale about large data on one hand, and about high load speed on the other.&lt;/p&gt; &lt;p&gt;The BSBM generator and driver are an ever-fresh source of new terrors. The nature of the gig is that you have a window to do your experiment in, and that involves first generating the test data. It is somewhere around 3 TB of gzipped files. It took a whole week to make the files. During that time of course you want to anticipate what&amp;#39;s going to break with the queries. So while the generator was going, we loaded 50 renamed replicas of the 10 Gt dataset. At partial capacity, we may add, because 4 boxes had half memory taken by the BSBM generator. We hate that program. Of course nobody gives a damn about it so it has been maintained in the worst way possible; for example, the way its cluster version generates slices of data is by having every instance actually generate the full data set, but only write 1 out of so many items to the output. So no amount of capacity will make it faster. As for BSBM itself, if you generate 10 Gt once and occasionally use this as test data, it does not inconvenience you so much. Then, of course, the test driver was patched to generate queries against renamed replicas of a dataset. But then the new driver would not read the dataset summary files made by the previous driver, because of Java class versions. 8 hours to regenerate 10 Gt. A real train wreck. This is by far not the end of it but we are out of space. So on with it; may that program be buried.&lt;/p&gt; &lt;p&gt;In the end, the 2000 gz files with the 500 Gt in them were complete. Then it turns out each file has tens of millions of namespace prefixes at the beginning. So, starting to load a file grows the process by some 9 GB just for the prefixes. So, out of 256 GB of RAM per box, there are about 72 GB taken by the prefixes, if you load 8 files in parallel on each. Well, one could do a &lt;code&gt;sed&lt;/code&gt; script to unzip, expand the prefixes, and rezip, and the file would not be any bigger; but it would be a day to run.&lt;/p&gt; &lt;p&gt;So, anyway with 12 boxes, 24 processes, and (in principle) 384 threads, the load rate is between 3 and 4 million triples per second (&amp;quot;Mt/s&amp;quot;). With 2 boxes, it is 630 Kt/s, so you would say this is scalable. Near enough to linear; the 2 boxes have 12 cores and 2.3GHz, Scilens has 16 at 2.0GHz; close enough.&lt;/p&gt; &lt;p&gt;For the 3-4 Mt rate, there is an average of 200 threads running. This is not full platform, as there&amp;#39;s the 2nd thread of each core idle for the most part. Adding the second thread usually adds some 30% throughput. A high of 5 Mt/s could be had if going to full CPU, but doubling the files being loaded would run out of memory because of the namespace prefixes. See, it is sheer luck that the BSBM thing, inept as it is, is still marginally usable, despite the prefixes and the horrible generator. A bit worse still, and it would have been a non-starter. It comes from the times when RDF just meant inept database, so scalability clearly was not in its design objectives.&lt;/p&gt; &lt;p&gt;With 96 files being loaded across the cluster, we got the run stats below for a couple of 4 minute windows. In each, the data size at time of the sample is between 50 Gt and 100 Gt. The long line is the cluster status summary; the tables below are load rates in the windows between timestamps, so, growth in triple count as triples per second (tps) since the previous sample.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Cluster 24 nodes, 240 s. 18866 m/s 692017 KB/s 21842% cpu 7% read 95% clw threads 356r 0w 114i buffers 99250961 97503789 d 2275 w 0 pfs &lt;/code&gt; &lt;/blockquote&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;load rate &lt;br /&gt; (tps)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;timestamp&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,853,915.028323892     &lt;/td&gt; &lt;td&gt;2014-01-04 08:38:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,245,681.678456353&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,680,757.080973009&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:06 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,138,599.125958298&lt;/td&gt; &lt;td&gt;2014-01-04 08:38:03 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,887,272.575808064&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,093,772.082515462&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,399,343.552149284&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:06 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,184,758.045998296&lt;/td&gt; &lt;td&gt;2014-01-04 08:37:03 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,884,665.444851716&lt;/td&gt; &lt;td&gt;2014-01-04 08:36:36 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4,197,270.027036035&lt;/td&gt; &lt;td&gt;2014-01-04 08:36:33 +0000&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Some hours later --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Cluster 24 nodes, 240 s. 14601 m/s 506784 KB/s 19721% cpu 61% read 1310% clw threads 374r 0w 126i buffers 189886490 107378792 d 1983 w 18 pfs&lt;/code&gt; &lt;/blockquote&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;load rate &lt;br /&gt; (tps)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;timestamp&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,757.708076397     &lt;/td&gt; &lt;td&gt;2014-01-04 11:49:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,274,119.596013466&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,318,539.715342822&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,318,701.609946335&lt;/td&gt; &lt;td&gt;2014-01-04 11:49:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,127,730.142328589&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,127,731.608946369&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,572.647578414&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3,273,622.779240692&lt;/td&gt; &lt;td&gt;2014-01-04 11:48:23 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2,872,466.21779274&lt;/td&gt; &lt;td&gt;2014-01-04 11:47:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2,872,495.383487217&lt;/td&gt; &lt;td&gt;2014-01-04 11:47:53 +0000&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Pretty good. I don&amp;#39;t know of others coming even close.&lt;/p&gt; &lt;p&gt;Next we will look at query plans and scalability in query processing.&lt;/p&gt;</atom:content>
  <atom:updated>2014-01-06T17:47:21-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF Meets Security</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-12-17#1766</atom:id>
  <atom:published>2013-12-17T17:16:04Z</atom:published>
  <atom:content type="html">&lt;p&gt;We regularly encounter user scenarios where there is a need for selective access to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aac345ac178&quot;&gt;RDF&lt;/a&gt; and other &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0x2aac3539c228&quot;&gt;graph-model&lt;/a&gt; data. In a &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2aac1c9d2218&quot;&gt;schema&lt;/a&gt;-less situation, the graph is the natural unit of access control. A common design pattern is to put all the triples that represent one logical entity, possibly including immediately dependent entities, into the same graph. The application will then usually replace the whole graph when some part of it changes.&lt;/p&gt; &lt;p&gt;In this usage pattern, the graph is akin to a &lt;a href=&quot;http://dbpedia.org/resource/Relational_model&quot; id=&quot;link-id0x2aac250bc708&quot;&gt;relational&lt;/a&gt; row, plus maybe items of one to many tables; for example, an order and its order lines would make a single graph. In a publishing setting, what goes into a graph is whatever is approved for publication as a unit. So, a graph is conceptually somewhere between a row and a document.&lt;/p&gt; &lt;p&gt;The access control situations further fall into two principal types.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;In a &lt;i&gt;hosted application&lt;/i&gt; setting, the user will see his own data. Most of the database is invisible.&lt;/li&gt; &lt;li&gt;In a &lt;i&gt;data publishing&lt;/i&gt; setting, there will typically be a large quantity of data visible to all, plus some premium content visible only for users who pay for this specific content.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;a href=&quot;http://www.openphacts.org/about-open-phacts/about-open-phacts&quot; id=&quot;link-id0x2aac3514df98&quot;&gt;OpenPHACTS&lt;/a&gt;, for example, would fall into the latter category. There the matter is not so much about charging for premium content but about keeping proprietary separate from public.&lt;/p&gt; &lt;p&gt;The graph is thus a combined &lt;a href=&quot;http://dbpedia.org/resource/Provenance&quot; id=&quot;link-id0x2aac34a75538&quot;&gt;provenance&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Security&quot; id=&quot;link-id0x2aac3071eb28&quot;&gt;security&lt;/a&gt; label. We sometimes hear about applications that would want quints (a quad with an extra field) for separating concerns, but so far no actionable need has materialized. One could do quints if necessary. We did also &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1705&quot; id=&quot;link-id0x2aac342956f8&quot;&gt;in past times&lt;/a&gt; talk to &lt;a href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x2aabf113f258&quot;&gt;Systap&lt;/a&gt;, the vendor of the &lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x2aac30a3c468&quot;&gt;Bigdata®&lt;/a&gt; RDF store, about doing &lt;a href=&quot;http://dbpedia.org/resource/Reification_%28computer_science%29&quot; id=&quot;link-id0x2aac3451dbc8&quot;&gt;reification&lt;/a&gt; right, which would resolve many of these things in one go.&lt;/p&gt; &lt;p&gt;So anyway, it is time to do graph-level security right. The technical approaches depend on how many grantable objects one has, and how many distinct security principals (&amp;quot;grantees&amp;quot;) there are. If the separately grantable objects are numerous (e.g., a billion distinct graphs), and if the typical principal has access to most, it makes sense to enumerate for each principal the items that are denied instead of enumerating the granted ones.&lt;/p&gt; &lt;p&gt;There is a related case of scoping queries to a variable set of graphs. This corresponds to cases like &amp;quot;give me information from sources with an over-average reliability rating.&amp;quot; There is also the security-related special case of scoping to non-classified material. This has the special feature that one part of the query must know what the classified material is, so as to exclude that. However, since from the user&amp;#39;s viewpoint the classified material does not exist, the query must run at two different access control levels and must prevent leakage between the two. This is routinely done with SQL views and SQL policy functions so there is nothing new here, but this is just not something the RDF people have thought much of.&lt;/p&gt; &lt;p&gt;In the hosted-application scenario there is a slowly-changing, relatively-small set of graphs that are in scope for a user session. Queries will only consider data where the graph is in this set. This set is typically different for each principal. The distinct end users are not extremely numerous; maybe in the thousands.&lt;/p&gt; &lt;p&gt;In a publishing setting, there is a small set of restricted content and a large number of principals; however, many principals will have exactly the same exclude list (e.g.: no special access; paid access to content class A or B or both; etc.). The number of access compartments is small relative to the number of principals, and many independent principals will share the same set of premium content. As a result, the number of distinct exclusion lists will not be extremely large, even if the lists may be mid-size.&lt;/p&gt; &lt;p&gt;How does one build this into the database? This is done by a selective &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x2aac277fb6c8&quot;&gt;hash join&lt;/a&gt; for granted lists, and a hash anti-join (&lt;code&gt;NOT EXISTs&lt;/code&gt; operator) for the exclusion lists. From the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac0fc0f288&quot;&gt;TPC-H series&lt;/a&gt;, we recall that there is an invisible hash join operation that can be merged into a table scan/index lookup. This is the ideal building block for this task, except that it needs to be extended to also have a negative form. The negative form also occurs in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac1e2e89a8&quot;&gt;TPC-H&lt;/a&gt; -- for example, in Q16, where one considers only stock from suppliers with no customer complaints.&lt;/p&gt; &lt;p&gt;There are a few distinct cases of application behavior where the cost of enforcing graph-level access will be different. For example, in OpenPHACTS, a query is often a union/join between graph patterns where the graph is fixed. In this way, each triple pattern has exactly one named graph where it can be matched, but many named graphs are mentioned in the query. In this case, the access check has no cost, or the cost is a vanishingly small constant. In the case of the hosted application, where the named graph corresponds to a unit of update (&amp;quot;row&amp;quot; or &amp;quot;document,&amp;quot; as discussed above), the query typically does not specify a named graph, so each triple pattern can match anywhere within the visible graphs. There the check is enforced at each triple pattern, but this is always against the same list (i.e., hash table), and the hash table will most often fit in CPU cache. Most of the accesses will find a match in the hash table.&lt;/p&gt; &lt;p&gt;In the publishing case, where relatively small premium content is to be excluded, the named graph will also generally not be specified; but it can happen that some parts of the query are required to match within the same named graph -- i.e., there is a pattern like &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; graph ?g { ?x xx:about &amp;lt;stuff&amp;gt; . ?x xx:date ?dt . filter ( ?dt &amp;gt; ... ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Here, the named graph needs to be checked only once for the two patterns. We also note that since most of the content is not restricted, the check against the restriction will nearly always fail -- i.e., the hash lookup will miss. Missing is cheaper than hitting, as mentioned in the TPC-H series. One can use a &lt;a href=&quot;http://dbpedia.org/resource/Bloom_filter&quot; id=&quot;link-id0x2aac02b4c848&quot;&gt;Bloom filter&lt;/a&gt; for low cost miss detection. So it follows that an exclusion list that seldom hits can be maybe 10x bigger than a near-always-hitting inclusion list with the same cost of checking.&lt;/p&gt; &lt;p&gt;So, if inclusion lists are in the 100,000-entry range and exclusion lists in the 1,000,000-item range, we are set. What if this is not so? In that case, we will rely on two-level tricks and encoding of application information into supposedly meaning-free identifiers. This is not sem-head material but is well within the domain of database science. For example, if the graph is a marker of provenance or update locality, then all graphs of the same owner or security classification may have an identifier in a certain range or ranges. Then we may only check for range, i.e., omit the low few bits from the hash lookup, knowing that any graph id in the range will have the same security behavior. This does introduce some more burden on the application, and will add some special cases when moving assets between security principals, but then life is like that. If there is a big-ticket application that depends on this, then such things can be provided as custom development.&lt;/p&gt; &lt;p&gt;I will here refer you to &lt;a href=&quot;http://www.linkedin.com/in/davidkarger&quot; id=&quot;link-id0x2aac0d749ba8&quot;&gt;David Karger&lt;/a&gt;&amp;#39;s immortal insight at the &lt;a href=&quot;http://2013.eswc-conferences.org/program/panel&quot; id=&quot;link-id0x2aac268822f8&quot;&gt;Semantic Big Data panel&lt;/a&gt; at &lt;a href=&quot;http://2013.eswc-conferences.org/&quot; id=&quot;link-id0x2aac27327ef8&quot;&gt;ESWC 2013&lt;/a&gt;, where &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1730&quot; id=&quot;link-id0x2aac3529f308&quot;&gt;he said that&lt;/a&gt; &amp;quot;big data is very much about performance, and performance is usually obtained by sacrificing the general for the specific.&amp;quot; So it is.&lt;/p&gt; &lt;p&gt;So far, I have made a summary where the many people with whom this matter has been touched upon may recognize their specific case. Next I will show some experiments. We use a copy of the &lt;a href=&quot;http://www.openlinksw.com/RPC2&quot; id=&quot;link-id0x2aac35527f38&quot;&gt;URIBurner&lt;/a&gt; dataset, as this is a collection with large numbers of tiny graphs that can be assigned different security attributes.&lt;/p&gt; &lt;p&gt;To be continued.&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-17T12:16:04.000017-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF Meets Security</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-12-17#1765</atom:id>
  <atom:published>2013-12-17T17:15:51Z</atom:published>
  <atom:content type="html">&lt;p&gt;We regularly encounter user scenarios where there is a need for selective access to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aac345ac178&quot;&gt;RDF&lt;/a&gt; and other &lt;a href=&quot;http://dbpedia.org/resource/Graph_database&quot; id=&quot;link-id0x2aac3539c228&quot;&gt;graph-model&lt;/a&gt; data. In a &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2aac1c9d2218&quot;&gt;schema&lt;/a&gt;-less situation, the graph is the natural unit of access control. A common design pattern is to put all the triples that represent one logical entity, possibly including immediately dependent entities, into the same graph. The application will then usually replace the whole graph when some part of it changes.&lt;/p&gt; &lt;p&gt;In this usage pattern, the graph is akin to a &lt;a href=&quot;http://dbpedia.org/resource/Relational_model&quot; id=&quot;link-id0x2aac250bc708&quot;&gt;relational&lt;/a&gt; row, plus maybe items of one to many tables; for example, an order and its order lines would make a single graph. In a publishing setting, what goes into a graph is whatever is approved for publication as a unit. So, a graph is conceptually somewhere between a row and a document.&lt;/p&gt; &lt;p&gt;The access control situations further fall into two principal types.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;In a &lt;i&gt;hosted application&lt;/i&gt; setting, the user will see his own data. Most of the database is invisible.&lt;/li&gt; &lt;li&gt;In a &lt;i&gt;data publishing&lt;/i&gt; setting, there will typically be a large quantity of data visible to all, plus some premium content visible only for users who pay for this specific content.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;a href=&quot;http://www.openphacts.org/about-open-phacts/about-open-phacts&quot; id=&quot;link-id0x2aac3514df98&quot;&gt;OpenPHACTS&lt;/a&gt;, for example, would fall into the latter category. There the matter is not so much about charging for premium content but about keeping proprietary separate from public.&lt;/p&gt; &lt;p&gt;The graph is thus a combined &lt;a href=&quot;http://dbpedia.org/resource/Provenance&quot; id=&quot;link-id0x2aac34a75538&quot;&gt;provenance&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Security&quot; id=&quot;link-id0x2aac3071eb28&quot;&gt;security&lt;/a&gt; label. We sometimes hear about applications that would want quints (a quad with an extra field) for separating concerns, but so far no actionable need has materialized. One could do quints if necessary. We did also &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1705&quot; id=&quot;link-id0x2aac342956f8&quot;&gt;in past times&lt;/a&gt; talk to &lt;a href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x2aabf113f258&quot;&gt;Systap&lt;/a&gt;, the vendor of the &lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x2aac30a3c468&quot;&gt;Bigdata®&lt;/a&gt; RDF store, about doing &lt;a href=&quot;http://dbpedia.org/resource/Reification_%28computer_science%29&quot; id=&quot;link-id0x2aac3451dbc8&quot;&gt;reification&lt;/a&gt; right, which would resolve many of these things in one go.&lt;/p&gt; &lt;p&gt;So anyway, it is time to do graph-level security right. The technical approaches depend on how many grantable objects one has, and how many distinct security principals (&amp;quot;grantees&amp;quot;) there are. If the separately grantable objects are numerous (e.g., a billion distinct graphs), and if the typical principal has access to most, it makes sense to enumerate for each principal the items that are denied instead of enumerating the granted ones.&lt;/p&gt; &lt;p&gt;There is a related case of scoping queries to a variable set of graphs. This corresponds to cases like &amp;quot;give me information from sources with an over-average reliability rating.&amp;quot; There is also the security-related special case of scoping to non-classified material. This has the special feature that one part of the query must know what the classified material is, so as to exclude that. However, since from the user&amp;#39;s viewpoint the classified material does not exist, the query must run at two different access control levels and must prevent leakage between the two. This is routinely done with SQL views and SQL policy functions so there is nothing new here, but this is just not something the RDF people have thought much of.&lt;/p&gt; &lt;p&gt;In the hosted-application scenario there is a slowly-changing, relatively-small set of graphs that are in scope for a user session. Queries will only consider data where the graph is in this set. This set is typically different for each principal. The distinct end users are not extremely numerous; maybe in the thousands.&lt;/p&gt; &lt;p&gt;In a publishing setting, there is a small set of restricted content and a large number of principals; however, many principals will have exactly the same exclude list (e.g.: no special access; paid access to content class A or B or both; etc.). The number of access compartments is small relative to the number of principals, and many independent principals will share the same set of premium content. As a result, the number of distinct exclusion lists will not be extremely large, even if the lists may be mid-size.&lt;/p&gt; &lt;p&gt;How does one build this into the database? This is done by a selective &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x2aac277fb6c8&quot;&gt;hash join&lt;/a&gt; for granted lists, and a hash anti-join (&lt;code&gt;NOT EXISTs&lt;/code&gt; operator) for the exclusion lists. From the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac0fc0f288&quot;&gt;TPC-H series&lt;/a&gt;, we recall that there is an invisible hash join operation that can be merged into a table scan/index lookup. This is the ideal building block for this task, except that it needs to be extended to also have a negative form. The negative form also occurs in &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac1e2e89a8&quot;&gt;TPC-H&lt;/a&gt; -- for example, in Q16, where one considers only stock from suppliers with no customer complaints.&lt;/p&gt; &lt;p&gt;There are a few distinct cases of application behavior where the cost of enforcing graph-level access will be different. For example, in OpenPHACTS, a query is often a union/join between graph patterns where the graph is fixed. In this way, each triple pattern has exactly one named graph where it can be matched, but many named graphs are mentioned in the query. In this case, the access check has no cost, or the cost is a vanishingly small constant. In the case of the hosted application, where the named graph corresponds to a unit of update (&amp;quot;row&amp;quot; or &amp;quot;document,&amp;quot; as discussed above), the query typically does not specify a named graph, so each triple pattern can match anywhere within the visible graphs. There the check is enforced at each triple pattern, but this is always against the same list (i.e., hash table), and the hash table will most often fit in CPU cache. Most of the accesses will find a match in the hash table.&lt;/p&gt; &lt;p&gt;In the publishing case, where relatively small premium content is to be excluded, the named graph will also generally not be specified; but it can happen that some parts of the query are required to match within the same named graph -- i.e., there is a pattern like &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; graph ?g { ?x xx:about &amp;lt;stuff&amp;gt; . ?x xx:date ?dt . filter ( ?dt &amp;gt; ... ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Here, the named graph needs to be checked only once for the two patterns. We also note that since most of the content is not restricted, the check against the restriction will nearly always fail -- i.e., the hash lookup will miss. Missing is cheaper than hitting, as mentioned in the TPC-H series. One can use a &lt;a href=&quot;http://dbpedia.org/resource/Bloom_filter&quot; id=&quot;link-id0x2aac02b4c848&quot;&gt;Bloom filter&lt;/a&gt; for low cost miss detection. So it follows that an exclusion list that seldom hits can be maybe 10x bigger than a near-always-hitting inclusion list with the same cost of checking.&lt;/p&gt; &lt;p&gt;So, if inclusion lists are in the 100,000-entry range and exclusion lists in the 1,000,000-item range, we are set. What if this is not so? In that case, we will rely on two-level tricks and encoding of application information into supposedly meaning-free identifiers. This is not sem-head material but is well within the domain of database science. For example, if the graph is a marker of provenance or update locality, then all graphs of the same owner or security classification may have an identifier in a certain range or ranges. Then we may only check for range, i.e., omit the low few bits from the hash lookup, knowing that any graph id in the range will have the same security behavior. This does introduce some more burden on the application, and will add some special cases when moving assets between security principals, but then life is like that. If there is a big-ticket application that depends on this, then such things can be provided as custom development.&lt;/p&gt; &lt;p&gt;I will here refer you to &lt;a href=&quot;http://www.linkedin.com/in/davidkarger&quot; id=&quot;link-id0x2aac0d749ba8&quot;&gt;David Karger&lt;/a&gt;&amp;#39;s immortal insight at the &lt;a href=&quot;http://2013.eswc-conferences.org/program/panel&quot; id=&quot;link-id0x2aac268822f8&quot;&gt;Semantic Big Data panel&lt;/a&gt; at &lt;a href=&quot;http://2013.eswc-conferences.org/&quot; id=&quot;link-id0x2aac27327ef8&quot;&gt;ESWC 2013&lt;/a&gt;, where &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1730&quot; id=&quot;link-id0x2aac3529f308&quot;&gt;he said that&lt;/a&gt; &amp;quot;big data is very much about performance, and performance is usually obtained by sacrificing the general for the specific.&amp;quot; So it is.&lt;/p&gt; &lt;p&gt;So far, I have made a summary where the many people with whom this matter has been touched upon may recognize their specific case. Next I will show some experiments. We use a copy of the &lt;a href=&quot;http://www.openlinksw.com/RPC2&quot; id=&quot;link-id0x2aac35527f38&quot;&gt;URIBurner&lt;/a&gt; dataset, as this is a collection with large numbers of tiny graphs that can be assigned different security attributes.&lt;/p&gt; &lt;p&gt;To be continued.&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-17T12:15:51.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>BSBM Benchmark Season, 2013-2014</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-12-16#1764</atom:id>
  <atom:published>2013-12-16T16:33:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;We are getting ready to run &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2a77ece8&quot;&gt;BSBM&lt;/a&gt; benchmarks at a 500 billion triple scale over the holidays. This will be done on the &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x23335c88&quot;&gt;Scilens&lt;/a&gt; cluster at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2a490868&quot;&gt;CWI&lt;/a&gt;. The system has 16 nodes, each with 2x Xeon E5-2650, 256 GB RAM, and QDR InfiniBand. We will use 12 of these, for a total of 3 TB RAM. I will blog about the experiences in January, after the experiment is done. This is the final &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2c1b90d8&quot;&gt;LOD2 (EU FP7 project)&lt;/a&gt; benchmarking piece.&lt;/p&gt; &lt;p&gt;I will here give results for practice runs on my desktop, with 1/50th the data and 1/8th the capacity. This is 10 billion triples on a system of two machines, each with 2x Xeon E5-2630, 192 GB RAM, and QDR InfiniBand.&lt;/p&gt; &lt;p&gt;We start with Explore with 16 clients. The clients are evenly divided over 4 server processes, with 2 processes per machine. We do a run of 100 -- &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -seed 1287654 -dg http://bsbm.org -t 300000 \ -idir /1d4/bsbm_10000/td_data -uqp query -uc bsbm/explore \ -mt 16 -runs 500 http://madras:8604/sparql \ http://madras:8605/sparql http://masala-i:8606/sparql \ http://masala-i:8607/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The QMPH (query mixes per hour) is 12683.046. The run is 1500 query mixes; it takes 425s. The warmup is about 3000 query mixes with a different seed. The details are in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc16e.xml&quot; id=&quot;link-id0x2b071908&quot;&gt;&lt;code&gt;10gc16e.xml&lt;/code&gt;&lt;/a&gt;. The sample configurations are as in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/virtuoso.global.ini&quot; id=&quot;link-id0x1bc61a18&quot;&gt;&lt;code&gt;virtuoso.global.ini&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/cluster.global.ini&quot; id=&quot;link-id0x1ebe7ef8&quot;&gt;&lt;code&gt;cluster.global.ini&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/virtuoso.ini&quot; id=&quot;link-id0x29ec7988&quot;&gt;&lt;code&gt;virtuoso.ini&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We note that there is a total of 20M 8 KB buffer pages, and after running 1000 or so different query mixes, about 16M get used. So the working set is about 16M * 8 KB = 128 GB, for 10 Gt (&amp;quot;Gigatriples&amp;quot;). The quads themselves take less space than that, but the benchmark also accesses some literals. At 50x the size and at best 2.5 TB worth of buffers, there may be a problem.&lt;/p&gt; &lt;p&gt;The total database files are around 800K pages * 8 KB/slice * 48 slices = 272 GB. This times 50 is 15.3 TB. I do not think the system has that much SSD space, and it has about 3 TB per node in 3-way striped RAID 0 disk. There will be some disk access during the explore run. So we will report one number with steady state from disk, and another for a rerun of a set of queries where data is known to come from memory.&lt;/p&gt; &lt;p&gt;We note that there is speculative read, taking whole extents in when not all pages get used. Whether one reads 8 KB or 2 MB (the extent) makes little difference, so may as well do whole extents. Subtracting the speculatively-read pages that are not in fact accessed, we get 1.5M working set per box, which would indicate that we will make it into a RAM-based steady-state on the 500 Gt Scilens experiment. We shall see.&lt;/p&gt; &lt;p&gt;Loading may present some problems, since last time we had two boxes with significantly worse disk-write throughput than the rest. The Virtuoso I/O system is now different, with more emphasis on writing contiguous sequential ranges of pages, irrespective of the time the page became dirty. But there is nothing that a bad disk will not screw up.&lt;/p&gt; &lt;p&gt;We go to BI. First single user (power) run. This is preceded by one single user BI run with a different seed, for warmup. The power run has 4 consecutive query mixes; the throughput run has the same 4 query mixes concurrently.&lt;/p&gt; &lt;p&gt;Power query mix run time: 229 (arithmetic mean)&lt;/p&gt; &lt;p&gt;Throughput query mix run time: 269s (arithmetic mean)&lt;/p&gt; &lt;p&gt;The test driver output follows, the full result summaries are in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc-4pwer.xml&quot; id=&quot;link-id0x2aef4b98&quot;&gt;&lt;code&gt;10gc-4pwer.xml&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc-4tp.xml&quot; id=&quot;link-id0x2b04fe98&quot;&gt;&lt;code&gt;10gc-4tp.xml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Power Results&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 1 -runs 4 \ http://madras:8604/sparql % java -Xmx256M com.openlinksw.bibm.bsbm.TestDriver -qrd ./bibm \ -dg http://bsbm/ -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 1 -runs 4 \ http://madras:8604/sparql Thread 1: query mix: 0 255.074 s, total: 255.195 s Thread 1: query mix: 1 170.622 s, total: 170.667 s Thread 1: query mix: 2 295.642 s, total: 295.691 s Thread 1: query mix: 3 188.885 s, total: 188.935 s Benchmark run completed in 910.493 s &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table id=&quot;PowerResults&quot; title=&quot;PowerResults&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;thead&gt; &lt;th align=&quot;center&quot;&gt;Query Number&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Execute Count&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeshare&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqetg&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aps&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;minqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;maxqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Average Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Min Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Max Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeout Count&lt;/th&gt; &lt;/thead&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.079&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.281250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.848979&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.108&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.141000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;18.836000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.358&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.365000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.907928&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.186&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.539000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;8.182000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;25.639&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;58.343500&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;24.902196&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.017&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.640000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;111.680000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;28.908&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;13.156450&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.725366&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.076&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.130000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;73.728000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;92.650&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;55&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.229&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.565350&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.550107&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.180&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.202000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16.251000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;30.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;58&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.277&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.631250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.574319&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.584&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.269000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.950000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;49.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;24&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;3.875&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.469625&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.268809&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.680&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.056000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.961000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;54.875&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;413&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;22.635&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.301600&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.450917&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.097&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.626000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;36.908000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Throughput Results&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 4 -runs 4 \ http://madras:8604/sparql http://madras:8605/sparql \ http://masala-i:8606/sparql http://masala-i:8607/sparql % java -Xmx256M com.openlinksw.bibm.bsbm.TestDriver -qrd ./bibm \ -dg http://bsbm/ -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 4 -runs 4 \ http://madras:8604/sparql http://madras:8605/sparql \ http://masala-i:8606/sparql http://masala-i:8607/sparql Thread 2: query mix: 1 474.435 s, total: 474.498 s Thread 1: query mix: 0 669.552 s, total: 669.663 s Thread 3: query mix: 3 914.943 s, total: 915.009 s Thread 4: query mix: 2 1077.138 s, total: 1077.283 s Benchmark run completed in 1077.285 s % &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table id=&quot;ThroughputResults&quot; title=&quot;ThroughputResults&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;thead&gt; &lt;th align=&quot;center&quot;&gt;Query Number&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Execute Count&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeshare&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqetg&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aps&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;minqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;maxqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Average Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Min Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Max Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeout Count&lt;/th&gt; &lt;/thead&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.478&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;19.424500&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.522236&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.150&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.207000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;52.115000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.188&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.312250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.525659&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.313&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.116000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;14.486000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;17.822&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;139.727250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;79.815584&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.021&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;19.953000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;268.652000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;47.737&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;74.853750&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.014962&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.039&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.132000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;728.240000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;92.650&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;55&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.393&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16.296000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;6.905212&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.179&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.406000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;76.083000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;30.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;58&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.557&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.209000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.304804&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.238&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.364000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;45.836000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;49.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;24&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;3.795&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.958458&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.876038&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.587&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.049000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;33.648000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;54.708&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;413&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15.031&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;23.568900&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.495984&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.124&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.614000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;157.444000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We notice quite a bit of variability between the different query mixes. This comes from parameter choices, and runs with different seeds are therefore not comparable, unless they be very long.&lt;/p&gt; &lt;p&gt;What does this promise for the 500 Gt runs? The complexities are &lt;i&gt;&lt;code&gt;n·log(n)&lt;/code&gt;&lt;/i&gt;, with the log pretty constant. There will be some loss of speed from less locality of reference. I expect run times that are 8x or so higher, 50x more data, and about 8x more CPU. The dataset does not scale that linearly throughout, as the product hierarchies may have different depth.&lt;/p&gt; &lt;p&gt;The working set will be OK; on each of the 4 processes, there are 3.1M buffers used, of which 2M are just read ahead, not really hit. When you read, read the whole extent of 256 pages while at it; costs the same and may prefetch. So actually, 4.4M buffers used is 34 GB, times 50 is 1.7 TB. Will fit.&lt;/p&gt; &lt;p&gt;In the interest of advancing standards of disclosure, I am also providing the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/exrun.txt&quot; id=&quot;link-id0x2c291f88&quot;&gt;test driver output&lt;/a&gt; for the runs, and an excerpt of the server query log for an &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/qlogexp.txt&quot; id=&quot;link-id0x2aac0c24bfe8&quot;&gt;interactive query mix&lt;/a&gt; and a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/qlogbi.txt&quot; id=&quot;link-id0x2415b618&quot;&gt;BI query mix&lt;/a&gt;. The query texts and plans are there, with per operator time and cardinality.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup&quot; id=&quot;link-id0x2aac117db2e8&quot;&gt;All supporting files&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2013-12-16T14:02:20.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>BSBM Benchmark Season, 2013-2014</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-12-16#1763</atom:id>
  <atom:published>2013-12-16T16:30:39Z</atom:published>
  <atom:content type="html">&lt;p&gt;We are getting ready to run &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2a77ece8&quot;&gt;BSBM&lt;/a&gt; benchmarks at a 500 billion triple scale over the holidays. This will be done on the &lt;a href=&quot;http://scilens.project.cwi.nl/&quot; id=&quot;link-id0x23335c88&quot;&gt;Scilens&lt;/a&gt; cluster at &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x2a490868&quot;&gt;CWI&lt;/a&gt;. The system has 16 nodes, each with 2x Xeon E5-2650, 256 GB RAM, and QDR InfiniBand. We will use 12 of these, for a total of 3 TB RAM. I will blog about the experiences in January, after the experiment is done. This is the final &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2c1b90d8&quot;&gt;LOD2 (EU FP7 project)&lt;/a&gt; benchmarking piece.&lt;/p&gt; &lt;p&gt;I will here give results for practice runs on my desktop, with 1/50th the data and 1/8th the capacity. This is 10 billion triples on a system of two machines, each with 2x Xeon E5-2630, 192 GB RAM, and QDR InfiniBand.&lt;/p&gt; &lt;p&gt;We start with Explore with 16 clients. The clients are evenly divided over 4 server processes, with 2 processes per machine. We do a run of 100 -- &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -seed 1287654 -dg http://bsbm.org -t 300000 \ -idir /1d4/bsbm_10000/td_data -uqp query -uc bsbm/explore \ -mt 16 -runs 500 http://madras:8604/sparql \ http://madras:8605/sparql http://masala-i:8606/sparql \ http://masala-i:8607/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The QMPH (query mixes per hour) is 12683.046. The run is 1500 query mixes; it takes 425s. The warmup is about 3000 query mixes with a different seed. The details are in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc16e.xml&quot; id=&quot;link-id0x2b071908&quot;&gt;&lt;code&gt;10gc16e.xml&lt;/code&gt;&lt;/a&gt;. The sample configurations are as in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/virtuoso.global.ini&quot; id=&quot;link-id0x1bc61a18&quot;&gt;&lt;code&gt;virtuoso.global.ini&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/cluster.global.ini&quot; id=&quot;link-id0x1ebe7ef8&quot;&gt;&lt;code&gt;cluster.global.ini&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/virtuoso.ini&quot; id=&quot;link-id0x29ec7988&quot;&gt;&lt;code&gt;virtuoso.ini&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We note that there is a total of 20M 8 KB buffer pages, and after running 1000 or so different query mixes, about 16M get used. So the working set is about 16M * 8 KB = 128 GB, for 10 Gt (&amp;quot;Gigatriples&amp;quot;). The quads themselves take less space than that, but the benchmark also accesses some literals. At 50x the size and at best 2.5 TB worth of buffers, there may be a problem.&lt;/p&gt; &lt;p&gt;The total database files are around 800K pages * 8 KB/slice * 48 slices = 272 GB. This times 50 is 15.3 TB. I do not think the system has that much SSD space, and it has about 3 TB per node in 3-way striped RAID 0 disk. There will be some disk access during the explore run. So we will report one number with steady state from disk, and another for a rerun of a set of queries where data is known to come from memory.&lt;/p&gt; &lt;p&gt;We note that there is speculative read, taking whole extents in when not all pages get used. Whether one reads 8 KB or 2 MB (the extent) makes little difference, so may as well do whole extents. Subtracting the speculatively-read pages that are not in fact accessed, we get 1.5M working set per box, which would indicate that we will make it into a RAM-based steady-state on the 500 Gt Scilens experiment. We shall see.&lt;/p&gt; &lt;p&gt;Loading may present some problems, since last time we had two boxes with significantly worse disk-write throughput than the rest. The Virtuoso I/O system is now different, with more emphasis on writing contiguous sequential ranges of pages, irrespective of the time the page became dirty. But there is nothing that a bad disk will not screw up.&lt;/p&gt; &lt;p&gt;We go to BI. First single user (power) run. This is preceded by one single user BI run with a different seed, for warmup. The power run has 4 consecutive query mixes; the throughput run has the same 4 query mixes concurrently.&lt;/p&gt; &lt;p&gt;Power query mix run time: 229 (arithmetic mean)&lt;/p&gt; &lt;p&gt;Throughput query mix run time: 269s (arithmetic mean)&lt;/p&gt; &lt;p&gt;The test driver output follows, the full result summaries are in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc-4pwer.xml&quot; id=&quot;link-id0x2aef4b98&quot;&gt;&lt;code&gt;10gc-4pwer.xml&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/10gc-4tp.xml&quot; id=&quot;link-id0x2b04fe98&quot;&gt;&lt;code&gt;10gc-4tp.xml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Power Results&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 1 -runs 4 \ http://madras:8604/sparql % java -Xmx256M com.openlinksw.bibm.bsbm.TestDriver -qrd ./bibm \ -dg http://bsbm/ -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 1 -runs 4 \ http://madras:8604/sparql Thread 1: query mix: 0 255.074 s, total: 255.195 s Thread 1: query mix: 1 170.622 s, total: 170.667 s Thread 1: query mix: 2 295.642 s, total: 295.691 s Thread 1: query mix: 3 188.885 s, total: 188.935 s Benchmark run completed in 910.493 s &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table id=&quot;PowerResults&quot; title=&quot;PowerResults&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;thead&gt; &lt;th align=&quot;center&quot;&gt;Query Number&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Execute Count&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeshare&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqetg&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aps&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;minqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;maxqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Average Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Min Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Max Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeout Count&lt;/th&gt; &lt;/thead&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.079&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.281250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.848979&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.108&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.141000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;18.836000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.358&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.365000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.907928&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.186&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.539000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;8.182000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;25.639&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;58.343500&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;24.902196&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.017&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.640000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;111.680000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;28.908&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;13.156450&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.725366&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.076&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.130000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;73.728000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;92.650&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;55&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.229&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.565350&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.550107&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.180&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.202000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16.251000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;30.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;58&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.277&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.631250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.574319&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.584&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.269000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.950000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;49.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;24&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;3.875&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.469625&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.268809&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.680&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.056000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.961000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;54.875&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;413&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;22.635&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.301600&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;5.450917&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.097&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.626000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;36.908000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;h3&gt;Throughput Results&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; % ./bibm/bsbmdriver -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 4 -runs 4 \ http://madras:8604/sparql http://madras:8605/sparql \ http://masala-i:8606/sparql http://masala-i:8607/sparql % java -Xmx256M com.openlinksw.bibm.bsbm.TestDriver -qrd ./bibm \ -dg http://bsbm/ -drill -t 300000 -dg http://bsbm.org -idir \ /1d4/bsbm_10000/td_data -uqp query -uc bsbm/bi -mt 4 -runs 4 \ http://madras:8604/sparql http://madras:8605/sparql \ http://masala-i:8606/sparql http://masala-i:8607/sparql Thread 2: query mix: 1 474.435 s, total: 474.498 s Thread 1: query mix: 0 669.552 s, total: 669.663 s Thread 3: query mix: 3 914.943 s, total: 915.009 s Thread 4: query mix: 2 1077.138 s, total: 1077.283 s Benchmark run completed in 1077.285 s % &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;table id=&quot;ThroughputResults&quot; title=&quot;ThroughputResults&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot;&gt; &lt;thead&gt; &lt;th align=&quot;center&quot;&gt;Query Number&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Execute Count&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeshare&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aqetg&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;aps&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;minqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;maxqet&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Average Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Min Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Max Results&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Timeout Count&lt;/th&gt; &lt;/thead&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.478&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;19.424500&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.522236&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.150&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.207000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;52.115000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.188&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.312250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;7.525659&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.313&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.116000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;14.486000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;17.822&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;139.727250&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;79.815584&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.021&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;19.953000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;268.652000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;47.737&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;74.853750&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.014962&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.039&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.132000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;728.240000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;92.650&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;55&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.393&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;16.296000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;6.905212&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.179&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.406000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;76.083000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;30.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;58&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;1.557&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;12.209000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;2.304804&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.238&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.364000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;45.836000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;49.250&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;14&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;24&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;3.795&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;4.958458&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.876038&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.587&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.049000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;33.648000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;54.708&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;413&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;20&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;15.031&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;23.568900&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;9.495984&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.124&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;0.614000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;157.444000&lt;/td&gt; &lt;td align=&quot;right&quot;&gt;10.000&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;10&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We notice quite a bit of variability between the different query mixes. This comes from parameter choices, and runs with different seeds are therefore not comparable, unless they be very long.&lt;/p&gt; &lt;p&gt;What does this promise for the 500 Gt runs? The complexities are &lt;i&gt;&lt;code&gt;n·log(n)&lt;/code&gt;&lt;/i&gt;, with the log pretty constant. There will be some loss of speed from less locality of reference. I expect run times that are 8x or so higher, 50x more data, and about 8x more CPU. The dataset does not scale that linearly throughout, as the product hierarchies may have different depth.&lt;/p&gt; &lt;p&gt;The working set will be OK; on each of the 4 processes, there are 3.1M buffers used, of which 2M are just read ahead, not really hit. When you read, read the whole extent of 256 pages while at it; costs the same and may prefetch. So actually, 4.4M buffers used is 34 GB, times 50 is 1.7 TB. Will fit.&lt;/p&gt; &lt;p&gt;In the interest of advancing standards of disclosure, I am also providing the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/exrun.txt&quot; id=&quot;link-id0x2c291f88&quot;&gt;test driver output&lt;/a&gt; for the runs, and an excerpt of the server query log for an &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/qlogexp.txt&quot; id=&quot;link-id0x2aac0c24bfe8&quot;&gt;interactive query mix&lt;/a&gt; and a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup/qlogbi.txt&quot; id=&quot;link-id0x2415b618&quot;&gt;BI query mix&lt;/a&gt;. The query texts and plans are there, with per operator time and cardinality.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/Holidays2013BSBMBackup&quot; id=&quot;link-id0x2aac117db2e8&quot;&gt;All supporting files&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2013-12-16T14:02:14.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Meets OpenStreetMap: Explorations in ETL</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-12-06#1762</atom:id>
  <atom:published>2013-12-06T17:53:35Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/OpenStreetMap&quot; id=&quot;link-id0x2aac4d351368&quot;&gt;OpenStreetMap&lt;/a&gt; (OSM) is one of the largest open datasets. The &lt;a href=&quot;http://geoknow.eu/&quot; id=&quot;link-id0x2aac4c531528&quot;&gt;GeoKnow&lt;/a&gt; project of which OpenLink is a part is, among other things, drawing on this resource. The EU FP7 project &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2aac4d430f48&quot;&gt;LOD2&lt;/a&gt; has developed a &lt;a href=&quot;http://dbpedia.org/resource/Geospatial_analysis&quot; id=&quot;link-id0x2aac4c9837f8&quot;&gt;geospatial&lt;/a&gt; drill-down benchmark for &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x2aac4d1cbbc8&quot;&gt;RDF&lt;/a&gt; and here we will be applying it to &lt;a href=&quot;http://dbpedia.org/resource/PostGIS&quot; id=&quot;link-id0x2aac4c7a0b88&quot;&gt;PostGIS&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac4d252e48&quot;&gt;Virtuoso&lt;/a&gt; in plain &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aac4d2874f8&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Generic relational performance is the necessary predecessor of any graph performance, so we will talk SQL at first; the Linked Geodata RDFisms will come later.&lt;/p&gt; &lt;p&gt;In this article, we will look in detail at &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2aac4c40d7a8&quot;&gt;ETL&amp;gt; from PostGIS to Virtuoso via &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x2aac4c7cec68&quot;&gt;SQL federation&lt;/a&gt;. In the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac4d32c3f8&quot;&gt;TPC-H series&lt;/a&gt;, we looked at bulk loading from files which are 1:1 shaped like the tables, but life is seldom this simple.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here we will see how to change normalization in schemas, from a denormalized key-value pair-structure in PostGIS, to a normalized &amp;quot;triple table&amp;quot; in Virtuoso. We will also look at data type conversion, overall data transfer speed, and automatic parallelization.&lt;/p&gt; &lt;p&gt;ETL, even with medium data sizes, like with OSM at a little under 600 GB in &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x2aac4d4beaf8&quot;&gt;PostgreSQL&lt;/a&gt; files, is a performance game, like everything in database. Data must move fast, expressing the transformation logic must be compact, and parallelism must be automatic. Next to nobody can write parallel code and the few that can are needed somewhere else.&lt;/p&gt; &lt;p&gt;I suppose, without insider knowledge, I would dump the data into &lt;a href=&quot;http://dbpedia.org/resource/Comma-separated_values&quot; id=&quot;link-id0x2aac4cfb2828&quot;&gt;CSV&lt;/a&gt;; do some &lt;code&gt;sed&lt;/code&gt; scripts or the like for the transformation, maybe in Hadoop if the data were really large; and then I would use the target database&amp;#39;s bulk load utility. This makes the steps so simple that they can be delegated with some possibility of success. This is what data integration tends to be like. As we saw with the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac4c955718&quot;&gt;TPC-H bulk load&lt;/a&gt;, CSV loading is foolproof, easy, and fast.&lt;/p&gt; &lt;p&gt;Further, I would not make a JDBC program to first read one database and write into another because this would have to be explicitly multithreaded, would have loops, would require use of array parameters in order not to get killed by client server latency, would be liable to run into oddities of JDBC implementations, and so forth. Plus, this could be a few hundred lines long, and the developer would come back with questions like, &amp;quot;Why is it slow?&amp;quot; Well, it is slow because of lock contention, because transactions are not turned off, or something of the sort. No. Shell scripts and bulk load anytime.&lt;/p&gt; &lt;p&gt;Now we will explore a third possibility: vectored stored procedures. It is true that nobody uses stored procedures. They are sooo nineties -- where&amp;#39;s the client side Javascript? I will introduce a design pattern that runs table-to-table copy and normalization changes, with perfect parallelism and scale-out, in SQL procedures. This will work from the file system as well, since a CSV file can be accessed as a table. For number of code lines, time-to-solution, as well as run-time performance, this is unbeatable.&lt;/p&gt; &lt;h2&gt;Schema Choices&lt;/h2&gt; &lt;p&gt;The LOD2 project developed a &lt;a href=&quot;http://svn.aksw.org/lod2/D5.1.2/LOD2_D5%202%201_Initial_GEO_Benchmark_Definition.pdf&quot; id=&quot;link-id0x2aabc63dc0b8&quot;&gt;benchmark for geo retrieval in SPARQL&lt;/a&gt;. We have adapted the benchmark to work in SQL against the PostgreSQL OSM schema and a Virtuoso SQL equivalent.&lt;/p&gt; &lt;p&gt;The intent is to run the LOD2 geobench against the planet-wide OSM dataset in PostgreSQL and Virtuoso. With Virtuoso we will also compare scale-out and single server versions.&lt;/p&gt; &lt;p&gt;The PostgreSQL OSM implementation exists in both normalized and denormalized variants. The denormalized variant uses an &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/H-Store&quot; id=&quot;link-id0x2aac4d29db78&quot;&gt;H-Store&lt;/a&gt;&lt;/code&gt; column type, which is a built-in non-first-normal-form set of key-value pairs that can occur as a column value. In Virtuoso, the equivalent would be to use an array in a column value, but this is not very efficient. Rather, we will go the normalized route, getting outstanding &lt;code&gt;JOIN&lt;/code&gt; performance and space efficiency from the column store. Since this is a freestyle race, we take the liberty of borrowing the &lt;a href=&quot;http://www.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSSQLSPARQL&quot; id=&quot;link-id0x2aac4d7baa58&quot;&gt;&lt;code&gt;IRI&lt;/code&gt; data type&lt;/a&gt; from the RDF side of Virtuoso. This offers a fast mapping between names and integer identifiers. This is especially handy for tags. PostgreSQL likely has some similar encoding as part of the H-Store implementation.&lt;/p&gt; &lt;p&gt;The geometry types are transferred as strings, and then re-parsed into the Virtuoso equivalents. The &lt;code&gt;EWKT&lt;/code&gt; syntax is compatible between the systems. The potentially long geometries are stored in a &lt;code&gt;LONG ANY&lt;/code&gt; column, and the always short ones (e.g., bounding boxes and points) into an &lt;code&gt;ANY&lt;/code&gt; column. In both implementations, there is an &lt;a href=&quot;http://dbpedia.org/resource/R-tree&quot; id=&quot;link-id0x2aac4c1a7348&quot;&gt;R-tree index&lt;/a&gt; on the points but not on the linestrings.&lt;/p&gt; &lt;p&gt;We will later look at space consumption and access locality in more detail.&lt;/p&gt; &lt;p&gt;To ETL the PostgreSQL based dataset, we attach the OSM tables as remote tables using &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aac4c338f18&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s SQL federation (&lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x2aac4d36c3c8&quot;&gt;VDB&lt;/a&gt;) feature. This is &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/&quot; id=&quot;link-id0x2aac4d2a6d98&quot;&gt;not in the Open Source Edition&lt;/a&gt; (&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x2aac4c9dca68&quot;&gt;VOS&lt;/a&gt;) but you can get the same effect by dumping the tables into files, and defining the files as tables with the file-table feature.&lt;/p&gt; &lt;p&gt;The tables which have no need of special transformation go with just an &lt;code&gt;INSERT ... SELECT&lt;/code&gt;, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; log_enable (2); INSERT INTO users SELECT * FROM users1 &amp;amp; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The tables which have special datatypes (like geometries or &lt;code&gt;H-Stores&lt;/code&gt;) need a little application logic, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE copy_ways () { log_enable (2); RETURN ( SELECT COUNT (ins_ways ( id, version, user_id, tstamp, changeset_id, tags, linestring_wkt, bbox_wkt ) ) FROM ways1) ; } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first line disables logging and makes inserts non-transactional. The rest does the copy. The scan of the remote table is automatically split by ranges of its primary key, so there is no need for explicit parallelism. The &lt;code&gt;ins_ways&lt;/code&gt; function is called on each thread, on a whole vector of values for each column. In this way operations are batched together, gaining by locality, and eliminating interpretation overhead.&lt;/p&gt; &lt;p&gt;The ins_ways procedure follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE ins_ways ( IN id BIGINT, IN version INT, IN user_id INT, IN tstamp DATETIME, IN changeset_id BIGINT, IN tags ANY ARRAY, IN linestring VARCHAR, IN bbox VARCHAR ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The vectored declaration means that each statement is run on the full input before going to the next.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- Thus, by default, the insert gets 10K consecutive rows to insert. The conversion functions like &lt;code&gt;st_ewkt_read&lt;/code&gt; are also run in a tight loop over a large number of values.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; VECTORED; INSERT INTO ways VALUES ( id, version, user_id, tstamp, changeset_id, st_ewkt_read ( charset_recode ( linestring, &amp;#39;_WIDE_&amp;#39;, &amp;#39;UTF-8&amp;#39; ) ), st_ewkt_read ( charset_recode ( bbox, &amp;#39;_WIDE_&amp;#39;, &amp;#39;UTF-8&amp;#39; ) ) ) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;tags&lt;/code&gt; is a vector of strings where each string is a serialization of the H-Store content. &lt;code&gt;split_and_decode&lt;/code&gt; splits each string into an array at the delimiter.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; tags := split_and_decode ( TRIM ( REPLACE ( REPLACE ( REPLACE ( REPLACE ( tags, &amp;#39;&amp;quot;=&amp;gt;&amp;quot;&amp;#39;, &amp;#39;!!!&amp;#39; ), &amp;#39;&amp;amp;&amp;#39;, &amp;#39;%26&amp;#39; ), &amp;#39;&amp;quot;, &amp;quot;&amp;#39;, &amp;#39;&amp;amp;&amp;#39; ), &amp;#39;=&amp;#39;, &amp;#39;%3D&amp;#39; ), &amp;#39;&amp;quot;&amp;#39; ) ); NOT VECTORED { DECLARE a1, b1 VARCHAR ; DECLARE ws, vs, ts ANY ARRAY ; DECLARE n_sets, n_tags, set_no, wid, inx, pos, fill INT ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- We insert triples of the form &lt;code&gt;tag, way_id, tag_value&lt;/code&gt;. For each of these, we reserve an array of 100K elements. We put the values into the array, and insert when full or when all rows of input are done. An insert of 100K values in one go is much faster than inserting 100K values singly, especially on a cluster.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ws := make_array (100000, &amp;#39;ANY&amp;#39;); ts := make_array (100000, &amp;#39;ANY&amp;#39;); vs := make_array (100000, &amp;#39;ANY&amp;#39;); fill := 0; DECLARE tag_arr, str ANY ARRAY; n_sets := vec_length (tags); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- For each row of input to the vectored function:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR ( set_no := 0 ; set_no &amp;lt; n_sets ; set_no := set_no + 1 ) { wid := vec_ref (id, set_no); tag_arr := vec_ref (tags, set_no); n_tags := LENGTH (tag_arr); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- for each tag in the H-Store string:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR ( inx := 0; inx &amp;lt; n_tags; inx := inx + 2) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- split the tag into a key and a value at the &lt;code&gt;!!!&lt;/code&gt; delimiter&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; str := tag_arr[inx]; pos := strstr(str, &amp;#39;!!!&amp;#39;); a1 := substring(str, 1, pos); b1 := subseq(str, pos + 3); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- add to the array of key-value pairs to insert &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; way_tag_add (ws, ts, vs, fill, wid, a1, b1); } } way_tag_ins (ws, ts, vs); } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Now we define the functions for adding a &lt;code&gt;way, key, value&lt;/code&gt; triple into the batch, and for inserting the batch.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE way_tag_ins ( INOUT ws ANY ARRAY, INOUT ts ANY ARRAY, INOUT vs ANY ARRAY ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- given an array of way ids, tag names, and tag values, insert all rows where the tag is not &lt;code&gt;0&lt;/code&gt;. If the tag is empty, call it unknown instead.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;__i2id&lt;/code&gt; function replaces the tag name with an &lt;code&gt;IRI ID&lt;/code&gt; that is persistently mapped to the name. The insert and the tag name-to-id mapping are done as a single operation. This is a single network round trip for each in a cluster setting. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR VECTORED ( IN wid INT := ws, IN tag ANY := ts, IN val VARCHAR := vs ) { IF (tag &amp;lt;&amp;gt; 0) { IF (&amp;#39;&amp;#39; = tag) tag := &amp;#39;unknown&amp;#39;; INSERT INTO ways_tags VALUES ( __i2id (tag), wid, val ); } } } CREATE PROCEDURE way_tag_add ( INOUT ws ANY ARRAY, INOUT ts ANY ARRAY, INOUT vs ANY ARRAY, INOUT fill INT, IN wid INT, INOUT tg VARCHAR, INOUT val VARCHAR ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Add at the end of the arrays; if full, insert the content and replace with fresh arrays.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;INOUT&lt;/code&gt; keyword means call by reference, which is important; you do not want to copy larger arrays, and you want to return new ones to the caller. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ws[fill] := wid; ts[fill] := tg; vs[fill] := val; fill := fill + 1; IF (100000 = fill) { way_tag_ins (ws, ts, vs); fill := 0; ws := make_array (100000, &amp;#39;ANY&amp;#39;); ts := make_array (100000, &amp;#39;ANY&amp;#39;); vs := make_array (100000, &amp;#39;ANY&amp;#39;); } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The same logic can be applied to any simple data transformation task. Vectoring and automatic parallelism make sure that there is full platform utilization without explicitly working with threads. The &lt;code&gt;NOT VECTORED {}&lt;/code&gt; section allows the procedure to aggregate over all the values in a vector. The &lt;code&gt;FOR VECTORED&lt;/code&gt; construct in the &lt;code&gt;INSERT&lt;/code&gt; function switches back into running on a vector composed in the scalar part so as to get the insert throughput and cluster-friendly message pattern.&lt;/p&gt; &lt;p&gt;Because every non-1MF hack in every application is different, it is not possible to make this fully declarative. But the code is very repetitive and a skeleton could be easily generated from the schema.&lt;/p&gt; &lt;p&gt;In the next installment, we we will analyze the performance of copying the full Open Street Map dataset from PostgreSQL to Virtuoso. To be continued...&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-07T12:38:57-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Meets OpenStreetMap: Explorations in ETL</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-12-06#1761</atom:id>
  <atom:published>2013-12-06T17:53:23Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/OpenStreetMap&quot; id=&quot;link-id0x2aac4d351368&quot;&gt;OpenStreetMap&lt;/a&gt; (OSM) is one of the largest open datasets. The &lt;a href=&quot;http://geoknow.eu/&quot; id=&quot;link-id0x2aac4c531528&quot;&gt;GeoKnow&lt;/a&gt; project of which OpenLink is a part is, among other things, drawing on this resource. The EU FP7 project &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2aac4d430f48&quot;&gt;LOD2&lt;/a&gt; has developed a &lt;a href=&quot;http://dbpedia.org/resource/Geospatial_analysis&quot; id=&quot;link-id0x2aac4c9837f8&quot;&gt;geospatial&lt;/a&gt; drill-down benchmark for &lt;a href=&quot;http://dbpedia.org/resource/RDF&quot; id=&quot;link-id0x2aac4d1cbbc8&quot;&gt;RDF&lt;/a&gt; and here we will be applying it to &lt;a href=&quot;http://dbpedia.org/resource/PostGIS&quot; id=&quot;link-id0x2aac4c7a0b88&quot;&gt;PostGIS&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac4d252e48&quot;&gt;Virtuoso&lt;/a&gt; in plain &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aac4d2874f8&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Generic relational performance is the necessary predecessor of any graph performance, so we will talk SQL at first; the Linked Geodata RDFisms will come later.&lt;/p&gt; &lt;p&gt;In this article, we will look in detail at &lt;a href=&quot;http://dbpedia.org/resource/Extract,_transform,_load&quot; id=&quot;link-id0x2aac4c40d7a8&quot;&gt;ETL&amp;gt; from PostGIS to Virtuoso via &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x2aac4c7cec68&quot;&gt;SQL federation&lt;/a&gt;. In the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac4d32c3f8&quot;&gt;TPC-H series&lt;/a&gt;, we looked at bulk loading from files which are 1:1 shaped like the tables, but life is seldom this simple.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here we will see how to change normalization in schemas, from a denormalized key-value pair-structure in PostGIS, to a normalized &amp;quot;triple table&amp;quot; in Virtuoso. We will also look at data type conversion, overall data transfer speed, and automatic parallelization.&lt;/p&gt; &lt;p&gt;ETL, even with medium data sizes, like with OSM at a little under 600 GB in &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x2aac4d4beaf8&quot;&gt;PostgreSQL&lt;/a&gt; files, is a performance game, like everything in database. Data must move fast, expressing the transformation logic must be compact, and parallelism must be automatic. Next to nobody can write parallel code and the few that can are needed somewhere else.&lt;/p&gt; &lt;p&gt;I suppose, without insider knowledge, I would dump the data into &lt;a href=&quot;http://dbpedia.org/resource/Comma-separated_values&quot; id=&quot;link-id0x2aac4cfb2828&quot;&gt;CSV&lt;/a&gt;; do some &lt;code&gt;sed&lt;/code&gt; scripts or the like for the transformation, maybe in Hadoop if the data were really large; and then I would use the target database&amp;#39;s bulk load utility. This makes the steps so simple that they can be delegated with some possibility of success. This is what data integration tends to be like. As we saw with the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac4c955718&quot;&gt;TPC-H bulk load&lt;/a&gt;, CSV loading is foolproof, easy, and fast.&lt;/p&gt; &lt;p&gt;Further, I would not make a JDBC program to first read one database and write into another because this would have to be explicitly multithreaded, would have loops, would require use of array parameters in order not to get killed by client server latency, would be liable to run into oddities of JDBC implementations, and so forth. Plus, this could be a few hundred lines long, and the developer would come back with questions like, &amp;quot;Why is it slow?&amp;quot; Well, it is slow because of lock contention, because transactions are not turned off, or something of the sort. No. Shell scripts and bulk load anytime.&lt;/p&gt; &lt;p&gt;Now we will explore a third possibility: vectored stored procedures. It is true that nobody uses stored procedures. They are sooo nineties -- where&amp;#39;s the client side Javascript? I will introduce a design pattern that runs table-to-table copy and normalization changes, with perfect parallelism and scale-out, in SQL procedures. This will work from the file system as well, since a CSV file can be accessed as a table. For number of code lines, time-to-solution, as well as run-time performance, this is unbeatable.&lt;/p&gt; &lt;h2&gt;Schema Choices&lt;/h2&gt; &lt;p&gt;The LOD2 project developed a &lt;a href=&quot;http://svn.aksw.org/lod2/D5.1.2/LOD2_D5%202%201_Initial_GEO_Benchmark_Definition.pdf&quot; id=&quot;link-id0x2aab6ed32c68&quot;&gt;benchmark for geo retrieval in SPARQL&lt;/a&gt;. We have adapted the benchmark to work in SQL against the PostgreSQL OSM schema and a Virtuoso SQL equivalent.&lt;/p&gt; &lt;p&gt;The intent is to run the LOD2 geobench against the planet-wide OSM dataset in PostgreSQL and Virtuoso. With Virtuoso we will also compare scale-out and single server versions.&lt;/p&gt; &lt;p&gt;The PostgreSQL OSM implementation exists in both normalized and denormalized variants. The denormalized variant uses an &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/H-Store&quot; id=&quot;link-id0x2aac4d29db78&quot;&gt;H-Store&lt;/a&gt;&lt;/code&gt; column type, which is a built-in non-first-normal-form set of key-value pairs that can occur as a column value. In Virtuoso, the equivalent would be to use an array in a column value, but this is not very efficient. Rather, we will go the normalized route, getting outstanding &lt;code&gt;JOIN&lt;/code&gt; performance and space efficiency from the column store. Since this is a freestyle race, we take the liberty of borrowing the &lt;a href=&quot;http://www.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSSQLSPARQL&quot; id=&quot;link-id0x2aac4d7baa58&quot;&gt;&lt;code&gt;IRI&lt;/code&gt; data type&lt;/a&gt; from the RDF side of Virtuoso. This offers a fast mapping between names and integer identifiers. This is especially handy for tags. PostgreSQL likely has some similar encoding as part of the H-Store implementation.&lt;/p&gt; &lt;p&gt;The geometry types are transferred as strings, and then re-parsed into the Virtuoso equivalents. The &lt;code&gt;EWKT&lt;/code&gt; syntax is compatible between the systems. The potentially long geometries are stored in a &lt;code&gt;LONG ANY&lt;/code&gt; column, and the always short ones (e.g., bounding boxes and points) into an &lt;code&gt;ANY&lt;/code&gt; column. In both implementations, there is an &lt;a href=&quot;http://dbpedia.org/resource/R-tree&quot; id=&quot;link-id0x2aac4c1a7348&quot;&gt;R-tree index&lt;/a&gt; on the points but not on the linestrings.&lt;/p&gt; &lt;p&gt;We will later look at space consumption and access locality in more detail.&lt;/p&gt; &lt;p&gt;To ETL the PostgreSQL based dataset, we attach the OSM tables as remote tables using &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aac4c338f18&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s SQL federation (&lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x2aac4d36c3c8&quot;&gt;VDB&lt;/a&gt;) feature. This is &lt;a href=&quot;http://virtuoso.openlinksw.com/features-comparison-matrix/&quot; id=&quot;link-id0x2aac4d2a6d98&quot;&gt;not in the Open Source Edition&lt;/a&gt; (&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x2aac4c9dca68&quot;&gt;VOS&lt;/a&gt;) but you can get the same effect by dumping the tables into files, and defining the files as tables with the file-table feature.&lt;/p&gt; &lt;p&gt;The tables which have no need of special transformation go with just an &lt;code&gt;INSERT ... SELECT&lt;/code&gt;, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; log_enable (2); INSERT INTO users SELECT * FROM users1 &amp;amp; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The tables which have special datatypes (like geometries or &lt;code&gt;H-Stores&lt;/code&gt;) need a little application logic, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE copy_ways () { log_enable (2); RETURN ( SELECT COUNT (ins_ways ( id, version, user_id, tstamp, changeset_id, tags, linestring_wkt, bbox_wkt ) ) FROM ways1) ; } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first line disables logging and makes inserts non-transactional. The rest does the copy. The scan of the remote table is automatically split by ranges of its primary key, so there is no need for explicit parallelism. The &lt;code&gt;ins_ways&lt;/code&gt; function is called on each thread, on a whole vector of values for each column. In this way operations are batched together, gaining by locality, and eliminating interpretation overhead.&lt;/p&gt; &lt;p&gt;The ins_ways procedure follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE ins_ways ( IN id BIGINT, IN version INT, IN user_id INT, IN tstamp DATETIME, IN changeset_id BIGINT, IN tags ANY ARRAY, IN linestring VARCHAR, IN bbox VARCHAR ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The vectored declaration means that each statement is run on the full input before going to the next.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- Thus, by default, the insert gets 10K consecutive rows to insert. The conversion functions like &lt;code&gt;st_ewkt_read&lt;/code&gt; are also run in a tight loop over a large number of values.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; VECTORED; INSERT INTO ways VALUES ( id, version, user_id, tstamp, changeset_id, st_ewkt_read ( charset_recode ( linestring, &amp;#39;_WIDE_&amp;#39;, &amp;#39;UTF-8&amp;#39; ) ), st_ewkt_read ( charset_recode ( bbox, &amp;#39;_WIDE_&amp;#39;, &amp;#39;UTF-8&amp;#39; ) ) ) ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;tags&lt;/code&gt; is a vector of strings where each string is a serialization of the H-Store content. &lt;code&gt;split_and_decode&lt;/code&gt; splits each string into an array at the delimiter.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; tags := split_and_decode ( TRIM ( REPLACE ( REPLACE ( REPLACE ( REPLACE ( tags, &amp;#39;&amp;quot;=&amp;gt;&amp;quot;&amp;#39;, &amp;#39;!!!&amp;#39; ), &amp;#39;&amp;amp;&amp;#39;, &amp;#39;%26&amp;#39; ), &amp;#39;&amp;quot;, &amp;quot;&amp;#39;, &amp;#39;&amp;amp;&amp;#39; ), &amp;#39;=&amp;#39;, &amp;#39;%3D&amp;#39; ), &amp;#39;&amp;quot;&amp;#39; ) ); NOT VECTORED { DECLARE a1, b1 VARCHAR ; DECLARE ws, vs, ts ANY ARRAY ; DECLARE n_sets, n_tags, set_no, wid, inx, pos, fill INT ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- We insert triples of the form &lt;code&gt;tag, way_id, tag_value&lt;/code&gt;. For each of these, we reserve an array of 100K elements. We put the values into the array, and insert when full or when all rows of input are done. An insert of 100K values in one go is much faster than inserting 100K values singly, especially on a cluster.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ws := make_array (100000, &amp;#39;ANY&amp;#39;); ts := make_array (100000, &amp;#39;ANY&amp;#39;); vs := make_array (100000, &amp;#39;ANY&amp;#39;); fill := 0; DECLARE tag_arr, str ANY ARRAY; n_sets := vec_length (tags); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- For each row of input to the vectored function:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR ( set_no := 0 ; set_no &amp;lt; n_sets ; set_no := set_no + 1 ) { wid := vec_ref (id, set_no); tag_arr := vec_ref (tags, set_no); n_tags := LENGTH (tag_arr); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- for each tag in the H-Store string:&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR ( inx := 0; inx &amp;lt; n_tags; inx := inx + 2) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- split the tag into a key and a value at the &lt;code&gt;!!!&lt;/code&gt; delimiter&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; str := tag_arr[inx]; pos := strstr(str, &amp;#39;!!!&amp;#39;); a1 := substring(str, 1, pos); b1 := subseq(str, pos + 3); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- add to the array of key-value pairs to insert &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; way_tag_add (ws, ts, vs, fill, wid, a1, b1); } } way_tag_ins (ws, ts, vs); } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Now we define the functions for adding a &lt;code&gt;way, key, value&lt;/code&gt; triple into the batch, and for inserting the batch.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CREATE PROCEDURE way_tag_ins ( INOUT ws ANY ARRAY, INOUT ts ANY ARRAY, INOUT vs ANY ARRAY ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- given an array of way ids, tag names, and tag values, insert all rows where the tag is not &lt;code&gt;0&lt;/code&gt;. If the tag is empty, call it unknown instead.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;__i2id&lt;/code&gt; function replaces the tag name with an &lt;code&gt;IRI ID&lt;/code&gt; that is persistently mapped to the name. The insert and the tag name-to-id mapping are done as a single operation. This is a single network round trip for each in a cluster setting. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; FOR VECTORED ( IN wid INT := ws, IN tag ANY := ts, IN val VARCHAR := vs ) { IF (tag &amp;lt;&amp;gt; 0) { IF (&amp;#39;&amp;#39; = tag) tag := &amp;#39;unknown&amp;#39;; INSERT INTO ways_tags VALUES ( __i2id (tag), wid, val ); } } } CREATE PROCEDURE way_tag_add ( INOUT ws ANY ARRAY, INOUT ts ANY ARRAY, INOUT vs ANY ARRAY, INOUT fill INT, IN wid INT, INOUT tg VARCHAR, INOUT val VARCHAR ) { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Add at the end of the arrays; if full, insert the content and replace with fresh arrays.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;-- The &lt;code&gt;INOUT&lt;/code&gt; keyword means call by reference, which is important; you do not want to copy larger arrays, and you want to return new ones to the caller. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; ws[fill] := wid; ts[fill] := tg; vs[fill] := val; fill := fill + 1; IF (100000 = fill) { way_tag_ins (ws, ts, vs); fill := 0; ws := make_array (100000, &amp;#39;ANY&amp;#39;); ts := make_array (100000, &amp;#39;ANY&amp;#39;); vs := make_array (100000, &amp;#39;ANY&amp;#39;); } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The same logic can be applied to any simple data transformation task. Vectoring and automatic parallelism make sure that there is full platform utilization without explicitly working with threads. The &lt;code&gt;NOT VECTORED {}&lt;/code&gt; section allows the procedure to aggregate over all the values in a vector. The &lt;code&gt;FOR VECTORED&lt;/code&gt; construct in the &lt;code&gt;INSERT&lt;/code&gt; function switches back into running on a vector composed in the scalar part so as to get the insert throughput and cluster-friendly message pattern.&lt;/p&gt; &lt;p&gt;Because every non-1MF hack in every application is different, it is not possible to make this fully declarative. But the code is very repetitive and a skeleton could be easily generated from the schema.&lt;/p&gt; &lt;p&gt;In the next installment, we we will analyze the performance of copying the full Open Street Map dataset from PostgreSQL to Virtuoso. To be continued...&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-07T12:38:31.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC Technical User Community (TUC), 3rd Meeting</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-27#1760</atom:id>
  <atom:published>2013-11-27T17:21:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last week the RDF and graph DB benchmarking project, &lt;a href=&quot;http://ldbc.eu/&quot; id=&quot;link-id0x2aac4eb7ad38&quot;&gt;LDBC&lt;/a&gt;, had its &lt;a href=&quot;http://ldbc.eu:8090/display/TUC/Third%20TUC%20Meeting%2C%20November%202013&quot; id=&quot;link-id0x2aac4f0c0318&quot;&gt;3rd Technical User Community meeting&lt;/a&gt; in London, held in collaboration with the &lt;a href=&quot;http://www.graphconnect.com/london/&quot; id=&quot;link-id0x2aac4f3aa708&quot;&gt;GraphConnect event&lt;/a&gt;. This meeting marks the official launch of the LDBC non-profit company which is the successor of the present EU FP7 project.&lt;/p&gt; &lt;p&gt;The meeting was very well attended, along with most of the new advisory board. &lt;a href=&quot;http://www.linkedin.com/pub/xavier-lopez/b/871/788&quot; id=&quot;link-id0x2aac4eff7128&quot;&gt;Xavier Lopez&lt;/a&gt; from &lt;a href=&quot;http://www.linkedin.com/company/1028&quot; id=&quot;link-id0x2aac4e939db8&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://homes.cs.washington.edu/~luisceze/&quot; id=&quot;link-id0x2aac4e601588&quot;&gt;Luis Ceze&lt;/a&gt; from the &lt;a href=&quot;http://dbpedia.org/resource/University_of_Washington&quot; id=&quot;link-id0x2aac4ec862d8&quot;&gt;University of Washington&lt;/a&gt;, and &lt;a href=&quot;http://www.ifi.uzh.ch/ddis/people/bernstein.html&quot; id=&quot;link-id0x2aac4c0e5978&quot;&gt;Abraham Bernstein&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/University_of_Zurich&quot; id=&quot;link-id0x2aac37e0b168&quot;&gt;University of Zurich&lt;/a&gt; were present. &lt;a href=&quot;http://www.linkedin.com/pub/jans-aasman/0/107/272&quot; id=&quot;link-id0x2aac4f353f68&quot;&gt;Jans Aasman&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/167333&quot; id=&quot;link-id0x2aac4d786768&quot;&gt;Franz, Inc.&lt;/a&gt;, and &lt;a href=&quot;http://www.linkedin.com/pub/karl-huppler/8/ba9/8b4&quot; id=&quot;link-id0x2aac4e9cca38&quot;&gt;Karl Huppler&lt;/a&gt;, former chairman of the &lt;a href=&quot;http://dbpedia.org/resource/Transaction_Processing_Performance_Council&quot; id=&quot;link-id0x2aac4e1df248&quot;&gt;TPC&lt;/a&gt;, were not present but are signed up as advisory board members.&lt;/p&gt; &lt;p&gt;We had great talks by the new board members and invited graph and RDF DB users. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.gsd.inesc-id.pt/~nonius/&quot; id=&quot;link-id0x2aac4f893878&quot;&gt;Nuno Carvalho&lt;/a&gt; of &lt;a href=&quot;http://www.fujitsu.com/emea/about/fle/&quot; id=&quot;link-id0x2aac4f893798&quot;&gt;Fujitsu Labs&lt;/a&gt; presented on the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC-TUC-Fujitsu-Final.pdf?version=1&amp;amp;modificationDate=1385291853000&quot; id=&quot;link-id0x2aac4f893778&quot;&gt;Fujitsu RDF use cases and benchmarking requirements&lt;/a&gt;, based around analytics streaming on time series of streaming data. The technology platform is diverse, with anything from RDF stores to &lt;a href=&quot;http://dbpedia.org/resource/HBase&quot; id=&quot;link-id0x2aac4f893738&quot;&gt;HBase&lt;/a&gt;. The challenge is integration. I pointed out that with &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aac4f483818&quot;&gt;Virtuoso&lt;/a&gt; column store, you could now efficiently host time series data alongside RDF. Sure, a relational format is more efficient with time series data, but it can be co-located with RDF, and queries can join between the two. This is especially so after our stellar bulk-load speed measured with the TPC-H dataset.&lt;/p&gt; &lt;p&gt;Luis Ceze of Washington University presented &lt;a href=&quot;http://sampa.cs.washington.edu/grappa/&quot; id=&quot;link-id0x2aac4f8936d8&quot;&gt;Grappa&lt;/a&gt;, a C++ graph programming framework that in his words would be like &lt;a href=&quot;http://dbpedia.org/resource/Cray_XMT&quot; id=&quot;link-id0x2aac4f284308&quot;&gt;Cray XMT&lt;/a&gt;, later &lt;a href=&quot;http://www.linkedin.com/company/yarcdata&quot; id=&quot;link-id0x2aac4f06a098&quot;&gt;Yarc Data&lt;/a&gt;, in software. The idea is to have a graph algorithm divided into small executable steps, millions in number, and to have very efficient scheduling and switching between these, building latency tolerance into every step of the application. Commodity interconnects like &lt;a href=&quot;http://dbpedia.org/resource/InfiniBand&quot; id=&quot;link-id0x2aac4f83ee28&quot;&gt;InfiniBand&lt;/a&gt; deliver bad throughput with small messages, but with endless message combination opportunities from millions of mini work units, the overall throughput stays good. We know the same from all the Virtuoso scale-out work. Luis is presently working on &lt;a href=&quot;http://labs.oracle.com/pls/apex/f?p=labs:50:0:::::#ero-400&quot; id=&quot;link-id0x2aac4f0e38a8&quot;&gt;GraphBench&lt;/a&gt;, a research project at Washington State funded by Oracle for graph algorithm benchmarking. The major interest for LDBC is in having a library of common graph analytics as a starting point. Having these, the data generation can further evolve so as to create challenges for the algorithms. One issue that came up is the question of validating graph algorithm results: Unlike in SQL queries, there is not necessarily a single correct answer. If the algorithm to use and the count of iterations to run is not fully specified, response times will vary widely. Random walks will anyway create variation between consecutive runs.&lt;/p&gt; &lt;p&gt;Abraham Bernstein presented about the work on his &lt;a href=&quot;http://uzh.github.io/signal-collect/&quot; id=&quot;link-id0x2aac4ea858d8&quot;&gt;Signal/Collect&lt;/a&gt; graph programming framework and its applications in fraud detection. He also talked about the EU FP7 project &lt;a href=&quot;http://vista-tv.eu/&quot; id=&quot;link-id0x2aac4f2cb818&quot;&gt;ViSTA-TV&lt;/a&gt; which does massive stream processing around the real time behavior of internet TV users. Again, Abraham gave very direct suggestions for what to include in the LDBC graph analytics workload.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/andreas-both/22/672/942&quot; id=&quot;link-id0x2aac4e733c18&quot;&gt;Andreas Both&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/124775&quot; id=&quot;link-id0x2aac4ea3c158&quot;&gt;Unister&lt;/a&gt; presented on RDF ontology-driven applications in an e-commerce context. Unister is Germany’s leading e-commerce portal operator with a large number of properties ranging across travel to most B2C. The RDF use cases are many, in principle down to final content distribution but high online demand often calls for specialized solutions like bit field intersections for combining conditions. Sufficiently advanced database technology may also offer this but this is not a guarantee. Selecting travel destinations based on attributes like sports opportunities, culture, etc., can be made into efficient query plans, but this also requires perfect query plans for short queries. I expect to learn more about this when visiting on site. There is clear input for LDBC in these workloads.&lt;/p&gt; &lt;p&gt;There were three talks on semantic applications in cultural heritage. &lt;a href=&quot;http://www.linkedin.com/pub/robina-clayphan/24/290/131&quot; id=&quot;link-id0x247565f8&quot;&gt;Robina Clayphan&lt;/a&gt; of &lt;a href=&quot;http://pro.europeana.eu/web/guest/foundation&quot; id=&quot;link-id0x22ae6c18&quot;&gt;Europeana&lt;/a&gt; talked about this pan-European digital museum and library, and the &lt;a href=&quot;http://pro.europeana.eu/edm-documentation&quot; id=&quot;link-id0x1e12dba8&quot;&gt;Europeana Data Model&lt;/a&gt; (EDM). &lt;a href=&quot;http://no.linkedin.com/pub/christian-emil-ore/8/b7/215&quot; id=&quot;link-id0x2465f718&quot;&gt;C.E. Ore&lt;/a&gt; of the University of Oslo talked about the &lt;a href=&quot;http://cidoc-crm.org/&quot; id=&quot;link-id0x24714ac8&quot;&gt;CIDOC CRM&lt;/a&gt; (Conceptual Reference Model) ontology (&lt;a href=&quot;http://www.iso.org/iso/catalogue_detail?csnumber=34424&quot; id=&quot;link-id0x2472dfa8&quot;&gt;ISO standard 21127:2006&lt;/a&gt;) and its role in representing cultural, historic, and archaeological information. &lt;a href=&quot;http://www.linkedin.com/pub/atanas-kiryakov/0/465/62a&quot; id=&quot;link-id0xc2bbe28&quot;&gt;Atanas Kiryakov&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/208070&quot; id=&quot;link-id0x2471d1e8&quot;&gt;Ontotext&lt;/a&gt; gave a talk on a possible benchmark around &lt;a href=&quot;http://dbpedia.org/resource/CIDOC_Conceptual_Reference_Model&quot; id=&quot;link-id0x24741f88&quot;&gt;CIDOC CRM&lt;/a&gt; reasoning. In the present LDBC work, RDF inference plays a minor role, but reasoning would be emphasized with this CRM workload, in which the inference needed revolves around abbreviating unions between many traversal paths of different lengths between modeled objects. The data is not very large but the ontology has a lot of detail. This still is not the elusive use case which would really require all the &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2aac4f7af718&quot;&gt;OWL&lt;/a&gt; complexities. We will first see how the semantic publishing benchmark work led by Ontotext in LDBC plays out. There is anyhow work enough there.&lt;/p&gt; &lt;p&gt;The most concrete result was that the graph analytics part of the LDBC agenda starts to take shape. The LDBC organization is getting formed, and its processes and policies are getting defined. I visited &lt;a href=&quot;http://www3.in.tum.de/~neumann/&quot; id=&quot;link-id0x2aac4e70c318&quot;&gt;Thomas Neumann&lt;/a&gt;’s group in Munich just prior to the TUC meeting to work on this. Nowadays &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aac4f47ae08&quot;&gt;Peter Boncz&lt;/a&gt;, who was recently awarded the &lt;a href=&quot;http://dbpedia.org/resource/Humboldt_Prize&quot; id=&quot;link-id0x2aac4eb7add8&quot;&gt;Humboldt Prize&lt;/a&gt;, goes to Munich on a weekly basis, so Munich is the favored destination for much LDBC-related work.&lt;/p&gt; &lt;p&gt;The first workload of the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC_SPB_Report_Nov2013.pdf?version=2&amp;amp;modificationDate=1384778837000&quot; id=&quot;link-id0x2aac4eb7adb8&quot;&gt;Social Network Benchmark&lt;/a&gt; is taking shape, and there is good advance also in the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC_SPB_Report_Nov2013.pdf?version=2&amp;amp;modificationDate=1384778837000&quot; id=&quot;link-id0x2aac4f1a89e8&quot;&gt;Semantic Publishing Benchmark&lt;/a&gt;. I will in a future post give more commentary on these workloads, now that the initial drafts from the respective task forces are out.&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-11T16:51:35.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC Technical User Community (TUC), 3rd Meeting</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-27#1759</atom:id>
  <atom:published>2013-11-27T17:20:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;Last week the RDF and graph DB benchmarking project, &lt;a href=&quot;http://ldbc.eu/&quot; id=&quot;link-id0x2aac4eb7ad38&quot;&gt;LDBC&lt;/a&gt;, had its &lt;a href=&quot;http://ldbc.eu:8090/display/TUC/Third%20TUC%20Meeting%2C%20November%202013&quot; id=&quot;link-id0x2aac4f0c0318&quot;&gt;3rd Technical User Community meeting&lt;/a&gt; in London, held in collaboration with the &lt;a href=&quot;http://www.graphconnect.com/london/&quot; id=&quot;link-id0x2aac4f3aa708&quot;&gt;GraphConnect event&lt;/a&gt;. This meeting marks the official launch of the LDBC non-profit company which is the successor of the present EU FP7 project.&lt;/p&gt; &lt;p&gt;The meeting was very well attended, along with most of the new advisory board. &lt;a href=&quot;http://www.linkedin.com/pub/xavier-lopez/b/871/788&quot; id=&quot;link-id0x2aac4eff7128&quot;&gt;Xavier Lopez&lt;/a&gt; from &lt;a href=&quot;http://www.linkedin.com/company/1028&quot; id=&quot;link-id0x2aac4e939db8&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://homes.cs.washington.edu/~luisceze/&quot; id=&quot;link-id0x2aac4e601588&quot;&gt;Luis Ceze&lt;/a&gt; from the &lt;a href=&quot;http://dbpedia.org/resource/University_of_Washington&quot; id=&quot;link-id0x2aac4ec862d8&quot;&gt;University of Washington&lt;/a&gt;, and &lt;a href=&quot;http://www.ifi.uzh.ch/ddis/people/bernstein.html&quot; id=&quot;link-id0x2aac4c0e5978&quot;&gt;Abraham Bernstein&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/University_of_Zurich&quot; id=&quot;link-id0x2aac37e0b168&quot;&gt;University of Zurich&lt;/a&gt; were present. &lt;a href=&quot;http://www.linkedin.com/pub/jans-aasman/0/107/272&quot; id=&quot;link-id0x2aac4f353f68&quot;&gt;Jans Aasman&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/167333&quot; id=&quot;link-id0x2aac4d786768&quot;&gt;Franz, Inc.&lt;/a&gt;, and &lt;a href=&quot;http://www.linkedin.com/pub/karl-huppler/8/ba9/8b4&quot; id=&quot;link-id0x2aac4e9cca38&quot;&gt;Karl Huppler&lt;/a&gt;, former chairman of the &lt;a href=&quot;http://dbpedia.org/resource/Transaction_Processing_Performance_Council&quot; id=&quot;link-id0x2aac4e1df248&quot;&gt;TPC&lt;/a&gt;, were not present but are signed up as advisory board members.&lt;/p&gt; &lt;p&gt;We had great talks by the new board members and invited graph and RDF DB users. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.gsd.inesc-id.pt/~nonius/&quot; id=&quot;link-id0x2aac4f893878&quot;&gt;Nuno Carvalho&lt;/a&gt; of &lt;a href=&quot;http://www.fujitsu.com/emea/about/fle/&quot; id=&quot;link-id0x2aac4f893798&quot;&gt;Fujitsu Labs&lt;/a&gt; presented on the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC-TUC-Fujitsu-Final.pdf?version=1&amp;amp;modificationDate=1385291853000&quot; id=&quot;link-id0x2aac4f893778&quot;&gt;Fujitsu RDF use cases and benchmarking requirements&lt;/a&gt;, based around analytics streaming on time series of streaming data. The technology platform is diverse, with anything from RDF stores to &lt;a href=&quot;http://dbpedia.org/resource/HBase&quot; id=&quot;link-id0x2aac4f893738&quot;&gt;HBase&lt;/a&gt;. The challenge is integration. I pointed out that with &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x2aac4f483818&quot;&gt;Virtuoso&lt;/a&gt; column store, you could now efficiently host time series data alongside RDF. Sure, a relational format is more efficient with time series data, but it can be co-located with RDF, and queries can join between the two. This is especially so after our stellar bulk-load speed measured with the TPC-H dataset.&lt;/p&gt; &lt;p&gt;Luis Ceze of Washington University presented &lt;a href=&quot;http://sampa.cs.washington.edu/grappa/&quot; id=&quot;link-id0x2aac4f8936d8&quot;&gt;Grappa&lt;/a&gt;, a C++ graph programming framework that in his words would be like &lt;a href=&quot;http://dbpedia.org/resource/Cray_XMT&quot; id=&quot;link-id0x2aac4f284308&quot;&gt;Cray XMT&lt;/a&gt;, later &lt;a href=&quot;http://www.linkedin.com/company/yarcdata&quot; id=&quot;link-id0x2aac4f06a098&quot;&gt;Yarc Data&lt;/a&gt;, in software. The idea is to have a graph algorithm divided into small executable steps, millions in number, and to have very efficient scheduling and switching between these, building latency tolerance into every step of the application. Commodity interconnects like &lt;a href=&quot;http://dbpedia.org/resource/InfiniBand&quot; id=&quot;link-id0x2aac4f83ee28&quot;&gt;InfiniBand&lt;/a&gt; deliver bad throughput with small messages, but with endless message combination opportunities from millions of mini work units, the overall throughput stays good. We know the same from all the Virtuoso scale-out work. Luis is presently working on &lt;a href=&quot;http://labs.oracle.com/pls/apex/f?p=labs:50:0:::::#ero-400&quot; id=&quot;link-id0x2aac4f0e38a8&quot;&gt;GraphBench&lt;/a&gt;, a research project at Washington State funded by Oracle for graph algorithm benchmarking. The major interest for LDBC is in having a library of common graph analytics as a starting point. Having these, the data generation can further evolve so as to create challenges for the algorithms. One issue that came up is the question of validating graph algorithm results: Unlike in SQL queries, there is not necessarily a single correct answer. If the algorithm to use and the count of iterations to run is not fully specified, response times will vary widely. Random walks will anyway create variation between consecutive runs.&lt;/p&gt; &lt;p&gt;Abraham Bernstein presented about the work on his &lt;a href=&quot;http://uzh.github.io/signal-collect/&quot; id=&quot;link-id0x2aac4ea858d8&quot;&gt;Signal/Collect&lt;/a&gt; graph programming framework and its applications in fraud detection. He also talked about the EU FP7 project &lt;a href=&quot;http://vista-tv.eu/&quot; id=&quot;link-id0x2aac4f2cb818&quot;&gt;ViSTA-TV&lt;/a&gt; which does massive stream processing around the real time behavior of internet TV users. Again, Abraham gave very direct suggestions for what to include in the LDBC graph analytics workload.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.linkedin.com/pub/andreas-both/22/672/942&quot; id=&quot;link-id0x2aac4e733c18&quot;&gt;Andreas Both&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/124775&quot; id=&quot;link-id0x2aac4ea3c158&quot;&gt;Unister&lt;/a&gt; presented on RDF ontology-driven applications in an e-commerce context. Unister is Germany’s leading e-commerce portal operator with a large number of properties ranging across travel to most B2C. The RDF use cases are many, in principle down to final content distribution but high online demand often calls for specialized solutions like bit field intersections for combining conditions. Sufficiently advanced database technology may also offer this but this is not a guarantee. Selecting travel destinations based on attributes like sports opportunities, culture, etc., can be made into efficient query plans, but this also requires perfect query plans for short queries. I expect to learn more about this when visiting on site. There is clear input for LDBC in these workloads.&lt;/p&gt; &lt;p&gt;There were three talks on semantic applications in cultural heritage. &lt;a href=&quot;http://www.linkedin.com/pub/robina-clayphan/24/290/131&quot; id=&quot;link-id0x2aac3463e858&quot;&gt;Robina Clayphan&lt;/a&gt; of &lt;a href=&quot;http://pro.europeana.eu/web/guest/foundation&quot; id=&quot;link-id0x2aac3486e998&quot;&gt;Europeana&lt;/a&gt; talked about this pan-European digital museum and library, and the &lt;a href=&quot;http://pro.europeana.eu/edm-documentation&quot; id=&quot;link-id0x2aabe7afafa8&quot;&gt;Europeana Data Model&lt;/a&gt; (EDM). &lt;a href=&quot;http://no.linkedin.com/pub/christian-emil-ore/8/b7/215&quot; id=&quot;link-id0x2aac35e62f58&quot;&gt;C.E. Ore&lt;/a&gt; of the University of Oslo talked about the &lt;a href=&quot;http://cidoc-crm.org/&quot; id=&quot;link-id0x2aabcfdf2a88&quot;&gt;CIDOC CRM&lt;/a&gt; (Conceptual Reference Model) ontology (&lt;a href=&quot;http://www.iso.org/iso/catalogue_detail?csnumber=34424&quot; id=&quot;link-id0x2aac4c5d63e8&quot;&gt;ISO standard 21127:2006&lt;/a&gt;) and its role in representing cultural, historic, and archaeological information. &lt;a href=&quot;http://www.linkedin.com/pub/atanas-kiryakov/0/465/62a&quot; id=&quot;link-id0x2aac3542aef8&quot;&gt;Atanas Kiryakov&lt;/a&gt; of &lt;a href=&quot;http://www.linkedin.com/company/208070&quot; id=&quot;link-id0x2aab69c82b28&quot;&gt;Ontotext&lt;/a&gt; gave a talk on a possible benchmark around &lt;a href=&quot;http://dbpedia.org/resource/CIDOC_Conceptual_Reference_Model&quot; id=&quot;link-id0x2aac37cd2518&quot;&gt;CIDOC CRM&lt;/a&gt; reasoning. In the present LDBC work, RDF inference plays a minor role, but reasoning would be emphasized with this CRM workload, in which the inference needed revolves around abbreviating unions between many traversal paths of different lengths between modeled objects. The data is not very large but the ontology has a lot of detail. This still is not the elusive use case which would really require all the &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2aac4f7af718&quot;&gt;OWL&lt;/a&gt; complexities. We will first see how the semantic publishing benchmark work led by Ontotext in LDBC plays out. There is anyhow work enough there.&lt;/p&gt; &lt;p&gt;The most concrete result was that the graph analytics part of the LDBC agenda starts to take shape. The LDBC organization is getting formed, and its processes and policies are getting defined. I visited &lt;a href=&quot;http://www3.in.tum.de/~neumann/&quot; id=&quot;link-id0x2aac4e70c318&quot;&gt;Thomas Neumann&lt;/a&gt;’s group in Munich just prior to the TUC meeting to work on this. Nowadays &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x2aac4f47ae08&quot;&gt;Peter Boncz&lt;/a&gt;, who was recently awarded the &lt;a href=&quot;http://dbpedia.org/resource/Humboldt_Prize&quot; id=&quot;link-id0x2aac4eb7add8&quot;&gt;Humboldt Prize&lt;/a&gt;, goes to Munich on a weekly basis, so Munich is the favored destination for much LDBC-related work.&lt;/p&gt; &lt;p&gt;The first workload of the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC_SPB_Report_Nov2013.pdf?version=2&amp;amp;modificationDate=1384778837000&quot; id=&quot;link-id0x2aac4eb7adb8&quot;&gt;Social Network Benchmark&lt;/a&gt; is taking shape, and there is good advance also in the &lt;a href=&quot;http://ldbc.eu:8090/download/attachments/4325436/LDBC_SPB_Report_Nov2013.pdf?version=2&amp;amp;modificationDate=1384778837000&quot; id=&quot;link-id0x2aac4f1a89e8&quot;&gt;Semantic Publishing Benchmark&lt;/a&gt;. I will in a future post give more commentary on these workloads, now that the initial drafts from the respective task forces are out.&lt;/p&gt;</atom:content>
  <atom:updated>2013-12-11T16:51:17.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 8 of n) -- TPC-H: INs, Expressions, ORs</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-25#1758</atom:id>
  <atom:published>2013-11-25T17:22:46Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this installment, we look at &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabd9458d78&quot;&gt;TPC-H&lt;/a&gt; Q7, Q12, Q19, Q21, and Q22. These have complex expressions and require some tricks with &lt;code&gt;OR&lt;/code&gt; and &lt;code&gt;IN&lt;/code&gt;. Also proper order between &lt;code&gt;JOINs&lt;/code&gt; and expressions is tested in Q21.&lt;/p&gt; &lt;h2&gt; &lt;code&gt;IN&lt;/code&gt; Predicates&lt;/h2&gt; &lt;p&gt;One of the choke points mentioned in the &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x2aac0c0d7d98&quot;&gt;TPC-H Analyzed&lt;/a&gt;&lt;/i&gt; paper is the &lt;code&gt;IN&lt;/code&gt; predicate with a list of constants. This occurs in Q12 and Q22. Q12 is the simpler of the two:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_shipmode , SUM ( CASE WHEN o_orderpriority = &amp;#39;1-URGENT&amp;#39; OR o_orderpriority = &amp;#39;2-HIGH&amp;#39; THEN 1 ELSE 0 END ) AS high_line_count, SUM ( CASE WHEN o_orderpriority &amp;lt;&amp;gt; &amp;#39;1-URGENT&amp;#39; AND o_orderpriority &amp;lt;&amp;gt; &amp;#39;2-HIGH&amp;#39; THEN 1 ELSE 0 END ) AS low_line_count FROM orders, lineitem WHERE o_orderkey = l_orderkey AND l_shipmode IN (&amp;#39;MAIL&amp;#39;, &amp;#39;SHIP&amp;#39;) AND l_commitdate &amp;lt; l_receiptdate AND l_shipdate &amp;lt; l_commitdate AND l_receiptdate &amp;gt;= CAST (&amp;#39;1994-01-01&amp;#39; AS DATE) AND l_receiptdate &amp;lt; DATEADD (&amp;#39;year&amp;#39;, 1, CAST (&amp;#39;1994-01-01&amp;#39; AS DATE)) GROUP BY l_shipmode ORDER BY l_shipmode&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The execution profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 2.2e-05% fanout 1 input 1 rows time 0.00023% fanout 1 input 1 rows Precode: 0: chash_in_init := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c MAIL&amp;gt;, &amp;lt;c SHIP&amp;gt;) 5: BReturn 0 { fork time 1.2e-05% fanout 1 input 1 rows { fork time 86% fanout 2.60039e+07 input 1 rows LINEITEM 2.4e+06 rows(.L_COMMITDATE, .L_RECEIPTDATE, .L_SHIPDATE, .L_ORDERKEY, .L_SHIPMODE) L_RECEIPTDATE &amp;gt;= &amp;lt;c 1994-01-01&amp;gt; &amp;lt; &amp;lt;c 1995-01-01&amp;gt; hash partition+bloom by 0 () time 4.4% fanout 0.119803 input 2.60039e+07 rows END Node After test: 0: if (.L_COMMITDATE &amp;lt; .L_RECEIPTDATE) then 4 else 9 unkn 9 4: if (.L_SHIPDATE &amp;lt; .L_COMMITDATE) then 8 else 9 unkn 9 8: BReturn 1 9: BReturn 0 time 7.9% fanout 1 input 3.11534e+06 rows ORDERS unq 1 rows (.O_ORDERPRIORITY) inlined O_ORDERKEY = k_.L_ORDERKEY After code: 0: if (.O_ORDERPRIORITY = &amp;lt;c 1-URGENT&amp;gt;) then 13 else 4 unkn 13 4: if (.O_ORDERPRIORITY = &amp;lt;c 2-HIGH&amp;gt;) then 13 else 8 unkn 13 8: callretSearchedCASE := := artm 1 12: Jump 17 (level=0) 13: callretSearchedCASE := := artm 0 17: if (.O_ORDERPRIORITY = &amp;lt;c 1-URGENT&amp;gt;) then 25 else 21 unkn 21 21: if (.O_ORDERPRIORITY = &amp;lt;c 2-HIGH&amp;gt;) then 25 else 30 unkn 30 25: callretSearchedCASE := := artm 1 29: Jump 34 (level=0) 30: callretSearchedCASE := := artm 0 34: BReturn 0 time 1.3% fanout 0 input 3.11534e+06 rows Sort (.L_SHIPMODE) -&amp;gt; (callretSearchedCASE, callretSearchedCASE) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- rest left out &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 1077 msec 2014% cpu, 3.11419e+06 rnd 5.99896e+08 seq 97.9872% same seg 1.74106% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top item in the profile is the predicate on &lt;code&gt;l_receiptdate&lt;/code&gt;. &lt;i&gt;TPC-H Analyzed&lt;/i&gt; correctly points out that a &lt;code&gt;lineitem&lt;/code&gt; table in date order is best here, because zone maps will work on &lt;code&gt;l_receiptdate&lt;/code&gt; since this is correlated with &lt;code&gt;l_shipdate&lt;/code&gt;, which is the best date ordering column, as it is the most used. The date compare is done first in the scan, as it selects 1/7 and is fast, whereas the &lt;code&gt;IN&lt;/code&gt; selects 2/7 and has more instructions on the execution path.&lt;/p&gt; &lt;h2&gt;Q22&lt;/h2&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT cntrycode, COUNT(*) AS numcust, SUM(c_acctbal) AS totacctbal FROM ( SELECT SUBSTRING(c_phone, 1, 2) AS cntrycode, c_acctbal FROM customer WHERE SUBSTRING(c_phone, 1, 2) IN (&amp;#39;13&amp;#39;, &amp;#39;31&amp;#39;, &amp;#39;23&amp;#39;, &amp;#39;29&amp;#39;, &amp;#39;30&amp;#39;, &amp;#39;18&amp;#39;, &amp;#39;17&amp;#39;) AND c_acctbal &amp;gt; ( SELECT AVG(c_acctbal) FROM customer WHERE c_acctbal &amp;gt; 0.00 AND SUBSTRING(c_phone, 1, 2) IN (&amp;#39;13&amp;#39;, &amp;#39;31&amp;#39;, &amp;#39;23&amp;#39;, &amp;#39;29&amp;#39;, &amp;#39;30&amp;#39;, &amp;#39;18&amp;#39;, &amp;#39;17&amp;#39;) ) AND NOT EXISTS ( SELECT * FROM orders WHERE o_custkey = c_custkey ) ) AS custsale GROUP BY cntrycode ORDER BY cntrycode&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Q22 has a condition on a substring of a string column. This merits a separate trick, namely merging the substring extraction into the scan, so the invisible hash-join predicate reads the column, cuts the substring in place, calculates a hash number, &lt;a href=&quot;http://dbpedia.org/resource/Bloom_filter&quot; id=&quot;link-id0x2aac1df3c948&quot;&gt;Bloom filters&lt;/a&gt; this against the &lt;code&gt;IN&lt;/code&gt; set, then finally outputs the row numbers which match. This operation is run-time re-orderable with other conditions, like the test on &lt;code&gt;c_acctbal&lt;/code&gt;. &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aac0e99d2b8&quot;&gt;TPC-DS&lt;/a&gt; has a similar pattern in some queries.&lt;/p&gt; &lt;p&gt;The profile follows.&lt;/p&gt; &lt;p&gt;Q22 is one of the rare queries that clearly benefit from having an index on a foreign key column. The &lt;code&gt;NOT EXISTS&lt;/code&gt; with &lt;code&gt;orders&lt;/code&gt; could be done by hash, but then the hash would have to have every &lt;code&gt;DISTINCT o_custkey&lt;/code&gt; and the hash build could be filtered by a &lt;code&gt;JOIN&lt;/code&gt; on &lt;code&gt;customer&lt;/code&gt; with the conditions on &lt;code&gt;c_acctbal&lt;/code&gt; and &lt;code&gt;c_phone&lt;/code&gt; repeated. Being inside an existence, the number of &lt;code&gt;orders&lt;/code&gt; would not have to be retained, so the hash table would not end up larger than the probe side.&lt;/p&gt; &lt;p&gt;The payoff in Q22 makes it worthwhile to maintain an index on &lt;code&gt;o_custkey&lt;/code&gt; in the refresh functions.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 1.4e-05% fanout 1 input 1 rows time 1.2% fanout 1 input 1 rows Precode: 0: $27 &amp;quot;chash_in_init&amp;quot; := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c 13&amp;gt;, &amp;lt;c 31&amp;gt;, &amp;lt;c 23&amp;gt;, &amp;lt;c 29&amp;gt;, &amp;lt;c 30&amp;gt;, &amp;lt;c 18&amp;gt;, &amp;lt;c 17&amp;gt;) 5: { time 7.9e-06% fanout 1 input 1 rows time 6.7e-05% fanout 1 input 1 rows { fork&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Read &lt;code&gt;customer&lt;/code&gt; once, filter with the &lt;code&gt;IN&lt;/code&gt; predicate, and add up &lt;code&gt;c_acctbal&lt;/code&gt; and &lt;code&gt;count&lt;/code&gt; for the average.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 26% fanout 0 input 1 rows CUSTOMER 1.4e+07 rows(t4.C_ACCTBAL) C_ACCTBAL &amp;gt; 0 hash partition+bloom by 0 () After code: 0: sum count 1 5: sum sumt4.C_ACCTBAL 10: BReturn 0 } After code: 0: temp := artm sum / count 4: aggregate := := artm temp 8: BReturn 0 time 2.6e-05% fanout 0 input 1 rows Subquery Select(aggregate) } 13: BReturn 0 { fork time 1.9e-05% fanout 1 input 1 rows { fork&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- second scan of customer with the test on c_acctbal &amp;gt; average and the same in predicate.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 26% fanout 1.90967e+06 input 1 rows CUSTOMER 2.7e+05 rows(t2.C_CUSTKEY, t2.C_PHONE, t2.C_ACCTBAL) C_ACCTBAL &amp;gt; k_scalar hash partition+bloom by 0 () time 7% fanout 0.333434 input 1.90967e+06 rows END Node After test: 0: if ({ time 0.26% fanout 1 input 1.90967e+06 rows&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- See if the customer has orders. The index lookup is very fast since the keys come in order from the scan of customer.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 5% fanout 9.9955 input 1.90967e+06 rows O_CK 9.9 rows() inlined O_CUSTKEY = k_t2.C_CUSTKEY time 1.6% fanout 0 input 1.90881e+07 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 5 else 4 unkn 5 4: BReturn 1 5: BReturn 0 time 3.1% fanout 1 input 636749 rows Precode: 0: cntrycode := Call substring (t2.C_PHONE, 1 , 2 ) 5: BReturn 0 Stage 2 time 0.5% fanout 0 input 636749 rows Sort (q_cntrycode) -&amp;gt; (t2.C_ACCTBAL, inc) } time 0.011% fanout 7 input 1 rows group by read node (cntrycode, totacctbal, numcust)in each partition slice time 0.0013% fanout 0 input 7 rows Sort (cntrycode) -&amp;gt; (numcust, totacctbal) } time 0.00016% fanout 7 input 1 rows Key from temp (cntrycode, numcust, totacctbal) time 1.4e-05% fanout 0 input 7 rows Select (cntrycode, numcust, totacctbal) } 306 msec 2107% cpu, 1.90678e+06 rnd 4.77961e+07 seq 99.5612% same seg 0.419137% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q21 - Join Order and complex tests&lt;/h2&gt; &lt;p&gt;This identifies &lt;code&gt;suppliers&lt;/code&gt; from a given country that have kept &lt;code&gt;orders&lt;/code&gt; waiting, i.e., they supply a delayed &lt;code&gt;lineitem&lt;/code&gt; and nobody else in the &lt;code&gt;order&lt;/code&gt; supplies a delayed &lt;code&gt;lineitem&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_name, COUNT(*) AS numwait FROM supplier, lineitem l1, orders, nation WHERE s_suppkey = l1.l_suppkey AND o_orderkey = l1.l_orderkey AND o_orderstatus = &amp;#39;F&amp;#39; AND l1.l_receiptdate &amp;gt; l1.l_commitdate AND EXISTS ( SELECT * FROM lineitem l2 WHERE l2.l_orderkey = l1.l_orderkey AND l2.l_suppkey &amp;lt;&amp;gt; l1.l_suppkey ) AND NOT EXISTS ( SELECT * FROM lineitem l3 WHERE l3.l_orderkey = l1.l_orderkey AND l3.l_suppkey &amp;lt;&amp;gt; l1.l_suppkey AND l3.l_receiptdate &amp;gt; l3.l_commitdate ) AND s_nationkey = n_nationkey AND n_name = &amp;#39;SAUDI ARABIA&amp;#39; GROUP BY s_name ORDER BY numwait desc, s_name ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The crucial thing the optimizer must realize is that conditions that depend on a table should not always be placed right after the table because there could be a selective join that costs less. In this case, the plan comes out as a scan of &lt;code&gt;orders&lt;/code&gt; selecting 1/2; then an index lookup on &lt;code&gt;lineitem&lt;/code&gt; which is very efficient because the keys come in order and are tightly local; then the selective hash join with &lt;code&gt;suppliers&lt;/code&gt; from the country is merged into the index lookup. After this, 1/50 of &lt;code&gt;lineitems&lt;/code&gt; are left. Only for these does the system actually fetch the dates. After this comes the series of tests, ordered similarly to how joins are ordered. First the cheap date comparison, then the subqueries. The &lt;code&gt;lineitems&lt;/code&gt; can be fetched by their primary key, which again comes in order. Doing this by hash would duplicate most of the query on the build side and would be a lot of trouble.&lt;/p&gt; &lt;p&gt;Another join order would be &lt;code&gt;lineitem&lt;/code&gt; first, selecting 1/25 with the merged hash-join with &lt;code&gt;supplier&lt;/code&gt;, then &lt;code&gt;orders&lt;/code&gt; by index, selecting 1/2, then the existences. Experiment shows there is no great difference.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 4.5e-06% fanout 1 input 1 rows time 0.0036% fanout 1 input 1 rows { hash filler Subquery 27 { time 3.8e-05% fanout 1 input 1 rows NATION 1 rows(t4.N_NATIONKEY) N_NAME = &amp;lt;c SAUDI ARABIA&amp;gt; time 0.01% fanout 39953 input 1 rows SUPPLIER 4.2e+04 rows(t1.S_SUPPKEY, t1.S_NAME) S_NATIONKEY = t4.N_NATIONKEY After code: 0: t1.S_SUPPKEY := := artm t1.S_SUPPKEY 4: t1.S_NAME := := artm t1.S_NAME 8: BReturn 0 time 0.0019% fanout 0 input 39953 rows Sort hf 48 (t1.S_SUPPKEY) -&amp;gt; (t1.S_NAME) } } time 2.8e-06% fanout 1 input 1 rows { fork time 2.6e-06% fanout 1 input 1 rows { fork time 6.2% fanout 7.30725e+07 input 1 rows ORDERS 7.3e+07 rows(.O_ORDERKEY) O_ORDERSTATUS = &amp;lt;c F&amp;gt; time 33% fanout 0.142002 input 7.30725e+07 rows LINEITEM 0.49 rows(l1.L_RECEIPTDATE, l1.L_COMMITDATE, l1.L_ORDERKEY, l1.L_SUPPKEY) inlined L_ORDERKEY = .O_ORDERKEY hash partition+bloom by 58 (tmp)hash join merged always card 0.04 -&amp;gt; (.S_NAME) time 9.7% fanout 0.0341517 input 1.03764e+07 rows END Node After test: 0: if (l1.L_RECEIPTDATE &amp;gt; l1.L_COMMITDATE) then 4 else 13 unkn 13 4: if ({ time 0.18% fanout 0.630264 input 1.03764e+07 rows time 6.4% fanout 4.99133 input 6.53989e+06 rows LINEITEM 1.1 rows(l3.L_SUPPKEY, l3.L_RECEIPTDATE, l3.L_COMMITDATE) inlined L_ORDERKEY = k_l1.L_ORDERKEY time 1.4% fanout 0.504963 input 3.26427e+07 rows END Node After test: 0: if (l3.L_RECEIPTDATE &amp;gt; l3.L_COMMITDATE) then 4 else 9 unkn 9 4: if (l3.L_SUPPKEY = l1.L_SUPPKEY) then 9 else 8 unkn 9 8: BReturn 1 9: BReturn 0 time 0.17% fanout 0 input 1.64834e+07 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 13 else 8 unkn 13 8: if ({ time 0.052% fanout 0.0570441 input 1.03764e+07 rows time 1.1% fanout 2.13264 input 591914 rows LINEITEM 3.7 rows(l2.L_SUPPKEY) inlined L_ORDERKEY = k_l1.L_ORDERKEY time 0.047% fanout 0.531095 input 1.26234e+06 rows END Node After test: 0: if (l2.L_SUPPKEY = l1.L_SUPPKEY) then 5 else 4 unkn 5 4: BReturn 1 5: BReturn 0 time 0.013% fanout 0 input 670421 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 time 0.0086% fanout 1 input 354373 rows Hash source 48 merged into ts 0.04 rows(k_l1.L_SUPPKEY) -&amp;gt; (.S_NAME) time 1.5% fanout 1 input 354373 rows Stage 2 time 0.18% fanout 0 input 354373 rows Sort (q_.S_NAME) -&amp;gt; (inc) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- rest left out &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 2301 msec 2092% cpu, 8.01116e+07 rnd 3.95017e+08 seq 99.4284% same seg 0.475267% same pg Compilation: 2 msec 0 reads 0% read 0 messages 0% clw&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q19 Complex Expressions&lt;/h2&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT SUM(l_extendedprice* (1 - l_discount)) AS revenue FROM lineitem, part WHERE ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#12&amp;#39; AND p_container IN (&amp;#39;SM CASE&amp;#39;, &amp;#39;SM BOX&amp;#39;, &amp;#39;SM PACK&amp;#39;, &amp;#39;SM PKG&amp;#39;) AND l_quantity &amp;gt;= 1 AND l_quantity &amp;lt;= 1 + 10 AND p_size BETWEEN 1 AND 5 AND l_shipmode IN (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; ) OR ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#23&amp;#39; AND p_container IN (&amp;#39;MED BAG&amp;#39;, &amp;#39;MED BOX&amp;#39;, &amp;#39;MED PKG&amp;#39;, &amp;#39;MED PACK&amp;#39;) AND l_quantity &amp;gt;= 10 AND l_quantity &amp;lt;= 10 + 10 AND p_size BETWEEN 1 AND 10 AND l_shipmode IN (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; ) OR ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#34&amp;#39; AND p_container IN (&amp;#39;LG CASE&amp;#39;, &amp;#39;LG BOX&amp;#39;, &amp;#39;LG PACK&amp;#39;, &amp;#39;LG PKG&amp;#39;) AND l_quantity &amp;gt;= 20 AND l_quantity &amp;lt;= 20 + 10 AND p_size BETWEEN 1 AND 15 AND l_shipmode in (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; )&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The essential trick is to recognize that each of the terms of the &lt;code&gt;OR&lt;/code&gt; have the join condition between &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; and the &lt;code&gt;l_shipmode&lt;/code&gt; and &lt;code&gt;l_shipinstruct&lt;/code&gt; conditions in common. After extracting these, the &lt;code&gt;OR&lt;/code&gt; is split into two more &lt;code&gt;ORs&lt;/code&gt;, one with conditions on &lt;code&gt;part&lt;/code&gt; and the other with conditions on &lt;code&gt;lineitem&lt;/code&gt; only. A hash is made of the matching parts where parts that correspond to none of the 3 &lt;code&gt;ORed&lt;/code&gt; &lt;code&gt;ANDs&lt;/code&gt; are left out. Then there is a scan of &lt;code&gt;lineitem&lt;/code&gt; with the hash lookup merged. The merged hash lookup does in this case produce result columns, which are further tested later in the query.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 1.7e-05% fanout 1 input 1 rows time 0.018% fanout 1 input 1 rows Precode: 0: chash_in_init := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c AIR&amp;gt;, &amp;lt;c AIR REG&amp;gt;) 5: temp := artm 1 + 10 9: temp := artm 10 + 10 13: temp := artm 20 + 10 17: BReturn 0 { hash filler time 4.5% fanout 2e+07 input 1 rows PART 7.2e+04 rows(.P_BRAND, .P_CONTAINER, .P_SIZE, .P_PARTKEY) P_SIZE &amp;gt;= 1 time 16% fanout 0.00240925 input 2e+07 rows END Node After test: 0: if (.P_BRAND = &amp;lt;c Brand#12&amp;gt;) then 4 else 17 unkn 17 4: if (.P_SIZE &amp;lt;= 5 ) then 8 else 17 unkn 17 8: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c SM CASE&amp;gt;, &amp;lt;c SM BOX&amp;gt;, &amp;lt;c SM PACK&amp;gt;, &amp;lt;c SM PKG&amp;gt;) 13: if ( 0 &amp;lt; one_of_these) then 51 else 17 unkn 17 17: if (.P_BRAND = &amp;lt;c Brand#23&amp;gt;) then 21 else 34 unkn 34 21: if (.P_SIZE &amp;lt;= 10 ) then 25 else 34 unkn 34 25: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c MED BAG&amp;gt;, &amp;lt;c MED BOX&amp;gt;, &amp;lt;c MED PKG&amp;gt;, &amp;lt;c MED PACK&amp;gt;) 30: if ( 0 &amp;lt; one_of_these) then 51 else 34 unkn 34 34: if (.P_BRAND = &amp;lt;c Brand#34&amp;gt;) then 38 else 52 unkn 52 38: if (.P_SIZE &amp;lt;= 15 ) then 42 else 52 unkn 52 42: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c LG CASE&amp;gt;, &amp;lt;c LG BOX&amp;gt;, &amp;lt;c LG PACK&amp;gt;, &amp;lt;c LG PKG&amp;gt;) 47: if ( 0 &amp;lt; one_of_these) then 51 else 52 unkn 52 51: BReturn 1 52: BReturn 0 time 0.058% fanout 0 input 48185 rows Sort hf 52 (.P_PARTKEY) -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) } time 2.4e-05% fanout 1 input 1 rows { fork time 79% fanout 46004 input 1 rows LINEITEM 1.1e+07 rows(.L_QUANTITY, .L_PARTKEY, .L_EXTENDEDPRICE, .L_DISCOUNT, .L_SHIPMODE) L_SHIPINSTRUCT = &amp;lt;c DELIVER IN PERSON&amp;gt; hash partition+bloom by 0 () hash partition+bloom by 59 (tmp)hash join merged always card 0.00032 -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) time 0.011% fanout 0.599796 input 46004 rows END Node After test: 0: if (.L_QUANTITY &amp;lt;= temp) then 4 else 8 unkn 8 4: if (.L_QUANTITY &amp;gt;= 1 ) then 24 else 8 unkn 8 8: if (.L_QUANTITY &amp;lt;= temp) then 12 else 16 unkn 16 12: if ( 10 &amp;lt;= .L_QUANTITY) then 24 else 16 unkn 16 16: if (temp &amp;gt;= .L_QUANTITY) then 20 else 25 unkn 25 20: if (.L_QUANTITY &amp;gt;= 20 ) then 24 else 25 unkn 25 24: BReturn 1 25: BReturn 0 time 0.002% fanout 1 input 27593 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 Hash source 52 merged into ts 0.00032 rows(k_.L_PARTKEY) -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) time 0.053% fanout 0 input 27593 rows END Node After test: 0: if (.P_BRAND = &amp;lt;c Brand#12&amp;gt;) then 4 else 25 unkn 25 4: if (.L_QUANTITY &amp;gt;= 1 ) then 8 else 25 unkn 25 8: if (.L_QUANTITY &amp;lt;= temp) then 12 else 25 unkn 25 12: if (.P_SIZE &amp;lt;= 5 ) then 16 else 25 unkn 25 16: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c SM CASE&amp;gt;, &amp;lt;c SM BOX&amp;gt;, &amp;lt;c SM PACK&amp;gt;, &amp;lt;c SM PKG&amp;gt;) 21: if ( 0 &amp;lt; one_of_these) then 75 else 25 unkn 25 25: if (.P_BRAND = &amp;lt;c Brand#23&amp;gt;) then 29 else 50 unkn 50 29: if ( 10 &amp;lt;= .L_QUANTITY) then 33 else 50 unkn 50 33: if (.L_QUANTITY &amp;lt;= temp) then 37 else 50 unkn 50 37: if (.P_SIZE &amp;lt;= 10 ) then 41 else 50 unkn 50 41: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c MED BAG&amp;gt;, &amp;lt;c MED BOX&amp;gt;, &amp;lt;c MED PKG&amp;gt;, &amp;lt;c MED PACK&amp;gt;) 46: if ( 0 &amp;lt; one_of_these) then 75 else 50 unkn 50 50: if (.P_BRAND = &amp;lt;c Brand#34&amp;gt;) then 54 else 76 unkn 76 54: if (.L_QUANTITY &amp;gt;= 20 ) then 58 else 76 unkn 76 58: if (temp &amp;gt;= .L_QUANTITY) then 62 else 76 unkn 76 62: if (.P_SIZE &amp;lt;= 15 ) then 66 else 76 unkn 76 66: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c LG CASE&amp;gt;, &amp;lt;c LG BOX&amp;gt;, &amp;lt;c LG PACK&amp;gt;, &amp;lt;c LG PKG&amp;gt;) 71: if ( 0 &amp;lt; one_of_these) then 75 else 76 unkn 76 75: BReturn 1 76: BReturn 0 After code: 0: sum revenuetemp 5: BReturn 0 } time 8.7e-06% fanout 0 input 1 rows Select (revenue) } 1315 msec 1889% cpu, 2 rnd 1.62319e+08 seq 0% same seg 0% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q7 More ORs&lt;/h2&gt; &lt;p&gt;We find a similar pattern in Q7, where an implementation is expected to extract conditions from an &lt;code&gt;OR&lt;/code&gt; and to restrict hash build sides with these. For &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT supp_nation, cust_nation, l_year, SUM(volume) AS revenue FROM ( SELECT n1.n_name AS supp_nation, n2.n_name AS cust_nation, extract(year FROM l_shipdate) AS l_year, l_extendedprice * (1 - l_discount) AS volume FROM supplier, lineitem, orders, customer, nation n1, nation n2 WHERE s_suppkey = l_suppkey AND o_orderkey = l_orderkey AND c_custkey = o_custkey AND s_nationkey = n1.n_nationkey AND c_nationkey = n2.n_nationkey AND ( ( n1.n_name = &amp;#39;FRANCE&amp;#39; AND n2.n_name = &amp;#39;GERMANY&amp;#39; ) OR ( n1.n_name = &amp;#39;GERMANY&amp;#39; AND n2.n_name = &amp;#39;FRANCE&amp;#39; ) ) AND l_shipdate BETWEEN CAST (&amp;#39;1995-01-01&amp;#39; AS DATE) AND CAST (&amp;#39;1996-12-31&amp;#39; AS DATE) ) AS shipping GROUP BY supp_nation, cust_nation, l_year ORDER BY supp_nation, cust_nation, l_year&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The plan builds a hash with &lt;code&gt;customers&lt;/code&gt; from either France or Germany, then of &lt;code&gt;suppliers&lt;/code&gt; from either France or Germany. Then it scans &lt;code&gt;lineitem&lt;/code&gt; for 2/7 &lt;code&gt;years&lt;/code&gt; and selects 2/25 based on the &lt;code&gt;supplier&lt;/code&gt;. The name of the &lt;code&gt;supplier&lt;/code&gt; country is also returned from the merged hash lookup. Then the corresponding &lt;code&gt;order&lt;/code&gt; is fetched by primary key, which is fast since the &lt;code&gt;lineitem&lt;/code&gt; produces keys in order. A similar hash condition is on the &lt;code&gt;customer&lt;/code&gt;. Finally, there is code to check that the countries are different between &lt;code&gt;supplier&lt;/code&gt; and &lt;code&gt;customer&lt;/code&gt;. We leave out the plan in the interest of space. A single execution is between 1.7 and 1.9s; 5 concurrent executions are 7.5s for the slowest. &lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac078514a8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac12d42c08&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac16346118&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab6b129918&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac1ee7e2b8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac154f7aa8&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2771a578&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aabf129f5a8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1ed2ae08&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac1c9f2d08&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac752dde68&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x19d27968&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x195d2b18&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x108f2558&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0xeb62dd8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x101630b8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aac1458cf48&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:45.438978-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 7 of n) -- TPC-H Q13: The Good and the Bad Plans</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-25#1757</atom:id>
  <atom:published>2013-11-25T17:22:39Z</atom:published>
  <atom:content type="html">&lt;p&gt;Q13 is one of the longest running of the 22 queries. The &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x23e81828&quot;&gt;TPC-H&lt;/a&gt; metric is a geometric mean of two scores, power and throughput, where the throughput score is the elapsed time of the multiuser part of the test divided by the number of queries executed. In this part of the score, Q13 can be up to 1/5 of the total. The power score on the other hand is a geometric mean of the run times of all the queries, scaled into queries per hour. There all queries have equal importance. A bad Q13 will sink a whole result.&lt;/p&gt; &lt;p&gt;Q13 counts the &lt;code&gt;orders&lt;/code&gt; of each &lt;code&gt;customer&lt;/code&gt; and then shows, for each distinct &lt;code&gt;count&lt;/code&gt; of &lt;code&gt;orders&lt;/code&gt;, how many &lt;code&gt;customers&lt;/code&gt; have this number of &lt;code&gt;orders&lt;/code&gt;. 1/3 of the &lt;code&gt;customers&lt;/code&gt; have no &lt;code&gt;orders&lt;/code&gt;; hence this is an outer join between &lt;code&gt;customers&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT c_count, COUNT(*) AS custdist FROM ( SELECT c_custkey, COUNT(o_orderkey) AS c_count FROM ( SELECT * FROM customer LEFT OUTER JOIN orders ON c_custkey = o_custkey AND o_comment NOT LIKE &amp;#39;%special%requests%&amp;#39; ) c_customer GROUP BY c_custkey ) c_orders GROUP BY c_count ORDER BY custdist DESC, c_count DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The only parameter of the query is the pattern in the &lt;code&gt;NOT LIKE&lt;/code&gt; condition. The &lt;code&gt;NOT LIKE&lt;/code&gt; is very unselective, so almost all &lt;code&gt;orders&lt;/code&gt; will be considered.&lt;/p&gt; &lt;p&gt;The Virtuoso run time for Q13 is 6.7s, which we can consider a good result. Running 5 of these at the same time has the fastest execution finishing in 23.7s and the slowest in 35.3s. Doing 5x the work takes 5.2x the time. This is not bad, considering that the query has a high transient memory consumption. A second execution of 5 concurrent Q13s has the fastest finishing in 22.s and the slowest in 29.8s. The difference comes from already having the needed memory blocks cached, so there are no calls to the OS for mapping more memory.&lt;/p&gt; &lt;p&gt;To measure the peak memory consumption, which is a factor with this query, there is the &lt;code&gt;mp_max_large_in_use&lt;/code&gt; counter. To reset: &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;__dbf_set (&amp;#39;mp_max_large_in_use&amp;#39;, 0);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To read:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;SELECT sys_stat (&amp;#39;mp_max_large_in_use&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For the 5 concurrent executions of Q13, the counter goes to 10GB. This is easily accommodated at 100 GB; but at ten times the scale, this will be a significant quantity, even in a scale out setting. The memory allocation time is recorded in the counter &lt;code&gt;mp_mmap_clocks&lt;/code&gt;, read with &lt;code&gt;sys_stat&lt;/code&gt;. This is a count of cycles spent waiting for &lt;code&gt;mmap&lt;/code&gt; or &lt;code&gt;munmap&lt;/code&gt; and allows tracking if the process is being slowed down by transient memory allocation.&lt;/p&gt; &lt;p&gt;Let us consider how this works. The plan is as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { { hash filler CUSTOMER 1.5e+07 rows(t3.C_CUSTKEY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Make a hash table of the 150M customers. The stage 2 operator below means that the &lt;code&gt;customers&lt;/code&gt; are partitioned in a number of distinct partitions based on the &lt;code&gt;c_custkey&lt;/code&gt;, which is the key in the hash table. This means that a number of disjoint hash tables are built, as many as there are concurrent threads. This corresponds to the &lt;code&gt;ThreadsPerQuery&lt;/code&gt; ini file setting of the &lt;code&gt;enable_qp&lt;/code&gt; setting with &lt;code&gt;__dbf_set&lt;/code&gt; and &lt;code&gt;sys_stat&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Stage 2 Sort hf 34 (q_t3.C_CUSTKEY) } { fork { fork { fork END Node outer { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here we start a &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; block. The below operator scans the &lt;code&gt;orders&lt;/code&gt; table and picks out the &lt;code&gt;orders&lt;/code&gt; which do not contain the mentioned &lt;code&gt;LIKE&lt;/code&gt; pattern.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; ORDERS 1.5e+08 rows(t4.O_CUSTKEY, t4.O_ORDERKEY) O_COMMENT LIKE &lt;c special=&quot;special&quot; requests=&quot;requests&quot;&gt; LIKE &lt;c&gt; hash partition+bloom by 80 () &lt;/c&gt;&lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is a partitioning operator, also known as an exchange operator, which will divide the stream of &lt;code&gt;o_custkeys&lt;/code&gt; from the previous scan into different partitions, each served by a different thread.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Stage 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is a lookup in the &lt;code&gt;customer&lt;/code&gt; hash table. The lookup takes place in the partition determined by the &lt;code&gt;o_custkey&lt;/code&gt; being looked up.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Hash source 34 not partitionable 1 rows(q_t4.O_CUSTKEY) -&amp;gt; () right oj, key out ssls: (t3.C_CUSTKEY) After code: 0: t3.C_CUSTKEY := := artm t4.O_CUSTKEY 4: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below is a &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; end operator; see below for further description &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; end of outer} set_ctr out: (t4.O_ORDERKEY, t4.O_CUSTKEY) shadow: (t4.O_ORDERKEY, t4.O_CUSTKEY) Precode: 0: isnotnull := Call isnotnull (t4.O_ORDERKEY) 5: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below sort is the innermost &lt;code&gt;GROUP BY&lt;/code&gt;. The &lt;code&gt;ISNOTNULL&lt;/code&gt; above makes a &lt;code&gt;0&lt;/code&gt; or a &lt;code&gt;1&lt;/code&gt;, depending on whether there was a found &lt;code&gt;o_custkey&lt;/code&gt; for the &lt;code&gt;c_custkey&lt;/code&gt; of the &lt;code&gt;customer&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (t3.C_CUSTKEY) -&amp;gt; (isnotnull) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below operators start after the above have executed to completion on every partition. We read the first aggregation, containing for each &lt;code&gt;customer&lt;/code&gt; the &lt;code&gt;COUNT&lt;/code&gt; of &lt;code&gt;orders&lt;/code&gt;. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; group by read node (t3.C_CUSTKEY, aggregate)in each partition slice After code: 0: c_custkey := := artm t3.C_CUSTKEY 4: c_count := := artm aggregate 8: BReturn 0 Subquery Select(c_custkey, c_count) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is the second &lt;code&gt;GROUP BY&lt;/code&gt;; for each &lt;code&gt;COUNT&lt;/code&gt;, we count how many &lt;code&gt;customers&lt;/code&gt; have this many &lt;code&gt;orders&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (c_count) -&amp;gt; (inc) } group by read node (c_count, custdist) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is the final &lt;code&gt;ORDER BY&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (custdist, c_count) } Key from temp (c_count, custdist) Select (c_count, custdist) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The CPU profile starts as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 971537 31.8329 setp_chash_run 494300 16.1960 hash_source_chash_input_1i_n 262218 8.5917 clrg_partition_dc 162773 5.3333 strstr_sse42 68049 2.2297 memcpy_16 65883 2.1587 cha_insert_1i_n 57515 1.8845 hs_send_output 56093 1.8379 cmp_like_const 53752 1.7612 gb_aggregate 51274 1.6800 cha_rehash_ents ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;GROUP BY&lt;/code&gt; is on top, with 31%. This is the first &lt;code&gt;GROUP BY&lt;/code&gt;, which has one group per customer, for a total of 150M groups. Below the &lt;code&gt;GROUP BY&lt;/code&gt; is the hash lookup of the hash join from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;. The third item is partitioning of a data column (&lt;code&gt;dc&lt;/code&gt;, or vectored query variable). The partitioning refers to the operator labeled &lt;b&gt;stage 2&lt;/b&gt; above. From one column of values, it makes several. In the 4th place, we have the &lt;code&gt;NOT LIKE&lt;/code&gt; predicate on &lt;code&gt;o_comment&lt;/code&gt;. This is a substring search implemented using SSE 4.2 instructions. Finally, in the last place, there is a function for resizing a hash table; in the present case, the hash table for the innermost &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;At this point, we have to explain the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt;: Generally when making a hash join, the larger table is on the probe side and the smaller on the build side. This means that the rows on the build side get put in a hash table and then for each row on the probe side there is a lookup to see if there is a match in the hash table.&lt;/p&gt; &lt;p&gt;However, here the bigger table is on the right side of &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;. Normally, one would have to make the hash table from the &lt;code&gt;orders&lt;/code&gt; table and then probe it with &lt;code&gt;customer&lt;/code&gt;, so that one would find no match for the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt; and several matches for &lt;code&gt;customers&lt;/code&gt; with many &lt;code&gt;orders&lt;/code&gt;. However, this would be much slower. So there is a trick for reversing the process: You still build the hash from the smaller set in the &lt;code&gt;JOIN&lt;/code&gt;, but now for each key that does get probed, you set a bit in a bit mask, in addition to sending the match as output. After all outputs have been generated, you look in the hash table for the entries where the bit is not set. These correspond to the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt;. For these, you send the &lt;code&gt;c_custkey&lt;/code&gt; with a null &lt;code&gt;o_orderkey&lt;/code&gt; to the next operator in the pipeline, which is the &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt; with the count of non-null &lt;code&gt;o_orderkeys&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;One might at first think that such a backwards way of doing an outer join is good for nothing but this benchmark and should be considered a benchmark special. This is not so, though, as there are accepted implementations that do this very thing.&lt;/p&gt; &lt;p&gt;Furthermore, getting a competitive score in any other way is impossible, as we shall see below.&lt;/p&gt; &lt;p&gt;We further note that the the grouping key in the innermost &lt;code&gt;GROUP BY&lt;/code&gt; is the same as the hash key in the last hash join, i.e., &lt;code&gt;o_custkey&lt;/code&gt;. This means that the &lt;code&gt;GROUP BY&lt;/code&gt; and the hash join could be combined in a single operator called &lt;code&gt;GROUPJOIN&lt;/code&gt;. If this were done, the hash would be built from &lt;code&gt;customer&lt;/code&gt; with extra space left for the counters. This would in fact remove the hash join from the profile as well as the rehash of the group by hash table, for a gain of about 20%. The outer join behavior is not a problem here since untouched buckets, e.g., &lt;code&gt;customers&lt;/code&gt; without &lt;code&gt;orders&lt;/code&gt;, would be inited with a &lt;code&gt;COUNT&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt;. For an inner join behavior, one would simply leave out the zero counts when reading the &lt;code&gt;GROUP BY&lt;/code&gt;. At the end of the series, we will see what the DBT3 score will be. We remember that there is a 1.5s savings to be had here for the throughput score if the score is not high enough otherwise. The effect on the power score will be less because that only cares about relative speedup, not absolute time.&lt;/p&gt; &lt;p&gt;Next, we disable the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; optimization and force the &lt;code&gt;JOIN&lt;/code&gt; to build a hash on &lt;code&gt;orders&lt;/code&gt; and to probe it with &lt;code&gt;customer&lt;/code&gt;. The execution time is 25s. Most of the time goes into building the hash table of &lt;code&gt;orders&lt;/code&gt;. The memory consumption also goes up to around 8G. Then we try the &lt;code&gt;JOIN&lt;/code&gt; by index with a scan of &lt;code&gt;customer&lt;/code&gt;, and for each an index lookup of &lt;code&gt;orders&lt;/code&gt; based on an index on &lt;code&gt;o_custkey&lt;/code&gt;. Here we note that there is a condition on a dependent part of the primary key, namely &lt;code&gt;o_comment&lt;/code&gt;, which requires joining to the main row from the &lt;code&gt;o_ck&lt;/code&gt; index. There is a gain however because the &lt;code&gt;GROUP BY&lt;/code&gt; becomes ordered; i.e., there is no need to keep groups around for &lt;code&gt;customers&lt;/code&gt; that have already been seen since we know they will not come again, the outer scan being in order of &lt;code&gt;c_custkey&lt;/code&gt;. For this reason, the memory consumption for the &lt;code&gt;GROUP BY&lt;/code&gt; goes away. However, the index-based plan is extremely sensitive to vector size: The execution takes 29.4s if vector size is allowed to grow to 1MB, but 413s if it stays at the default of 10KB. The difference is in the 1MB vector hitting 1/150 (1 million lookups for a 150 million row table), whereas the 10KB vector hits 1/15000. Thus, benefits from vectoring lookups are largely lost, since there are hardly ever hits in the same segment; in this case, within 2000 rows. But this is not the main problem: The condition on the main row is a &lt;code&gt;LIKE&lt;/code&gt; on a long column. Thus, the whole column for the segment in question must be accessed for read, meaning 2000 or so &lt;code&gt;o_comments&lt;/code&gt;, of which one will be checked. If instead of a condition on &lt;code&gt;o_comment&lt;/code&gt;, we have one on &lt;code&gt;o_totalprice &amp;gt; 0&lt;/code&gt;, we get 93s with 10KB vector size and 15s with dynamic up to 1MB.&lt;/p&gt; &lt;p&gt;If we now remove the condition on dependent columns of &lt;code&gt;orders&lt;/code&gt;, the index plan becomes faster, since the whole condition is resolved within the &lt;code&gt;o_custkey&lt;/code&gt; index -- 2.5s with 10KB vector size, 2.6s with dynamic vector size up to 1MB. The point here is that the access from &lt;code&gt;customer&lt;/code&gt; to &lt;code&gt;orders&lt;/code&gt; on the &lt;code&gt;o_custkey&lt;/code&gt; index is ordered, like a merge join.&lt;/p&gt; &lt;h3&gt;Q13 Conclusions&lt;/h3&gt; &lt;p&gt;Q13 is a combo of many choke points in the &lt;i&gt;TPC-H Analyzed&lt;/i&gt; paper. The most important is special &lt;code&gt;JOIN&lt;/code&gt; types, i.e., &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; and &lt;code&gt;GROUPJOIN&lt;/code&gt;. Then there is string operation performance for the substring matching with &lt;code&gt;LIKE&lt;/code&gt;. This needs to be implemented with the SSE 4.2 string instructions; otherwise there is a hit of about 0.5s on query speed.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;TPC-H Analyzed&lt;/i&gt; paper was written against the background of analytical DB tradition where the dominant &lt;code&gt;JOIN&lt;/code&gt; type is hash, except when there is a merge between two sets that are ordered or at least clustered on the same key. Clustered here means physical order but without the need to be strictly in key order.&lt;/p&gt; &lt;p&gt;Here I have added some index based variants to show that hash join indeed wins and to point out the sensitivity of random access to vector size. As column stores go, Virtuoso is especially good at random access. This must be so since it was optimized to do RDF well, which entails a lot of lookup. Also note how a big string column goes with great ease in a sequential scan, but kills in a non-local random access pattern.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac1c7b8ca8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac1c79fb58&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac1e3a3c58&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1cd4e8a8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac0eb77df8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac1e4e0988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x4bc6b48&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab6d3ab518&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x1eb9a678&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aabd308be88&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x177580f8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac3124cce8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aabde079648&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabc90bb398&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabdcf12238&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabd54ff898&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd0d4cfc8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:51.444495-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 8 of n) -- TPC-H: INs, Expressions, ORs</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-25#1756</atom:id>
  <atom:published>2013-11-25T16:58:38Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this installment, we look at &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabd9458d78&quot;&gt;TPC-H&lt;/a&gt; Q7, Q12, Q19, Q21, and Q22. These have complex expressions and require some tricks with &lt;code&gt;OR&lt;/code&gt; and &lt;code&gt;IN&lt;/code&gt;. Also proper order between &lt;code&gt;JOINs&lt;/code&gt; and expressions is tested in Q21.&lt;/p&gt; &lt;h2&gt; &lt;code&gt;IN&lt;/code&gt; Predicates&lt;/h2&gt; &lt;p&gt;One of the choke points mentioned in the &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x2aac0c0d7d98&quot;&gt;TPC-H Analyzed&lt;/a&gt;&lt;/i&gt; paper is the &lt;code&gt;IN&lt;/code&gt; predicate with a list of constants. This occurs in Q12 and Q22. Q12 is the simpler of the two:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_shipmode , SUM ( CASE WHEN o_orderpriority = &amp;#39;1-URGENT&amp;#39; OR o_orderpriority = &amp;#39;2-HIGH&amp;#39; THEN 1 ELSE 0 END ) AS high_line_count, SUM ( CASE WHEN o_orderpriority &amp;lt;&amp;gt; &amp;#39;1-URGENT&amp;#39; AND o_orderpriority &amp;lt;&amp;gt; &amp;#39;2-HIGH&amp;#39; THEN 1 ELSE 0 END ) AS low_line_count FROM orders, lineitem WHERE o_orderkey = l_orderkey AND l_shipmode IN (&amp;#39;MAIL&amp;#39;, &amp;#39;SHIP&amp;#39;) AND l_commitdate &amp;lt; l_receiptdate AND l_shipdate &amp;lt; l_commitdate AND l_receiptdate &amp;gt;= CAST (&amp;#39;1994-01-01&amp;#39; AS DATE) AND l_receiptdate &amp;lt; DATEADD (&amp;#39;year&amp;#39;, 1, CAST (&amp;#39;1994-01-01&amp;#39; AS DATE)) GROUP BY l_shipmode ORDER BY l_shipmode&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The execution profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 2.2e-05% fanout 1 input 1 rows time 0.00023% fanout 1 input 1 rows Precode: 0: chash_in_init := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c MAIL&amp;gt;, &amp;lt;c SHIP&amp;gt;) 5: BReturn 0 { fork time 1.2e-05% fanout 1 input 1 rows { fork time 86% fanout 2.60039e+07 input 1 rows LINEITEM 2.4e+06 rows(.L_COMMITDATE, .L_RECEIPTDATE, .L_SHIPDATE, .L_ORDERKEY, .L_SHIPMODE) L_RECEIPTDATE &amp;gt;= &amp;lt;c 1994-01-01&amp;gt; &amp;lt; &amp;lt;c 1995-01-01&amp;gt; hash partition+bloom by 0 () time 4.4% fanout 0.119803 input 2.60039e+07 rows END Node After test: 0: if (.L_COMMITDATE &amp;lt; .L_RECEIPTDATE) then 4 else 9 unkn 9 4: if (.L_SHIPDATE &amp;lt; .L_COMMITDATE) then 8 else 9 unkn 9 8: BReturn 1 9: BReturn 0 time 7.9% fanout 1 input 3.11534e+06 rows ORDERS unq 1 rows (.O_ORDERPRIORITY) inlined O_ORDERKEY = k_.L_ORDERKEY After code: 0: if (.O_ORDERPRIORITY = &amp;lt;c 1-URGENT&amp;gt;) then 13 else 4 unkn 13 4: if (.O_ORDERPRIORITY = &amp;lt;c 2-HIGH&amp;gt;) then 13 else 8 unkn 13 8: callretSearchedCASE := := artm 1 12: Jump 17 (level=0) 13: callretSearchedCASE := := artm 0 17: if (.O_ORDERPRIORITY = &amp;lt;c 1-URGENT&amp;gt;) then 25 else 21 unkn 21 21: if (.O_ORDERPRIORITY = &amp;lt;c 2-HIGH&amp;gt;) then 25 else 30 unkn 30 25: callretSearchedCASE := := artm 1 29: Jump 34 (level=0) 30: callretSearchedCASE := := artm 0 34: BReturn 0 time 1.3% fanout 0 input 3.11534e+06 rows Sort (.L_SHIPMODE) -&amp;gt; (callretSearchedCASE, callretSearchedCASE) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- rest left out &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 1077 msec 2014% cpu, 3.11419e+06 rnd 5.99896e+08 seq 97.9872% same seg 1.74106% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top item in the profile is the predicate on &lt;code&gt;l_receiptdate&lt;/code&gt;. &lt;i&gt;TPC-H Analyzed&lt;/i&gt; correctly points out that a &lt;code&gt;lineitem&lt;/code&gt; table in date order is best here, because zone maps will work on &lt;code&gt;l_receiptdate&lt;/code&gt; since this is correlated with &lt;code&gt;l_shipdate&lt;/code&gt;, which is the best date ordering column, as it is the most used. The date compare is done first in the scan, as it selects 1/7 and is fast, whereas the &lt;code&gt;IN&lt;/code&gt; selects 2/7 and has more instructions on the execution path.&lt;/p&gt; &lt;h2&gt;Q22&lt;/h2&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT cntrycode, COUNT(*) AS numcust, SUM(c_acctbal) AS totacctbal FROM ( SELECT SUBSTRING(c_phone, 1, 2) AS cntrycode, c_acctbal FROM customer WHERE SUBSTRING(c_phone, 1, 2) IN (&amp;#39;13&amp;#39;, &amp;#39;31&amp;#39;, &amp;#39;23&amp;#39;, &amp;#39;29&amp;#39;, &amp;#39;30&amp;#39;, &amp;#39;18&amp;#39;, &amp;#39;17&amp;#39;) AND c_acctbal &amp;gt; ( SELECT AVG(c_acctbal) FROM customer WHERE c_acctbal &amp;gt; 0.00 AND SUBSTRING(c_phone, 1, 2) IN (&amp;#39;13&amp;#39;, &amp;#39;31&amp;#39;, &amp;#39;23&amp;#39;, &amp;#39;29&amp;#39;, &amp;#39;30&amp;#39;, &amp;#39;18&amp;#39;, &amp;#39;17&amp;#39;) ) AND NOT EXISTS ( SELECT * FROM orders WHERE o_custkey = c_custkey ) ) AS custsale GROUP BY cntrycode ORDER BY cntrycode&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Q22 has a condition on a substring of a string column. This merits a separate trick, namely merging the substring extraction into the scan, so the invisible hash-join predicate reads the column, cuts the substring in place, calculates a hash number, &lt;a href=&quot;http://dbpedia.org/resource/Bloom_filter&quot; id=&quot;link-id0x2aac1df3c948&quot;&gt;Bloom filters&lt;/a&gt; this against the &lt;code&gt;IN&lt;/code&gt; set, then finally outputs the row numbers which match. This operation is run-time re-orderable with other conditions, like the test on &lt;code&gt;c_acctbal&lt;/code&gt;. &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aac0e99d2b8&quot;&gt;TPC-DS&lt;/a&gt; has a similar pattern in some queries.&lt;/p&gt; &lt;p&gt;The profile follows.&lt;/p&gt; &lt;p&gt;Q22 is one of the rare queries that clearly benefit from having an index on a foreign key column. The &lt;code&gt;NOT EXISTS&lt;/code&gt; with &lt;code&gt;orders&lt;/code&gt; could be done by hash, but then the hash would have to have every &lt;code&gt;DISTINCT o_custkey&lt;/code&gt; and the hash build could be filtered by a &lt;code&gt;JOIN&lt;/code&gt; on &lt;code&gt;customer&lt;/code&gt; with the conditions on &lt;code&gt;c_acctbal&lt;/code&gt; and &lt;code&gt;c_phone&lt;/code&gt; repeated. Being inside an existence, the number of &lt;code&gt;orders&lt;/code&gt; would not have to be retained, so the hash table would not end up larger than the probe side.&lt;/p&gt; &lt;p&gt;The payoff in Q22 makes it worthwhile to maintain an index on &lt;code&gt;o_custkey&lt;/code&gt; in the refresh functions.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 1.4e-05% fanout 1 input 1 rows time 1.2% fanout 1 input 1 rows Precode: 0: $27 &amp;quot;chash_in_init&amp;quot; := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c 13&amp;gt;, &amp;lt;c 31&amp;gt;, &amp;lt;c 23&amp;gt;, &amp;lt;c 29&amp;gt;, &amp;lt;c 30&amp;gt;, &amp;lt;c 18&amp;gt;, &amp;lt;c 17&amp;gt;) 5: { time 7.9e-06% fanout 1 input 1 rows time 6.7e-05% fanout 1 input 1 rows { fork&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Read &lt;code&gt;customer&lt;/code&gt; once, filter with the &lt;code&gt;IN&lt;/code&gt; predicate, and add up &lt;code&gt;c_acctbal&lt;/code&gt; and &lt;code&gt;count&lt;/code&gt; for the average.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 26% fanout 0 input 1 rows CUSTOMER 1.4e+07 rows(t4.C_ACCTBAL) C_ACCTBAL &amp;gt; 0 hash partition+bloom by 0 () After code: 0: sum count 1 5: sum sumt4.C_ACCTBAL 10: BReturn 0 } After code: 0: temp := artm sum / count 4: aggregate := := artm temp 8: BReturn 0 time 2.6e-05% fanout 0 input 1 rows Subquery Select(aggregate) } 13: BReturn 0 { fork time 1.9e-05% fanout 1 input 1 rows { fork&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- second scan of customer with the test on c_acctbal &amp;gt; average and the same in predicate.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 26% fanout 1.90967e+06 input 1 rows CUSTOMER 2.7e+05 rows(t2.C_CUSTKEY, t2.C_PHONE, t2.C_ACCTBAL) C_ACCTBAL &amp;gt; k_scalar hash partition+bloom by 0 () time 7% fanout 0.333434 input 1.90967e+06 rows END Node After test: 0: if ({ time 0.26% fanout 1 input 1.90967e+06 rows&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- See if the customer has orders. The index lookup is very fast since the keys come in order from the scan of customer.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;time 5% fanout 9.9955 input 1.90967e+06 rows O_CK 9.9 rows() inlined O_CUSTKEY = k_t2.C_CUSTKEY time 1.6% fanout 0 input 1.90881e+07 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 5 else 4 unkn 5 4: BReturn 1 5: BReturn 0 time 3.1% fanout 1 input 636749 rows Precode: 0: cntrycode := Call substring (t2.C_PHONE, 1 , 2 ) 5: BReturn 0 Stage 2 time 0.5% fanout 0 input 636749 rows Sort (q_cntrycode) -&amp;gt; (t2.C_ACCTBAL, inc) } time 0.011% fanout 7 input 1 rows group by read node (cntrycode, totacctbal, numcust)in each partition slice time 0.0013% fanout 0 input 7 rows Sort (cntrycode) -&amp;gt; (numcust, totacctbal) } time 0.00016% fanout 7 input 1 rows Key from temp (cntrycode, numcust, totacctbal) time 1.4e-05% fanout 0 input 7 rows Select (cntrycode, numcust, totacctbal) } 306 msec 2107% cpu, 1.90678e+06 rnd 4.77961e+07 seq 99.5612% same seg 0.419137% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q21 - Join Order and complex tests&lt;/h2&gt; &lt;p&gt;This identifies &lt;code&gt;suppliers&lt;/code&gt; from a given country that have kept &lt;code&gt;orders&lt;/code&gt; waiting, i.e., they supply a delayed &lt;code&gt;lineitem&lt;/code&gt; and nobody else in the &lt;code&gt;order&lt;/code&gt; supplies a delayed &lt;code&gt;lineitem&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 100 s_name, COUNT(*) AS numwait FROM supplier, lineitem l1, orders, nation WHERE s_suppkey = l1.l_suppkey AND o_orderkey = l1.l_orderkey AND o_orderstatus = &amp;#39;F&amp;#39; AND l1.l_receiptdate &amp;gt; l1.l_commitdate AND EXISTS ( SELECT * FROM lineitem l2 WHERE l2.l_orderkey = l1.l_orderkey AND l2.l_suppkey &amp;lt;&amp;gt; l1.l_suppkey ) AND NOT EXISTS ( SELECT * FROM lineitem l3 WHERE l3.l_orderkey = l1.l_orderkey AND l3.l_suppkey &amp;lt;&amp;gt; l1.l_suppkey AND l3.l_receiptdate &amp;gt; l3.l_commitdate ) AND s_nationkey = n_nationkey AND n_name = &amp;#39;SAUDI ARABIA&amp;#39; GROUP BY s_name ORDER BY numwait desc, s_name ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The crucial thing the optimizer must realize is that conditions that depend on a table should not always be placed right after the table because there could be a selective join that costs less. In this case, the plan comes out as a scan of &lt;code&gt;orders&lt;/code&gt; selecting 1/2; then an index lookup on &lt;code&gt;lineitem&lt;/code&gt; which is very efficient because the keys come in order and are tightly local; then the selective hash join with &lt;code&gt;suppliers&lt;/code&gt; from the country is merged into the index lookup. After this, 1/50 of &lt;code&gt;lineitems&lt;/code&gt; are left. Only for these does the system actually fetch the dates. After this comes the series of tests, ordered similarly to how joins are ordered. First the cheap date comparison, then the subqueries. The &lt;code&gt;lineitems&lt;/code&gt; can be fetched by their primary key, which again comes in order. Doing this by hash would duplicate most of the query on the build side and would be a lot of trouble.&lt;/p&gt; &lt;p&gt;Another join order would be &lt;code&gt;lineitem&lt;/code&gt; first, selecting 1/25 with the merged hash-join with &lt;code&gt;supplier&lt;/code&gt;, then &lt;code&gt;orders&lt;/code&gt; by index, selecting 1/2, then the existences. Experiment shows there is no great difference.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 4.5e-06% fanout 1 input 1 rows time 0.0036% fanout 1 input 1 rows { hash filler Subquery 27 { time 3.8e-05% fanout 1 input 1 rows NATION 1 rows(t4.N_NATIONKEY) N_NAME = &amp;lt;c SAUDI ARABIA&amp;gt; time 0.01% fanout 39953 input 1 rows SUPPLIER 4.2e+04 rows(t1.S_SUPPKEY, t1.S_NAME) S_NATIONKEY = t4.N_NATIONKEY After code: 0: t1.S_SUPPKEY := := artm t1.S_SUPPKEY 4: t1.S_NAME := := artm t1.S_NAME 8: BReturn 0 time 0.0019% fanout 0 input 39953 rows Sort hf 48 (t1.S_SUPPKEY) -&amp;gt; (t1.S_NAME) } } time 2.8e-06% fanout 1 input 1 rows { fork time 2.6e-06% fanout 1 input 1 rows { fork time 6.2% fanout 7.30725e+07 input 1 rows ORDERS 7.3e+07 rows(.O_ORDERKEY) O_ORDERSTATUS = &amp;lt;c F&amp;gt; time 33% fanout 0.142002 input 7.30725e+07 rows LINEITEM 0.49 rows(l1.L_RECEIPTDATE, l1.L_COMMITDATE, l1.L_ORDERKEY, l1.L_SUPPKEY) inlined L_ORDERKEY = .O_ORDERKEY hash partition+bloom by 58 (tmp)hash join merged always card 0.04 -&amp;gt; (.S_NAME) time 9.7% fanout 0.0341517 input 1.03764e+07 rows END Node After test: 0: if (l1.L_RECEIPTDATE &amp;gt; l1.L_COMMITDATE) then 4 else 13 unkn 13 4: if ({ time 0.18% fanout 0.630264 input 1.03764e+07 rows time 6.4% fanout 4.99133 input 6.53989e+06 rows LINEITEM 1.1 rows(l3.L_SUPPKEY, l3.L_RECEIPTDATE, l3.L_COMMITDATE) inlined L_ORDERKEY = k_l1.L_ORDERKEY time 1.4% fanout 0.504963 input 3.26427e+07 rows END Node After test: 0: if (l3.L_RECEIPTDATE &amp;gt; l3.L_COMMITDATE) then 4 else 9 unkn 9 4: if (l3.L_SUPPKEY = l1.L_SUPPKEY) then 9 else 8 unkn 9 8: BReturn 1 9: BReturn 0 time 0.17% fanout 0 input 1.64834e+07 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 13 else 8 unkn 13 8: if ({ time 0.052% fanout 0.0570441 input 1.03764e+07 rows time 1.1% fanout 2.13264 input 591914 rows LINEITEM 3.7 rows(l2.L_SUPPKEY) inlined L_ORDERKEY = k_l1.L_ORDERKEY time 0.047% fanout 0.531095 input 1.26234e+06 rows END Node After test: 0: if (l2.L_SUPPKEY = l1.L_SUPPKEY) then 5 else 4 unkn 5 4: BReturn 1 5: BReturn 0 time 0.013% fanout 0 input 670421 rows Subquery Select( &amp;lt;none&amp;gt; ) } ) then 12 else 13 unkn 13 12: BReturn 1 13: BReturn 0 time 0.0086% fanout 1 input 354373 rows Hash source 48 merged into ts 0.04 rows(k_l1.L_SUPPKEY) -&amp;gt; (.S_NAME) time 1.5% fanout 1 input 354373 rows Stage 2 time 0.18% fanout 0 input 354373 rows Sort (q_.S_NAME) -&amp;gt; (inc) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- rest left out &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 2301 msec 2092% cpu, 8.01116e+07 rnd 3.95017e+08 seq 99.4284% same seg 0.475267% same pg Compilation: 2 msec 0 reads 0% read 0 messages 0% clw&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q19 Complex Expressions&lt;/h2&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT SUM(l_extendedprice* (1 - l_discount)) AS revenue FROM lineitem, part WHERE ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#12&amp;#39; AND p_container IN (&amp;#39;SM CASE&amp;#39;, &amp;#39;SM BOX&amp;#39;, &amp;#39;SM PACK&amp;#39;, &amp;#39;SM PKG&amp;#39;) AND l_quantity &amp;gt;= 1 AND l_quantity &amp;lt;= 1 + 10 AND p_size BETWEEN 1 AND 5 AND l_shipmode IN (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; ) OR ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#23&amp;#39; AND p_container IN (&amp;#39;MED BAG&amp;#39;, &amp;#39;MED BOX&amp;#39;, &amp;#39;MED PKG&amp;#39;, &amp;#39;MED PACK&amp;#39;) AND l_quantity &amp;gt;= 10 AND l_quantity &amp;lt;= 10 + 10 AND p_size BETWEEN 1 AND 10 AND l_shipmode IN (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; ) OR ( p_partkey = l_partkey AND p_brand = &amp;#39;Brand#34&amp;#39; AND p_container IN (&amp;#39;LG CASE&amp;#39;, &amp;#39;LG BOX&amp;#39;, &amp;#39;LG PACK&amp;#39;, &amp;#39;LG PKG&amp;#39;) AND l_quantity &amp;gt;= 20 AND l_quantity &amp;lt;= 20 + 10 AND p_size BETWEEN 1 AND 15 AND l_shipmode in (&amp;#39;AIR&amp;#39;, &amp;#39;AIR REG&amp;#39;) AND l_shipinstruct = &amp;#39;DELIVER IN PERSON&amp;#39; )&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The essential trick is to recognize that each of the terms of the &lt;code&gt;OR&lt;/code&gt; have the join condition between &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;part&lt;/code&gt; and the &lt;code&gt;l_shipmode&lt;/code&gt; and &lt;code&gt;l_shipinstruct&lt;/code&gt; conditions in common. After extracting these, the &lt;code&gt;OR&lt;/code&gt; is split into two more &lt;code&gt;ORs&lt;/code&gt;, one with conditions on &lt;code&gt;part&lt;/code&gt; and the other with conditions on &lt;code&gt;lineitem&lt;/code&gt; only. A hash is made of the matching parts where parts that correspond to none of the 3 &lt;code&gt;ORed&lt;/code&gt; &lt;code&gt;ANDs&lt;/code&gt; are left out. Then there is a scan of &lt;code&gt;lineitem&lt;/code&gt; with the hash lookup merged. The merged hash lookup does in this case produce result columns, which are further tested later in the query.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ time 1.7e-05% fanout 1 input 1 rows time 0.018% fanout 1 input 1 rows Precode: 0: chash_in_init := Call chash_in_init ( 182 , $29 &amp;quot;chash_in_tree&amp;quot;, 0 , 0 , &amp;lt;c AIR&amp;gt;, &amp;lt;c AIR REG&amp;gt;) 5: temp := artm 1 + 10 9: temp := artm 10 + 10 13: temp := artm 20 + 10 17: BReturn 0 { hash filler time 4.5% fanout 2e+07 input 1 rows PART 7.2e+04 rows(.P_BRAND, .P_CONTAINER, .P_SIZE, .P_PARTKEY) P_SIZE &amp;gt;= 1 time 16% fanout 0.00240925 input 2e+07 rows END Node After test: 0: if (.P_BRAND = &amp;lt;c Brand#12&amp;gt;) then 4 else 17 unkn 17 4: if (.P_SIZE &amp;lt;= 5 ) then 8 else 17 unkn 17 8: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c SM CASE&amp;gt;, &amp;lt;c SM BOX&amp;gt;, &amp;lt;c SM PACK&amp;gt;, &amp;lt;c SM PKG&amp;gt;) 13: if ( 0 &amp;lt; one_of_these) then 51 else 17 unkn 17 17: if (.P_BRAND = &amp;lt;c Brand#23&amp;gt;) then 21 else 34 unkn 34 21: if (.P_SIZE &amp;lt;= 10 ) then 25 else 34 unkn 34 25: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c MED BAG&amp;gt;, &amp;lt;c MED BOX&amp;gt;, &amp;lt;c MED PKG&amp;gt;, &amp;lt;c MED PACK&amp;gt;) 30: if ( 0 &amp;lt; one_of_these) then 51 else 34 unkn 34 34: if (.P_BRAND = &amp;lt;c Brand#34&amp;gt;) then 38 else 52 unkn 52 38: if (.P_SIZE &amp;lt;= 15 ) then 42 else 52 unkn 52 42: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c LG CASE&amp;gt;, &amp;lt;c LG BOX&amp;gt;, &amp;lt;c LG PACK&amp;gt;, &amp;lt;c LG PKG&amp;gt;) 47: if ( 0 &amp;lt; one_of_these) then 51 else 52 unkn 52 51: BReturn 1 52: BReturn 0 time 0.058% fanout 0 input 48185 rows Sort hf 52 (.P_PARTKEY) -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) } time 2.4e-05% fanout 1 input 1 rows { fork time 79% fanout 46004 input 1 rows LINEITEM 1.1e+07 rows(.L_QUANTITY, .L_PARTKEY, .L_EXTENDEDPRICE, .L_DISCOUNT, .L_SHIPMODE) L_SHIPINSTRUCT = &amp;lt;c DELIVER IN PERSON&amp;gt; hash partition+bloom by 0 () hash partition+bloom by 59 (tmp)hash join merged always card 0.00032 -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) time 0.011% fanout 0.599796 input 46004 rows END Node After test: 0: if (.L_QUANTITY &amp;lt;= temp) then 4 else 8 unkn 8 4: if (.L_QUANTITY &amp;gt;= 1 ) then 24 else 8 unkn 8 8: if (.L_QUANTITY &amp;lt;= temp) then 12 else 16 unkn 16 12: if ( 10 &amp;lt;= .L_QUANTITY) then 24 else 16 unkn 16 16: if (temp &amp;gt;= .L_QUANTITY) then 20 else 25 unkn 25 20: if (.L_QUANTITY &amp;gt;= 20 ) then 24 else 25 unkn 25 24: BReturn 1 25: BReturn 0 time 0.002% fanout 1 input 27593 rows Precode: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 Hash source 52 merged into ts 0.00032 rows(k_.L_PARTKEY) -&amp;gt; (.P_SIZE, .P_CONTAINER, .P_BRAND) time 0.053% fanout 0 input 27593 rows END Node After test: 0: if (.P_BRAND = &amp;lt;c Brand#12&amp;gt;) then 4 else 25 unkn 25 4: if (.L_QUANTITY &amp;gt;= 1 ) then 8 else 25 unkn 25 8: if (.L_QUANTITY &amp;lt;= temp) then 12 else 25 unkn 25 12: if (.P_SIZE &amp;lt;= 5 ) then 16 else 25 unkn 25 16: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c SM CASE&amp;gt;, &amp;lt;c SM BOX&amp;gt;, &amp;lt;c SM PACK&amp;gt;, &amp;lt;c SM PKG&amp;gt;) 21: if ( 0 &amp;lt; one_of_these) then 75 else 25 unkn 25 25: if (.P_BRAND = &amp;lt;c Brand#23&amp;gt;) then 29 else 50 unkn 50 29: if ( 10 &amp;lt;= .L_QUANTITY) then 33 else 50 unkn 50 33: if (.L_QUANTITY &amp;lt;= temp) then 37 else 50 unkn 50 37: if (.P_SIZE &amp;lt;= 10 ) then 41 else 50 unkn 50 41: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c MED BAG&amp;gt;, &amp;lt;c MED BOX&amp;gt;, &amp;lt;c MED PKG&amp;gt;, &amp;lt;c MED PACK&amp;gt;) 46: if ( 0 &amp;lt; one_of_these) then 75 else 50 unkn 50 50: if (.P_BRAND = &amp;lt;c Brand#34&amp;gt;) then 54 else 76 unkn 76 54: if (.L_QUANTITY &amp;gt;= 20 ) then 58 else 76 unkn 76 58: if (temp &amp;gt;= .L_QUANTITY) then 62 else 76 unkn 76 62: if (.P_SIZE &amp;lt;= 15 ) then 66 else 76 unkn 76 66: one_of_these := Call one_of_these (.P_CONTAINER, &amp;lt;c LG CASE&amp;gt;, &amp;lt;c LG BOX&amp;gt;, &amp;lt;c LG PACK&amp;gt;, &amp;lt;c LG PKG&amp;gt;) 71: if ( 0 &amp;lt; one_of_these) then 75 else 76 unkn 76 75: BReturn 1 76: BReturn 0 After code: 0: sum revenuetemp 5: BReturn 0 } time 8.7e-06% fanout 0 input 1 rows Select (revenue) } 1315 msec 1889% cpu, 2 rnd 1.62319e+08 seq 0% same seg 0% same pg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Q7 More ORs&lt;/h2&gt; &lt;p&gt;We find a similar pattern in Q7, where an implementation is expected to extract conditions from an &lt;code&gt;OR&lt;/code&gt; and to restrict hash build sides with these. For &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT supp_nation, cust_nation, l_year, SUM(volume) AS revenue FROM ( SELECT n1.n_name AS supp_nation, n2.n_name AS cust_nation, extract(year FROM l_shipdate) AS l_year, l_extendedprice * (1 - l_discount) AS volume FROM supplier, lineitem, orders, customer, nation n1, nation n2 WHERE s_suppkey = l_suppkey AND o_orderkey = l_orderkey AND c_custkey = o_custkey AND s_nationkey = n1.n_nationkey AND c_nationkey = n2.n_nationkey AND ( ( n1.n_name = &amp;#39;FRANCE&amp;#39; AND n2.n_name = &amp;#39;GERMANY&amp;#39; ) OR ( n1.n_name = &amp;#39;GERMANY&amp;#39; AND n2.n_name = &amp;#39;FRANCE&amp;#39; ) ) AND l_shipdate BETWEEN CAST (&amp;#39;1995-01-01&amp;#39; AS DATE) AND CAST (&amp;#39;1996-12-31&amp;#39; AS DATE) ) AS shipping GROUP BY supp_nation, cust_nation, l_year ORDER BY supp_nation, cust_nation, l_year&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The plan builds a hash with &lt;code&gt;customers&lt;/code&gt; from either France or Germany, then of &lt;code&gt;suppliers&lt;/code&gt; from either France or Germany. Then it scans &lt;code&gt;lineitem&lt;/code&gt; for 2/7 &lt;code&gt;years&lt;/code&gt; and selects 2/25 based on the &lt;code&gt;supplier&lt;/code&gt;. The name of the &lt;code&gt;supplier&lt;/code&gt; country is also returned from the merged hash lookup. Then the corresponding &lt;code&gt;order&lt;/code&gt; is fetched by primary key, which is fast since the &lt;code&gt;lineitem&lt;/code&gt; produces keys in order. A similar hash condition is on the &lt;code&gt;customer&lt;/code&gt;. Finally, there is code to check that the countries are different between &lt;code&gt;supplier&lt;/code&gt; and &lt;code&gt;customer&lt;/code&gt;. We leave out the plan in the interest of space. A single execution is between 1.7 and 1.9s; 5 concurrent executions are 7.5s for the slowest. &lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac078514a8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac12d42c08&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac16346118&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aab6b129918&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac1ee7e2b8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aac154f7aa8&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac5901ca68&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac16ce0798&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2101b868&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac29bfd458&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac6f23cdb8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0xb150b38&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab75cd0128&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aac00458af8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe9162e58&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac374d1128&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd089f4c8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:31.805346-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 7 of n) -- TPC-H Q13: The Good and the Bad Plans</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-25#1755</atom:id>
  <atom:published>2013-11-25T16:58:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;Q13 is one of the longest running of the 22 queries. The &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x23e81828&quot;&gt;TPC-H&lt;/a&gt; metric is a geometric mean of two scores, power and throughput, where the throughput score is the elapsed time of the multiuser part of the test divided by the number of queries executed. In this part of the score, Q13 can be up to 1/5 of the total. The power score on the other hand is a geometric mean of the run times of all the queries, scaled into queries per hour. There all queries have equal importance. A bad Q13 will sink a whole result.&lt;/p&gt; &lt;p&gt;Q13 counts the &lt;code&gt;orders&lt;/code&gt; of each &lt;code&gt;customer&lt;/code&gt; and then shows, for each distinct &lt;code&gt;count&lt;/code&gt; of &lt;code&gt;orders&lt;/code&gt;, how many &lt;code&gt;customers&lt;/code&gt; have this number of &lt;code&gt;orders&lt;/code&gt;. 1/3 of the &lt;code&gt;customers&lt;/code&gt; have no &lt;code&gt;orders&lt;/code&gt;; hence this is an outer join between &lt;code&gt;customers&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT c_count, COUNT(*) AS custdist FROM ( SELECT c_custkey, COUNT(o_orderkey) AS c_count FROM ( SELECT * FROM customer LEFT OUTER JOIN orders ON c_custkey = o_custkey AND o_comment NOT LIKE &amp;#39;%special%requests%&amp;#39; ) c_customer GROUP BY c_custkey ) c_orders GROUP BY c_count ORDER BY custdist DESC, c_count DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The only parameter of the query is the pattern in the &lt;code&gt;NOT LIKE&lt;/code&gt; condition. The &lt;code&gt;NOT LIKE&lt;/code&gt; is very unselective, so almost all &lt;code&gt;orders&lt;/code&gt; will be considered.&lt;/p&gt; &lt;p&gt;The Virtuoso run time for Q13 is 6.7s, which we can consider a good result. Running 5 of these at the same time has the fastest execution finishing in 23.7s and the slowest in 35.3s. Doing 5x the work takes 5.2x the time. This is not bad, considering that the query has a high transient memory consumption. A second execution of 5 concurrent Q13s has the fastest finishing in 22.s and the slowest in 29.8s. The difference comes from already having the needed memory blocks cached, so there are no calls to the OS for mapping more memory.&lt;/p&gt; &lt;p&gt;To measure the peak memory consumption, which is a factor with this query, there is the &lt;code&gt;mp_max_large_in_use&lt;/code&gt; counter. To reset: &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;__dbf_set (&amp;#39;mp_max_large_in_use&amp;#39;, 0);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;To read:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;SELECT sys_stat (&amp;#39;mp_max_large_in_use&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For the 5 concurrent executions of Q13, the counter goes to 10GB. This is easily accommodated at 100 GB; but at ten times the scale, this will be a significant quantity, even in a scale out setting. The memory allocation time is recorded in the counter &lt;code&gt;mp_mmap_clocks&lt;/code&gt;, read with &lt;code&gt;sys_stat&lt;/code&gt;. This is a count of cycles spent waiting for &lt;code&gt;mmap&lt;/code&gt; or &lt;code&gt;munmap&lt;/code&gt; and allows tracking if the process is being slowed down by transient memory allocation.&lt;/p&gt; &lt;p&gt;Let us consider how this works. The plan is as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { { hash filler CUSTOMER 1.5e+07 rows(t3.C_CUSTKEY) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Make a hash table of the 150M customers. The stage 2 operator below means that the &lt;code&gt;customers&lt;/code&gt; are partitioned in a number of distinct partitions based on the &lt;code&gt;c_custkey&lt;/code&gt;, which is the key in the hash table. This means that a number of disjoint hash tables are built, as many as there are concurrent threads. This corresponds to the &lt;code&gt;ThreadsPerQuery&lt;/code&gt; ini file setting of the &lt;code&gt;enable_qp&lt;/code&gt; setting with &lt;code&gt;__dbf_set&lt;/code&gt; and &lt;code&gt;sys_stat&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Stage 2 Sort hf 34 (q_t3.C_CUSTKEY) } { fork { fork { fork END Node outer { &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Here we start a &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; block. The below operator scans the &lt;code&gt;orders&lt;/code&gt; table and picks out the &lt;code&gt;orders&lt;/code&gt; which do not contain the mentioned &lt;code&gt;LIKE&lt;/code&gt; pattern.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; ORDERS 1.5e+08 rows(t4.O_CUSTKEY, t4.O_ORDERKEY) O_COMMENT LIKE &lt;c special=&quot;special&quot; requests=&quot;requests&quot;&gt; LIKE &lt;c&gt; hash partition+bloom by 80 () &lt;/c&gt;&lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is a partitioning operator, also known as an exchange operator, which will divide the stream of &lt;code&gt;o_custkeys&lt;/code&gt; from the previous scan into different partitions, each served by a different thread.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Stage 2 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is a lookup in the &lt;code&gt;customer&lt;/code&gt; hash table. The lookup takes place in the partition determined by the &lt;code&gt;o_custkey&lt;/code&gt; being looked up.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Hash source 34 not partitionable 1 rows(q_t4.O_CUSTKEY) -&amp;gt; () right oj, key out ssls: (t3.C_CUSTKEY) After code: 0: t3.C_CUSTKEY := := artm t4.O_CUSTKEY 4: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below is a &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; end operator; see below for further description &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; end of outer} set_ctr out: (t4.O_ORDERKEY, t4.O_CUSTKEY) shadow: (t4.O_ORDERKEY, t4.O_CUSTKEY) Precode: 0: isnotnull := Call isnotnull (t4.O_ORDERKEY) 5: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below sort is the innermost &lt;code&gt;GROUP BY&lt;/code&gt;. The &lt;code&gt;ISNOTNULL&lt;/code&gt; above makes a &lt;code&gt;0&lt;/code&gt; or a &lt;code&gt;1&lt;/code&gt;, depending on whether there was a found &lt;code&gt;o_custkey&lt;/code&gt; for the &lt;code&gt;c_custkey&lt;/code&gt; of the &lt;code&gt;customer&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (t3.C_CUSTKEY) -&amp;gt; (isnotnull) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- The below operators start after the above have executed to completion on every partition. We read the first aggregation, containing for each &lt;code&gt;customer&lt;/code&gt; the &lt;code&gt;COUNT&lt;/code&gt; of &lt;code&gt;orders&lt;/code&gt;. &lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; group by read node (t3.C_CUSTKEY, aggregate)in each partition slice After code: 0: c_custkey := := artm t3.C_CUSTKEY 4: c_count := := artm aggregate 8: BReturn 0 Subquery Select(c_custkey, c_count) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is the second &lt;code&gt;GROUP BY&lt;/code&gt;; for each &lt;code&gt;COUNT&lt;/code&gt;, we count how many &lt;code&gt;customers&lt;/code&gt; have this many &lt;code&gt;orders&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (c_count) -&amp;gt; (inc) } group by read node (c_count, custdist) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;-- Below is the final &lt;code&gt;ORDER BY&lt;/code&gt;.&lt;/i&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Sort (custdist, c_count) } Key from temp (c_count, custdist) Select (c_count, custdist) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The CPU profile starts as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 971537 31.8329 setp_chash_run 494300 16.1960 hash_source_chash_input_1i_n 262218 8.5917 clrg_partition_dc 162773 5.3333 strstr_sse42 68049 2.2297 memcpy_16 65883 2.1587 cha_insert_1i_n 57515 1.8845 hs_send_output 56093 1.8379 cmp_like_const 53752 1.7612 gb_aggregate 51274 1.6800 cha_rehash_ents ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;GROUP BY&lt;/code&gt; is on top, with 31%. This is the first &lt;code&gt;GROUP BY&lt;/code&gt;, which has one group per customer, for a total of 150M groups. Below the &lt;code&gt;GROUP BY&lt;/code&gt; is the hash lookup of the hash join from &lt;code&gt;orders&lt;/code&gt; to &lt;code&gt;customer&lt;/code&gt;. The third item is partitioning of a data column (&lt;code&gt;dc&lt;/code&gt;, or vectored query variable). The partitioning refers to the operator labeled &lt;b&gt;stage 2&lt;/b&gt; above. From one column of values, it makes several. In the 4th place, we have the &lt;code&gt;NOT LIKE&lt;/code&gt; predicate on &lt;code&gt;o_comment&lt;/code&gt;. This is a substring search implemented using SSE 4.2 instructions. Finally, in the last place, there is a function for resizing a hash table; in the present case, the hash table for the innermost &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;At this point, we have to explain the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt;: Generally when making a hash join, the larger table is on the probe side and the smaller on the build side. This means that the rows on the build side get put in a hash table and then for each row on the probe side there is a lookup to see if there is a match in the hash table.&lt;/p&gt; &lt;p&gt;However, here the bigger table is on the right side of &lt;code&gt;LEFT OUTER JOIN&lt;/code&gt;. Normally, one would have to make the hash table from the &lt;code&gt;orders&lt;/code&gt; table and then probe it with &lt;code&gt;customer&lt;/code&gt;, so that one would find no match for the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt; and several matches for &lt;code&gt;customers&lt;/code&gt; with many &lt;code&gt;orders&lt;/code&gt;. However, this would be much slower. So there is a trick for reversing the process: You still build the hash from the smaller set in the &lt;code&gt;JOIN&lt;/code&gt;, but now for each key that does get probed, you set a bit in a bit mask, in addition to sending the match as output. After all outputs have been generated, you look in the hash table for the entries where the bit is not set. These correspond to the &lt;code&gt;customers&lt;/code&gt; with no &lt;code&gt;orders&lt;/code&gt;. For these, you send the &lt;code&gt;c_custkey&lt;/code&gt; with a null &lt;code&gt;o_orderkey&lt;/code&gt; to the next operator in the pipeline, which is the &lt;code&gt;GROUP BY&lt;/code&gt; on &lt;code&gt;c_custkey&lt;/code&gt; with the count of non-null &lt;code&gt;o_orderkeys&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;One might at first think that such a backwards way of doing an outer join is good for nothing but this benchmark and should be considered a benchmark special. This is not so, though, as there are accepted implementations that do this very thing.&lt;/p&gt; &lt;p&gt;Furthermore, getting a competitive score in any other way is impossible, as we shall see below.&lt;/p&gt; &lt;p&gt;We further note that the the grouping key in the innermost &lt;code&gt;GROUP BY&lt;/code&gt; is the same as the hash key in the last hash join, i.e., &lt;code&gt;o_custkey&lt;/code&gt;. This means that the &lt;code&gt;GROUP BY&lt;/code&gt; and the hash join could be combined in a single operator called &lt;code&gt;GROUPJOIN&lt;/code&gt;. If this were done, the hash would be built from &lt;code&gt;customer&lt;/code&gt; with extra space left for the counters. This would in fact remove the hash join from the profile as well as the rehash of the group by hash table, for a gain of about 20%. The outer join behavior is not a problem here since untouched buckets, e.g., &lt;code&gt;customers&lt;/code&gt; without &lt;code&gt;orders&lt;/code&gt;, would be inited with a &lt;code&gt;COUNT&lt;/code&gt; of &lt;code&gt;0&lt;/code&gt;. For an inner join behavior, one would simply leave out the zero counts when reading the &lt;code&gt;GROUP BY&lt;/code&gt;. At the end of the series, we will see what the DBT3 score will be. We remember that there is a 1.5s savings to be had here for the throughput score if the score is not high enough otherwise. The effect on the power score will be less because that only cares about relative speedup, not absolute time.&lt;/p&gt; &lt;p&gt;Next, we disable the &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; optimization and force the &lt;code&gt;JOIN&lt;/code&gt; to build a hash on &lt;code&gt;orders&lt;/code&gt; and to probe it with &lt;code&gt;customer&lt;/code&gt;. The execution time is 25s. Most of the time goes into building the hash table of &lt;code&gt;orders&lt;/code&gt;. The memory consumption also goes up to around 8G. Then we try the &lt;code&gt;JOIN&lt;/code&gt; by index with a scan of &lt;code&gt;customer&lt;/code&gt;, and for each an index lookup of &lt;code&gt;orders&lt;/code&gt; based on an index on &lt;code&gt;o_custkey&lt;/code&gt;. Here we note that there is a condition on a dependent part of the primary key, namely &lt;code&gt;o_comment&lt;/code&gt;, which requires joining to the main row from the &lt;code&gt;o_ck&lt;/code&gt; index. There is a gain however because the &lt;code&gt;GROUP BY&lt;/code&gt; becomes ordered; i.e., there is no need to keep groups around for &lt;code&gt;customers&lt;/code&gt; that have already been seen since we know they will not come again, the outer scan being in order of &lt;code&gt;c_custkey&lt;/code&gt;. For this reason, the memory consumption for the &lt;code&gt;GROUP BY&lt;/code&gt; goes away. However, the index-based plan is extremely sensitive to vector size: The execution takes 29.4s if vector size is allowed to grow to 1MB, but 413s if it stays at the default of 10KB. The difference is in the 1MB vector hitting 1/150 (1 million lookups for a 150 million row table), whereas the 10KB vector hits 1/15000. Thus, benefits from vectoring lookups are largely lost, since there are hardly ever hits in the same segment; in this case, within 2000 rows. But this is not the main problem: The condition on the main row is a &lt;code&gt;LIKE&lt;/code&gt; on a long column. Thus, the whole column for the segment in question must be accessed for read, meaning 2000 or so &lt;code&gt;o_comments&lt;/code&gt;, of which one will be checked. If instead of a condition on &lt;code&gt;o_comment&lt;/code&gt;, we have one on &lt;code&gt;o_totalprice &amp;gt; 0&lt;/code&gt;, we get 93s with 10KB vector size and 15s with dynamic up to 1MB.&lt;/p&gt; &lt;p&gt;If we now remove the condition on dependent columns of &lt;code&gt;orders&lt;/code&gt;, the index plan becomes faster, since the whole condition is resolved within the &lt;code&gt;o_custkey&lt;/code&gt; index -- 2.5s with 10KB vector size, 2.6s with dynamic vector size up to 1MB. The point here is that the access from &lt;code&gt;customer&lt;/code&gt; to &lt;code&gt;orders&lt;/code&gt; on the &lt;code&gt;o_custkey&lt;/code&gt; index is ordered, like a merge join.&lt;/p&gt; &lt;h3&gt;Q13 Conclusions&lt;/h3&gt; &lt;p&gt;Q13 is a combo of many choke points in the &lt;i&gt;TPC-H Analyzed&lt;/i&gt; paper. The most important is special &lt;code&gt;JOIN&lt;/code&gt; types, i.e., &lt;code&gt;RIGHT OUTER JOIN&lt;/code&gt; and &lt;code&gt;GROUPJOIN&lt;/code&gt;. Then there is string operation performance for the substring matching with &lt;code&gt;LIKE&lt;/code&gt;. This needs to be implemented with the SSE 4.2 string instructions; otherwise there is a hit of about 0.5s on query speed.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;TPC-H Analyzed&lt;/i&gt; paper was written against the background of analytical DB tradition where the dominant &lt;code&gt;JOIN&lt;/code&gt; type is hash, except when there is a merge between two sets that are ordered or at least clustered on the same key. Clustered here means physical order but without the need to be strictly in key order.&lt;/p&gt; &lt;p&gt;Here I have added some index based variants to show that hash join indeed wins and to point out the sensitivity of random access to vector size. As column stores go, Virtuoso is especially good at random access. This must be so since it was optimized to do RDF well, which entails a lot of lookup. Also note how a big string column goes with great ease in a sequential scan, but kills in a non-local random access pattern.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac1c7b8ca8&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac1c79fb58&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac1e3a3c58&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1cd4e8a8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2aac0eb77df8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aac1e4e0988&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x1fa4f7b8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab6d0057c8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1eefbb78&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac29fa7b28&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac7aa7ae58&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac345c6278&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x17b3e448&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabebab0578&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe95c4c88&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0xb88bcb8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd149c4e8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:36.781653-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 6 of n) -- TPC-H Q1 and Q3: An Introduction to Query Plans</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-18#1754</atom:id>
  <atom:published>2013-11-18T21:57:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here we look at two &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x29fbb0e8&quot;&gt;TPC-H&lt;/a&gt; queries whose execution plans are relatively straightforward and look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x1b09ee88&quot;&gt;Virtuoso&lt;/a&gt; performance metrics. On one hand; this is an introduction to query plans; on the other hand, a case study in tuning Virtuoso and understanding what goes on. The choke points outlined in &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x9052148&quot;&gt;TPC-H Analyzed&lt;/a&gt;&lt;/i&gt; are mentioned where applicable, with some extra commentary.&lt;/p&gt; &lt;h2&gt;Q1 -- Scan, I/O, Aggregation &lt;/h2&gt; &lt;p&gt;The query is below. The date is a parameter (a value near the end of the &lt;code&gt;l_shipdate&lt;/code&gt; range is used), so most of the columns get read.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate &amp;lt;= dateadd(&amp;#39;DAY&amp;#39;, -90, CAST (&amp;#39;1998-12-01&amp;#39; AS DATE)) GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We note that a count of a non-nullable column is the same as &lt;code&gt;COUNT (*)&lt;/code&gt; and that &lt;code&gt;AVG&lt;/code&gt; of a non-null column is &lt;code&gt;SUM (column) / COUNT (*)&lt;/code&gt;. So &lt;code&gt;COUNT (*)&lt;/code&gt; occurs 4 times, and &lt;code&gt;SUM (l_extendedprice)&lt;/code&gt; and &lt;code&gt;SUM (l_quantity)&lt;/code&gt; each occur twice. The grouping columns have few distinct values.&lt;/p&gt; &lt;p&gt; &lt;i&gt;TPC-H Analyzed&lt;/i&gt; suggests to use an array-based &lt;code&gt;GROUP BY&lt;/code&gt;, because there can only be 64K combinations of 2 single-character values. The grouping keys are declared &lt;code&gt;CHAR (1)&lt;/code&gt; and non-nullable. The Virtuoso implementation does not do this, though.&lt;/p&gt; &lt;p&gt;This query has been treated in many papers because it cannot be implemented in very many ways, it is easy to understand, and it still illustrates some basic metrics.&lt;/p&gt; &lt;p&gt;One execution on warm cache is between 3.9s and 4.7s. One execution with the data coming from OS disk cache is 11.8s. One execution with the data coming from 2 SSDs is 22s. Five concurrent executions from warm cache are 17.3s for the fastest and 20.5s for the slowest. A single threaded execution from warm cache is 58.4s.&lt;/p&gt; &lt;p&gt;We see that scaling is linear; i.e., 5 times the work takes a little under 5x longer. The parallelism is reasonable, with 14.6 speedup from 24 threads on 12 cores. Splitting the work into 48 software threads, time-sliced on 24 hardware threads, does not affect execution time. The work thus appears to be evenly spread on the threads.&lt;/p&gt; &lt;p&gt;It may be interesting to see how much data is transferred. To see the space consumption per column --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 20 * FROM sys_index_space_stats ORDER BY iss_pages DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; -- followed by --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT coi_column, SUM (coi_pages) / 128 FROM sys_col_info GROUP BY coi_column ORDER BY 2 DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- gives us the following --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; L_COMMENT 17893 PS_COMMENT 10371 O_COMMENT 7824 L_EXTENDEDPRICE 4771 O_CLERK 2744 L_PARTKEY 2432 L_SUPPKEY 2432 L_COMMITDATE 1784 L_SHIPDATE 1551 L_RECEIPTDATE 1537 O_TOTALPRICE 1181 C_COMMENT 1150 L_QUANTITY 960 O_ORDERKEY 736 P_NAME 729 PS_SUPPLYCOST 647 O_CUSTKEY 624 C_ADDRESS 427 L_DISCOUNT 424 L_TAX 419 L_SHIPINSTRUCT 412 L_SHIPMODE 410 L_LINENUMBER 394 L_RETURNFLAG 394 L_LINESTATUS 394 O_ORDERDATE 389 P_COMMENT 341 PS_SUPPKEY 323 P_TYPE 293 C_PHONE 274 L_ORDERKEY 268 PS_AVAILQTY 201 P_RETAILPRICE 161 C_ACCTBAL 123 O_ORDERPRIORITY 95 O_ORDERSTATUS 94 S_COMMENT 66 ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The total in allocated pages is 65.6 GB, of which 34.1 GB are accessed by the workload. The comment strings could be stream-compressed, bringing some speedup in load time due to less I/O. Also &lt;code&gt;l_extendedprice&lt;/code&gt;, a frequently accessed column, could be represented with 4 bytes instead of 8. The working set could thus be cut down to about 28 GB, which may offer some benefit at larger scales. At any rate, for system sizing, the space utilization report is very useful.&lt;/p&gt; &lt;p&gt;The query execution profile is as below, with comments inline. The profile here is obvious, but we show this as a guide to reading future profiles which will be more interesting.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 2.6e-06% fanout 1 input 1 rows time 1.7e-06% fanout 1 input 1 rows { fork time 2.1e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;time xx%&lt;/code&gt; line above each operator is the actual percentage of execution time taken by it, followed by the count of rows of output per row of input, followed by the actual rows of input. The below produced 591M rows of output for one row of input --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 34% fanout 5.91599e+08 input 1 rows LINEITEM 5.9e+08 rows(.L_RETURNFLAG, .L_LINESTATUS, .L_DISCOUNT, .L_EXTENDEDPRICE, .L_QUANTITY, .L_TAX) L_SHIPDATE &amp;lt;= &amp;lt;c 1998-09-02&amp;gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Below is the arithmetic of the query, followed by a sort (&lt;code&gt;GROUP BY&lt;/code&gt;) operator.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; After code: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: temp := artm 1 + .L_TAX 12: temp := artm temp * temp 16: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Most of the time is spent below, in the &lt;code&gt;GROUP BY&lt;/code&gt;. We notice that each needed aggregation is done once, so the common subexpressions are correctly detected.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 66% fanout 0 input 5.91599e+08 rows Sort (.L_RETURNFLAG, .L_LINESTATUS) -&amp;gt; (inc, .L_DISCOUNT, .L_EXTENDEDPRICE, .L_QUANTITY, temp, temp) } time 4e-05% fanout 4 input 1 rows group by read node (.L_RETURNFLAG, .L_LINESTATUS, count_order, aggregate, sum_base_price, sum_qty, sum_charge, sum_disc_price) time 6.2e-05% fanout 0 input 4 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;SUMs&lt;/code&gt; are divided by the &lt;code&gt;COUNTs&lt;/code&gt;, and the rows are sorted.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Precode: 0: avg_qty := artm sum_qty / count_order 4: avg_price := artm sum_base_price / count_order 8: avg_disc := artm aggregate / count_order 12: BReturn 0 Sort (.L_RETURNFLAG, .L_LINESTATUS) -&amp;gt; (sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) } time 1.2e-05% fanout 4 input 1 rows Key from temp (.L_RETURNFLAG, .L_LINESTATUS, sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The data is returned to the client.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 4.4e-06% fanout 0 input 4 rows Select (.L_RETURNFLAG, .L_LINESTATUS, sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Elapsed time and CPU%.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 3947 msec 2365% cpu, 6 rnd 5.99841e+08 seq 0% same seg 0% same pg Compilation: 0 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This output is produced by the following sequence on the iSQL command line --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SQL&amp;gt; SET blobs ON; SQL&amp;gt; PROFILE (&amp;#39;SELECT .... FROM .....&amp;#39;); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We will next consider the CPU profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 704173 33.0087 setp_chash_run 275039 12.8927 gb_aggregate 252751 11.8479 ce_dict_any_sets_decode 178304 8.3581 cha_cmp_2a 170819 8.0073 ce_dict_int64_sets_decode 127827 5.9920 chash_array_0 120994 5.6717 chash_array 60902 2.8548 ce_intd_any_range_lte 47865 2.2437 artm_mpy_double 38634 1.8110 ce_vec_int64_sets_decode 26411 1.2380 artm_sub_double 24794 1.1622 artm_add_double 13600 0.6375 cs_decode &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For hardcore aficionados, the code may be found in the Virtuoso &lt;code&gt;develop/7.x&lt;/code&gt; branch on &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x22ea68d8&quot;&gt;github.com&lt;/a&gt;. The version is not exactly the same but close enough for the parts above. &lt;code&gt;artm_*&lt;/code&gt; is arithmetic on typed vectors. As pointed out before, the arithmetic is with &lt;code&gt;DOUBLEs&lt;/code&gt;, although users would prefer fixed point. There is, I believe, a MS SQL Server result with &lt;code&gt;DOUBLEs&lt;/code&gt;, so using &lt;code&gt;DOUBLEs&lt;/code&gt; would not disqualify a 100 GB TPC-H result.&lt;/p&gt; &lt;p&gt;The moral of the story is that an array-based aggregation without the &lt;code&gt;chash_array*&lt;/code&gt; and &lt;code&gt;cha_cmp*&lt;/code&gt; and only 1/3 of the &lt;code&gt;setp_chash_run&lt;/code&gt; function would save upwards of a second of real time. The &lt;code&gt;setp_&lt;/code&gt; and &lt;code&gt;cha_&lt;/code&gt; are aggregation; the &lt;code&gt;ce_*&lt;/code&gt; are column decompression and filtering. The arithmetic is not high in the sample but it could be sped up by 2-4x by SIMD, specially since AVX on Sandy Bridge and later does 4 &lt;code&gt;DOUBLEs&lt;/code&gt; in a single instruction.&lt;/p&gt; &lt;p&gt;We note that the &lt;code&gt;ce_filter_*&lt;/code&gt; function would drop off if the table were stored in date order, as then the top level index would show that all the values in the column matched, thus making it unnecessary to even read the &lt;code&gt;l_shipdate&lt;/code&gt; column, except for the last part of the table. However this is a marginal slice of the time even now.&lt;/p&gt; &lt;h3&gt;Q1 Conclusions&lt;/h3&gt; &lt;p&gt;We have demonstrated good load balance and passed the required common sub-expressions exam. The array-based &lt;code&gt;GROUP BY&lt;/code&gt; trick is unused but would save over 1s of real time, hence will be good value for only 100-200 lines of code.&lt;/p&gt; &lt;h2&gt;Q3 -- Hash and Merge Joins&lt;/h2&gt; &lt;p&gt;Next we look at &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Join_(SQL)&quot; id=&quot;link-id0x29bee6a8&quot;&gt;JOINs&lt;/a&gt;&lt;/code&gt; by hash and index. Q3 is a relatively straightforward example, so we will go over the basics of &lt;code&gt;JOIN&lt;/code&gt; type (i.e., whether by index or hash) and &lt;code&gt;JOIN&lt;/code&gt; order. This will also show some scheduling effects.&lt;/p&gt; &lt;p&gt;The definition is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 10 l_orderkey, SUM(l_extendedprice * (1 - l_discount)) AS revenue, o_orderdate, o_shippriority FROM customer, orders, lineitem WHERE c_mktsegment = &amp;#39;BUILDING&amp;#39; AND c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate &amp;lt; CAST (&amp;#39;1995-03-15&amp;#39; AS DATE) AND l_shipdate &amp;gt; CAST (&amp;#39;1995-03-15&amp;#39; AS DATE) GROUP BY l_orderkey, o_orderdate, o_shippriority ORDER BY revenue desc, o_orderdate &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The profile, comments inline, is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6.7e-06% fanout 1 input 1 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Make a &lt;a href=&quot;http://dbpedia.org/resource/Hash_table&quot; id=&quot;link-id0x1168e208&quot;&gt;hash table&lt;/a&gt; with &lt;code&gt;c_custkey&lt;/code&gt; for all customers with &lt;code&gt;c_mktsegment&lt;/code&gt; building. For a &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x125017f8&quot;&gt;hash join&lt;/a&gt; build side, the time above the hash filler line is the time for making the hash table from the buffered rows. The time above the &lt;code&gt;sort ... hf ...&lt;/code&gt; line is the time for buffering the rows that go into the hash table. The other times in the hash filler block are for the operators for getting the data, and are not related to making the hash table.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.72% fanout 1 input 1 rows { hash filler &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We see that the actual cardinality of &lt;code&gt;customer&lt;/code&gt; is close to what was predicted. The actual number is on the line with time; the predicted is on the line with the index name &lt;code&gt;customer&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 0.63% fanout 3.00019e+06 input 1 rows CUSTOMER 3e+06 rows(.C_CUSTKEY) C_MKTSEGMENT = &lt;c building=&quot;building&quot;&gt; time 0.089% fanout 0 input 3.00019e+06 rows Sort hf 34 (.C_CUSTKEY) } time 9.2e-06% fanout 1 input 1 rows { fork time 5.2e-06% fanout 1 input 1 rows { fork &lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The below is a merge of a scan of &lt;code&gt;orders&lt;/code&gt; and a hash join to &lt;code&gt;customer&lt;/code&gt;. The &lt;code&gt;orders&lt;/code&gt; table is scanned, first reading &lt;code&gt;o_orderdate&lt;/code&gt; and &lt;code&gt;o_custkey&lt;/code&gt;, on which there are selections. The &lt;code&gt;o_orderdate&lt;/code&gt; is a range check that is true of about 1/2 of the rows. The other condition is an invisible hash join against the &lt;code&gt;customer&lt;/code&gt; hash table built above. This selects 1/5 of the rows on the average. So we see that for a total of 150M orders, the fanout is 14.5M, about 1/10, as predicted. The 6.1e7 rows on the line with &lt;code&gt;orders&lt;/code&gt; represents the estimate based on the &lt;code&gt;orderdate&lt;/code&gt; condition. The card 0.2 on the hash filter line is the prediction for the hash join selectivity.&lt;/p&gt; &lt;p&gt;We note that since no &lt;code&gt;order&lt;/code&gt; has more than one &lt;code&gt;customer&lt;/code&gt;, the &lt;code&gt;JOIN&lt;/code&gt; is always cardinality-restricting, hence can be merged into a scan. Being merged into a scan, it becomes run-time re-orderable with the condition on &lt;code&gt;o_orderdate&lt;/code&gt;. The conditions are evaluated and arranged at run time in the order of rows eliminated per unit of time.&lt;/p&gt; &lt;p&gt;The expression &amp;quot;hash partition + bloom&amp;quot; means that the hash join could be partitioned if the hash table did not fit in memory; i.e., there could be several passes over the data. This is not here the case, nor is this generally desirable. The bloom means that the hash is pre-filtered with a Bloom filter, which we will see in the CPU profile.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 30% fanout 1.45679e+07 input 1 rows ORDERS 6.1e+07 rows(.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY) O_ORDERDATE &amp;lt; &amp;lt;c 1995-03-15&amp;gt; hash partition+bloom by 41 (tmp)hash join merged always card 0.2 -&amp;gt; () &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The below is the hash join operator that in fact was merged into the table scan above.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.0016% fanout 1 input 1.45679e+07 rows Hash source 34 merged into ts 0.2 rows(.O_CUSTKEY) -&amp;gt; () &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Below is the index-based access to &lt;code&gt;lineitem&lt;/code&gt;. This is a &lt;i&gt;de facto&lt;/i&gt; &lt;a href=&quot;http://dbpedia.org/resource/Sort-merge_join&quot; id=&quot;link-id0xc2a6528&quot;&gt;merge-join&lt;/a&gt; since the &lt;code&gt;o_orderkeys&lt;/code&gt; are generated in order by the scan. One in 10 &lt;code&gt;l_orderkeys&lt;/code&gt; is selected. Each of these has an average of 4 &lt;code&gt;lineitems&lt;/code&gt;. Of these 4, the cost model predicts that 2.7 will be selected based on the additional condition on &lt;code&gt;l_shipdate&lt;/code&gt;. The actual number of rows matched is in fact much lower since the date selection is heavily anti-correlated with the date selection on &lt;code&gt;orders&lt;/code&gt;. In other words, an &lt;code&gt;order&lt;/code&gt; tends to be shipped soon after the &lt;code&gt;orderdate&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 16% fanout 0.20508 input 1.45679e+07 rows LINEITEM 2.6 rows(.L_ORDERKEY, .L_EXTENDEDPRICE, .L_DISCOUNT) inlined L_ORDERKEY = .O_ORDERKEY L_SHIPDATE &amp;gt; &lt;c&gt; After code: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 &lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The query has a &lt;code&gt;GROUP BY&lt;/code&gt; that includes the high cardinality column, &lt;code&gt;l_orderkey&lt;/code&gt;, with 150M distinct values. The &lt;code&gt;GROUP BY&lt;/code&gt; is therefore partitioned.&lt;/p&gt; &lt;p&gt;This means that the previous part of the query is run on multiple threads, so that each thread gets an approximately equal number of lines of orders. For the &lt;code&gt;GROUP BY&lt;/code&gt;, the threads pass each other chunks of data so that each grouping key can only end up in one partition. This means that at the end of the &lt;code&gt;GROUP BY&lt;/code&gt;, there are multiple hash tables with grouping results that are guaranteed non-overlapping, hence there is no need to add up (re-aggregate) the per-thread results. The stage operator passes data between the threads. This is also known as an exchange operator.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 1% fanout 1 input 2.98758e+06 rows Stage 2 time 1.4% fanout 0 input 2.98758e+06 rows Sort (q_.L_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY) -&amp;gt; (temp) } time 0.4% fanout 1.13104e+06 input 1 rows group by read node (.L_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY, revenue)in each partition slice time 0.36% fanout 0 input 1.13104e+06 rows Sort (revenue, .O_ORDERDATE) -&amp;gt; (.L_ORDERKEY, .O_SHIPPRIORITY) } time 3.1e-05% fanout 10 input 1 rows top order by read (.L_ORDERKEY, revenue, .O_ORDERDATE, .O_SHIPPRIORITY) time 6.2e-06% fanout 0 input 10 rows Select (.L_ORDERKEY, revenue, .O_ORDERDATE, .O_SHIPPRIORITY) } 1189 msec 2042% cpu, 1.45513e+07 rnd 2.08588e+08 seq 98.9053% same seg 0.952364% same pg Compilation: 1 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This query also illustrates the meaning of the random and sequential access meters in the profile: For 1/10 of the &lt;code&gt;orders&lt;/code&gt;, there is a random lookup from &lt;code&gt;lineitem&lt;/code&gt;, hence 14.5M random lookups. The sequential scan is 150M rows of &lt;code&gt;orders&lt;/code&gt; plus an average of 3 extra rows for each of the 14M random accesses of &lt;code&gt;lineitem&lt;/code&gt;. The locality metric, &lt;i&gt;98.9% same segment&lt;/i&gt;, means that the &lt;code&gt;JOIN&lt;/code&gt; has a merge-join pattern, since 99% of lookups fall in the same segment as the previous one. A segment is a column store structure that, in the case of &lt;code&gt;lineitem&lt;/code&gt;, corresponds to about 4500 consecutive rows.&lt;/p&gt; &lt;p&gt;This is one of the queries where storing the data in date order would be advantageous. A zone map on date would eliminate half the second half of the &lt;code&gt;orders&lt;/code&gt; without even looking at the columns. A zone map is a summary data structure that keeps, for example, a minimum and a maximum value of an attribute for a range of consecutive rows. Also, for all but the &lt;code&gt;lineitems&lt;/code&gt; at the end of the range of &lt;code&gt;orders&lt;/code&gt;, a zone map would also disqualify the items without looking at the column. VectorWise, for example, profits from this. However, the CPU profile below shows that the time spent in date compares is not very long even now.&lt;/p&gt; &lt;p&gt;On further analysis, we see that the query is run in the order of &lt;code&gt;o_orderkey&lt;/code&gt;, so that each &lt;code&gt;o_orderkey&lt;/code&gt; is seen once. Hence the partitioned &lt;code&gt;GROUP BY&lt;/code&gt; can be changed into an ordered &lt;code&gt;GROUP BY&lt;/code&gt;, as all the grouping columns are further functionally dependent on &lt;code&gt;o_orderkey&lt;/code&gt;. An ordered &lt;code&gt;GROUP BY&lt;/code&gt; is more efficient than a partitioned or re-aggregated one, since it does not have to remember grouping keys: Once a new key comes in, the previous key will not be seen again, and the aggregation for it can be sent onwards in the pipeline.&lt;/p&gt; &lt;p&gt;However, this last transformation has little effect here, as the count of rows passing to the aggregation is small. Use of ordered aggregation has much higher impact in other queries and will be visited there. There is also a chance for late projection, as the &lt;code&gt;o_shippriority&lt;/code&gt; is in fact only needed for the top 10 rows returned. The impact is small in this case, though. This too will be visited later.&lt;/p&gt; &lt;p&gt;We now consider the CPU profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 93087 20.9350 cha_inline_1i_n 63224 14.2189 cha_bloom_unroll 30162 6.7834 cha_insert_1i_n 29178 6.5621 ce_search_rld 28519 6.4139 ce_intd_range_ltgt 17319 3.8950 cs_decode 15848 3.5642 ce_intd_sets_ltgt 11731 2.6383 ce_skip_bits_2 8212 1.8469 ce_vec_int_sets_decode 7946 1.7870 itc_single_row_opt 7886 1.7735 ce_intd_any_sets_decode 7072 1.5905 itc_fetch_col_vec 6474 1.4560 setp_chash_run 5304 1.1929 itc_ce_value_offset 5263 1.1836 itc_col_seg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top 3 items are for the &lt;code&gt;orders&lt;/code&gt; x &lt;code&gt;customer&lt;/code&gt; hash join -- the top 2 for the probe, and the 3rd for the build. The 4th item is the index lookup on &lt;code&gt;lineitem&lt;/code&gt;. The one below that is the date condition on &lt;code&gt;orders&lt;/code&gt;; below this is the condition on the date of &lt;code&gt;lineitem&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The functions working on a compressed column are usually called &lt;code&gt;ce_&amp;lt;compression type&amp;gt;_&amp;lt;sets or range&amp;gt;_&amp;lt;filter or decode&amp;gt;&lt;/code&gt;. &lt;code&gt;ce&lt;/code&gt; means compression entry; the compression types are &lt;code&gt;rl&lt;/code&gt; (run length), &lt;code&gt;rld&lt;/code&gt; (run length with delta), &lt;code&gt;bits&lt;/code&gt; (densely ascending values as bitmap), &lt;code&gt;intd&lt;/code&gt; (16 bit deltas on a base), and &lt;code&gt;dict&lt;/code&gt; (dictionary). The &lt;code&gt;sets&lt;/code&gt; vs &lt;code&gt;range&lt;/code&gt; determines whether the operation works on a set of contiguous values in the entry, or takes a vector of row numbers as context. The first predicate works on a range; the next one on the sets (row numbers) selected by the previous. &lt;code&gt;Filter&lt;/code&gt; means selection, and &lt;code&gt;decode&lt;/code&gt; means extracting a value for processing by a downstream operator.&lt;/p&gt; &lt;p&gt;We run 5 of these concurrently: the fastest returns in 2.8s; the slowest in 5.4s. The executions are staggered, so that each divides into up to 24 independent fragments which are then multiplexed on 48 worker threads, with each fragment guaranteed at least one thread. The slices of the first query are prioritized, so that when a worker thread has a choice of next unit of work, it will prefer one from an older queue. Each query in this setting has one queue of independently executable fragments. Thus the first to come in gets the most threads and finishes sooner. The rationale for this is that a query may have large transient memory consumption, e.g., &lt;code&gt;GROUP BYs&lt;/code&gt; or hash join build sides. The sooner such a query finishes, the less likely it is that there will be many concurrent queries with the high peak-memory demand. This does not block short queries since in any case a runnable query will have one thread which will get scheduled by the OS from time to time.&lt;/p&gt; &lt;h3&gt;Q3 Conclusions&lt;/h3&gt; &lt;p&gt;The balance is that unused tricks (ordered aggregation, late projection) would gain little. Date order would gain about 0.4s from 1.3s, but would lose in other queries.&lt;/p&gt; &lt;p&gt;We have treated Q1 and Q3 at some length in order to introduce reading of query profiles and the meaning of some meters. For the handful of people who are deep into this sport, the information is rather obvious, but will still give an idea of the specific feature mix of Virtuoso. Column stores are similar to a point, but not all make the exact same choices.&lt;/p&gt; &lt;p&gt;If you are a developer, what, if anything, should you remember of this? Never mind the finesses of column store science -- if you understand join order and join type, then there is the possibility of understanding why some queries are fast and some slow. Most support questions are about this. If you know what the DBMS does or should do you are in control. This is why the metrics and concepts here are also of some interest outside the very small group that actually makes DBMS.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac0d9ccf98&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aabda3ead98&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac1ee21098&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1c7a12a8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aabe81d5468&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aabc7308158&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac49385648&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x247daab8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x156b4528&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2b8e4118&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac66827ee8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac32c2b4c8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x133b7aa8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab7749ef18&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe8078ee8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabd76f3528&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab521d3d78&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:10:58.209795-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 6 of n) -- TPC-H Q1 and Q3: An Introduction to Query Plans</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-18#1753</atom:id>
  <atom:published>2013-11-18T21:57:04Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here we look at two &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x29fbb0e8&quot;&gt;TPC-H&lt;/a&gt; queries whose execution plans are relatively straightforward and look at &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x1b09ee88&quot;&gt;Virtuoso&lt;/a&gt; performance metrics. On one hand; this is an introduction to query plans; on the other hand, a case study in tuning Virtuoso and understanding what goes on. The choke points outlined in &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0x9052148&quot;&gt;TPC-H Analyzed&lt;/a&gt;&lt;/i&gt; are mentioned where applicable, with some extra commentary.&lt;/p&gt; &lt;h2&gt;Q1 -- Scan, I/O, Aggregation &lt;/h2&gt; &lt;p&gt;The query is below. The date is a parameter (a value near the end of the &lt;code&gt;l_shipdate&lt;/code&gt; range is used), so most of the columns get read.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate &amp;lt;= dateadd(&amp;#39;DAY&amp;#39;, -90, CAST (&amp;#39;1998-12-01&amp;#39; AS DATE)) GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We note that a count of a non-nullable column is the same as &lt;code&gt;COUNT (*)&lt;/code&gt; and that &lt;code&gt;AVG&lt;/code&gt; of a non-null column is &lt;code&gt;SUM (column) / COUNT (*)&lt;/code&gt;. So &lt;code&gt;COUNT (*)&lt;/code&gt; occurs 4 times, and &lt;code&gt;SUM (l_extendedprice)&lt;/code&gt; and &lt;code&gt;SUM (l_quantity)&lt;/code&gt; each occur twice. The grouping columns have few distinct values.&lt;/p&gt; &lt;p&gt; &lt;i&gt;TPC-H Analyzed&lt;/i&gt; suggests to use an array-based &lt;code&gt;GROUP BY&lt;/code&gt;, because there can only be 64K combinations of 2 single-character values. The grouping keys are declared &lt;code&gt;CHAR (1)&lt;/code&gt; and non-nullable. The Virtuoso implementation does not do this, though.&lt;/p&gt; &lt;p&gt;This query has been treated in many papers because it cannot be implemented in very many ways, it is easy to understand, and it still illustrates some basic metrics.&lt;/p&gt; &lt;p&gt;One execution on warm cache is between 3.9s and 4.7s. One execution with the data coming from OS disk cache is 11.8s. One execution with the data coming from 2 SSDs is 22s. Five concurrent executions from warm cache are 17.3s for the fastest and 20.5s for the slowest. A single threaded execution from warm cache is 58.4s.&lt;/p&gt; &lt;p&gt;We see that scaling is linear; i.e., 5 times the work takes a little under 5x longer. The parallelism is reasonable, with 14.6 speedup from 24 threads on 12 cores. Splitting the work into 48 software threads, time-sliced on 24 hardware threads, does not affect execution time. The work thus appears to be evenly spread on the threads.&lt;/p&gt; &lt;p&gt;It may be interesting to see how much data is transferred. To see the space consumption per column --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 20 * FROM sys_index_space_stats ORDER BY iss_pages DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; -- followed by --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT coi_column, SUM (coi_pages) / 128 FROM sys_col_info GROUP BY coi_column ORDER BY 2 DESC ; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;-- gives us the following --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; L_COMMENT 17893 PS_COMMENT 10371 O_COMMENT 7824 L_EXTENDEDPRICE 4771 O_CLERK 2744 L_PARTKEY 2432 L_SUPPKEY 2432 L_COMMITDATE 1784 L_SHIPDATE 1551 L_RECEIPTDATE 1537 O_TOTALPRICE 1181 C_COMMENT 1150 L_QUANTITY 960 O_ORDERKEY 736 P_NAME 729 PS_SUPPLYCOST 647 O_CUSTKEY 624 C_ADDRESS 427 L_DISCOUNT 424 L_TAX 419 L_SHIPINSTRUCT 412 L_SHIPMODE 410 L_LINENUMBER 394 L_RETURNFLAG 394 L_LINESTATUS 394 O_ORDERDATE 389 P_COMMENT 341 PS_SUPPKEY 323 P_TYPE 293 C_PHONE 274 L_ORDERKEY 268 PS_AVAILQTY 201 P_RETAILPRICE 161 C_ACCTBAL 123 O_ORDERPRIORITY 95 O_ORDERSTATUS 94 S_COMMENT 66 ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The total in allocated pages is 65.6 GB, of which 34.1 GB are accessed by the workload. The comment strings could be stream-compressed, bringing some speedup in load time due to less I/O. Also &lt;code&gt;l_extendedprice&lt;/code&gt;, a frequently accessed column, could be represented with 4 bytes instead of 8. The working set could thus be cut down to about 28 GB, which may offer some benefit at larger scales. At any rate, for system sizing, the space utilization report is very useful.&lt;/p&gt; &lt;p&gt;The query execution profile is as below, with comments inline. The profile here is obvious, but we show this as a guide to reading future profiles which will be more interesting.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 2.6e-06% fanout 1 input 1 rows time 1.7e-06% fanout 1 input 1 rows { fork time 2.1e-06% fanout 1 input 1 rows { fork &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;time xx%&lt;/code&gt; line above each operator is the actual percentage of execution time taken by it, followed by the count of rows of output per row of input, followed by the actual rows of input. The below produced 591M rows of output for one row of input --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 34% fanout 5.91599e+08 input 1 rows LINEITEM 5.9e+08 rows(.L_RETURNFLAG, .L_LINESTATUS, .L_DISCOUNT, .L_EXTENDEDPRICE, .L_QUANTITY, .L_TAX) L_SHIPDATE &amp;lt;= &amp;lt;c 1998-09-02&amp;gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Below is the arithmetic of the query, followed by a sort (&lt;code&gt;GROUP BY&lt;/code&gt;) operator.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; After code: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: temp := artm 1 + .L_TAX 12: temp := artm temp * temp 16: BReturn 0 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Most of the time is spent below, in the &lt;code&gt;GROUP BY&lt;/code&gt;. We notice that each needed aggregation is done once, so the common subexpressions are correctly detected.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 66% fanout 0 input 5.91599e+08 rows Sort (.L_RETURNFLAG, .L_LINESTATUS) -&amp;gt; (inc, .L_DISCOUNT, .L_EXTENDEDPRICE, .L_QUANTITY, temp, temp) } time 4e-05% fanout 4 input 1 rows group by read node (.L_RETURNFLAG, .L_LINESTATUS, count_order, aggregate, sum_base_price, sum_qty, sum_charge, sum_disc_price) time 6.2e-05% fanout 0 input 4 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;SUMs&lt;/code&gt; are divided by the &lt;code&gt;COUNTs&lt;/code&gt;, and the rows are sorted.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Precode: 0: avg_qty := artm sum_qty / count_order 4: avg_price := artm sum_base_price / count_order 8: avg_disc := artm aggregate / count_order 12: BReturn 0 Sort (.L_RETURNFLAG, .L_LINESTATUS) -&amp;gt; (sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) } time 1.2e-05% fanout 4 input 1 rows Key from temp (.L_RETURNFLAG, .L_LINESTATUS, sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The data is returned to the client.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 4.4e-06% fanout 0 input 4 rows Select (.L_RETURNFLAG, .L_LINESTATUS, sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order) } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Elapsed time and CPU%.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 3947 msec 2365% cpu, 6 rnd 5.99841e+08 seq 0% same seg 0% same pg Compilation: 0 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This output is produced by the following sequence on the iSQL command line --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SQL&amp;gt; SET blobs ON; SQL&amp;gt; PROFILE (&amp;#39;SELECT .... FROM .....&amp;#39;); &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We will next consider the CPU profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 704173 33.0087 setp_chash_run 275039 12.8927 gb_aggregate 252751 11.8479 ce_dict_any_sets_decode 178304 8.3581 cha_cmp_2a 170819 8.0073 ce_dict_int64_sets_decode 127827 5.9920 chash_array_0 120994 5.6717 chash_array 60902 2.8548 ce_intd_any_range_lte 47865 2.2437 artm_mpy_double 38634 1.8110 ce_vec_int64_sets_decode 26411 1.2380 artm_sub_double 24794 1.1622 artm_add_double 13600 0.6375 cs_decode &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For hardcore aficionados, the code may be found in the Virtuoso &lt;code&gt;develop/7.x&lt;/code&gt; branch on &lt;a href=&quot;https://github.com/openlink/virtuoso-opensource/&quot; id=&quot;link-id0x22ea68d8&quot;&gt;github.com&lt;/a&gt;. The version is not exactly the same but close enough for the parts above. &lt;code&gt;artm_*&lt;/code&gt; is arithmetic on typed vectors. As pointed out before, the arithmetic is with &lt;code&gt;DOUBLEs&lt;/code&gt;, although users would prefer fixed point. There is, I believe, a MS SQL Server result with &lt;code&gt;DOUBLEs&lt;/code&gt;, so using &lt;code&gt;DOUBLEs&lt;/code&gt; would not disqualify a 100 GB TPC-H result.&lt;/p&gt; &lt;p&gt;The moral of the story is that an array-based aggregation without the &lt;code&gt;chash_array*&lt;/code&gt; and &lt;code&gt;cha_cmp*&lt;/code&gt; and only 1/3 of the &lt;code&gt;setp_chash_run&lt;/code&gt; function would save upwards of a second of real time. The &lt;code&gt;setp_&lt;/code&gt; and &lt;code&gt;cha_&lt;/code&gt; are aggregation; the &lt;code&gt;ce_*&lt;/code&gt; are column decompression and filtering. The arithmetic is not high in the sample but it could be sped up by 2-4x by SIMD, specially since AVX on Sandy Bridge and later does 4 &lt;code&gt;DOUBLEs&lt;/code&gt; in a single instruction.&lt;/p&gt; &lt;p&gt;We note that the &lt;code&gt;ce_filter_*&lt;/code&gt; function would drop off if the table were stored in date order, as then the top level index would show that all the values in the column matched, thus making it unnecessary to even read the &lt;code&gt;l_shipdate&lt;/code&gt; column, except for the last part of the table. However this is a marginal slice of the time even now.&lt;/p&gt; &lt;h3&gt;Q1 Conclusions&lt;/h3&gt; &lt;p&gt;We have demonstrated good load balance and passed the required common sub-expressions exam. The array-based &lt;code&gt;GROUP BY&lt;/code&gt; trick is unused but would save over 1s of real time, hence will be good value for only 100-200 lines of code.&lt;/p&gt; &lt;h2&gt;Q3 -- Hash and Merge Joins&lt;/h2&gt; &lt;p&gt;Next we look at &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Join_(SQL)&quot; id=&quot;link-id0x29bee6a8&quot;&gt;JOINs&lt;/a&gt;&lt;/code&gt; by hash and index. Q3 is a relatively straightforward example, so we will go over the basics of &lt;code&gt;JOIN&lt;/code&gt; type (i.e., whether by index or hash) and &lt;code&gt;JOIN&lt;/code&gt; order. This will also show some scheduling effects.&lt;/p&gt; &lt;p&gt;The definition is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT TOP 10 l_orderkey, SUM(l_extendedprice * (1 - l_discount)) AS revenue, o_orderdate, o_shippriority FROM customer, orders, lineitem WHERE c_mktsegment = &amp;#39;BUILDING&amp;#39; AND c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate &amp;lt; CAST (&amp;#39;1995-03-15&amp;#39; AS DATE) AND l_shipdate &amp;gt; CAST (&amp;#39;1995-03-15&amp;#39; AS DATE) GROUP BY l_orderkey, o_orderdate, o_shippriority ORDER BY revenue desc, o_orderdate &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The profile, comments inline, is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; { time 6.7e-06% fanout 1 input 1 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Make a &lt;a href=&quot;http://dbpedia.org/resource/Hash_table&quot; id=&quot;link-id0x1168e208&quot;&gt;hash table&lt;/a&gt; with &lt;code&gt;c_custkey&lt;/code&gt; for all customers with &lt;code&gt;c_mktsegment&lt;/code&gt; building. For a &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x125017f8&quot;&gt;hash join&lt;/a&gt; build side, the time above the hash filler line is the time for making the hash table from the buffered rows. The time above the &lt;code&gt;sort ... hf ...&lt;/code&gt; line is the time for buffering the rows that go into the hash table. The other times in the hash filler block are for the operators for getting the data, and are not related to making the hash table.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.72% fanout 1 input 1 rows { hash filler &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We see that the actual cardinality of &lt;code&gt;customer&lt;/code&gt; is close to what was predicted. The actual number is on the line with time; the predicted is on the line with the index name &lt;code&gt;customer&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 0.63% fanout 3.00019e+06 input 1 rows CUSTOMER 3e+06 rows(.C_CUSTKEY) C_MKTSEGMENT = &lt;c building=&quot;building&quot;&gt; time 0.089% fanout 0 input 3.00019e+06 rows Sort hf 34 (.C_CUSTKEY) } time 9.2e-06% fanout 1 input 1 rows { fork time 5.2e-06% fanout 1 input 1 rows { fork &lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The below is a merge of a scan of &lt;code&gt;orders&lt;/code&gt; and a hash join to &lt;code&gt;customer&lt;/code&gt;. The &lt;code&gt;orders&lt;/code&gt; table is scanned, first reading &lt;code&gt;o_orderdate&lt;/code&gt; and &lt;code&gt;o_custkey&lt;/code&gt;, on which there are selections. The &lt;code&gt;o_orderdate&lt;/code&gt; is a range check that is true of about 1/2 of the rows. The other condition is an invisible hash join against the &lt;code&gt;customer&lt;/code&gt; hash table built above. This selects 1/5 of the rows on the average. So we see that for a total of 150M orders, the fanout is 14.5M, about 1/10, as predicted. The 6.1e7 rows on the line with &lt;code&gt;orders&lt;/code&gt; represents the estimate based on the &lt;code&gt;orderdate&lt;/code&gt; condition. The card 0.2 on the hash filter line is the prediction for the hash join selectivity.&lt;/p&gt; &lt;p&gt;We note that since no &lt;code&gt;order&lt;/code&gt; has more than one &lt;code&gt;customer&lt;/code&gt;, the &lt;code&gt;JOIN&lt;/code&gt; is always cardinality-restricting, hence can be merged into a scan. Being merged into a scan, it becomes run-time re-orderable with the condition on &lt;code&gt;o_orderdate&lt;/code&gt;. The conditions are evaluated and arranged at run time in the order of rows eliminated per unit of time.&lt;/p&gt; &lt;p&gt;The expression &amp;quot;hash partition + bloom&amp;quot; means that the hash join could be partitioned if the hash table did not fit in memory; i.e., there could be several passes over the data. This is not here the case, nor is this generally desirable. The bloom means that the hash is pre-filtered with a Bloom filter, which we will see in the CPU profile.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 30% fanout 1.45679e+07 input 1 rows ORDERS 6.1e+07 rows(.O_CUSTKEY, .O_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY) O_ORDERDATE &amp;lt; &amp;lt;c 1995-03-15&amp;gt; hash partition+bloom by 41 (tmp)hash join merged always card 0.2 -&amp;gt; () &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The below is the hash join operator that in fact was merged into the table scan above.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 0.0016% fanout 1 input 1.45679e+07 rows Hash source 34 merged into ts 0.2 rows(.O_CUSTKEY) -&amp;gt; () &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Below is the index-based access to &lt;code&gt;lineitem&lt;/code&gt;. This is a &lt;i&gt;de facto&lt;/i&gt; &lt;a href=&quot;http://dbpedia.org/resource/Sort-merge_join&quot; id=&quot;link-id0xc2a6528&quot;&gt;merge-join&lt;/a&gt; since the &lt;code&gt;o_orderkeys&lt;/code&gt; are generated in order by the scan. One in 10 &lt;code&gt;l_orderkeys&lt;/code&gt; is selected. Each of these has an average of 4 &lt;code&gt;lineitems&lt;/code&gt;. Of these 4, the cost model predicts that 2.7 will be selected based on the additional condition on &lt;code&gt;l_shipdate&lt;/code&gt;. The actual number of rows matched is in fact much lower since the date selection is heavily anti-correlated with the date selection on &lt;code&gt;orders&lt;/code&gt;. In other words, an &lt;code&gt;order&lt;/code&gt; tends to be shipped soon after the &lt;code&gt;orderdate&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; &lt;pre&gt; time 16% fanout 0.20508 input 1.45679e+07 rows LINEITEM 2.6 rows(.L_ORDERKEY, .L_EXTENDEDPRICE, .L_DISCOUNT) inlined L_ORDERKEY = .O_ORDERKEY L_SHIPDATE &amp;gt; &lt;c&gt; After code: 0: temp := artm 1 - .L_DISCOUNT 4: temp := artm .L_EXTENDEDPRICE * temp 8: BReturn 0 &lt;/c&gt; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The query has a &lt;code&gt;GROUP BY&lt;/code&gt; that includes the high cardinality column, &lt;code&gt;l_orderkey&lt;/code&gt;, with 150M distinct values. The &lt;code&gt;GROUP BY&lt;/code&gt; is therefore partitioned.&lt;/p&gt; &lt;p&gt;This means that the previous part of the query is run on multiple threads, so that each thread gets an approximately equal number of lines of orders. For the &lt;code&gt;GROUP BY&lt;/code&gt;, the threads pass each other chunks of data so that each grouping key can only end up in one partition. This means that at the end of the &lt;code&gt;GROUP BY&lt;/code&gt;, there are multiple hash tables with grouping results that are guaranteed non-overlapping, hence there is no need to add up (re-aggregate) the per-thread results. The stage operator passes data between the threads. This is also known as an exchange operator.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; time 1% fanout 1 input 2.98758e+06 rows Stage 2 time 1.4% fanout 0 input 2.98758e+06 rows Sort (q_.L_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY) -&amp;gt; (temp) } time 0.4% fanout 1.13104e+06 input 1 rows group by read node (.L_ORDERKEY, .O_ORDERDATE, .O_SHIPPRIORITY, revenue)in each partition slice time 0.36% fanout 0 input 1.13104e+06 rows Sort (revenue, .O_ORDERDATE) -&amp;gt; (.L_ORDERKEY, .O_SHIPPRIORITY) } time 3.1e-05% fanout 10 input 1 rows top order by read (.L_ORDERKEY, revenue, .O_ORDERDATE, .O_SHIPPRIORITY) time 6.2e-06% fanout 0 input 10 rows Select (.L_ORDERKEY, revenue, .O_ORDERDATE, .O_SHIPPRIORITY) } 1189 msec 2042% cpu, 1.45513e+07 rnd 2.08588e+08 seq 98.9053% same seg 0.952364% same pg Compilation: 1 msec 0 reads 0% read 0 messages 0% clw &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This query also illustrates the meaning of the random and sequential access meters in the profile: For 1/10 of the &lt;code&gt;orders&lt;/code&gt;, there is a random lookup from &lt;code&gt;lineitem&lt;/code&gt;, hence 14.5M random lookups. The sequential scan is 150M rows of &lt;code&gt;orders&lt;/code&gt; plus an average of 3 extra rows for each of the 14M random accesses of &lt;code&gt;lineitem&lt;/code&gt;. The locality metric, &lt;i&gt;98.9% same segment&lt;/i&gt;, means that the &lt;code&gt;JOIN&lt;/code&gt; has a merge-join pattern, since 99% of lookups fall in the same segment as the previous one. A segment is a column store structure that, in the case of &lt;code&gt;lineitem&lt;/code&gt;, corresponds to about 4500 consecutive rows.&lt;/p&gt; &lt;p&gt;This is one of the queries where storing the data in date order would be advantageous. A zone map on date would eliminate half the second half of the &lt;code&gt;orders&lt;/code&gt; without even looking at the columns. A zone map is a summary data structure that keeps, for example, a minimum and a maximum value of an attribute for a range of consecutive rows. Also, for all but the &lt;code&gt;lineitems&lt;/code&gt; at the end of the range of &lt;code&gt;orders&lt;/code&gt;, a zone map would also disqualify the items without looking at the column. VectorWise, for example, profits from this. However, the CPU profile below shows that the time spent in date compares is not very long even now.&lt;/p&gt; &lt;p&gt;On further analysis, we see that the query is run in the order of &lt;code&gt;o_orderkey&lt;/code&gt;, so that each &lt;code&gt;o_orderkey&lt;/code&gt; is seen once. Hence the partitioned &lt;code&gt;GROUP BY&lt;/code&gt; can be changed into an ordered &lt;code&gt;GROUP BY&lt;/code&gt;, as all the grouping columns are further functionally dependent on &lt;code&gt;o_orderkey&lt;/code&gt;. An ordered &lt;code&gt;GROUP BY&lt;/code&gt; is more efficient than a partitioned or re-aggregated one, since it does not have to remember grouping keys: Once a new key comes in, the previous key will not be seen again, and the aggregation for it can be sent onwards in the pipeline.&lt;/p&gt; &lt;p&gt;However, this last transformation has little effect here, as the count of rows passing to the aggregation is small. Use of ordered aggregation has much higher impact in other queries and will be visited there. There is also a chance for late projection, as the &lt;code&gt;o_shippriority&lt;/code&gt; is in fact only needed for the top 10 rows returned. The impact is small in this case, though. This too will be visited later.&lt;/p&gt; &lt;p&gt;We now consider the CPU profile:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 93087 20.9350 cha_inline_1i_n 63224 14.2189 cha_bloom_unroll 30162 6.7834 cha_insert_1i_n 29178 6.5621 ce_search_rld 28519 6.4139 ce_intd_range_ltgt 17319 3.8950 cs_decode 15848 3.5642 ce_intd_sets_ltgt 11731 2.6383 ce_skip_bits_2 8212 1.8469 ce_vec_int_sets_decode 7946 1.7870 itc_single_row_opt 7886 1.7735 ce_intd_any_sets_decode 7072 1.5905 itc_fetch_col_vec 6474 1.4560 setp_chash_run 5304 1.1929 itc_ce_value_offset 5263 1.1836 itc_col_seg &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top 3 items are for the &lt;code&gt;orders&lt;/code&gt; x &lt;code&gt;customer&lt;/code&gt; hash join -- the top 2 for the probe, and the 3rd for the build. The 4th item is the index lookup on &lt;code&gt;lineitem&lt;/code&gt;. The one below that is the date condition on &lt;code&gt;orders&lt;/code&gt;; below this is the condition on the date of &lt;code&gt;lineitem&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The functions working on a compressed column are usually called &lt;code&gt;ce_&amp;lt;compression type&amp;gt;_&amp;lt;sets or range&amp;gt;_&amp;lt;filter or decode&amp;gt;&lt;/code&gt;. &lt;code&gt;ce&lt;/code&gt; means compression entry; the compression types are &lt;code&gt;rl&lt;/code&gt; (run length), &lt;code&gt;rld&lt;/code&gt; (run length with delta), &lt;code&gt;bits&lt;/code&gt; (densely ascending values as bitmap), &lt;code&gt;intd&lt;/code&gt; (16 bit deltas on a base), and &lt;code&gt;dict&lt;/code&gt; (dictionary). The &lt;code&gt;sets&lt;/code&gt; vs &lt;code&gt;range&lt;/code&gt; determines whether the operation works on a set of contiguous values in the entry, or takes a vector of row numbers as context. The first predicate works on a range; the next one on the sets (row numbers) selected by the previous. &lt;code&gt;Filter&lt;/code&gt; means selection, and &lt;code&gt;decode&lt;/code&gt; means extracting a value for processing by a downstream operator.&lt;/p&gt; &lt;p&gt;We run 5 of these concurrently: the fastest returns in 2.8s; the slowest in 5.4s. The executions are staggered, so that each divides into up to 24 independent fragments which are then multiplexed on 48 worker threads, with each fragment guaranteed at least one thread. The slices of the first query are prioritized, so that when a worker thread has a choice of next unit of work, it will prefer one from an older queue. Each query in this setting has one queue of independently executable fragments. Thus the first to come in gets the most threads and finishes sooner. The rationale for this is that a query may have large transient memory consumption, e.g., &lt;code&gt;GROUP BYs&lt;/code&gt; or hash join build sides. The sooner such a query finishes, the less likely it is that there will be many concurrent queries with the high peak-memory demand. This does not block short queries since in any case a runnable query will have one thread which will get scheduled by the OS from time to time.&lt;/p&gt; &lt;h3&gt;Q3 Conclusions&lt;/h3&gt; &lt;p&gt;The balance is that unused tricks (ordered aggregation, late projection) would gain little. Date order would gain about 0.4s from 1.3s, but would lose in other queries.&lt;/p&gt; &lt;p&gt;We have treated Q1 and Q3 at some length in order to introduce reading of query profiles and the meaning of some meters. For the handful of people who are deep into this sport, the information is rather obvious, but will still give an idea of the specific feature mix of Virtuoso. Column stores are similar to a point, but not all make the exact same choices.&lt;/p&gt; &lt;p&gt;If you are a developer, what, if anything, should you remember of this? Never mind the finesses of column store science -- if you understand join order and join type, then there is the possibility of understanding why some queries are fast and some slow. Most support questions are about this. If you know what the DBMS does or should do you are in control. This is why the metrics and concepts here are also of some interest outside the very small group that actually makes DBMS.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac0d9ccf98&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aabda3ead98&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac1ee21098&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1c7a12a8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x2aabe81d5468&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2aabc7308158&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x20d67a48&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x946a618&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aabcb9b8548&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aabf9ffcc98&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac64094c08&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac3414f9f8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x175a0328&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x14714e58&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x1804d4d8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac65219ce8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd1c1b8e8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:41.796973-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 5 of n) -- The Return of SQL Federation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-13#1752</atom:id>
  <atom:published>2013-11-14T00:15:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;In past years, &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabfb321848&quot;&gt;Virtuoso&lt;/a&gt; has mostly been known as an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aabc345c6e8&quot;&gt;RDF&lt;/a&gt; store. Some of you will recall that Virtuoso has always had &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabf8ffe268&quot;&gt;SQL&lt;/a&gt; and SQL federation capabilities.&lt;/p&gt; &lt;p&gt;With the coming of age of the Virtuoso column store, where this becomes a strong contender for SQL warehousing, the SQL federation aspect is also revitalized.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1744&quot; id=&quot;link-id0x2aabc35b67a8&quot;&gt;the previous article&lt;/a&gt;, we saw that Virtuoso can load files at well over gigabit-ethernet wire speed. The same of course applies to SQL federation. We can copy the 100 GB &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabc39864a8&quot;&gt;TPC-H&lt;/a&gt; dataset between two Virtuoso instances in only slightly more time than it takes to load the data from files. In a network situation, the network is likely to be the slowest link when extracting data from other SQL stores into Virtuoso. So, to be &amp;quot;semantically elastic,&amp;quot; federating has become warehousing. The articles to follow will show excellent query speed for analytics. The combination of this with connectivity to any existing SQL infrastructure makes Virtuoso an easy-to-deploy accelerator cache for almost any data integration situation. This in fact also simplifies query execution, because the more data one can have locally, the more query optimization choices there are, and performance becomes much more predictable than in situations where queries execute across many heterogenous systems. The win is compounded by reducing loads on the line-of-business databases. The missing link in this case becomes heterogenous log shipping. One can usually not modify a line of business system; for example, adding triggers for tracking changes is generally not done. Being able to read transaction logs of all the most common DBMS would offer a solution.&lt;/p&gt; &lt;p&gt;The barrier to having one&amp;#39;s own extract of data for analysis has become much lower. Even the ETL step can be easily streamlined by the SQL federation. For very time-sensitive applications, one can always keep a local copy of a history in a union with the most recent data accessed from the line-of-business system. At the end of the TPC-H series, we will show examples of a near real-time analytics system that keeps up to date with an Oracle database.&lt;/p&gt; &lt;p&gt;For RDF users, this means we have the capacity to extract RDF at bulk load speed from any relational source, whether local or remote. For the test system discussed in the TPC-H series, RDF load shows a sustained throughput of around 320K triples per second. This means that an RDF materialization of the 100 GB TPC-H dataset, about 12.5 billion triples, is done in under 11 hours. This is a vast improvement over the present, and we will show the details in a forthcoming article.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233ad048&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x23d3f248&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x23f8f828&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x22fc65b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac02b6fa88&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab6ebab028&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2189c888&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aab707c59d8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac678110c8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac34b5bfb8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0xedee4c8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabded2a2e8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabeb7ff588&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabf7a5a068&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab52dc50f8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:11:04.768627-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 4 of n) -- Bulk Load and Refresh</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-13#1751</atom:id>
  <atom:published>2013-11-14T00:15:40Z</atom:published>
  <atom:content type="html">&lt;p&gt;The server configuration is as in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/virtuoso.ini&quot; id=&quot;link-id0x2aabe3352788&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt;, discussed in &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1742&quot; id=&quot;link-id0x2aabe25b6168&quot;&gt;the previous post&lt;/a&gt;. The schema is created by loading the file &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/schema.sql&quot; id=&quot;link-id0x2aac18efb818&quot;&gt;schema.sql&lt;/a&gt;&lt;/code&gt;, attached. All the tables are stored column-wise. The file contains declarations for hash partitioning in a cluster, but these have no effect on the single-server case. The file tables are declared in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ldschema.sql&quot; id=&quot;link-id0x9491548&quot;&gt;ldschema.sql&lt;/a&gt;&lt;/code&gt; and bound to files in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ldfile.sql&quot; id=&quot;link-id0x2aabe218aee8&quot;&gt;ldfile.sql&lt;/a&gt;&lt;/code&gt;. The refresh functions are in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/rf.sql&quot; id=&quot;link-id0x2aabe0a12128&quot;&gt;rf.sql&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The source data is created with the &lt;code&gt;dbgen&lt;/code&gt; utility. One file is generated per table.&lt;/p&gt; &lt;p&gt;Twelve refresh datasets are created in order to do the prescribed two runs; each consists of one power test, and one five-stream throughput test. Five streams is the minimum for the 100 GB scale.&lt;/p&gt; &lt;h2&gt;Bulk Load&lt;/h2&gt; &lt;p&gt;The bulk load script, &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ld.sql&quot; id=&quot;link-id0x2aabe155fc28&quot;&gt;ld.sql&lt;/a&gt;&lt;/code&gt; specifies the CSV files from which the data is loaded as file tables. The load command is simply --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;log_enable (2); INSERT INTO lineitem SELECT * FROM lineitem_f ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;log_enable (2)&lt;/code&gt; turns off transaction logging, and enables non-transactional inserts. The &lt;code&gt;lineitem&lt;/code&gt; table is a column-wise stored database table; the &lt;code&gt;lineitem_f&lt;/code&gt; is a table view on the &lt;code&gt;lineitem.tbl&lt;/code&gt; CSV file. The load script launches one statement like the above for each table, all in parallel, and then waits for their completion. It then makes an explicit &lt;code&gt;CHECKPOINT&lt;/code&gt; to make the data durable. No foreign keys are declared; hence the load does not have to occur in any particular order. Each file is loaded in 24 parallel chunks; the file table facility splits the scan automatically inTO as many chunks as are specified by &lt;code&gt;ThreadsPerQuery&lt;/code&gt; in the ini file.&lt;/p&gt; &lt;p&gt;The last of the load statements, that for &lt;code&gt;lineitem&lt;/code&gt;, completes in 849s of real time. At this point, the data is loaded, and the database is ready for query. There are 3.4M dirty buffers yet to be flushed before the database state is durable. Thus, we must include the checkpoint time in the load result, which adds another 169s. The total load time is hence 16m58s.&lt;/p&gt; &lt;p&gt;By the TPC-H rules the timed portion of load must include any gathering of database statistics. We do not do any; rather the queries will derive any needed statistics by sampling at run time.&lt;/p&gt; &lt;p&gt;The bulk load has a sustained read rate around 120 MB/s from the source files. The average rate of writing is 60 MB/s. The writing continues long after the read has finished, so we have a truly I/O-bound situation. This can be improved by adding more SSDs. The CPU profile shows a possible gain of around 10%. Thus, with a better I/O system and some more optimization, a load time of about 11m should be possible with this CPU/memory configuration.&lt;/p&gt; &lt;p&gt;TPC-H specifies two data refresh operations: one inserting 1/1000th of the &lt;code&gt;orders&lt;/code&gt;/&lt;code&gt;lineitem&lt;/code&gt; combination; and another deleting the same. The rules leave the implementation largely open; they only specify that the &lt;code&gt;order&lt;/code&gt; and its &lt;code&gt;lineitem&lt;/code&gt;s must be inserted or deleted within the same transaction.&lt;/p&gt; &lt;p&gt;Most implementations bulk-load a staging table, and then do an &lt;code&gt;INSERT ... SELECT&lt;/code&gt; statement for the &lt;code&gt;INSERT&lt;/code&gt; or a &lt;code&gt;DELETE WHERE IN (SELECT ...)&lt;/code&gt; for the &lt;code&gt;DELETE&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabe13333f8&quot;&gt;Virtuoso&lt;/a&gt;, the refreshes are implemented as SQL procedures that read file tables, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;CREATE PROCEDURE rf1 ( IN dir VARCHAR , IN nth INT , IN no_pk INT := 0 , IN rb INT := 0 , IN qp INT := NULL ) { INSERT INTO orders SELECT * FROM orders_f TABLE OPTION ( FROM sprintf (&amp;#39;%s/orders.tbl.u%d&amp;#39;, dir, nth) ) ; INSERT INTO lineitem SELECT * FROM lineitem_f TABLE OPTION ( FROM sprintf (&amp;#39;%s/lineitem.tbl.u%d&amp;#39;, dir, nth) ) ; COMMIT WORK ; } CREATE PROCEDURE del_batch ( IN d_orderkey INT ) { VECTORED; DELETE FROM lineitem WHERE l_orderkey = d_orderkey ; DELETE FROM orders WHERE o_orderkey = d_orderkey ; } CREATE PROCEDURE rf2 ( IN dir VARCHAR , IN nth INT ) { DECLARE cnt INT ; cnt := ( SELECT COUNT (del_batch (d_orderkey) ) FROM delete_f TABLE OPTION ( FROM sprintf ( &amp;#39;%s/delete.%d&amp;#39;, dir, nth ) ) ) ; COMMIT WORK ; RETURN cnt ; }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Things can hardly be simpler. The delete uses a vectored stored procedure to delete a batch of rows in one statement. The parallelization is done automatically, dividing the file table being read into equal size chunks.&lt;/p&gt; &lt;p&gt;The performance is as follows. These refreshes are run on the database right after the bulk load.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;-- Line 33: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 1) Done. -- 3909 msec. -- Line 34: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 1) Done. -- 863 msec. -- Line 36: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 2) Done. -- 2269 msec. -- Line 37: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 2) Done. -- 871 msec. -- Line 40: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 3) Done. -- 2315 msec. -- Line 41: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 3) Done. -- 906 msec. -- Line 43: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 4) Done. -- 2337 msec. -- Line 44: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 4) Done. -- 913 msec. -- Line 46: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 5) Done. -- 2429 msec. -- Line 47: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 5) Done. -- 1970 msec. -- Line 49: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 6) Done. -- 2467 msec. -- Line 50: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 6) Done. -- 888 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The performance is very competitive. Some improvement remains possible but load and refresh are already strong.&lt;/p&gt; &lt;p&gt;In the next installment we will look at some queries and explain how to interpret query plans and profiles.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x1d1b2148&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aabeb0a0178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac0adf7ba8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1db753e8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac024dd748&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x23286de8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x200696a8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac15301358&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac667b72c8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x18b11288&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x194b8578&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab74730668&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabdd4c3558&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac660a9f88&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x10f4e6ee8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:11:11.424985-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 3 of n) -- Benchmark Configuration Settings</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-13#1750</atom:id>
  <atom:published>2013-11-14T00:14:59Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this section, we cover the system configuration for running an analytics workload. If you are running a Virtuoso database with even moderate data size, or are interested in reproducing the results presented here, the below will be relevant. If you are interested in the science of query, you can skip to the next installment.&lt;/p&gt; &lt;p&gt;The relevant sections of the &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/virtuoso.ini&quot; id=&quot;link-id0x2aabcfc16b98&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt; file are below, with commentary inline. The actual ini file has many more settings but these do not influence the benchmark.&lt;/p&gt; &lt;p&gt;The test file system layout has two SSD file systems, mounted on &lt;code&gt;/1s1&lt;/code&gt; and &lt;code&gt;/1s2&lt;/code&gt;. The database is striped across the two file systems.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Database] DatabaseFile = virtuoso.db TransactionFile = /1s2/dbs/virtuoso.trx Striping = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This sets the log to be on the second SSD, and the database to be striped; the files are declared in the &lt;code&gt;[Striping]&lt;/code&gt; section further below.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[TempDatabase] DatabaseFile = virtuoso.tdb TransactionFile = virtuoso.ttr [Parameters] ServerPort = 1209 ServerThreads = 100 CheckpointInterval = 0 NumberOfBuffers = 8000000 MaxDirtyBuffers = 1000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The thread count is set to 100. This is not significant, since the test will only have a few concurrent connections, but this should be at least as high as the number of concurrent user connections expected.&lt;/p&gt; &lt;p&gt;The 100 GB TPC-H working set is about 38 GB for the queries. The full database is about 80 GB. Eight million buffers at 8 KB each means that up to 64 GB of database pages will be resident in memory. This should be set higher than the expected working set if possible, but the database process size should also not exceed 80% of physical memory.&lt;/p&gt; &lt;p&gt;The max dirty buffers limit is set to a small fraction of the total buffers for faster bulk load. The bulk load is limited by writing to secondary storage, so we want the writing to start early, and continue through the bulk load. Otherwise the checkpoint at the end of the bulk load would be oversized, because of high numbers of un-flushed buffers.&lt;/p&gt; &lt;p&gt;The checkpoint interval is set to 0, meaning no automatic checkpoints. There will be one at the end of the bulk load, as required by the rules, but the rules do not require checkpoints for the refresh functions.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;ColumnStore = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This sets all tables to be created column-wise. No special DDL directives are needed for column store operation.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;MaxCheckpointRemap = 2500000 DefaultIsolation = 2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The default isolation is set to &lt;code&gt;READ COMMITTED&lt;/code&gt;. Running large queries with locking on reads would have a very high overhead.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;DirsAllowed = / TransactionAfterImageLimit = 1500000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is set to an arbitrarily high number. The measure is the count of bytes to be written to log at commit (1.5 GB, here). If the amount of data to be logged exceeds this, the transaction aborts. The RF1 transaction at 100 GB scale will log about 100 MB.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;FDsPerFile = 4 MaxMemPoolSize = 40000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the maximum number of bytes of transient memory to be used for query optimization (40 MB, here). The number is adequate for TPC-H, since the queries only have a few joins each. For RDF workloads, the number should be higher, since there are more joins.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;AdjustVectorSize = 0&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The workload will run at the default vector size. Index operations can be accelerated by switching to a larger vector size, trading memory for locality. But since this workload is mostly by hash join, there is no benefit in changing this.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;ThreadsPerQuery = 24&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Each query is divided into up to 24 parallel fragments. 24 is the number of threads on the test system.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;AsyncQueueMaxThreads = 48&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Queries are run by a pool of 48 worker threads. Each session has one thread of its own. If a query parallelizes, the first fragment runs on the session&amp;#39;s thread and the remaining fragments run on a thread from this pool. Thus the core threads are oversubscribed by a factor of slightly over 2 in the throughput run: 6 sessions plus 48 threads makes up to 53 runnable threads at any point in the throughput test.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;MaxQueryMem = 30G&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is a cap on query execution memory. If memory would exceed this, optimizations that would increase space consumption are not used. The memory may still transiently exceed this limit.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;HashJoinSpace = 30G&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the maximum memory to be used for hash tables during hash joins. If a hash join causes this amount to be exceeded, it will be run in multiple passes, so as to have a cap on the hash table size. Not all hash joins may be partitioned, and the test must not do multi-pass hash joins, hence a high number here. We will see actual space consumption figures when looking at the queries. This parameter may be increased for analytics performance, especially in multiuser situations.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Client] SQL_QUERY_TIMEOUT = 0 SQL_TXN_TIMEOUT = 0 SQL_ROWSET_SIZE = 10 SQL_PREFETCH_BYTES = 120000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;120 KB of results is to be sent to clients in a single window. This is enough for the relatively short result sets in this benchmark.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Striping] Segment1 = 1024, /1s1/dbs/tpch100cp-1.db = q1, /1s2/dbs/tpch100cp-2.db = q2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The database is set to stripe in two files, each on a different SSD. Each file has its own background I/O thread; this is the meaning of the &lt;code&gt;= q1&lt;/code&gt; and &lt;code&gt;= q2&lt;/code&gt; declaration. All files on each separately-seekable device should share the same &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Flags] enable_mt_txn = 1 enable_mt_transact = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first setting enables multithreading DML statement execution. The second setting enables multithreading of &lt;code&gt;COMMIT&lt;/code&gt; or &lt;code&gt;ROLLBACK&lt;/code&gt; operations. This is important for the refresh function performance. A column store &lt;code&gt;COMMIT&lt;/code&gt; of a &lt;code&gt;DELETE&lt;/code&gt; will especially benefit from multithreading, since this may involve re-compression.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;hash_join_enable = 2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Will use hash joins for SQL and SPARQL (even though SPARQL is not used in this experiment).&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbf_explain_level = 0&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Specifies less verbose query plan formatting for logging of query execution.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbf_log_fsync = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Specify that &lt;code&gt;fsync&lt;/code&gt; is to be called after each write to the transaction log. The ACID qualification procedure specifies that the system is to be powered down in mid-run, hence this setting is required by the test.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac10367338&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac10369458&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac09638778&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1036f9d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x8b44fc8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x204a3a98&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac09d78ed8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2b23a6d8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac50e18368&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0xa5a8188&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab7962cef8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe9842418&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aac0103faf8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac4b265be8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x10c987558&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:11:17.921466-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 2 of n) -- TPC-H Schema Choices</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-13#1749</atom:id>
  <atom:published>2013-11-14T00:14:47Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac182bc168&quot;&gt;TPC-H&lt;/a&gt; gives a strict definition of the table structure and content, but leaves implementations some latitude in defining indices and data layout. A TPC-H run consists of a power test with a single user submitting queries in sequence, and of a throughput test where many concurrent users are simulated. An implementation may choose how many concurrent users are simulated, as long as this is more than a set minimum.&lt;/p&gt; &lt;p&gt;Tables do not always have to be stored in the order of their primary key. A clustered index is a structure where the index tree leaves contain the whole row of data. TPC-H explicitly forbids materializing multiple copies of a table in different sort orders for speeding up different queries. That said, an implementation may pick one primary order for each table which does not have to be the primary key order.&lt;/p&gt; &lt;p&gt;The present champion in core-for-core speed, Actian &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aab8cb5f898&quot;&gt;VectorWise&lt;/a&gt;, organizes the main tables, &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, in date order. The &lt;a href=&quot;http://dbpedia.org/page/Microsoft_SQL_Server&quot; id=&quot;link-id0x2aab8d146198&quot;&gt;Microsoft SQL Server&lt;/a&gt; implementations use clustered indices on &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, where the table is stored in non-primary key order; in this case, the major ordering columns are &lt;code&gt;l_shipdate&lt;/code&gt; and &lt;code&gt;o_orderdate&lt;/code&gt;, respectively.&lt;/p&gt; &lt;p&gt;These index schemes create locality on the date dimension.&lt;/p&gt; &lt;p&gt;In the present discussion, we take a different tack: We keep &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt; in primary key order, and sacrifice locality on date in favor of a fast merge join between these two tables, and for faster load and data maintenance.&lt;/p&gt; &lt;p&gt;TPC-H rules allow indices on foreign keys and dates. In this implementation, we only define one on &lt;code&gt;o_custkey&lt;/code&gt;; &lt;code&gt;lineitem&lt;/code&gt; is only indexed on its primary key. These are the two largest tables, and the only ones that change during the benchmark. Whether indices are defined on other tables makes little or no difference, since joins between these tend to perform better by hash than by index in any case.&lt;/p&gt; &lt;h2&gt;Scale and Test System&lt;/h2&gt; &lt;p&gt;All the runs are done at 100 GB scale. The test machine is a dual E5-2630 (2x6 cores, 2x12 threads, 2.3 GHz) with 192 GB of 1066 MHz RAM. Two Crucial 512 GB SSDs are used both for database and staging of the files. The disks are independent file systems with no RAID. (Note that RAID would be required for an official result.) The operating system is CentOS 6.2.&lt;/p&gt; &lt;p&gt;For cluster results, two machines with the above spec are used with a QDR InfiniBand interconnect.&lt;/p&gt; &lt;p&gt;The Virtuoso used is a current internal development version, to be available at the end of this series or by special request. This is neither the publicly available open nor closed source version.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x22454708&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2213e628&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x239b07e8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x71bc8e8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x9419bc8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x21bff8c8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2ab001f8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac65da3028&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x18fd1cb8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0xfa85898&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabeb7ad658&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabea871078&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac645fd4e8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aaad8672ca8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:11:24.547353-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 1 of n) -- Virtuoso meets TPC-H</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-11-13#1748</atom:id>
  <atom:published>2013-11-14T00:14:37Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x14305a58&quot;&gt;TPC-H&lt;/a&gt; is &lt;i&gt;the&lt;/i&gt; data warehousing benchmark to date. I will here cover the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac18ee59d8&quot;&gt;Virtuoso&lt;/a&gt; implementation of this in detail. The primary audience is database experts. This will also be very educational for DBAs and advanced application developers: Life becomes much more predictable if one knows a good query plan from a bad one. Alongside a commentary on database science, you will also find here a guided tour of Virtuoso performance tuning and diagnostics. To follow this, it is useful to have the official TPC-H spec at hand (download links are on the far-right of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1418dc38&quot;&gt;this page&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;By now, TPC-H is an old game and it is safe to say that pretty much any player in the analytics database domain has had a go at it, even though some have never published a result. So, the bar for new entrants is very high.&lt;/p&gt; &lt;p&gt;Especially, &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x8f6ba08&quot;&gt;VectorWise&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/EXASolution&quot; id=&quot;link-id0x2aac18ccdfc8&quot;&gt;EXASolution&lt;/a&gt; have taken performance in this workload close to the limits of the achievable. A challenger has to do everything right in order to win. One wrong move will lose the whole race.&lt;/p&gt; &lt;p&gt;This presentation has many objectives:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;To illustrate how Virtuoso is an excellent SQL analytics engine&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;To provide an in-depth discussion on the science of query optimization and execution&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;To outline avenues of future development, specifically as concerns analytics with schema-less data&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In the &lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/&quot; id=&quot;link-id0x2aac182d14d8&quot;&gt;TPC TC workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb.org/2013&quot; id=&quot;link-id0x14ae6bb8&quot;&gt;VLDB 2013&lt;/a&gt; there was a paper &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0xa9316e8&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;&lt;/i&gt;, by &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x127527a8&quot;&gt;Peter Boncz&lt;/a&gt;, &lt;a href=&quot;http://www-db.in.tum.de/~neumann/&quot; id=&quot;link-id0x14a12d18&quot;&gt;Thomas Neumann&lt;/a&gt;, and &lt;a href=&quot;http://www.linkedin.com/in/orrierling&quot; id=&quot;link-id0x14a7a308&quot;&gt;myself&lt;/a&gt; concerning what the database world has learned from this very tough exercise. Peter Boncz is the original architect of Actian VectorWise, the current champion in TPC-H performance per core. Thomas Neumann is the author of &lt;a href=&quot;http://www-db.in.tum.de/research/projects/HyPer/&quot; id=&quot;link-id0x14a99168&quot;&gt;HyPer&lt;/a&gt;, most likely the best entry in DBMS research for simultaneously supporting analytics and OLTP. Peter and Thomas are among the most renowned in database science. I am the Program Manager of the Virtuoso column store, overseeing core engineering tasks such as SQL query optimization, execution, storage, and scale out. &lt;/p&gt; &lt;p&gt;In this series I will go over the Virtuoso implementation of TPC-H and will elaborate further on the points discussed in the paper. The subject is broader than any single paper can cover in detail, although there are plenty of papers only addressing one or two of the 22 queries.&lt;/p&gt; &lt;p&gt;Virtuoso is mostly known for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x955fb38&quot;&gt;RDF&lt;/a&gt;. Here we will cover the whole benchmark in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xaca8ae8&quot;&gt;SQL&lt;/a&gt; first, with both single-server and cluster implementations, and discussion of where these differ. A state-of-the-art SQL implementation is the necessary basis for discussing how the same can be accomplished in RDF. Comparing good RDF to bad SQL is not interesting.&lt;/p&gt; &lt;p&gt;The earlier articles on the Star Schema Benchmark (SSB) (&lt;a href=&quot;http://www.cs.umb.edu/~poneil/StarSchemaB.PDF&quot; id=&quot;link-id0x14aef2a8&quot;&gt;PDF&lt;/a&gt;) -- &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x13a8f708&quot;&gt;Annuit Coeptis, or, Star Schema and The Cost of Freedom&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1733&quot; id=&quot;link-id0x14aa6b58&quot;&gt;E Pluribus Unum, or, Star Schema Meets Cluster&lt;/a&gt;&lt;/i&gt; -- demonstrated how the most basic analytical database operations perform in Virtuoso. All the techniques used there are also directly applicable to TPC-H, but the latter adds a good 20 more tricks one needs to see through.&lt;/p&gt; &lt;p&gt;Future installments will discuss TPC-H query by query. We conclude with a full run of &lt;a href=&quot;http://sourceforge.net/apps/mediawiki/osdldbt/&quot; id=&quot;link-id0x14abca48&quot;&gt;OSDL-DBT-3&lt;/a&gt;. DBT-3™ is an unofficial TPC-H without auditing but with the same workload.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac0b114898&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac06d43db8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac0bf375e8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac06d24268&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac4b54c208&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2251ead8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac08234e28&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2ab89598&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac74e794a8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac332bb958&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aab6f50a6c8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe94b29a8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe97d03b8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac9c3dc178&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab53c91a78&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:11:29.522883-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 5 of n) -- The Return of SQL Federation</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-13#1747</atom:id>
  <atom:published>2013-11-14T00:06:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;In past years, &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabfb321848&quot;&gt;Virtuoso&lt;/a&gt; has mostly been known as an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2aabc345c6e8&quot;&gt;RDF&lt;/a&gt; store. Some of you will recall that Virtuoso has always had &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aabf8ffe268&quot;&gt;SQL&lt;/a&gt; and SQL federation capabilities.&lt;/p&gt; &lt;p&gt;With the coming of age of the Virtuoso column store, where this becomes a strong contender for SQL warehousing, the SQL federation aspect is also revitalized.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1744&quot; id=&quot;link-id0x2aabc35b67a8&quot;&gt;the previous article&lt;/a&gt;, we saw that Virtuoso can load files at well over gigabit-ethernet wire speed. The same of course applies to SQL federation. We can copy the 100 GB &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabc39864a8&quot;&gt;TPC-H&lt;/a&gt; dataset between two Virtuoso instances in only slightly more time than it takes to load the data from files. In a network situation, the network is likely to be the slowest link when extracting data from other SQL stores into Virtuoso. So, to be &amp;quot;semantically elastic,&amp;quot; federating has become warehousing. The articles to follow will show excellent query speed for analytics. The combination of this with connectivity to any existing SQL infrastructure makes Virtuoso an easy-to-deploy accelerator cache for almost any data integration situation. This in fact also simplifies query execution, because the more data one can have locally, the more query optimization choices there are, and performance becomes much more predictable than in situations where queries execute across many heterogenous systems. The win is compounded by reducing loads on the line-of-business databases. The missing link in this case becomes heterogenous log shipping. One can usually not modify a line of business system; for example, adding triggers for tracking changes is generally not done. Being able to read transaction logs of all the most common DBMS would offer a solution.&lt;/p&gt; &lt;p&gt;The barrier to having one&amp;#39;s own extract of data for analysis has become much lower. Even the ETL step can be easily streamlined by the SQL federation. For very time-sensitive applications, one can always keep a local copy of a history in a union with the most recent data accessed from the line-of-business system. At the end of the TPC-H series, we will show examples of a near real-time analytics system that keeps up to date with an Oracle database.&lt;/p&gt; &lt;p&gt;For RDF users, this means we have the capacity to extract RDF at bulk load speed from any relational source, whether local or remote. For the test system discussed in the TPC-H series, RDF load shows a sustained throughput of around 320K triples per second. This means that an RDF materialization of the 100 GB TPC-H dataset, about 12.5 billion triples, is done in under 11 hours. This is a vast improvement over the present, and we will show the details in a forthcoming article.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233ad048&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x23d3f248&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x23f8f828&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x22fc65b8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2cbf92d8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x14609048&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x9685b48&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x101b44c8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aac14a29ab8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac3672dc98&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2a8654e8&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x1f028528&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac3477e948&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aabdbe3c0f8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aab6b98bfa8&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x1698e778&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aabc9187e78&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd2b02798&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:47.154096-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 4 of n) -- Bulk Load and Refresh</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-13#1744</atom:id>
  <atom:published>2013-11-14T00:01:39Z</atom:published>
  <atom:content type="html">&lt;p&gt;The server configuration is as in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/virtuoso.ini&quot; id=&quot;link-id0x2aabe3352788&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt;, discussed in &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1742&quot; id=&quot;link-id0x2aabe25b6168&quot;&gt;the previous post&lt;/a&gt;. The schema is created by loading the file &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/schema.sql&quot; id=&quot;link-id0x2aac18efb818&quot;&gt;schema.sql&lt;/a&gt;&lt;/code&gt;, attached. All the tables are stored column-wise. The file contains declarations for hash partitioning in a cluster, but these have no effect on the single-server case. The file tables are declared in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ldschema.sql&quot; id=&quot;link-id0x9491548&quot;&gt;ldschema.sql&lt;/a&gt;&lt;/code&gt; and bound to files in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ldfile.sql&quot; id=&quot;link-id0x2aabe218aee8&quot;&gt;ldfile.sql&lt;/a&gt;&lt;/code&gt;. The refresh functions are in &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/rf.sql&quot; id=&quot;link-id0x2aabe0a12128&quot;&gt;rf.sql&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The source data is created with the &lt;code&gt;dbgen&lt;/code&gt; utility. One file is generated per table.&lt;/p&gt; &lt;p&gt;Twelve refresh datasets are created in order to do the prescribed two runs; each consists of one power test, and one five-stream throughput test. Five streams is the minimum for the 100 GB scale.&lt;/p&gt; &lt;h2&gt;Bulk Load&lt;/h2&gt; &lt;p&gt;The bulk load script, &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/ld.sql&quot; id=&quot;link-id0x2aabe155fc28&quot;&gt;ld.sql&lt;/a&gt;&lt;/code&gt; specifies the CSV files from which the data is loaded as file tables. The load command is simply --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;log_enable (2); INSERT INTO lineitem SELECT * FROM lineitem_f ;&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;log_enable (2)&lt;/code&gt; turns off transaction logging, and enables non-transactional inserts. The &lt;code&gt;lineitem&lt;/code&gt; table is a column-wise stored database table; the &lt;code&gt;lineitem_f&lt;/code&gt; is a table view on the &lt;code&gt;lineitem.tbl&lt;/code&gt; CSV file. The load script launches one statement like the above for each table, all in parallel, and then waits for their completion. It then makes an explicit &lt;code&gt;CHECKPOINT&lt;/code&gt; to make the data durable. No foreign keys are declared; hence the load does not have to occur in any particular order. Each file is loaded in 24 parallel chunks; the file table facility splits the scan automatically inTO as many chunks as are specified by &lt;code&gt;ThreadsPerQuery&lt;/code&gt; in the ini file.&lt;/p&gt; &lt;p&gt;The last of the load statements, that for &lt;code&gt;lineitem&lt;/code&gt;, completes in 849s of real time. At this point, the data is loaded, and the database is ready for query. There are 3.4M dirty buffers yet to be flushed before the database state is durable. Thus, we must include the checkpoint time in the load result, which adds another 169s. The total load time is hence 16m58s.&lt;/p&gt; &lt;p&gt;By the TPC-H rules the timed portion of load must include any gathering of database statistics. We do not do any; rather the queries will derive any needed statistics by sampling at run time.&lt;/p&gt; &lt;p&gt;The bulk load has a sustained read rate around 120 MB/s from the source files. The average rate of writing is 60 MB/s. The writing continues long after the read has finished, so we have a truly I/O-bound situation. This can be improved by adding more SSDs. The CPU profile shows a possible gain of around 10%. Thus, with a better I/O system and some more optimization, a load time of about 11m should be possible with this CPU/memory configuration.&lt;/p&gt; &lt;p&gt;TPC-H specifies two data refresh operations: one inserting 1/1000th of the &lt;code&gt;orders&lt;/code&gt;/&lt;code&gt;lineitem&lt;/code&gt; combination; and another deleting the same. The rules leave the implementation largely open; they only specify that the &lt;code&gt;order&lt;/code&gt; and its &lt;code&gt;lineitem&lt;/code&gt;s must be inserted or deleted within the same transaction.&lt;/p&gt; &lt;p&gt;Most implementations bulk-load a staging table, and then do an &lt;code&gt;INSERT ... SELECT&lt;/code&gt; statement for the &lt;code&gt;INSERT&lt;/code&gt; or a &lt;code&gt;DELETE WHERE IN (SELECT ...)&lt;/code&gt; for the &lt;code&gt;DELETE&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aabe13333f8&quot;&gt;Virtuoso&lt;/a&gt;, the refreshes are implemented as SQL procedures that read file tables, as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;CREATE PROCEDURE rf1 ( IN dir VARCHAR , IN nth INT , IN no_pk INT := 0 , IN rb INT := 0 , IN qp INT := NULL ) { INSERT INTO orders SELECT * FROM orders_f TABLE OPTION ( FROM sprintf (&amp;#39;%s/orders.tbl.u%d&amp;#39;, dir, nth) ) ; INSERT INTO lineitem SELECT * FROM lineitem_f TABLE OPTION ( FROM sprintf (&amp;#39;%s/lineitem.tbl.u%d&amp;#39;, dir, nth) ) ; COMMIT WORK ; } CREATE PROCEDURE del_batch ( IN d_orderkey INT ) { VECTORED; DELETE FROM lineitem WHERE l_orderkey = d_orderkey ; DELETE FROM orders WHERE o_orderkey = d_orderkey ; } CREATE PROCEDURE rf2 ( IN dir VARCHAR , IN nth INT ) { DECLARE cnt INT ; cnt := ( SELECT COUNT (del_batch (d_orderkey) ) FROM delete_f TABLE OPTION ( FROM sprintf ( &amp;#39;%s/delete.%d&amp;#39;, dir, nth ) ) ) ; COMMIT WORK ; RETURN cnt ; }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Things can hardly be simpler. The delete uses a vectored stored procedure to delete a batch of rows in one statement. The parallelization is done automatically, dividing the file table being read into equal size chunks.&lt;/p&gt; &lt;p&gt;The performance is as follows. These refreshes are run on the database right after the bulk load.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;-- Line 33: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 1) Done. -- 3909 msec. -- Line 34: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 1) Done. -- 863 msec. -- Line 36: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 2) Done. -- 2269 msec. -- Line 37: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 2) Done. -- 871 msec. -- Line 40: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 3) Done. -- 2315 msec. -- Line 41: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 3) Done. -- 906 msec. -- Line 43: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 4) Done. -- 2337 msec. -- Line 44: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 4) Done. -- 913 msec. -- Line 46: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 5) Done. -- 2429 msec. -- Line 47: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 5) Done. -- 1970 msec. -- Line 49: rf1 (&amp;#39;/1s1/tpch100src&amp;#39;, 6) Done. -- 2467 msec. -- Line 50: rf2 (&amp;#39;/1s1/tpch100src&amp;#39;, 6) Done. -- 888 msec.&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The performance is very competitive. Some improvement remains possible but load and refresh are already strong.&lt;/p&gt; &lt;p&gt;In future installments we will look at some queries and explain how to interpret query plans and profiles.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x1d1b2148&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aabeb0a0178&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac0adf7ba8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x1db753e8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0xb553bc8&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x8fa5c08&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2dea7aa8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x22ec08b8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aabc519d998&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1f18a6e8&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac1c239438&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac66b1b9e8&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aac3485abf8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x2aabda0958f8&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0xa470658&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x1601c018&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac64d7e928&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aabd1c61bb8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:51.714822-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 3 of n) -- Benchmark Configuration Settings</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-13#1742</atom:id>
  <atom:published>2013-11-13T23:51:17Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this section, we cover the system configuration for running an analytics workload. If you are running a Virtuoso database with even moderate data size, or are interested in reproducing the results presented here, the below will be relevant. If you are interested in the science of query, you can skip to the next installment.&lt;/p&gt; &lt;p&gt;The relevant sections of the &lt;code&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/InHocSignoVincesSuppDocs/virtuoso.ini&quot; id=&quot;link-id0x2aabcfc16b98&quot;&gt;virtuoso.ini&lt;/a&gt;&lt;/code&gt; file are below, with commentary inline. The actual ini file has many more settings but these do not influence the benchmark.&lt;/p&gt; &lt;p&gt;The test file system layout has two SSD file systems, mounted on &lt;code&gt;/1s1&lt;/code&gt; and &lt;code&gt;/1s2&lt;/code&gt;. The database is striped across the two file systems.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Database] DatabaseFile = virtuoso.db TransactionFile = /1s2/dbs/virtuoso.trx Striping = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This sets the log to be on the second SSD, and the database to be striped; the files are declared in the &lt;code&gt;[Striping]&lt;/code&gt; section further below.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[TempDatabase] DatabaseFile = virtuoso.tdb TransactionFile = virtuoso.ttr [Parameters] ServerPort = 1209 ServerThreads = 100 CheckpointInterval = 0 NumberOfBuffers = 8000000 MaxDirtyBuffers = 1000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The thread count is set to 100. This is not significant, since the test will only have a few concurrent connections, but this should be at least as high as the number of concurrent user connections expected.&lt;/p&gt; &lt;p&gt;The 100 GB TPC-H working set is about 38 GB for the queries. The full database is about 80 GB. Eight million buffers at 8 KB each means that up to 64 GB of database pages will be resident in memory. This should be set higher than the expected working set if possible, but the database process size should also not exceed 80% of physical memory.&lt;/p&gt; &lt;p&gt;The max dirty buffers limit is set to a small fraction of the total buffers for faster bulk load. The bulk load is limited by writing to secondary storage, so we want the writing to start early, and continue through the bulk load. Otherwise the checkpoint at the end of the bulk load would be oversized, because of high numbers of un-flushed buffers.&lt;/p&gt; &lt;p&gt;The checkpoint interval is set to 0, meaning no automatic checkpoints. There will be one at the end of the bulk load, as required by the rules, but the rules do not require checkpoints for the refresh functions.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;ColumnStore = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This sets all tables to be created column-wise. No special DDL directives are needed for column store operation.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;MaxCheckpointRemap = 2500000 DefaultIsolation = 2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The default isolation is set to &lt;code&gt;READ COMMITTED&lt;/code&gt;. Running large queries with locking on reads would have a very high overhead.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;DirsAllowed = / TransactionAfterImageLimit = 1500000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is set to an arbitrarily high number. The measure is the count of bytes to be written to log at commit (1.5 GB, here). If the amount of data to be logged exceeds this, the transaction aborts. The RF1 transaction at 100 GB scale will log about 100 MB.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;FDsPerFile = 4 MaxMemPoolSize = 40000000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the maximum number of bytes of transient memory to be used for query optimization (40 MB, here). The number is adequate for TPC-H, since the queries only have a few joins each. For RDF workloads, the number should be higher, since there are more joins.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;AdjustVectorSize = 0&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The workload will run at the default vector size. Index operations can be accelerated by switching to a larger vector size, trading memory for locality. But since this workload is mostly by hash join, there is no benefit in changing this.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;ThreadsPerQuery = 24&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Each query is divided into up to 24 parallel fragments. 24 is the number of threads on the test system.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;AsyncQueueMaxThreads = 48&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Queries are run by a pool of 48 worker threads. Each session has one thread of its own. If a query parallelizes, the first fragment runs on the session&amp;#39;s thread and the remaining fragments run on a thread from this pool. Thus the core threads are oversubscribed by a factor of slightly over 2 in the throughput run: 6 sessions plus 48 threads makes up to 53 runnable threads at any point in the throughput test.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;MaxQueryMem = 30G&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is a cap on query execution memory. If memory would exceed this, optimizations that would increase space consumption are not used. The memory may still transiently exceed this limit.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;HashJoinSpace = 30G&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is the maximum memory to be used for hash tables during hash joins. If a hash join causes this amount to be exceeded, it will be run in multiple passes, so as to have a cap on the hash table size. Not all hash joins may be partitioned, and the test must not do multi-pass hash joins, hence a high number here. We will see actual space consumption figures when looking at the queries. This parameter may be increased for analytics performance, especially in multiuser situations.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Client] SQL_QUERY_TIMEOUT = 0 SQL_TXN_TIMEOUT = 0 SQL_ROWSET_SIZE = 10 SQL_PREFETCH_BYTES = 120000&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;120 KB of results is to be sent to clients in a single window. This is enough for the relatively short result sets in this benchmark.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Striping] Segment1 = 1024, /1s1/dbs/tpch100cp-1.db = q1, /1s2/dbs/tpch100cp-2.db = q2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The database is set to stripe in two files, each on a different SSD. Each file has its own background I/O thread; this is the meaning of the &lt;code&gt;= q1&lt;/code&gt; and &lt;code&gt;= q2&lt;/code&gt; declaration. All files on each separately-seekable device should share the same &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;[Flags] enable_mt_txn = 1 enable_mt_transact = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first setting enables multithreading DML statement execution. The second setting enables multithreading of &lt;code&gt;COMMIT&lt;/code&gt; or &lt;code&gt;ROLLBACK&lt;/code&gt; operations. This is important for the refresh function performance. A column store &lt;code&gt;COMMIT&lt;/code&gt; of a &lt;code&gt;DELETE&lt;/code&gt; will especially benefit from multithreading, since this may involve re-compression.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;hash_join_enable = 2&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Will use hash joins for SQL and SPARQL (even though SPARQL is not used in this experiment).&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbf_explain_level = 0&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Specifies less verbose query plan formatting for logging of query execution.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;dbf_log_fsync = 1&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Specify that &lt;code&gt;fsync&lt;/code&gt; is to be called after each write to the transaction log. The ACID qualification procedure specifies that the system is to be powered down in mid-run, hence this setting is required by the test.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x2aac10367338&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac10369458&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac09638778&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac1036f9d8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2ad0fa98&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x1e578158&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x2b9af358&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x26189d58&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aab6ccef668&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1e991478&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac1c94cf78&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac7a629e08&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aabd42e3db8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x199a6778&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabe9f5fb48&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x1612e3a8&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x1f93c7c8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aab521b3f48&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:07:56.580435-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 2 of n) -- TPC-H Schema Choices</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-13#1741</atom:id>
  <atom:published>2013-11-13T23:01:21Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aac182bc168&quot;&gt;TPC-H&lt;/a&gt; gives a strict definition of the table structure and content, but leaves implementations some latitude in defining indices and data layout. A TPC-H run consists of a power test with a single user submitting queries in sequence, and of a throughput test where many concurrent users are simulated. An implementation may choose how many concurrent users are simulated, as long as this is more than a set minimum.&lt;/p&gt; &lt;p&gt;Tables do not always have to be stored in the order of their primary key. A clustered index is a structure where the index tree leaves contain the whole row of data. TPC-H explicitly forbids materializing multiple copies of a table in different sort orders for speeding up different queries. That said, an implementation may pick one primary order for each table which does not have to be the primary key order.&lt;/p&gt; &lt;p&gt;The present champion in core-for-core speed, Actian &lt;a href=&quot;http://dbpedia.org/resource/Vectorwise&quot; id=&quot;link-id0x2aabd7066a58&quot;&gt;VectorWise&lt;/a&gt;, organizes the main tables, &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, in date order. The &lt;a href=&quot;http://dbpedia.org/page/Microsoft_SQL_Server&quot; id=&quot;link-id0x2aabd5c9aaa8&quot;&gt;Microsoft SQL Server&lt;/a&gt; implementations use clustered indices on &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt;, where the table is stored in non-primary key order; in this case, the major ordering columns are &lt;code&gt;l_shipdate&lt;/code&gt; and &lt;code&gt;o_orderdate&lt;/code&gt;, respectively.&lt;/p&gt; &lt;p&gt;These index schemes create locality on the date dimension.&lt;/p&gt; &lt;p&gt;In the present discussion, we take a different tack: We keep &lt;code&gt;lineitem&lt;/code&gt; and &lt;code&gt;orders&lt;/code&gt; in primary key order, and sacrifice locality on date in favor of a fast merge join between these two tables, and for faster load and data maintenance.&lt;/p&gt; &lt;p&gt;TPC-H rules allow indices on foreign keys and dates. In this implementation, we only define one on &lt;code&gt;o_custkey&lt;/code&gt;; &lt;code&gt;lineitem&lt;/code&gt; is only indexed on its primary key. These are the two largest tables, and the only ones that change during the benchmark. Whether indices are defined on other tables makes little or no difference, since joins between these tend to perform better by hash than by index in any case.&lt;/p&gt; &lt;h2&gt;Scale and Test System&lt;/h2&gt; &lt;p&gt;All the runs are done at 100 GB scale. The test machine is a dual E5-2630 (2x6 cores, 2x12 threads, 2.3 GHz) with 192 GB of 1066 MHz RAM. Two Crucial 512 GB SSDs are used both for database and staging of the files. The disks are independent file systems with no RAID. (Note that RAID would be required for an official result.) The operating system is CentOS 6.2.&lt;/p&gt; &lt;p&gt;For cluster results, two machines with the above spec are used with a QDR InfiniBand interconnect.&lt;/p&gt; &lt;p&gt;The Virtuoso used is a current internal development version, to be available at the end of this series or by special request. This is neither the publicly available open nor closed source version.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1739&quot; id=&quot;link-id0x233f6158&quot;&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;/a&gt; &lt;/li&gt; &lt;li&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x22454708&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2213e628&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x239b07e8&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2f13e298&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x303a238&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x27399d58&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x25c910c8&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aabb6e74ab8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac1dd2fa98&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac28f74518&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac79cfa248&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aabbad88b38&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x17368908&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0xfc6bd48&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabe89eea68&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac37bd05b8&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aaadb262348&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:08:01.180051-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Hoc Signo Vinces (part 1 of n) -- Virtuoso meets TPC-H</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-11-13#1739</atom:id>
  <atom:published>2013-11-13T22:56:22Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x14305a58&quot;&gt;TPC-H&lt;/a&gt; is &lt;i&gt;the&lt;/i&gt; data warehousing benchmark to date. I will here cover the &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id0x2aac18ee59d8&quot;&gt;Virtuoso&lt;/a&gt; implementation of this in detail. The primary audience is database experts. This will also be very educational for DBAs and advanced application developers: Life becomes much more predictable if one knows a good query plan from a bad one. Alongside a commentary on database science, you will also find here a guided tour of Virtuoso performance tuning and diagnostics. To follow this, it is useful to have the official TPC-H spec at hand (download links are on the far-right of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x1418dc38&quot;&gt;this page&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;By now, TPC-H is an old game and it is safe to say that pretty much any player in the analytics database domain has had a go at it, even though some have never published a result. So, the bar for new entrants is very high.&lt;/p&gt; &lt;p&gt;Especially, &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x8f6ba08&quot;&gt;VectorWise&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/EXASolution&quot; id=&quot;link-id0x2aac18ccdfc8&quot;&gt;EXASolution&lt;/a&gt; have taken performance in this workload close to the limits of the achievable. A challenger has to do everything right in order to win. One wrong move will lose the whole race.&lt;/p&gt; &lt;p&gt;This presentation has many objectives:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;To illustrate how Virtuoso is an excellent SQL analytics engine&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;To provide an in-depth discussion on the science of query optimization and execution&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;To outline avenues of future development, specifically as concerns analytics with schema-less data&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In the &lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/&quot; id=&quot;link-id0x2aac182d14d8&quot;&gt;TPC TC workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb.org/2013&quot; id=&quot;link-id0x14ae6bb8&quot;&gt;VLDB 2013&lt;/a&gt; there was a paper &lt;i&gt;&lt;a href=&quot;http://www.tpc.org/tpctc/tpctc2013/slides_and_papers/005.pdf&quot; id=&quot;link-id0xa9316e8&quot;&gt;TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark&lt;/a&gt;&lt;/i&gt;, by &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x127527a8&quot;&gt;Peter Boncz&lt;/a&gt;, &lt;a href=&quot;http://www-db.in.tum.de/~neumann/&quot; id=&quot;link-id0x14a12d18&quot;&gt;Thomas Neumann&lt;/a&gt;, and &lt;a href=&quot;http://www.linkedin.com/in/orrierling&quot; id=&quot;link-id0x14a7a308&quot;&gt;myself&lt;/a&gt; concerning what the database world has learned from this very tough exercise. Peter Boncz is the original architect of Actian VectorWise, the current champion in TPC-H performance per core. Thomas Neumann is the author of &lt;a href=&quot;http://www-db.in.tum.de/research/projects/HyPer/&quot; id=&quot;link-id0x14a99168&quot;&gt;HyPer&lt;/a&gt;, most likely the best entry in DBMS research for simultaneously supporting analytics and OLTP. Peter and Thomas are among the most renowned in database science. I am the Program Manager of the Virtuoso column store, overseeing core engineering tasks such as SQL query optimization, execution, storage, and scale out. &lt;/p&gt; &lt;p&gt;In this series I will go over the Virtuoso implementation of TPC-H and will elaborate further on the points discussed in the paper. The subject is broader than any single paper can cover in detail, although there are plenty of papers only addressing one or two of the 22 queries.&lt;/p&gt; &lt;p&gt;Virtuoso is mostly known for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x955fb38&quot;&gt;RDF&lt;/a&gt;. Here we will cover the whole benchmark in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xaca8ae8&quot;&gt;SQL&lt;/a&gt; first, with both single-server and cluster implementations, and discussion of where these differ. A state-of-the-art SQL implementation is the necessary basis for discussing how the same can be accomplished in RDF. Comparing good RDF to bad SQL is not interesting.&lt;/p&gt; &lt;p&gt;The earlier articles on the Star Schema Benchmark (SSB) (&lt;a href=&quot;http://www.cs.umb.edu/~poneil/StarSchemaB.PDF&quot; id=&quot;link-id0x14aef2a8&quot;&gt;PDF&lt;/a&gt;) -- &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x13a8f708&quot;&gt;Annuit Coeptis, or, Star Schema and The Cost of Freedom&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1733&quot; id=&quot;link-id0x14aa6b58&quot;&gt;E Pluribus Unum, or, Star Schema Meets Cluster&lt;/a&gt;&lt;/i&gt; -- demonstrated how the most basic analytical database operations perform in Virtuoso. All the techniques used there are also directly applicable to TPC-H, but the latter adds a good 20 more tricks one needs to see through.&lt;/p&gt; &lt;p&gt;Future installments will discuss TPC-H query by query. We conclude with a full run of &lt;a href=&quot;http://sourceforge.net/apps/mediawiki/osdldbt/&quot; id=&quot;link-id0x14abca48&quot;&gt;OSDL-DBT-3&lt;/a&gt;. DBT-3™ is an unofficial TPC-H without auditing but with the same workload.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;In Hoc Signo Vinces&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; In Hoc Signo Vinces (part 1): Virtuoso meets TPC-H&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1741&quot; id=&quot;link-id0x2aac0b114898&quot;&gt; In Hoc Signo Vinces (part 2): TPC-H Schema Choices&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1742&quot; id=&quot;link-id0x2aac06d43db8&quot;&gt; In Hoc Signo Vinces (part 3): Benchmark Configuration Settings&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1744&quot; id=&quot;link-id0x2aac0bf375e8&quot;&gt; In Hoc Signo Vinces (part 4): Bulk Load and Refresh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1747&quot; id=&quot;link-id0x2aac06d24268&quot;&gt; In Hoc Signo Vinces (part 5): The Return of SQL Federation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1753&quot; id=&quot;link-id0x2e2d6458&quot;&gt; In Hoc Signo Vinces (part 6): TPC-H Q1 and Q3: An Introduction to Query Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1755&quot; id=&quot;link-id0x16bbc8a8&quot;&gt; In Hoc Signo Vinces (part 7): TPC-H Q13: The Good and the Bad Plans&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1756&quot; id=&quot;link-id0x22fac5a8&quot;&gt; In Hoc Signo Vinces (part 8): TPC-H: INs, Expressions, ORs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1779&quot; id=&quot;link-id0x2aac4b7c7d98&quot;&gt; In Hoc Signo Vinces (part 9): TPC-H: TPC-H Q18, Ordered Aggregation, and Top K &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1789&quot; id=&quot;link-id0x2aabb40541a8&quot;&gt; In Hoc Signo Vinces (part 10): TPC-H: TPC-H Q9, Q17, Q20 - Predicate Games&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1793&quot; id=&quot;link-id0x2aac37edea48&quot;&gt; In Hoc Signo Vinces (part 11): TPC-H Q2, Q10 - Late Projection &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1796&quot; id=&quot;link-id0x2aac2af3f398&quot;&gt; In Hoc Signo Vinces (part 12): TPC-H: Result Preview &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1798&quot; id=&quot;link-id0x2aac30f6b918&quot;&gt; In Hoc Signo Vinces (part 13): Virtuoso TPC-H Kit Now on V7 Fast Track &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1800&quot; id=&quot;link-id0x2aabd55e11d8&quot;&gt; In Hoc Signo Vinces (part 14): Virtuoso TPC-H Implementation Analysis &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1802&quot; id=&quot;link-id0x2aac344da368&quot;&gt; In Hoc Signo Vinces (part 15): TPC-H and the Science of Hash &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1816&quot; id=&quot;link-id0x18f4fa58&quot;&gt; In Hoc Signo Vinces (part 16): Introduction to Scale-Out &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1818&quot; id=&quot;link-id0x2aabeb095408&quot;&gt; In Hoc Signo Vinces (part 17): 100G and 300G Runs on Dual Xeon E5 2650v2 &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1819&quot; id=&quot;link-id0x2aabebd63928&quot;&gt; In Hoc Signo Vinces (part 18): Cluster Dynamics &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1822&quot; id=&quot;link-id0x2aac342c0d98&quot;&gt; In Hoc Signo Vinces (part 19): Scalability, 1000G, and 3000G &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1824&quot; id=&quot;link-id0x2aab517a6398&quot;&gt; In Hoc Signo Vinces (part 20): 100G and 1000G With Cluster; When is Cluster Worthwhile; Effects of I/O &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1845&quot; id=&quot;link-id0x2aaad84c2ae8&quot;&gt; In Hoc Signo Vinces (part 21): Running TPC-H on Virtuoso Cluster on Amazon EC2 &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-06-10T12:08:06.398597-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>E Pluribus Unum, or, Star Schema Meets Cluster</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-07-01#1735</atom:id>
  <atom:published>2013-07-01T15:38:35Z</atom:published>
  <atom:content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aabd8ca4e38&quot;&gt;the &lt;i&gt;Cost of Freedom&lt;/i&gt; article&lt;/a&gt;, we looked at the implications of doing standard analytics without a schema. Here we will look at scalability.&lt;/p&gt; &lt;p&gt;One could claim that a 30GB scale is trivial. Here, we multiply the scale by 10 and move from one to two servers, going from shared-memory multicore to distributed-memory scale-out with partitioned data, i.e. each machine holds a distinct fragment of the database.&lt;/p&gt; &lt;p&gt;Again, we run the same workload in SQL and in SPARQL. The RDB schema is the same as before, so for SQL tables only primary keys are declared, there are no indices or special declarations about data placement, and the table partitioning is on the first part of the primary key. The RDF data for the SPARQL runs is quads with the default index scheme, partitioned on subject or object, whichever is first in key order. The test system is two machines, each with dual Xeon E5-2630 and 192GB RAM. The queries are from warm cache.&lt;/p&gt; &lt;p&gt;There are 1.79 billion line-order rows, giving a total of 32.5 billion RDF triples.&lt;/p&gt; &lt;table id=&quot;ResultsTable&quot; title=&quot;Comparative Results, Virtuoso SQL vs Virtuoso SPARQL&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot; cellpadding=&quot;2px&quot; width=&quot;350px&quot;&gt; &lt;caption&gt;Comparative Results, 300GB, in seconds&lt;br /&gt;Virtuoso Cluster, SQL &lt;i&gt;Vs.&lt;/i&gt; SPARQL&lt;/caption&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Query&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt;SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt;SPARQL&lt;/th&gt; &lt;th&gt;SPARQL-to-SQL &lt;br /&gt;ratio&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.285&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;7.767&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.4x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.530&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.535&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.3x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.237&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.457&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.2x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;3.459&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;6.978&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;3.065&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;8.710&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.8x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.901&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;8.454&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.9x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;5.733&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;15.939&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.8x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.267&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;6.759&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q9&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.773&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.217&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.4x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q10&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.440&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.342&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q11&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;5.031&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;12.608&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.5x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q12&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4.464&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;15.497&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.5x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q13&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.807&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.467&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.6x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Total&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;37.992&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100.730&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.7x&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The SQL run takes 38s, and the SPARQL run takes 101s. Comparing to the single server, we see a little better than linear scaling, i.e., double the gear is a little over 2x faster. In the present case, 10x the data takes a little under 5x the time.&lt;/p&gt; &lt;p&gt;This is due to slightly better load balancing. The single server splits the workload into chunks based on a run-time approximation; the cluster stores the partitions separately and uses this to determine the parallelism. In the latter case, the chunks are of more equal size.&lt;/p&gt; &lt;p&gt;The SPARQL penalty is here 2.7x, essentially the same as in the single server case.&lt;/p&gt; &lt;p&gt;It is no secret that a star schema is &amp;quot;embarrassingly parallel.&amp;quot; In other words, when there is one big table (fact table) that references many smaller tables (dimension tables), and query conditions are expressed on properties of the dimension tables, the correct query plan nearly always consists of putting the interesting foreign key values into hash tables, and then scanning the fact table from beginning to end and picking the rows where the values in the foreign key columns are found in the hash tables. This is called a &lt;i&gt;selective hash join&lt;/i&gt; or &lt;i&gt;invisible hash join&lt;/i&gt; if the hash join operation is merged in the table scan itself. &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/&quot; id=&quot;link-id0x2aabcc04ee68&quot;&gt;Daniel Abadi&lt;/a&gt;’s &lt;a href=&quot;http://dspace.mit.edu/handle/1721.1/43043&quot; id=&quot;link-id0xf3953e8&quot;&gt;well known thesis&lt;/a&gt; explains this matter. In the case of a cluster, supposing all tables are partitioned, identical hash tables are made on all participating servers, and after this each server gets to scan its fraction of the fact table independently of any other. This nearly always works because the dimension tables are typically orders of magnitude smaller than the fact table.&lt;/p&gt; &lt;p&gt;The complexity of the queries is close to linear to the data size. The factor that makes this deviate from linear is the fact that as hash tables get larger, they will miss the CPU cache more frequently; hence they get slower to probe. We here assume that a bigger fact table means bigger dimension tables. This is often the case, i.e., the more sales records there are, the larger the number of distinct customers or distinct items in the catalogue is likely to be. This is not always so, though, as the number of days in the history does not scale in the same way.&lt;/p&gt; &lt;p&gt;Any decent analytics oriented RDBMS with scale out will give near-linear performance with a star schema, at least up to the point where the hash tables can no longer be replicated on all servers, or the hash join must do multiple passes over the fact table.&lt;/p&gt; &lt;p&gt;Doing the same with schema-less data is harder, even though the principle is exactly the same. The difficulty lies again in detecting that a scan filtered by selective hash joins will give the most locality in access pattern, visiting each cache-line-worth of data once at most and doing so almost always in sequential order. This triggers memory prefetching on any modern CPU and significantly reduces memory latency.&lt;/p&gt; &lt;p&gt;As the scale grows there are some details of query plan that become significant. For example, in Q7 of SSB, there is a report on sales between Asian customers and Asian suppliers, country by country. In SQL:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT d_year, c_nation, s_nation, SUM (...), ... FROM lineorder, customer, supplier, dwdate WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND c_region = &amp;#39;ASIA&amp;#39; AND s_region = &amp;#39;ASIA&amp;#39; ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;In this case, one builds a hash table from &lt;code&gt;c_custkey&lt;/code&gt; to &lt;code&gt;c_nation&lt;/code&gt; and from &lt;code&gt;s_suppkey&lt;/code&gt; to &lt;code&gt;s_nation&lt;/code&gt;, including only suppliers and customers where the &lt;code&gt;region = &amp;#39;ASIA&amp;#39;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;In SPARQL, the situation is the same, except that we say:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { li rdfh:lo_custkey ?lo_custkey ; rdfh:lo_suppkey ?lo_suppkey . ?lo_custkey rdfh:c_nation ?c_nation ; rdfh:c_region &amp;quot;ASIA&amp;quot; . ?lo_suppkey rdfh:s_nation ?s_nation ; rdfh:s_region &amp;quot;ASIA&amp;quot; . }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is an equivalent expression, or near enough. We note that now it makes sense to build the hash table from the join of two patterns, i.e., the &lt;code&gt;rdfh:s_nation&lt;/code&gt; and &lt;code&gt;rdfh:s_nregion&lt;/code&gt;, which together are the same as the &lt;code&gt;supplier&lt;/code&gt; table in the SQL variant. But now, a supplier might have more than one &lt;code&gt;rdfh:s_nation&lt;/code&gt; triple; hence the hash table is no longer known to be &lt;i&gt;a priori&lt;/i&gt; unique -- i.e., its key is the URI of a supplier, but it is only known that suppliers usually have one nation; it is not known that they never have two.&lt;/p&gt; &lt;p&gt;However, if we build the hash table from only one pattern, i.e., &lt;code&gt;{ ?s_suppkey rdfh:s_region &amp;quot;ASIA&amp;quot; }&lt;/code&gt;, and the graph is specified, then we know that the subject will be unique, as stating that X has region &amp;quot;ASIA&amp;quot; twice has no effect beyond stating it once. However, if we do this, then there needs to be another hash table built for mapping the supplier to its &lt;code&gt;s_nation&lt;/code&gt;. There is no way to know that this is unique. Making two hash tables instead of one has been seen to slow down the query by a factor of two at scale 300GB whereas the effect is hardly noticeable at 30GB.&lt;/p&gt; &lt;p&gt;Thus recognizing these special cases with SPARQL is crucial if one is to come anywhere near the performance the SQL world attains just by following the schema. What used to be basic becomes trickier. It is true that the same or similar tricks are also needed in pure SQL workloads, but then not within the SSBM queries. What is a star in SQL is quite often a snowflake in SPARQL. A star schema has a single table-per-dimension, e.g., &lt;code&gt;customer&lt;/code&gt;, whereas a snowflake has more structure, e.g., &lt;code&gt;customer&lt;/code&gt;, the customer’s &lt;code&gt;country&lt;/code&gt; and the country’s &lt;code&gt;region&lt;/code&gt;, all in different tables.&lt;/p&gt; &lt;p&gt;The message to the SPARQL public is that now, for the first time, if there is natural parallelism and locality in the data, you know that the database will exploit this correctly and derive the same benefits from this as any SQL-only system would. Of course, there have been and are parallel RDF databases, including previous versions of Virtuoso, which do distributed index-based operations with various levels of concurrency and distributed coordination, but experience shows that these query strategies are not very good for queries that touch a large fraction (over 3%) of the database.&lt;/p&gt; &lt;p&gt;For basic data warehouse workloads, whether in SQL or SPARQL, Virtuoso offers linear scaling where clusters pay off from the start. While a handful of relational column stores have offered such capabilities for SQL for some time, now the same is also available for schema-less data: Entirely declarative querying; no explicit data partitioning; no schema restrictions; no map-reduce programs or the like.&lt;/p&gt; &lt;p&gt;The cluster evolution path is clear: as with single server, we strive for more speed on a broader range of operations. The star and snowflake functionality discussed here is the core piece for any analytics, so if this is not right, the rest is also compromised. The other side of cluster is operational, i.e., flexibility of deployment -- for example, flexibly resizing cloud-based databases.&lt;/p&gt; &lt;p&gt;This is the qualitative jump. Incremental performance gains will follow for both SQL and SPARQL.&lt;/p&gt; &lt;p&gt;Stars and snowflakes are common but the world does not end with these. As we will see in subsequent articles, there is a whole world of graphs, e.g., social media analytics, as well as more complex relational schemas.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-21T14:19:48.733946-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Annuit Coeptis, or, Star Schema and The Cost of Freedom</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-07-01#1734</atom:id>
  <atom:published>2013-07-01T15:38:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;Around 2009, we set out to find out whether one can do analytics without a schema. The rationale is of course that data without query is not useful and that large data often has variation of schema, whether due to multiple sources, multiple versions of schema at different points in history, changes in applications and business model, or any number of other factors.&lt;/p&gt; &lt;p&gt;In order to meaningfully answer this question, one has to have a top notch analytics engine. Comparing &amp;quot;schema&amp;quot; and &amp;quot;no schema&amp;quot; on anything except the state-of-the-art in analytics database is not interesting. So we made Virtuoso 7 and its Column Store Module, and implemented the features common in dedicated analytics databases, plus suitable SPARQL adaptations of same.&lt;/p&gt; &lt;p&gt;The present beach head is the Star Schema Benchmark (SSB) (&lt;a href=&quot;http://www.openlinksw.com/www.cs.umb.edu/~poneil/StarSchemaB.PDF&quot; id=&quot;link-id0x2aabcd1f4f08&quot;&gt;PDF&lt;/a&gt;), which represents the core of most data warehouse workloads (i.e., big scans, selective hash joins, and aggregation). These same patterns are also found at the core of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabce8838c8&quot;&gt;TPC-H&lt;/a&gt; and the new &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aabce202ca8&quot;&gt;TPC-DS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;At present, the cost of having no schema is a 2.7x increase in run time, as evidenced by SSB. Virtuoso SQL does the run in 8.4s, &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0xe89eba8&quot;&gt;MonetDB&lt;/a&gt; SQL in 17s, Virtuoso SPARQL in 22.5s. Virtuoso outperforms column store pioneer MonetDB by a fair margin. MonetDB is probably the fastest open source column store, although there exists faster ones in closed source.&lt;/p&gt; &lt;p&gt;SPARQL in Virtuoso comes close behind SQL in MonetDB, only a factor of 1.3. &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aabd81ee648&quot;&gt;MySQL&lt;/a&gt; with &lt;a href=&quot;http://dbpedia.org/resource/InnoDB&quot; id=&quot;link-id0x161e22f8&quot;&gt;InnoDB&lt;/a&gt;, which is not an analytical database, does the run in 2391s.&lt;/p&gt; &lt;p&gt;Initially, we were aiming at a slowdown factor of 2 when comparing SPARQL to SQL on Virtuoso.  Of course, this is only worth something if the SQL performance is generally on a level with relational column stores.  These goals have now been substantially attained.&lt;/p&gt; &lt;p&gt;This is a major beachhead for RDF as a branch of graph database technology, and for Virtuoso as a product.  For the first time one can run a real database workload based on SPARQL at a speed that is comparable with SQL, and without any compromises on the schema flexibility that is the principal reason to use an RDF-based graph model in the first place.  No SPARQL-to-SQL mapping, property tables, or such.&lt;/p&gt; &lt;h2&gt;Execution and Query Optimization&lt;/h2&gt; &lt;p&gt;The technical accomplishment is divided in two parts. For query execution, there is a compressed column store with vectored execution and a good implementation of query parallelization, hash join, and aggregation. With a schema, there is a multicolumn table. and with RDF, there is a quads table. Both are compressed based on the characteristics of actual data. The SQL execution consists of a scan of the fact table, taking a few columns of this and applying one or more hash joins to column values, where the hash joins are usually selective. This is the same in SPARQL, except that instead of getting another column of the table there is a self-join. The self-join has a fairly dense access pattern and is in the same order as the previous one, thus it is not very expensive. This constitutes the difference.&lt;/p&gt; &lt;p&gt;While in SQL, the plan is obvious, especially since there are no indices on the fact table; however, getting the right plan with SPARQL is quite difficult. There are up to 12 triple-patterns in a query, leading to 12! (twelve-factorial, i.e., 12*11*...*2*1 = 479,001,600) possible join orders, multiplied by index and hash based variants of each join, where the hash-based variants further multiply the space by considering different combinations of patterns on the build side. Experiments confirm that the same plan is best for both SQL and SPARQL but getting this as the outcome of query optimization is far from self-evident. This requires a very precise cost model that correctly takes ordering of intermediate results and density of hits in index lookups into account, as well as the variability in hash join performance when the hash table size varies, i.e., CPU cache effects. All this modeling is of course also valid for SQL, but is not really required there because a much coarser model will also deliver the right plan, as there is much less choice. Further, making the right plan must be fast. Now, the longest query optimization time is 240ms for an execution time of 3.7s (Q12 at 30G in SPARQL). This is pretty good.&lt;/p&gt; &lt;p&gt;Using hash join in SPARQL has anyway been problematical because knowing when to use one requires high confidence in the cost model. If one ends up building a large hash table that is used only a few times, there is a steep penalty. Index-based plans, especially since RDF data tends to be indexed in both S-to-O and O-to-S directions, do not have bad worst-cases, but then a good hash-based plan is easily 5x faster than an index-based one.&lt;/p&gt; &lt;p&gt;So, for SPARQL the results are game changing. Finally up-to-date database. For SQL, Virtuoso 7 performs like an analytics column store is supposed to, but then that is what it is. For the SQL space, it is interesting that this is also open source, so Virtuoso may well be the best performing open source SQL analytics engine out there. We will later see how the comparison with other SQL column stores goes.&lt;/p&gt; &lt;p&gt;In summary, the central core of the Virtuoso 7 agenda has been accomplished. Incremental progress will continue around addressing more complex benchmarks like TPC-H and TPC-DS, both in SQL and in SPARQL translation, plus full-scale &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabbaa86d48&quot;&gt;Open Streetmap&lt;/a&gt; in both SQL and SPARQL, and of course the benchmarks being developed in &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x2aabdcef94e8&quot;&gt;LDBC&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Experiments&lt;/h2&gt; &lt;p&gt;The scale of the dataset is 30GB, with 187M line-order rows. This comes to 3.2Gt (3.2 billion triples). The runs are from warm cache on all systems. The test system for all runs is a dual Xeon E5-2630 with 192GB RAM.&lt;/p&gt; &lt;p&gt;The scripts for duplicating the experiment on the Virtuoso 7 Open Source cut will be published later on this blog, when the open source cut incorporates the query optimization improvements discussed herein.&lt;/p&gt; &lt;p&gt;In the table below, the times are elapsed real times in milliseconds, with one query at a time, all from warm cache (i.e. the second run of the query set is reported and we make sure that all databases are running from memory). The MySQL is configured with InnoDB and 40GB of buffer pool, which should be enough for the 30GB dataset. The SQL versions do not declare any explicit indices, but do declare primary keys. The SPARQL version is with the default Virtuoso index scheme, but the query plans end up scanning each predicate in order of S, except for the build phases of hash-joins where an index from O-to-S is occasionally used.&lt;/p&gt; &lt;table id=&quot;SSBResultsTable&quot; title=&quot;Comparative Results&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot; cellpadding=&quot;2px&quot; width=&quot;450px&quot;&gt; &lt;caption&gt;Comparative Results, 30GB dataset&lt;br /&gt;Virtuoso SQL &lt;i&gt;Vs.&lt;/i&gt; Virtuoso SPARQL &lt;i&gt;Vs.&lt;/i&gt; MonetDB SQL &lt;i&gt;Vs.&lt;/i&gt; MySQL SQL&lt;/caption&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Query&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt; SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt; SPARQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;MonetDB &lt;br /&gt; SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;MySQL &lt;br /&gt; SQL&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q1&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;413&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;1101&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1659&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;82477&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q2&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;282&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;416&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;500&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;74436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q3&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;253&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;295&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;494&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;75411&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q4&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;828&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2484&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;958&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;226604&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q5&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;837&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1915&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;648&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;222782&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q6&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;419&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1813&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;541&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;219656&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q7&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;1062&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2330&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;5658&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;237730&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q8&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;617&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2182&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;521&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;194918&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q9&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;547&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1290&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;381&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;186112&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q10&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;499&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;639&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;370&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;186123&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q11&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;1132&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2142&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2760&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;241045&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q12&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;863&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3770&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2127&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;241439&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q13&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;653&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1612&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;1005&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;202817&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;One could argue that comparing against MySQL is unjustified, as MySQL is certainly not optimized for this workload, e.g., it does not do hash joins and does not parallelize queries. On the other hand, the previous work on SSBM for SPARQL, &lt;i&gt;&lt;a href=&quot;http://eswc-conferences.org/sites/default/files/papers2013/kaempgen.pdf&quot; id=&quot;link-id0x2aabcddc7bd8&quot;&gt;No Size Fits All&lt;/a&gt;&lt;/i&gt; by &lt;a href=&quot;http://www.aifb.kit.edu/web/Benedikt_Kaempgen/en&quot; id=&quot;link-id0x2aabcdee77d8&quot;&gt;Benedikt Kaempgen&lt;/a&gt; and &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x2aabdb8285b8&quot;&gt;Andreas Harth&lt;/a&gt;, published at the &lt;a href=&quot;http://2013.eswc-conferences.org/&quot; id=&quot;link-id0x2aabcc627198&quot;&gt;2013 ESWC&lt;/a&gt;, did make the comparison between MySQL and Virtuoso 6; thus we think it informative to include MySQL. To summarize &lt;i&gt;No Size Fits All,&lt;/i&gt; SPARQL in Virtuoso 6 lost by a factor of 12 against MySQL, but in the present case, Virtuoso 7 SPARQL wins by a factor of 106 against MySQL.&lt;/p&gt; &lt;p&gt;The ESWC paper used a scale of 1G, while the present test uses a scale of 30G. One should remember that the MySQL times are single-threaded, and all other times are multi-threaded. The test system has 12 cores and 24 threads, so running at full platform utilization is at best 16x faster than single threaded. Running SPARQL single-threaded instead of 24 threads-per-query gives a total time of 175s, still over 10x better than MySQL. Compared to the multi-threaded time of 22.5s, the parallelism yields an average acceleration of 7.7x. Running with SPARQL with full threading but no hash-join gives a time of 80s, 3.5x worse than with hash-join. We note that SSB is a very hash-join intensive workload.&lt;/p&gt; &lt;p&gt;MonetDB is the more relevant comparison, as it does use the full CPU, with load peaks up to the theoretical 2400% (12 dual-threaded cores) and is the platform on which a lot of the science of the hash join was refined. MonetDB does relatively best with queries that can start by a very selective join (e.g., Q9) where it outperforms Virtuoso. This is probably due to more even splitting of the work among threads and to not having to deal with data compression. Virtuoso wins the most on queries that select a large fraction of the fact table, where MonetDB is penalized due to its policy of full materialization of intermediate results. Joins without any selection (e.g., adding up the &lt;code&gt;lo_extendedprice&lt;/code&gt;, and grouping by the &lt;code&gt;d_year&lt;/code&gt; of &lt;code&gt;lo_orderdate&lt;/code&gt;) show MonetDB at its worst. Such queries do not occur in SSB though, so SSB is a relatively MonetDB-friendly benchmark.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;The back of the problem is broken. Big query without schema can be done. One could of course see this coming by experimenting with explicit plans. But nobody out there can manually optimize a query plan. Thus the final step consisted of having a good-enough cost model and a smart-enough search order to get the right plan fast. This will be in the next update of Virtuoso Open Source. At that time, we will publish the full queries and configuration files.&lt;/p&gt; &lt;p&gt;This is the breakthrough for RDF analytics. Incremental progress will follow, with more tricks being incorporated, like the ones known to be needed by TPC-H.&lt;/p&gt;</atom:content>
  <atom:updated>2013-07-01T13:55:17.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>E Pluribus Unum, or, Star Schema Meets Cluster</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-07-01#1733</atom:id>
  <atom:published>2013-07-01T15:38:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;In &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/?id=1732&quot; id=&quot;link-id0x2aabd8ca4e38&quot;&gt;the &lt;i&gt;Cost of Freedom&lt;/i&gt; article&lt;/a&gt;, we looked at the implications of doing standard analytics without a schema. Here we will look at scalability.&lt;/p&gt; &lt;p&gt;One could claim that a 30GB scale is trivial. Here, we multiply the scale by 10 and move from one to two servers, going from shared-memory multicore to distributed-memory scale-out with partitioned data, i.e. each machine holds a distinct fragment of the database.&lt;/p&gt; &lt;p&gt;Again, we run the same workload in SQL and in SPARQL. The RDB schema is the same as before, so for SQL tables only primary keys are declared, there are no indices or special declarations about data placement, and the table partitioning is on the first part of the primary key. The RDF data for the SPARQL runs is quads with the default index scheme, partitioned on subject or object, whichever is first in key order. The test system is two machines, each with dual Xeon E5-2630 and 192GB RAM. The queries are from warm cache.&lt;/p&gt; &lt;p&gt;There are 1.79 billion line-order rows, giving a total of 32.5 billion RDF triples.&lt;/p&gt; &lt;table id=&quot;ResultsTable&quot; title=&quot;Comparative Results, Virtuoso SQL vs Virtuoso SPARQL&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot; cellpadding=&quot;2px&quot; width=&quot;350px&quot;&gt; &lt;caption&gt;Comparative Results, 300GB, in seconds&lt;br /&gt;Virtuoso Cluster, SQL &lt;i&gt;Vs.&lt;/i&gt; SPARQL&lt;/caption&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Query&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt;SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt;SPARQL&lt;/th&gt; &lt;th&gt;SPARQL-to-SQL &lt;br /&gt;ratio&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q1&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.285&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;7.767&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.4x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q2&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.530&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.535&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.3x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q3&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.237&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.457&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.2x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q4&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;3.459&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;6.978&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q5&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;3.065&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;8.710&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.8x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q6&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.901&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;8.454&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.9x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q7&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;5.733&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;15.939&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.8x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q8&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.267&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;6.759&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q9&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.773&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.217&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.4x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q10&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;1.440&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.342&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.0x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q11&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;5.031&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;12.608&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.5x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q12&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;4.464&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;15.497&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3.5x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q13&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;2.807&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.467&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1.6x&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Total&lt;/th&gt; &lt;td align=&quot;center&quot;&gt;37.992&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;100.730&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2.7x&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The SQL run takes 38s, and the SPARQL run takes 101s. Comparing to the single server, we see a little better than linear scaling, i.e., double the gear is a little over 2x faster. In the present case, 10x the data takes a little under 5x the time.&lt;/p&gt; &lt;p&gt;This is due to slightly better load balancing. The single server splits the workload into chunks based on a run-time approximation; the cluster stores the partitions separately and uses this to determine the parallelism. In the latter case, the chunks are of more equal size.&lt;/p&gt; &lt;p&gt;The SPARQL penalty is here 2.7x, essentially the same as in the single server case.&lt;/p&gt; &lt;p&gt;It is no secret that a star schema is &amp;quot;embarrassingly parallel.&amp;quot; In other words, when there is one big table (fact table) that references many smaller tables (dimension tables), and query conditions are expressed on properties of the dimension tables, the correct query plan nearly always consists of putting the interesting foreign key values into hash tables, and then scanning the fact table from beginning to end and picking the rows where the values in the foreign key columns are found in the hash tables. This is called a &lt;i&gt;selective hash join&lt;/i&gt; or &lt;i&gt;invisible hash join&lt;/i&gt; if the hash join operation is merged in the table scan itself. &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/&quot; id=&quot;link-id0x2aabcc04ee68&quot;&gt;Daniel Abadi&lt;/a&gt;’s &lt;a href=&quot;http://dspace.mit.edu/handle/1721.1/43043&quot; id=&quot;link-id0xf3953e8&quot;&gt;well known thesis&lt;/a&gt; explains this matter. In the case of a cluster, supposing all tables are partitioned, identical hash tables are made on all participating servers, and after this each server gets to scan its fraction of the fact table independently of any other. This nearly always works because the dimension tables are typically orders of magnitude smaller than the fact table.&lt;/p&gt; &lt;p&gt;The complexity of the queries is close to linear to the data size. The factor that makes this deviate from linear is the fact that as hash tables get larger, they will miss the CPU cache more frequently; hence they get slower to probe. We here assume that a bigger fact table means bigger dimension tables. This is often the case, i.e., the more sales records there are, the larger the number of distinct customers or distinct items in the catalogue is likely to be. This is not always so, though, as the number of days in the history does not scale in the same way.&lt;/p&gt; &lt;p&gt;Any decent analytics oriented RDBMS with scale out will give near-linear performance with a star schema, at least up to the point where the hash tables can no longer be replicated on all servers, or the hash join must do multiple passes over the fact table.&lt;/p&gt; &lt;p&gt;Doing the same with schema-less data is harder, even though the principle is exactly the same. The difficulty lies again in detecting that a scan filtered by selective hash joins will give the most locality in access pattern, visiting each cache-line-worth of data once at most and doing so almost always in sequential order. This triggers memory prefetching on any modern CPU and significantly reduces memory latency.&lt;/p&gt; &lt;p&gt;As the scale grows there are some details of query plan that become significant. For example, in Q7 of SSB, there is a report on sales between Asian customers and Asian suppliers, country by country. In SQL:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT d_year, c_nation, s_nation, SUM (...), ... FROM lineorder, customer, supplier, dwdate WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND c_region = &amp;#39;ASIA&amp;#39; AND s_region = &amp;#39;ASIA&amp;#39; ... &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;In this case, one builds a hash table from &lt;code&gt;c_custkey&lt;/code&gt; to &lt;code&gt;c_nation&lt;/code&gt; and from &lt;code&gt;s_suppkey&lt;/code&gt; to &lt;code&gt;s_nation&lt;/code&gt;, including only suppliers and customers where the &lt;code&gt;region = &amp;#39;ASIA&amp;#39;&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;In SPARQL, the situation is the same, except that we say:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { li rdfh:lo_custkey ?lo_custkey ; rdfh:lo_suppkey ?lo_suppkey . ?lo_custkey rdfh:c_nation ?c_nation ; rdfh:c_region &amp;quot;ASIA&amp;quot; . ?lo_suppkey rdfh:s_nation ?s_nation ; rdfh:s_region &amp;quot;ASIA&amp;quot; . }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This is an equivalent expression, or near enough. We note that now it makes sense to build the hash table from the join of two patterns, i.e., the &lt;code&gt;rdfh:s_nation&lt;/code&gt; and &lt;code&gt;rdfh:s_nregion&lt;/code&gt;, which together are the same as the &lt;code&gt;supplier&lt;/code&gt; table in the SQL variant. But now, a supplier might have more than one &lt;code&gt;rdfh:s_nation&lt;/code&gt; triple; hence the hash table is no longer known to be &lt;i&gt;a priori&lt;/i&gt; unique -- i.e., its key is the URI of a supplier, but it is only known that suppliers usually have one nation; it is not known that they never have two.&lt;/p&gt; &lt;p&gt;However, if we build the hash table from only one pattern, i.e., &lt;code&gt;{ ?s_suppkey rdfh:s_region &amp;quot;ASIA&amp;quot; }&lt;/code&gt;, and the graph is specified, then we know that the subject will be unique, as stating that X has region &amp;quot;ASIA&amp;quot; twice has no effect beyond stating it once. However, if we do this, then there needs to be another hash table built for mapping the supplier to its &lt;code&gt;s_nation&lt;/code&gt;. There is no way to know that this is unique. Making two hash tables instead of one has been seen to slow down the query by a factor of two at scale 300GB whereas the effect is hardly noticeable at 30GB.&lt;/p&gt; &lt;p&gt;Thus recognizing these special cases with SPARQL is crucial if one is to come anywhere near the performance the SQL world attains just by following the schema. What used to be basic becomes trickier. It is true that the same or similar tricks are also needed in pure SQL workloads, but then not within the SSBM queries. What is a star in SQL is quite often a snowflake in SPARQL. A star schema has a single table-per-dimension, e.g., &lt;code&gt;customer&lt;/code&gt;, whereas a snowflake has more structure, e.g., &lt;code&gt;customer&lt;/code&gt;, the customer’s &lt;code&gt;country&lt;/code&gt; and the country’s &lt;code&gt;region&lt;/code&gt;, all in different tables.&lt;/p&gt; &lt;p&gt;The message to the SPARQL public is that now, for the first time, if there is natural parallelism and locality in the data, you know that the database will exploit this correctly and derive the same benefits from this as any SQL-only system would. Of course, there have been and are parallel RDF databases, including previous versions of Virtuoso, which do distributed index-based operations with various levels of concurrency and distributed coordination, but experience shows that these query strategies are not very good for queries that touch a large fraction (over 3%) of the database.&lt;/p&gt; &lt;p&gt;For basic data warehouse workloads, whether in SQL or SPARQL, Virtuoso offers linear scaling where clusters pay off from the start. While a handful of relational column stores have offered such capabilities for SQL for some time, now the same is also available for schema-less data: Entirely declarative querying; no explicit data partitioning; no schema restrictions; no map-reduce programs or the like.&lt;/p&gt; &lt;p&gt;The cluster evolution path is clear: as with single server, we strive for more speed on a broader range of operations. The star and snowflake functionality discussed here is the core piece for any analytics, so if this is not right, the rest is also compromised. The other side of cluster is operational, i.e., flexibility of deployment -- for example, flexibly resizing cloud-based databases.&lt;/p&gt; &lt;p&gt;This is the qualitative jump. Incremental performance gains will follow for both SQL and SPARQL.&lt;/p&gt; &lt;p&gt;Stars and snowflakes are common but the world does not end with these. As we will see in subsequent articles, there is a whole world of graphs, e.g., social media analytics, as well as more complex relational schemas.&lt;/p&gt;</atom:content>
  <atom:updated>2013-07-01T11:38:05-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Annuit Coeptis, or, Star Schema and The Cost of Freedom</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-06-28#1732</atom:id>
  <atom:published>2013-06-28T14:59:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;Around 2009, we set out to find out whether one can do analytics without a schema. The rationale is of course that data without query is not useful and that large data often has variation of schema, whether due to multiple sources, multiple versions of schema at different points in history, changes in applications and business model, or any number of other factors.&lt;/p&gt; &lt;p&gt;In order to meaningfully answer this question, one has to have a top notch analytics engine. Comparing &amp;quot;schema&amp;quot; and &amp;quot;no schema&amp;quot; on anything except the state-of-the-art in analytics database is not interesting. So we made Virtuoso 7 and its Column Store Module, and implemented the features common in dedicated analytics databases, plus suitable SPARQL adaptations of same.&lt;/p&gt; &lt;p&gt;The present beach head is the Star Schema Benchmark (SSB) (&lt;a href=&quot;http://www.openlinksw.com/www.cs.umb.edu/~poneil/StarSchemaB.PDF&quot; id=&quot;link-id0x2aabcd1f4f08&quot;&gt;PDF&lt;/a&gt;), which represents the core of most data warehouse workloads (i.e., big scans, selective hash joins, and aggregation). These same patterns are also found at the core of &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x2aabce8838c8&quot;&gt;TPC-H&lt;/a&gt; and the new &lt;a href=&quot;http://www.tpc.org/tpcds/&quot; id=&quot;link-id0x2aabce202ca8&quot;&gt;TPC-DS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;At present, the cost of having no schema is a 2.7x increase in run time, as evidenced by SSB. Virtuoso SQL does the run in 8.4s, &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0xe89eba8&quot;&gt;MonetDB&lt;/a&gt; SQL in 17s, Virtuoso SPARQL in 22.5s. Virtuoso outperforms column store pioneer MonetDB by a fair margin. MonetDB is probably the fastest open source column store, although there exists faster ones in closed source.&lt;/p&gt; &lt;p&gt;SPARQL in Virtuoso comes close behind SQL in MonetDB, only a factor of 1.3. &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2aabd81ee648&quot;&gt;MySQL&lt;/a&gt; with &lt;a href=&quot;http://dbpedia.org/resource/InnoDB&quot; id=&quot;link-id0x161e22f8&quot;&gt;InnoDB&lt;/a&gt;, which is not an analytical database, does the run in 2391s.&lt;/p&gt; &lt;p&gt;Initially, we were aiming at a slowdown factor of 2 when comparing SPARQL to SQL on Virtuoso.  Of course, this is only worth something if the SQL performance is generally on a level with relational column stores.  These goals have now been substantially attained.&lt;/p&gt; &lt;p&gt;This is a major beachhead for RDF as a branch of graph database technology, and for Virtuoso as a product.  For the first time one can run a real database workload based on SPARQL at a speed that is comparable with SQL, and without any compromises on the schema flexibility that is the principal reason to use an RDF-based graph model in the first place.  No SPARQL-to-SQL mapping, property tables, or such.&lt;/p&gt; &lt;h2&gt;Execution and Query Optimization&lt;/h2&gt; &lt;p&gt;The technical accomplishment is divided in two parts. For query execution, there is a compressed column store with vectored execution and a good implementation of query parallelization, hash join, and aggregation. With a schema, there is a multicolumn table. and with RDF, there is a quads table. Both are compressed based on the characteristics of actual data. The SQL execution consists of a scan of the fact table, taking a few columns of this and applying one or more hash joins to column values, where the hash joins are usually selective. This is the same in SPARQL, except that instead of getting another column of the table there is a self-join. The self-join has a fairly dense access pattern and is in the same order as the previous one, thus it is not very expensive. This constitutes the difference.&lt;/p&gt; &lt;p&gt;While in SQL, the plan is obvious, especially since there are no indices on the fact table; however, getting the right plan with SPARQL is quite difficult. There are up to 12 triple-patterns in a query, leading to 12! (twelve-factorial, i.e., 12*11*...*2*1 = 479,001,600) possible join orders, multiplied by index and hash based variants of each join, where the hash-based variants further multiply the space by considering different combinations of patterns on the build side. Experiments confirm that the same plan is best for both SQL and SPARQL but getting this as the outcome of query optimization is far from self-evident. This requires a very precise cost model that correctly takes ordering of intermediate results and density of hits in index lookups into account, as well as the variability in hash join performance when the hash table size varies, i.e., CPU cache effects. All this modeling is of course also valid for SQL, but is not really required there because a much coarser model will also deliver the right plan, as there is much less choice. Further, making the right plan must be fast. Now, the longest query optimization time is 240ms for an execution time of 3.7s (Q12 at 30G in SPARQL). This is pretty good.&lt;/p&gt; &lt;p&gt;Using hash join in SPARQL has anyway been problematical because knowing when to use one requires high confidence in the cost model. If one ends up building a large hash table that is used only a few times, there is a steep penalty. Index-based plans, especially since RDF data tends to be indexed in both S-to-O and O-to-S directions, do not have bad worst-cases, but then a good hash-based plan is easily 5x faster than an index-based one.&lt;/p&gt; &lt;p&gt;So, for SPARQL the results are game changing. Finally up-to-date database. For SQL, Virtuoso 7 performs like an analytics column store is supposed to, but then that is what it is. For the SQL space, it is interesting that this is also open source, so Virtuoso may well be the best performing open source SQL analytics engine out there. We will later see how the comparison with other SQL column stores goes.&lt;/p&gt; &lt;p&gt;In summary, the central core of the Virtuoso 7 agenda has been accomplished. Incremental progress will continue around addressing more complex benchmarks like TPC-H and TPC-DS, both in SQL and in SPARQL translation, plus full-scale &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x2aabbaa86d48&quot;&gt;Open Streetmap&lt;/a&gt; in both SQL and SPARQL, and of course the benchmarks being developed in &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x2aabdcef94e8&quot;&gt;LDBC&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Experiments&lt;/h2&gt; &lt;p&gt;The scale of the dataset is 30GB, with 187M line-order rows. This comes to 3.2Gt (3.2 billion triples). The runs are from warm cache on all systems. The test system for all runs is a dual Xeon E5-2630 with 192GB RAM.&lt;/p&gt; &lt;p&gt;The scripts for duplicating the experiment on the Virtuoso 7 Open Source cut will be published later on this blog, when the open source cut incorporates the query optimization improvements discussed herein.&lt;/p&gt; &lt;p&gt;In the table below, the times are elapsed real times in milliseconds, with one query at a time, all from warm cache (i.e. the second run of the query set is reported and we make sure that all databases are running from memory). The MySQL is configured with InnoDB and 40GB of buffer pool, which should be enough for the 30GB dataset. The SQL versions do not declare any explicit indices, but do declare primary keys. The SPARQL version is with the default Virtuoso index scheme, but the query plans end up scanning each predicate in order of S, except for the build phases of hash-joins where an index from O-to-S is occasionally used.&lt;/p&gt; &lt;table id=&quot;SSBResultsTable&quot; title=&quot;Comparative Results&quot; align=&quot;center&quot; cellspacing=&quot;5px&quot; cellpadding=&quot;2px&quot; width=&quot;450px&quot;&gt; &lt;caption&gt;Comparative Results, 30GB dataset&lt;br /&gt;Virtuoso SQL &lt;i&gt;Vs.&lt;/i&gt; Virtuoso SPARQL &lt;i&gt;Vs.&lt;/i&gt; MonetDB SQL &lt;i&gt;Vs.&lt;/i&gt; MySQL SQL&lt;/caption&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Query&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt; SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso &lt;br /&gt; SPARQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;MonetDB &lt;br /&gt; SQL&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;MySQL &lt;br /&gt; SQL&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q1&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;413&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;1101&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1659&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;82477&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q2&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;282&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;416&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;500&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;74436&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q3&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;253&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;295&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;494&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;75411&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q4&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;828&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2484&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;958&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;226604&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q5&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;837&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1915&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;648&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;222782&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q6&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;419&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1813&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;541&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;219656&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q7&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;1062&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2330&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;5658&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;237730&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q8&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;617&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2182&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;521&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;194918&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q9&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;547&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1290&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;381&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;186112&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q10&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;499&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;639&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;370&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;186123&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q11&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;1132&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2142&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2760&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;241045&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q12&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;863&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3770&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;2127&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;241439&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Q13&lt;/th&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#33CC33&quot;&gt; &lt;b&gt;&lt;i&gt;653&lt;/i&gt; &lt;/b&gt;&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1612&lt;/td&gt; &lt;td align=&quot;center&quot; bgcolor=&quot;#99FF66&quot;&gt;1005&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;202817&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;One could argue that comparing against MySQL is unjustified, as MySQL is certainly not optimized for this workload, e.g., it does not do hash joins and does not parallelize queries. On the other hand, the previous work on SSBM for SPARQL, &lt;i&gt;&lt;a href=&quot;http://eswc-conferences.org/sites/default/files/papers2013/kaempgen.pdf&quot; id=&quot;link-id0x2aabcddc7bd8&quot;&gt;No Size Fits All&lt;/a&gt;&lt;/i&gt; by &lt;a href=&quot;http://www.aifb.kit.edu/web/Benedikt_Kaempgen/en&quot; id=&quot;link-id0x2aabcdee77d8&quot;&gt;Benedikt Kaempgen&lt;/a&gt; and &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x2aabdb8285b8&quot;&gt;Andreas Harth&lt;/a&gt;, published at the &lt;a href=&quot;http://2013.eswc-conferences.org/&quot; id=&quot;link-id0x2aabcc627198&quot;&gt;2013 ESWC&lt;/a&gt;, did make the comparison between MySQL and Virtuoso 6; thus we think it informative to include MySQL. To summarize &lt;i&gt;No Size Fits All,&lt;/i&gt; SPARQL in Virtuoso 6 lost by a factor of 12 against MySQL, but in the present case, Virtuoso 7 SPARQL wins by a factor of 106 against MySQL.&lt;/p&gt; &lt;p&gt;The ESWC paper used a scale of 1G, while the present test uses a scale of 30G. One should remember that the MySQL times are single-threaded, and all other times are multi-threaded. The test system has 12 cores and 24 threads, so running at full platform utilization is at best 16x faster than single threaded. Running SPARQL single-threaded instead of 24 threads-per-query gives a total time of 175s, still over 10x better than MySQL. Compared to the multi-threaded time of 22.5s, the parallelism yields an average acceleration of 7.7x. Running with SPARQL with full threading but no hash-join gives a time of 80s, 3.5x worse than with hash-join. We note that SSB is a very hash-join intensive workload.&lt;/p&gt; &lt;p&gt;MonetDB is the more relevant comparison, as it does use the full CPU, with load peaks up to the theoretical 2400% (12 dual-threaded cores) and is the platform on which a lot of the science of the hash join was refined. MonetDB does relatively best with queries that can start by a very selective join (e.g., Q9) where it outperforms Virtuoso. This is probably due to more even splitting of the work among threads and to not having to deal with data compression. Virtuoso wins the most on queries that select a large fraction of the fact table, where MonetDB is penalized due to its policy of full materialization of intermediate results. Joins without any selection (e.g., adding up the &lt;code&gt;lo_extendedprice&lt;/code&gt;, and grouping by the &lt;code&gt;d_year&lt;/code&gt; of &lt;code&gt;lo_orderdate&lt;/code&gt;) show MonetDB at its worst. Such queries do not occur in SSB though, so SSB is a relatively MonetDB-friendly benchmark.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;The back of the problem is broken. Big query without schema can be done. One could of course see this coming by experimenting with explicit plans. But nobody out there can manually optimize a query plan. Thus the final step consisted of having a good-enough cost model and a smart-enough search order to get the right plan fast. This will be in the next update of Virtuoso Open Source. At that time, we will publish the full queries and configuration files.&lt;/p&gt; &lt;p&gt;This is the breakthrough for RDF analytics. Incremental progress will follow, with more tricks being incorporated, like the ones known to be needed by TPC-H.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:35:04.895699-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ESWC 2013 Panel - Semantic Technologies for Big Data Analytics: Opportunities and Challenges</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-06-04#1731</atom:id>
  <atom:published>2013-06-04T14:05:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was invited to the &lt;a href=&quot;http://2013.eswc-conferences.org/program/panel&quot; id=&quot;link-id0x7f5118cd8118&quot;&gt;ESWC 2013 &amp;quot;Semantic Technologies for Big Data Analytics: Opportunities and Challenges&amp;quot;&lt;/a&gt; panel on 29th May 2013 in Montpellier, France. The panel was moderated by &lt;a href=&quot;http://www.linkedin.com/in/markogrobelnik&quot; id=&quot;link-id0x7f51ce728038&quot;&gt;Marko Grobelnik&lt;/a&gt; (JSI), with panelists &lt;a href=&quot;http://kmi.open.ac.uk/people/member/enrico-motta&quot; id=&quot;link-id0x7f51188422d8&quot;&gt;Enrico Motta&lt;/a&gt; (KMi), &lt;a href=&quot;http://www.nuigalway.ie/our-research/people/manfredhauswirth/&quot; id=&quot;link-id0x7f50c2ad7568&quot;&gt;Manfred Hauswirth&lt;/a&gt; (NUIG), &lt;a href=&quot;http://www.linkedin.com/in/davidkarger&quot; id=&quot;link-id0x7f511aefa138&quot;&gt;David Karger&lt;/a&gt; (MIT), &lt;a href=&quot;http://ngwr.labs.bt.com/FB/JohnDavies.htm&quot; id=&quot;link-id0x7f50c37e1f98&quot;&gt;John Davies&lt;/a&gt; (British Telecom), &lt;a href=&quot;http://www.linkedin.com/pub/jose-manuel-gomez-perez/4/66a/3a3&quot; id=&quot;link-id0x7f50c0ba56e8&quot;&gt;José Manuel Gómez Pérez&lt;/a&gt; (ISOCO) and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/&quot; id=&quot;link-id0x7f51ce5da9a8&quot;&gt;Orri Erling&lt;/a&gt; (myself).&lt;/p&gt; &lt;p&gt; Marko opened the panel by looking at the Google Trends search statistics for big data, semantics, business intelligence, data mining, and other such terms. Big data keeps climbing its hype-cycle hill, now above semantics and most of the other terms. But what do these in fact mean? In the leading books about big data, the word semantics does not occur.&lt;/p&gt; &lt;p&gt;I will first recap my 5 minute intro, and then summarize some questions and answers. This is from memory and is in no sense a full transcript.&lt;/p&gt; &lt;h2&gt; &lt;a name=&quot;Presentation&quot; id=&quot;Presentation&quot;&gt;&lt;/a&gt;Presentation&lt;/h2&gt; &lt;p&gt;Over the years we have maintained that what the RDF community most needs is good database. Indeed, RDF is relational in essence and, while it requires some new datatypes and other adaptations, there is nothing in it that is fundamentally foreign to RDBMS technology.&lt;/p&gt; &lt;p&gt;This spring, we came through on the promise, delivering Virtuoso 7, packed full of all the state-of-the-art tricks in analytics-oriented databasing, column-wise compressed storage, vectored execution, great parallelism, and flexible scale-out.&lt;/p&gt; &lt;p&gt;At this same ESWC, &lt;a href=&quot;http://www.aifb.kit.edu/web/Benedikt_Kaempgen/en&quot; id=&quot;link-id0x7f51cd4e7698&quot;&gt;Benedikt Kaempgen&lt;/a&gt; and &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x7f51c3667b68&quot;&gt;Andreas Harth&lt;/a&gt; presented a paper (&lt;i&gt;&lt;a href=&quot;http://eswc-conferences.org/sites/default/files/papers2013/kaempgen.pdf&quot; id=&quot;link-id0x7f50c25703d8&quot;&gt;No Size Fits All -- Running the Star Schema Benchmark with SPARQL and RDF Aggregate Views&lt;/a&gt;&lt;/i&gt;) comparing Virtuoso and MySQL on the star schema benchmark at 1G scale. We redid their experiments with Virtuoso 7 at 30x and at 300x the scale.&lt;/p&gt; &lt;p&gt;At present, when running the star schema benchmark in SQL, we outperform column-store pioneer MonetDB by a factor of 2. When running the same star schema benchmark in SPARQL against triples as opposed to tables, we see a slowdown of 5x. When scaling from 30 to 300G and from one to two machines, we get linear increase in throughput, 5x longer for 10x more data.&lt;/p&gt; &lt;p&gt; Coming back to MySQL, the run with 1G takes about 60 seconds. Virtuoso SPARQL does the same on 30x the data in 45 seconds. Well, you could say that we should go pick on somebody in our series and not MySQL, being not relevant for this. Comparing with MonetDB and other analytics column stores is of course more relevant.&lt;/p&gt; &lt;p&gt;For cluster scaling, one could say that star schema benchmark is easy, and so it is, but even with harder ones, which do joins across partitions all the time, like the BSBM BI workload, we get scaling that is close to linear.&lt;/p&gt; &lt;p&gt;So, for analytics, you can use SPARQL in Virtuoso, and run circles around some common SQL databases.&lt;/p&gt; &lt;p&gt;The difference between SQL and SPARQL comes from having no schema. Instead of scanning aligned columns in a table, you do an index lookup for each column. This is not too slow if there is locality, as there is, but still a lot more than when talking about a multicolumn column-compressed table. With more execution tricks, we can maybe cut this to 3x.&lt;/p&gt; &lt;p&gt;The beach-head of workable RDF-based analytics on schema-less data has been attained. Medium-scale data, to the single-digit terabytes, is OK on small clusters.&lt;/p&gt; &lt;h3&gt; &lt;a name=&quot;What about the future?&quot; id=&quot;What about the future?&quot;&gt;&lt;/a&gt;What about the future?&lt;/h3&gt; &lt;p&gt;First, Big Data means more than querying. Before meaningful analytics can be done, the data must generally be prepared and massaged. This means fast bulk load and fast database-resident transformation. We have that via flexible, expressive, parallelizable stored procedures and run time hosting. One can do everything one does in &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x7f51cf753658&quot;&gt;MapReduce&lt;/a&gt; right inside the database.&lt;/p&gt; &lt;p&gt;Some analytics cannot be expressed in a query language. For example, graph algorithms like clustering generate large intermediate states and run in many passes. For this, bulk synchronous processing frameworks like Giraph are becoming popular. We can again do this right inside the DBMS, on RDF or SQL tables. There is great platform utilization and more flexibility than in strict BSP, while being able to do any BSP algorithm.&lt;/p&gt; &lt;p&gt;The history of technology is one of divergence followed by reintegration. New trends, like Column stores, RDF databases, key value stores, or MapReduce, start as one-off special-purpose products, and the technologies then find their way back into platforms addressing a broader functionality.&lt;/p&gt; &lt;p&gt;The whole semantic experiment might be seen as a break-away from the web, if also a little from database, for the specific purpose of exploring schemaless-ness, universal referenceability of data, self-describing data, and some inference.&lt;/p&gt; &lt;p&gt;With RDF, we see lasting value in globally consistent identifiers. The URI &amp;quot;superkey&amp;quot; is the ultimate silo-breaker. The future is in integrating more and more varied data and a schema-first approach is cost-prohibitive. If data is to be preserved over extended lengths of time, self-description is essential; the applications and people that produced the data might not be around. Same for publishing data for outside reuse.&lt;/p&gt; &lt;p&gt;In fact, many of these things are right now being pursued in mainstream IT. Everybody is reinventing the triple, whether by using non-first normal form key-value pairs in an RDB, tagging each row of a table with the name of the table, using XML documents, etc. The RDF model provides all these desirable features, but most applications that need these things do not run on RDF infrastructure.&lt;/p&gt; &lt;p&gt;Anyway, by revolutionizing RDF store performance, we make this technology a cost-effective alternative in places where it was not such before.&lt;/p&gt; &lt;p&gt;To get much further in performance, physical storage needs to adapt to the data. Thus, in the long term, we see RDF as a &lt;i&gt;lingua franca&lt;/i&gt; of data interchange and publishing, supported by highly scalable and adaptive databases that exploit the structure implicit in the data to deliver performance equal to the best in SQL data warehousing. When we get the schema from the data, we have schema-last flexibility and schema-first performance. The genie is back in the bottle, and data models are unified.&lt;/p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/22434050&quot; width=&quot;476&quot; height=&quot;400&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;h2&gt; &lt;a name=&quot;Questions and Answers&quot; id=&quot;Questions and Answers&quot;&gt;&lt;/a&gt;Questions and Answers&lt;/h2&gt; &lt;h3&gt; &lt;i&gt;Q: Is the web big data?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; No, the shallow web (i.e., static web pages for purposes of search) is not big data. One can put it in a box and search. But for purposes of more complex processing, like analytics on the structure of the whole web, this is still big data.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: I bet you still can&amp;#39;t do analytics on a fast stream.&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; I am not sure about that, because when you have a stream -- whether this is network management and denial of service detection, or managing traffic in a city -- you know ahead of time what peak volume you are looking at, so you can size the system accordingly. And streams have a schema. So you can play all the database tricks. Vectored execution will work there just as it does for query processing, for example.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: I did not mean storage, I meant analysis.&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; Here we mean sliding windows and constant queries. The triple vs. row issue also seems the same. There will be some overhead from schema-lastness, but for streams, I would say each has a regular structure.&lt;/p&gt; &lt;p&gt; &lt;b&gt;John Davies:&lt;/b&gt; For example, we gather gigabytes a minute of traffic data from sensors in the road network and all this data is very regular, with a fixed schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; Or is this always so? The internet of things has potentially huge diversity in schema, with everything producing a stream. The user of the stream has no control whatever on the schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Marko Grobelnik:&lt;/b&gt; Yes, we have had streams for a long time -- on Wall Street, for example, where these make a lot of money. But high frequency trading is a very specific application. There is a stream, some analytics, not very complicated, just fast. This is one specific solution, with fixed schema and very specific scope, no explicit semantics.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: What is big data, in fact?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; Computer science has always been about big data; it is just the definition of big that changes. Big data is something one cannot conveniently process on a computer system. Not without unusual tricks, where something trivial, like shortest path, becomes difficult just because of volume. So it is that big data is very much about performance, and performance is usually obtained by sacrificing the general for the specific. The semantic world on the other hand is after something very general and about complex and expressive schema. When data gets big, the schema is vanishingly small in comparison with the data, and the schema work gets done by hand; the schema is not the problem there. Big data is not very internetty either, because the 40 TB produced by the telescope are centrally stored and you do not download them or otherwise transport them very much.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: Now, what do each of you understand with semantics?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; The essential aspect is that data is machine interpretable, with sufficient machine readable context.&lt;/p&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; Semantics has to do with complexity or heterogeneity in the schema. Big data has to do with large volume. Maybe semantic big data would be all the databases in the world with a million different schemas. But today we do not see such applications. If the volume is high, the schema is usually not very large.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; This is not so far as that, for example a telco has over a hundred distinct network management systems and each has a different schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; From the data angle, we have come to associate semantic with &lt;/p&gt; &lt;ul&gt; &lt;li&gt;schema-lastness&lt;/li&gt; &lt;li&gt;globally-resolvable identifiers&lt;/li&gt; &lt;li&gt;self-description&lt;/li&gt; &lt;/ul&gt; When people use RDF as a storage model, they mostly do so because of schema flexibility, not because of expressive schemas or inference. Some use a little inference, but inference or logics or considerations of knowledge representation do not in our experience drive the choice. &lt;h2&gt; &lt;a name=&quot;Conclusion&quot; id=&quot;Conclusion&quot;&gt;&lt;/a&gt;Conclusion&lt;/h2&gt; &lt;p&gt;In conclusion, the event was rather peaceful, with a good deal of agreement between the panelists and audience and no heated controversy. I hoped to get some reaction when I said that semantics was schema flexibility, but apparently this has become a politically acceptable stance. In the golden days of AI this would not have been so. But then Marko Grobelnik did point out that the whole landscape has become data driven. Even in fields like natural language, one looks more at statistics than deep structure: For example, if a phrase is often found on Google, it is proper usage.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-21T14:15:05.521272-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ESWC 2013 Panel - Semantic Technologies for Big Data Analytics: Opportunities and Challenges</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-06-04#1730</atom:id>
  <atom:published>2013-06-04T14:04:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was invited to the &lt;a href=&quot;http://2013.eswc-conferences.org/program/panel&quot; id=&quot;link-id0x7f5118cd8118&quot;&gt;ESWC 2013 &amp;quot;Semantic Technologies for Big Data Analytics: Opportunities and Challenges&amp;quot;&lt;/a&gt; panel on 29th May 2013 in Montpellier, France. The panel was moderated by &lt;a href=&quot;http://www.linkedin.com/in/markogrobelnik&quot; id=&quot;link-id0x7f51ce728038&quot;&gt;Marko Grobelnik&lt;/a&gt; (JSI), with panelists &lt;a href=&quot;http://kmi.open.ac.uk/people/member/enrico-motta&quot; id=&quot;link-id0x7f51188422d8&quot;&gt;Enrico Motta&lt;/a&gt; (KMi), &lt;a href=&quot;http://www.nuigalway.ie/our-research/people/manfredhauswirth/&quot; id=&quot;link-id0x7f50c2ad7568&quot;&gt;Manfred Hauswirth&lt;/a&gt; (NUIG), &lt;a href=&quot;http://www.linkedin.com/in/davidkarger&quot; id=&quot;link-id0x7f511aefa138&quot;&gt;David Karger&lt;/a&gt; (MIT), &lt;a href=&quot;http://ngwr.labs.bt.com/FB/JohnDavies.htm&quot; id=&quot;link-id0x7f50c37e1f98&quot;&gt;John Davies&lt;/a&gt; (British Telecom), &lt;a href=&quot;http://www.linkedin.com/pub/jose-manuel-gomez-perez/4/66a/3a3&quot; id=&quot;link-id0x7f50c0ba56e8&quot;&gt;José Manuel Gómez Pérez&lt;/a&gt; (ISOCO) and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/&quot; id=&quot;link-id0x7f51ce5da9a8&quot;&gt;Orri Erling&lt;/a&gt; (myself).&lt;/p&gt; &lt;p&gt; Marko opened the panel by looking at the Google Trends search statistics for big data, semantics, business intelligence, data mining, and other such terms. Big data keeps climbing its hype-cycle hill, now above semantics and most of the other terms. But what do these in fact mean? In the leading books about big data, the word semantics does not occur.&lt;/p&gt; &lt;p&gt;I will first recap my 5 minute intro, and then summarize some questions and answers. This is from memory and is in no sense a full transcript.&lt;/p&gt; &lt;h2&gt; &lt;a name=&quot;Presentation&quot; id=&quot;Presentation&quot;&gt;&lt;/a&gt;Presentation&lt;/h2&gt; &lt;p&gt;Over the years we have maintained that what the RDF community most needs is good database. Indeed, RDF is relational in essence and, while it requires some new datatypes and other adaptations, there is nothing in it that is fundamentally foreign to RDBMS technology.&lt;/p&gt; &lt;p&gt;This spring, we came through on the promise, delivering Virtuoso 7, packed full of all the state-of-the-art tricks in analytics-oriented databasing, column-wise compressed storage, vectored execution, great parallelism, and flexible scale-out.&lt;/p&gt; &lt;p&gt;At this same ESWC, &lt;a href=&quot;http://www.aifb.kit.edu/web/Benedikt_Kaempgen/en&quot; id=&quot;link-id0x7f51cd4e7698&quot;&gt;Benedikt Kaempgen&lt;/a&gt; and &lt;a href=&quot;http://www.aifb.kit.edu/web/Andreas_Harth/en&quot; id=&quot;link-id0x7f51c3667b68&quot;&gt;Andreas Harth&lt;/a&gt; presented a paper (&lt;i&gt;&lt;a href=&quot;http://eswc-conferences.org/sites/default/files/papers2013/kaempgen.pdf&quot; id=&quot;link-id0x7f50c25703d8&quot;&gt;No Size Fits All -- Running the Star Schema Benchmark with SPARQL and RDF Aggregate Views&lt;/a&gt;&lt;/i&gt;) comparing Virtuoso and MySQL on the star schema benchmark at 1G scale. We redid their experiments with Virtuoso 7 at 30x and at 300x the scale.&lt;/p&gt; &lt;p&gt;At present, when running the star schema benchmark in SQL, we outperform column-store pioneer MonetDB by a factor of 2. When running the same star schema benchmark in SPARQL against triples as opposed to tables, we see a slowdown of 5x. When scaling from 30 to 300G and from one to two machines, we get linear increase in throughput, 5x longer for 10x more data.&lt;/p&gt; &lt;p&gt; Coming back to MySQL, the run with 1G takes about 60 seconds. Virtuoso SPARQL does the same on 30x the data in 45 seconds. Well, you could say that we should go pick on somebody in our series and not MySQL, being not relevant for this. Comparing with MonetDB and other analytics column stores is of course more relevant.&lt;/p&gt; &lt;p&gt;For cluster scaling, one could say that star schema benchmark is easy, and so it is, but even with harder ones, which do joins across partitions all the time, like the BSBM BI workload, we get scaling that is close to linear.&lt;/p&gt; &lt;p&gt;So, for analytics, you can use SPARQL in Virtuoso, and run circles around some common SQL databases.&lt;/p&gt; &lt;p&gt;The difference between SQL and SPARQL comes from having no schema. Instead of scanning aligned columns in a table, you do an index lookup for each column. This is not too slow if there is locality, as there is, but still a lot more than when talking about a multicolumn column-compressed table. With more execution tricks, we can maybe cut this to 3x.&lt;/p&gt; &lt;p&gt;The beach-head of workable RDF-based analytics on schema-less data has been attained. Medium-scale data, to the single-digit terabytes, is OK on small clusters.&lt;/p&gt; &lt;h3&gt; &lt;a name=&quot;What about the future?&quot; id=&quot;What about the future?&quot;&gt;&lt;/a&gt;What about the future?&lt;/h3&gt; &lt;p&gt;First, Big Data means more than querying. Before meaningful analytics can be done, the data must generally be prepared and massaged. This means fast bulk load and fast database-resident transformation. We have that via flexible, expressive, parallelizable stored procedures and run time hosting. One can do everything one does in &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x7f51cf753658&quot;&gt;MapReduce&lt;/a&gt; right inside the database.&lt;/p&gt; &lt;p&gt;Some analytics cannot be expressed in a query language. For example, graph algorithms like clustering generate large intermediate states and run in many passes. For this, bulk synchronous processing frameworks like Giraph are becoming popular. We can again do this right inside the DBMS, on RDF or SQL tables. There is great platform utilization and more flexibility than in strict BSP, while being able to do any BSP algorithm.&lt;/p&gt; &lt;p&gt;The history of technology is one of divergence followed by reintegration. New trends, like Column stores, RDF databases, key value stores, or MapReduce, start as one-off special-purpose products, and the technologies then find their way back into platforms addressing a broader functionality.&lt;/p&gt; &lt;p&gt;The whole semantic experiment might be seen as a break-away from the web, if also a little from database, for the specific purpose of exploring schemaless-ness, universal referenceability of data, self-describing data, and some inference.&lt;/p&gt; &lt;p&gt;With RDF, we see lasting value in globally consistent identifiers. The URI &amp;quot;superkey&amp;quot; is the ultimate silo-breaker. The future is in integrating more and more varied data and a schema-first approach is cost-prohibitive. If data is to be preserved over extended lengths of time, self-description is essential; the applications and people that produced the data might not be around. Same for publishing data for outside reuse.&lt;/p&gt; &lt;p&gt;In fact, many of these things are right now being pursued in mainstream IT. Everybody is reinventing the triple, whether by using non-first normal form key-value pairs in an RDB, tagging each row of a table with the name of the table, using XML documents, etc. The RDF model provides all these desirable features, but most applications that need these things do not run on RDF infrastructure.&lt;/p&gt; &lt;p&gt;Anyway, by revolutionizing RDF store performance, we make this technology a cost-effective alternative in places where it was not such before.&lt;/p&gt; &lt;p&gt;To get much further in performance, physical storage needs to adapt to the data. Thus, in the long term, we see RDF as a &lt;i&gt;lingua franca&lt;/i&gt; of data interchange and publishing, supported by highly scalable and adaptive databases that exploit the structure implicit in the data to deliver performance equal to the best in SQL data warehousing. When we get the schema from the data, we have schema-last flexibility and schema-first performance. The genie is back in the bottle, and data models are unified.&lt;/p&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/22434050&quot; width=&quot;476&quot; height=&quot;400&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;h2&gt; &lt;a name=&quot;Questions and Answers&quot; id=&quot;Questions and Answers&quot;&gt;&lt;/a&gt;Questions and Answers&lt;/h2&gt; &lt;h3&gt; &lt;i&gt;Q: Is the web big data?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; No, the shallow web (i.e., static web pages for purposes of search) is not big data. One can put it in a box and search. But for purposes of more complex processing, like analytics on the structure of the whole web, this is still big data.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: I bet you still can&amp;#39;t do analytics on a fast stream.&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; I am not sure about that, because when you have a stream -- whether this is network management and denial of service detection, or managing traffic in a city -- you know ahead of time what peak volume you are looking at, so you can size the system accordingly. And streams have a schema. So you can play all the database tricks. Vectored execution will work there just as it does for query processing, for example.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: I did not mean storage, I meant analysis.&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; Here we mean sliding windows and constant queries. The triple vs. row issue also seems the same. There will be some overhead from schema-lastness, but for streams, I would say each has a regular structure.&lt;/p&gt; &lt;p&gt; &lt;b&gt;John Davies:&lt;/b&gt; For example, we gather gigabytes a minute of traffic data from sensors in the road network and all this data is very regular, with a fixed schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; Or is this always so? The internet of things has potentially huge diversity in schema, with everything producing a stream. The user of the stream has no control whatever on the schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Marko Grobelnik:&lt;/b&gt; Yes, we have had streams for a long time -- on Wall Street, for example, where these make a lot of money. But high frequency trading is a very specific application. There is a stream, some analytics, not very complicated, just fast. This is one specific solution, with fixed schema and very specific scope, no explicit semantics.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: What is big data, in fact?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; Computer science has always been about big data; it is just the definition of big that changes. Big data is something one cannot conveniently process on a computer system. Not without unusual tricks, where something trivial, like shortest path, becomes difficult just because of volume. So it is that big data is very much about performance, and performance is usually obtained by sacrificing the general for the specific. The semantic world on the other hand is after something very general and about complex and expressive schema. When data gets big, the schema is vanishingly small in comparison with the data, and the schema work gets done by hand; the schema is not the problem there. Big data is not very internetty either, because the 40 TB produced by the telescope are centrally stored and you do not download them or otherwise transport them very much.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Q: Now, what do each of you understand with semantics?&lt;/i&gt; &lt;/h3&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; The essential aspect is that data is machine interpretable, with sufficient machine readable context.&lt;/p&gt; &lt;p&gt; &lt;b&gt;David Karger:&lt;/b&gt; Semantics has to do with complexity or heterogeneity in the schema. Big data has to do with large volume. Maybe semantic big data would be all the databases in the world with a million different schemas. But today we do not see such applications. If the volume is high, the schema is usually not very large.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Manfred Hauswirth:&lt;/b&gt; This is not so far as that, for example a telco has over a hundred distinct network management systems and each has a different schema.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Orri Erling:&lt;/b&gt; From the data angle, we have come to associate semantic with &lt;/p&gt; &lt;ul&gt; &lt;li&gt;schema-lastness&lt;/li&gt; &lt;li&gt;globally-resolvable identifiers&lt;/li&gt; &lt;li&gt;self-description&lt;/li&gt; &lt;/ul&gt; When people use RDF as a storage model, they mostly do so because of schema flexibility, not because of expressive schemas or inference. Some use a little inference, but inference or logics or considerations of knowledge representation do not in our experience drive the choice. &lt;h2&gt; &lt;a name=&quot;Conclusion&quot; id=&quot;Conclusion&quot;&gt;&lt;/a&gt;Conclusion&lt;/h2&gt; &lt;p&gt;In conclusion, the event was rather peaceful, with a good deal of agreement between the panelists and audience and no heated controversy. I hoped to get some reaction when I said that semantics was schema flexibility, but apparently this has become a politically acceptable stance. In the golden days of AI this would not have been so. But then Marko Grobelnik did point out that the whole landscape has become data driven. Even in fields like natural language, one looks more at statistics than deep structure: For example, if a phrase is often found on Google, it is proper usage.&lt;/p&gt;</atom:content>
  <atom:updated>2013-06-04T16:04:45+02:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 7 Release</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2013-05-13#1729</atom:id>
  <atom:published>2013-05-13T16:06:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;The quest of &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x7f51106137d8&quot;&gt;OpenLink Software&lt;/a&gt; is to bring flexibility, efficiency, and expressive power to people working with data. For the past several years, this has been focused on making graph data models viable for the enterprise. Flexibility in schema evolution is a central aspect of this, as is the ability to share identifiers across different information systems, i.e., giving things URIs instead of synthetic keys that are not interpretable outside of a particular application.&lt;/p&gt; &lt;p&gt;With &lt;a href=&quot;http://virtuoso.openlinksw.com/news/virtuoso-v7-press-release-20130423&quot; id=&quot;link-id0x7f51d7c4e7a8&quot;&gt;Virtuoso 7&lt;/a&gt;, we dramatically improve the efficiency of all this. With databases in the billions of relations (also known as triples, or 3-tuples), we can fit about 3x as many relations in the same space (disk and RAM) as with Virtuoso 6. Single-threaded query speed is up to 3x better, plus there is intra-query parallelization even in single-server configurations. Graph data workloads are all about random lookups. With these, having data in RAM is all-important. With 3x space efficiency, you can run with 3x more data in the same space before starting to go to disk. In some benchmarks, this can make a 20x gain.&lt;/p&gt; &lt;p&gt;Also the Virtuoso scale-out support is fundamentally reworked, with much more parallelism and better deployment flexibility.&lt;/p&gt; &lt;p&gt;So, for graph data, Virtuoso 7 is a major step in the coming of age of the technology. Data keeps growing and time is getting scarcer, so we need more flexibility and more performance at the same time.&lt;/p&gt; &lt;p&gt;So, let’s talk about how we accomplish this. Column stores have been the trend in relational data warehousing for over a decade. With column stores comes vectored execution, i.e., running any operation on a large number of values at one time. Instead of running one operation on one value, then the next operation on the result, and so forth, you run the first operation on thousands or hundreds-of-thousands of values, then the next one on the results of this, and so on.&lt;/p&gt; &lt;p&gt;Column-wise storage brings space efficiency, since values in one column of a table tend to be alike -- whether repeating, sorted, within a specific range, or picked from a particular set of possible values. With graph data, where there are no columns as such, the situation is exactly the same -- just substitute the word &lt;i&gt;predicate&lt;/i&gt; for &lt;i&gt;column.&lt;/i&gt; Space efficiency brings speed -- first by keeping more of the data in memory; secondly by having less data travel between CPU and memory. Vectoring makes sure that data that are closely located get accessed in close temporal proximity, hence improving cache utilization. When there is no locality, there are a lot of operations pending at the same time, as things always get done on a set of values instead of on a single value. This is the crux of the science of columns and vectoring.&lt;/p&gt; &lt;p&gt;Of the prior work in column stores, Virtuoso may most resemble &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x7f51d66bfc88&quot;&gt;Vertica&lt;/a&gt;, well described in &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/&quot; id=&quot;link-id0x7f5110b17b68&quot;&gt;Daniel Abadi&lt;/a&gt;’s famous &lt;a href=&quot;http://dspace.mit.edu/handle/1721.1/43043&quot; id=&quot;link-id0x7f51d68fdfc8&quot;&gt;PhD thesis&lt;/a&gt;. Virtuoso itself is described in &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x7f51d73b8f28&quot;&gt;IEEE Data Engineering Bulletin&lt;/a&gt;, &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/debu35.html&quot; id=&quot;link-id0x7f51c6705998&quot;&gt;March 2012&lt;/a&gt; (&lt;a href=&quot;http://bit.ly/166kEnC&quot; id=&quot;link-id0x7f51f0862d28&quot;&gt;PDF&lt;/a&gt;). The first experiments in column store technology with Virtuoso were in 2009, published at the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x7f50d10c3508&quot;&gt;SemData workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x7f51d73fbb98&quot;&gt;VLDB 2010&lt;/a&gt; in Singapore. We tried storing &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7f51d5f43b58&quot;&gt;TPC H&lt;/a&gt; as graph data and in relational tables, each with both rows and columns, and found that we could get 6 bytes per quad space utilization with the RDF-ization of TPC H, as opposed to 27 bytes with the row-wise compressed RDF storage model. The row-wise compression itself is 3x more compact than a row-wise representation with no compression.&lt;/p&gt; &lt;p&gt;Memory is the key to speed, and space efficiency is the key to memory. Performance comes from two factors: locality and parallelism. Both are addressed by column store technology. This made me a convert.&lt;/p&gt; &lt;p&gt;At this time, we also started the EU FP7 project, &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7f51d53489d8&quot;&gt;LOD2&lt;/a&gt;, most specifically working with &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x7f51d5ab9f18&quot;&gt;Peter Boncz&lt;/a&gt; of CWI, the king of the column store, famous for &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x7f51d5e97078&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x7f51d60bfa88&quot;&gt;VectorWise&lt;/a&gt;. This cooperation goes on within LOD2 and has extended to &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f51d5ccaad8&quot;&gt;LDBC&lt;/a&gt;, an FP7 for designing benchmarks for graph and RDF databases. Peter has given us a world of valuable insight and experience in all aspects of &lt;i&gt;avant garde&lt;/i&gt; database, from adaptive techniques to query optimization and beyond. One thing that was recently published is the &lt;a href=&quot;http://bit.ly/14ULX2F&quot; id=&quot;link-id0x7f51d69a15e8&quot;&gt;results for Virtuoso cluster at CWI&lt;/a&gt;, running analytics on 150 billion relations on CWI’s SciLens cluster.&lt;/p&gt; &lt;p&gt;The SQL relational table-oriented databases and property graph-oriented databases (Graph for short) are both rooted in relational database science. Graph management simply introduces extra challenges with regards to scalability. Hence, at OpenLink Software, having a good grounding in the best practices of relational columnar (or column-wise) database management technology is vital.&lt;/p&gt; &lt;p&gt;Virtuoso is more prominently known for high-performance RDF-based graph database technology, but the entirety of its SQL relational data management functionality (which is the foundation for graph store) is vectored, and even allows users to choose between row-wise and column-wise physical layouts, index by index.&lt;/p&gt; &lt;p&gt;It has been asked: is this a new NoSQL engine? Well, there isn’t really such a thing. There are of course database engines that do not have SQL support and it has become trendy to call them &amp;quot;NoSQL.&amp;quot; So, in this space, Virtuoso is an engine that &lt;i&gt;does&lt;/i&gt; support SQL, plus SPARQL, and is designed to do big joins and aggregation (i.e., analytics) and fast bulk load, as well as ACID transactions on small updates, all with column store space efficiency. It is not only for big scans, as people tend to think about column stores, since it can also be used in compact embedded form.&lt;/p&gt; &lt;p&gt;Virtuoso also delivers great parallelism and throughput in a scale-out setting, with no restrictions on transactions and no limits on joining. The base is in relational database science, but all the adaptations that RDF and graph workloads need are built-in, with core level support for run-time data-typing, URIs as native Reference types, user-defined custom data types, etc.&lt;/p&gt; &lt;p&gt;Now that the major milestone of releasing Virtuoso 7 (&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x7f51d6f78e88&quot;&gt;open source&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x7f5110cf58f8&quot;&gt;commercial editions&lt;/a&gt;) has been reached, the next steps include enabling our current and future customers to attain increased agility from big (linked) open data exploits. Technically, it will also include continued participation in DBMS industry benchmarks, such as those from the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f51d5088008&quot;&gt;TPC&lt;/a&gt;, and others under development via the Linked Data Benchmark Council (LDBC), plus other social-media-oriented challenges that arise in this exciting data access, integration, and management innovation continuum. Thus, continue to expect new optimization tricks to be introduced at frequent intervals through the open source development branch at &lt;a href=&quot;https://github.com/openlink/&quot; id=&quot;link-id0x7f51c4addd18&quot;&gt;GitHub&lt;/a&gt;, between major commercial releases.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Related&lt;/b&gt; &lt;/i&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://bit.ly/17oSWk9&quot; id=&quot;link-id0x7f51f0c46f18&quot;&gt;Column Store Tutorial from Peter Boncz and Daniel Abadi&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://slidesha.re/13RzSfq&quot; id=&quot;link-id0x7f511a9f1b98&quot;&gt;NewSQL vs NoSQL session by Prof. Michael Stonebraker&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bit.ly/166kEnC&quot; id=&quot;link-id0x7f51e1d85de8&quot;&gt;Virtuoso 7.0 White Paper by Orri Erling (ACM edition)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-08-21T14:17:45.353974-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 7 Release</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2013-05-13#1728</atom:id>
  <atom:published>2013-05-13T16:05:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;The quest of &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x7f51106137d8&quot;&gt;OpenLink Software&lt;/a&gt; is to bring flexibility, efficiency, and expressive power to people working with data. For the past several years, this has been focused on making graph data models viable for the enterprise. Flexibility in schema evolution is a central aspect of this, as is the ability to share identifiers across different information systems, i.e., giving things URIs instead of synthetic keys that are not interpretable outside of a particular application.&lt;/p&gt; &lt;p&gt;With &lt;a href=&quot;http://virtuoso.openlinksw.com/news/virtuoso-v7-press-release-20130423&quot; id=&quot;link-id0x7f51d7c4e7a8&quot;&gt;Virtuoso 7&lt;/a&gt;, we dramatically improve the efficiency of all this. With databases in the billions of relations (also known as triples, or 3-tuples), we can fit about 3x as many relations in the same space (disk and RAM) as with Virtuoso 6. Single-threaded query speed is up to 3x better, plus there is intra-query parallelization even in single-server configurations. Graph data workloads are all about random lookups. With these, having data in RAM is all-important. With 3x space efficiency, you can run with 3x more data in the same space before starting to go to disk. In some benchmarks, this can make a 20x gain.&lt;/p&gt; &lt;p&gt;Also the Virtuoso scale-out support is fundamentally reworked, with much more parallelism and better deployment flexibility.&lt;/p&gt; &lt;p&gt;So, for graph data, Virtuoso 7 is a major step in the coming of age of the technology. Data keeps growing and time is getting scarcer, so we need more flexibility and more performance at the same time.&lt;/p&gt; &lt;p&gt;So, let’s talk about how we accomplish this. Column stores have been the trend in relational data warehousing for over a decade. With column stores comes vectored execution, i.e., running any operation on a large number of values at one time. Instead of running one operation on one value, then the next operation on the result, and so forth, you run the first operation on thousands or hundreds-of-thousands of values, then the next one on the results of this, and so on.&lt;/p&gt; &lt;p&gt;Column-wise storage brings space efficiency, since values in one column of a table tend to be alike -- whether repeating, sorted, within a specific range, or picked from a particular set of possible values. With graph data, where there are no columns as such, the situation is exactly the same -- just substitute the word &lt;i&gt;predicate&lt;/i&gt; for &lt;i&gt;column.&lt;/i&gt; Space efficiency brings speed -- first by keeping more of the data in memory; secondly by having less data travel between CPU and memory. Vectoring makes sure that data that are closely located get accessed in close temporal proximity, hence improving cache utilization. When there is no locality, there are a lot of operations pending at the same time, as things always get done on a set of values instead of on a single value. This is the crux of the science of columns and vectoring.&lt;/p&gt; &lt;p&gt;Of the prior work in column stores, Virtuoso may most resemble &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x7f51d66bfc88&quot;&gt;Vertica&lt;/a&gt;, well described in &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/&quot; id=&quot;link-id0x7f5110b17b68&quot;&gt;Daniel Abadi&lt;/a&gt;’s famous &lt;a href=&quot;http://dspace.mit.edu/handle/1721.1/43043&quot; id=&quot;link-id0x7f51d68fdfc8&quot;&gt;PhD thesis&lt;/a&gt;. Virtuoso itself is described in &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x7f51d73b8f28&quot;&gt;IEEE Data Engineering Bulletin&lt;/a&gt;, &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/debu35.html&quot; id=&quot;link-id0x7f51c6705998&quot;&gt;March 2012&lt;/a&gt; (&lt;a href=&quot;http://bit.ly/166kEnC&quot; id=&quot;link-id0x7f50d0f31ba8&quot;&gt;PDF&lt;/a&gt;). The first experiments in column store technology with Virtuoso were in 2009, published at the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x7f50d10c3508&quot;&gt;SemData workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x7f51d73fbb98&quot;&gt;VLDB 2010&lt;/a&gt; in Singapore. We tried storing &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7f51d5f43b58&quot;&gt;TPC H&lt;/a&gt; as graph data and in relational tables, each with both rows and columns, and found that we could get 6 bytes per quad space utilization with the RDF-ization of TPC H, as opposed to 27 bytes with the row-wise compressed RDF storage model. The row-wise compression itself is 3x more compact than a row-wise representation with no compression.&lt;/p&gt; &lt;p&gt;Memory is the key to speed, and space efficiency is the key to memory. Performance comes from two factors: locality and parallelism. Both are addressed by column store technology. This made me a convert.&lt;/p&gt; &lt;p&gt;At this time, we also started the EU FP7 project, &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7f51d53489d8&quot;&gt;LOD2&lt;/a&gt;, most specifically working with &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x7f51d5ab9f18&quot;&gt;Peter Boncz&lt;/a&gt; of CWI, the king of the column store, famous for &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x7f51d5e97078&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x7f51d60bfa88&quot;&gt;VectorWise&lt;/a&gt;. This cooperation goes on within LOD2 and has extended to &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f51d5ccaad8&quot;&gt;LDBC&lt;/a&gt;, an FP7 for designing benchmarks for graph and RDF databases. Peter has given us a world of valuable insight and experience in all aspects of &lt;i&gt;avant garde&lt;/i&gt; database, from adaptive techniques to query optimization and beyond. One thing that was recently published is the &lt;a href=&quot;http://bit.ly/14ULX2F&quot; id=&quot;link-id0x7f51d69a15e8&quot;&gt;results for Virtuoso cluster at CWI&lt;/a&gt;, running analytics on 150 billion relations on CWI’s SciLens cluster.&lt;/p&gt; &lt;p&gt;The SQL relational table-oriented databases and property graph-oriented databases (Graph for short) are both rooted in relational database science. Graph management simply introduces extra challenges with regards to scalability. Hence, at OpenLink Software, having a good grounding in the best practices of relational columnar (or column-wise) database management technology is vital.&lt;/p&gt; &lt;p&gt;Virtuoso is more prominently known for high-performance RDF-based graph database technology, but the entirety of its SQL relational data management functionality (which is the foundation for graph store) is vectored, and even allows users to choose between row-wise and column-wise physical layouts, index by index.&lt;/p&gt; &lt;p&gt;It has been asked: is this a new NoSQL engine? Well, there isn’t really such a thing. There are of course database engines that do not have SQL support and it has become trendy to call them &amp;quot;NoSQL.&amp;quot; So, in this space, Virtuoso is an engine that &lt;i&gt;does&lt;/i&gt; support SQL, plus SPARQL, and is designed to do big joins and aggregation (i.e., analytics) and fast bulk load, as well as ACID transactions on small updates, all with column store space efficiency. It is not only for big scans, as people tend to think about column stores, since it can also be used in compact embedded form.&lt;/p&gt; &lt;p&gt;Virtuoso also delivers great parallelism and throughput in a scale-out setting, with no restrictions on transactions and no limits on joining. The base is in relational database science, but all the adaptations that RDF and graph workloads need are built-in, with core level support for run-time data-typing, URIs as native Reference types, user-defined custom data types, etc.&lt;/p&gt; &lt;p&gt;Now that the major milestone of releasing Virtuoso 7 (&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x7f51d6f78e88&quot;&gt;open source&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x7f5110cf58f8&quot;&gt;commercial editions&lt;/a&gt;) has been reached, the next steps include enabling our current and future customers to attain increased agility from big (linked) open data exploits. Technically, it will also include continued participation in DBMS industry benchmarks, such as those from the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f51d5088008&quot;&gt;TPC&lt;/a&gt;, and others under development via the Linked Data Benchmark Council (LDBC), plus other social-media-oriented challenges that arise in this exciting data access, integration, and management innovation continuum. Thus, continue to expect new optimization tricks to be introduced at frequent intervals through the open source development branch at &lt;a href=&quot;https://github.com/openlink/&quot; id=&quot;link-id0x7f51c4addd18&quot;&gt;GitHub&lt;/a&gt;, between major commercial releases.&lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Related&lt;/b&gt; &lt;/i&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://bit.ly/17oSWk9&quot; id=&quot;link-id0x7f51d68ac7a8&quot;&gt;Column Store Tutorial from Peter Boncz and Daniel Abadi&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://slidesha.re/13RzSfq&quot; id=&quot;link-id0x7f51d68220f8&quot;&gt;NewSQL vs NoSQL session by Prof. Michael Stonebraker&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bit.ly/166kEnC&quot; id=&quot;link-id0x7f51e27b37e8&quot;&gt;Virtuoso 7.0 White Paper by Orri Erling (ACM edition)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2013-05-13T18:52:44.000002+02:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC: A Socio-technical Perspective</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-12-03#1727</atom:id>
  <atom:published>2012-12-03T15:24:40Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;(Originally posted to &lt;a href=&quot;http://www.ldbc.eu/blog/ldbc-socio-technical-perspective&quot; id=&quot;link-id0x7f4529b06088&quot;&gt;the LDBC blog&lt;/a&gt;.)&lt;/i&gt; &lt;/p&gt; &lt;p&gt;In recent days, cyberspace has seen some discussion concerning the relationship of the EU FP7 project &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f41908e6af8&quot;&gt;LDBC (Linked Data Benchmark Council)&lt;/a&gt; and sociotechnical considerations. It has been suggested that LDBC, to its own and the community’s detriment, ignores sociotechnical aspects.&lt;/p&gt; &lt;p&gt;LDBC, as research projects go, actually has an unusually large, and as of this early date, successful and thriving sociotechnical aspect, i.e., involvement of users and vendors alike. I will here discuss why, insofar as the technical output of the project goes, sociotechnical metrics are in fact out of scope. Then yet again, to what degree the benefits potentially obtained from the use of LDBC outcomes are in fact realized does have a strong dependence on community building, a social process.&lt;/p&gt; &lt;p&gt;One criticism of big data projects we sometimes encounter is the point that data without context is not useful. Further, one cannot just assume that one can throw several data sets together and get meaning from this, as there may be different semantics for similar looking things, just think of 7 different definitions of blood pressure.&lt;/p&gt; &lt;p&gt;In its &lt;a href=&quot;http://www.ldbc.eu/events/1st-ldbc-technical-user-community-meeting&quot; id=&quot;link-id0x7f477e386598&quot;&gt;initial user community meeting&lt;/a&gt;, LDBC was, according to its charter, focusing mostly on cases where the data is already in existence and of sufficient quality for the application at hand.&lt;/p&gt; &lt;p&gt;Michael Brodie, Chief Scientist at Verizon, is a well known advocate of focusing on meaning of data, not only on processing performance. There is a piece on this matter by him, Peter Boncz, Chris Bizer, and myself on the Sigmod Record: &amp;quot;&lt;a href=&quot;http://www.sigmod.org/publications/sigmod-record/1112/pdfs/10.report.bizer.pdf&quot; id=&quot;link-id0x7f43522f8398&quot;&gt;The Meaningful Use of Big Data: Four Perspectives – Four Challenges&lt;/a&gt;&amp;quot;.&lt;/p&gt; &lt;p&gt;I had a conversation with Michael at a DERI meeting a couple of years ago about measuring the total cost of technology adoption, thus including socio-technical aspects such as acceptance by users, learning curves of various stakeholders, whether in fact one could demonstrate an overall gain in productivity arising from semantic technologies. [in my words, paraphrased] &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Can one measure the effectiveness of different approaches to data integration?&amp;quot;&lt;/i&gt; asked I. &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Of course one can,&amp;quot;&lt;/i&gt; answered Michael, &lt;i&gt;&amp;quot;this only involves carrying out the same task with two different technologies, two different teams and then doing a double blind test with users. However, this never happens. Nobody does this because doing the task even once in a large organization is enormously costly and nobody will even seriously consider doubling the expense.&amp;quot;&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;LDBC does in fact intend to address technical aspects of data integration, i.e., schema conversion, entity resolution, and the like. Addressing the sociotechnical aspects of this (whether one should integrate in the first place, whether the integration result adds value, whether it violates privacy or security concerns, whether users will understand the result, what the learning curves are, etc.) is simply too diverse and so totally domain dependent that a general purpose metric cannot be developed, at least not in the time and budget constraints of the project. Further, adding a large human element in the experimental setting (e.g., how skilled the developers are, how well the stakeholders can explain their needs, how often these needs change, etc.) will lead to experiments that are so expensive to carry out and whose results will have so many unquantifiable factors that these will constitute an insuperable barrier to adoption.&lt;/p&gt; &lt;p&gt;Experience demonstrates that even agreeing on the relative importance of quantifiable metrics of database performance is hard enough. Overreaching would compromise the project&amp;#39;s ability to deliver its core value. Let us next talk about this.&lt;/p&gt; &lt;p&gt;It is only a natural part of the political landscape that the EC&amp;#39;s research funding choices are criticized by some members of the public. Some criticism is about the emphasis on big data. Big data is a fact on the ground, and research and industry need to deal with it. Of course, there have been and will be critics of technology in general on moral or philosophical grounds. Instead of opening this topic, I will refer you to &lt;a href=&quot;http://www.michaelbrodie.com/michael_brodie_statement.asp&quot; id=&quot;link-id0x7f43528f65c8&quot;&gt;an article by Michael Brodie&lt;/a&gt;. In a world where big data is a given, lowering the entry threshold for big data applications, thus making them available not only to government agencies and the largest businesses, seems ethical to me, as per Brodie&amp;#39;s checklist. LDBC will contribute to this by driving greater availability, better performance, and lower cost for these technologies.&lt;/p&gt; &lt;p&gt;Once we accept that big data is there and is important, we arrive at the issue of deriving actionable meaning from it. A prerequisite of deriving actionable meaning from big data is the ability to flexibly process this data. LDBC is about creating metrics for this. The prerequisites for flexibly working with data are fairly independent of the specific use case, while the criteria of meaning, let alone actionable analysis, are very domain specific. Therefore, in order to provide the greatest service to the broadest constituency, LDBC focuses on measuring that which is most generic, yet will underlie any decision support or other data processing deployment that involves RDF or graph data.&lt;/p&gt; &lt;p&gt;I would say that LDBC is an exceptionally effective use of taxpayer money. LDBC will produce metrics that will drive technological innovation for years to come. The total money spent towards pursuing goals set forth by LDBC is likely to vastly exceed the budget of LDBC. Only think of the person-centuries or even millennia that have gone into optimizing for TPC-C and TPC-H. The vast majority of the money spent for these pursuits is paid by industry, not by research funding. It is spent worldwide, not in Europe alone.&lt;/p&gt; &lt;p&gt;Thus, if LDBC is successful, a limited amount of EC research money will influence how much greater product development budgets are spent in the future. This multiplier effect applies of course to highly successful research outcomes in general but is especially clear with LDBC.&lt;/p&gt; &lt;p&gt;European research funding has played a significant role in creating the foundations of the RDF/Linked Data scene. LDBC is a continuation of this policy, however the focus has now shifted to reflect the greater maturity of the technology. LDBC is now about making the RDF and graph database sectors into mature industries whose products can predictably tackle the challenges out there.&lt;/p&gt;</atom:content>
  <atom:updated>2012-12-03T16:24:40+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC: A Socio-technical Perspective</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-12-03#1726</atom:id>
  <atom:published>2012-12-03T15:23:47Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;(Originally posted to &lt;a href=&quot;http://www.ldbc.eu/blog/ldbc-socio-technical-perspective&quot; id=&quot;link-id0x7f45f274e738&quot;&gt;the LDBC blog&lt;/a&gt;.)&lt;/i&gt; &lt;/p&gt; &lt;p&gt;In recent days, cyberspace has seen some discussion concerning the relationship of the EU FP7 project &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f424b1e36b8&quot;&gt;LDBC (Linked Data Benchmark Council)&lt;/a&gt; and sociotechnical considerations. It has been suggested that LDBC, to its own and the community’s detriment, ignores sociotechnical aspects.&lt;/p&gt; &lt;p&gt;LDBC, as research projects go, actually has an unusually large, and as of this early date, successful and thriving sociotechnical aspect, i.e., involvement of users and vendors alike. I will here discuss why, insofar as the technical output of the project goes, sociotechnical metrics are in fact out of scope. Then yet again, to what degree the benefits potentially obtained from the use of LDBC outcomes are in fact realized does have a strong dependence on community building, a social process.&lt;/p&gt; &lt;p&gt;One criticism of big data projects we sometimes encounter is the point that data without context is not useful. Further, one cannot just assume that one can throw several data sets together and get meaning from this, as there may be different semantics for similar looking things, just think of 7 different definitions of blood pressure.&lt;/p&gt; &lt;p&gt;In its &lt;a href=&quot;http://www.ldbc.eu/events/1st-ldbc-technical-user-community-meeting&quot; id=&quot;link-id0x7f4588b17f58&quot;&gt;initial user community meeting&lt;/a&gt;, LDBC was, according to its charter, focusing mostly on cases where the data is already in existence and of sufficient quality for the application at hand.&lt;/p&gt; &lt;p&gt;Michael Brodie, Chief Scientist at Verizon, is a well known advocate of focusing on meaning of data, not only on processing performance. There is a piece on this matter by him, Peter Boncz, Chris Bizer, and myself on the Sigmod Record: &amp;quot;&lt;a href=&quot;http://www.sigmod.org/publications/sigmod-record/1112/pdfs/10.report.bizer.pdf&quot; id=&quot;link-id0x7f424baeba68&quot;&gt;The Meaningful Use of Big Data: Four Perspectives – Four Challenges&lt;/a&gt;&amp;quot;.&lt;/p&gt; &lt;p&gt;I had a conversation with Michael at a DERI meeting a couple of years ago about measuring the total cost of technology adoption, thus including socio-technical aspects such as acceptance by users, learning curves of various stakeholders, whether in fact one could demonstrate an overall gain in productivity arising from semantic technologies. [in my words, paraphrased] &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Can one measure the effectiveness of different approaches to data integration?&amp;quot;&lt;/i&gt; asked I. &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Of course one can,&amp;quot;&lt;/i&gt; answered Michael, &lt;i&gt;&amp;quot;this only involves carrying out the same task with two different technologies, two different teams and then doing a double blind test with users. However, this never happens. Nobody does this because doing the task even once in a large organization is enormously costly and nobody will even seriously consider doubling the expense.&amp;quot;&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;LDBC does in fact intend to address technical aspects of data integration, i.e., schema conversion, entity resolution, and the like. Addressing the sociotechnical aspects of this (whether one should integrate in the first place, whether the integration result adds value, whether it violates privacy or security concerns, whether users will understand the result, what the learning curves are, etc.) is simply too diverse and so totally domain dependent that a general purpose metric cannot be developed, at least not in the time and budget constraints of the project. Further, adding a large human element in the experimental setting (e.g., how skilled the developers are, how well the stakeholders can explain their needs, how often these needs change, etc.) will lead to experiments that are so expensive to carry out and whose results will have so many unquantifiable factors that these will constitute an insuperable barrier to adoption.&lt;/p&gt; &lt;p&gt;Experience demonstrates that even agreeing on the relative importance of quantifiable metrics of database performance is hard enough. Overreaching would compromise the project&amp;#39;s ability to deliver its core value. Let us next talk about this.&lt;/p&gt; &lt;p&gt;It is only a natural part of the political landscape that the EC&amp;#39;s research funding choices are criticized by some members of the public. Some criticism is about the emphasis on big data. Big data is a fact on the ground, and research and industry need to deal with it. Of course, there have been and will be critics of technology in general on moral or philosophical grounds. Instead of opening this topic, I will refer you to &lt;a href=&quot;http://www.michaelbrodie.com/michael_brodie_statement.asp&quot; id=&quot;link-id0x7f45f2720538&quot;&gt;an article by Michael Brodie&lt;/a&gt;. In a world where big data is a given, lowering the entry threshold for big data applications, thus making them available not only to government agencies and the largest businesses, seems ethical to me, as per Brodie&amp;#39;s checklist. LDBC will contribute to this by driving greater availability, better performance, and lower cost for these technologies.&lt;/p&gt; &lt;p&gt;Once we accept that big data is there and is important, we arrive at the issue of deriving actionable meaning from it. A prerequisite of deriving actionable meaning from big data is the ability to flexibly process this data. LDBC is about creating metrics for this. The prerequisites for flexibly working with data are fairly independent of the specific use case, while the criteria of meaning, let alone actionable analysis, are very domain specific. Therefore, in order to provide the greatest service to the broadest constituency, LDBC focuses on measuring that which is most generic, yet will underlie any decision support or other data processing deployment that involves RDF or graph data.&lt;/p&gt; &lt;p&gt;I would say that LDBC is an exceptionally effective use of taxpayer money. LDBC will produce metrics that will drive technological innovation for years to come. The total money spent towards pursuing goals set forth by LDBC is likely to vastly exceed the budget of LDBC. Only think of the person-centuries or even millennia that have gone into optimizing for TPC-C and TPC-H. The vast majority of the money spent for these pursuits is paid by industry, not by research funding. It is spent worldwide, not in Europe alone.&lt;/p&gt; &lt;p&gt;Thus, if LDBC is successful, a limited amount of EC research money will influence how much greater product development budgets are spent in the future. This multiplier effect applies of course to highly successful research outcomes in general but is especially clear with LDBC.&lt;/p&gt; &lt;p&gt;European research funding has played a significant role in creating the foundations of the RDF/Linked Data scene. LDBC is a continuation of this policy, however the focus has now shifted to reflect the greater maturity of the technology. LDBC is now about making the RDF and graph database sectors into mature industries whose products can predictably tackle the challenges out there.&lt;/p&gt;</atom:content>
  <atom:updated>2012-12-03T16:23:47+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC - the Linked Data Benchmark Council</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-11-28#1725</atom:id>
  <atom:published>2012-11-28T17:08:37Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;(This posting was inadvertently delayed from the time of its writing, 2012-11-21.)&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f4780561218&quot;&gt;Linked Data Benchmark Council (LDBC)&lt;/a&gt; project is officially starting now.&lt;/p&gt; &lt;p&gt;This represents a serious effort towards making relevant and well thought out &lt;a href=&quot;http://dbpedia.org/page/Software_metric&quot; id=&quot;link-id0x7f46086bb908&quot;&gt;metrics&lt;/a&gt; for &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x7f4750f49728&quot;&gt;RDF&lt;/a&gt; and graph databases and defining protocols for measurement and publishing of well documented and reproducible results. This also entails the creation of a &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f47805a1838&quot;&gt;TPC&lt;/a&gt;-analog for the graph and RDF domains.&lt;/p&gt; &lt;p&gt;The project brings together leading vendors, with &lt;a href=&quot;http://dbpedia.org/page/OpenLink_Software&quot; id=&quot;link-id0x7f47801c9ce8&quot;&gt;OpenLink&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Ontotext&quot; id=&quot;link-id0x7f478059b2f8&quot;&gt;Ontotext&lt;/a&gt; representing the RDF side and &lt;a href=&quot;http://dbpedia.org/resource/Neo_Technology&quot; id=&quot;link-id0x7f47813a0968&quot;&gt;Neo Technology&lt;/a&gt; and &lt;a href=&quot;http://www.sparsity-technologies.com/&quot; id=&quot;link-id0x7f4780128c48&quot;&gt;Sparsity Technologies&lt;/a&gt; representing the graph database side. &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x7f47808001c8&quot;&gt;Peter Boncz&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x7f4629543fc8&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x7f47800f84d8&quot;&gt;Vectorwise&lt;/a&gt; fame is the technical director, with participation from the &lt;a href=&quot;http://dbpedia.org/page/Technical_University_Munich&quot; id=&quot;link-id0x7f47812e0108&quot;&gt;Technical University of Munich&lt;/a&gt; with &lt;a href=&quot;http://www-db.in.tum.de/~neumann/&quot; id=&quot;link-id0x7f4780428808&quot;&gt;Thomas Neumann&lt;/a&gt;, known for &lt;a href=&quot;http://code.google.com/p/rdf3x/&quot; id=&quot;link-id0x7f478218ae38&quot;&gt;RDF3X&lt;/a&gt; and &lt;a href=&quot;http://www-db.in.tum.de/research/projects/HyPer/&quot; id=&quot;link-id0x7f47805eceb8&quot;&gt;HyPer&lt;/a&gt;. &lt;a href=&quot;http://dbpedia.org/page/Polytechnic_University_of_Catalonia&quot; id=&quot;link-id0x7f46295754c8&quot;&gt;La Universitat Politècnica de Catalunya&lt;/a&gt; coordinates the project and brings strong academic expertise in graph databasing, also representing their Sparsity Technologies spinoff. &lt;a href=&quot;http://www.forth.gr/&quot; id=&quot;link-id0x7f47805857e8&quot;&gt;FORTH (Foundation for Research and Technology - Hellas) of Crete&lt;/a&gt; contributes expertise in data integration and provenance. &lt;a href=&quot;http://www.sti-innsbruck.at/&quot; id=&quot;link-id0x7f47804aee08&quot;&gt;STI Innsbruck&lt;/a&gt; participates in community building and outreach.&lt;/p&gt; &lt;p&gt;The consortium has second-to-none understanding of benchmarking and has sufficient time allotted to the task for producing world class work, comparable to the TPC benchmarks. This has to date never been realized in the RDF or graph space.&lt;/p&gt; &lt;p&gt;History demonstrates that whenever something that is sufficiently important starts getting systematically measured, there is an improvement in the metric. The early days of the TPC saw a 40-fold increase in transaction processing speed. TPC-H continues to be, after 18 years, well used as a basis of quantifying advances in analytics databases.&lt;/p&gt; &lt;p&gt;A serious initiative for well-thought-out benchmarks for guiding the emerging RDF and graph database markets is nothing short of a necessary precondition for the emergence of a serious market with several vendors offering mutually comparable products.&lt;/p&gt; &lt;p&gt;Benchmarks are only as good as their credibility and adoption. For this reason, LDBC has been in touch with all graph and RDF vendors we could find, and has received a positive statement of intent from most, indicating that they would participate in a LDBC organization and contribute to shaping benchmarks.&lt;/p&gt; &lt;p&gt;There is further a Technical User Community, with its initial meeting this week, where present-day end users of RDF and graph databases will voice their wishes for benchmark development. Thus benchmarks will be grounded in use cases contributed by real users.&lt;/p&gt; &lt;p&gt;With these elements in place we have every reason to expect relevant benchmarks with broad adoption, with all the benefits this entails.&lt;/p&gt;</atom:content>
  <atom:updated>2012-11-28T18:08:37+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC - the Linked Data Benchmark Council</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-11-28#1724</atom:id>
  <atom:published>2012-11-28T17:06:19Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;(This posting was inadvertently delayed from the time of its writing, 2012-11-21.)&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://www.ldbc.eu&quot; id=&quot;link-id0x7f465a65c618&quot;&gt;Linked Data Benchmark Council (LDBC)&lt;/a&gt; project is officially starting now.&lt;/p&gt; &lt;p&gt;This represents a serious effort towards making relevant and well thought out &lt;a href=&quot;http://dbpedia.org/page/Software_metric&quot; id=&quot;link-id0x7f4659a35e78&quot;&gt;metrics&lt;/a&gt; for &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x7f4629429a48&quot;&gt;RDF&lt;/a&gt; and graph databases and defining protocols for measurement and publishing of well documented and reproducible results. This also entails the creation of a &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f4629510fb8&quot;&gt;TPC&lt;/a&gt;-analog for the graph and RDF domains.&lt;/p&gt; &lt;p&gt;The project brings together leading vendors, with &lt;a href=&quot;http://dbpedia.org/page/OpenLink_Software&quot; id=&quot;link-id0x7f465999de58&quot;&gt;OpenLink&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Ontotext&quot; id=&quot;link-id0x7f46294e3c68&quot;&gt;Ontotext&lt;/a&gt; representing the RDF side and &lt;a href=&quot;http://dbpedia.org/resource/Neo_Technology&quot; id=&quot;link-id0x7f4659a03e38&quot;&gt;Neo Technology&lt;/a&gt; and &lt;a href=&quot;http://www.sparsity-technologies.com/&quot; id=&quot;link-id0x7f46295bb358&quot;&gt;Sparsity Technologies&lt;/a&gt; representing the graph database side. &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x7f4629362188&quot;&gt;Peter Boncz&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/page/MonetDB&quot; id=&quot;link-id0x7f462931ee08&quot;&gt;MonetDB&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/Vectorwise&quot; id=&quot;link-id0x7f4776358078&quot;&gt;Vectorwise&lt;/a&gt; fame is the technical director, with participation from the &lt;a href=&quot;http://dbpedia.org/page/Technical_University_Munich&quot; id=&quot;link-id0x7f465aa2aef8&quot;&gt;Technical University of Munich&lt;/a&gt; with &lt;a href=&quot;http://www-db.in.tum.de/~neumann/&quot; id=&quot;link-id0x7f4658d62378&quot;&gt;Thomas Neumann&lt;/a&gt;, known for &lt;a href=&quot;http://code.google.com/p/rdf3x/&quot; id=&quot;link-id0x7f465a4a9f98&quot;&gt;RDF3X&lt;/a&gt; and &lt;a href=&quot;http://www-db.in.tum.de/research/projects/HyPer/&quot; id=&quot;link-id0x7f465a1ce1f8&quot;&gt;HyPer&lt;/a&gt;. &lt;a href=&quot;http://dbpedia.org/page/Polytechnic_University_of_Catalonia&quot; id=&quot;link-id0x7f462945d2d8&quot;&gt;La Universitat Politècnica de Catalunya&lt;/a&gt; coordinates the project and brings strong academic expertise in graph databasing, also representing their Sparsity Technologies spinoff. &lt;a href=&quot;http://www.forth.gr/&quot; id=&quot;link-id0x7f476266ce78&quot;&gt;FORTH (Foundation for Research and Technology - Hellas) of Crete&lt;/a&gt; contributes expertise in data integration and provenance. &lt;a href=&quot;http://www.sti-innsbruck.at/&quot; id=&quot;link-id0x7f47624ae5f8&quot;&gt;STI Innsbruck&lt;/a&gt; participates in community building and outreach.&lt;/p&gt; &lt;p&gt;The consortium has second-to-none understanding of benchmarking and has sufficient time allotted to the task for producing world class work, comparable to the TPC benchmarks. This has to date never been realized in the RDF or graph space.&lt;/p&gt; &lt;p&gt;History demonstrates that whenever something that is sufficiently important starts getting systematically measured, there is an improvement in the metric. The early days of the TPC saw a 40-fold increase in transaction processing speed. TPC-H continues to be, after 18 years, well used as a basis of quantifying advances in analytics databases.&lt;/p&gt; &lt;p&gt;A serious initiative for well-thought-out benchmarks for guiding the emerging RDF and graph database markets is nothing short of a necessary precondition for the emergence of a serious market with several vendors offering mutually comparable products.&lt;/p&gt; &lt;p&gt;Benchmarks are only as good as their credibility and adoption. For this reason, LDBC has been in touch with all graph and RDF vendors we could find, and has received a positive statement of intent from most, indicating that they would participate in a LDBC organization and contribute to shaping benchmarks.&lt;/p&gt; &lt;p&gt;There is further a Technical User Community, with its initial meeting this week, where present-day end users of RDF and graph databases will voice their wishes for benchmark development. Thus benchmarks will be grounded in use cases contributed by real users.&lt;/p&gt; &lt;p&gt;With these elements in place we have every reason to expect relevant benchmarks with broad adoption, with all the benefits this entails.&lt;/p&gt;</atom:content>
  <atom:updated>2012-11-28T18:06:19.000007+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC Technical User Community Meeting</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-11-27#1721</atom:id>
  <atom:published>2012-11-27T22:18:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f4740087de8&quot;&gt;LDBC&lt;/a&gt; Technical User Community (TUC) had &lt;a href=&quot;http://www.ldbc.eu/events/1st-ldbc-technical-user-community-meeting&quot; id=&quot;link-id0x7f47800d4b48&quot;&gt;its initial meeting&lt;/a&gt; in Barcelona last week.&lt;/p&gt; &lt;p&gt;First we wish to thank the many end user organizations that were present. This clearly validates the project&amp;#39;s mission and demonstrates that there is acute awareness of the need for better metrics in the field. In the following, I will summarize the requirements that were brought forth.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Scale out&lt;/b&gt; - There was near unanimity among users that even if present workloads could be handled on single servers, a scale-out growth path was highly desirable. On the other hand, some applications were scale-out based from the get go. Even when not actually used, a scale-out capability is felt to be an insurance against future need.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Making limits explicit&lt;/b&gt; - How far can this technology go? &lt;a href=&quot;http://dbpedia.org/page/Benchmark_%28computing%29&quot; id=&quot;link-id0x7f4748067b58&quot;&gt;Benchmarks&lt;/a&gt; need to demonstrate at what scales the products being considered work best, and where they will grind to a halt. Also, the impact of scale-out on performance needs to be made clear. The cost of solutions at different scales must be made explicit.&lt;/p&gt; &lt;p&gt;Many of these requirements will be met by simply following &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f4751c0fa08&quot;&gt;TPC&lt;/a&gt; practices. Now, vendors cannot be expected to publish numbers for cases where their products fail, but they do have incentives for publishing numbers on large data, and at least giving a price/performance point that exceeds most user needs.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Fault tolerance and operational characteristics&lt;/b&gt; - Present day benchmarks (e.g., the TPC ones) hardly address operational aspects that most enterprise deployments will encounter. This was already stated by &lt;a href=&quot;http://dbpedia.org/page/Michael_Stonebraker&quot; id=&quot;link-id0x7f47800d5a98&quot;&gt;Michael Stonebraker&lt;/a&gt; at the first TPC performance evaluation workshop some years back at &lt;a href=&quot;http://www.vldb.org/archives/website/2009/&quot; id=&quot;link-id0x7f4748066bd8&quot;&gt;VLDB in Lyon&lt;/a&gt;. Users want to know the price/performance impact of making fault-tolerant systems and wish to have metrics for things like backup and bulk load under online conditions. A need to operate across multiple geographies was present in more than one use case, thus requiring a degree of asynchronous replication such as log shipping.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Update-intensive workloads&lt;/b&gt; - Unlike one might think, &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x7f4782546868&quot;&gt;RDF&lt;/a&gt; uses are not primarily load-once-plus-lookup. Freshness of data creates value, and databases, even if they are warehouses in character, need to be kept up to date much better than just by periodic reload. Online updates may be small, as for example refreshing news feeds or web crawls, where the unit of update is small but updates are many, but also replacing reference data sets of hundreds of millions of triples. The latter requirement exceeds what is practical in a single transaction. &lt;a href=&quot;http://dbpedia.org/page/ACID&quot; id=&quot;link-id0x7f4740070db8&quot;&gt;ACID&lt;/a&gt; was generally desired, with some interest also in eventual consistency. We did not get use cases with much repeatable read (e.g., updating account balances), but rather atomic and durable replacement of sets of statements.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Inference&lt;/b&gt; - Class and property hierarchies were common, followed by use of transitivity. &lt;code&gt;&lt;a href=&quot;http://www.w3.org/TR/owl2-overview/&quot; id=&quot;link-id0x7f47480c5b48&quot;&gt;owl:sameAs&lt;/a&gt;&lt;/code&gt; was not in much use, being &lt;a href=&quot;http://events.linkeddata.org/ldow2010/papers/ldow2010_paper09.pdf&quot; id=&quot;link-id0x7f474007a198&quot;&gt;too dangerous&lt;/a&gt;, i.e., a single statement may potentially have huge effect and produce unpredictable sets of properties for instances, for which applications are not prepared. Beyond these, the wishes for inference, with use cases ranging from medicine to forensics, were outside of the OWL domain. These typically involved probability scores adding up the joint occurrence of complex criteria with some numeric computation (e.g. time intervals, geography, etc.).&lt;/p&gt; &lt;p&gt;As materialization of forward closure is the prevalent mode of implementing inference in RDF, users wished to have a measure of its cost in space and time, especially under online-update loads.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Text, XML, and Geospatial&lt;/b&gt; - There is no online application that does not have text search. In publishing, this is hardly ever provided by an RDF store, even if there is one in the mix. Even so, there is an understandable desire to consolidate systems, i.e., to not have an XML database for content and a separate RDF database for metadata. Also, many applications have a geospatial element. One wish was to combine XPATH/XQuery with SPARQL, and it was implied that query optimization should create good plans under these conditions.&lt;/p&gt; &lt;p&gt;There was extensive discussion especially on benchmarking full-text. Such a benchmark would need to address the quality of relevance ranking. Doing new work in this space is clearly out of scope for LDBC, but an IR benchmark could be reused as an add-on to provide a quality score. The performance score would come from the LDBC side of the benchmark. Now, many of the applications of text (e.g., news) might not even sort on text match score, but rather by time. Also if the text search is applied to metadata like labels or URI strings, the quality of a match is a non-issue, as there is no document context.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data integration&lt;/b&gt; - Almost all applications had some element of data integration. Indeed, if one uses RDF in the first place, the motivation usually has to do with schema flexibility. Having a relational schema for everything is often seen to be too hard to maintain and to lead to too much development time before an initial version of an application or answer of a business question. Data integration is everywhere but stays elusive for benchmarking. Every time it is different and most vendors present do not offer &lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x7f4728113608&quot;&gt;products for this specific need&lt;/a&gt;. Many ideas were presented, including using SPARQL for entity resolution, and for checking consistency of an integration result.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;A central issue of benchmark design is having an understandable &lt;a href=&quot;http://dbpedia.org/page/Software_metric&quot; id=&quot;link-id0x7f47280fac58&quot;&gt;metric&lt;/a&gt;. People cannot make sense of more than a few figures. The TPC practice of throughput at scale and price per unit of throughput at scale is a successful example. However, it may be difficult to agree on relative weights of components if a metric is an aggregate of too many things. Also, if a benchmark has too many optional parts, metrics easily become too complicated. On the other hand, requiring too many features (e.g. XML, full text, geospatial) restricts the number of possible participants.&lt;/p&gt; &lt;p&gt;To stimulate innovation, a benchmark needs to be difficult but restricted to a specific domain. &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7f47400b3ad8&quot;&gt;TPC-H&lt;/a&gt; is a good example, favoring specialized systems built for analytics alone. To be a predictor of total cost and performance in a complex application, a benchmark must include much more functionality, and will favor general purpose systems that do many things but are not necessarily outstanding in any single aspect.&lt;/p&gt; &lt;p&gt;After 1-1/2 days with users, the project team met to discuss actual benchmark task forces to be started. The conclusion was that work would initially proceed around two use cases: publishing, and social networks. The present use of RDF by the &lt;a href=&quot;http://dbpedia.org/page/BBC&quot; id=&quot;link-id0x7f478009ee38&quot;&gt;BBC&lt;/a&gt; and the &lt;a href=&quot;http://dbpedia.org/page/Press_Association&quot; id=&quot;link-id0x7f478014c998&quot;&gt;Press Association&lt;/a&gt; provides the background scenario for the publishing benchmark, and the work carried out around the &lt;a href=&quot;http://sourceforge.net/projects/sibenchmark/&quot; id=&quot;link-id0x7f47480ae1d8&quot;&gt;Social Intelligence Benchmark (SIB)&lt;/a&gt; in &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7f4780f71458&quot;&gt;LOD2&lt;/a&gt; will provide a starting point for the social network benchmark. Additionally, user scenarios from the &lt;a href=&quot;http://dbpedia.org/page/DEX_%28Graph_database%29&quot; id=&quot;link-id0x7f47400704e8&quot;&gt;DEX graph database&lt;/a&gt; user base will help shape the SN workload.&lt;/p&gt; &lt;p&gt;A data integration task force needs more clarification, but work in this direction is in progress.&lt;/p&gt; &lt;p&gt;In practice, driving progress needs well-focused benchmarks with special trick questions intended to stress specific aspects of a database engine. Providing an overall perspective on cost and online operations needs a broad mix of features to be covered.&lt;/p&gt; These needs will be reconciled by having many metrics inside a single use case, i.e., a social network data set can be used for transactional updates, for lookup queries, for graph analytics, and for TPC-H style business intelligence questions, especially if integrated with another more-relational dataset. Thus there will be a mix of metrics, from transactions to analytics, with single and multiuser workloads. Whether these are packaged as separate benchmarks, or as optional sections of one, remains to be seen.</atom:content>
  <atom:updated>2012-11-27T23:18:24+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LDBC Technical User Community Meeting</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-11-27#1720</atom:id>
  <atom:published>2012-11-27T22:17:48Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.ldbc.eu/&quot; id=&quot;link-id0x7f4740087de8&quot;&gt;LDBC&lt;/a&gt; Technical User Community (TUC) had &lt;a href=&quot;http://www.ldbc.eu/events/1st-ldbc-technical-user-community-meeting&quot; id=&quot;link-id0x7f47800d4b48&quot;&gt;its initial meeting&lt;/a&gt; in Barcelona last week.&lt;/p&gt; &lt;p&gt;First we wish to thank the many end user organizations that were present. This clearly validates the project&amp;#39;s mission and demonstrates that there is acute awareness of the need for better metrics in the field. In the following, I will summarize the requirements that were brought forth.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Scale out&lt;/b&gt; - There was near unanimity among users that even if present workloads could be handled on single servers, a scale-out growth path was highly desirable. On the other hand, some applications were scale-out based from the get go. Even when not actually used, a scale-out capability is felt to be an insurance against future need.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Making limits explicit&lt;/b&gt; - How far can this technology go? &lt;a href=&quot;http://dbpedia.org/page/Benchmark_%28computing%29&quot; id=&quot;link-id0x7f4748067b58&quot;&gt;Benchmarks&lt;/a&gt; need to demonstrate at what scales the products being considered work best, and where they will grind to a halt. Also, the impact of scale-out on performance needs to be made clear. The cost of solutions at different scales must be made explicit.&lt;/p&gt; &lt;p&gt;Many of these requirements will be met by simply following &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7f4751c0fa08&quot;&gt;TPC&lt;/a&gt; practices. Now, vendors cannot be expected to publish numbers for cases where their products fail, but they do have incentives for publishing numbers on large data, and at least giving a price/performance point that exceeds most user needs.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Fault tolerance and operational characteristics&lt;/b&gt; - Present day benchmarks (e.g., the TPC ones) hardly address operational aspects that most enterprise deployments will encounter. This was already stated by &lt;a href=&quot;http://dbpedia.org/page/Michael_Stonebraker&quot; id=&quot;link-id0x7f47800d5a98&quot;&gt;Michael Stonebraker&lt;/a&gt; at the first TPC performance evaluation workshop some years back at &lt;a href=&quot;http://www.vldb.org/archives/website/2009/&quot; id=&quot;link-id0x7f4748066bd8&quot;&gt;VLDB in Lyon&lt;/a&gt;. Users want to know the price/performance impact of making fault-tolerant systems and wish to have metrics for things like backup and bulk load under online conditions. A need to operate across multiple geographies was present in more than one use case, thus requiring a degree of asynchronous replication such as log shipping.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Update-intensive workloads&lt;/b&gt; - Unlike one might think, &lt;a href=&quot;http://dbpedia.org/page/Resource_Description_Framework&quot; id=&quot;link-id0x7f4782546868&quot;&gt;RDF&lt;/a&gt; uses are not primarily load-once-plus-lookup. Freshness of data creates value, and databases, even if they are warehouses in character, need to be kept up to date much better than just by periodic reload. Online updates may be small, as for example refreshing news feeds or web crawls, where the unit of update is small but updates are many, but also replacing reference data sets of hundreds of millions of triples. The latter requirement exceeds what is practical in a single transaction. &lt;a href=&quot;http://dbpedia.org/page/ACID&quot; id=&quot;link-id0x7f4740070db8&quot;&gt;ACID&lt;/a&gt; was generally desired, with some interest also in eventual consistency. We did not get use cases with much repeatable read (e.g., updating account balances), but rather atomic and durable replacement of sets of statements.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Inference&lt;/b&gt; - Class and property hierarchies were common, followed by use of transitivity. &lt;code&gt;&lt;a href=&quot;http://www.w3.org/TR/owl2-overview/&quot; id=&quot;link-id0x7f47480c5b48&quot;&gt;owl:sameAs&lt;/a&gt;&lt;/code&gt; was not in much use, being &lt;a href=&quot;http://events.linkeddata.org/ldow2010/papers/ldow2010_paper09.pdf&quot; id=&quot;link-id0x7f474007a198&quot;&gt;too dangerous&lt;/a&gt;, i.e., a single statement may potentially have huge effect and produce unpredictable sets of properties for instances, for which applications are not prepared. Beyond these, the wishes for inference, with use cases ranging from medicine to forensics, were outside of the OWL domain. These typically involved probability scores adding up the joint occurrence of complex criteria with some numeric computation (e.g. time intervals, geography, etc.).&lt;/p&gt; &lt;p&gt;As materialization of forward closure is the prevalent mode of implementing inference in RDF, users wished to have a measure of its cost in space and time, especially under online-update loads.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Text, XML, and Geospatial&lt;/b&gt; - There is no online application that does not have text search. In publishing, this is hardly ever provided by an RDF store, even if there is one in the mix. Even so, there is an understandable desire to consolidate systems, i.e., to not have an XML database for content and a separate RDF database for metadata. Also, many applications have a geospatial element. One wish was to combine XPATH/XQuery with SPARQL, and it was implied that query optimization should create good plans under these conditions.&lt;/p&gt; &lt;p&gt;There was extensive discussion especially on benchmarking full-text. Such a benchmark would need to address the quality of relevance ranking. Doing new work in this space is clearly out of scope for LDBC, but an IR benchmark could be reused as an add-on to provide a quality score. The performance score would come from the LDBC side of the benchmark. Now, many of the applications of text (e.g., news) might not even sort on text match score, but rather by time. Also if the text search is applied to metadata like labels or URI strings, the quality of a match is a non-issue, as there is no document context.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data integration&lt;/b&gt; - Almost all applications had some element of data integration. Indeed, if one uses RDF in the first place, the motivation usually has to do with schema flexibility. Having a relational schema for everything is often seen to be too hard to maintain and to lead to too much development time before an initial version of an application or answer of a business question. Data integration is everywhere but stays elusive for benchmarking. Every time it is different and most vendors present do not offer &lt;a href=&quot;http://virtuoso.openlinksw.com/middleware/&quot; id=&quot;link-id0x7f4728113608&quot;&gt;products for this specific need&lt;/a&gt;. Many ideas were presented, including using SPARQL for entity resolution, and for checking consistency of an integration result.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;A central issue of benchmark design is having an understandable &lt;a href=&quot;http://dbpedia.org/page/Software_metric&quot; id=&quot;link-id0x7f47280fac58&quot;&gt;metric&lt;/a&gt;. People cannot make sense of more than a few figures. The TPC practice of throughput at scale and price per unit of throughput at scale is a successful example. However, it may be difficult to agree on relative weights of components if a metric is an aggregate of too many things. Also, if a benchmark has too many optional parts, metrics easily become too complicated. On the other hand, requiring too many features (e.g. XML, full text, geospatial) restricts the number of possible participants.&lt;/p&gt; &lt;p&gt;To stimulate innovation, a benchmark needs to be difficult but restricted to a specific domain. &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x7f47400b3ad8&quot;&gt;TPC-H&lt;/a&gt; is a good example, favoring specialized systems built for analytics alone. To be a predictor of total cost and performance in a complex application, a benchmark must include much more functionality, and will favor general purpose systems that do many things but are not necessarily outstanding in any single aspect.&lt;/p&gt; &lt;p&gt;After 1-1/2 days with users, the project team met to discuss actual benchmark task forces to be started. The conclusion was that work would initially proceed around two use cases: publishing, and social networks. The present use of RDF by the &lt;a href=&quot;http://dbpedia.org/page/BBC&quot; id=&quot;link-id0x7f478009ee38&quot;&gt;BBC&lt;/a&gt; and the &lt;a href=&quot;http://dbpedia.org/page/Press_Association&quot; id=&quot;link-id0x7f478014c998&quot;&gt;Press Association&lt;/a&gt; provides the background scenario for the publishing benchmark, and the work carried out around the &lt;a href=&quot;http://sourceforge.net/projects/sibenchmark/&quot; id=&quot;link-id0x7f47480ae1d8&quot;&gt;Social Intelligence Benchmark (SIB)&lt;/a&gt; in &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7f4780f71458&quot;&gt;LOD2&lt;/a&gt; will provide a starting point for the social network benchmark. Additionally, user scenarios from the &lt;a href=&quot;http://dbpedia.org/page/DEX_%28Graph_database%29&quot; id=&quot;link-id0x7f47400704e8&quot;&gt;DEX graph database&lt;/a&gt; user base will help shape the SN workload.&lt;/p&gt; &lt;p&gt;A data integration task force needs more clarification, but work in this direction is in progress.&lt;/p&gt; &lt;p&gt;In practice, driving progress needs well-focused benchmarks with special trick questions intended to stress specific aspects of a database engine. Providing an overall perspective on cost and online operations needs a broad mix of features to be covered.&lt;/p&gt; These needs will be reconciled by having many metrics inside a single use case, i.e., a social network data set can be used for transactional updates, for lookup queries, for graph analytics, and for TPC-H style business intelligence questions, especially if integrated with another more-relational dataset. Thus there will be a mix of metrics, from transactions to analytics, with single and multiuser workloads. Whether these are packaged as separate benchmarks, or as optional sections of one, remains to be seen.</atom:content>
  <atom:updated>2012-11-27T23:17:48+01:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Developer Recruitment Exercise</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-08-16#1719</atom:id>
  <atom:published>2012-08-16T19:28:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;The specification of the exercise referred to in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1717&quot; id=&quot;link-id0x1bc4d790&quot;&gt;the previous post&lt;/a&gt; may be found below.&lt;/p&gt; &lt;p&gt;Questions on the exercise can be sent to &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=2012-08%20Virtuoso%20Developer%20Exercise&quot; id=&quot;link-id0x1cb00cc0&quot;&gt;the email specified in the previous post&lt;/a&gt;. I may schedule a phone call to answer questions based on the initial email contact.&lt;/p&gt; &lt;p&gt;We seek to have all applicants complete the exercise before October 1.&lt;/p&gt; &lt;h2&gt;General&lt;/h2&gt; &lt;p&gt;The exercise consists of implementing a part of the &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x1c158760&quot;&gt;TPC-C&lt;/a&gt; workload in memory, in &lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id0x1b38bec0&quot;&gt;&lt;code&gt;C&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/page/C++&quot; id=&quot;link-id0x1119e720&quot;&gt;&lt;code&gt;C++&lt;/code&gt;&lt;/a&gt;. TPC-C is the long-time industry standard benchmark for transaction processing performance. We use this as a starting point for an exercise for assessing developer skill level in writing heavily multithreaded, performance-critical code.&lt;/p&gt; &lt;p&gt;The application performs a series of transactions against an in-memory database, encountering lock contention and occasional deadlocks. The application needs to provide atomicity, consistency, and isolation for transactions. The task consists of writing the low-level data structures for storing the memory-resident database and for managing concurrency, including lock queueing, deadlock detection, and commit/rollback. The solutions are evaluated based on their actual measured multithreaded performance on commodity servers, e.g., 8- or 12-cores of Intel Xeon.&lt;/p&gt; &lt;p&gt;OpenLink provides the code for data generation and driving the test. This is part of the TPC-C kit in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x1be9fab8&quot;&gt;Virtuoso Open Source&lt;/a&gt;. The task is to replace the SQL API calls with equivalent in-process function calls against the in-memory database developed as part of the exercise.&lt;/p&gt; &lt;h2&gt;Rules&lt;/h2&gt; &lt;p&gt;We are aware that the best solution to the problem may be running transactions single-threaded against in-memory hash tables without any concurrency control. The application data may be partitioned so that a single transaction can be in most cases assigned to a partition, which it will get for itself for the few microseconds it takes to do its job. &lt;b&gt;For this exercise, this solution is explicitly ruled out.&lt;/b&gt; The application must demonstrate shared access to data, with a transaction holding multiple concurrent locks and being liable to deadlock.&lt;/p&gt; &lt;p&gt;TPC-C can be written so as to avoid deadlocks by always locking in a certain order. &lt;b&gt;This is also expressly prohibited;&lt;/b&gt; in specific, the stock rows of a new order transaction must be locked in the order they are specified in the invocation. In application terms this makes no sense, but for purposes of the exercise this will serve as a natural source of deadlocks.&lt;/p&gt; &lt;h2&gt;Parameters&lt;/h2&gt; &lt;p&gt;The application needs to offer an interactive or scripted interface (command line is OK) which provides the following operations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Clear and initialize a database of n warehouses.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run &lt;i&gt;n&lt;/i&gt; threads, each doing &lt;i&gt;m&lt;/i&gt; new order transactions. Each thread has a home warehouse and occasionally accesses other warehouse&amp;#39;s data. This reports the real time elapsed and the number of retries arising from deadlocks. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Check the consistency between the &lt;code&gt;stock&lt;/code&gt;, &lt;code&gt;orders&lt;/code&gt;, and &lt;code&gt;order_line&lt;/code&gt; data structures.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Report system status such as clocks spent waiting for specific mutexes. This is supplied as part of the OpenLink library used by the data generator.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Data Structures&lt;/h2&gt; &lt;p&gt;The transactions are written as &lt;code&gt;C&lt;/code&gt; functions. The data is represented as &lt;code&gt;C&lt;/code&gt; structs, and tree indices or hash tables are used for value-based access to the structures by key. The application has no persistent storage. The structures reference each other by the key values as in the database, so no direct pointers. The key values are to be translated into pointers with a hash table or other index-like structure.&lt;/p&gt; &lt;p&gt;The application must be thread-safe, and transactions must be able to roll back. Transactions will sometimes wait for each other in updating shared resources such as stock or district or warehouse balances. The application must be written so as to implement fine-grained locking, and each transaction must be able to hold multiple locks. The application must be able to detect deadlocks. For deadlock recovery, it is acceptable to abort the transaction that detects the deadlock.&lt;/p&gt; &lt;p&gt; &lt;code&gt;C++&lt;/code&gt; template libraries may be used but one must pay attention to their efficiency.&lt;/p&gt; &lt;p&gt;The new order transaction is the only required transaction.&lt;/p&gt; &lt;p&gt;All numbers can be represented as integers. This holds equally for key columns as for monetary amounts.&lt;/p&gt; &lt;p&gt;All index structures (e.g., hash tables) in the application must be thread safe, so that an insert would be safe with concurrent access or concurrent inserts. This holds also for index structures for tables which do not get inserts in the test (e.g. item, customer, stock, etc.).&lt;/p&gt; &lt;p&gt;A sequence object must not be used for assigning new values to the &lt;code&gt;O_ID&lt;/code&gt; column of &lt;code&gt;ORDERS&lt;/code&gt;. These values must come from the &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; column of the &lt;code&gt;DISTRICT&lt;/code&gt; table. If a new order transaction rolls back, its update of &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; is also rolled back. This causes &lt;code&gt;O_ID&lt;/code&gt; values to always be consecutive within a district.&lt;/p&gt; &lt;h2&gt;TPC-C Functionality&lt;/h2&gt; &lt;p&gt;The application must implement the TPC-C new order transaction in full. This must not avoid deadlocks by ordering locking on stock rows. See the rules section.&lt;/p&gt; &lt;p&gt;The transaction must have the semantics specified in TPC-C, except for durability.&lt;/p&gt; &lt;h2&gt;Supporting Files&lt;/h2&gt; &lt;p&gt;The test driver calling the transaction procedures is in &lt;code&gt;tpccodbc.c&lt;/code&gt;. This can be reused so as to call the transaction procedure in process instead of the ODBC exec.&lt;/p&gt; &lt;p&gt;The user interface may be a command line menu with run options for different numbers of transactions with different thread counts and an option for integrity check.&lt;/p&gt; &lt;p&gt;The integrity check consists of verifying &lt;code&gt;s_cnt_order&lt;/code&gt; against the orders and checking that &lt;code&gt;max (O_ID)&lt;/code&gt; and &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; match within each district.&lt;/p&gt; &lt;p&gt;Running the application should give different statistics such as CPU%, cumulative time spent waiting for locks, etc. The &lt;code&gt;rdtsc&lt;/code&gt; instruction can be used for getting clock counts for timing.&lt;/p&gt; &lt;h2&gt;Points to Note&lt;/h2&gt; &lt;p&gt;This section summarizes some of the design patterns and coding tricks we expect to see in a solution to the exercise. These may seem self-evident to some, but experience indicates that this is not universally so.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;The TPC-C transaction profile for new order specifies a semantics for the operation. The order of locking is left to the implementation as long as the semantics are in effect. The application will be tested with many clients on the same warehouse, running as fast as they can. So lock contention is expected. Therefore, the transaction should be written so as to acquire the locks with the greatest contention as late as possible. No locks need be acquired for the item table since none of the transactions will update it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;For implementing locks, using a mutex to serialize access to application resources is not enough. Many locks will be acquired by each transaction, in an unpredictable order. Unless explicit queueing for locks is implemented with deadlock detection, the application will not work.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;If waiting for a mutex causes the operating system to stop a thread, even when there are cores free, the latency is multiple microseconds, even if the mutex is released by its owner on the next cycle after the waiting thread is suspended. This will destroy any benefit from parallelism unless one is very careful. Programmers do not seem to instinctively know this.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Therefore any structure to which access must be serialized (e.g. hash tables, locks, etc.) needs to be protected by a mutex but must be partitioned so that there are tens or hundreds of mutexes depending on which section of the structure one is accessing.&lt;/p&gt; &lt;p&gt;Submissions that protect a hash table or other index-like structure for a whole application table with a single mutex or &lt;code&gt;rw&lt;/code&gt; lock will be discarded off the bat.&lt;/p&gt; &lt;p&gt;Even while using many mutexes, one must hold them for a minimum of time. When accessing a hash table, do the invariant parts first; acquire the mutex after that. For example, if you calculate the hash number after acquiring the mutex for the hash table, the submission will be rejected.&lt;/p&gt; &lt;p&gt;The TPC-C application has some local and some scattered access. Orders are local, and stock and item lines are scattered. When doing scattered memory accesses, the program should be written so that the CPU will, from a single thread, have multiple concurrent cache misses in flight at all times. So, when accessing 10 stock lines, calculate the hash numbers first; then access the memory, deferring any branches based on the accessed values. In this way, out of order execution will miss the CPU cache for many independent addresses in parallel. One can use the gcc &lt;code&gt;__builtin_prefetch&lt;/code&gt; primitive, or simply write the program so as to have mutually data-independent memory accesses in close proximity.&lt;/p&gt; &lt;p&gt;For detecting deadlocks, a global transaction wait graph may have to be maintained. This will need to be maintained in a serialized manner. If many threads access this, the accesses must be serialized on a global mutex. This may be very bad if the deadlock detection takes a long time. Alternately, the wait graph may be maintained on another thread. The thread will get notices of waits and transacts from worker threads with some delay. Having spotted a cycle, it may kill one or another party. This will require some inter-thread communication. The submission may address this matter in any number of ways.&lt;/p&gt; &lt;p&gt;However, just acquiring a lock without wait must not involve getting a global mutex. Going to wait will have to do so, were it only for queueing a notice to a monitor thread. Using a socket-to-self might appear to circumvent this, but the communication stack will have mutexes inside so this is no better.&lt;/p&gt; &lt;h2&gt;Evaluation Criteria&lt;/h2&gt; &lt;p&gt;The exercise will be evaluated based on the run time performance, especially multicore scalability of the result.&lt;/p&gt; &lt;p&gt;Extra points are not given for implementing interfaces or for being object oriented. Interfaces, templates, and objects are not forbidden as such, but their cost must not exceed the difference between getting an address from a virtual table and calling a function directly.&lt;/p&gt; &lt;p&gt;The locking implementation must be correct. It can be limited to exclusive locks and need not support isolation other than &lt;code&gt;repeatable read&lt;/code&gt;. Running the application must demonstrate deadlocks and working recovery from these.&lt;/p&gt; &lt;h2&gt;Code and Libraries To Be Used&lt;/h2&gt; &lt;p&gt;The TPC-C data generator and test driver are in the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSGIT&quot; id=&quot;link-id0x1be07088&quot;&gt;Virtuoso Open Source distribution&lt;/a&gt;, in the files &lt;code&gt;binsrc/tests/tpcc*.c&lt;/code&gt; and files included from these. You can make the exercise in the same directory and just alter the files or make script. The application is standalone and has no other relation to the Virtuoso code. The &lt;code&gt;libsrc/Thread&lt;/code&gt; threading wrappers may be used. If not using these, make a wrapper similar to &lt;code&gt;mutex_enter&lt;/code&gt; when &lt;code&gt;MTX_METER&lt;/code&gt; is defined so that it counts the waits and clocks spent during wait. Also have a report like that in &lt;code&gt;mutex_stat()&lt;/code&gt; for the mutex wait frequency and duration.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-21T14:24:58.140364-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Developer Recruitment Exercise</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-08-16#1718</atom:id>
  <atom:published>2012-08-16T19:26:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;The specification of the exercise referred to in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1714&quot; id=&quot;link-id0x2c0160c8&quot;&gt;the previous post&lt;/a&gt; may be found below.&lt;/p&gt; &lt;p&gt;Questions on the exercise can be sent to &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=2012-08%20Virtuoso%20Developer%20Exercise&quot; id=&quot;link-id0x2a668288&quot;&gt;the email specified in the previous post&lt;/a&gt;. I may schedule a phone call to answer questions based on the initial email contact.&lt;/p&gt; &lt;p&gt;We seek to have all applicants complete the exercise before October 1.&lt;/p&gt; &lt;h2&gt;General&lt;/h2&gt; &lt;p&gt;The exercise consists of implementing a part of the &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x2bbe9040&quot;&gt;TPC-C&lt;/a&gt; workload in memory, in &lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id0x2a660ea0&quot;&gt;&lt;code&gt;C&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/page/C++&quot; id=&quot;link-id0x29c29db0&quot;&gt;&lt;code&gt;C++&lt;/code&gt;&lt;/a&gt;. TPC-C is the long-time industry standard benchmark for transaction processing performance. We use this as a starting point for an exercise for assessing developer skill level in writing heavily multithreaded, performance-critical code.&lt;/p&gt; &lt;p&gt;The application performs a series of transactions against an in-memory database, encountering lock contention and occasional deadlocks. The application needs to provide atomicity, consistency, and isolation for transactions. The task consists of writing the low-level data structures for storing the memory-resident database and for managing concurrency, including lock queueing, deadlock detection, and commit/rollback. The solutions are evaluated based on their actual measured multithreaded performance on commodity servers, e.g., 8- or 12-cores of Intel Xeon.&lt;/p&gt; &lt;p&gt;OpenLink provides the code for data generation and driving the test. This is part of the TPC-C kit in &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSIndex&quot; id=&quot;link-id0x2bf5dac8&quot;&gt;Virtuoso Open Source&lt;/a&gt;. The task is to replace the SQL API calls with equivalent in-process function calls against the in-memory database developed as part of the exercise.&lt;/p&gt; &lt;h2&gt;Rules&lt;/h2&gt; &lt;p&gt;We are aware that the best solution to the problem may be running transactions single-threaded against in-memory hash tables without any concurrency control. The application data may be partitioned so that a single transaction can be in most cases assigned to a partition, which it will get for itself for the few microseconds it takes to do its job. &lt;b&gt;For this exercise, this solution is explicitly ruled out.&lt;/b&gt; The application must demonstrate shared access to data, with a transaction holding multiple concurrent locks and being liable to deadlock.&lt;/p&gt; &lt;p&gt;TPC-C can be written so as to avoid deadlocks by always locking in a certain order. &lt;b&gt;This is also expressly prohibited;&lt;/b&gt; in specific, the stock rows of a new order transaction must be locked in the order they are specified in the invocation. In application terms this makes no sense, but for purposes of the exercise this will serve as a natural source of deadlocks.&lt;/p&gt; &lt;h2&gt;Parameters&lt;/h2&gt; &lt;p&gt;The application needs to offer an interactive or scripted interface (command line is OK) which provides the following operations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Clear and initialize a database of n warehouses.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run &lt;i&gt;n&lt;/i&gt; threads, each doing &lt;i&gt;m&lt;/i&gt; new order transactions. Each thread has a home warehouse and occasionally accesses other warehouse&amp;#39;s data. This reports the real time elapsed and the number of retries arising from deadlocks. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Check the consistency between the &lt;code&gt;stock&lt;/code&gt;, &lt;code&gt;orders&lt;/code&gt;, and &lt;code&gt;order_line&lt;/code&gt; data structures.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Report system status such as clocks spent waiting for specific mutexes. This is supplied as part of the OpenLink library used by the data generator.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Data Structures&lt;/h2&gt; &lt;p&gt;The transactions are written as &lt;code&gt;C&lt;/code&gt; functions. The data is represented as &lt;code&gt;C&lt;/code&gt; structs, and tree indices or hash tables are used for value-based access to the structures by key. The application has no persistent storage. The structures reference each other by the key values as in the database, so no direct pointers. The key values are to be translated into pointers with a hash table or other index-like structure.&lt;/p&gt; &lt;p&gt;The application must be thread-safe, and transactions must be able to roll back. Transactions will sometimes wait for each other in updating shared resources such as stock or district or warehouse balances. The application must be written so as to implement fine-grained locking, and each transaction must be able to hold multiple locks. The application must be able to detect deadlocks. For deadlock recovery, it is acceptable to abort the transaction that detects the deadlock.&lt;/p&gt; &lt;p&gt; &lt;code&gt;C++&lt;/code&gt; template libraries may be used but one must pay attention to their efficiency.&lt;/p&gt; &lt;p&gt;The new order transaction is the only required transaction.&lt;/p&gt; &lt;p&gt;All numbers can be represented as integers. This holds equally for key columns as for monetary amounts.&lt;/p&gt; &lt;p&gt;All index structures (e.g., hash tables) in the application must be thread safe, so that an insert would be safe with concurrent access or concurrent inserts. This holds also for index structures for tables which do not get inserts in the test (e.g. item, customer, stock, etc.).&lt;/p&gt; &lt;p&gt;A sequence object must not be used for assigning new values to the &lt;code&gt;O_ID&lt;/code&gt; column of &lt;code&gt;ORDERS&lt;/code&gt;. These values must come from the &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; column of the &lt;code&gt;DISTRICT&lt;/code&gt; table. If a new order transaction rolls back, its update of &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; is also rolled back. This causes &lt;code&gt;O_ID&lt;/code&gt; values to always be consecutive within a district.&lt;/p&gt; &lt;h2&gt;TPC-C Functionality&lt;/h2&gt; &lt;p&gt;The application must implement the TPC-C new order transaction in full. This must not avoid deadlocks by ordering locking on stock rows. See the rules section.&lt;/p&gt; &lt;p&gt;The transaction must have the semantics specified in TPC-C, except for durability.&lt;/p&gt; &lt;h2&gt;Supporting Files&lt;/h2&gt; &lt;p&gt;The test driver calling the transaction procedures is in &lt;code&gt;tpccodbc.c&lt;/code&gt;. This can be reused so as to call the transaction procedure in process instead of the ODBC exec.&lt;/p&gt; &lt;p&gt;The user interface may be a command line menu with run options for different numbers of transactions with different thread counts and an option for integrity check.&lt;/p&gt; &lt;p&gt;The integrity check consists of verifying &lt;code&gt;s_cnt_order&lt;/code&gt; against the orders and checking that &lt;code&gt;max (O_ID)&lt;/code&gt; and &lt;code&gt;D_NEXT_O_ID&lt;/code&gt; match within each district.&lt;/p&gt; &lt;p&gt;Running the application should give different statistics such as CPU%, cumulative time spent waiting for locks, etc. The &lt;code&gt;rdtsc&lt;/code&gt; instruction can be used for getting clock counts for timing.&lt;/p&gt; &lt;h2&gt;Points to Note&lt;/h2&gt; &lt;p&gt;This section summarizes some of the design patterns and coding tricks we expect to see in a solution to the exercise. These may seem self-evident to some, but experience indicates that this is not universally so.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;The TPC-C transaction profile for new order specifies a semantics for the operation. The order of locking is left to the implementation as long as the semantics are in effect. The application will be tested with many clients on the same warehouse, running as fast as they can. So lock contention is expected. Therefore, the transaction should be written so as to acquire the locks with the greatest contention as late as possible. No locks need be acquired for the item table since none of the transactions will update it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;For implementing locks, using a mutex to serialize access to application resources is not enough. Many locks will be acquired by each transaction, in an unpredictable order. Unless explicit queueing for locks is implemented with deadlock detection, the application will not work.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;If waiting for a mutex causes the operating system to stop a thread, even when there are cores free, the latency is multiple microseconds, even if the mutex is released by its owner on the next cycle after the waiting thread is suspended. This will destroy any benefit from parallelism unless one is very careful. Programmers do not seem to instinctively know this.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Therefore any structure to which access must be serialized (e.g. hash tables, locks, etc.) needs to be protected by a mutex but must be partitioned so that there are tens or hundreds of mutexes depending on which section of the structure one is accessing.&lt;/p&gt; &lt;p&gt;Submissions that protect a hash table or other index-like structure for a whole application table with a single mutex or &lt;code&gt;rw&lt;/code&gt; lock will be discarded off the bat.&lt;/p&gt; &lt;p&gt;Even while using many mutexes, one must hold them for a minimum of time. When accessing a hash table, do the invariant parts first; acquire the mutex after that. For example, if you calculate the hash number after acquiring the mutex for the hash table, the submission will be rejected.&lt;/p&gt; &lt;p&gt;The TPC-C application has some local and some scattered access. Orders are local, and stock and item lines are scattered. When doing scattered memory accesses, the program should be written so that the CPU will, from a single thread, have multiple concurrent cache misses in flight at all times. So, when accessing 10 stock lines, calculate the hash numbers first; then access the memory, deferring any branches based on the accessed values. In this way, out of order execution will miss the CPU cache for many independent addresses in parallel. One can use the gcc &lt;code&gt;__builtin_prefetch&lt;/code&gt; primitive, or simply write the program so as to have mutually data-independent memory accesses in close proximity.&lt;/p&gt; &lt;p&gt;For detecting deadlocks, a global transaction wait graph may have to be maintained. This will need to be maintained in a serialized manner. If many threads access this, the accesses must be serialized on a global mutex. This may be very bad if the deadlock detection takes a long time. Alternately, the wait graph may be maintained on another thread. The thread will get notices of waits and transacts from worker threads with some delay. Having spotted a cycle, it may kill one or another party. This will require some inter-thread communication. The submission may address this matter in any number of ways.&lt;/p&gt; &lt;p&gt;However, just acquiring a lock without wait must not involve getting a global mutex. Going to wait will have to do so, were it only for queueing a notice to a monitor thread. Using a socket-to-self might appear to circumvent this, but the communication stack will have mutexes inside so this is no better.&lt;/p&gt; &lt;h2&gt;Evaluation Criteria&lt;/h2&gt; &lt;p&gt;The exercise will be evaluated based on the run time performance, especially multicore scalability of the result.&lt;/p&gt; &lt;p&gt;Extra points are not given for implementing interfaces or for being object oriented. Interfaces, templates, and objects are not forbidden as such, but their cost must not exceed the difference between getting an address from a virtual table and calling a function directly.&lt;/p&gt; &lt;p&gt;The locking implementation must be correct. It can be limited to exclusive locks and need not support isolation other than &lt;code&gt;repeatable read&lt;/code&gt;. Running the application must demonstrate deadlocks and working recovery from these.&lt;/p&gt; &lt;h2&gt;Code and Libraries To Be Used&lt;/h2&gt; &lt;p&gt;The TPC-C data generator and test driver are in the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSGIT&quot; id=&quot;link-id0x2b5bd6b8&quot;&gt;Virtuoso Open Source distribution&lt;/a&gt;, in the files &lt;code&gt;binsrc/tests/tpcc*.c&lt;/code&gt; and files included from these. You can make the exercise in the same directory and just alter the files or make script. The application is standalone and has no other relation to the Virtuoso code. The &lt;code&gt;libsrc/Thread&lt;/code&gt; threading wrappers may be used. If not using these, make a wrapper similar to &lt;code&gt;mutex_enter&lt;/code&gt; when &lt;code&gt;MTX_METER&lt;/code&gt; is defined so that it counts the waits and clocks spent during wait. Also have a report like that in &lt;code&gt;mutex_stat()&lt;/code&gt; for the mutex wait frequency and duration.&lt;/p&gt;</atom:content>
  <atom:updated>2012-08-16T15:26:37.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Developer Opportunities at OpenLink Software</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-08-07#1717</atom:id>
  <atom:published>2012-08-07T17:21:52Z</atom:published>
  <atom:content type="html">&lt;p&gt;If it is advanced database technology, you will get to do it with us.&lt;/p&gt; &lt;p&gt;We are looking for exceptional talent to implement some of the hardest stuff in the industry. This ranges from new approaches to query optimization; to parallel execution (both scale up and scale out); to elastic cloud deployments and self-managing, self-tuning, fault-tolerant databases. We are most familiar to the RDF world, but also have full SQL support, and the present work will serve both use cases equally.&lt;/p&gt; &lt;p&gt;We are best known in the realms of high-performance database connectivity middleware and massively-scalable Linked-Data-oriented graph-model DBMS technology.&lt;/p&gt; &lt;p&gt;We have the basics -- SQL and SPARQL, column store, vectored execution, cost based optimization, parallel execution (local and cluster), and so forth. In short, we have everything you would expect from a DBMS. We do transactions as well as analytics, but the greater challenges at present are on the analytics side.&lt;/p&gt; &lt;p&gt;You will be working with my team covering:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Adaptive query optimization -- interleaving execution and optimization, so as to always make the correct plan choices based on actual data characteristics&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Self-managing cloud deployments for elastic big data -- clusters that can grow themselves and redistribute load, recover from failures, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Developing and analyzing new benchmarks for RDF and graph databases&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Embedding complex geospatial reasoning inside the database engine. We have the basic R-tree and the OGC geometry data types; now we need to go beyond this&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Every type of SQL optimizer and execution engine trick that serves to optimize for TPC-H and DS.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What do I mean by really good? It boils down to being a smart and fast programmer. We have over the years talked to people, including many who have worked on DBMS programming, and found that they actually know next to nothing of database science. For example, they might not know what a hash join is. Or they might not know that interprocess latency is in the tens of microseconds even within one box, and that in that time one can do tens of index lookups. Or they might not know that blocking on a mutex kills.&lt;/p&gt; &lt;p&gt;If you do core database work, we want you to know how many CPU cache misses you will have in flight at any point of the algorithm, and how many clocks will be spent waiting for them at what points. Same for distributed execution: The only way a cluster can perform is having max messages with max payload per message in flight at all times.&lt;/p&gt; &lt;p&gt;These are things that can be learned. So I do not necessarily expect that you have in-depth experience of these, especially since most developer jobs are concerned with something else. You may have to unlearn the bad habit of putting interfaces where they do not belong, for example. Or to learn that if there is an interface, then it must pass as much data as possible in one go.&lt;/p&gt; &lt;p&gt;Talent is the key. You need to be a self-starter with a passion for technology and have competitive drive. These can be found in many guises, so we place very few limits on the rest. If you show you can learn and code fast, we don&amp;#39;t necessarily care about academic or career histories. You can be located anywhere in the world, and you can work from home. There may be some travel but not very much.&lt;/p&gt; &lt;p&gt;In the context of &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7719ea0&quot;&gt;EU FP7 projects&lt;/a&gt;, we are working with some of the best minds in database, including &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x21d67d80&quot;&gt;Peter Boncz&lt;/a&gt; of CWI and VU Amsterdam (MonetDB, VectorWise) and &lt;a href=&quot;http://www.mpi-inf.mpg.de/~neumann/&quot; id=&quot;link-id0x2192d900&quot;&gt;Thomas Neumann&lt;/a&gt; of Technical University of Munich (RDF3X, HYPER). This is an extra guarantee that you will be working on the most relevant problems in database, informed by the results of the very best work to date.&lt;/p&gt; &lt;p&gt;For more background, please see the IEEE Computer Society &lt;i&gt;Bulletin of the Technical Committee on Data Engineering,&lt;/i&gt; &lt;a href=&quot;http://sites.computer.org/debull/A12mar/issue1.htm&quot; id=&quot;link-id0x7ca1d20&quot;&gt;Special Issue on Column Store Systems&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;All articles and references therein are relevant for the job. Be sure to read the CWI work on run time optimization (ROX), cracking, and recycling. Do not miss the many papers on architecture-conscious, cache-optimized algorithms; see the VectorWise and MonetDB articles in the bulletin for extensive references.&lt;/p&gt; &lt;p&gt;If you are interested in an opportunity with us, we will ask you to do a little exercise in multithreaded, performance-critical coding, to be detailed in a blog post in a few days. If you have done similar work in research or industry, we can substitute the exercise with a suitable sample of this, but only if this is core database code.&lt;/p&gt; &lt;p&gt;There is a dual message: The challenges will be the toughest a very tough race can offer. On the other hand, I do not want to scare you away prematurely. Nobody knows this stuff, except for the handful of people who actually do core database work. So we are not limiting this call to this small crowd and will teach you on the job if you just come with an aptitude to think in algorithms and code fast. Experience has pros and cons so we do not put formal bounds on this. &amp;quot;Just out of high school&amp;quot; may be good enough, if you are otherwise exceptional. Prior work in RDF or semantic web is not a factor. Sponsorship of your M.Sc. or Ph.D. thesis, if the topic is in our line of work and implementation can be done in our environment, is a further possibility. Seasoned pros are also welcome and will know the nature of the gig from the reading list.&lt;/p&gt; &lt;p&gt;We are aiming to fill the position(s) between now and October.&lt;/p&gt; &lt;p&gt;Resumes and inquiries can be sent to Hugh Williams, &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=2012-08%20Virtuoso%20Developer%20Application&quot; id=&quot;link-id0x5dc1ac0&quot;&gt;hwilliams@openlinksw.com&lt;/a&gt;. We will contact applicants for interviews.&lt;/p&gt;</atom:content>
  <atom:updated>2012-08-07T13:21:52.000005-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Developer Opportunities at OpenLink Software</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-08-07#1716</atom:id>
  <atom:published>2012-08-07T17:21:29Z</atom:published>
  <atom:content type="html">&lt;p&gt;If it is advanced database technology, you will get to do it with us.&lt;/p&gt; &lt;p&gt;We are looking for exceptional talent to implement some of the hardest stuff in the industry. This ranges from new approaches to query optimization; to parallel execution (both scale up and scale out); to elastic cloud deployments and self-managing, self-tuning, fault-tolerant databases. We are most familiar to the RDF world, but also have full SQL support, and the present work will serve both use cases equally.&lt;/p&gt; &lt;p&gt;We are best known in the realms of high-performance database connectivity middleware and massively-scalable Linked-Data-oriented graph-model DBMS technology.&lt;/p&gt; &lt;p&gt;We have the basics -- SQL and SPARQL, column store, vectored execution, cost based optimization, parallel execution (local and cluster), and so forth. In short, we have everything you would expect from a DBMS. We do transactions as well as analytics, but the greater challenges at present are on the analytics side.&lt;/p&gt; &lt;p&gt;You will be working with my team covering:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Adaptive query optimization -- interleaving execution and optimization, so as to always make the correct plan choices based on actual data characteristics&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Self-managing cloud deployments for elastic big data -- clusters that can grow themselves and redistribute load, recover from failures, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Developing and analyzing new benchmarks for RDF and graph databases&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Embedding complex geospatial reasoning inside the database engine. We have the basic R-tree and the OGC geometry data types; now we need to go beyond this&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Every type of SQL optimizer and execution engine trick that serves to optimize for TPC-H and DS.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What do I mean by really good? It boils down to being a smart and fast programmer. We have over the years talked to people, including many who have worked on DBMS programming, and found that they actually know next to nothing of database science. For example, they might not know what a hash join is. Or they might not know that interprocess latency is in the tens of microseconds even within one box, and that in that time one can do tens of index lookups. Or they might not know that blocking on a mutex kills.&lt;/p&gt; &lt;p&gt;If you do core database work, we want you to know how many CPU cache misses you will have in flight at any point of the algorithm, and how many clocks will be spent waiting for them at what points. Same for distributed execution: The only way a cluster can perform is having max messages with max payload per message in flight at all times.&lt;/p&gt; &lt;p&gt;These are things that can be learned. So I do not necessarily expect that you have in-depth experience of these, especially since most developer jobs are concerned with something else. You may have to unlearn the bad habit of putting interfaces where they do not belong, for example. Or to learn that if there is an interface, then it must pass as much data as possible in one go.&lt;/p&gt; &lt;p&gt;Talent is the key. You need to be a self-starter with a passion for technology and have competitive drive. These can be found in many guises, so we place very few limits on the rest. If you show you can learn and code fast, we don&amp;#39;t necessarily care about academic or career histories. You can be located anywhere in the world, and you can work from home. There may be some travel but not very much.&lt;/p&gt; &lt;p&gt;In the context of &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x7719ea0&quot;&gt;EU FP7 projects&lt;/a&gt;, we are working with some of the best minds in database, including &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x21d67d80&quot;&gt;Peter Boncz&lt;/a&gt; of CWI and VU Amsterdam (MonetDB, VectorWise) and &lt;a href=&quot;http://www.mpi-inf.mpg.de/~neumann/&quot; id=&quot;link-id0x2192d900&quot;&gt;Thomas Neumann&lt;/a&gt; of Technical University of Munich (RDF3X, HYPER). This is an extra guarantee that you will be working on the most relevant problems in database, informed by the results of the very best work to date.&lt;/p&gt; &lt;p&gt;For more background, please see the IEEE Computer Society &lt;i&gt;Bulletin of the Technical Committee on Data Engineering,&lt;/i&gt; &lt;a href=&quot;http://sites.computer.org/debull/A12mar/issue1.htm&quot; id=&quot;link-id0x7ca1d20&quot;&gt;Special Issue on Column Store Systems&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;All articles and references therein are relevant for the job. Be sure to read the CWI work on run time optimization (ROX), cracking, and recycling. Do not miss the many papers on architecture-conscious, cache-optimized algorithms; see the VectorWise and MonetDB articles in the bulletin for extensive references.&lt;/p&gt; &lt;p&gt;If you are interested in an opportunity with us, we will ask you to do a little exercise in multithreaded, performance-critical coding, to be detailed in a blog post in a few days. If you have done similar work in research or industry, we can substitute the exercise with a suitable sample of this, but only if this is core database code.&lt;/p&gt; &lt;p&gt;There is a dual message: The challenges will be the toughest a very tough race can offer. On the other hand, I do not want to scare you away prematurely. Nobody knows this stuff, except for the handful of people who actually do core database work. So we are not limiting this call to this small crowd and will teach you on the job if you just come with an aptitude to think in algorithms and code fast. Experience has pros and cons so we do not put formal bounds on this. &amp;quot;Just out of high school&amp;quot; may be good enough, if you are otherwise exceptional. Prior work in RDF or semantic web is not a factor. Sponsorship of your M.Sc. or Ph.D. thesis, if the topic is in our line of work and implementation can be done in our environment, is a further possibility. Seasoned pros are also welcome and will know the nature of the gig from the reading list.&lt;/p&gt; &lt;p&gt;We are aiming to fill the position(s) between now and October.&lt;/p&gt; &lt;p&gt;Resumes and inquiries can be sent to Hugh Williams, &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=2012-08%20Virtuoso%20Developer%20Application&quot; id=&quot;link-id0x5dc1ac0&quot;&gt;hwilliams@openlinksw.com&lt;/a&gt;. We will contact applicants for interviews.&lt;/p&gt;</atom:content>
  <atom:updated>2012-08-07T13:21:29-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>IEEE publication of ?Virtuoso, a Hybrid RDBMS/Graph Column Store?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-23#1715</atom:id>
  <atom:published>2012-04-23T14:55:31Z</atom:published>
  <atom:content type="html">&lt;p&gt;My article, &lt;b&gt;&lt;i&gt;Virtuoso, a Hybrid RDBMS/Graph Column Store&lt;/i&gt;&lt;/b&gt; (&lt;a href=&quot;http://sites.computer.org/debull/A12mar/vicol.pdf&quot; id=&quot;link-id0x1f456350&quot;&gt;PDF&lt;/a&gt;), can be found in &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/debu35.html&quot; id=&quot;link-id0x8bf15d8&quot;&gt;Volume 35, Number 1, March 2012&lt;/a&gt; (&lt;a href=&quot;http://sites.computer.org/debull/A12mar/A12MAR-CD.pdf&quot; id=&quot;link-id0x20adffb8&quot;&gt;PDF&lt;/a&gt;) of the &lt;i&gt;&lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x1e133b50&quot;&gt;Bulletin&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/IEEE_Computer_Society&quot; id=&quot;link-id0x1f46c998&quot;&gt;IEEE Computer Society&lt;/a&gt; &lt;a href=&quot;http://tab.computer.org/tcde/&quot; id=&quot;link-id0x1c3fce40&quot;&gt;Technical Committee on Data Engineering&lt;/a&gt;&lt;/i&gt; (also known as the &lt;i&gt;&lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x17d03718&quot;&gt;IEEE Data Engineering Bulletin&lt;/a&gt;)&lt;/i&gt;. &lt;/p&gt; &lt;p&gt; &lt;b&gt;Abstract:&lt;/b&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;We discuss applying column store techniques to both graph (RDF) and relational data for mixed workloads ranging from lookup to analytics in the context of the OpenLink Virtuoso DBMS. In so doing, we need to obtain the excellent memory efficiency, locality and bulk read throughput that are the hallmark of column stores while retaining low-latency random reads and updates, under serializable isolation.&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;b&gt;DBLP BibTeX Record &amp;#39;journals/debu/Erling12&amp;#39;&lt;/b&gt; (&lt;a href=&quot;http://dblp.uni-trier.de/rec/bibtex/journals/debu/Erling12.xml&quot; id=&quot;link-id0x20356268&quot;&gt;XML&lt;/a&gt;)&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;tt&gt;@article{DBLP:journals/debu/Erling12, author = {Orri Erling}, title = {Virtuoso, a Hybrid RDBMS/Graph Column Store}, journal = {IEEE Data Eng. Bull.}, volume = {35}, number = {1}, year = {2012}, pages = {3-8}, ee = {http://sites.computer.org/debull/A12mar/vicol.pdf}, bibsource = {DBLP, http://dblp.uni-trier.de} } &lt;/tt&gt; &lt;/pre&gt;&lt;/blockquote&gt;</atom:content>
  <atom:updated>2012-04-23T10:55:31-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>IEEE publication of ?Virtuoso, a Hybrid RDBMS/Graph Column Store?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-23#1714</atom:id>
  <atom:published>2012-04-23T14:55:17Z</atom:published>
  <atom:content type="html">&lt;p&gt;My article, &lt;b&gt;&lt;i&gt;Virtuoso, a Hybrid RDBMS/Graph Column Store&lt;/i&gt;&lt;/b&gt; (&lt;a href=&quot;http://sites.computer.org/debull/A12mar/vicol.pdf&quot; id=&quot;link-id0x1f456350&quot;&gt;PDF&lt;/a&gt;), can be found in &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/debu35.html&quot; id=&quot;link-id0x8bf15d8&quot;&gt;Volume 35, Number 1, March 2012&lt;/a&gt; (&lt;a href=&quot;http://sites.computer.org/debull/A12mar/A12MAR-CD.pdf&quot; id=&quot;link-id0x20adffb8&quot;&gt;PDF&lt;/a&gt;) of the &lt;i&gt;&lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x1e133b50&quot;&gt;Bulletin&lt;/a&gt; of the &lt;a href=&quot;http://dbpedia.org/resource/IEEE_Computer_Society&quot; id=&quot;link-id0x1f46c998&quot;&gt;IEEE Computer Society&lt;/a&gt; &lt;a href=&quot;http://tab.computer.org/tcde/&quot; id=&quot;link-id0x1c3fce40&quot;&gt;Technical Committee on Data Engineering&lt;/a&gt;&lt;/i&gt; (also known as the &lt;i&gt;&lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/journals/debu/index.html&quot; id=&quot;link-id0x17d03718&quot;&gt;IEEE Data Engineering Bulletin&lt;/a&gt;)&lt;/i&gt;. &lt;/p&gt; &lt;p&gt; &lt;b&gt;Abstract:&lt;/b&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;We discuss applying column store techniques to both graph (RDF) and relational data for mixed workloads ranging from lookup to analytics in the context of the OpenLink Virtuoso DBMS. In so doing, we need to obtain the excellent memory efficiency, locality and bulk read throughput that are the hallmark of column stores while retaining low-latency random reads and updates, under serializable isolation.&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;b&gt;DBLP BibTeX Record &amp;#39;journals/debu/Erling12&amp;#39;&lt;/b&gt; (&lt;a href=&quot;http://dblp.uni-trier.de/rec/bibtex/journals/debu/Erling12.xml&quot; id=&quot;link-id0x20356268&quot;&gt;XML&lt;/a&gt;)&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;tt&gt;@article{DBLP:journals/debu/Erling12, author = {Orri Erling}, title = {Virtuoso, a Hybrid RDBMS/Graph Column Store}, journal = {IEEE Data Eng. Bull.}, volume = {35}, number = {1}, year = {2012}, pages = {3-8}, ee = {http://sites.computer.org/debull/A12mar/vicol.pdf}, bibsource = {DBLP, http://dblp.uni-trier.de} } &lt;/tt&gt; &lt;/pre&gt;&lt;/blockquote&gt;</atom:content>
  <atom:updated>2012-04-23T10:55:17.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 6 of 6) - Science Data Panel</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1713</atom:id>
  <atom:published>2012-04-17T19:38:20Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2015-08-21T15:47:03.467938-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 5 of 6) - Graphs</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1712</atom:id>
  <atom:published>2012-04-17T19:38:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;There were quite a few talks about graphs at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d23c70&quot;&gt;ICDE 2012&lt;/a&gt;. Neither the representations of graphs, nor the differences between RDF and generic graph models, entered much into the discussion. On the other hand, graph similarity searches and related were addressed a fair bit.&lt;/p&gt; &lt;p&gt;Graph DB and RDF/Linked Data are distinct, if neighboring disciplines. On one hand, graph problems predate Linked Data, and the RDF/Linked Data world is a web artifact, which graphs are not as such, so a slightly different cultural derivation also makes these disjoint. Besides, graphs may imply schema first whereas linked data basically cannot. Then another differentiation might be derived from edges not really being first class citizens in RDF, except for reification, at which the RDF reification vocabulary is miserably inadequate, as pointed out before.&lt;/p&gt; &lt;p&gt;RDF is being driven by the web-style publishing of Linked Open Data (LOD), with some standardization and uptake by publishers; Graph DB is not standardized but driven by diverse graph-analytics use cases.&lt;/p&gt; &lt;p&gt;There is no necessary reason why these could not converge, but it will be indefinitely long before any standards come to cover this, so best not hold one&amp;#39;s breath. Communities are jealous of their borders, so if the neighbor does something similar one tends to emphasize the differences and not the commonalities.&lt;/p&gt; &lt;p&gt;So for some things, one could warehouse the original RDF of the web microformats and LOD, and then ETL into some other graph model for specific tasks, or just do these in RDF. Of course, then RDF systems need to offer suitable capabilities. These seem to be about very fast edge traversal within a rather local working set, and about accommodating large, iteratively-updated intermediate results, e.g., edge weights.&lt;/p&gt; &lt;p&gt;Judging by the benchmarks paper (&lt;i&gt;Benchmarking traversal operations over graph databases (&lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/Slides/Ciglan.pptx&quot; class=&quot;absuri&quot; id=&quot;link-id0x26e6cc68&quot;&gt;Slidedeck (ppt)&lt;/a&gt;, &lt;a href=&quot;http://ups.savba.sk/~marek/papers/gdm12-ciglan.pdf&quot; class=&quot;absuri&quot; id=&quot;link-id0x28545128&quot;&gt;paper (pdf)&lt;/a&gt;);&lt;/i&gt; Marek Ciglan, Alex Averbuch, and Ladialav Hluchy.) at the &lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/index.html&quot; class=&quot;absuri&quot; id=&quot;link-id0x26b17d70&quot;&gt;GDM workshop&lt;/a&gt;, the state of benchmarking in graph databases is even worse than in RDF, where the state is bad enough. The paper&amp;#39;s premise was flawed to start, using application logic to do &lt;tt&gt;JOIN&lt;/tt&gt;s instead of doing them in the DBMS. In this way, latency comes to dominate, and only the most blatant differences are seen. There is nothing like this style of benchmarking to make an industry look bad. The supercomputer Graph 500 benchmark, on the other hand, lets the contestants make their own implementations on a diversity of architectures with random traversal as well as loading and generating large intermediate results. It is somewhat limited, but still broader than the the graph database benchmarks paper at the GDM workshop.&lt;/p&gt; &lt;p&gt; Returning to graphs, there were some papers on similarity search and clique detection. As players in this space, beyond just RDF, we might as well consider implementing necessary features for efficient expression of such problems. The algorithms discussed were expressed in procedural code against memory-based data structures; there is usually no query language or parallel/distributed processing involved.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; class=&quot;absuri&quot; id=&quot;link-id0x27d27f40&quot;&gt;MapReduce&lt;/a&gt; has become the default way in which people would tackle such problems at scale; in fact, people do not consider anything else, as far as I can tell. Well, they certainly do not consider MPI for example as a first choice. The parallel array things in Fortran do not at first sight seem very graphy, so this is likely not something that crosses one&amp;#39;s mind either.&lt;/p&gt; &lt;p&gt;We should try some of the similarity search and clustering in SQL with a parallel programming model. We have excellent expression-evaluation speed from vectoring and unrestricted recursion between partitions, and no file system latencies like &lt;nop&gt;&lt;/nop&gt;MapReduce. The initial test case will be some of the linking/data-integration/mapping workloads in LOD2.&lt;/p&gt; &lt;p&gt; Having some sort-of-agreed-upon benchmark for these workloads would make this more worthwhile. Again, we will see what emerges.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:38:15.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 4 of 6) - Graph Data Management Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1711</atom:id>
  <atom:published>2012-04-17T19:38:09Z</atom:published>
  <atom:content type="html">&lt;p&gt;I gave an invited talk (&amp;quot;Virtuoso 7 - Column Store and Adaptive Techniques for Graph&amp;quot; (&lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/Slides/Virtuoso.ppt&quot; class=&quot;absuri&quot; id=&quot;link-id0x27fce2f8&quot;&gt;Slides (ppt)&lt;/a&gt;)) at the &lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/&quot; class=&quot;absuri&quot; id=&quot;link-id0x27eb6cd8&quot;&gt;Graph Data Management Workshop&lt;/a&gt; at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d89980&quot;&gt;ICDE 2012&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Bryan Thompson of &lt;a href=&quot;http://www.systap.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a893000&quot;&gt;Systap&lt;/a&gt; (&lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c36d70&quot;&gt;Bigdata®&lt;/a&gt; RDF store) was also invited, so we got to talk about our common interests. He told me about two cool things they have recently done, namely introducing tables to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a74b040&quot;&gt;SPARQL&lt;/a&gt;, and adding a way of &lt;a href=&quot;http://dbpedia.org/resource/Reification_%28computer_science%29&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c90790&quot;&gt;reifying statements&lt;/a&gt; that does not rely on extra columns. The table business is just about being able to store a multicolumn result set into a named persistent entity for subsequent processing. But this amounts to a SQL table, so the relational model has been re-arrived at, once more, from practical considerations. The reification just packs all the fields of a triple (or quad) into a single string and this string is then used as an RDF &lt;tt&gt;S&lt;/tt&gt; or &lt;tt&gt;O&lt;/tt&gt; (Subject or Object), less frequently a &lt;tt&gt;P&lt;/tt&gt; or &lt;tt&gt;G&lt;/tt&gt; (Predicate or Graph). This works because Bigdata® has variable length fields in all columns of the triple/quad table. The query notation then accepts a function-looking thing in a triple pattern to mark reification. Nice. Virtuoso has a variable length column in only the &lt;tt&gt;O&lt;/tt&gt; but could of course have one in also &lt;tt&gt;S&lt;/tt&gt; and even in &lt;tt&gt;P&lt;/tt&gt; and &lt;tt&gt;G&lt;/tt&gt;. The column store would still compress the same as long as reified values did not occur. These values on the other hand would be unlikely to compress very well but run length and dictionary would always work.&lt;/p&gt; &lt;p&gt;So, we could do it like Bigdata®, or we could add a &amp;quot;quad ID&amp;quot; column to one of the indices, to give a reification ID to quads. Again no penalty in a column store, if you do not access the column. Or we could make an extra table of &lt;tt&gt;PSOG-&amp;gt;R&lt;/tt&gt;.&lt;/p&gt; &lt;p&gt;Yet another variation would be to make the &lt;tt&gt;SPOG&lt;/tt&gt; concatenation a literal that is interned in the RDF literal table, and then used as any literal would be in the &lt;tt&gt;O&lt;/tt&gt;, and as an IRI in a special range when occurring as &lt;tt&gt;S&lt;/tt&gt;. The relative merits depend on how often something will be reified and on whether one wishes to &lt;tt&gt;SELECT&lt;/tt&gt; based on parts of reification. Whichever the case may be, the idea of a function-looking placeholder for a reification is a nice one and we should make a compatible syntax if we do special provenance/reification support. The model in the RDF reification vocabulary is a non-starter and a thing to discredit the sem web for anyone from database.&lt;/p&gt; &lt;p&gt;I heard from Bryan that the new &lt;a href=&quot;http://www.w3.org/2011/rdf-wg/&quot; class=&quot;absuri&quot; id=&quot;link-id0x28a628b0&quot;&gt;W3 RDF WG&lt;/a&gt; had declared provenance out of scope, unfortunately. The word on the street on the other hand is that provenance is increasingly found to be an issue. This is confirmed by the active work of the &lt;a href=&quot;http://www.w3.org/2011/prov/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2540a098&quot;&gt;W3 Provenance Working Group&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:38:09.000007-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 3 of 6) - What Is Timely LOD Search Worth?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1710</atom:id>
  <atom:published>2012-04-17T19:38:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was a talk (Linked Data and Live Querying for Enabling Support Platforms for Web Dataspaces (&lt;a href=&quot;https://sites.google.com/site/desweb2012/parreira.pdf?attredirects=0&quot; class=&quot;absuri&quot; id=&quot;link-id0x27f2bbe0&quot;&gt;Slides (PDF)&lt;/a&gt;); Jürgen Umbrich, Marcel Karnstedt, Josiane Xavier Parreira, Axel Polleres and Manfred Hauswirth) at the &lt;a href=&quot;https://sites.google.com/site/desweb2012/&quot; class=&quot;absuri&quot; id=&quot;link-id0x299b5230&quot;&gt;Data Engineering Meets the Semantic Web (DESWEB)&lt;/a&gt; workshop at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2928bfd8&quot;&gt;ICDE&lt;/a&gt; last week about the problems of caching LOD, whether attempted by &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x278876b8&quot;&gt;Sindice&lt;/a&gt; or &lt;a href=&quot;http://www.openlinksw.com&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a4ba140&quot;&gt;OpenLink&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://lod.openlinksw.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x299ed1f0&quot;&gt;LOD Cloud Cache&lt;/a&gt;. The conclusion was that OpenLink covered a bit more of the test data sets and that Sindice was maybe better up to date on the ones that it covered but that neither did it very well. The data sets were random graphs of user FOAF profiles and such collected from some Billion Triples Data set, thus not data that is likely to have commercial value, except in huge quantities maybe for some advertising, except that click streams and the like are much more valuable.&lt;/p&gt; &lt;p&gt;Being involved with at least one of these, and being in the audience, I felt obligated to comment. The fact is, neither OpenLink&amp;#39;s LOD Cloud Cache nor Sindice is a business, and there is not a business model which could justify keeping them timely on the web crawls they contain. Doing so is easy enough, if there is a good enough reason.&lt;/p&gt; &lt;p&gt;The talk did make a couple of worthwhile points: The data does change; and if one queries entities, one encounters large variation in change-frequency across entities and their attributes.&lt;/p&gt; &lt;p&gt;The authors suggested to have a piece of middleware decide what things can be safely retrieved from a copy and what have to be retrieved from the source. Not too much is in fact known about the change frequency of the data, except that it changes, as the authors pointed out.&lt;/p&gt; &lt;p&gt;The crux of the matter is that the thing that ought to know this best is the query processor at the LOD warehouse. For client-side middleware to split the query, it needs access to statistics that it must get from the warehouse or keep by itself. Of course, in concrete application scenarios, you go to the source if you ask about the weather or traffic jams, and otherwise go to the warehouse based on application-level knowledge.&lt;/p&gt; &lt;p&gt;But for actual business intelligence, one needs histories, so a search engine with only the present is not so interesting. At any rate, refreshing the data should leave a trail of past states. Exposing this for online query would just triple the price, so we forget about that for now. Just keeping an append-only table of history is not too much of a problem. One may make extracts from this table into a relational form for specific business questions. There is no point doing such analytics in RDF itself. One would have to just try to see if there is anything remotely exploitable in such histories. Making a history table is easy enough. Maybe I will add one.&lt;/p&gt; &lt;p&gt;Let us now see what it would take to operate a web crawl cache that would be properly provisioned, kept fresh, and managed. We base this on the Sindice crawl sizes and our experiments on these; the non-web-crawl LOD Cloud Cache is not included.&lt;/p&gt; &lt;p&gt;From previous experience we know the sizing: 5Gt/144GB RAM. Today&amp;#39;s best price point is on 24-DIMM E5 boards, so 192GB RAM, or 6.67Gt. A unit like that (8TB HDD, 0.5TB SSD, 192GB RAM, 12 core E5, &lt;a href=&quot;http://dbpedia.org/page/InfiniBand&quot; class=&quot;absuri&quot; id=&quot;link-id0x27eb8158&quot;&gt;InfiniBand&lt;/a&gt;) costs about $6800.&lt;/p&gt; &lt;p&gt;The Sindice crawl is now about 20Gt, so $28K of gear (768GB RAM) is enough. Let us count this 4 times: 2x for anticipated growth; and 2x for running two copies -- one for online, and one for batch jobs. This is 3TB RAM. Power is 16x500W = 8KW, which we could round to 80A at 110V. Colocation comes to $500 for the space, and $1200 per month for power; make it $2500 per month with traffic included.&lt;/p&gt; &lt;p&gt;At this rate, 3 year TCO is &lt;tt&gt;$120K + ( 36 * $2.5K ) = $210K&lt;/tt&gt;. This takes one person half time to operate, so this is another $50K per year.&lt;/p&gt; &lt;p&gt;We do not count software development in this, except some scripting that should be included in the yearly $50K DBA bill.&lt;/p&gt; &lt;p&gt;Under what circumstances is such a thing profitable? Or can such a thing be seen as a marketing demo, to be paid for by license or service sales?&lt;/p&gt; &lt;p&gt;A third party can operate a system of this sort, but then the cost will be dominated by software licenses if running on Virtuoso cluster.&lt;/p&gt; &lt;p&gt;For comparison, the TB at EC2 costs &lt;tt&gt;((( 16 * $2 ) * 24 ) * 31 ) = $24,808&lt;/tt&gt; per month. With reserved instances, it is &lt;tt&gt;( 16 * ( $2192 + ((( 0.7 * 24 ) * 365 ) * 3 ))) / 36 = $8938&lt;/tt&gt; per month for a 3 year term. Counting at 3TB, the 3 year TCO is $965K at EC2. AWS has volume discounts but they start higher than this; &lt;tt&gt;( 3 * ( 16 * $2K )) = $96K&lt;/tt&gt; reserved host premium is under $250K. So if you do not even exceed their first volume discount threshold, it does not look likely you can cut a special deal with AWS.&lt;/p&gt; &lt;p&gt;(The AWS prices are calculated with the high memory instances, approximately 64GB usable RAM each. The slightly better CC2 instance is a bit more expensive.)&lt;/p&gt; &lt;p&gt;Yet another experiment to make is whether a system as outlined will even run at anywhere close to the performance of physical equipment. This is uncertain; clouds are not for speed, based on what we have seen. They make the most sense when the monthly bill is negligible in relation to the cost of a couple of days of human time.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-19T16:44:28-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 2 of 6) - LOD Column Store Experiences and Sizing</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1709</atom:id>
  <atom:published>2012-04-17T19:37:58Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have played around with &lt;a href=&quot;http://lod.openlinksw.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a8a8df8&quot;&gt;LOD data sets and Virtuoso Column Store&lt;/a&gt; for the past several months. I will here give a few numbers and comment on some different platform comparisons that we have made. The answer at the end of this is how to size a system for often-changing web-style data. The conclusion is a data-to-RAM ratio that gives an acceptable working set without driving the price up by forcing 100% RAM residence.&lt;/p&gt; &lt;p&gt;The experiment is loading &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x28e1fb38&quot;&gt;Sindice&lt;/a&gt; web crawls. The platform is 2 x Xeon 5520 and 144G RAM. The initial load rate is 200-180Kt, and drops to 100Kt at 5Gt because of I/O. The system is Virtuoso Column Store configured to run as 4 processes and 32 partitions, all on the same box. After 5Gt, we see just more I/O and going further is not relevant; one runs CPU-bound or not at all.&lt;/p&gt; &lt;p&gt;We use 4 Crucial SSDs in the setup. The hot structures like the RDF quad indices are on SSD, and the cold ones are on hard disk. A cold structure is a write-only index like the dictionary of literals (id to lit).&lt;/p&gt; &lt;p&gt;For bulk load, SSDs turn out not to be particularly useful. For a cold start on the other hand, SSDs cut warmup time of 144G RAM from over half an hour to a couple of minutes. It is possible that Intel SSDs would also help with bulk load, but this has not been tried. The SSD problem during bulk load is that these do not write very fast, and while there are writes in queue, read latency goes up; so under a constant write load, the SSD&amp;#39;s famous instantaneous random read no longer works.&lt;/p&gt; &lt;p&gt;The fragment considered in the example is 4.95Gt: 8.1M pages worth of quads; 12.7M of literals and iris; and 4.71M of full text index. A page is 8KB. The files on disk contain empty pages, but these do not matter since they do not take up RAM. The quad indices take 13.4 bytes/quad. The row-wise equivalent used to be 38 or so bytes/quad with similar data. Two-thirds of the IRI and literal string data can benefit from column-wise stream compression. (This was not used but if it were, we could count on a 50% drop in size for the data affected, so instead of 12.7M pages, we could maybe get 8.5M on a good day. This could be worth doing but is not a priority.) The system was configured to have 12M database pages in RAM, so a little under half the database pages of the set fit in RAM at one time; thus one cannot call this a memory-only setup. Due to the locality in the unusually non-local data, this is as far as secondary storage can reach without becoming an over-2x slowdown. In practice, we are talking about under 1% of rows accessed coming from secondary storage, but that alone means half throughput.&lt;/p&gt; &lt;p&gt;We note that this data set represents the worst that we have seen. It has 129M distinct graphs, 38 t/g. Regular data like the synthetic benchmark sets take half the space per quad. This is about a third of a Sindice crawl; the other two-thirds look the same as far as we looked.&lt;/p&gt; &lt;p&gt;So if you are interested in hosting data like this, you can budget 144GB RAM for every 5Gt. Do not try it with anything less. Budgeting double this is wise, so that you have space to cook the data; this is important since in order to do things with it, one needs to at least copy things for materializing transformations.&lt;/p&gt; &lt;p&gt;If you are budget-constrained and hosting very regular content like &lt;a href=&quot;http://dbpedia.org/page/UniProt&quot; class=&quot;absuri&quot; id=&quot;link-id0x29b465b8&quot;&gt;UniProt&lt;/a&gt;, you can budget maybe 144GB RAM for every 10Gt.&lt;/p&gt; &lt;p&gt;As for CPU, this does not matter as much as long as you do not go to disk. Just for load speed, Dbpedia is loaded in 300s on a cluster of eight (8) dual AMD 2378 boxes at 2.6GHz (total 8 cores per host, so 64 cores in the cluster), and in 945s on one (1) dual Xeon 5520 box at 2.26GHz (total 8 cores in the host). Intel makes much better CPUs, as we see. Both scenarios are 100% in RAM. For even more regular data, the load rates are a bit higher: 1.3Mt/s for the AMD cluster, and 300Kt/s for the Xeon host.&lt;/p&gt; &lt;p&gt;The interconnect for the AMD cluster is 1 x gigE but this does not matter for load. For CPU-bound cross-partition &lt;tt&gt;JOIN&lt;/tt&gt;s, 1 or 2 x gigE is insufficient; 4 x gigE might barely make it; &lt;a href=&quot;http://dbpedia.org/page/InfiniBand&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d4cec8&quot;&gt;InfiniBand&lt;/a&gt; should be safe. When running cross-partition &lt;tt&gt;JOIN&lt;/tt&gt;s, a single 8-core Xeon box generates about 300MB/s of interconnect traffic; a gigE connection can maybe take 50MB/s with some luck.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Xeon#E5-16xx.2F26xx-series_.22Sandy_Bridge-EP.22&quot; class=&quot;absuri&quot; id=&quot;link-id0x27df5b40&quot;&gt;Intel E5&lt;/a&gt; is not dramatically better than &lt;a href=&quot;http://en.wikipedia.org/wiki/Xeon#Nehalem-based_Xeon&quot; class=&quot;absuri&quot; id=&quot;link-id0x293e9d50&quot;&gt;Nehalem&lt;/a&gt; but this is something we will see in a while when we make measurements with real equipment. Prior to the E5 release, we tried Amazon EC2 CC2 (&amp;quot;Cluster Compute Eight Extra Large Instance&amp;quot; -- 2x8 core E5, 2.66GHz). The results were inconclusive; it never did more than 1.9x better than Xeon 5520 even when running an empty loop (i.e., recursive &lt;a href=&quot;http://dbpedia.org/resource/Fibonacci_function&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a480aa0&quot;&gt;Fibonacci function&lt;/a&gt; in SQL, no cache misses, no I/O). With a database &lt;tt&gt;JOIN&lt;/tt&gt;, 1.3x better is the best we saw. But this must be the fault of Amazon and not of E5.&lt;/p&gt; &lt;p&gt;We also tried &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Opteron_6100-series_.22Magny-Cours.22_.2845_nm.29&quot; class=&quot;absuri&quot; id=&quot;link-id0x27e262a0&quot;&gt;AMD &amp;quot;Magny-Cours&amp;quot;&lt;/a&gt;, but for 32 cores against 8 it never did over 2x better, more like 1.4x often enough, and and single thread speed was 50% worse, so not a good buy. We did not find a &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Bulldozer_based_Opterons&quot; class=&quot;absuri&quot; id=&quot;link-id0x29936f10&quot;&gt;Bulldozer&lt;/a&gt; to try, and did not feel like buying one since the reviews did not promise more core speed over the Magny-Cours.&lt;/p&gt; &lt;p&gt;It seems that especially with Column Store, we are truly CPU-bound and not memory-latency- or bandwidth-bound. This is based on the observation that a Xeon 5620 with 2 of 3 memory channels populated loads BSBM data only 10% faster than the same with 1 of 3 channels populated, with CPU affinity set on a dual socket system.&lt;/p&gt; &lt;p&gt;So, if you have a choice between a $2K processor (E5-2690) and a $600 processor (E5-2630), buy the cheaper one and get RAM with the money saved. $1440 buys 128G in $90 8G DIMMs. Then buy E5 boards with 24 DIMMs -- one for every 7Gt of web crawl data. If your software licenses are priced per core, getting higher-clock 4-core E5’s might make sense.&lt;/p&gt; &lt;p&gt;While on the subject of bytes and quads/triples, we note that &lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; class=&quot;absuri&quot; id=&quot;link-id0x2784a1d8&quot;&gt;Bigdata®&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.bigdata.com/bigdata/blog/?p=423&quot; class=&quot;absuri&quot; id=&quot;link-id0x2ac80e68&quot;&gt;recent announcement&lt;/a&gt; says up to 50 billion triples per single server. Franz loaded at a good 800+ Kt/s rate up to &lt;a href=&quot;http://franz.com/agraph/allegrograph/agraph_benchmarks.lhtml&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c3bea0&quot;&gt;a trillion triples&lt;/a&gt;. One is led to think from the spec that this was with less than full cpu but still with highly local data, considering 1.5 bytes a triple would hit very heavy I/O otherwise. Their statement to the effect of &lt;a href=&quot;http://swat.cse.lehigh.edu/projects/lubm/&quot; class=&quot;absuri&quot; id=&quot;link-id0x251d4180&quot;&gt;LUBM&lt;/a&gt;-like data corroborates this, so we are not talking about exactly the same thing.&lt;/p&gt; &lt;p&gt;So if you compare the claims, I am talking about running CPU-bound on the worst data there is. Franz and Bigdata® do not specify, so it is hard to compare. LOD2 should in principle publish actual metrics with at least Bigdata®; Franz is not participating in these races.&lt;/p&gt; &lt;p&gt;We may publish some more detailed measurements with more varied configurations later. The thing to remember is minimum 144GB RAM for every 5Gt of web crawls, if you want to load and refresh in RAM.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:37:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 1 of 6) - LOD2 Plenary</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2012-04-17#1708</atom:id>
  <atom:published>2012-04-17T19:37:50Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://lod2.eu/&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d3c5620&quot;&gt;LOD2&lt;/a&gt;&amp;#39;s database contributions are, on one hand, Virtuoso Column Store and Elastic Cluster, and on the other, the demonstration and proof from &lt;a href=&quot;http://dbpedia.org/resource/Centrum_Wiskunde_&amp;amp;_Informatica&quot; class=&quot;absuri&quot; id=&quot;link-id0x11356250&quot;&gt;CWI&lt;/a&gt; that indeed all of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d6296d8&quot;&gt;relational&lt;/a&gt; innovations for which CWI is well known apply to &lt;a href=&quot;http://dbpedia.org/resource/Graph_%28data_structure%29&quot; class=&quot;absuri&quot; id=&quot;link-id0x1bcd83d8&quot;&gt;graph&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; class=&quot;absuri&quot; id=&quot;link-id0x1befd4a0&quot;&gt;RDF&lt;/a&gt; data as well.&lt;/p&gt; &lt;p&gt;The value is unquestionable both to Virtuoso users in the short-term, and to the state of science and to all RDF users and vendors in the mid-term.&lt;/p&gt; &lt;p&gt;The LOD2 claim of &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1649&quot; class=&quot;absuri&quot; id=&quot;link-id0x1c161d88&quot;&gt;linking the universe&lt;/a&gt;&amp;quot; (my words) will be tested soon enough, after we first put the universe in a bucket. This refers to a real-time quad store of &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d3eb050&quot;&gt;Sindice&lt;/a&gt; crawls, plus a warehouse of the LOD data sets.&lt;/p&gt; &lt;p&gt;This effort raises a few questions that I will treat in a number of posts to follow, such as --&lt;/p&gt; &lt;ul&gt; &lt;li&gt;How do you size a real-time copy of LOD/web data? &lt;/li&gt; &lt;li&gt;What does it cost to operate a properly provisioned warehouse of all RDF web crawls?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What is done now is under-provisioned and not kept up to date. We are talking about all the RDF on the web in near real time with arbitrary queries. This is very far from the &amp;quot;billion triples&amp;quot; data sets or vertical portals, which are both easy by comparison.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:37:50.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 6 of 6) - Science Data Panel</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1707</atom:id>
  <atom:published>2012-04-17T19:36:28Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2012-04-19T16:44:03.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 5 of 6) - Graphs</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1706</atom:id>
  <atom:published>2012-04-17T19:35:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;There were quite a few talks about graphs at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d23c70&quot;&gt;ICDE 2012&lt;/a&gt;. Neither the representations of graphs, nor the differences between RDF and generic graph models, entered much into the discussion. On the other hand, graph similarity searches and related were addressed a fair bit.&lt;/p&gt; &lt;p&gt;Graph DB and RDF/Linked Data are distinct, if neighboring disciplines. On one hand, graph problems predate Linked Data, and the RDF/Linked Data world is a web artifact, which graphs are not as such, so a slightly different cultural derivation also makes these disjoint. Besides, graphs may imply schema first whereas linked data basically cannot. Then another differentiation might be derived from edges not really being first class citizens in RDF, except for reification, at which the RDF reification vocabulary is miserably inadequate, as pointed out before.&lt;/p&gt; &lt;p&gt;RDF is being driven by the web-style publishing of Linked Open Data (LOD), with some standardization and uptake by publishers; Graph DB is not standardized but driven by diverse graph-analytics use cases.&lt;/p&gt; &lt;p&gt;There is no necessary reason why these could not converge, but it will be indefinitely long before any standards come to cover this, so best not hold one&amp;#39;s breath. Communities are jealous of their borders, so if the neighbor does something similar one tends to emphasize the differences and not the commonalities.&lt;/p&gt; &lt;p&gt;So for some things, one could warehouse the original RDF of the web microformats and LOD, and then ETL into some other graph model for specific tasks, or just do these in RDF. Of course, then RDF systems need to offer suitable capabilities. These seem to be about very fast edge traversal within a rather local working set, and about accommodating large, iteratively-updated intermediate results, e.g., edge weights.&lt;/p&gt; &lt;p&gt;Judging by the benchmarks paper (&lt;i&gt;Benchmarking traversal operations over graph databases (&lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/Slides/Ciglan.pptx&quot; class=&quot;absuri&quot; id=&quot;link-id0x26e6cc68&quot;&gt;Slidedeck (ppt)&lt;/a&gt;, &lt;a href=&quot;http://ups.savba.sk/~marek/papers/gdm12-ciglan.pdf&quot; class=&quot;absuri&quot; id=&quot;link-id0x28545128&quot;&gt;paper (pdf)&lt;/a&gt;);&lt;/i&gt; Marek Ciglan, Alex Averbuch, and Ladialav Hluchy.) at the &lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/index.html&quot; class=&quot;absuri&quot; id=&quot;link-id0x26b17d70&quot;&gt;GDM workshop&lt;/a&gt;, the state of benchmarking in graph databases is even worse than in RDF, where the state is bad enough. The paper&amp;#39;s premise was flawed to start, using application logic to do &lt;tt&gt;JOIN&lt;/tt&gt;s instead of doing them in the DBMS. In this way, latency comes to dominate, and only the most blatant differences are seen. There is nothing like this style of benchmarking to make an industry look bad. The supercomputer Graph 500 benchmark, on the other hand, lets the contestants make their own implementations on a diversity of architectures with random traversal as well as loading and generating large intermediate results. It is somewhat limited, but still broader than the the graph database benchmarks paper at the GDM workshop.&lt;/p&gt; &lt;p&gt; Returning to graphs, there were some papers on similarity search and clique detection. As players in this space, beyond just RDF, we might as well consider implementing necessary features for efficient expression of such problems. The algorithms discussed were expressed in procedural code against memory-based data structures; there is usually no query language or parallel/distributed processing involved.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; class=&quot;absuri&quot; id=&quot;link-id0x27d27f40&quot;&gt;MapReduce&lt;/a&gt; has become the default way in which people would tackle such problems at scale; in fact, people do not consider anything else, as far as I can tell. Well, they certainly do not consider MPI for example as a first choice. The parallel array things in Fortran do not at first sight seem very graphy, so this is likely not something that crosses one&amp;#39;s mind either.&lt;/p&gt; &lt;p&gt;We should try some of the similarity search and clustering in SQL with a parallel programming model. We have excellent expression-evaluation speed from vectoring and unrestricted recursion between partitions, and no file system latencies like MapReduce. The initial test case will be some of the linking/data-integration/mapping workloads in LOD2.&lt;/p&gt; &lt;p&gt; Having some sort-of-agreed-upon benchmark for these workloads would make this more worthwhile. Again, we will see what emerges.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-19T16:43:38.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 4 of 6) - Graph Data Management Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1705</atom:id>
  <atom:published>2012-04-17T19:34:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;I gave an invited talk (&amp;quot;Virtuoso 7 - Column Store and Adaptive Techniques for Graph&amp;quot; (&lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/Slides/Virtuoso.ppt&quot; class=&quot;absuri&quot; id=&quot;link-id0x27fce2f8&quot;&gt;Slides (ppt)&lt;/a&gt;)) at the &lt;a href=&quot;http://www.cse.unsw.edu.au/~iwgdm/2012/&quot; class=&quot;absuri&quot; id=&quot;link-id0x27eb6cd8&quot;&gt;Graph Data Management Workshop&lt;/a&gt; at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d89980&quot;&gt;ICDE 2012&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Bryan Thompson of &lt;a href=&quot;http://www.systap.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a893000&quot;&gt;Systap&lt;/a&gt; (&lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c36d70&quot;&gt;Bigdata®&lt;/a&gt; RDF store) was also invited, so we got to talk about our common interests. He told me about two cool things they have recently done, namely introducing tables to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a74b040&quot;&gt;SPARQL&lt;/a&gt;, and adding a way of &lt;a href=&quot;http://dbpedia.org/resource/Reification_%28computer_science%29&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c90790&quot;&gt;reifying statements&lt;/a&gt; that does not rely on extra columns. The table business is just about being able to store a multicolumn result set into a named persistent entity for subsequent processing. But this amounts to a SQL table, so the relational model has been re-arrived at, once more, from practical considerations. The reification just packs all the fields of a triple (or quad) into a single string and this string is then used as an RDF &lt;tt&gt;S&lt;/tt&gt; or &lt;tt&gt;O&lt;/tt&gt; (Subject or Object), less frequently a &lt;tt&gt;P&lt;/tt&gt; or &lt;tt&gt;G&lt;/tt&gt; (Predicate or Graph). This works because Bigdata® has variable length fields in all columns of the triple/quad table. The query notation then accepts a function-looking thing in a triple pattern to mark reification. Nice. Virtuoso has a variable length column in only the &lt;tt&gt;O&lt;/tt&gt; but could of course have one in also &lt;tt&gt;S&lt;/tt&gt; and even in &lt;tt&gt;P&lt;/tt&gt; and &lt;tt&gt;G&lt;/tt&gt;. The column store would still compress the same as long as reified values did not occur. These values on the other hand would be unlikely to compress very well but run length and dictionary would always work.&lt;/p&gt; &lt;p&gt;So, we could do it like Bigdata®, or we could add a &amp;quot;quad ID&amp;quot; column to one of the indices, to give a reification ID to quads. Again no penalty in a column store, if you do not access the column. Or we could make an extra table of &lt;tt&gt;PSOG-&amp;gt;R&lt;/tt&gt;.&lt;/p&gt; &lt;p&gt;Yet another variation would be to make the &lt;tt&gt;SPOG&lt;/tt&gt; concatenation a literal that is interned in the RDF literal table, and then used as any literal would be in the &lt;tt&gt;O&lt;/tt&gt;, and as an IRI in a special range when occurring as &lt;tt&gt;S&lt;/tt&gt;. The relative merits depend on how often something will be reified and on whether one wishes to &lt;tt&gt;SELECT&lt;/tt&gt; based on parts of reification. Whichever the case may be, the idea of a function-looking placeholder for a reification is a nice one and we should make a compatible syntax if we do special provenance/reification support. The model in the RDF reification vocabulary is a non-starter and a thing to discredit the sem web for anyone from database.&lt;/p&gt; &lt;p&gt;I heard from Bryan that the new &lt;a href=&quot;http://www.w3.org/2011/rdf-wg/&quot; class=&quot;absuri&quot; id=&quot;link-id0x28a628b0&quot;&gt;W3 RDF WG&lt;/a&gt; had declared provenance out of scope, unfortunately. The word on the street on the other hand is that provenance is increasingly found to be an issue. This is confirmed by the active work of the &lt;a href=&quot;http://www.w3.org/2011/prov/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2540a098&quot;&gt;W3 Provenance Working Group&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:34:20.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 3 of 6) - What Is Timely LOD Search Worth?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1704</atom:id>
  <atom:published>2012-04-17T19:33:21Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was a talk (Linked Data and Live Querying for Enabling Support Platforms for Web Dataspaces (&lt;a href=&quot;https://sites.google.com/site/desweb2012/parreira.pdf?attredirects=0&quot; class=&quot;absuri&quot; id=&quot;link-id0x27f2bbe0&quot;&gt;Slides (PDF)&lt;/a&gt;); Jürgen Umbrich, Marcel Karnstedt, Josiane Xavier Parreira, Axel Polleres and Manfred Hauswirth) at the &lt;a href=&quot;https://sites.google.com/site/desweb2012/&quot; class=&quot;absuri&quot; id=&quot;link-id0x299b5230&quot;&gt;Data Engineering Meets the Semantic Web (DESWEB)&lt;/a&gt; workshop at &lt;a href=&quot;http://www.icde12.org/Site/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2928bfd8&quot;&gt;ICDE&lt;/a&gt; last week about the problems of caching LOD, whether attempted by &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x278876b8&quot;&gt;Sindice&lt;/a&gt; or &lt;a href=&quot;http://www.openlinksw.com&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a4ba140&quot;&gt;OpenLink&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://lod.openlinksw.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x299ed1f0&quot;&gt;LOD Cloud Cache&lt;/a&gt;. The conclusion was that OpenLink covered a bit more of the test data sets and that Sindice was maybe better up to date on the ones that it covered but that neither did it very well. The data sets were random graphs of user FOAF profiles and such collected from some Billion Triples Data set, thus not data that is likely to have commercial value, except in huge quantities maybe for some advertising, except that click streams and the like are much more valuable.&lt;/p&gt; &lt;p&gt;Being involved with at least one of these, and being in the audience, I felt obligated to comment. The fact is, neither OpenLink&amp;#39;s LOD Cloud Cache nor Sindice is a business, and there is not a business model which could justify keeping them timely on the web crawls they contain. Doing so is easy enough, if there is a good enough reason.&lt;/p&gt; &lt;p&gt;The talk did make a couple of worthwhile points: The data does change; and if one queries entities, one encounters large variation in change-frequency across entities and their attributes.&lt;/p&gt; &lt;p&gt;The authors suggested to have a piece of middleware decide what things can be safely retrieved from a copy and what have to be retrieved from the source. Not too much is in fact known about the change frequency of the data, except that it changes, as the authors pointed out.&lt;/p&gt; &lt;p&gt;The crux of the matter is that the thing that ought to know this best is the query processor at the LOD warehouse. For client-side middleware to split the query, it needs access to statistics that it must get from the warehouse or keep by itself. Of course, in concrete application scenarios, you go to the source if you ask about the weather or traffic jams, and otherwise go to the warehouse based on application-level knowledge.&lt;/p&gt; &lt;p&gt;But for actual business intelligence, one needs histories, so a search engine with only the present is not so interesting. At any rate, refreshing the data should leave a trail of past states. Exposing this for online query would just triple the price, so we forget about that for now. Just keeping an append-only table of history is not too much of a problem. One may make extracts from this table into a relational form for specific business questions. There is no point doing such analytics in RDF itself. One would have to just try to see if there is anything remotely exploitable in such histories. Making a history table is easy enough. Maybe I will add one.&lt;/p&gt; &lt;p&gt;Let us now see what it would take to operate a web crawl cache that would be properly provisioned, kept fresh, and managed. We base this on the Sindice crawl sizes and our experiments on these; the non-web-crawl LOD Cloud Cache is not included.&lt;/p&gt; &lt;p&gt;From previous experience we know the sizing: 5Gt/144GB RAM. Today&amp;#39;s best price point is on 24-DIMM E5 boards, so 192GB RAM, or 6.67Gt. A unit like that (8TB HDD, 0.5TB SSD, 192GB RAM, 12 core E5, &lt;a href=&quot;http://dbpedia.org/page/InfiniBand&quot; class=&quot;absuri&quot; id=&quot;link-id0x27eb8158&quot;&gt;InfiniBand&lt;/a&gt;) costs about $6800.&lt;/p&gt; &lt;p&gt;The Sindice crawl is now about 20Gt, so $28K of gear (768GB RAM) is enough. Let us count this 4 times: 2x for anticipated growth; and 2x for running two copies -- one for online, and one for batch jobs. This is 3TB RAM. Power is 16x500W = 8KW, which we could round to 80A at 110V. Colocation comes to $500 for the space, and $1200 per month for power; make it $2500 per month with traffic included.&lt;/p&gt; &lt;p&gt;At this rate, 3 year TCO is &lt;tt&gt;$120K + ( 36 * $2.5K ) = $210K&lt;/tt&gt;. This takes one person half time to operate, so this is another $50K per year.&lt;/p&gt; &lt;p&gt;We do not count software development in this, except some scripting that should be included in the yearly $50K DBA bill.&lt;/p&gt; &lt;p&gt;Under what circumstances is such a thing profitable? Or can such a thing be seen as a marketing demo, to be paid for by license or service sales?&lt;/p&gt; &lt;p&gt;A third party can operate a system of this sort, but then the cost will be dominated by software licenses if running on Virtuoso cluster.&lt;/p&gt; &lt;p&gt;For comparison, the TB at EC2 costs &lt;tt&gt;((( 16 * $2 ) * 24 ) * 31 ) = $24,808&lt;/tt&gt; per month. With reserved instances, it is &lt;tt&gt;( 16 * ( $2192 + ((( 0.7 * 24 ) * 365 ) * 3 ))) / 36 = $8938&lt;/tt&gt; per month for a 3 year term. Counting at 3TB, the 3 year TCO is $965K at EC2. AWS has volume discounts but they start higher than this; &lt;tt&gt;( 3 * ( 16 * $2K )) = $96K&lt;/tt&gt; reserved host premium is under $250K. So if you do not even exceed their first volume discount threshold, it does not look likely you can cut a special deal with AWS.&lt;/p&gt; &lt;p&gt;(The AWS prices are calculated with the high memory instances, approximately 64GB usable RAM each. The slightly better CC2 instance is a bit more expensive.)&lt;/p&gt; &lt;p&gt;Yet another experiment to make is whether a system as outlined will even run at anywhere close to the performance of physical equipment. This is uncertain; clouds are not for speed, based on what we have seen. They make the most sense when the monthly bill is negligible in relation to the cost of a couple of days of human time.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-19T16:43:20-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 2 of 6) - LOD Column Store Experiences and Sizing</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1703</atom:id>
  <atom:published>2012-04-17T19:31:04Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have played around with &lt;a href=&quot;http://lod.openlinksw.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a8a8df8&quot;&gt;LOD data sets and Virtuoso Column Store&lt;/a&gt; for the past several months. I will here give a few numbers and comment on some different platform comparisons that we have made. The answer at the end of this is how to size a system for often-changing web-style data. The conclusion is a data-to-RAM ratio that gives an acceptable working set without driving the price up by forcing 100% RAM residence.&lt;/p&gt; &lt;p&gt;The experiment is loading &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x28e1fb38&quot;&gt;Sindice&lt;/a&gt; web crawls. The platform is 2 x Xeon 5520 and 144G RAM. The initial load rate is 200-180Kt, and drops to 100Kt at 5Gt because of I/O. The system is Virtuoso Column Store configured to run as 4 processes and 32 partitions, all on the same box. After 5Gt, we see just more I/O and going further is not relevant; one runs CPU-bound or not at all.&lt;/p&gt; &lt;p&gt;We use 4 Crucial SSDs in the setup. The hot structures like the RDF quad indices are on SSD, and the cold ones are on hard disk. A cold structure is a write-only index like the dictionary of literals (id to lit).&lt;/p&gt; &lt;p&gt;For bulk load, SSDs turn out not to be particularly useful. For a cold start on the other hand, SSDs cut warmup time of 144G RAM from over half an hour to a couple of minutes. It is possible that Intel SSDs would also help with bulk load, but this has not been tried. The SSD problem during bulk load is that these do not write very fast, and while there are writes in queue, read latency goes up; so under a constant write load, the SSD&amp;#39;s famous instantaneous random read no longer works.&lt;/p&gt; &lt;p&gt;The fragment considered in the example is 4.95Gt: 8.1M pages worth of quads; 12.7M of literals and iris; and 4.71M of full text index. A page is 8KB. The files on disk contain empty pages, but these do not matter since they do not take up RAM. The quad indices take 13.4 bytes/quad. The row-wise equivalent used to be 38 or so bytes/quad with similar data. Two-thirds of the IRI and literal string data can benefit from column-wise stream compression. (This was not used but if it were, we could count on a 50% drop in size for the data affected, so instead of 12.7M pages, we could maybe get 8.5M on a good day. This could be worth doing but is not a priority.) The system was configured to have 12M database pages in RAM, so a little under half the database pages of the set fit in RAM at one time; thus one cannot call this a memory-only setup. Due to the locality in the unusually non-local data, this is as far as secondary storage can reach without becoming an over-2x slowdown. In practice, we are talking about under 1% of rows accessed coming from secondary storage, but that alone means half throughput.&lt;/p&gt; &lt;p&gt;We note that this data set represents the worst that we have seen. It has 129M distinct graphs, 38 t/g. Regular data like the synthetic benchmark sets take half the space per quad. This is about a third of a Sindice crawl; the other two-thirds look the same as far as we looked.&lt;/p&gt; &lt;p&gt;So if you are interested in hosting data like this, you can budget 144GB RAM for every 5Gt. Do not try it with anything less. Budgeting double this is wise, so that you have space to cook the data; this is important since in order to do things with it, one needs to at least copy things for materializing transformations.&lt;/p&gt; &lt;p&gt;If you are budget-constrained and hosting very regular content like &lt;a href=&quot;http://dbpedia.org/page/UniProt&quot; class=&quot;absuri&quot; id=&quot;link-id0x29b465b8&quot;&gt;UniProt&lt;/a&gt;, you can budget maybe 144GB RAM for every 10Gt.&lt;/p&gt; &lt;p&gt;As for CPU, this does not matter as much as long as you do not go to disk. Just for load speed, Dbpedia is loaded in 300s on a cluster of eight (8) dual AMD 2378 boxes at 2.6GHz (total 8 cores per host, so 64 cores in the cluster), and in 945s on one (1) dual Xeon 5520 box at 2.26GHz (total 8 cores in the host). Intel makes much better CPUs, as we see. Both scenarios are 100% in RAM. For even more regular data, the load rates are a bit higher: 1.3Mt/s for the AMD cluster, and 300Kt/s for the Xeon host.&lt;/p&gt; &lt;p&gt;The interconnect for the AMD cluster is 1 x gigE but this does not matter for load. For CPU-bound cross-partition &lt;tt&gt;JOIN&lt;/tt&gt;s, 1 or 2 x gigE is insufficient; 4 x gigE might barely make it; &lt;a href=&quot;http://dbpedia.org/page/InfiniBand&quot; class=&quot;absuri&quot; id=&quot;link-id0x26d4cec8&quot;&gt;InfiniBand&lt;/a&gt; should be safe. When running cross-partition &lt;tt&gt;JOIN&lt;/tt&gt;s, a single 8-core Xeon box generates about 300MB/s of interconnect traffic; a gigE connection can maybe take 50MB/s with some luck.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Xeon#E5-16xx.2F26xx-series_.22Sandy_Bridge-EP.22&quot; class=&quot;absuri&quot; id=&quot;link-id0x27df5b40&quot;&gt;Intel E5&lt;/a&gt; is not dramatically better than &lt;a href=&quot;http://en.wikipedia.org/wiki/Xeon#Nehalem-based_Xeon&quot; class=&quot;absuri&quot; id=&quot;link-id0x293e9d50&quot;&gt;Nehalem&lt;/a&gt; but this is something we will see in a while when we make measurements with real equipment. Prior to the E5 release, we tried Amazon EC2 CC2 (&amp;quot;Cluster Compute Eight Extra Large Instance&amp;quot; -- 2x8 core E5, 2.66GHz). The results were inconclusive; it never did more than 1.9x better than Xeon 5520 even when running an empty loop (i.e., recursive &lt;a href=&quot;http://dbpedia.org/resource/Fibonacci_function&quot; class=&quot;absuri&quot; id=&quot;link-id0x2a480aa0&quot;&gt;Fibonacci function&lt;/a&gt; in SQL, no cache misses, no I/O). With a database &lt;tt&gt;JOIN&lt;/tt&gt;, 1.3x better is the best we saw. But this must be the fault of Amazon and not of E5.&lt;/p&gt; &lt;p&gt;We also tried &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Opteron_6100-series_.22Magny-Cours.22_.2845_nm.29&quot; class=&quot;absuri&quot; id=&quot;link-id0x27e262a0&quot;&gt;AMD &amp;quot;Magny-Cours&amp;quot;&lt;/a&gt;, but for 32 cores against 8 it never did over 2x better, more like 1.4x often enough, and and single thread speed was 50% worse, so not a good buy. We did not find a &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Bulldozer_based_Opterons&quot; class=&quot;absuri&quot; id=&quot;link-id0x29936f10&quot;&gt;Bulldozer&lt;/a&gt; to try, and did not feel like buying one since the reviews did not promise more core speed over the Magny-Cours.&lt;/p&gt; &lt;p&gt;It seems that especially with Column Store, we are truly CPU-bound and not memory-latency- or bandwidth-bound. This is based on the observation that a Xeon 5620 with 2 of 3 memory channels populated loads BSBM data only 10% faster than the same with 1 of 3 channels populated, with CPU affinity set on a dual socket system.&lt;/p&gt; &lt;p&gt;So, if you have a choice between a $2K processor (E5-2690) and a $600 processor (E5-2630), buy the cheaper one and get RAM with the money saved. $1440 buys 128G in $90 8G DIMMs. Then buy E5 boards with 24 DIMMs -- one for every 7Gt of web crawl data. If your software licenses are priced per core, getting higher-clock 4-core E5’s might make sense.&lt;/p&gt; &lt;p&gt;While on the subject of bytes and quads/triples, we note that &lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; class=&quot;absuri&quot; id=&quot;link-id0x2784a1d8&quot;&gt;Bigdata®&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.bigdata.com/bigdata/blog/?p=423&quot; class=&quot;absuri&quot; id=&quot;link-id0x2ac80e68&quot;&gt;recent announcement&lt;/a&gt; says up to 50 billion triples per single server. Franz loaded at a good 800+ Kt/s rate up to &lt;a href=&quot;http://franz.com/agraph/allegrograph/agraph_benchmarks.lhtml&quot; class=&quot;absuri&quot; id=&quot;link-id0x26c3bea0&quot;&gt;a trillion triples&lt;/a&gt;. One is led to think from the spec that this was with less than full cpu but still with highly local data, considering 1.5 bytes a triple would hit very heavy I/O otherwise. Their statement to the effect of &lt;a href=&quot;http://swat.cse.lehigh.edu/projects/lubm/&quot; class=&quot;absuri&quot; id=&quot;link-id0x251d4180&quot;&gt;LUBM&lt;/a&gt;-like data corroborates this, so we are not talking about exactly the same thing.&lt;/p&gt; &lt;p&gt;So if you compare the claims, I am talking about running CPU-bound on the worst data there is. Franz and Bigdata® do not specify, so it is hard to compare. LOD2 should in principle publish actual metrics with at least Bigdata®; Franz is not participating in these races.&lt;/p&gt; &lt;p&gt;We may publish some more detailed measurements with more varied configurations later. The thing to remember is minimum 144GB RAM for every 5Gt of web crawls, if you want to load and refresh in RAM.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:31:04-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ICDE 2012 (post 1 of 6) - LOD2 Plenary</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2012-04-17#1702</atom:id>
  <atom:published>2012-04-17T19:28:48Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://lod2.eu/&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d3c5620&quot;&gt;LOD2&lt;/a&gt;&amp;#39;s database contributions are, on one hand, Virtuoso Column Store and Elastic Cluster, and on the other, the demonstration and proof from &lt;a href=&quot;http://dbpedia.org/resource/Centrum_Wiskunde_&amp;amp;_Informatica&quot; class=&quot;absuri&quot; id=&quot;link-id0x11356250&quot;&gt;CWI&lt;/a&gt; that indeed all of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d6296d8&quot;&gt;relational&lt;/a&gt; innovations for which CWI is well known apply to &lt;a href=&quot;http://dbpedia.org/resource/Graph_%28data_structure%29&quot; class=&quot;absuri&quot; id=&quot;link-id0x1bcd83d8&quot;&gt;graph&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; class=&quot;absuri&quot; id=&quot;link-id0x1befd4a0&quot;&gt;RDF&lt;/a&gt; data as well.&lt;/p&gt; &lt;p&gt;The value is unquestionable both to Virtuoso users in the short-term, and to the state of science and to all RDF users and vendors in the mid-term.&lt;/p&gt; &lt;p&gt;The LOD2 claim of &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1649&quot; class=&quot;absuri&quot; id=&quot;link-id0x1c161d88&quot;&gt;linking the universe&lt;/a&gt;&amp;quot; (my words) will be tested soon enough, after we first put the universe in a bucket. This refers to a real-time quad store of &lt;a href=&quot;http://sindice.com/&quot; class=&quot;absuri&quot; id=&quot;link-id0x1d3eb050&quot;&gt;Sindice&lt;/a&gt; crawls, plus a warehouse of the LOD data sets.&lt;/p&gt; &lt;p&gt;This effort raises a few questions that I will treat in a number of posts to follow, such as --&lt;/p&gt; &lt;ul&gt; &lt;li&gt;How do you size a real-time copy of LOD/web data? &lt;/li&gt; &lt;li&gt;What does it cost to operate a properly provisioned warehouse of all RDF web crawls?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What is done now is under-provisioned and not kept up to date. We are talking about all the RDF on the web in near real time with arbitrary queries. This is very far from the &amp;quot;billion triples&amp;quot; data sets or vertical portals, which are both easy by comparison.&lt;/p&gt;</atom:content>
  <atom:updated>2012-04-17T15:28:48-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Plenary and Review: Semanticist, Think Database!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-09-30#1700</atom:id>
  <atom:published>2011-09-30T21:02:01Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2015-08-21T15:43:29.091466-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Plenary and Review: Semanticist, Think Database!</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-09-29#1698</atom:id>
  <atom:published>2011-09-29T14:50:47Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2011-09-29T14:48:59-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>GDB for the Data Driven Age (STI Summit Position Paper)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-07-26#1697</atom:id>
  <atom:published>2011-07-26T13:37:26Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; The following was written prior to the event, but was not posted until later due to human error.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://sti2.org/&quot; id=&quot;link-id0x261e3798&quot;&gt;Semantic Technology Institute&lt;/a&gt; (&lt;a href=&quot;http://sti2.org/&quot; id=&quot;link-id0x243dac30&quot;&gt;STI&lt;/a&gt;) is organizing &lt;a href=&quot;http://summit2011.sti2.org/&quot; id=&quot;link-id0x25fc4e68&quot;&gt;a meeting&lt;/a&gt; around the questions of making semantic technology deliver on its promise. We were asked to present a position paper (reproduced below). This is another recap of our position on making graph databasing come of age. While the database technology matters are getting tackled, we are drawing closer to the question of deciding actually what kind of inference will be needed close to the data. My personal wish is to use this summit for clarifying exactly what is needed from the database in order to extract value from the data explosion. We have a good idea of what to do with queries but what is the exact requirement for transformation and alignment of schema and identifiers? What is the actual use case of inference, OWL or other, in this? It is time to get very concrete in terms of applications. We expect a mixed requirement but it is time to look closely at the details.&lt;/p&gt; &lt;h3&gt;GDB for the Data Driven Age&lt;/h3&gt; &lt;p&gt;Databases and knowledge representation both have decades of history, but to date the exchange of ideas and techniques between these disciplines has been limited. The intuition that there would be value in greater cooperation has not failed to occur to researchers on either side; after all, both sides deal with data. From this, we have seen deductive databases emerge, as well as more recently &amp;quot;database friendly&amp;quot; profiles of OWL.&lt;/p&gt; &lt;p&gt;In this position paper we will examine what, in the most concrete terms, is needed in order to bring leading edge database technology together with expressive querying and reasoning. This draws on our experience in building &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x240cdd28&quot;&gt;Virtuoso&lt;/a&gt;, one of today&amp;#39;s leading &lt;a href=&quot;http://dbpedia.org/page/Graph_database&quot; id=&quot;link-id0x24ceaae0&quot;&gt;graph data stores&lt;/a&gt;. Following this, we argue for the creation of benchmarks and challenges that in fact do reflect reality and facilitate open and fair comparison of products and technologies.&lt;/p&gt; &lt;p&gt;Data integration is often mentioned as the motivating use case for GDB, commonly popularized today as RDF. Database research has over the past few years produced great advances for business intelligence (i.e., complex queries and read-mostly workloads). These advances are typified by compressed columnar storage and architecture-conscious execution models, mostly based on the idea of always processing multiple sets of values in each operation (vectoring). With these techniques, raw performance with relatively simple schemas and regular data (e.g., TPC-H) is no longer a barrier to extracting value from data.&lt;/p&gt; &lt;p&gt;A similar breakthrough has not been seen on the semantics side. Data integration still requires manual labor. Publishing GDB datasets is a good and necessary intermediate stage, but producing these datasets from diverse sources is not fundamentally different from doing the same work without GDB or RDF. Even so, GDB and RDF serve as a catalyst for a culture of publishing datasets.&lt;/p&gt; &lt;p&gt;GDB, as a base model for integration, offers the following benefits over a purely relational result format: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;All entities have globally unique identifiers.&lt;/li&gt; &lt;li&gt;Any statements may be associated ad hoc to any entities.&lt;/li&gt; &lt;li&gt;These statements can be scoped into graphs according to their provenance, time, validity, etc.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Obtaining this flexibility on a relational basis would simply require moving to an graph-like representation with essentially one-row-per-attribute. Indeed, we see key-value stores being used in online applications with high volatility of schema (e.g., social networks, search); and we also see relational applications making provisions for post-hoc addition of per-entity attributes (i.e., associating a bag of mixed non-first normal form data with entities). The benefits of a schema-last approach are recognized in many places.&lt;/p&gt; &lt;p&gt;GDB seems &lt;i&gt;a priori&lt;/i&gt; a fit for all these requirements, thus how will it claim its place as a solution?&lt;/p&gt; &lt;p&gt;The first part of the answer lies in learning all the relevant database lessons. The second part lies in eliminating the impedance mismatch between querying and reasoning. The third and most important part consists of substantiating these claims in a manner that is understandable to the relevant publics, finally leading to the creation of a semantics-aware segment of the database industry. We will address each of these aspects in turn.&lt;/p&gt; &lt;h4&gt;GDB and RDB&lt;/h4&gt; &lt;p&gt;The problem is divided into storage format, execution, and query optimization. For the first two, Daniel Abadi&amp;#39;s &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x25ebd568&quot;&gt;renowned Ph.D. thesis&lt;/a&gt; holds most of the keys. Space efficiency is specially important for Linked Data, since data is often voluminous, and many datasets have to be brought together for integration. Access patterns are also unpredictable, with indexed-random-access predominating, as opposed to RDB BI workloads where sequential scans and hash joins represent the bulk of the work. However, we find that a sorted column-wise compressed representation of Linked Data with a single quad table for all statements gives excellent space efficiency and good random access as well as random insert speed. The space efficiency is close to par with the equivalent column-wise relational format, since three of the four columns of the quad table compress to almost nothing. As many sort orders as are necessary may be maintained, but we find that two are enough, with some extra data structures for dealing with queries where the predicate is unspecified. The details are found in VLDB 2010 Semdata workshop paper, &lt;i&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x244a8010&quot;&gt;Directions and Challenges for Semantically Linked Data&lt;/a&gt;&lt;/i&gt;. Since GDB/RDF is a model typed at run time, the engine must support an &amp;quot;&lt;code&gt;ANY&lt;/code&gt;&amp;quot; data type for columns and query variables, where values on successive rows may be of different types. This is a straightforward enhancement.&lt;/p&gt; &lt;p&gt;Vectored execution is traditionally associated with column stores because the per-row access cost is relatively high, thus needing to access many nearby rows at a time in order to amortize the overhead. Aside this, vectored execution provides many opportunities for parallelism, from the instruction level all the way to threading and distributed execution on clusters, thus some form of execution on large numbers of concurrent query states is needed for RDF stores, just as it is needed for RDBMS&amp;quot;s.&lt;/p&gt; &lt;p&gt;Query optimization for GDBMS is similar to that for RDBMS, except that the statistics can no longer be collected by column and table, but must rather apply to individual entities and ranges of a single quad table. This can be provided through run-time sampling of the database based on constants in the query being optimized. This may take into account trivial inference such as expanding properties into the set of their sub-properties and the like. Beyond this, interleaving execution and optimization (as in &lt;a href=&quot;http://oai.cwi.nl/oai/asset/14193/14193B.pdf&quot; id=&quot;link-id0x264cfd20&quot;&gt;ROX&lt;/a&gt;) seems to offer limitless possibilities, especially when inference is introduced, making optimizer statistics less predictive. &lt;/p&gt; &lt;p&gt;In summary, starting with an RDBMS and going to GDB entails changes to all parts of the engine, but these changes are not fundamental. One does need to own the engine; however, otherwise the expertise for efficiently implementing these changes will not exist. Essentially any DBMS technique may be translated to a GDB use case, if its application can be decided at run-time. GDB may be schema-less, yet most datasets have fairly regular structure; the question is simply to reconstruct the needed statistics and schema information from the data on an as you go basis. Techniques with high up-front cost, like constructing specially ordered materializations for optimizing specific queries, are harder to deploy but still conceivable for GDB also.&lt;/p&gt; &lt;h4&gt;RDB and Inference&lt;/h4&gt; &lt;p&gt;Compared to the straightforwardly performance oriented world of database engines, the contours of the landscape become less defined when moving to inference. Databases, whether relational or schema-less all perform roughly the same functions but inference is more diverse. We include here also techniques like machine learning and meta-reasoning for guiding reasoning, although these might not strictly fit the definition.&lt;/p&gt; &lt;p&gt;As we posit that data integration is the motivating use case for GDB as opposed to RDB (Relational Database Model), we must ask which modes of inference are actually required for data integration. Further, we need to ask whether these inferences ought to be applied as a preprocessing step (ETL or forward chaining), or as needed (backward chaining). Some low-hanging fruit can be collected by simply constructing class or property hierarchies; e.g., in the data at hand, the following properties have the meaning of company name, and the following classes have the meaning of company. We have found that such techniques can be efficiently supported at run-time, without materialization, if the support is simply built into the engine, which is in itself straightforward as long as one controls the engine. The same applies to trivial identity resolution, such as &lt;code&gt;owl:sameAs&lt;/code&gt; or resolution of identity based on sharing an inverse-functional property value. These things take longer at run-time, but if one caches and reuses the result, one can get around materialization.&lt;/p&gt; &lt;p&gt;We do not believe in weak statements of identity, as in &lt;i&gt;X is similar to Y,&lt;/i&gt; since the meaning of similarity is entirely contextual. X and Y may or may not be interchangeable depending on the application; thus the statement on identity needs to be strong, but it must be easy to modify the grounds on which such a statement is made. This is a further argument for why one should not automatically materialize consequences of identity, particularly if dealing with web data where identity is especially problematic.&lt;/p&gt; &lt;p&gt;Real-world problems are however harder than just bundling properties, classes, or instances into sets of interchangeable equivalents, which is all we have mentioned thus far. There are differences of modeling (&amp;quot;address as many columns in customer table&amp;quot; vs. &amp;quot;address normalized away under a contact entity&amp;quot;), normalization (&amp;quot;first name&amp;quot; and &amp;quot;last name&amp;quot; as one or more properties; national conventions on person names; tags as comma-separated in a string or as a one-to-many), incomplete data (one customer table has family income bracket, the other does not), diversity in units of measurement (Imperial vs. metric), variability in the definition of units (seven different things all called blood pressure), variability in unit conversions (currency exchange rates), to name a few. What a world!&lt;/p&gt; &lt;p&gt;If data exists, the conversion questions are often answerable but their answer depends on context -- e.g., date of transaction for currency exchange rate; source of data for the definition of blood pressure.&lt;/p&gt; &lt;p&gt;Alongside these, there remain issues of identity, e.g., depending on the perspective, a national subsidiary is or is not the same entity as the parent company, companies with the same name can be entirely unrelated in different jurisdictions.&lt;/p&gt; &lt;p&gt;It appears that we may need a multi-level approach, combining different techniques for different phases of the integration process. We do not &lt;i&gt;a priori&lt;/i&gt; believe that using SQL VIEWs for unit and modeling conversion, and then OWL for unifying terminology on top of this, were the whole solution. Even if this were the solution, the pipeline from the relational sources to SPARQL and OWL needs to be optimized for real-world BI information volumes, and the query language needs to be able to express the business questions and needs to interface with the reporting tools the analyst has come to expect.&lt;/p&gt; &lt;p&gt;Our answer so far consists of a SPARQL extension with non-recursive rules, roughly equivalent to SQL VIEWs in expressive power, tightly integrated to the query engine. There is also limited support for recursion through transitive subqueries; thus one can compactly express things like &amp;quot;all parts of all assemblies and subassemblies must satisfy applicable safety requirements, where the requirements depend on the type of the part in question.&amp;quot;&lt;/p&gt; &lt;p&gt;This is only an intermediate step. We believe that a database-scale generic inference engine with at least Datalog power, with second-order extensions like computed predicates, is needed, executing inside the DBMS, benefiting from the whole array of optimizations database-science expects of execution engines, as part of the answer.&lt;/p&gt; &lt;p&gt;This will not relieve the analyst of having to consider that the currency rates in effect at the time of conversion must be taken into account when calculating profits, but this will at least make expressing this and similar pieces of context more compact.&lt;/p&gt; &lt;p&gt;We note that time-to-answer has historically won over raw performance. This was also the case for RDBMS when these were the fresh challenger to the CODASYL incumbents, just as was the case with the adoption of high-level languages. The key is that the raw performance must be sufficient for the real world task. With the adoption of the database lessons outlined in the previous section, we believe this to be the case for GDB (and thus, RDF).&lt;/p&gt; &lt;h4&gt;Substantiating the Claims&lt;/h4&gt; &lt;p&gt;Benchmarks have a stellar record for improving any metric they measure. The question is, how can we make a metric that measures GDB&amp;#39;s ability to deliver on its claim to fame -- time-to-answer for big data -- with all the integration and other complexities this entails?&lt;/p&gt; &lt;p&gt;So far, GDB benchmarks have consisted of workloads where RDBMS are clearly better (e.g., LUBM, or the Berlin SPARQL Benchmark). This does not remove their usefulness for GDB, but does not constitute a GDB selling point, either.&lt;/p&gt; &lt;p&gt;We suggest a dual approach. The first part is demonstrating that GDB is scalable for BI: We take the industry standard decision support benchmark TPC-H, which is very favorable to RDB and quite unfavorable to GDB, and show that we can tackle the workload at reasonable cost. If TPC-H is all one wants, an RDBMS will stay a better fit, but then this benchmark does not capture any of the heterogeneity, schema evolution, or other such requirements faced by real-world data warehouses. This is still a qualification test, not the selling point.&lt;/p&gt; &lt;p&gt;The issue of benchmark is inextricably tied to the issue of messaging. There must be a compelling story, with which the IT community can identify. Further, the benchmark must capture real-world challenges in the area of interest. With all this, the benchmark should not be too expensive to run. Here too, a multistage approach suggests itself.&lt;/p&gt; &lt;p&gt;Our tentative answer to this question is the Social Intelligence Benchmark (SIB), developed together with CWI and other partners in the LOD2 consortium. This simulates a social network and combines an online workload with complex analytics. This benchmark should cover all of the target areas of the LOD2 project, so that the project itself generates its own metric of success. The project has clear data integration targets, especially as applies to Web and Linked Data. Questions of integration with enterprise sources need to be further developed; for example, comparing CRM data with extractions from the online conversation space for market research.&lt;/p&gt; &lt;p&gt;Data integration will invariably involve human effort, and the area cannot be satisfactorily covered with metrics of scale and throughput alone. Development time, accuracy of results, and cost of maintenance are all factors. Furthermore, the task being modeled must correspond to reality, still without being too domain-specific or prohibitively time-consuming to implement.&lt;/p&gt; &lt;h4&gt;Conclusions&lt;/h4&gt; &lt;p&gt;The data driven world will increase rewards for efficiency in data integration. We believe that such efficiency crucially depends on semantics. Real world requirements just might throw the database and AI communities together with enough heat and pressure for fusion to ignite, allegorically speaking. Without a clear and present need, the geek world analog of electrostatic repulsion will keep the communities separate, as has been the case thus far, and no new, qualitatively-different element will arise.&lt;/p&gt; &lt;p&gt;Efforts such as this STI Summit and the LOD2 Project are needed for setting directions and communicating the requirement to the research world. In our fusion analogy, this is the field which directs the nuclei to collide.&lt;/p&gt; &lt;p&gt;Once there is an actual reaction that produces more than it consumes by a sufficient margin, regular business dynamics will take over, and we will have an industry with several products of comparable capability, as well as a set of metrics, all to the benefit of the end user.&lt;/p&gt; &lt;h4&gt;References&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;TPC-H &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x25b910e8&quot;&gt;results pages&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Daniel Abadi&amp;#39;s Ph.D. Thesis, &lt;i&gt;Query Execution in Column-Oriented Database Systems&lt;/i&gt; ( &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x25f8eeb0&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Our VLDB 2010 Semdata workshop paper, &lt;i&gt;Directions and Challenges for Semantically Linked Data&lt;/i&gt; ( &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x25f88520&quot;&gt;HTML&lt;/a&gt; | &lt;a href=&quot;http://virtuoso.openlinksw.com/whitepapers/Directions_and_Challenges_for_Semantically_Linked_Data.pdf&quot; id=&quot;link-id0x271416b8&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;CWI&amp;#39;s &lt;i&gt;ROX: Run-time Optimization of XQueries&lt;/i&gt; ( &lt;a href=&quot;http://oai.cwi.nl/oai/asset/14193/14193B.pdf&quot; id=&quot;link-id0x2699ac78&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x25856fc8&quot;&gt;LOD2 Project web site&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-07-26T09:40:34.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>GDB for the Data Driven Age (STI Summit Position Paper)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-07-26#1696</atom:id>
  <atom:published>2011-07-26T13:36:58Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; The following was written prior to the event, but was not posted until later due to human error.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://sti2.org/&quot; id=&quot;link-id0x261e3798&quot;&gt;Semantic Technology Institute&lt;/a&gt; (&lt;a href=&quot;http://sti2.org/&quot; id=&quot;link-id0x243dac30&quot;&gt;STI&lt;/a&gt;) is organizing &lt;a href=&quot;http://summit2011.sti2.org/&quot; id=&quot;link-id0x25fc4e68&quot;&gt;a meeting&lt;/a&gt; around the questions of making semantic technology deliver on its promise. We were asked to present a position paper (reproduced below). This is another recap of our position on making graph databasing come of age. While the database technology matters are getting tackled, we are drawing closer to the question of deciding actually what kind of inference will be needed close to the data. My personal wish is to use this summit for clarifying exactly what is needed from the database in order to extract value from the data explosion. We have a good idea of what to do with queries but what is the exact requirement for transformation and alignment of schema and identifiers? What is the actual use case of inference, OWL or other, in this? It is time to get very concrete in terms of applications. We expect a mixed requirement but it is time to look closely at the details.&lt;/p&gt; &lt;h3&gt;GDB for the Data Driven Age&lt;/h3&gt; &lt;p&gt;Databases and knowledge representation both have decades of history, but to date the exchange of ideas and techniques between these disciplines has been limited. The intuition that there would be value in greater cooperation has not failed to occur to researchers on either side; after all, both sides deal with data. From this, we have seen deductive databases emerge, as well as more recently &amp;quot;database friendly&amp;quot; profiles of OWL.&lt;/p&gt; &lt;p&gt;In this position paper we will examine what, in the most concrete terms, is needed in order to bring leading edge database technology together with expressive querying and reasoning. This draws on our experience in building &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id0x240cdd28&quot;&gt;Virtuoso&lt;/a&gt;, one of today&amp;#39;s leading &lt;a href=&quot;http://dbpedia.org/page/Graph_database&quot; id=&quot;link-id0x24ceaae0&quot;&gt;graph data stores&lt;/a&gt;. Following this, we argue for the creation of benchmarks and challenges that in fact do reflect reality and facilitate open and fair comparison of products and technologies.&lt;/p&gt; &lt;p&gt;Data integration is often mentioned as the motivating use case for GDB, commonly popularized today as RDF. Database research has over the past few years produced great advances for business intelligence (i.e., complex queries and read-mostly workloads). These advances are typified by compressed columnar storage and architecture-conscious execution models, mostly based on the idea of always processing multiple sets of values in each operation (vectoring). With these techniques, raw performance with relatively simple schemas and regular data (e.g., TPC-H) is no longer a barrier to extracting value from data.&lt;/p&gt; &lt;p&gt;A similar breakthrough has not been seen on the semantics side. Data integration still requires manual labor. Publishing GDB datasets is a good and necessary intermediate stage, but producing these datasets from diverse sources is not fundamentally different from doing the same work without GDB or RDF. Even so, GDB and RDF serve as a catalyst for a culture of publishing datasets.&lt;/p&gt; &lt;p&gt;GDB, as a base model for integration, offers the following benefits over a purely relational result format: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;All entities have globally unique identifiers.&lt;/li&gt; &lt;li&gt;Any statements may be associated ad hoc to any entities.&lt;/li&gt; &lt;li&gt;These statements can be scoped into graphs according to their provenance, time, validity, etc.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Obtaining this flexibility on a relational basis would simply require moving to an graph-like representation with essentially one-row-per-attribute. Indeed, we see key-value stores being used in online applications with high volatility of schema (e.g., social networks, search); and we also see relational applications making provisions for post-hoc addition of per-entity attributes (i.e., associating a bag of mixed non-first normal form data with entities). The benefits of a schema-last approach are recognized in many places.&lt;/p&gt; &lt;p&gt;GDB seems &lt;i&gt;a priori&lt;/i&gt; a fit for all these requirements, thus how will it claim its place as a solution?&lt;/p&gt; &lt;p&gt;The first part of the answer lies in learning all the relevant database lessons. The second part lies in eliminating the impedance mismatch between querying and reasoning. The third and most important part consists of substantiating these claims in a manner that is understandable to the relevant publics, finally leading to the creation of a semantics-aware segment of the database industry. We will address each of these aspects in turn.&lt;/p&gt; &lt;h4&gt;GDB and RDB&lt;/h4&gt; &lt;p&gt;The problem is divided into storage format, execution, and query optimization. For the first two, Daniel Abadi&amp;#39;s &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x25ebd568&quot;&gt;renowned Ph.D. thesis&lt;/a&gt; holds most of the keys. Space efficiency is specially important for Linked Data, since data is often voluminous, and many datasets have to be brought together for integration. Access patterns are also unpredictable, with indexed-random-access predominating, as opposed to RDB BI workloads where sequential scans and hash joins represent the bulk of the work. However, we find that a sorted column-wise compressed representation of Linked Data with a single quad table for all statements gives excellent space efficiency and good random access as well as random insert speed. The space efficiency is close to par with the equivalent column-wise relational format, since three of the four columns of the quad table compress to almost nothing. As many sort orders as are necessary may be maintained, but we find that two are enough, with some extra data structures for dealing with queries where the predicate is unspecified. The details are found in VLDB 2010 Semdata workshop paper, &lt;i&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x244a8010&quot;&gt;Directions and Challenges for Semantically Linked Data&lt;/a&gt;&lt;/i&gt;. Since GDB/RDF is a model typed at run time, the engine must support an &amp;quot;&lt;code&gt;ANY&lt;/code&gt;&amp;quot; data type for columns and query variables, where values on successive rows may be of different types. This is a straightforward enhancement.&lt;/p&gt; &lt;p&gt;Vectored execution is traditionally associated with column stores because the per-row access cost is relatively high, thus needing to access many nearby rows at a time in order to amortize the overhead. Aside this, vectored execution provides many opportunities for parallelism, from the instruction level all the way to threading and distributed execution on clusters, thus some form of execution on large numbers of concurrent query states is needed for RDF stores, just as it is needed for RDBMS&amp;quot;s.&lt;/p&gt; &lt;p&gt;Query optimization for GDBMS is similar to that for RDBMS, except that the statistics can no longer be collected by column and table, but must rather apply to individual entities and ranges of a single quad table. This can be provided through run-time sampling of the database based on constants in the query being optimized. This may take into account trivial inference such as expanding properties into the set of their sub-properties and the like. Beyond this, interleaving execution and optimization (as in &lt;a href=&quot;http://oai.cwi.nl/oai/asset/14193/14193B.pdf&quot; id=&quot;link-id0x264cfd20&quot;&gt;ROX&lt;/a&gt;) seems to offer limitless possibilities, especially when inference is introduced, making optimizer statistics less predictive. &lt;/p&gt; &lt;p&gt;In summary, starting with an RDBMS and going to GDB entails changes to all parts of the engine, but these changes are not fundamental. One does need to own the engine; however, otherwise the expertise for efficiently implementing these changes will not exist. Essentially any DBMS technique may be translated to a GDB use case, if its application can be decided at run-time. GDB may be schema-less, yet most datasets have fairly regular structure; the question is simply to reconstruct the needed statistics and schema information from the data on an as you go basis. Techniques with high up-front cost, like constructing specially ordered materializations for optimizing specific queries, are harder to deploy but still conceivable for GDB also.&lt;/p&gt; &lt;h4&gt;RDB and Inference&lt;/h4&gt; &lt;p&gt;Compared to the straightforwardly performance oriented world of database engines, the contours of the landscape become less defined when moving to inference. Databases, whether relational or schema-less all perform roughly the same functions but inference is more diverse. We include here also techniques like machine learning and meta-reasoning for guiding reasoning, although these might not strictly fit the definition.&lt;/p&gt; &lt;p&gt;As we posit that data integration is the motivating use case for GDB as opposed to RDB (Relational Database Model), we must ask which modes of inference are actually required for data integration. Further, we need to ask whether these inferences ought to be applied as a preprocessing step (ETL or forward chaining), or as needed (backward chaining). Some low-hanging fruit can be collected by simply constructing class or property hierarchies; e.g., in the data at hand, the following properties have the meaning of company name, and the following classes have the meaning of company. We have found that such techniques can be efficiently supported at run-time, without materialization, if the support is simply built into the engine, which is in itself straightforward as long as one controls the engine. The same applies to trivial identity resolution, such as &lt;code&gt;owl:sameAs&lt;/code&gt; or resolution of identity based on sharing an inverse-functional property value. These things take longer at run-time, but if one caches and reuses the result, one can get around materialization.&lt;/p&gt; &lt;p&gt;We do not believe in weak statements of identity, as in &lt;i&gt;X is similar to Y,&lt;/i&gt; since the meaning of similarity is entirely contextual. X and Y may or may not be interchangeable depending on the application; thus the statement on identity needs to be strong, but it must be easy to modify the grounds on which such a statement is made. This is a further argument for why one should not automatically materialize consequences of identity, particularly if dealing with web data where identity is especially problematic.&lt;/p&gt; &lt;p&gt;Real-world problems are however harder than just bundling properties, classes, or instances into sets of interchangeable equivalents, which is all we have mentioned thus far. There are differences of modeling (&amp;quot;address as many columns in customer table&amp;quot; vs. &amp;quot;address normalized away under a contact entity&amp;quot;), normalization (&amp;quot;first name&amp;quot; and &amp;quot;last name&amp;quot; as one or more properties; national conventions on person names; tags as comma-separated in a string or as a one-to-many), incomplete data (one customer table has family income bracket, the other does not), diversity in units of measurement (Imperial vs. metric), variability in the definition of units (seven different things all called blood pressure), variability in unit conversions (currency exchange rates), to name a few. What a world!&lt;/p&gt; &lt;p&gt;If data exists, the conversion questions are often answerable but their answer depends on context -- e.g., date of transaction for currency exchange rate; source of data for the definition of blood pressure.&lt;/p&gt; &lt;p&gt;Alongside these, there remain issues of identity, e.g., depending on the perspective, a national subsidiary is or is not the same entity as the parent company, companies with the same name can be entirely unrelated in different jurisdictions.&lt;/p&gt; &lt;p&gt;It appears that we may need a multi-level approach, combining different techniques for different phases of the integration process. We do not &lt;i&gt;a priori&lt;/i&gt; believe that using SQL VIEWs for unit and modeling conversion, and then OWL for unifying terminology on top of this, were the whole solution. Even if this were the solution, the pipeline from the relational sources to SPARQL and OWL needs to be optimized for real-world BI information volumes, and the query language needs to be able to express the business questions and needs to interface with the reporting tools the analyst has come to expect.&lt;/p&gt; &lt;p&gt;Our answer so far consists of a SPARQL extension with non-recursive rules, roughly equivalent to SQL VIEWs in expressive power, tightly integrated to the query engine. There is also limited support for recursion through transitive subqueries; thus one can compactly express things like &amp;quot;all parts of all assemblies and subassemblies must satisfy applicable safety requirements, where the requirements depend on the type of the part in question.&amp;quot;&lt;/p&gt; &lt;p&gt;This is only an intermediate step. We believe that a database-scale generic inference engine with at least Datalog power, with second-order extensions like computed predicates, is needed, executing inside the DBMS, benefiting from the whole array of optimizations database-science expects of execution engines, as part of the answer.&lt;/p&gt; &lt;p&gt;This will not relieve the analyst of having to consider that the currency rates in effect at the time of conversion must be taken into account when calculating profits, but this will at least make expressing this and similar pieces of context more compact.&lt;/p&gt; &lt;p&gt;We note that time-to-answer has historically won over raw performance. This was also the case for RDBMS when these were the fresh challenger to the CODASYL incumbents, just as was the case with the adoption of high-level languages. The key is that the raw performance must be sufficient for the real world task. With the adoption of the database lessons outlined in the previous section, we believe this to be the case for GDB (and thus, RDF).&lt;/p&gt; &lt;h4&gt;Substantiating the Claims&lt;/h4&gt; &lt;p&gt;Benchmarks have a stellar record for improving any metric they measure. The question is, how can we make a metric that measures GDB&amp;#39;s ability to deliver on its claim to fame -- time-to-answer for big data -- with all the integration and other complexities this entails?&lt;/p&gt; &lt;p&gt;So far, GDB benchmarks have consisted of workloads where RDBMS are clearly better (e.g., LUBM, or the Berlin SPARQL Benchmark). This does not remove their usefulness for GDB, but does not constitute a GDB selling point, either.&lt;/p&gt; &lt;p&gt;We suggest a dual approach. The first part is demonstrating that GDB is scalable for BI: We take the industry standard decision support benchmark TPC-H, which is very favorable to RDB and quite unfavorable to GDB, and show that we can tackle the workload at reasonable cost. If TPC-H is all one wants, an RDBMS will stay a better fit, but then this benchmark does not capture any of the heterogeneity, schema evolution, or other such requirements faced by real-world data warehouses. This is still a qualification test, not the selling point.&lt;/p&gt; &lt;p&gt;The issue of benchmark is inextricably tied to the issue of messaging. There must be a compelling story, with which the IT community can identify. Further, the benchmark must capture real-world challenges in the area of interest. With all this, the benchmark should not be too expensive to run. Here too, a multistage approach suggests itself.&lt;/p&gt; &lt;p&gt;Our tentative answer to this question is the Social Intelligence Benchmark (SIB), developed together with CWI and other partners in the LOD2 consortium. This simulates a social network and combines an online workload with complex analytics. This benchmark should cover all of the target areas of the LOD2 project, so that the project itself generates its own metric of success. The project has clear data integration targets, especially as applies to Web and Linked Data. Questions of integration with enterprise sources need to be further developed; for example, comparing CRM data with extractions from the online conversation space for market research.&lt;/p&gt; &lt;p&gt;Data integration will invariably involve human effort, and the area cannot be satisfactorily covered with metrics of scale and throughput alone. Development time, accuracy of results, and cost of maintenance are all factors. Furthermore, the task being modeled must correspond to reality, still without being too domain-specific or prohibitively time-consuming to implement.&lt;/p&gt; &lt;h4&gt;Conclusions&lt;/h4&gt; &lt;p&gt;The data driven world will increase rewards for efficiency in data integration. We believe that such efficiency crucially depends on semantics. Real world requirements just might throw the database and AI communities together with enough heat and pressure for fusion to ignite, allegorically speaking. Without a clear and present need, the geek world analog of electrostatic repulsion will keep the communities separate, as has been the case thus far, and no new, qualitatively-different element will arise.&lt;/p&gt; &lt;p&gt;Efforts such as this STI Summit and the LOD2 Project are needed for setting directions and communicating the requirement to the research world. In our fusion analogy, this is the field which directs the nuclei to collide.&lt;/p&gt; &lt;p&gt;Once there is an actual reaction that produces more than it consumes by a sufficient margin, regular business dynamics will take over, and we will have an industry with several products of comparable capability, as well as a set of metrics, all to the benefit of the end user.&lt;/p&gt; &lt;h4&gt;References&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;TPC-H &lt;a href=&quot;http://www.tpc.org/tpch/&quot; id=&quot;link-id0x25b910e8&quot;&gt;results pages&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Daniel Abadi&amp;#39;s Ph.D. Thesis, &lt;i&gt;Query Execution in Column-Oriented Database Systems&lt;/i&gt; ( &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x25f8eeb0&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Our VLDB 2010 Semdata workshop paper, &lt;i&gt;Directions and Challenges for Semantically Linked Data&lt;/i&gt; ( &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x25f88520&quot;&gt;HTML&lt;/a&gt; | &lt;a href=&quot;http://virtuoso.openlinksw.com/whitepapers/Directions_and_Challenges_for_Semantically_Linked_Data.pdf&quot; id=&quot;link-id0x271416b8&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;CWI&amp;#39;s &lt;i&gt;ROX: Run-time Optimization of XQueries&lt;/i&gt; ( &lt;a href=&quot;http://oai.cwi.nl/oai/asset/14193/14193B.pdf&quot; id=&quot;link-id0x2699ac78&quot;&gt;PDF&lt;/a&gt; )&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x25856fc8&quot;&gt;LOD2 Project web site&lt;/a&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-07-26T09:39:43-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The 2011 STI Semantic Summit</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-07-22#1695</atom:id>
  <atom:published>2011-07-22T15:49:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was recently at the &lt;a href=&quot;http://www.openlinksw.com:80/www.sti2.org/events/2011-sti-semantic-summit&quot; id=&quot;link-id0x2308d838&quot;&gt;STI 2011 summit in Riga, Latvia&lt;/a&gt;. This is a meeting of senior participants in the semantic web and sem tech scene, organized by &lt;a href=&quot;http://www.openlinksw.com:80/www.sti2.org/&quot; id=&quot;link-id0x25076168&quot;&gt;STI&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/page/Dieter_Fensel&quot; id=&quot;link-id0x24d2e998&quot;&gt;Dieter Fensel&lt;/a&gt; fame, with board members like &lt;a href=&quot;http://www.michaelbrodie.com/&quot; id=&quot;link-id0x224b4b58&quot;&gt;Michael Brodie&lt;/a&gt;, &lt;a href=&quot;http://www.iks-project.eu/community/people/mark-greaves&quot; id=&quot;link-id0x2308d4a8&quot;&gt;Mark Greaves&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/page/James_Hendler&quot; id=&quot;link-id0x24c192d0&quot;&gt;Jim Hendler&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This is substantially about the intersection of AI, knowledge representation, and databases. As we have said before, the database side has not been very prominent in these meetings in the past, but this time we had &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x26654260&quot;&gt;Peter Boncz&lt;/a&gt; of CWI, of MonetDB and VectorWise fame, attending the proceedings.&lt;/p&gt; &lt;p&gt;Will DB and AI finally meet? Well, they have met, but how do they get along? Before I try to answer this, let us look at some background.&lt;/p&gt; &lt;p&gt;At present, CWI and &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x24724fe0&quot;&gt;OpenLink&lt;/a&gt; are working together in the &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x24e20d90&quot;&gt;LOD2 EU FP7 project&lt;/a&gt;, around the general topic of bringing the best of &lt;a href=&quot;http://dbpedia.org/page/Relational_database&quot; id=&quot;link-id0x2475f128&quot;&gt;Relational Database&lt;/a&gt; (RDB) science to the &lt;a href=&quot;http://dbpedia.org/page/Graph_database&quot; id=&quot;link-id0x2474e988&quot;&gt;Graph Database&lt;/a&gt; (GDB) world. Virtuoso has for a few months had a column store capability (which is about to be made available for public preview). CWI has a long history of column store work, with MonetDB and Ingres VectorWise as results. OpenLink&amp;#39;s column store implementation is separate in terms of code but is of course influenced by the work at CWI and other published column store results. The plan is to transplant the applicable CWI innovations into the graph context within Virtuoso. These improvements naturally also benefit Virtuoso RDB (SQL), but the LOD2 project is primarily concerned with GDB applications. The RDB yardstick for much of this work is &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x22a96588&quot;&gt;TPC-H&lt;/a&gt;, of which we have made a GDB translation. CWI is uniquely qualified as concerns this in light of VectorWise holding some of the top places in the TPC-H charts.&lt;/p&gt; &lt;p&gt;Even now, we do in fact run the 22 TPC-H queries in SPARQL against the Virtuoso column store. True, these run faster in SQL against relational tables but we have established a beach head. From this initial position, we can incrementally improve the GDB/SPARQL and RDB/SQL functions, and see how close to SQL we get with SPARQL. I will make a separate post commenting on the differences between SQL and SPARQL.&lt;/p&gt; &lt;p&gt;So let&amp;#39;s get back to Riga. Mark Greaves said in his opening comments that he would be sick if he once again heard complaining about how bad and un-scalable the tools were. From all the talks, I did get the overall impression that just better databasing for Graph Data is still needed. OK, we have 1-1/2 years of unreleased work just for that about to hit the street; advances are substantial. Along these lines, the people from &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x2315c088&quot;&gt;Bio2RDF&lt;/a&gt; pointed out that there still is a cost to publishing query services, specially for complex queries. Well, this cost will be substantially reduced.&lt;/p&gt; &lt;p&gt;The takeaway from the meeting is that the most useful thing, for both our public and ourselves, is simply to keep advancing database tech for graph data. In the first instance, this is about launching what we already have; in the second, about going through the CWI record of innovation and adapting this to GDB.&lt;/p&gt; &lt;p&gt;The thinking is that once query-answering on some tens-of-billions of triples is easily interactive no matter what question one asks, a tipping point will be reached, and GDB can efficiently play the role of data-melting-pot that has been envisioned for it.&lt;/p&gt; &lt;p&gt;This is just a beginning, though. Michael Brodie has on a number of occasions pointed out that that (relational) database guys are only about performance with little or no regard to meaning or even questions of the applicability of the relational model. Peter Boncz then comments back that it can well be that the bulk of IT expenditure worldwide in fact goes into data integration. However, data integration is an &amp;quot;&lt;a href=&quot;http://dbpedia.org/page/AI-complete&quot; id=&quot;link-id0x24754170&quot;&gt;AI-complete&lt;/a&gt;&amp;quot; problem with infinite variety and consequent difficulty of measurement. So, making better database engines stands a much greater chance of success and has the nicety of relatively unambiguous metrics. &lt;/p&gt; &lt;p&gt;Quite so. We are somewhere in the middle. I&amp;#39;d say that GDB is still at the stage where making better databases is a matter of make-or-break and not a matter of cutting already vanishingly-short response times just for the sake of it. We will have progress if we just keep at it; for now, performance is still a basic need and not a luxury.&lt;/p&gt; &lt;p&gt;Now that there is all this potentially integrable data published as graphs (most commonly as RDF serializations), what do we do? Someone at the Riga meeting suggested we take a look across the tracks to the RDB world to see what is being done there for data integration. The question is raised, what does GDB have for data integration? The automatic answer that GDB and RDF have OWL is not adequate, as was rightly pointed out by many. Having schema-last, global identifiers, and some culture of vocabulary reuse is nice, but this is only a start. To cite an example, &lt;code&gt;owl:sameAs&lt;/code&gt; will not work when entities simply do not align: One database models a product as a parts hierarchy; another does the same but now based on the materials used in the parts. One tree just has a node that is not in the other. Besides, things like string matching (as in extracting area codes from phone numbers) are common, and OWL specifically excludes any such functions.&lt;/p&gt; &lt;p&gt;It is now time to look at what will come after all the database advances. In my talk I outlined some things that have or are about to get solutions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Database technology:&lt;/b&gt; Applying advances from RDB (specifically columns, vectoring, and some adaptive query execution) will make GDB a possibility for data warehousing at some scale.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Benchmarks:&lt;/b&gt; These advances will be demonstrable through benchmarking. There is a better suite of benchmarks with many variations of BSBM, an GDB-modified TPC-H, and the upcoming Social Intelligence Benchmark (SIBB) with actual graph data. There are the beginnings of an auditing process for result publishing, and a fair chance the semdata world will get its analog of the TPC.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;After these basics are more or less in hand, we have a vista of more diverse questions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;What to do about inference? We do not want OWL or RIF for their own sake; instead we want whatever will declaratively facilitate making sense of data. This is an entirely use-case-driven question. If this can have a reasonably generic answer, we will build it into the engine. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Data integration is highly diverse, and tool sets like IBM Infosphere have thousands of modules and functions for different aspects of the problem. To what degree does it make sense to put DI-oriented capabilities into a DBMS? &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Is it the case that SQL or SPARQL, plus or minus a few details, is as powerful as a language can be while staying application domain-agnostic? In other words, if more powerful reasoning is built into the query language, will the requirements vary so much between application domains that the work is not generally applicable? &lt;a href=&quot;http://dbpedia.org/page/Datalog&quot; id=&quot;link-id0x2403b2f0&quot;&gt;Datalog&lt;/a&gt; is general enough, but can we demonstrate substantially reduced time to answer with big data if this is built into the engine? &lt;a href=&quot;http://boom.cs.berkeley.edu/&quot; id=&quot;link-id0x23ed5730&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; claims this, even though their claim is not exactly in a database context. We need use cases to refine the actual requirement for inference.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In all these questions, we of necessity turn to the user community. In fact we do not follow the usage of these technologies as much as we ought to. One outcome of the Riga summit is a set of public challenges that will hopefully ameliorate this state of matters, to be released soon.&lt;/p&gt; &lt;p&gt;The general feeling was that there is more going on on the data side than the AI side. The LOD movement proceeds and lightweight everything predominates, also for knowledge representation. There was some discussion about &amp;quot;pay as you go&amp;quot; integration. On the one hand, there is no up-front integration of information systems just for its own sake, so pay as you go is the only kind that exists, system by system, as the need becomes sufficient. On the other hand, each such integration is a process which has its distinct steps and maintenance and within itself it is planned, and thus pre-paid, so to speak. We need more work with the data itself to better understand the matter. The open government data should offer a playground for this and there will be a special challenge around this.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://schema.org/&quot; id=&quot;link-id0x2475a708&quot;&gt;Schema.org&lt;/a&gt; and &lt;a href=&quot;http://www.w3.org/TR/microdata/&quot; id=&quot;link-id0x2a6f8b40&quot;&gt;Microdata&lt;/a&gt; got their share of discussion. As we see it, it is good that search engines make their pre-competitive data open. This is better than, for example, Google wanting retailers to put their catalogs in Google Base. We do not care about the specific syntax in which data is embedded; we support them all. Microdata converts easily to triples, and if one wants to make a tabular extraction for use with relational tools, this too is simple enough. Applications will have to do their own entity resolution, but this is independent of data publication format. &lt;/p&gt; &lt;p&gt;All in all, the mood was positive. Mark Greaves noted in his closing remarks that there has been a 1000x increase in published GDB data over a few years. There is in fact a large quantity of technology for tackling almost any aspect of the LOD value chain, but people do not necessarily know about this nor is it easy to integrate. Still there would be great value in integration. Getting software to interoperate in a meaningful way is manual labor, so it might make sense to organize hackathons around this. While the STI Summit is for the senior people, there could be a parallel track of events for bringing the coders together to actually practice tool integration and interoperation.&lt;/p&gt;</atom:content>
  <atom:updated>2011-07-22T11:49:15.000046-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The 2011 STI Semantic Summit</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-07-22#1694</atom:id>
  <atom:published>2011-07-22T15:12:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was recently at the &lt;a href=&quot;http://www.openlinksw.com:80/www.sti2.org/events/2011-sti-semantic-summit&quot; id=&quot;link-id0x2308d838&quot;&gt;STI 2011 summit in Riga, Latvia&lt;/a&gt;. This is a meeting of senior participants in the semantic web and sem tech scene, organized by &lt;a href=&quot;http://www.openlinksw.com:80/www.sti2.org/&quot; id=&quot;link-id0x25076168&quot;&gt;STI&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/page/Dieter_Fensel&quot; id=&quot;link-id0x24d2e998&quot;&gt;Dieter Fensel&lt;/a&gt; fame, with board members like &lt;a href=&quot;http://www.michaelbrodie.com/&quot; id=&quot;link-id0x224b4b58&quot;&gt;Michael Brodie&lt;/a&gt;, &lt;a href=&quot;http://www.iks-project.eu/community/people/mark-greaves&quot; id=&quot;link-id0x2308d4a8&quot;&gt;Mark Greaves&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/page/James_Hendler&quot; id=&quot;link-id0x24c192d0&quot;&gt;Jim Hendler&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This is substantially about the intersection of AI, knowledge representation, and databases. As we have said before, the database side has not been very prominent in these meetings in the past, but this time we had &lt;a href=&quot;http://homepages.cwi.nl/~boncz/&quot; id=&quot;link-id0x26654260&quot;&gt;Peter Boncz&lt;/a&gt; of CWI, of MonetDB and VectorWise fame, attending the proceedings.&lt;/p&gt; &lt;p&gt;Will DB and AI finally meet? Well, they have met, but how do they get along? Before I try to answer this, let us look at some background.&lt;/p&gt; &lt;p&gt;At present, CWI and &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id0x24724fe0&quot;&gt;OpenLink&lt;/a&gt; are working together in the &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x24e20d90&quot;&gt;LOD2 EU FP7 project&lt;/a&gt;, around the general topic of bringing the best of &lt;a href=&quot;http://dbpedia.org/page/Relational_database&quot; id=&quot;link-id0x2475f128&quot;&gt;Relational Database&lt;/a&gt; (RDB) science to the &lt;a href=&quot;http://dbpedia.org/page/Graph_database&quot; id=&quot;link-id0x2474e988&quot;&gt;Graph Database&lt;/a&gt; (GDB) world. Virtuoso has for a few months had a column store capability (which is about to be made available for public preview). CWI has a long history of column store work, with MonetDB and Ingres VectorWise as results. OpenLink&amp;#39;s column store implementation is separate in terms of code but is of course influenced by the work at CWI and other published column store results. The plan is to transplant the applicable CWI innovations into the graph context within Virtuoso. These improvements naturally also benefit Virtuoso RDB (SQL), but the LOD2 project is primarily concerned with GDB applications. The RDB yardstick for much of this work is &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x22a96588&quot;&gt;TPC-H&lt;/a&gt;, of which we have made a GDB translation. CWI is uniquely qualified as concerns this in light of VectorWise holding some of the top places in the TPC-H charts.&lt;/p&gt; &lt;p&gt;Even now, we do in fact run the 22 TPC-H queries in SPARQL against the Virtuoso column store. True, these run faster in SQL against relational tables but we have established a beach head. From this initial position, we can incrementally improve the GDB/SPARQL and RDB/SQL functions, and see how close to SQL we get with SPARQL. I will make a separate post commenting on the differences between SQL and SPARQL.&lt;/p&gt; &lt;p&gt;So let&amp;#39;s get back to Riga. Mark Greaves said in his opening comments that he would be sick if he once again heard complaining about how bad and un-scalable the tools were. From all the talks, I did get the overall impression that just better databasing for Graph Data is still needed. OK, we have 1-1/2 years of unreleased work just for that about to hit the street; advances are substantial. Along these lines, the people from &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x2315c088&quot;&gt;Bio2RDF&lt;/a&gt; pointed out that there still is a cost to publishing query services, specially for complex queries. Well, this cost will be substantially reduced.&lt;/p&gt; &lt;p&gt;The takeaway from the meeting is that the most useful thing, for both our public and ourselves, is simply to keep advancing database tech for graph data. In the first instance, this is about launching what we already have; in the second, about going through the CWI record of innovation and adapting this to GDB.&lt;/p&gt; &lt;p&gt;The thinking is that once query-answering on some tens-of-billions of triples is easily interactive no matter what question one asks, a tipping point will be reached, and GDB can efficiently play the role of data-melting-pot that has been envisioned for it.&lt;/p&gt; &lt;p&gt;This is just a beginning, though. Michael Brodie has on a number of occasions pointed out that that (relational) database guys are only about performance with little or no regard to meaning or even questions of the applicability of the relational model. Peter Boncz then comments back that it can well be that the bulk of IT expenditure worldwide in fact goes into data integration. However, data integration is an &amp;quot;&lt;a href=&quot;http://dbpedia.org/page/AI-complete&quot; id=&quot;link-id0x24754170&quot;&gt;AI-complete&lt;/a&gt;&amp;quot; problem with infinite variety and consequent difficulty of measurement. So, making better database engines stands a much greater chance of success and has the nicety of relatively unambiguous metrics. &lt;/p&gt; &lt;p&gt;Quite so. We are somewhere in the middle. I&amp;#39;d say that GDB is still at the stage where making better databases is a matter of make-or-break and not a matter of cutting already vanishingly-short response times just for the sake of it. We will have progress if we just keep at it; for now, performance is still a basic need and not a luxury.&lt;/p&gt; &lt;p&gt;Now that there is all this potentially integrable data published as graphs (most commonly as RDF serializations), what do we do? Someone at the Riga meeting suggested we take a look across the tracks to the RDB world to see what is being done there for data integration. The question is raised, what does GDB have for data integration? The automatic answer that GDB and RDF have OWL is not adequate, as was rightly pointed out by many. Having schema-last, global identifiers, and some culture of vocabulary reuse is nice, but this is only a start. To cite an example, &lt;code&gt;owl:sameAs&lt;/code&gt; will not work when entities simply do not align: One database models a product as a parts hierarchy; another does the same but now based on the materials used in the parts. One tree just has a node that is not in the other. Besides, things like string matching (as in extracting area codes from phone numbers) are common, and OWL specifically excludes any such functions.&lt;/p&gt; &lt;p&gt;It is now time to look at what will come after all the database advances. In my talk I outlined some things that have or are about to get solutions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Database technology:&lt;/b&gt; Applying advances from RDB (specifically columns, vectoring, and some adaptive query execution) will make GDB a possibility for data warehousing at some scale.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Benchmarks:&lt;/b&gt; These advances will be demonstrable through benchmarking. There is a better suite of benchmarks with many variations of BSBM, an GDB-modified TPC-H, and the upcoming Social Intelligence Benchmark (SIBB) with actual graph data. There are the beginnings of an auditing process for result publishing, and a fair chance the semdata world will get its analog of the TPC.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;After these basics are more or less in hand, we have a vista of more diverse questions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;What to do about inference? We do not want OWL or RIF for their own sake; instead we want whatever will declaratively facilitate making sense of data. This is an entirely use-case-driven question. If this can have a reasonably generic answer, we will build it into the engine. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Data integration is highly diverse, and tool sets like IBM Infosphere have thousands of modules and functions for different aspects of the problem. To what degree does it make sense to put DI-oriented capabilities into a DBMS? &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Is it the case that SQL or SPARQL, plus or minus a few details, is as powerful as a language can be while staying application domain-agnostic? In other words, if more powerful reasoning is built into the query language, will the requirements vary so much between application domains that the work is not generally applicable? &lt;a href=&quot;http://dbpedia.org/page/Datalog&quot; id=&quot;link-id0x2403b2f0&quot;&gt;Datalog&lt;/a&gt; is general enough, but can we demonstrate substantially reduced time to answer with big data if this is built into the engine? &lt;a href=&quot;http://boom.cs.berkeley.edu/&quot; id=&quot;link-id0x23ed5730&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; claims this, even though their claim is not exactly in a database context. We need use cases to refine the actual requirement for inference.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In all these questions, we of necessity turn to the user community. In fact we do not follow the usage of these technologies as much as we ought to. One outcome of the Riga summit is a set of public challenges that will hopefully ameliorate this state of matters, to be released soon.&lt;/p&gt; &lt;p&gt;The general feeling was that there is more going on on the data side than the AI side. The LOD movement proceeds and lightweight everything predominates, also for knowledge representation. There was some discussion about &amp;quot;pay as you go&amp;quot; integration. On the one hand, there is no up-front integration of information systems just for its own sake, so pay as you go is the only kind that exists, system by system, as the need becomes sufficient. On the other hand, each such integration is a process which has its distinct steps and maintenance and within itself it is planned, and thus pre-paid, so to speak. We need more work with the data itself to better understand the matter. The open government data should offer a playground for this and there will be a special challenge around this.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://schema.org/&quot; id=&quot;link-id0x2475a708&quot;&gt;Schema.org&lt;/a&gt; and &lt;a href=&quot;http://www.w3.org/TR/microdata/&quot; id=&quot;link-id0x2a6f8b40&quot;&gt;Microdata&lt;/a&gt; got their share of discussion. As we see it, it is good that search engines make their pre-competitive data open. This is better than, for example, Google wanting retailers to put their catalogs in Google Base. We do not care about the specific syntax in which data is embedded; we support them all. Microdata converts easily to triples, and if one wants to make a tabular extraction for use with relational tools, this too is simple enough. Applications will have to do their own entity resolution, but this is independent of data publication format. &lt;/p&gt; &lt;p&gt;All in all, the mood was positive. Mark Greaves noted in his closing remarks that there has been a 1000x increase in published GDB data over a few years. There is in fact a large quantity of technology for tackling almost any aspect of the LOD value chain, but people do not necessarily know about this nor is it easy to integrate. Still there would be great value in integration. Getting software to interoperate in a meaningful way is manual labor, so it might make sense to organize hackathons around this. While the STI Summit is for the senior people, there could be a parallel track of events for bringing the coders together to actually practice tool integration and interoperation.&lt;/p&gt;</atom:content>
  <atom:updated>2011-07-22T11:12:34.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transaction Semantics in RDF and Relational Models</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1692</atom:id>
  <atom:published>2011-03-22T23:55:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;As a part of defining benchmark audit for testing &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1cfc6e38&quot;&gt;ACID&lt;/a&gt; properties on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f1302b8&quot;&gt;RDF&lt;/a&gt; stores, we will here examine different RDF scenarios where lack of concurrency control causes inconsistent results. In so doing, we consider common implementation techniques and implications as concern locking (pessimistic) and multi-version (optimistic) concurrency control schemes.&lt;/p&gt; &lt;p&gt;In the following, we will talk in terms of triples, but the discussion can be trivially generalized to quads. We will use numbers for IRIs and literals. In most implementations, the internal representation for these is indeed a number (or at least some &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1728a9a8&quot;&gt;data&lt;/a&gt; type that has a well defined collation order). For ease of presentation, we consider a single index with key parts &lt;code&gt;SPO&lt;/code&gt;. Any other index-like setting with any possible key order will have similar issues. &lt;/p&gt; &lt;h2&gt;Insert (Create) and Delete &lt;/h2&gt; &lt;p&gt; &lt;code&gt;INSERT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; as defined in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x16dee7f8&quot;&gt;SPARQL&lt;/a&gt; are queries which generate a result set which is then used for instantiating triple patterns. We note that a &lt;code&gt;DELETE&lt;/code&gt; may delete a triple which the &lt;code&gt;DELETE&lt;/code&gt; has not read; thus the delete set is not a subset of the read set. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e3afb78&quot;&gt;SQL&lt;/a&gt; equivalent is the &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;DELETE FROM table WHERE key IN ( SELECT key1 FROM other_table )&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;expression, supposing it were implemented as a scan of &lt;code&gt;other_table&lt;/code&gt; and an index lookup followed by &lt;code&gt;DELETE&lt;/code&gt; on table. &lt;/p&gt; &lt;p&gt;The meaning of &lt;code&gt;INSERT&lt;/code&gt; is that the triples in question exist after the operation, and the meaning of &lt;code&gt;DELETE&lt;/code&gt; is that said triples do not exist. In a transactional context, this means that the after-image of the transaction is guaranteed either to have or not-have said triples. &lt;/p&gt; &lt;p&gt;Suppose that the triples &lt;code&gt;{ 1 0 0 }&lt;/code&gt;, &lt;code&gt;{ 1 5 6 }&lt;/code&gt;, and &lt;code&gt;{ 1 5 7 }&lt;/code&gt; exist in the beginning. If we &lt;code&gt;DELETE { 1 ?x ?y }&lt;/code&gt; and concurrently &lt;code&gt;INSERT { 1 2 4 . 1 2 3 . 1 3 5 }&lt;/code&gt;, then whichever was considered to be first by the concurrency control of the DBMS would complete first, and the other after that. Thus the end state would either have no triples with subject &lt;code&gt;1&lt;/code&gt; or would have the three just inserted. &lt;/p&gt; &lt;p&gt;Suppose the &lt;code&gt;INSERT&lt;/code&gt; inserts the first triple, &lt;code&gt;{ 1 2 4 }&lt;/code&gt;. The &lt;code&gt;DELETE&lt;/code&gt; at the same time reads all triples with subject &lt;code&gt;1&lt;/code&gt;. The exclusive read waits for the uncommitted &lt;code&gt;INSERT&lt;/code&gt;. The &lt;code&gt;INSERT&lt;/code&gt; then inserts the second triple, &lt;code&gt;{ 1 2 3 }&lt;/code&gt;. Depending on the isolation of the read, this either succeeds, since no &lt;code&gt;{ 1 2 3 }&lt;/code&gt; was read, or causes a deadlock. The first corresponds to &lt;code&gt;REPEATABLE READ&lt;/code&gt; isolation; the second to &lt;code&gt;SERIALIZABLE&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;We would not get the desired end-state of either &lt;i&gt;all the inserted triples&lt;/i&gt; or &lt;i&gt;no triples with subject &lt;code&gt;1&lt;/code&gt;&lt;/i&gt; if the read or the &lt;code&gt;DELETE&lt;/code&gt; were not serializable.&lt;/p&gt; &lt;p&gt;Furthermore if a &lt;code&gt;DELETE&lt;/code&gt; template produced a triple that did not exist in the pre-image, the &lt;code&gt;DELETE&lt;/code&gt; semantics still imply that this also does not exist in the after-image, which implies serializability.&lt;/p&gt; &lt;h2&gt;Read and Update&lt;/h2&gt; &lt;p&gt;Let us consider the prototypical transaction example of transferring funds from one account to another. Two balances are updated, and a history record is inserted.&lt;/p&gt; &lt;p&gt;The initial state is &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;a balance 10 b balance 10&lt;/pre&gt;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We transfer &lt;code&gt;1&lt;/code&gt; from &lt;code&gt;a&lt;/code&gt; to &lt;code&gt;b&lt;/code&gt;, and at the same time transfer &lt;code&gt;2&lt;/code&gt; from &lt;code&gt;b&lt;/code&gt; to &lt;code&gt;a&lt;/code&gt;. The end state must have &lt;code&gt;a&lt;/code&gt; at &lt;code&gt;11&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; at &lt;code&gt;9&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;A relational database needs &lt;code&gt;REPEATABLE READ&lt;/code&gt; isolation for this.&lt;/p&gt; &lt;p&gt;With RDF, &lt;code&gt;txn1&lt;/code&gt; reads that &lt;code&gt;a&lt;/code&gt; has a &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;10&lt;/code&gt;. At the same time, &lt;code&gt;txn1&lt;/code&gt; reads the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;a&lt;/code&gt;. &lt;code&gt;txn2&lt;/code&gt; waits because the read of &lt;code&gt;txn1&lt;/code&gt; is exclusive. &lt;code&gt;txn1&lt;/code&gt; proceeds and read the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;b&lt;/code&gt;. It then updates the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;All goes without the deadlock which is always cited in this scenario, because the locks are acquired in the same order. The act of updating the balance of &lt;code&gt;a&lt;/code&gt;, since RDF does not really have an update-in-place, consists of deleting &lt;code&gt;{ a balance 10 }&lt;/code&gt; and inserting &lt;code&gt;{ a balance 9 }&lt;/code&gt;. This gets done and &lt;code&gt;txn1&lt;/code&gt; commits. At this point, &lt;code&gt;txn2&lt;/code&gt; proceeds after its wait on the row that stated &lt;code&gt;{ a balance 10 }&lt;/code&gt;. This row is now gone, and &lt;code&gt;txn2&lt;/code&gt; sees that &lt;code&gt;a&lt;/code&gt; has no balance, which is quite possible in RDF&amp;#39;s &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1ebb94c8&quot;&gt;schema&lt;/a&gt;-less model.&lt;/p&gt; &lt;p&gt;We see that &lt;code&gt;REPEATABLE READ&lt;/code&gt; is not adequate with RDF, even though it is with relational. The reason why there is no &lt;code&gt;UPDATE&lt;/code&gt;-in-place is that the &lt;code&gt;PRIMARY KEY&lt;/code&gt; of the triple includes all the parts, including the object. Even in a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1ca86578&quot;&gt;RDBMS&lt;/a&gt;, an &lt;code&gt;UPDATE&lt;/code&gt; of a primary key part amounts to a &lt;code&gt;DELETE&lt;/code&gt;-plus-&lt;code&gt;INSERT&lt;/code&gt;. One could here argue that an implementation might still &lt;code&gt;UPDATE&lt;/code&gt;-in-place if the key order were not changed. This would resolve the special case of the accounts but not a more general case.&lt;/p&gt; &lt;p&gt;Thus we see that the read of the balance must be &lt;code&gt;SERIALIZABLE&lt;/code&gt;. This means that the read locks the space before the first balance, so that no insertion may take place. In this way the read of &lt;code&gt;txn2&lt;/code&gt; waits on the lock that is conceptually before the first possible match of &lt;code&gt;{ a balance ?x }&lt;/code&gt;.&lt;/p&gt; &lt;h2&gt;locking order and OLTP &lt;/h2&gt; &lt;p&gt;To implement &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e811d68&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1df9c990&quot;&gt;C&lt;/a&gt;, I would update the table with the highest cardinality first, and then all tables in descending order of cardinality. In this way, the locks with the highest likelihood for contention are held for the least time. If locking multiple rows of a table, these should be locked in a deterministic order, e.g., lowest key-value first. In this way, the workload would not deadlock. In actual fact, with clusters and parallel execution, the lock acquisition will not be guaranteed to be serial, so deadlocks do not entirely go away, but still may get fewer. Besides, any outside transaction might still lock in the wrong order and cause deadlocks, which is why the OLTP application must in any case be built to deal with the possibility of deadlock.&lt;/p&gt; &lt;p&gt;This is the conventional relational view of the matter. In more recent times, in-memory schemes with deterministic lock acquisition (&lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/determinism-vldb10.pdf&quot; id=&quot;link-id0x1c5d9340&quot;&gt;Abadi VLDB 2010&lt;/a&gt;) or single-threaded atomic execution of transactions (&lt;a href=&quot;http://bird.cs.tu-berlin.de:8008/birte2010/&quot; id=&quot;link-id0x1ec0ed18&quot;&gt;Uni Munich BIRTE workshop at VLDB2010&lt;/a&gt;, &lt;a href=&quot;http://www.voltdb.com/&quot; id=&quot;link-id0x1ab6e380&quot;&gt;VoltDB&lt;/a&gt;) have been proposed. There the transaction is described as a stored procedure, possibly with extra annotations. These techniques might apply to RDF also. RDF is however an unlikely model for transaction-intensive applications, so we will not for now examine these further.&lt;/p&gt; &lt;p&gt;RDBMS usually implement row-level locking. This means that once a column of a row has an uncommitted state, any other transaction is prevented from changing the row. This has no ready RDF equivalent. RDF is usually implemented as a row-per-triple system and applying row-level locking to this does not give the semantic one expects of a relational row. &lt;/p&gt; &lt;p&gt;I would argue that it is not essential to enforce transactional guarantees in units of rows. The guarantees must apply between data that is &lt;i&gt;read&lt;/i&gt; and &lt;i&gt;written&lt;/i&gt; by a transaction. It does not need to apply to columns that the transaction does not reference. To take the TPC-C example, the &lt;i&gt;new order&lt;/i&gt; transaction updates the stock level and the &lt;i&gt;delivery&lt;/i&gt; transaction updates the delivery count on the stock table. In practice, a &lt;i&gt;delivery&lt;/i&gt; and a &lt;i&gt;new order&lt;/i&gt; falling on the same row of stock will lock each other out, but nothing in the semantics of the workload mandates this.&lt;/p&gt; &lt;p&gt;It does not seem &lt;i&gt;a priori&lt;/i&gt; necessary to recreate the row as a unit of concurrency control in RDF. One could say that a multi-attribute whole (such as an address) ought to be atomic for concurrency control, but then applications updating addresses will most likely read and update all the fields together even if only the street name changes.&lt;/p&gt; &lt;h2&gt;Pessimistic Vs. Optimistic Concurrency Control &lt;/h2&gt; &lt;p&gt;We have so far spoken only in terms of row-level locking, which is to my &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1ebbf3f8&quot;&gt;knowledge&lt;/a&gt; the most widely used model in RDBMS, and one we implement ourselves. Some databases (e.g., &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x1e771f48&quot;&gt;MonetDB&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x1f3b4830&quot;&gt;VectorWise&lt;/a&gt;) implement optimistic concurrency control. The general idea is that each transaction has a read and write set and when a transaction commits, any other transactions whose read or write set intersects with the write set of the committing transaction are marked un-committable. Once a transaction thus becomes un-committable, it may presumably continue reading indefinitely but may no longer commit its updates. Optimistic concurrency is generally coupled with multi-version semantics where the pre-image of a transaction is a clean committed state of the database as of a specific point in time, i.e., snapshot isolation. &lt;/p&gt; &lt;p&gt;To implement &lt;code&gt;SERIALIZABLE&lt;/code&gt; isolation, i.e., the guarantee that if a transaction twice performs a &lt;code&gt;COUNT&lt;/code&gt; the result will be the same, one locks also the row that precedes the set of selected rows and marks each lock so as to prevent an insert to the right of the lock in key order. The same thing may be done in an optimistic setting.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://event.cwi.nl/SIGMOD-RWE/2010/22-7f15a1/paper.pdf&quot; id=&quot;link-id0x1d5de810&quot;&gt;Positional Handling of Updates in Column Stores&lt;/a&gt; [Heman, Zukowski, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1e7644d8&quot;&gt;CWI&lt;/a&gt; science library] discusses management of multiple consecutive snapshots in some detail. The paper does not go into the details of different levels of isolation but nothing there suggests that serializability could not be supported. There is some complexity in marking the space between ordered rows as non-insertable across multiple versions but this should be feasible enough. &lt;/p&gt; &lt;p&gt;The issue of optimistic Vs. pessimistic concurrency does not seem to be affected by the differences between RDF and relational models. We note that an OLTP workload can be made to run with very few transaction aborts (deadlocks) by properly ordering operations when using a locking scheme. The same does not work with optimistic concurrency since updates happen immediately and transaction aborts occur whenever the writes of one intersect the reads or writes of another, regardless of the order in which these were made.&lt;/p&gt; &lt;p&gt;Developers seldom understand transactions; therefore DBMS should, within the limits of the possible, optimize locking order for locking schemes. A simple example is locking in key order when doing an operation on a set of values. A more complex variant would consist of analyzing data dependencies in stored procedures and reordering updates so as to get the highest cardinality tables first. We note that this latter trick also benefits optimistic schemes.&lt;/p&gt; &lt;p&gt;In RDF, the same principles apply but distinguishing cardinality of an updated set will have to rely on statistics of predicate cardinality. Such are anyhow needed for query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1f05c1a8&quot;&gt;optimization&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Eventual Consistency &lt;/h2&gt; &lt;p&gt;Web scale systems that need to maintain consistent state across multiple data centers sometimes use &amp;quot;eventual consistency&amp;quot; schemes. &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x1cebd340&quot;&gt;Two-phase-commit&lt;/a&gt; becomes very inefficient as latency increases, thus strict transactional semantics have prohibitive cost if the system is more distributed than a cluster with a fast interconnect.&lt;/p&gt; &lt;p&gt;Eventual consistency schemes (&lt;a href=&quot;http://dbpedia.org/page/Dynamo_(storage_system)&quot; id=&quot;link-id0x1f9db8f8&quot;&gt;Amazon Dynamo&lt;/a&gt;, &lt;a href=&quot;http://research.yahoo.com/project/212&quot; id=&quot;link-id0x1da3db80&quot;&gt;Yahoo! PNUTS&lt;/a&gt;) maintain history &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1ec4dbc8&quot;&gt;information&lt;/a&gt; on the record which is the unit of concurrency control. The record is typically a non-first normal form chunk of related data that it makes sense to store together from the application&amp;#39;s viewpoint. Application logic can then be applied to reconciling differing copies of the same logical record. &lt;/p&gt; &lt;p&gt;Such a scheme seems &lt;i&gt;a priori&lt;/i&gt; ill-suited for RDF, where the natural unit of concurrency control would seem to be the quad. We first note that only recently changed (i.e., &lt;code&gt;DELETEd + INSERTed&lt;/code&gt; quads, as there is no &lt;code&gt;UPDATE&lt;/code&gt;-in-place) need history information. This history information can be stored away from the quad itself, thus not disrupting compression. When detecting that one site has &lt;code&gt;INSERTed&lt;/code&gt; a quad that another has &lt;code&gt;DELETEd&lt;/code&gt; in the same general time period, application logic can still be applied for reading related quads in order to arrive at a decision on how to reconcile two databases that have diverged. The same can apply to conflicting values of properties that for the application should be single-valued. Comparing time-stamped transaction logs on quads is not fundamentally different from comparing record histories in Dynamo or PNUTS.&lt;/p&gt; &lt;p&gt;As we overcome the data size penalties that have until recently been associated with RDF, RDF becomes even more interesting as a data model for large online systems such as social network platforms where frequent application changes lead to volatility of schema. Key value stores are currently found in such applications, but they generally do not provide the query flexibility at which RDF excels. &lt;/p&gt; &lt;h2&gt;Conclusions &lt;/h2&gt; &lt;p&gt;We have gone over basic aspects of the endlessly complex and variable topic of transactions, and drawn parallels as well as outlined two basic differences between relational and RDF systems: What used to be &lt;code&gt;REPEATABLE READ&lt;/code&gt; becomes &lt;code&gt;SERIALIZABLE&lt;/code&gt;; and row-level locking becomes locking at the level of a single attribute value. For the rest, we see that the optimistic and pessimistic modes of concurrency control, as well as guidelines for writing transaction procedures, remain much the same.&lt;/p&gt; &lt;p&gt;Based on this overview, it should be possible to design an ACID test for describing the ACID behavior of benchmarked systems. We do not intend to make transaction support a qualification requirement for an RDF benchmark, but information on transaction support will still be valuable in comparing different systems.&lt;/p&gt;</atom:content>
  <atom:updated>2011-03-22T18:24:26-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transaction Semantics in RDF and Relational Models</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1691</atom:id>
  <atom:published>2011-03-22T23:55:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;As a part of defining benchmark audit for testing &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1eae93c0&quot;&gt;ACID&lt;/a&gt; properties on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f0adbe0&quot;&gt;RDF&lt;/a&gt; stores, we will here examine different RDF scenarios where lack of concurrency control causes inconsistent results. In so doing, we consider common implementation techniques and implications as concern locking (pessimistic) and multi-version (optimistic) concurrency control schemes.&lt;/p&gt; &lt;p&gt;In the following, we will talk in terms of triples, but the discussion can be trivially generalized to quads. We will use numbers for IRIs and literals. In most implementations, the internal representation for these is indeed a number (or at least some &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ea79630&quot;&gt;data&lt;/a&gt; type that has a well defined collation order). For ease of presentation, we consider a single index with key parts &lt;code&gt;SPO&lt;/code&gt;. Any other index-like setting with any possible key order will have similar issues. &lt;/p&gt; &lt;h2&gt;Insert (Create) and Delete &lt;/h2&gt; &lt;p&gt; &lt;code&gt;INSERT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; as defined in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1f335c60&quot;&gt;SPARQL&lt;/a&gt; are queries which generate a result set which is then used for instantiating triple patterns. We note that a &lt;code&gt;DELETE&lt;/code&gt; may delete a triple which the &lt;code&gt;DELETE&lt;/code&gt; has not read; thus the delete set is not a subset of the read set. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e99b4b8&quot;&gt;SQL&lt;/a&gt; equivalent is the &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;DELETE FROM table WHERE key IN ( SELECT key1 FROM other_table )&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;expression, supposing it were implemented as a scan of &lt;code&gt;other_table&lt;/code&gt; and an index lookup followed by &lt;code&gt;DELETE&lt;/code&gt; on table. &lt;/p&gt; &lt;p&gt;The meaning of &lt;code&gt;INSERT&lt;/code&gt; is that the triples in question exist after the operation, and the meaning of &lt;code&gt;DELETE&lt;/code&gt; is that said triples do not exist. In a transactional context, this means that the after-image of the transaction is guaranteed either to have or not-have said triples. &lt;/p&gt; &lt;p&gt;Suppose that the triples &lt;code&gt;{ 1 0 0 }&lt;/code&gt;, &lt;code&gt;{ 1 5 6 }&lt;/code&gt;, and &lt;code&gt;{ 1 5 7 }&lt;/code&gt; exist in the beginning. If we &lt;code&gt;DELETE { 1 ?x ?y }&lt;/code&gt; and concurrently &lt;code&gt;INSERT { 1 2 4 . 1 2 3 . 1 3 5 }&lt;/code&gt;, then whichever was considered to be first by the concurrency control of the DBMS would complete first, and the other after that. Thus the end state would either have no triples with subject &lt;code&gt;1&lt;/code&gt; or would have the three just inserted. &lt;/p&gt; &lt;p&gt;Suppose the &lt;code&gt;INSERT&lt;/code&gt; inserts the first triple, &lt;code&gt;{ 1 2 4 }&lt;/code&gt;. The &lt;code&gt;DELETE&lt;/code&gt; at the same time reads all triples with subject &lt;code&gt;1&lt;/code&gt;. The exclusive read waits for the uncommitted &lt;code&gt;INSERT&lt;/code&gt;. The &lt;code&gt;INSERT&lt;/code&gt; then inserts the second triple, &lt;code&gt;{ 1 2 3 }&lt;/code&gt;. Depending on the isolation of the read, this either succeeds, since no &lt;code&gt;{ 1 2 3 }&lt;/code&gt; was read, or causes a deadlock. The first corresponds to &lt;code&gt;REPEATABLE READ&lt;/code&gt; isolation; the second to &lt;code&gt;SERIALIZABLE&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;We would not get the desired end-state of either &lt;i&gt;all the inserted triples&lt;/i&gt; or &lt;i&gt;no triples with subject &lt;code&gt;1&lt;/code&gt;&lt;/i&gt; if the read or the &lt;code&gt;DELETE&lt;/code&gt; were not serializable.&lt;/p&gt; &lt;p&gt;Furthermore if a &lt;code&gt;DELETE&lt;/code&gt; template produced a triple that did not exist in the pre-image, the &lt;code&gt;DELETE&lt;/code&gt; semantics still imply that this also does not exist in the after-image, which implies serializability.&lt;/p&gt; &lt;h2&gt;Read and Update&lt;/h2&gt; &lt;p&gt;Let us consider the prototypical transaction example of transferring funds from one account to another. Two balances are updated, and a history record is inserted.&lt;/p&gt; &lt;p&gt;The initial state is &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;a balance 10 b balance 10&lt;/pre&gt;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We transfer &lt;code&gt;1&lt;/code&gt; from &lt;code&gt;a&lt;/code&gt; to &lt;code&gt;b&lt;/code&gt;, and at the same time transfer &lt;code&gt;2&lt;/code&gt; from &lt;code&gt;b&lt;/code&gt; to &lt;code&gt;a&lt;/code&gt;. The end state must have &lt;code&gt;a&lt;/code&gt; at &lt;code&gt;11&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; at &lt;code&gt;9&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;A relational database needs &lt;code&gt;REPEATABLE READ&lt;/code&gt; isolation for this.&lt;/p&gt; &lt;p&gt;With RDF, &lt;code&gt;txn1&lt;/code&gt; reads that &lt;code&gt;a&lt;/code&gt; has a &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;10&lt;/code&gt;. At the same time, &lt;code&gt;txn1&lt;/code&gt; reads the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;a&lt;/code&gt;. &lt;code&gt;txn2&lt;/code&gt; waits because the read of &lt;code&gt;txn1&lt;/code&gt; is exclusive. &lt;code&gt;txn1&lt;/code&gt; proceeds and read the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;b&lt;/code&gt;. It then updates the &lt;code&gt;balance&lt;/code&gt; of &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;All goes without the deadlock which is always cited in this scenario, because the locks are acquired in the same order. The act of updating the balance of &lt;code&gt;a&lt;/code&gt;, since RDF does not really have an update-in-place, consists of deleting &lt;code&gt;{ a balance 10 }&lt;/code&gt; and inserting &lt;code&gt;{ a balance 9 }&lt;/code&gt;. This gets done and &lt;code&gt;txn1&lt;/code&gt; commits. At this point, &lt;code&gt;txn2&lt;/code&gt; proceeds after its wait on the row that stated &lt;code&gt;{ a balance 10 }&lt;/code&gt;. This row is now gone, and &lt;code&gt;txn2&lt;/code&gt; sees that &lt;code&gt;a&lt;/code&gt; has no balance, which is quite possible in RDF&amp;#39;s &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1c933cf0&quot;&gt;schema&lt;/a&gt;-less model.&lt;/p&gt; &lt;p&gt;We see that &lt;code&gt;REPEATABLE READ&lt;/code&gt; is not adequate with RDF, even though it is with relational. The reason why there is no &lt;code&gt;UPDATE&lt;/code&gt;-in-place is that the &lt;code&gt;PRIMARY KEY&lt;/code&gt; of the triple includes all the parts, including the object. Even in a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1f3cc3c8&quot;&gt;RDBMS&lt;/a&gt;, an &lt;code&gt;UPDATE&lt;/code&gt; of a primary key part amounts to a &lt;code&gt;DELETE&lt;/code&gt;-plus-&lt;code&gt;INSERT&lt;/code&gt;. One could here argue that an implementation might still &lt;code&gt;UPDATE&lt;/code&gt;-in-place if the key order were not changed. This would resolve the special case of the accounts but not a more general case.&lt;/p&gt; &lt;p&gt;Thus we see that the read of the balance must be &lt;code&gt;SERIALIZABLE&lt;/code&gt;. This means that the read locks the space before the first balance, so that no insertion may take place. In this way the read of &lt;code&gt;txn2&lt;/code&gt; waits on the lock that is conceptually before the first possible match of &lt;code&gt;{ a balance ?x }&lt;/code&gt;.&lt;/p&gt; &lt;h2&gt;locking order and OLTP &lt;/h2&gt; &lt;p&gt;To implement &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e20f2e8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1fa46718&quot;&gt;C&lt;/a&gt;, I would update the table with the highest cardinality first, and then all tables in descending order of cardinality. In this way, the locks with the highest likelihood for contention are held for the least time. If locking multiple rows of a table, these should be locked in a deterministic order, e.g., lowest key-value first. In this way, the workload would not deadlock. In actual fact, with clusters and parallel execution, the lock acquisition will not be guaranteed to be serial, so deadlocks do not entirely go away, but still may get fewer. Besides, any outside transaction might still lock in the wrong order and cause deadlocks, which is why the OLTP application must in any case be built to deal with the possibility of deadlock.&lt;/p&gt; &lt;p&gt;This is the conventional relational view of the matter. In more recent times, in-memory schemes with deterministic lock acquisition (&lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/determinism-vldb10.pdf&quot; id=&quot;link-id0x1c5d9340&quot;&gt;Abadi VLDB 2010&lt;/a&gt;) or single-threaded atomic execution of transactions (&lt;a href=&quot;http://bird.cs.tu-berlin.de:8008/birte2010/&quot; id=&quot;link-id0x1ec0ed18&quot;&gt;Uni Munich BIRTE workshop at VLDB2010&lt;/a&gt;, &lt;a href=&quot;http://www.voltdb.com/&quot; id=&quot;link-id0x1ab6e380&quot;&gt;VoltDB&lt;/a&gt;) have been proposed. There the transaction is described as a stored procedure, possibly with extra annotations. These techniques might apply to RDF also. RDF is however an unlikely model for transaction-intensive applications, so we will not for now examine these further.&lt;/p&gt; &lt;p&gt;RDBMS usually implement row-level locking. This means that once a column of a row has an uncommitted state, any other transaction is prevented from changing the row. This has no ready RDF equivalent. RDF is usually implemented as a row-per-triple system and applying row-level locking to this does not give the semantic one expects of a relational row. &lt;/p&gt; &lt;p&gt;I would argue that it is not essential to enforce transactional guarantees in units of rows. The guarantees must apply between data that is &lt;i&gt;read&lt;/i&gt; and &lt;i&gt;written&lt;/i&gt; by a transaction. It does not need to apply to columns that the transaction does not reference. To take the TPC-C example, the &lt;i&gt;new order&lt;/i&gt; transaction updates the stock level and the &lt;i&gt;delivery&lt;/i&gt; transaction updates the delivery count on the stock table. In practice, a &lt;i&gt;delivery&lt;/i&gt; and a &lt;i&gt;new order&lt;/i&gt; falling on the same row of stock will lock each other out, but nothing in the semantics of the workload mandates this.&lt;/p&gt; &lt;p&gt;It does not seem &lt;i&gt;a priori&lt;/i&gt; necessary to recreate the row as a unit of concurrency control in RDF. One could say that a multi-attribute whole (such as an address) ought to be atomic for concurrency control, but then applications updating addresses will most likely read and update all the fields together even if only the street name changes.&lt;/p&gt; &lt;h2&gt;Pessimistic Vs. Optimistic Concurrency Control &lt;/h2&gt; &lt;p&gt;We have so far spoken only in terms of row-level locking, which is to my &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1f1230a0&quot;&gt;knowledge&lt;/a&gt; the most widely used model in RDBMS, and one we implement ourselves. Some databases (e.g., &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x173a5538&quot;&gt;MonetDB&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x16feb008&quot;&gt;VectorWise&lt;/a&gt;) implement optimistic concurrency control. The general idea is that each transaction has a read and write set and when a transaction commits, any other transactions whose read or write set intersects with the write set of the committing transaction are marked un-committable. Once a transaction thus becomes un-committable, it may presumably continue reading indefinitely but may no longer commit its updates. Optimistic concurrency is generally coupled with multi-version semantics where the pre-image of a transaction is a clean committed state of the database as of a specific point in time, i.e., snapshot isolation. &lt;/p&gt; &lt;p&gt;To implement &lt;code&gt;SERIALIZABLE&lt;/code&gt; isolation, i.e., the guarantee that if a transaction twice performs a &lt;code&gt;COUNT&lt;/code&gt; the result will be the same, one locks also the row that precedes the set of selected rows and marks each lock so as to prevent an insert to the right of the lock in key order. The same thing may be done in an optimistic setting.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://event.cwi.nl/SIGMOD-RWE/2010/22-7f15a1/paper.pdf&quot; id=&quot;link-id0x1d5de810&quot;&gt;Positional Handling of Updates in Column Stores&lt;/a&gt; [Heman, Zukowski, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1df9c990&quot;&gt;CWI&lt;/a&gt; science library] discusses management of multiple consecutive snapshots in some detail. The paper does not go into the details of different levels of isolation but nothing there suggests that serializability could not be supported. There is some complexity in marking the space between ordered rows as non-insertable across multiple versions but this should be feasible enough. &lt;/p&gt; &lt;p&gt;The issue of optimistic Vs. pessimistic concurrency does not seem to be affected by the differences between RDF and relational models. We note that an OLTP workload can be made to run with very few transaction aborts (deadlocks) by properly ordering operations when using a locking scheme. The same does not work with optimistic concurrency since updates happen immediately and transaction aborts occur whenever the writes of one intersect the reads or writes of another, regardless of the order in which these were made.&lt;/p&gt; &lt;p&gt;Developers seldom understand transactions; therefore DBMS should, within the limits of the possible, optimize locking order for locking schemes. A simple example is locking in key order when doing an operation on a set of values. A more complex variant would consist of analyzing data dependencies in stored procedures and reordering updates so as to get the highest cardinality tables first. We note that this latter trick also benefits optimistic schemes.&lt;/p&gt; &lt;p&gt;In RDF, the same principles apply but distinguishing cardinality of an updated set will have to rely on statistics of predicate cardinality. Such are anyhow needed for query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1f51d5d0&quot;&gt;optimization&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Eventual Consistency &lt;/h2&gt; &lt;p&gt;Web scale systems that need to maintain consistent state across multiple data centers sometimes use &amp;quot;eventual consistency&amp;quot; schemes. &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x1e3ba5d8&quot;&gt;Two-phase-commit&lt;/a&gt; becomes very inefficient as latency increases, thus strict transactional semantics have prohibitive cost if the system is more distributed than a cluster with a fast interconnect.&lt;/p&gt; &lt;p&gt;Eventual consistency schemes (&lt;a href=&quot;http://dbpedia.org/page/Dynamo_(storage_system)&quot; id=&quot;link-id0x1f9db8f8&quot;&gt;Amazon Dynamo&lt;/a&gt;, &lt;a href=&quot;http://research.yahoo.com/project/212&quot; id=&quot;link-id0x1da3db80&quot;&gt;Yahoo! PNUTS&lt;/a&gt;) maintain history &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x8bf48e8&quot;&gt;information&lt;/a&gt; on the record which is the unit of concurrency control. The record is typically a non-first normal form chunk of related data that it makes sense to store together from the application&amp;#39;s viewpoint. Application logic can then be applied to reconciling differing copies of the same logical record. &lt;/p&gt; &lt;p&gt;Such a scheme seems &lt;i&gt;a priori&lt;/i&gt; ill-suited for RDF, where the natural unit of concurrency control would seem to be the quad. We first note that only recently changed (i.e., &lt;code&gt;DELETEd + INSERTed&lt;/code&gt; quads, as there is no &lt;code&gt;UPDATE&lt;/code&gt;-in-place) need history information. This history information can be stored away from the quad itself, thus not disrupting compression. When detecting that one site has &lt;code&gt;INSERTed&lt;/code&gt; a quad that another has &lt;code&gt;DELETEd&lt;/code&gt; in the same general time period, application logic can still be applied for reading related quads in order to arrive at a decision on how to reconcile two databases that have diverged. The same can apply to conflicting values of properties that for the application should be single-valued. Comparing time-stamped transaction logs on quads is not fundamentally different from comparing record histories in Dynamo or PNUTS.&lt;/p&gt; &lt;p&gt;As we overcome the data size penalties that have until recently been associated with RDF, RDF becomes even more interesting as a data model for large online systems such as social network platforms where frequent application changes lead to volatility of schema. Key value stores are currently found in such applications, but they generally do not provide the query flexibility at which RDF excels. &lt;/p&gt; &lt;h2&gt;Conclusions &lt;/h2&gt; &lt;p&gt;We have gone over basic aspects of the endlessly complex and variable topic of transactions, and drawn parallels as well as outlined two basic differences between relational and RDF systems: What used to be &lt;code&gt;REPEATABLE READ&lt;/code&gt; becomes &lt;code&gt;SERIALIZABLE&lt;/code&gt;; and row-level locking becomes locking at the level of a single attribute value. For the rest, we see that the optimistic and pessimistic modes of concurrency control, as well as guidelines for writing transaction procedures, remain much the same.&lt;/p&gt; &lt;p&gt;Based on this overview, it should be possible to design an ACID test for describing the ACID behavior of benchmarked systems. We do not intend to make transaction support a qualification requirement for an RDF benchmark, but information on transaction support will still be valuable in comparing different systems.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:31:00.946315-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF and Transactions</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1690</atom:id>
  <atom:published>2011-03-22T22:52:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x249bc940&quot;&gt;RDF&lt;/a&gt; and transactions for developers in general. The next one talks about specifics and is for specialists.&lt;/p&gt; &lt;p&gt;Transactions are certainly not the first thing that comes to mind when one hears &amp;quot;RDF&amp;quot;. We have at times used a recruitment questionnaire where we ask applicants to define a transaction. Many vaguely remember that it is a unit of work, but usually not more than that. We sometimes get questions from users about why they get an error message that says &amp;quot;deadlock&amp;quot;. &amp;quot;Deadlock&amp;quot; is what happens when multiple users concurrently update balances on multiple bank accounts in the wrong order. What does this have to do with RDF?&lt;/p&gt; &lt;p&gt;There are in fact users who even use XA with a &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x22c8dbc8&quot;&gt;Virtuoso&lt;/a&gt;-based RDF application. &lt;a class=&quot;auto-href&quot; href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x27bd0c08&quot;&gt;Franz&lt;/a&gt; also has publicized their development of full &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x283985c8&quot;&gt;ACID&lt;/a&gt; capabilities for &lt;a class=&quot;auto-href&quot; href=&quot;http://semanticweb.org/id/AllegroGraph&quot; id=&quot;link-id0x238ba438&quot;&gt;AllegroGraph&lt;/a&gt;. RDF is a database &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2864fef8&quot;&gt;schema&lt;/a&gt; model, and transactions will inevitably become an issue in databases.&lt;/p&gt; &lt;p&gt;At the same time, the developer population trained with &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x284d2d80&quot;&gt;MySQL&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x237230e8&quot;&gt;PHP&lt;/a&gt; is not particularly transaction-aware. Transactions have gone out of style, declares the No-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2920cc88&quot;&gt;SQL&lt;/a&gt; crowd. Well, it is not so much SQL they object to but ACID, i.e., transactional guarantees. We will talk more about this in the next post. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x283f0588&quot;&gt;SPARQL&lt;/a&gt; language and protocol do not go into transactions, except for expressing the wish that an &lt;code&gt;UPDATE&lt;/code&gt; request to an end-point be atomic. But beware -- atomicity is a gateway drug, and soon one finds oneself on full ACID. &lt;/p&gt; &lt;p&gt;If one says that a thing will either happen &lt;i&gt;in its entirety&lt;/i&gt; or &lt;i&gt;not at all,&lt;/i&gt; which is what (A) atomicity means, then the question arises of (I) isolation; that is, what happens if somebody else does something to the same &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x238280f8&quot;&gt;data&lt;/a&gt; at the same time? Then comes the question of whether a thing, once having happened, will stay that way; i.e., (D) durability. Finally, there is (&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x276714b8&quot;&gt;C&lt;/a&gt;) consistency, which means that the transaction&amp;#39;s result must not contradict restrictions the database is supposed to enforce. RDF usually has no restrictions; thus consistency mostly means that the internal state of the DBMS must be consistent, e.g., different indices on triples/quads should contain the same data.&lt;/p&gt; &lt;p&gt;There are, of course, database-like consistency criteria that one can express in RDF Schema and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x28625a90&quot;&gt;OWL&lt;/a&gt;, concerning data types, mandatory presence of properties, or restrictions on cardinality (i.e., one may only have one spouse at a time, and the like). &lt;/p&gt; &lt;p&gt;If one indeed did enforce them all, then RDF would be very like the relational model -- with all the restrictions, but without the 40 years of work on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x249bf4f8&quot;&gt;RDBMS&lt;/a&gt; performance. For this reason, RDF use tends to involve data that is not structured enough to be a good fit for RDBMS.&lt;/p&gt; &lt;p&gt;There is of course the OWL side, where consistency is important but is defined in such complex ways that they again are not a good fit for RDBMS. RDF could be seen to be split between the schema-last world and the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x249504f8&quot;&gt;knowledge&lt;/a&gt; representation world. I will here focus on the schema-last side.&lt;/p&gt; &lt;p&gt;Transactions are relevant in RDF in two cases: 1. If data is trickle loaded in small chunks, one likes to know that the chunks do not get lost or corrupted; 2. If the application has any semantics that reserve resources, then these operations need transactions. The latter is not so common with RDF but examples include read-write situations, like checking if a seat is available and then reserving it. Transactionality guarantees that the same seat does not get reserved twice.&lt;/p&gt; &lt;p&gt;Web people argue with some justification that since the four cardinal virtues of database never existed on the web to begin with, applying strict ACID to web data is beside the point, like locking the stable after the horse has long since run away. This may be so; yet the systems used for processing data, whether that data is dirty or not, benefit from predictable operation under concurrency and from not losing data.&lt;/p&gt; &lt;p&gt;Analytics workloads are not primarily about transactions, but still need to specify what happens with updates. Analyzing data from measurements may not have concurrent updates, but there the transaction issue is replaced by the question of making explicit how the data was acquired and what processing has been applied to it before storage.&lt;/p&gt; &lt;p&gt;As mentioned before, the &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x27d952d0&quot;&gt;LOD2&lt;/a&gt; project is at the crossroads of RDF and database. I construe its mission to be the making of RDF into a respectable database discipline. Database respectability in turn is as good as inconceivable without addressing the very bedrock on which this science was founded: transactions.&lt;/p&gt; &lt;p&gt;As previously argued, we need well-defined and auditable benchmarks. This again brings up the topic of transactions. Once we embark on the database benchmark route, there is no way around this. &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2359d2d0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x28edb770&quot;&gt;H&lt;/a&gt; mandates that the system under test support transactions, and the audit involves a test for this. We can do no less.&lt;/p&gt; &lt;p&gt;This has led me to more closely examine the issue of RDF and transactions, and whether there exist differences between transactions applied to RDF and to relational data. &lt;/p&gt; &lt;p&gt;As concerns Virtuoso, our position has been that one can get full ACID in Virtuoso, whether in SQL or SPARQL, by using a connected client (e.g., &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x23a55698&quot;&gt;ODBC&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x235cecf0&quot;&gt;JDBC&lt;/a&gt;, or the &lt;a class=&quot;auto-href&quot; href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x23213900&quot;&gt;Jena&lt;/a&gt; or &lt;a class=&quot;auto-href&quot; href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x277874d0&quot;&gt;Sesame&lt;/a&gt; frameworks), and setting the isolation options on the connection. Having taken this step, one then must take the next step, which consists of dealing with deadlocks; i.e., with concurrent utilization, it may happen that the database at any time notifies the client that the transaction got aborted and the client must retry.&lt;/p&gt; &lt;p&gt;Web developers especially do not like this, because this is not what MySQL has taught them to expect. MySQL does have transactional back-ends like InnoDB, but often gets used without transactions.&lt;/p&gt; &lt;p&gt;With the March 2011 Virtuoso releases, we have taken a closer look at transactions with RDF. It is more practical to reduce the possibility of errors than to require developers to pay attention. For this reason we have automated isolation settings for RDF, greatly reduced the incidence of deadlocks, and even incorporated automatic deadlock retries where applicable.&lt;/p&gt; &lt;p&gt;If all users lock resources they need in the same order, there will be no deadlocks. This is what we do with RDF load in Virtuoso 7; thus any mix of concurrent &lt;code&gt;INSERTs&lt;/code&gt; and &lt;code&gt;DELETEs&lt;/code&gt;, if these are under a certain size (normally 10000 quads) are guaranteed never to fail due to locking. These could still fail due to running out of space, though. With previous versions, there always was a possibility of having an &lt;code&gt;INSERT&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt; fail because of deadlock with multiple users. Vectored &lt;code&gt;INSERT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; are sufficient for making web crawling or archive maintenance practically deadlock free, since there the primary transaction is the &lt;code&gt;INSERT&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt; of a small graph. &lt;/p&gt; &lt;p&gt;Furthermore, since the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x23eadf50&quot;&gt;SPARQL protocol&lt;/a&gt; has no way of specifying transactions consisting of multiple client-server exchanges, the SPARQL end-point may deal with deadlocks by itself. If all else fails, it can simply execute requests one after the other, thus eliminating any possibility of locking. We note that many statements will be intrinsically free of deadlocks by virtue of always locking in key order, but this cannot be universally guaranteed with arbitrary size operations; thus concurrent operations might still sometimes deadlock. Anyway, vectored execution as introduced in Virtuoso 7, besides getting easily double-speed random access, also greatly reduces deadlocks by virtue of ordering operations.&lt;/p&gt; &lt;p&gt;In the next post we will talk about what transactions mean with RDF and whether there is any difference with the relational model.&lt;/p&gt;</atom:content>
  <atom:updated>2011-03-22T17:44:21-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF and Transactions</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1689</atom:id>
  <atom:published>2011-03-22T22:52:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x235282b8&quot;&gt;RDF&lt;/a&gt; and transactions for developers in general. The next one talks about specifics and is for specialists.&lt;/p&gt; &lt;p&gt;Transactions are certainly not the first thing that comes to mind when one hears &amp;quot;RDF&amp;quot;. We have at times used a recruitment questionnaire where we ask applicants to define a transaction. Many vaguely remember that it is a unit of work, but usually not more than that. We sometimes get questions from users about why they get an error message that says &amp;quot;deadlock&amp;quot;. &amp;quot;Deadlock&amp;quot; is what happens when multiple users concurrently update balances on multiple bank accounts in the wrong order. What does this have to do with RDF?&lt;/p&gt; &lt;p&gt;There are in fact users who even use XA with a &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x235e5938&quot;&gt;Virtuoso&lt;/a&gt;-based RDF application. &lt;a class=&quot;auto-href&quot; href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x28c09308&quot;&gt;Franz&lt;/a&gt; also has publicized their development of full &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x2365f710&quot;&gt;ACID&lt;/a&gt; capabilities for &lt;a class=&quot;auto-href&quot; href=&quot;http://semanticweb.org/id/AllegroGraph&quot; id=&quot;link-id0x22caecb0&quot;&gt;AllegroGraph&lt;/a&gt;. RDF is a database &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x235f1f70&quot;&gt;schema&lt;/a&gt; model, and transactions will inevitably become an issue in databases.&lt;/p&gt; &lt;p&gt;At the same time, the developer population trained with &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x240f6a90&quot;&gt;MySQL&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x238cd088&quot;&gt;PHP&lt;/a&gt; is not particularly transaction-aware. Transactions have gone out of style, declares the No-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x232d9068&quot;&gt;SQL&lt;/a&gt; crowd. Well, it is not so much SQL they object to but ACID, i.e., transactional guarantees. We will talk more about this in the next post. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x238c70a0&quot;&gt;SPARQL&lt;/a&gt; language and protocol do not go into transactions, except for expressing the wish that an &lt;code&gt;UPDATE&lt;/code&gt; request to an end-point be atomic. But beware -- atomicity is a gateway drug, and soon one finds oneself on full ACID. &lt;/p&gt; &lt;p&gt;If one says that a thing will either happen &lt;i&gt;in its entirety&lt;/i&gt; or &lt;i&gt;not at all,&lt;/i&gt; which is what (A) atomicity means, then the question arises of (I) isolation; that is, what happens if somebody else does something to the same &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23eadf50&quot;&gt;data&lt;/a&gt; at the same time? Then comes the question of whether a thing, once having happened, will stay that way; i.e., (D) durability. Finally, there is (&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x23a1e280&quot;&gt;C&lt;/a&gt;) consistency, which means that the transaction&amp;#39;s result must not contradict restrictions the database is supposed to enforce. RDF usually has no restrictions; thus consistency mostly means that the internal state of the DBMS must be consistent, e.g., different indices on triples/quads should contain the same data.&lt;/p&gt; &lt;p&gt;There are, of course, database-like consistency criteria that one can express in RDF Schema and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x287b18e8&quot;&gt;OWL&lt;/a&gt;, concerning data types, mandatory presence of properties, or restrictions on cardinality (i.e., one may only have one spouse at a time, and the like). &lt;/p&gt; &lt;p&gt;If one indeed did enforce them all, then RDF would be very like the relational model -- with all the restrictions, but without the 40 years of work on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2450b488&quot;&gt;RDBMS&lt;/a&gt; performance. For this reason, RDF use tends to involve data that is not structured enough to be a good fit for RDBMS.&lt;/p&gt; &lt;p&gt;There is of course the OWL side, where consistency is important but is defined in such complex ways that they again are not a good fit for RDBMS. RDF could be seen to be split between the schema-last world and the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x2324ac40&quot;&gt;knowledge&lt;/a&gt; representation world. I will here focus on the schema-last side.&lt;/p&gt; &lt;p&gt;Transactions are relevant in RDF in two cases: 1. If data is trickle loaded in small chunks, one likes to know that the chunks do not get lost or corrupted; 2. If the application has any semantics that reserve resources, then these operations need transactions. The latter is not so common with RDF but examples include read-write situations, like checking if a seat is available and then reserving it. Transactionality guarantees that the same seat does not get reserved twice.&lt;/p&gt; &lt;p&gt;Web people argue with some justification that since the four cardinal virtues of database never existed on the web to begin with, applying strict ACID to web data is beside the point, like locking the stable after the horse has long since run away. This may be so; yet the systems used for processing data, whether that data is dirty or not, benefit from predictable operation under concurrency and from not losing data.&lt;/p&gt; &lt;p&gt;Analytics workloads are not primarily about transactions, but still need to specify what happens with updates. Analyzing data from measurements may not have concurrent updates, but there the transaction issue is replaced by the question of making explicit how the data was acquired and what processing has been applied to it before storage.&lt;/p&gt; &lt;p&gt;As mentioned before, the &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x28ac0250&quot;&gt;LOD2&lt;/a&gt; project is at the crossroads of RDF and database. I construe its mission to be the making of RDF into a respectable database discipline. Database respectability in turn is as good as inconceivable without addressing the very bedrock on which this science was founded: transactions.&lt;/p&gt; &lt;p&gt;As previously argued, we need well-defined and auditable benchmarks. This again brings up the topic of transactions. Once we embark on the database benchmark route, there is no way around this. &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x284d2d80&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x280dcd40&quot;&gt;H&lt;/a&gt; mandates that the system under test support transactions, and the audit involves a test for this. We can do no less.&lt;/p&gt; &lt;p&gt;This has led me to more closely examine the issue of RDF and transactions, and whether there exist differences between transactions applied to RDF and to relational data. &lt;/p&gt; &lt;p&gt;As concerns Virtuoso, our position has been that one can get full ACID in Virtuoso, whether in SQL or SPARQL, by using a connected client (e.g., &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x235cecf0&quot;&gt;ODBC&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x27c4a0c0&quot;&gt;JDBC&lt;/a&gt;, or the &lt;a class=&quot;auto-href&quot; href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x283a89a8&quot;&gt;Jena&lt;/a&gt; or &lt;a class=&quot;auto-href&quot; href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x284b3490&quot;&gt;Sesame&lt;/a&gt; frameworks), and setting the isolation options on the connection. Having taken this step, one then must take the next step, which consists of dealing with deadlocks; i.e., with concurrent utilization, it may happen that the database at any time notifies the client that the transaction got aborted and the client must retry.&lt;/p&gt; &lt;p&gt;Web developers especially do not like this, because this is not what MySQL has taught them to expect. MySQL does have transactional back-ends like InnoDB, but often gets used without transactions.&lt;/p&gt; &lt;p&gt;With the March 2011 Virtuoso releases, we have taken a closer look at transactions with RDF. It is more practical to reduce the possibility of errors than to require developers to pay attention. For this reason we have automated isolation settings for RDF, greatly reduced the incidence of deadlocks, and even incorporated automatic deadlock retries where applicable.&lt;/p&gt; &lt;p&gt;If all users lock resources they need in the same order, there will be no deadlocks. This is what we do with RDF load in Virtuoso 7; thus any mix of concurrent &lt;code&gt;INSERTs&lt;/code&gt; and &lt;code&gt;DELETEs&lt;/code&gt;, if these are under a certain size (normally 10000 quads) are guaranteed never to fail due to locking. These could still fail due to running out of space, though. With previous versions, there always was a possibility of having an &lt;code&gt;INSERT&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt; fail because of deadlock with multiple users. Vectored &lt;code&gt;INSERT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; are sufficient for making web crawling or archive maintenance practically deadlock free, since there the primary transaction is the &lt;code&gt;INSERT&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt; of a small graph. &lt;/p&gt; &lt;p&gt;Furthermore, since the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x22ca4300&quot;&gt;SPARQL protocol&lt;/a&gt; has no way of specifying transactions consisting of multiple client-server exchanges, the SPARQL end-point may deal with deadlocks by itself. If all else fails, it can simply execute requests one after the other, thus eliminating any possibility of locking. We note that many statements will be intrinsically free of deadlocks by virtue of always locking in key order, but this cannot be universally guaranteed with arbitrary size operations; thus concurrent operations might still sometimes deadlock. Anyway, vectored execution as introduced in Virtuoso 7, besides getting easily double-speed random access, also greatly reduces deadlocks by virtue of ordering operations.&lt;/p&gt; &lt;p&gt;In the next post we will talk about what transactions mean with RDF and whether there is any difference with the relational model.&lt;/p&gt;</atom:content>
  <atom:updated>2011-03-22T17:44:14-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 15): BSBM Test Driver Enhancements</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1688</atom:id>
  <atom:published>2011-03-22T22:32:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article covers the changes we have made to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2361bf18&quot;&gt;BSBM&lt;/a&gt; test driver during our series of experiments.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Drill-down mode&lt;/b&gt; - For queries that have a product type as parameter, the test driver will invoke the query multiple times with each time a random subtype of the product type of the previous invocation. The starting point of the drill-down is an a random type from a settable level in the hierarchy. The rationale for the drill-down mode is that depending on the parameter choice, there can be 1000x differences in query run time. Thus run times of consecutive query mixes will be incomparable unless we guarantee that each mix has a predictable number of queries with a product type from each level in the hierarchy.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;b&gt;Permutation of query mix&lt;/b&gt; - In the BI workload, the queries are run in a random order on each thread in multiuser mode. Doing exactly the same thing on many threads is not realistic for large queries. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2834cec8&quot;&gt;data&lt;/a&gt; access patterns must be spread out in order to evaluate how bulk IO is organized with differing concurrent demands. The permutations are deterministic on consecutive runs and do not depend on the non-deterministic timing of concurrent activities. For queries with a drill-down, the individual executions that make up the drill-down are still consecutive.&lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;New metrics&lt;/b&gt; - The BI Power is the geometric mean of query run times scaled to queries per hour and multiplied by the scale factor, where 100 Mt is considered the unit scale. The BI Throughput is the arithmetic mean of the run times scaled to QPH and adjusted to scale as with the Power metric. These are analogous to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x236c5158&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x28814950&quot;&gt;H&lt;/a&gt; Power and Throughput metrics. &lt;/p&gt; &lt;p&gt;The &lt;i&gt;Power&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;(scale_factor / 284826) * 3600 / ((t0 * t1 * ... * tn) ^(1 / n)) &lt;/blockquote&gt; &lt;p&gt;The &lt;i&gt;Throughput&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;(scale_factor / 284826) * 3600 / ((t0 + t2 + ... + tn) / n)&lt;/blockquote&gt; &lt;p&gt;The magic number 284826 is the scale that generates approximately 100 million triples (100 Mt). We consider this &amp;quot;scale one.&amp;quot; The reason for the multiplication is that scores at different scales should get similar numbers, otherwise 10x larger scale would result roughly in 10x lower throughput with the BI queries.&lt;/p&gt; &lt;p&gt;We also show the percentage each query represents from the total time the test driver waits for responses. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Deadlock retry&lt;/b&gt; - When running update mixes, it is possible that a transaction gets aborted by a deadlock. We have made a retry logic for this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Cluster mode&lt;/b&gt; - Cluster databases may have multiple interchangeable &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x240f9008&quot;&gt;HTTP&lt;/a&gt; listeners. With this mode, one can specify multiple end-points so a multi-user workload can divide itself evenly over these.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Identifying matter&lt;/b&gt; - A version number was added to test driver output. Use of the new switches is also indicated in the test driver output.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SUT &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x249b7208&quot;&gt;CPU&lt;/a&gt;&lt;/b&gt; - In comparing results it is crucial to differentiate between in memory runs and IO bound runs. To make this easier, we have added an option to report server CPU times over the timed portion (excluding warm-ups). A pluggable self-script determines the CPU times for the system; thus clusters can be handled, too. The time is given as a sum of the time the server processes have aged during the run and as a percentage over the wall-clock time.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These changes will soon be available &lt;a href=&quot;http://blogs.usnet.private:8893/RPC2&quot; id=&quot;link-id0x1f9a57c0&quot;&gt;as a diff&lt;/a&gt; and &lt;a href=&quot;http://blogs.usnet.private:8893/RPC2&quot; id=&quot;link-id0x1f2fea08&quot;&gt;as a source tree&lt;/a&gt;. This version is labeled &lt;b&gt;&lt;code&gt;BSBM Test Driver 1.1-opl&lt;/code&gt;&lt;/b&gt;; the &lt;b&gt;&lt;code&gt;-opl&lt;/code&gt;&lt;/b&gt; signifies OpenLink additions. &lt;/p&gt; &lt;p&gt;We invite FU Berlin to include these enhancements into their Source Forge repository of the BSBM test driver. There is more precise documentation of these options in the README file in the above distribution.&lt;/p&gt; &lt;p&gt;The next planned upgrade of the test driver concerns adding support for &amp;quot;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2865ac68&quot;&gt;RDF&lt;/a&gt;-H&amp;quot;, the RDF adaptation of the industry standard TPC-H decision support benchmark for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x23597bb0&quot;&gt;RDBMS&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1db2be00&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1dfcc038&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x197c26d0&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d149cf0&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ab69450&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1e67d688&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1dad87c8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1cc73830&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1d6879a8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dfae510&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ef052a0&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1dadddb0&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e662ef0&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1df6fa70&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-22T17:04:43-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 15): BSBM Test Driver Enhancements</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1684</atom:id>
  <atom:published>2011-03-22T22:32:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;This article covers the changes we have made to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x283a2528&quot;&gt;BSBM&lt;/a&gt; test driver during our series of experiments.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Drill-down mode&lt;/b&gt; - For queries that have a product type as parameter, the test driver will invoke the query multiple times with each time a random subtype of the product type of the previous invocation. The starting point of the drill-down is an a random type from a settable level in the hierarchy. The rationale for the drill-down mode is that depending on the parameter choice, there can be 1000x differences in query run time. Thus run times of consecutive query mixes will be incomparable unless we guarantee that each mix has a predictable number of queries with a product type from each level in the hierarchy.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;b&gt;Permutation of query mix&lt;/b&gt; - In the BI workload, the queries are run in a random order on each thread in multiuser mode. Doing exactly the same thing on many threads is not realistic for large queries. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23880860&quot;&gt;data&lt;/a&gt; access patterns must be spread out in order to evaluate how bulk IO is organized with differing concurrent demands. The permutations are deterministic on consecutive runs and do not depend on the non-deterministic timing of concurrent activities. For queries with a drill-down, the individual executions that make up the drill-down are still consecutive.&lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;New metrics&lt;/b&gt; - The BI Power is the geometric mean of query run times scaled to queries per hour and multiplied by the scale factor, where 100 Mt is considered the unit scale. The BI Throughput is the arithmetic mean of the run times scaled to QPH and adjusted to scale as with the Power metric. These are analogous to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x28ccd3f8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x29ad25c8&quot;&gt;H&lt;/a&gt; Power and Throughput metrics. &lt;/p&gt; &lt;p&gt;The &lt;i&gt;Power&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;(scale_factor / 284826) * 3600 / ((t0 * t1 * ... * tn) ^(1 / n)) &lt;/blockquote&gt; &lt;p&gt;The &lt;i&gt;Throughput&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;(scale_factor / 284826) * 3600 / ((t0 + t2 + ... + tn) / n)&lt;/blockquote&gt; &lt;p&gt;The magic number 284826 is the scale that generates approximately 100 million triples (100 Mt). We consider this &amp;quot;scale one.&amp;quot; The reason for the multiplication is that scores at different scales should get similar numbers, otherwise 10x larger scale would result roughly in 10x lower throughput with the BI queries.&lt;/p&gt; &lt;p&gt;We also show the percentage each query represents from the total time the test driver waits for responses. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Deadlock retry&lt;/b&gt; - When running update mixes, it is possible that a transaction gets aborted by a deadlock. We have made a retry logic for this.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Cluster mode&lt;/b&gt; - Cluster databases may have multiple interchangeable &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x236532c8&quot;&gt;HTTP&lt;/a&gt; listeners. With this mode, one can specify multiple end-points so a multi-user workload can divide itself evenly over these.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Identifying matter&lt;/b&gt; - A version number was added to test driver output. Use of the new switches is also indicated in the test driver output.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SUT &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x249c8f68&quot;&gt;CPU&lt;/a&gt;&lt;/b&gt; - In comparing results it is crucial to differentiate between in memory runs and IO bound runs. To make this easier, we have added an option to report server CPU times over the timed portion (excluding warm-ups). A pluggable self-script determines the CPU times for the system; thus clusters can be handled, too. The time is given as a sum of the time the server processes have aged during the run and as a percentage over the wall-clock time.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These changes will soon be available &lt;a href=&quot;http://blogs.usnet.private:8893/RPC2&quot; id=&quot;link-id0x1f9a57c0&quot;&gt;as a diff&lt;/a&gt; and &lt;a href=&quot;http://blogs.usnet.private:8893/RPC2&quot; id=&quot;link-id0x1f2fea08&quot;&gt;as a source tree&lt;/a&gt;. This version is labeled &lt;b&gt;&lt;code&gt;BSBM Test Driver 1.1-opl&lt;/code&gt;&lt;/b&gt;; the &lt;b&gt;&lt;code&gt;-opl&lt;/code&gt;&lt;/b&gt; signifies OpenLink additions. &lt;/p&gt; &lt;p&gt;We invite FU Berlin to include these enhancements into their Source Forge repository of the BSBM test driver. There is more precise documentation of these options in the README file in the above distribution.&lt;/p&gt; &lt;p&gt;The next planned upgrade of the test driver concerns adding support for &amp;quot;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x23de9eb8&quot;&gt;RDF&lt;/a&gt;-H&amp;quot;, the RDF adaptation of the industry standard TPC-H decision support benchmark for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x22cca4e0&quot;&gt;RDBMS&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1db2be00&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1dfcc038&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x197c26d0&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d149cf0&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ab69450&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1e67d688&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1dad87c8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1cc73830&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1d6879a8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dfae510&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ef052a0&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac14871988&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aac0117d1a8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aac14dbfd58&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:42:54.780224-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 14): BSBM BI Mix</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1687</atom:id>
  <atom:published>2011-03-22T22:31:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post, we look at how we run the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x236dcda8&quot;&gt;BSBM&lt;/a&gt;-BI mix. We consider the 100 Mt and 1000 Mt scales with &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x284893c0&quot;&gt;Virtuoso&lt;/a&gt; 7 using the same hardware and software as in the previous posts. The changes to workload and metric are given in the previous post.&lt;/p&gt; &lt;p&gt;Our intent here is to look at whether the metric works, and to see what results will look like in general. We are as much testing the benchmark as we are testing the system-under-test (SUT). The results shown here will likely not be comparable with future ones because we will most likely change the composition of the workload since it seems a bit out of balance. Anyway, for the sake of disclosure, we attach the query templates. The test driver we used will be made available soon, so the interested may still try a comparison with their systems. If you practice with this workload for the coming races, the effort will surely not be wasted.&lt;/p&gt; &lt;p&gt;Once we have come up with a rules document, we will redo all that we have published so far by-the-book, and have it audited as part of the &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x23724860&quot;&gt;LOD2&lt;/a&gt; service we plan for this (see previous posts in this series). This will introduce comparability; but before we get that far with the BI workload, the workload needs to evolve a bit.&lt;/p&gt; &lt;p&gt;Below we show samples of test driver output; the whole output is &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/br.tar.gz&quot; id=&quot;link-id0x1b703ad8&quot;&gt;downloadable&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;100 Mt Single User&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; bsbm/testdriver -runs 1 -w 0 -idir /bs/1 -drill \ -ucf bsbm/usecases/businessIntelligence/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2385eb48&quot;&gt;sparql&lt;/a&gt;.txt \ -dg &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x22e2f508&quot;&gt;http&lt;/a&gt;://bsbm.org http://localhost:8604/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 43348.14ms, total: 43440ms Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 43.3481s / 43.3481s Elapsed runtime: 43.348 seconds QMpH: 83.049 query mixes per hour CQET: 43.348 seconds average runtime of query mix CQET (geom.): 43.348 seconds geometric mean runtime of query mix AQET (geom.): 0.492 seconds geometric mean runtime of query Throughput: 1494.874 BSBM-BI throughput: qph*scale BI Power: 7309.820 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;100 Mt 8 User &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 6: query mix 3: 195793.09ms, total: 196086.18ms Thread 8: query mix 0: 197843.84ms, total: 198010.50ms Thread 7: query mix 4: 201806.28ms, total: 201996.26ms Thread 2: query mix 5: 221983.93ms, total: 222105.96ms Thread 4: query mix 7: 225127.55ms, total: 225317.49ms Thread 3: query mix 6: 225860.49ms, total: 226050.17ms Thread 5: query mix 2: 230884.93ms, total: 231067.61ms Thread 1: query mix 1: 237836.61ms, total: 237959.11ms Benchmark run completed in 237.985427s Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 195.7931s / 237.8366s Total runtime (sum): 1737.137 seconds Elapsed runtime: 1737.137 seconds QMpH: 121.016 query mixes per hour CQET: 217.142 seconds average runtime of query mix CQET (geom.): 216.603 seconds geometric mean runtime of query mix AQET (geom.): 2.156 seconds geometric mean runtime of query Throughput: 2178.285 BSBM-BI throughput: qph*scale BI Power: 1669.745 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1000 Mt Single User&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 608707.03ms, total: 608768ms Scale factor: 2848260 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 608.7070s / 608.7070s Elapsed runtime: 608.707 seconds QMpH: 5.914 query mixes per hour CQET: 608.707 seconds average runtime of query mix CQET (geom.): 608.707 seconds geometric mean runtime of query mix AQET (geom.): 5.167 seconds geometric mean runtime of query Throughput: 1064.552 BSBM-BI throughput: qph*scale BI Power: 6967.325 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1000 Mt 8 User &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; bsbm/testdriver -runs 8 -mt 8 -w 0 -idir /bs/10 -drill \ -ucf bsbm/usecases/businessIntelligence/sparql.txt \ -dg http://bsbm.org http://localhost:8604/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 3: query mix 4: 2211275.25ms, total: 2211371.60ms Thread 4: query mix 0: 2212316.87ms, total: 2212417.99ms Thread 8: query mix 3: 2275942.63ms, total: 2276058.03ms Thread 5: query mix 5: 2441378.35ms, total: 2441448.66ms Thread 6: query mix 7: 2804001.05ms, total: 2804098.81ms Thread 2: query mix 2: 2808374.66ms, total: 2808473.71ms Thread 1: query mix 6: 2839407.12ms, total: 2839510.63ms Thread 7: query mix 1: 2889199.23ms, total: 2889263.17ms Benchmark run completed in 2889.302566s Scale factor: 2848260 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 2211.2753s / 2889.1992s Total runtime (sum): 20481.895 seconds Elapsed runtime: 20481.895 seconds QMpH: 9.968 query mixes per hour CQET: 2560.237 seconds average runtime of query mix CQET (geom.): 2544.284 seconds geometric mean runtime of query mix AQET (geom.): 13.556 seconds geometric mean runtime of query Throughput: 1794.205 BSBM-BI throughput: qph*scale BI Power: 2655.678 BSBM-BI Power: qph*scale (geom) Metrics for Query: 1 Count: 8 times executed in whole run Time share 2.120884% of total execution time AQET: 54.299656 seconds (arithmetic mean) AQET(geom.): 34.607302 seconds (geometric mean) QPS: 0.13 Queries per second minQET/maxQET: 11.71547600s / 148.65379700s Metrics for Query: 2 Count: 8 times executed in whole run Time share 0.207382% of total execution time AQET: 5.309462 seconds (arithmetic mean) AQET(geom.): 2.737696 seconds (geometric mean) QPS: 1.34 Queries per second minQET/maxQET: 0.78729800s / 25.80948200s Metrics for Query: 3 Count: 8 times executed in whole run Time share 17.650472% of total execution time AQET: 451.893890 seconds (arithmetic mean) AQET(geom.): 410.481088 seconds (geometric mean) QPS: 0.02 Queries per second minQET/maxQET: 171.07262500s / 721.72939200s Metrics for Query: 5 Count: 32 times executed in whole run Time share 6.196565% of total execution time AQET: 39.661685 seconds (arithmetic mean) AQET(geom.): 6.849882 seconds (geometric mean) QPS: 0.18 Queries per second minQET/maxQET: 0.15696500s / 189.00906200s Metrics for Query: 6 Count: 8 times executed in whole run Time share 0.119916% of total execution time AQET: 3.070136 seconds (arithmetic mean) AQET(geom.): 2.056059 seconds (geometric mean) QPS: 2.31 Queries per second minQET/maxQET: 0.41524400s / 7.55655300s Metrics for Query: 7 Count: 40 times executed in whole run Time share 1.577963% of total execution time AQET: 8.079921 seconds (arithmetic mean) AQET(geom.): 1.342079 seconds (geometric mean) QPS: 0.88 Queries per second minQET/maxQET: 0.02205800s / 40.27761500s Metrics for Query: 8 Count: 40 times executed in whole run Time share 72.126818% of total execution time AQET: 369.323481 seconds (arithmetic mean) AQET(geom.): 114.431863 seconds (geometric mean) QPS: 0.02 Queries per second minQET/maxQET: 5.94377300s / 1824.57867400s &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x2809d998&quot;&gt;CPU&lt;/a&gt; for the multiuser runs stays above 1500% for the whole run. The CPU for the single user 100 Mt run is 630%; for the 1000 Mt run, this is 574%. This can be improved since the queries usually have a lot of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x22cf75b8&quot;&gt;data&lt;/a&gt; to work on. But final &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x238b94c8&quot;&gt;optimization&lt;/a&gt; is not our goal yet; we are just surveying the race track. The difference between a warm single user run and a cold single user run is about 15% with data on SSD; with data on disk, this would be more. The numbers shown are with warm &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x23ad8c08&quot;&gt;cache&lt;/a&gt;. The single-user and multi-user Throughput difference, 1064 single-user vs. 1794 multi-user, is about what one would expect from the CPU utilization.&lt;/p&gt; &lt;p&gt;With these numbers, the CPU does not appear badly memory-bound, else the increase would be less; also core multi-threading seems to bring some benefit. If the single-user run was at 800%, the Throughput would be 1488. The speed in excess of this may be attributed to core multi-threading, although we must remember that not every query mix is exactly the same length, so the figure is not exact. Core multi-threading does not seem to hurt, at the very least. Comparison of the same numbers with the column store will be interesting since it misses the cache a lot less and accordingly has better SMP scaling. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x23568308&quot;&gt;Intel&lt;/a&gt; Nehalem memory subsystem is really pretty good.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;For reference, we show a run with Virtuoso 6 at 100Mt. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 424754.40ms, total: 424829ms Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 424.7544s / 424.7544s Elapsed runtime: 424.754 seconds QMpH: 8.475 query mixes per hour CQET: 424.754 seconds average runtime of query mix CQET (geom.): 424.754 seconds geometric mean runtime of query mix AQET (geom.): 1.097 seconds geometric mean runtime of query Throughput: 152.559 BSBM-BI throughput: qph*scale BI Power: 3281.150 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;and 8 user &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 5: query mix 3: 616997.86ms, total: 617042.83ms Thread 7: query mix 4: 625522.18ms, total: 625559.09ms Thread 3: query mix 7: 626247.62ms, total: 626304.96ms Thread 1: query mix 0: 629675.17ms, total: 629724.98ms Thread 4: query mix 6: 667633.36ms, total: 667670.07ms Thread 8: query mix 2: 674206.07ms, total: 674256.72ms Thread 6: query mix 5: 695020.21ms, total: 695052.29ms Thread 2: query mix 1: 701824.67ms, total: 701864.91ms Benchmark run completed in 701.909341s Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 616.9979s / 701.8247s Total runtime (sum): 5237.127 seconds Elapsed runtime: 5237.127 seconds QMpH: 41.031 query mixes per hour CQET: 654.641 seconds average runtime of query mix CQET (geom.): 653.873 seconds geometric mean runtime of query mix AQET (geom.): 2.557 seconds geometric mean runtime of query Throughput: 738.557 BSBM-BI throughput: qph*scale BI Power: 1408.133 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Having the numbers, let us look at the metric and its scaling. We take the geometric mean of the single-user Power and the multiuser Throughput.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 100 Mt: sqrt ( 7771 * 2178 ); = 4114 1000 Mt: sqrt ( 6967 * 1794 ); = 3535 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Scaling seems to work; the results are in the same general ballpark. The real times for the 1000 Mt run are a bit over 10x the times for the 100Mt run, as expected. The relative percentages of the queries are about the same on both scales, with the drill-down in Q8 alone being 77% and 72% respectively. The Q8 drill-down starts at the root of the product hierarchy. If we made this start one level from the top, its share would drop. This seems reasonable.&lt;/p&gt; &lt;p&gt;Conversely, Q2 is out of place, with far too little share of the time. It takes a product as a starting point and shows a list of products with common features, sorted by descending count of common features. This would more appropriately be applied to a leaf product category instead, measuring how many of the products in the category have the top 20 features found in this category, to name an example.&lt;/p&gt; &lt;p&gt;Also there should be more queries.&lt;/p&gt; &lt;p&gt;At present it appears that BSBM-BI is definitely runnable, but a cursory look suffices to show that the workload needs more development and variety. We remember that I dreamt up the business questions last fall without much analysis, and that these questions were subsequently translated to SPARQL by FU Berlin. So, on one hand, BSBM-BI is of crucial importance because it is the first attempt at doing a benchmark with long running queries in SPARQL. On the other hand, BSBM-BI is not very good as a benchmark; &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x23872a10&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x28487d98&quot;&gt;H&lt;/a&gt; is a lot better. This stands to reason, as TPC-H has had years and years of development and participation by many people.&lt;/p&gt; &lt;p&gt;Benchmark queries are trick questions: For example, TPC-H Q18 cannot be done without changing an &lt;code&gt;IN&lt;/code&gt; into a &lt;code&gt;JOIN&lt;/code&gt; with the &lt;code&gt;IN&lt;/code&gt; subquery in the outer loop and doing streaming aggregation. Q13 cannot be done without a well-optimized &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x24974830&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; which besides must be partitioned at the larger scales.&lt;/p&gt; &lt;p&gt;Having such trick questions in an important benchmark eventually results in everybody doing the optimizations that the benchmark clearly calls for. Making benchmarks thus entails a responsibility ultimately to the end user, because an irrelevant benchmark might in the worst case send developers chasing things that are beside the point.&lt;/p&gt; &lt;p&gt;In the following, we will look at what BSBM-BI requires from the database and how these requirements can be further developed and extended.&lt;/p&gt; &lt;p&gt;BSBM-BI does not have any clear trick questions, at least not premeditatedly. BSBM-BI just requires a cost model that can guess the fanout of a &lt;code&gt;JOIN&lt;/code&gt; and the cardinality of a &lt;code&gt;GROUP BY&lt;/code&gt;; it is enough to distinguish smaller from greater; the guess does not otherwise have to be very good. Further, the queries are written in the benchmark text so that joining from left to right would work, so not even a cost-based optimizer is strictly needed. I did however have to add some cardinality statistics to get reasonable &lt;code&gt;JOIN&lt;/code&gt; order since we always reorder the query regardless of the source formulation.&lt;/p&gt; &lt;p&gt;BSBM-BI does have variable selectivity from the drill-downs; thus these may call for different &lt;code&gt;JOIN&lt;/code&gt; orders for different parameter values. I have not looked into whether this really makes a difference, though.&lt;/p&gt; &lt;p&gt;There are places in BSBM-BI where using a &lt;code&gt;HASH JOIN&lt;/code&gt; makes sense. We do not use &lt;code&gt;HASH JOINs&lt;/code&gt; with &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x23cbf908&quot;&gt;RDF&lt;/a&gt; because there is an index for everything and making a &lt;code&gt;HASH JOIN&lt;/code&gt; in the wrong place can have a large up-front cost, so one is more robust against cost model errors if one does not do &lt;code&gt;HASH JOINs&lt;/code&gt;. This said, a &lt;code&gt;HASH JOIN&lt;/code&gt; in the right place is a lot better than an index lookup. With TPC-H Q13, our best &lt;code&gt;HASH JOIN&lt;/code&gt; is over 2x better than the best &lt;code&gt;INDEX&lt;/code&gt;-based &lt;code&gt;JOIN&lt;/code&gt;, both being well tuned. For questions like &amp;quot;count the hairballs made in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x249d3e28&quot;&gt;Germany&lt;/a&gt; reviewed by Japanese Hello Kitty fans,&amp;quot; where two ends of a &lt;code&gt;JOIN&lt;/code&gt; path are fairly selective doing the other as a &lt;code&gt;HASH JOIN&lt;/code&gt; is good. This can, if the &lt;code&gt;JOIN&lt;/code&gt; is always cardinality-reducing, even be merged inside an &lt;code&gt;INDEX&lt;/code&gt; lookup. We have such capabilities since we have been for a while gearing up for the relational races, but are not using any of these with BSBM-BI, although they would be useful.&lt;/p&gt; &lt;p&gt;Let us see the profile for a single user 100 Mt run.&lt;/p&gt; &lt;p&gt;The database activity summary is --&lt;/p&gt; &lt;p&gt; &lt;code&gt;select db_activity (0, &amp;#39;http&amp;#39;);&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt; 161.3M rnd  210.2M seq      0 same seg   104.5M same pg  45.08M same par      0 disk      0 spec disk      0B /      0 messages  2.393K fork&lt;/code&gt; &lt;/p&gt; &lt;p&gt;See the post &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1b1f3068&quot;&gt;What Does BSBM Explore Measure&lt;/a&gt;&amp;quot; for an explanation of the numbers. We see that there is more sequential access than random and the random has fair locality with over half on the same page as the previous and a lot of the rest falling under the same parent. Funnily enough, the explore mix has more locality. Running with a longer vector size would probably increase performance by getting better locality. There is an optimization that adjusts vector size on the fly if locality is not sufficient but this is not being used here. So we manually set vector size to 100000 instead of the default 10000. We get --&lt;/p&gt; &lt;p&gt; &lt;code&gt; 172.4M rnd  220.8M seq      0 same seg   149.6M same pg  10.99M same par     21 disk    861 spec disk      0B /      0 messages     754 fork&lt;/code&gt; &lt;/p&gt; &lt;p&gt;The throughput goes from 1494 to 1779. We see more hits on the same page, as expected. We do not make this setting a default since it raises the cost for small queries; therefore the vector size must be self-adjusting -- besides, expecting a DBA to tune this is not reasonable. We will just have to correctly tune the self-adjust logic, and we have again clear gains.&lt;/p&gt; &lt;p&gt;Let us now go back to the first run with vector size 10000.&lt;/p&gt; &lt;p&gt;The top of the CPU &lt;code&gt;oprofile&lt;/code&gt; is as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 722309 15.4507 cmpf_iri64n_iri64n 434791 9.3005 cmpf_iri64n_iri64n_anyn_iri64n 294712 6.3041 itc_next_set 273488 5.8501 itc_vec_split_search 203970 4.3631 itc_dive_transit 199687 4.2714 itc_page_rcf_search 181614 3.8848 dc_itc_append_any 173043 3.7015 itc_bm_vec_row_check 146727 3.1386 cmpf_int64n 128224 2.7428 itc_vec_row_check 113515 2.4282 dk_alloc 97296 2.0812 page_wait_access 62523 1.3374 qst_vec_get_int64 59014 1.2623 itc_next_set_parent 53589 1.1463 sslr_qst_get 48003 1.0268 ds_add 46641 0.9977 dk_free_tree 44551 0.9530 kc_var_col 43650 0.9337 page_col_cmp_1 35297 0.7550 cmpf_iri64n_iri64n_anyn_gt_lt 34589 0.7399 dv_compare 25864 0.5532 cmpf_iri64n_anyn_iri64n_iri64n_lte 23088 0.4939 dk_free &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top 10 are all index traversal, with the key compare for two leading IRI keys in the lead, corresponding to a lookup with &lt;code&gt;P&lt;/code&gt; and &lt;code&gt;S&lt;/code&gt; given. The one after that is with all parts given, corresponding to an existence test. The existence tests could probably be converted to &lt;code&gt;HASH JOIN&lt;/code&gt; lookups to good advantage. Aggregation and arithmetic are absent. We should probably add a query like TPC-H Q1 that does nothing but these two. Considering the overall profile, &lt;code&gt;GROUP BY&lt;/code&gt; seems to be around 3%. We should probably put in a query that makes a very large number of groups and could make use of streaming aggregation, i.e., take advantage of a situation where aggregation input comes already grouped by the grouping columns.&lt;/p&gt; &lt;p&gt;A BI use case should offer no problem with including arithmetic, but there are not that many numbers in the BSBM set. Some code sections in the queries with conditional execution and costly tests inside &lt;code&gt;ANDs&lt;/code&gt; and &lt;code&gt;ORs&lt;/code&gt; would be good. TPC-H has such in Q21 and Q19. An &lt;code&gt;OR&lt;/code&gt; with existences where there would be gain from good guesses of a subquery&amp;#39;s selectivity would be appropriate. Also, there should be conditional expressions somewhere with a lot of data, like the &lt;code&gt;CASE-WHEN&lt;/code&gt; in TPC-H Q12.&lt;/p&gt; &lt;p&gt;We can make BSBM-BI more interesting by putting in the above. Also we will have to see where we can profit from &lt;code&gt;HASH JOIN&lt;/code&gt;, both small and large. There should be such places in the workload already so this is a matter of just playing a bit more.&lt;/p&gt; &lt;p&gt;This post amounts to a cheat sheet for the BSBM-BI runs a bit farther down the road. By then we should be operational with the column store and Virtuoso 7 Cluster, though, so not everything is yet on the table.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1fd1d4e0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d5b07d8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1dfe6c48&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x197fce30&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1fbf4210&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1beeb1e0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1d7e1818&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1dfc1730&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1ea819a8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1ec73da0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1fbdce90&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x19928618&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f3d8710&quot;&gt;Benchmarks, Redux (part 13): BSBM-BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 14): BSBM-BI Mix &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e627400&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-22T17:04:38-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 14): BSBM BI Mix</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1683</atom:id>
  <atom:published>2011-03-22T22:31:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post, we look at how we run the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x23be8d28&quot;&gt;BSBM&lt;/a&gt;-BI mix. We consider the 100 Mt and 1000 Mt scales with &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x23b69e40&quot;&gt;Virtuoso&lt;/a&gt; 7 using the same hardware and software as in the previous posts. The changes to workload and metric are given in the previous post.&lt;/p&gt; &lt;p&gt;Our intent here is to look at whether the metric works, and to see what results will look like in general. We are as much testing the benchmark as we are testing the system-under-test (SUT). The results shown here will likely not be comparable with future ones because we will most likely change the composition of the workload since it seems a bit out of balance. Anyway, for the sake of disclosure, we attach the query templates. The test driver we used will be made available soon, so the interested may still try a comparison with their systems. If you practice with this workload for the coming races, the effort will surely not be wasted.&lt;/p&gt; &lt;p&gt;Once we have come up with a rules document, we will redo all that we have published so far by-the-book, and have it audited as part of the &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x23a74c40&quot;&gt;LOD2&lt;/a&gt; service we plan for this (see previous posts in this series). This will introduce comparability; but before we get that far with the BI workload, the workload needs to evolve a bit.&lt;/p&gt; &lt;p&gt;Below we show samples of test driver output; the whole output is &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/br.tar.gz&quot; id=&quot;link-id0x1b703ad8&quot;&gt;downloadable&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;100 Mt Single User&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; bsbm/testdriver -runs 1 -w 0 -idir /bs/1 -drill \ -ucf bsbm/usecases/businessIntelligence/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x247b7e08&quot;&gt;sparql&lt;/a&gt;.txt \ -dg &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x232a86b0&quot;&gt;http&lt;/a&gt;://bsbm.org http://localhost:8604/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 43348.14ms, total: 43440ms Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 43.3481s / 43.3481s Elapsed runtime: 43.348 seconds QMpH: 83.049 query mixes per hour CQET: 43.348 seconds average runtime of query mix CQET (geom.): 43.348 seconds geometric mean runtime of query mix AQET (geom.): 0.492 seconds geometric mean runtime of query Throughput: 1494.874 BSBM-BI throughput: qph*scale BI Power: 7309.820 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;100 Mt 8 User &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 6: query mix 3: 195793.09ms, total: 196086.18ms Thread 8: query mix 0: 197843.84ms, total: 198010.50ms Thread 7: query mix 4: 201806.28ms, total: 201996.26ms Thread 2: query mix 5: 221983.93ms, total: 222105.96ms Thread 4: query mix 7: 225127.55ms, total: 225317.49ms Thread 3: query mix 6: 225860.49ms, total: 226050.17ms Thread 5: query mix 2: 230884.93ms, total: 231067.61ms Thread 1: query mix 1: 237836.61ms, total: 237959.11ms Benchmark run completed in 237.985427s Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 195.7931s / 237.8366s Total runtime (sum): 1737.137 seconds Elapsed runtime: 1737.137 seconds QMpH: 121.016 query mixes per hour CQET: 217.142 seconds average runtime of query mix CQET (geom.): 216.603 seconds geometric mean runtime of query mix AQET (geom.): 2.156 seconds geometric mean runtime of query Throughput: 2178.285 BSBM-BI throughput: qph*scale BI Power: 1669.745 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1000 Mt Single User&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 608707.03ms, total: 608768ms Scale factor: 2848260 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 608.7070s / 608.7070s Elapsed runtime: 608.707 seconds QMpH: 5.914 query mixes per hour CQET: 608.707 seconds average runtime of query mix CQET (geom.): 608.707 seconds geometric mean runtime of query mix AQET (geom.): 5.167 seconds geometric mean runtime of query Throughput: 1064.552 BSBM-BI throughput: qph*scale BI Power: 6967.325 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;1000 Mt 8 User &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; bsbm/testdriver -runs 8 -mt 8 -w 0 -idir /bs/10 -drill \ -ucf bsbm/usecases/businessIntelligence/sparql.txt \ -dg http://bsbm.org http://localhost:8604/sparql &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 3: query mix 4: 2211275.25ms, total: 2211371.60ms Thread 4: query mix 0: 2212316.87ms, total: 2212417.99ms Thread 8: query mix 3: 2275942.63ms, total: 2276058.03ms Thread 5: query mix 5: 2441378.35ms, total: 2441448.66ms Thread 6: query mix 7: 2804001.05ms, total: 2804098.81ms Thread 2: query mix 2: 2808374.66ms, total: 2808473.71ms Thread 1: query mix 6: 2839407.12ms, total: 2839510.63ms Thread 7: query mix 1: 2889199.23ms, total: 2889263.17ms Benchmark run completed in 2889.302566s Scale factor: 2848260 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 2211.2753s / 2889.1992s Total runtime (sum): 20481.895 seconds Elapsed runtime: 20481.895 seconds QMpH: 9.968 query mixes per hour CQET: 2560.237 seconds average runtime of query mix CQET (geom.): 2544.284 seconds geometric mean runtime of query mix AQET (geom.): 13.556 seconds geometric mean runtime of query Throughput: 1794.205 BSBM-BI throughput: qph*scale BI Power: 2655.678 BSBM-BI Power: qph*scale (geom) Metrics for Query: 1 Count: 8 times executed in whole run Time share 2.120884% of total execution time AQET: 54.299656 seconds (arithmetic mean) AQET(geom.): 34.607302 seconds (geometric mean) QPS: 0.13 Queries per second minQET/maxQET: 11.71547600s / 148.65379700s Metrics for Query: 2 Count: 8 times executed in whole run Time share 0.207382% of total execution time AQET: 5.309462 seconds (arithmetic mean) AQET(geom.): 2.737696 seconds (geometric mean) QPS: 1.34 Queries per second minQET/maxQET: 0.78729800s / 25.80948200s Metrics for Query: 3 Count: 8 times executed in whole run Time share 17.650472% of total execution time AQET: 451.893890 seconds (arithmetic mean) AQET(geom.): 410.481088 seconds (geometric mean) QPS: 0.02 Queries per second minQET/maxQET: 171.07262500s / 721.72939200s Metrics for Query: 5 Count: 32 times executed in whole run Time share 6.196565% of total execution time AQET: 39.661685 seconds (arithmetic mean) AQET(geom.): 6.849882 seconds (geometric mean) QPS: 0.18 Queries per second minQET/maxQET: 0.15696500s / 189.00906200s Metrics for Query: 6 Count: 8 times executed in whole run Time share 0.119916% of total execution time AQET: 3.070136 seconds (arithmetic mean) AQET(geom.): 2.056059 seconds (geometric mean) QPS: 2.31 Queries per second minQET/maxQET: 0.41524400s / 7.55655300s Metrics for Query: 7 Count: 40 times executed in whole run Time share 1.577963% of total execution time AQET: 8.079921 seconds (arithmetic mean) AQET(geom.): 1.342079 seconds (geometric mean) QPS: 0.88 Queries per second minQET/maxQET: 0.02205800s / 40.27761500s Metrics for Query: 8 Count: 40 times executed in whole run Time share 72.126818% of total execution time AQET: 369.323481 seconds (arithmetic mean) AQET(geom.): 114.431863 seconds (geometric mean) QPS: 0.02 Queries per second minQET/maxQET: 5.94377300s / 1824.57867400s &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x249ce740&quot;&gt;CPU&lt;/a&gt; for the multiuser runs stays above 1500% for the whole run. The CPU for the single user 100 Mt run is 630%; for the 1000 Mt run, this is 574%. This can be improved since the queries usually have a lot of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2871b1f0&quot;&gt;data&lt;/a&gt; to work on. But final &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x22c95b90&quot;&gt;optimization&lt;/a&gt; is not our goal yet; we are just surveying the race track. The difference between a warm single user run and a cold single user run is about 15% with data on SSD; with data on disk, this would be more. The numbers shown are with warm &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x22ca4300&quot;&gt;cache&lt;/a&gt;. The single-user and multi-user Throughput difference, 1064 single-user vs. 1794 multi-user, is about what one would expect from the CPU utilization.&lt;/p&gt; &lt;p&gt;With these numbers, the CPU does not appear badly memory-bound, else the increase would be less; also core multi-threading seems to bring some benefit. If the single-user run was at 800%, the Throughput would be 1488. The speed in excess of this may be attributed to core multi-threading, although we must remember that not every query mix is exactly the same length, so the figure is not exact. Core multi-threading does not seem to hurt, at the very least. Comparison of the same numbers with the column store will be interesting since it misses the cache a lot less and accordingly has better SMP scaling. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x28814950&quot;&gt;Intel&lt;/a&gt; Nehalem memory subsystem is really pretty good.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;For reference, we show a run with Virtuoso 6 at 100Mt. &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 424754.40ms, total: 424829ms Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 1 times min/max Querymix runtime: 424.7544s / 424.7544s Elapsed runtime: 424.754 seconds QMpH: 8.475 query mixes per hour CQET: 424.754 seconds average runtime of query mix CQET (geom.): 424.754 seconds geometric mean runtime of query mix AQET (geom.): 1.097 seconds geometric mean runtime of query Throughput: 152.559 BSBM-BI throughput: qph*scale BI Power: 3281.150 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;and 8 user &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Thread 5: query mix 3: 616997.86ms, total: 617042.83ms Thread 7: query mix 4: 625522.18ms, total: 625559.09ms Thread 3: query mix 7: 626247.62ms, total: 626304.96ms Thread 1: query mix 0: 629675.17ms, total: 629724.98ms Thread 4: query mix 6: 667633.36ms, total: 667670.07ms Thread 8: query mix 2: 674206.07ms, total: 674256.72ms Thread 6: query mix 5: 695020.21ms, total: 695052.29ms Thread 2: query mix 1: 701824.67ms, total: 701864.91ms Benchmark run completed in 701.909341s Scale factor: 284826 Explore Endpoints: 1 Update Endpoints: 1 Drilldown: on Number of warmup runs: 0 Number of clients: 8 Seed: 808080 Number of query mix runs (without warmups): 8 times min/max Querymix runtime: 616.9979s / 701.8247s Total runtime (sum): 5237.127 seconds Elapsed runtime: 5237.127 seconds QMpH: 41.031 query mixes per hour CQET: 654.641 seconds average runtime of query mix CQET (geom.): 653.873 seconds geometric mean runtime of query mix AQET (geom.): 2.557 seconds geometric mean runtime of query Throughput: 738.557 BSBM-BI throughput: qph*scale BI Power: 1408.133 BSBM-BI Power: qph*scale (geom) &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Having the numbers, let us look at the metric and its scaling. We take the geometric mean of the single-user Power and the multiuser Throughput.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 100 Mt: sqrt ( 7771 * 2178 ); = 4114 1000 Mt: sqrt ( 6967 * 1794 ); = 3535 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Scaling seems to work; the results are in the same general ballpark. The real times for the 1000 Mt run are a bit over 10x the times for the 100Mt run, as expected. The relative percentages of the queries are about the same on both scales, with the drill-down in Q8 alone being 77% and 72% respectively. The Q8 drill-down starts at the root of the product hierarchy. If we made this start one level from the top, its share would drop. This seems reasonable.&lt;/p&gt; &lt;p&gt;Conversely, Q2 is out of place, with far too little share of the time. It takes a product as a starting point and shows a list of products with common features, sorted by descending count of common features. This would more appropriately be applied to a leaf product category instead, measuring how many of the products in the category have the top 20 features found in this category, to name an example.&lt;/p&gt; &lt;p&gt;Also there should be more queries.&lt;/p&gt; &lt;p&gt;At present it appears that BSBM-BI is definitely runnable, but a cursory look suffices to show that the workload needs more development and variety. We remember that I dreamt up the business questions last fall without much analysis, and that these questions were subsequently translated to SPARQL by FU Berlin. So, on one hand, BSBM-BI is of crucial importance because it is the first attempt at doing a benchmark with long running queries in SPARQL. On the other hand, BSBM-BI is not very good as a benchmark; &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x23227ce0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x279c6700&quot;&gt;H&lt;/a&gt; is a lot better. This stands to reason, as TPC-H has had years and years of development and participation by many people.&lt;/p&gt; &lt;p&gt;Benchmark queries are trick questions: For example, TPC-H Q18 cannot be done without changing an &lt;code&gt;IN&lt;/code&gt; into a &lt;code&gt;JOIN&lt;/code&gt; with the &lt;code&gt;IN&lt;/code&gt; subquery in the outer loop and doing streaming aggregation. Q13 cannot be done without a well-optimized &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x238cbf88&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; which besides must be partitioned at the larger scales.&lt;/p&gt; &lt;p&gt;Having such trick questions in an important benchmark eventually results in everybody doing the optimizations that the benchmark clearly calls for. Making benchmarks thus entails a responsibility ultimately to the end user, because an irrelevant benchmark might in the worst case send developers chasing things that are beside the point.&lt;/p&gt; &lt;p&gt;In the following, we will look at what BSBM-BI requires from the database and how these requirements can be further developed and extended.&lt;/p&gt; &lt;p&gt;BSBM-BI does not have any clear trick questions, at least not premeditatedly. BSBM-BI just requires a cost model that can guess the fanout of a &lt;code&gt;JOIN&lt;/code&gt; and the cardinality of a &lt;code&gt;GROUP BY&lt;/code&gt;; it is enough to distinguish smaller from greater; the guess does not otherwise have to be very good. Further, the queries are written in the benchmark text so that joining from left to right would work, so not even a cost-based optimizer is strictly needed. I did however have to add some cardinality statistics to get reasonable &lt;code&gt;JOIN&lt;/code&gt; order since we always reorder the query regardless of the source formulation.&lt;/p&gt; &lt;p&gt;BSBM-BI does have variable selectivity from the drill-downs; thus these may call for different &lt;code&gt;JOIN&lt;/code&gt; orders for different parameter values. I have not looked into whether this really makes a difference, though.&lt;/p&gt; &lt;p&gt;There are places in BSBM-BI where using a &lt;code&gt;HASH JOIN&lt;/code&gt; makes sense. We do not use &lt;code&gt;HASH JOINs&lt;/code&gt; with &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x235d8d88&quot;&gt;RDF&lt;/a&gt; because there is an index for everything and making a &lt;code&gt;HASH JOIN&lt;/code&gt; in the wrong place can have a large up-front cost, so one is more robust against cost model errors if one does not do &lt;code&gt;HASH JOINs&lt;/code&gt;. This said, a &lt;code&gt;HASH JOIN&lt;/code&gt; in the right place is a lot better than an index lookup. With TPC-H Q13, our best &lt;code&gt;HASH JOIN&lt;/code&gt; is over 2x better than the best &lt;code&gt;INDEX&lt;/code&gt;-based &lt;code&gt;JOIN&lt;/code&gt;, both being well tuned. For questions like &amp;quot;count the hairballs made in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x2358ae60&quot;&gt;Germany&lt;/a&gt; reviewed by Japanese Hello Kitty fans,&amp;quot; where two ends of a &lt;code&gt;JOIN&lt;/code&gt; path are fairly selective doing the other as a &lt;code&gt;HASH JOIN&lt;/code&gt; is good. This can, if the &lt;code&gt;JOIN&lt;/code&gt; is always cardinality-reducing, even be merged inside an &lt;code&gt;INDEX&lt;/code&gt; lookup. We have such capabilities since we have been for a while gearing up for the relational races, but are not using any of these with BSBM-BI, although they would be useful.&lt;/p&gt; &lt;p&gt;Let us see the profile for a single user 100 Mt run.&lt;/p&gt; &lt;p&gt;The database activity summary is --&lt;/p&gt; &lt;p&gt; &lt;code&gt;select db_activity (0, &amp;#39;http&amp;#39;);&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt; 161.3M rnd  210.2M seq      0 same seg   104.5M same pg  45.08M same par      0 disk      0 spec disk      0B /      0 messages  2.393K fork&lt;/code&gt; &lt;/p&gt; &lt;p&gt;See the post &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1b1f3068&quot;&gt;What Does BSBM Explore Measure&lt;/a&gt;&amp;quot; for an explanation of the numbers. We see that there is more sequential access than random and the random has fair locality with over half on the same page as the previous and a lot of the rest falling under the same parent. Funnily enough, the explore mix has more locality. Running with a longer vector size would probably increase performance by getting better locality. There is an optimization that adjusts vector size on the fly if locality is not sufficient but this is not being used here. So we manually set vector size to 100000 instead of the default 10000. We get --&lt;/p&gt; &lt;p&gt; &lt;code&gt; 172.4M rnd  220.8M seq      0 same seg   149.6M same pg  10.99M same par     21 disk    861 spec disk      0B /      0 messages     754 fork&lt;/code&gt; &lt;/p&gt; &lt;p&gt;The throughput goes from 1494 to 1779. We see more hits on the same page, as expected. We do not make this setting a default since it raises the cost for small queries; therefore the vector size must be self-adjusting -- besides, expecting a DBA to tune this is not reasonable. We will just have to correctly tune the self-adjust logic, and we have again clear gains.&lt;/p&gt; &lt;p&gt;Let us now go back to the first run with vector size 10000.&lt;/p&gt; &lt;p&gt;The top of the CPU &lt;code&gt;oprofile&lt;/code&gt; is as follows:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 722309 15.4507 cmpf_iri64n_iri64n 434791 9.3005 cmpf_iri64n_iri64n_anyn_iri64n 294712 6.3041 itc_next_set 273488 5.8501 itc_vec_split_search 203970 4.3631 itc_dive_transit 199687 4.2714 itc_page_rcf_search 181614 3.8848 dc_itc_append_any 173043 3.7015 itc_bm_vec_row_check 146727 3.1386 cmpf_int64n 128224 2.7428 itc_vec_row_check 113515 2.4282 dk_alloc 97296 2.0812 page_wait_access 62523 1.3374 qst_vec_get_int64 59014 1.2623 itc_next_set_parent 53589 1.1463 sslr_qst_get 48003 1.0268 ds_add 46641 0.9977 dk_free_tree 44551 0.9530 kc_var_col 43650 0.9337 page_col_cmp_1 35297 0.7550 cmpf_iri64n_iri64n_anyn_gt_lt 34589 0.7399 dv_compare 25864 0.5532 cmpf_iri64n_anyn_iri64n_iri64n_lte 23088 0.4939 dk_free &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top 10 are all index traversal, with the key compare for two leading IRI keys in the lead, corresponding to a lookup with &lt;code&gt;P&lt;/code&gt; and &lt;code&gt;S&lt;/code&gt; given. The one after that is with all parts given, corresponding to an existence test. The existence tests could probably be converted to &lt;code&gt;HASH JOIN&lt;/code&gt; lookups to good advantage. Aggregation and arithmetic are absent. We should probably add a query like TPC-H Q1 that does nothing but these two. Considering the overall profile, &lt;code&gt;GROUP BY&lt;/code&gt; seems to be around 3%. We should probably put in a query that makes a very large number of groups and could make use of streaming aggregation, i.e., take advantage of a situation where aggregation input comes already grouped by the grouping columns.&lt;/p&gt; &lt;p&gt;A BI use case should offer no problem with including arithmetic, but there are not that many numbers in the BSBM set. Some code sections in the queries with conditional execution and costly tests inside &lt;code&gt;ANDs&lt;/code&gt; and &lt;code&gt;ORs&lt;/code&gt; would be good. TPC-H has such in Q21 and Q19. An &lt;code&gt;OR&lt;/code&gt; with existences where there would be gain from good guesses of a subquery&amp;#39;s selectivity would be appropriate. Also, there should be conditional expressions somewhere with a lot of data, like the &lt;code&gt;CASE-WHEN&lt;/code&gt; in TPC-H Q12.&lt;/p&gt; &lt;p&gt;We can make BSBM-BI more interesting by putting in the above. Also we will have to see where we can profit from &lt;code&gt;HASH JOIN&lt;/code&gt;, both small and large. There should be such places in the workload already so this is a matter of just playing a bit more.&lt;/p&gt; &lt;p&gt;This post amounts to a cheat sheet for the BSBM-BI runs a bit farther down the road. By then we should be operational with the column store and Virtuoso 7 Cluster, though, so not everything is yet on the table.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1fd1d4e0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d5b07d8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1dfe6c48&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x197fce30&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1fbf4210&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1beeb1e0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1d7e1818&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1dfc1730&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1ea819a8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1ec73da0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1fbdce90&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac18f3a688&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0xb4102b8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 14): BSBM-BI Mix &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x15b5b028&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:43:31.630110-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 13): BSBM BI Modifications</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1686</atom:id>
  <atom:published>2011-03-22T22:30:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post we introduce changes to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x234e0ca0&quot;&gt;BSBM&lt;/a&gt; BI queries and metric. These changes are motivated by prevailing benchmark practice and by our experiences in optimizing for the BSBM BI workload.&lt;/p&gt; &lt;p&gt;We will publish results according to the definitions given here and recommend that any interested parties do likewise. The rationales are given in the text.&lt;/p&gt; &lt;h3&gt;Query Mix&lt;/h3&gt; &lt;p&gt;We have removed Q4 from the mix because it is quadratic to the scale factor. The other queries are roughly &lt;code&gt;n * log (n)&lt;/code&gt;. &lt;/p&gt; &lt;h3&gt;Parameter Substitution &lt;/h3&gt; &lt;p&gt;All queries that take a product type as parameter are run in flights of several query invocations where the product type goes from broader to more specific. The initial product type specifies either the root product type or an immediate subtype of this, and the last in the drill-down is a leaf type.&lt;/p&gt; &lt;p&gt;The rationale for this is that the choice of product type may make several orders of magnitude difference in the run time of a query. In order to make consecutive query mixes roughly comparable in execution time, all mixes should have a predictable number of query invocations with product types of each level.&lt;/p&gt; &lt;h3&gt;Query Order &lt;/h3&gt; &lt;p&gt;In the BI mix, when running multiple concurrent clients, each query mix is submitted in a random order. Queries which do drill-downs always have the steps of the drill-down as consecutive in the session, but the query templates are permuted. This is done so as to make less likely that there were two concurrent queries accessing exactly the same &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23be8d28&quot;&gt;data&lt;/a&gt;. In this way, scans cannot be trivially shared between queries -- but there are still opportunities for reuse of results and adapting execution to working set, e.g., starting with what is in memory.&lt;/p&gt; &lt;h3&gt;Metrics &lt;/h3&gt; &lt;p&gt;We use a &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x238c81a0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x28c6bbd8&quot;&gt;H&lt;/a&gt;-like metric. This metric consists of a single-user part and a multi-user part, called respectively &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput.&lt;/i&gt; The &lt;i&gt;Power&lt;/i&gt; metric is a geometric mean of query run-time. The &lt;i&gt;Throughput&lt;/i&gt; is the total run-time divided by the number of queries completed. After taking the mean, the time is converted into queries-per-hour. This time is then multiplied by the scale factor divided by the scale factor for 100 Mt. In other words, we consider the 100 Mt data set as the unit scale.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;Power&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;( scale_factor / 284826 ) * 3600 / ( ( t1 * t1 * ... * tn ) ^ ( 1 / n ) ) &lt;/blockquote&gt; &lt;p&gt;The &lt;i&gt;Throughput&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;( scale_factor / 284826 ) * 3600 / ( ( t1 + t2 + ... + tn ) / n ) &lt;/blockquote&gt; &lt;p&gt;The magic number &lt;b&gt;&lt;code&gt;284826&lt;/code&gt;&lt;/b&gt; is the scale that generates approximately 100 million triples (100 Mt). We consider this scale &amp;quot;one&amp;quot;. The reason for the multiplication is that scores at different scales should get similar numbers; otherwise 10x larger scale would result roughly in 10x lower throughput with the BI queries.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;Composite&lt;/i&gt; metric is the geometric mean of the &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput&lt;/i&gt; metrics. A complete report shows both &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput&lt;/i&gt; metrics, as well as individual query times for all queries. The rationale for using a geometric mean is to give an equal importance to long and short queries. Halving the execution time of either a long query or a short query will have the same effect on the metric. This is good for encouraging research into all aspects of query processing. On the other hand, real-life users are more interested in halving the time of queries that take one hour than of queries that take one second; therefore, the throughput metric considers run times.&lt;/p&gt; &lt;p&gt;Taking the geometric mean of the two metrics gives more weight to the lower of the two than an arithmetic mean, hence we pay more attention to the worse of the two.&lt;/p&gt; &lt;p&gt;Single-user and multi-user metrics are separate because of the relative importance of intra-query parallelization in BI workloads: There may not be large numbers of concurrent users, yet queries are still complex, and it is important to have maximum parallelization. Therefore the metric rewards single-user performance.&lt;/p&gt; &lt;p&gt;In the next post we will look at the use of this metric and the actual content of BSBM BI.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1b02d528&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d65f740&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1a797860&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d3538e0&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1e566f60&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1dedffd8&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1eb11528&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1db46c38&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1c8174e8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dfa9338&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1e6dd7b0&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d154bb0&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 13): BSBM BI Modifications &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f242ae0&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ebf2f98&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-22T17:04:34.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 13): BSBM BI Modifications</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1682</atom:id>
  <atom:published>2011-03-22T22:30:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post we introduce changes to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x23cb6710&quot;&gt;BSBM&lt;/a&gt; BI queries and metric. These changes are motivated by prevailing benchmark practice and by our experiences in optimizing for the BSBM BI workload.&lt;/p&gt; &lt;p&gt;We will publish results according to the definitions given here and recommend that any interested parties do likewise. The rationales are given in the text.&lt;/p&gt; &lt;h3&gt;Query Mix&lt;/h3&gt; &lt;p&gt;We have removed Q4 from the mix because it is quadratic to the scale factor. The other queries are roughly &lt;code&gt;n * log (n)&lt;/code&gt;. &lt;/p&gt; &lt;h3&gt;Parameter Substitution &lt;/h3&gt; &lt;p&gt;All queries that take a product type as parameter are run in flights of several query invocations where the product type goes from broader to more specific. The initial product type specifies either the root product type or an immediate subtype of this, and the last in the drill-down is a leaf type.&lt;/p&gt; &lt;p&gt;The rationale for this is that the choice of product type may make several orders of magnitude difference in the run time of a query. In order to make consecutive query mixes roughly comparable in execution time, all mixes should have a predictable number of query invocations with product types of each level.&lt;/p&gt; &lt;h3&gt;Query Order &lt;/h3&gt; &lt;p&gt;In the BI mix, when running multiple concurrent clients, each query mix is submitted in a random order. Queries which do drill-downs always have the steps of the drill-down as consecutive in the session, but the query templates are permuted. This is done so as to make less likely that there were two concurrent queries accessing exactly the same &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x244a3d88&quot;&gt;data&lt;/a&gt;. In this way, scans cannot be trivially shared between queries -- but there are still opportunities for reuse of results and adapting execution to working set, e.g., starting with what is in memory.&lt;/p&gt; &lt;h3&gt;Metrics &lt;/h3&gt; &lt;p&gt;We use a &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x23880db8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x29201c58&quot;&gt;H&lt;/a&gt;-like metric. This metric consists of a single-user part and a multi-user part, called respectively &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput.&lt;/i&gt; The &lt;i&gt;Power&lt;/i&gt; metric is a geometric mean of query run-time. The &lt;i&gt;Throughput&lt;/i&gt; is the total run-time divided by the number of queries completed. After taking the mean, the time is converted into queries-per-hour. This time is then multiplied by the scale factor divided by the scale factor for 100 Mt. In other words, we consider the 100 Mt data set as the unit scale.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;Power&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;( scale_factor / 284826 ) * 3600 / ( ( t1 * t1 * ... * tn ) ^ ( 1 / n ) ) &lt;/blockquote&gt; &lt;p&gt;The &lt;i&gt;Throughput&lt;/i&gt; is defined as&lt;/p&gt; &lt;blockquote&gt;( scale_factor / 284826 ) * 3600 / ( ( t1 + t2 + ... + tn ) / n ) &lt;/blockquote&gt; &lt;p&gt;The magic number &lt;b&gt;&lt;code&gt;284826&lt;/code&gt;&lt;/b&gt; is the scale that generates approximately 100 million triples (100 Mt). We consider this scale &amp;quot;one&amp;quot;. The reason for the multiplication is that scores at different scales should get similar numbers; otherwise 10x larger scale would result roughly in 10x lower throughput with the BI queries.&lt;/p&gt; &lt;p&gt;The &lt;i&gt;Composite&lt;/i&gt; metric is the geometric mean of the &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput&lt;/i&gt; metrics. A complete report shows both &lt;i&gt;Power&lt;/i&gt; and &lt;i&gt;Throughput&lt;/i&gt; metrics, as well as individual query times for all queries. The rationale for using a geometric mean is to give an equal importance to long and short queries. Halving the execution time of either a long query or a short query will have the same effect on the metric. This is good for encouraging research into all aspects of query processing. On the other hand, real-life users are more interested in halving the time of queries that take one hour than of queries that take one second; therefore, the throughput metric considers run times.&lt;/p&gt; &lt;p&gt;Taking the geometric mean of the two metrics gives more weight to the lower of the two than an arithmetic mean, hence we pay more attention to the worse of the two.&lt;/p&gt; &lt;p&gt;Single-user and multi-user metrics are separate because of the relative importance of intra-query parallelization in BI workloads: There may not be large numbers of concurrent users, yet queries are still complex, and it is important to have maximum parallelization. Therefore the metric rewards single-user performance.&lt;/p&gt; &lt;p&gt;In the next post we will look at the use of this metric and the actual content of BSBM BI.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1b02d528&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d65f740&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1a797860&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d3538e0&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1e566f60&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1dedffd8&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1eb11528&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1db46c38&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1c8174e8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dfa9338&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1e6dd7b0&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac14880528&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 13): BSBM BI Modifications &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aac01988188&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aac147d9c28&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:43:55.147818-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 12): Our Own BSBM Results Report</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-22#1685</atom:id>
  <atom:published>2011-03-22T22:29:56Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;This is a placeholder; it will be replaced with a complete report in the very near future.&lt;/i&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2011-03-22T17:04:29.000008-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 12): Our Own BSBM Results Report</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-22#1681</atom:id>
  <atom:published>2011-03-22T22:29:56Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;i&gt;This is a placeholder; it will be replaced with a complete report in the very near future.&lt;/i&gt; &lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x2aac14130068&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x2aac145841f8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x2aac18f850a8&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0xa55d678&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x2aac182567b8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x18b86248&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x180538c8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x14a8d558&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x103045f8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x15504f48&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x19b87638&quot;&gt;Benchmarks, Redux (part 11): The Substance of Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;i&gt; (this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aabf707c0b8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x17d856f8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x1b5dc328&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:44:46.103020-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-10#1680</atom:id>
  <atom:published>2011-03-10T23:30:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;Let us talk about what ought to be benchmarked in the context of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2a84d3c0&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A point that often gets brought up by RDF-ers when talking about benchmarks is that there already exist systems which perform very well at &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2a9758e8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x2a8fa2a0&quot;&gt;H&lt;/a&gt; and similar workloads, and therefore there is no need for RDF to go there. It is, as it were, somebody else&amp;#39;s problem; besides, it is a solved one.&lt;/p&gt; &lt;p&gt;On the other hand, being able to express what is generally expected of a query language might not be a core competence or a competitive edge, but it certainly is a checklist item.&lt;/p&gt; &lt;p&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x29c75a30&quot;&gt;BSBM&lt;/a&gt; seems to be adopted as a de facto RDF benchmark, as there indeed is almost nothing else. But we should not lose sight of the fact that this is in fact a relational &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2a0565b8&quot;&gt;schema&lt;/a&gt; and workload that has just been straightforwardly transformed to RDF. BSBM was made, after all, in part for measuring RDB to RDF mapping. Thus BSBM is no more RDF-ish than a trivially RDF-ized TPC-H would be. TPC-H is however a bit more difficult if also a better thought out benchmark than the BSBM BI Mix proposal. But I do not expect an RDF audience to have any enthusiasm for this as this is indeed a very tough race by now, and besides one in which RDB and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x29c44d50&quot;&gt;SQL&lt;/a&gt; will keep some advantage. However, using this as a validation test is meaningful, as there exists a validation dataset and queries that we already have RDF-ized. We could publish these and call this &amp;quot;RDF-H&amp;quot;. &lt;/p&gt; &lt;p&gt;In the following I will outline what would constitute an RDF-friendly, scientifically interesting benchmark. The points are in part based on discussions with &lt;a class=&quot;auto-href&quot; href=&quot;http://nl.linkedin.com/in/peterboncz&quot; id=&quot;link-id0x2ac282f0&quot;&gt;Peter Boncz&lt;/a&gt; of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x2a1c9e10&quot;&gt;CWI&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/wiki/Social_Network_Intelligence_BenchMark&quot; id=&quot;link-id0x29e7d3d8&quot;&gt;Social Network Intelligence Benchmark&lt;/a&gt; (&lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/wiki/Social_Network_Intelligence_BenchMark&quot; id=&quot;link-id0x2a70e3c0&quot;&gt;SNIB&lt;/a&gt;) takes the social web Facebook-style schema Ivan Mikhailov and I made last year under the name of Botnet BM. In &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2a9a70f0&quot;&gt;LOD2&lt;/a&gt;, CWI is presently working on this.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2ad04408&quot;&gt;data&lt;/a&gt; includes &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x29d5eeb0&quot;&gt;DBpedia&lt;/a&gt; as a base component used for providing conversation topics, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x2ac97c40&quot;&gt;information&lt;/a&gt; about geographical locales of simulated users, etc. DBpedia is not very large, around 200M-300M triples, but it is diverse enough.&lt;/p&gt; &lt;p&gt;The data will have correlations, e.g., people who talk about sports tend to know other people who talk about the same sport, and they are more likely to know people from their geographical area than from elsewhere. &lt;/p&gt; &lt;p&gt;The bulk of the data consists of a rich history of interactions including messages to individuals and groups, linking to people, dropping links, joining and leaving groups, and so forth. The messages are tagged using real-world concepts from DBpedia, and there is correlation between tagging and textual content since both are generated from Dbpedia articles. Since there is such correlation, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x2ac359c0&quot;&gt;NLP&lt;/a&gt; techniques like &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x2a1c8ed0&quot;&gt;entity&lt;/a&gt; and relationship extraction can be used with the data even though this is not the primary thrust of SNIB.&lt;/p&gt; &lt;p&gt;There is variation in frequency of online interaction, and this interaction consist of sessions. For example, one could analyze user behavior per time of day for online ad placement.&lt;/p&gt; &lt;p&gt;The data probably should include propagating memes, fashions, and trends that travel on the social network. With this, one could query about their origin and speed of propagation.&lt;/p&gt; &lt;p&gt;There should probably be cases of duplicate identities in the data, i.e., one real person using many online accounts to push an agenda. Resolving duplicate identities makes for nice queries.&lt;/p&gt; &lt;p&gt;Ragged data with half-filled profiles and misspelled identifiers like person and place names are a natural part of the social web use case. The data generator should take this into account.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Distribution of popularity and activity should follow a power-law-like pattern; actual measures of popularity can be sampled from existing social networks even though large quantities of data cannot easily be extracted.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The dataset should be predictably scalable. For the workload considered, the relative importance of the queries or other measured tasks should not change dramatically with the scale.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;For example some queries are logarithmic to data size (e.g., find connections to a person), some are linear (e.g., find average online time of sports fans on Sundays), and some are quadratic or worse (e.g., find two extremists of the same ideology that are otherwise unrelated). Making a single metric from such parts may not be meaningful. Therefore, SNIB might be structured into different workloads.&lt;/p&gt; &lt;p&gt;The first would be an online mix with typically short lookups and updates, around &lt;code&gt;O ( log ( n ) )&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;The Business Intelligence Mix would be composed of queries around &lt;code&gt;OO ( n log ( n ) )&lt;/code&gt;. Even so, with real data, choice of parameters will provide dramatic changes in query run-time. Therefore a run should be specified to have a predictable distribution of &amp;quot;hard&amp;quot; and &amp;quot;easy&amp;quot; parameter choices. In the BSBM BI mix modification, I did this by defining some to be drill downs from a more general to a more specific level of a hierarchy. This could be done here too in some cases; other cases would have to be defined with buckets of values. &lt;/p&gt; &lt;p&gt;Both the real world and LOD2 are largely concerned with data integration. The SNIB workload can have aspects of this, for example, in resolving duplicate identities. These operations are more complex than typical database queries, as the attributes used for joining might not even match in the initial data.&lt;/p&gt; &lt;p&gt;One characteristic of these is the production of sometimes large intermediate results that need to be materialized. Doing these operations in practice requires procedural control. Further, running algorithms like network analytics (e.g., Page rank, centrality, etc.) involves aggregation of intermediate results that is not very well expressible in a query language. Some basic graph operations like shortest path are expressible but then are not in unextended &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x29d26588&quot;&gt;SPARQL&lt;/a&gt; 1.1; as these would for example involve returning paths, which are explicitly excluded from the spec.&lt;/p&gt; &lt;p&gt;These are however the areas where we need to go for a benchmark that is more than a repackaging of a relational BI workload.&lt;/p&gt; &lt;p&gt;We find that such a workload will have procedural sections either in application code or stored procedures. Map-reduce is sometimes used for scaling these. As one would expect, many cluster databases have their own version of these control structures. Therefore some of the SNIB workload could even be implemented as map-reduce jobs alongside parallel database implementations. We might here touch base with the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x29b69640&quot;&gt;LarKC&lt;/a&gt; map-reduce work to see if it could be applied to SNIB workloads. &lt;/p&gt; &lt;p&gt;We see a three-level structure emerging. There is an &lt;i&gt;Online&lt;/i&gt; mix which is a bit like the BSBM &lt;i&gt;Explore&lt;/i&gt; mix, and an &lt;i&gt;Analytics&lt;/i&gt; mix which is on the same order of complexity as TPC-H. These may have a more-or-less fixed query formulation and test driver. Beyond these, yet working on the same data, we have a set of &lt;i&gt;Predefined Tasks&lt;/i&gt; which the test sponsor may implement in a manner of their choice.&lt;/p&gt; &lt;p&gt;We would finally get to the &amp;quot;raging conflict&amp;quot; between the &amp;quot;declarativists&amp;quot; and the &amp;quot;map reductionists.&amp;quot; Last year&amp;#39;s VLDB had a lot of map-reduce papers. I know of comparisons between &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x2a8c4510&quot;&gt;Vertica&lt;/a&gt; and map reduce for doing a fairly simple SQL query on a lot of data, but here we would be talking about much more complex jobs on more interesting (i.e., less uniform) data.&lt;/p&gt; &lt;p&gt;We might even interest some of the cluster &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2995aaa8&quot;&gt;RDBMS&lt;/a&gt; players (&lt;a class=&quot;auto-href&quot; href=&quot;http://www.teradata.com/&quot; id=&quot;link-id0x29c9af10&quot;&gt;Teradata&lt;/a&gt;, Vertica, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x29c9af38&quot;&gt;Greenplum&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/Oracle_Exadata&quot; id=&quot;link-id0x29d48b78&quot;&gt;Oracle Exadata&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://www.paraccel.com/&quot; id=&quot;link-id0x29d48ba0&quot;&gt;ParAccel&lt;/a&gt;, and/or &lt;a class=&quot;auto-href&quot; href=&quot;http://www.asterdata.com/&quot; id=&quot;link-id0x29bf8fb0&quot;&gt;Aster Data&lt;/a&gt;, to name a few) in running this workload using their map-reduce analogs.&lt;/p&gt; &lt;p&gt;We see that as we get to topics beyond relational BI, we do not find ourselves in an RDF-only world but very much at a crossroads of many technologies, e.g., map-reduce and its database analogs, various custom built databases, graph libraries, data integration and cleaning tools, and so forth.&lt;/p&gt; &lt;p&gt;There is not, nor ought there to be, a sheltered, RDF-only enclave. RDF will have to justify itself in a world of alternatives.&lt;/p&gt; &lt;p&gt;This must be reflected in our benchmark development, so relational BI is not irrelevant; in fact, it is what everybody does. RDF cannot be a total failure at this, even if this were not RDF&amp;#39;s claim to fame. The claim to fame comes after we pass this stage, which is what we intend to explore in SNIB.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1c9f7ab8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1dd17b28&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1eb20620&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1f8a5ae8&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ac14a08&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1d1f8d58&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ea83308&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b548028&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1c3d9c58&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1f5e6978&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1c082a28&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ec73578&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1eb25d48&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1b261958&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T19:37:28-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-10#1678</atom:id>
  <atom:published>2011-03-10T23:30:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;Let us talk about what ought to be benchmarked in the context of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x29979188&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A point that often gets brought up by RDF-ers when talking about benchmarks is that there already exist systems which perform very well at &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2a7082d0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x29997988&quot;&gt;H&lt;/a&gt; and similar workloads, and therefore there is no need for RDF to go there. It is, as it were, somebody else&amp;#39;s problem; besides, it is a solved one.&lt;/p&gt; &lt;p&gt;On the other hand, being able to express what is generally expected of a query language might not be a core competence or a competitive edge, but it certainly is a checklist item.&lt;/p&gt; &lt;p&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2b164128&quot;&gt;BSBM&lt;/a&gt; seems to be adopted as a de facto RDF benchmark, as there indeed is almost nothing else. But we should not lose sight of the fact that this is in fact a relational &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2a84d3c0&quot;&gt;schema&lt;/a&gt; and workload that has just been straightforwardly transformed to RDF. BSBM was made, after all, in part for measuring RDB to RDF mapping. Thus BSBM is no more RDF-ish than a trivially RDF-ized TPC-H would be. TPC-H is however a bit more difficult if also a better thought out benchmark than the BSBM BI Mix proposal. But I do not expect an RDF audience to have any enthusiasm for this as this is indeed a very tough race by now, and besides one in which RDB and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aba65b0&quot;&gt;SQL&lt;/a&gt; will keep some advantage. However, using this as a validation test is meaningful, as there exists a validation dataset and queries that we already have RDF-ized. We could publish these and call this &amp;quot;RDF-H&amp;quot;. &lt;/p&gt; &lt;p&gt;In the following I will outline what would constitute an RDF-friendly, scientifically interesting benchmark. The points are in part based on discussions with &lt;a class=&quot;auto-href&quot; href=&quot;http://nl.linkedin.com/in/peterboncz&quot; id=&quot;link-id0x29c81a40&quot;&gt;Peter Boncz&lt;/a&gt; of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x2a0c8190&quot;&gt;CWI&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/wiki/Social_Network_Intelligence_BenchMark&quot; id=&quot;link-id0x29ca15c0&quot;&gt;Social Network Intelligence Benchmark&lt;/a&gt; (&lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/wiki/Social_Network_Intelligence_BenchMark&quot; id=&quot;link-id0x2990a6b8&quot;&gt;SNIB&lt;/a&gt;) takes the social web Facebook-style schema Ivan Mikhailov and I made last year under the name of Botnet BM. In &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2a2e5338&quot;&gt;LOD2&lt;/a&gt;, CWI is presently working on this.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2a650cc0&quot;&gt;data&lt;/a&gt; includes &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x2a2e5808&quot;&gt;DBpedia&lt;/a&gt; as a base component used for providing conversation topics, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x29a19570&quot;&gt;information&lt;/a&gt; about geographical locales of simulated users, etc. DBpedia is not very large, around 200M-300M triples, but it is diverse enough.&lt;/p&gt; &lt;p&gt;The data will have correlations, e.g., people who talk about sports tend to know other people who talk about the same sport, and they are more likely to know people from their geographical area than from elsewhere. &lt;/p&gt; &lt;p&gt;The bulk of the data consists of a rich history of interactions including messages to individuals and groups, linking to people, dropping links, joining and leaving groups, and so forth. The messages are tagged using real-world concepts from DBpedia, and there is correlation between tagging and textual content since both are generated from Dbpedia articles. Since there is such correlation, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x29995600&quot;&gt;NLP&lt;/a&gt; techniques like &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x29910c58&quot;&gt;entity&lt;/a&gt; and relationship extraction can be used with the data even though this is not the primary thrust of SNIB.&lt;/p&gt; &lt;p&gt;There is variation in frequency of online interaction, and this interaction consist of sessions. For example, one could analyze user behavior per time of day for online ad placement.&lt;/p&gt; &lt;p&gt;The data probably should include propagating memes, fashions, and trends that travel on the social network. With this, one could query about their origin and speed of propagation.&lt;/p&gt; &lt;p&gt;There should probably be cases of duplicate identities in the data, i.e., one real person using many online accounts to push an agenda. Resolving duplicate identities makes for nice queries.&lt;/p&gt; &lt;p&gt;Ragged data with half-filled profiles and misspelled identifiers like person and place names are a natural part of the social web use case. The data generator should take this into account.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Distribution of popularity and activity should follow a power-law-like pattern; actual measures of popularity can be sampled from existing social networks even though large quantities of data cannot easily be extracted.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The dataset should be predictably scalable. For the workload considered, the relative importance of the queries or other measured tasks should not change dramatically with the scale.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;For example some queries are logarithmic to data size (e.g., find connections to a person), some are linear (e.g., find average online time of sports fans on Sundays), and some are quadratic or worse (e.g., find two extremists of the same ideology that are otherwise unrelated). Making a single metric from such parts may not be meaningful. Therefore, SNIB might be structured into different workloads.&lt;/p&gt; &lt;p&gt;The first would be an online mix with typically short lookups and updates, around &lt;code&gt;O ( log ( n ) )&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;The Business Intelligence Mix would be composed of queries around &lt;code&gt;OO ( n log ( n ) )&lt;/code&gt;. Even so, with real data, choice of parameters will provide dramatic changes in query run-time. Therefore a run should be specified to have a predictable distribution of &amp;quot;hard&amp;quot; and &amp;quot;easy&amp;quot; parameter choices. In the BSBM BI mix modification, I did this by defining some to be drill downs from a more general to a more specific level of a hierarchy. This could be done here too in some cases; other cases would have to be defined with buckets of values. &lt;/p&gt; &lt;p&gt;Both the real world and LOD2 are largely concerned with data integration. The SNIB workload can have aspects of this, for example, in resolving duplicate identities. These operations are more complex than typical database queries, as the attributes used for joining might not even match in the initial data.&lt;/p&gt; &lt;p&gt;One characteristic of these is the production of sometimes large intermediate results that need to be materialized. Doing these operations in practice requires procedural control. Further, running algorithms like network analytics (e.g., Page rank, centrality, etc.) involves aggregation of intermediate results that is not very well expressible in a query language. Some basic graph operations like shortest path are expressible but then are not in unextended &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2a628e60&quot;&gt;SPARQL&lt;/a&gt; 1.1; as these would for example involve returning paths, which are explicitly excluded from the spec.&lt;/p&gt; &lt;p&gt;These are however the areas where we need to go for a benchmark that is more than a repackaging of a relational BI workload.&lt;/p&gt; &lt;p&gt;We find that such a workload will have procedural sections either in application code or stored procedures. Map-reduce is sometimes used for scaling these. As one would expect, many cluster databases have their own version of these control structures. Therefore some of the SNIB workload could even be implemented as map-reduce jobs alongside parallel database implementations. We might here touch base with the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x29ab4860&quot;&gt;LarKC&lt;/a&gt; map-reduce work to see if it could be applied to SNIB workloads. &lt;/p&gt; &lt;p&gt;We see a three-level structure emerging. There is an &lt;i&gt;Online&lt;/i&gt; mix which is a bit like the BSBM &lt;i&gt;Explore&lt;/i&gt; mix, and an &lt;i&gt;Analytics&lt;/i&gt; mix which is on the same order of complexity as TPC-H. These may have a more-or-less fixed query formulation and test driver. Beyond these, yet working on the same data, we have a set of &lt;i&gt;Predefined Tasks&lt;/i&gt; which the test sponsor may implement in a manner of their choice.&lt;/p&gt; &lt;p&gt;We would finally get to the &amp;quot;raging conflict&amp;quot; between the &amp;quot;declarativists&amp;quot; and the &amp;quot;map reductionists.&amp;quot; Last year&amp;#39;s VLDB had a lot of map-reduce papers. I know of comparisons between &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x29bd5828&quot;&gt;Vertica&lt;/a&gt; and map reduce for doing a fairly simple SQL query on a lot of data, but here we would be talking about much more complex jobs on more interesting (i.e., less uniform) data.&lt;/p&gt; &lt;p&gt;We might even interest some of the cluster &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x29d49c18&quot;&gt;RDBMS&lt;/a&gt; players (&lt;a class=&quot;auto-href&quot; href=&quot;http://www.teradata.com/&quot; id=&quot;link-id0x29d49c40&quot;&gt;Teradata&lt;/a&gt;, Vertica, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x2bba2248&quot;&gt;Greenplum&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/Oracle_Exadata&quot; id=&quot;link-id0x2bba2270&quot;&gt;Oracle Exadata&lt;/a&gt;, &lt;a class=&quot;auto-href&quot; href=&quot;http://www.paraccel.com/&quot; id=&quot;link-id0x2ac756d0&quot;&gt;ParAccel&lt;/a&gt;, and/or &lt;a class=&quot;auto-href&quot; href=&quot;http://www.asterdata.com/&quot; id=&quot;link-id0x2ac756f8&quot;&gt;Aster Data&lt;/a&gt;, to name a few) in running this workload using their map-reduce analogs.&lt;/p&gt; &lt;p&gt;We see that as we get to topics beyond relational BI, we do not find ourselves in an RDF-only world but very much at a crossroads of many technologies, e.g., map-reduce and its database analogs, various custom built databases, graph libraries, data integration and cleaning tools, and so forth.&lt;/p&gt; &lt;p&gt;There is not, nor ought there to be, a sheltered, RDF-only enclave. RDF will have to justify itself in a world of alternatives.&lt;/p&gt; &lt;p&gt;This must be reflected in our benchmark development, so relational BI is not irrelevant; in fact, it is what everybody does. RDF cannot be a total failure at this, even if this were not RDF&amp;#39;s claim to fame. The claim to fame comes after we pass this stage, which is what we intend to explore in SNIB.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1c9f7ab8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1dd17b28&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1eb20620&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1f8a5ae8&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ac14a08&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1d1f8d58&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ea83308&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b548028&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1c3d9c58&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1f5e6978&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x1c118338&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x1b5e6bf8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x1a045c38&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x612d978&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:05.266280-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 10): LOD2 and the Benchmark Process</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-10#1679</atom:id>
  <atom:published>2011-03-10T23:29:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;I have in the previous posts generally argued for and demonstrated the usefulness of benchmarks.&lt;/p&gt; &lt;p&gt;Here I will talk about how this could be organized in a way that is tractable, and takes vendor and end user interests into account. These are my views on the subject and do not represent a &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2acb0760&quot;&gt;LOD2&lt;/a&gt; members consensus, but have been discussed in the consortium. &lt;/p&gt; &lt;p&gt;My colleague Ivan Mikhailov once proposed that the only way to get benchmarks run right is to package them as a single script that does everything, like instant noodles -- just add water! But even instant noodles can be abused: Cook too long, add too much water, maybe forget to light the stove, and complain that the result is unsatisfyingly hard and brittle, lacking the suppleness one has grown to expect from this delicacy. No, the answer lies at the other end of the culinary spectrum, in gourmet cooking. Let the best cooks show what they can do, and let them work at it; let those who in fact have capacity and motivation for creating &lt;i&gt;le chef d&amp;#39;oeuvre culinaire&lt;/i&gt; (&amp;quot;the culinary masterpiece&amp;quot;) create it. Even so, there are many value points along the dimensions of preparation time, cost, and esthetic layout, not to forget taste and nutritional values. Indeed, an intimate &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x2aca6a30&quot;&gt;knowledge&lt;/a&gt; &lt;i&gt;de la vie secrete du canard&lt;/i&gt; (&amp;quot;the secret life of duck&amp;quot;) is required in order to liberate the aroma that it might take flight and soar. In the previous, I have shed some light on how we prepare &lt;i&gt;le canard&lt;/i&gt;, and if &lt;i&gt;le canard&lt;/i&gt; be such then &lt;i&gt;la dinde&lt;/i&gt; (turkey) might in some ways be analogous; who is to say?&lt;/p&gt; &lt;p&gt;In other words, as a vendor, we want to have complete control over the benchmarking process, and have it take place in our environment at a time of our choice. In exchange for this, we are ready to document and observe possibly complicated rules, document how the runs are made, and let others monitor and repeat them on the equipment on which the results are obtained. This is the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2b847818&quot;&gt;TPC&lt;/a&gt; (Transaction Processing Performance Council) model.&lt;/p&gt; &lt;p&gt;Another culture of doing benchmarks is the periodic challenge model used in TREC, the &lt;a class=&quot;auto-href&quot; href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x2ac3a6f8&quot;&gt;Billion Triples Challenge&lt;/a&gt;, the Semantic Search Challenge and others. In this model, vendors prepare the benchmark submission and agree to joint publication.&lt;/p&gt; &lt;p&gt;A third party performing benchmarks by itself is uncommon in databases. Licenses even often explicitly prohibit this, for understandable reasons.&lt;/p&gt; &lt;p&gt;The LOD2 project has an outreach activity called Publink where we offer to help owners of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2aea5930&quot;&gt;data&lt;/a&gt; to publish it as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2a790128&quot;&gt;Linked Data&lt;/a&gt;. Similarly, since FP 7s are supposed to offer a visible service to their communities, I proposed that LOD2 offer to serve a role in disseminating and auditing &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x29babb00&quot;&gt;RDF&lt;/a&gt; store benchmarks.&lt;/p&gt; &lt;p&gt;One representative of an RDF store vendor I talked to, in relation to setting up a benchmark configuration of their product, told me that we could do this and that they would give some advice but that such an exercise was by its nature fundamentally flawed and could not possibly produce worthwhile results. The reason for this was that OpenLink engineers could not possibly learn enough about the other products nor unlearn enough of their own to make this a meaningful comparison.&lt;/p&gt; &lt;p&gt;Isn&amp;#39;t this the very truth? Let the chefs mix their own spices.&lt;/p&gt; &lt;p&gt;This does not mean that there would not be comparability of results. If the benchmarks and processes are well defined, documented, and checked by a third party, these can be considered legitimate and not just one-off best-case results without further import.&lt;/p&gt; &lt;p&gt;In order to stretch the envelope, which is very much a LOD2 goal, this benchmarking should be done on a variety of equipment -- whatever works best at the scale in question. Increasing the scale remains a stated objective. LOD2 even promised to run things with a trillion triples in another 3 years. &lt;/p&gt; &lt;p&gt;Imagine that the unimpeachably impartial Berliners made house calls. Would this debase Justice to be a servant of mere show-off? Or would this on the contrary combine strict Justice with edifying Charity? Who indeed is in greater need of the light of objective evaluation than the vendor whose very nature makes a being of bias and prejudice?&lt;/p&gt; &lt;p&gt;Even better, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x2a21d108&quot;&gt;CWI&lt;/a&gt;, with its &lt;a href=&quot;http://monetdb.cwi.nl/Development/Research/Articles/&quot; id=&quot;link-id0x1d6479d0&quot;&gt;stellar database pedigree&lt;/a&gt;, agreed in principle to audit RDF benchmarks in LOD2. &lt;/p&gt; &lt;p&gt;In this way one could get a stamp of approval for one&amp;#39;s results regardless of when they were produced, and be free of the arbitrary schedule of third party benchmarking runs. On the relational side this is a process of some cost and complexity, but since the RDF side is still young and more on mutually friendly terms, the process can be somewhat lighter here. I did promise to draft some extra descriptions of process and result disclosure so that we could see how this goes.&lt;/p&gt; &lt;p&gt;We could even do this unilaterally -- just publish &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2a0d73d8&quot;&gt;Virtuoso&lt;/a&gt; results according to a predefined reporting and verification format. If others wished to publish by the same rules, LOD2 could use some of the benchmarking funds for auditing the proceedings. This could all take place over the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x2a6b44a0&quot;&gt;net&lt;/a&gt;, so we are not talking about any huge cost or prohibitive amount of trouble. It would be in the FP7 spirit that LOD2 provide this service for free, naturally within reason.&lt;/p&gt; &lt;p&gt;Then there is the matter of the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2a1722a8&quot;&gt;BSBM&lt;/a&gt; Business Intelligence (BI) mix. At present, it seems everybody has chosen to defer the matter to another round of BSBM runs in the summer. This seems to fit the pattern of a public challenge with a few months given for contenders to prepare their submissions. Here we certainly should look at bigger scales and more diverse hardware than in the Berlin runs published this time around. The BI workload is in fact fairly cluster friendly, with big joins and aggregations that parallelize well. There it would definitely make sense to reserve an actual cluster, and have all contenders set up their gear on it. If all have access to the run environment and to monitoring tools, we can be reasonably sure that things will be done in a transparent manner. &lt;/p&gt; &lt;p&gt;(I will talk about the BI mix in more detail in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1dfcc038&quot;&gt;part 13&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1edaa388&quot;&gt;part 14&lt;/a&gt; of this series.)&lt;/p&gt; &lt;p&gt;Once the BI mix has settled and there are a few interoperable implementations, likely in the summer, we could pass from the challenge model to a situation where vendors may publish results as they become available, with LOD2 offering its services for audit. &lt;/p&gt; &lt;p&gt;Of course, this could be done even before then, but the content of the mix might not be settled. We likely need to check it on a few implementations first.&lt;/p&gt; &lt;p&gt;For equipment, people can use their own, or LOD2 partners might on a case-by-case basis make some equipment available for running on the same hardware on which say the Virtuoso results were obtained. For example, FU Berlin could give people a login to get their recently published results fixed. Now this might or might not happen, so I will not hold my breath waiting for this but instead close with a proposal.&lt;/p&gt; &lt;p&gt;As a unilateral diplomatic overture I put forth the following: If other vendors are interested in 1:1 comparison of their results with our publications, we can offer them a login to the same equipment. They can set up and tune their systems, and perform the runs. We will just watch. As an extra quid pro quo, they can try Virtuoso as configured for the results we have published, with the same data. Like this, both parties get to see the others&amp;#39; technology with proper tuning and installation. What, if anything, is reported about this activity is up to the owner of the technology being tested. We will publish a set of benchmark rules that can serve as a guideline for mutually comparable reporting, but we cannot force anybody to use these. This all will function as a catalyst for technological advance, all to the ultimate benefit of the end user. If you wish to take advantage of this offer, you may contact &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=Collaborative RDF Benchmark&quot; id=&quot;link-id0x1c071100&quot;&gt;Hugh Williams at OpenLink Software, and we will see how this can be arranged in practice.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The next post will talk about the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x19933fd8&quot;&gt;actual content of benchmarks&lt;/a&gt;. The milestone after this will be when we publish the measurement and reporting protocols.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1c554800&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1ec159e8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1dd5eb10&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x18f05940&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ed5ef10&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1e9cb130&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1dfa79d8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1eb6f478&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1de5a918&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 10): LOD2 and the Benchmark Process &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1dae9060&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f45fa10&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f49d2b8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e68e4c8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e353858&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T19:37:14.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 10): LOD2 and the Benchmark Process</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-10#1677</atom:id>
  <atom:published>2011-03-10T23:29:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;I have in the previous posts generally argued for and demonstrated the usefulness of benchmarks.&lt;/p&gt; &lt;p&gt;Here I will talk about how this could be organized in a way that is tractable, and takes vendor and end user interests into account. These are my views on the subject and do not represent a &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x1d4999d0&quot;&gt;LOD2&lt;/a&gt; members consensus, but have been discussed in the consortium. &lt;/p&gt; &lt;p&gt;My colleague Ivan Mikhailov once proposed that the only way to get benchmarks run right is to package them as a single script that does everything, like instant noodles -- just add water! But even instant noodles can be abused: Cook too long, add too much water, maybe forget to light the stove, and complain that the result is unsatisfyingly hard and brittle, lacking the suppleness one has grown to expect from this delicacy. No, the answer lies at the other end of the culinary spectrum, in gourmet cooking. Let the best cooks show what they can do, and let them work at it; let those who in fact have capacity and motivation for creating &lt;i&gt;le chef d&amp;#39;oeuvre culinaire&lt;/i&gt; (&amp;quot;the culinary masterpiece&amp;quot;) create it. Even so, there are many value points along the dimensions of preparation time, cost, and esthetic layout, not to forget taste and nutritional values. Indeed, an intimate &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1a63a168&quot;&gt;knowledge&lt;/a&gt; &lt;i&gt;de la vie secrete du canard&lt;/i&gt; (&amp;quot;the secret life of duck&amp;quot;) is required in order to liberate the aroma that it might take flight and soar. In the previous, I have shed some light on how we prepare &lt;i&gt;le canard&lt;/i&gt;, and if &lt;i&gt;le canard&lt;/i&gt; be such then &lt;i&gt;la dinde&lt;/i&gt; (turkey) might in some ways be analogous; who is to say?&lt;/p&gt; &lt;p&gt;In other words, as a vendor, we want to have complete control over the benchmarking process, and have it take place in our environment at a time of our choice. In exchange for this, we are ready to document and observe possibly complicated rules, document how the runs are made, and let others monitor and repeat them on the equipment on which the results are obtained. This is the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1d676280&quot;&gt;TPC&lt;/a&gt; (Transaction Processing Performance Council) model.&lt;/p&gt; &lt;p&gt;Another culture of doing benchmarks is the periodic challenge model used in TREC, the &lt;a class=&quot;auto-href&quot; href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1c222020&quot;&gt;Billion Triples Challenge&lt;/a&gt;, the Semantic Search Challenge and others. In this model, vendors prepare the benchmark submission and agree to joint publication.&lt;/p&gt; &lt;p&gt;A third party performing benchmarks by itself is uncommon in databases. Licenses even often explicitly prohibit this, for understandable reasons.&lt;/p&gt; &lt;p&gt;The LOD2 project has an outreach activity called Publink where we offer to help owners of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x112c3dc0&quot;&gt;data&lt;/a&gt; to publish it as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1d1b7078&quot;&gt;Linked Data&lt;/a&gt;. Similarly, since FP 7s are supposed to offer a visible service to their communities, I proposed that LOD2 offer to serve a role in disseminating and auditing &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x11c0ff08&quot;&gt;RDF&lt;/a&gt; store benchmarks.&lt;/p&gt; &lt;p&gt;One representative of an RDF store vendor I talked to, in relation to setting up a benchmark configuration of their product, told me that we could do this and that they would give some advice but that such an exercise was by its nature fundamentally flawed and could not possibly produce worthwhile results. The reason for this was that OpenLink engineers could not possibly learn enough about the other products nor unlearn enough of their own to make this a meaningful comparison.&lt;/p&gt; &lt;p&gt;Isn&amp;#39;t this the very truth? Let the chefs mix their own spices.&lt;/p&gt; &lt;p&gt;This does not mean that there would not be comparability of results. If the benchmarks and processes are well defined, documented, and checked by a third party, these can be considered legitimate and not just one-off best-case results without further import.&lt;/p&gt; &lt;p&gt;In order to stretch the envelope, which is very much a LOD2 goal, this benchmarking should be done on a variety of equipment -- whatever works best at the scale in question. Increasing the scale remains a stated objective. LOD2 even promised to run things with a trillion triples in another 3 years. &lt;/p&gt; &lt;p&gt;Imagine that the unimpeachably impartial Berliners made house calls. Would this debase Justice to be a servant of mere show-off? Or would this on the contrary combine strict Justice with edifying Charity? Who indeed is in greater need of the light of objective evaluation than the vendor whose very nature makes a being of bias and prejudice?&lt;/p&gt; &lt;p&gt;Even better, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1c369958&quot;&gt;CWI&lt;/a&gt;, with its &lt;a href=&quot;http://monetdb.cwi.nl/Development/Research/Articles/&quot; id=&quot;link-id0x1d6479d0&quot;&gt;stellar database pedigree&lt;/a&gt;, agreed in principle to audit RDF benchmarks in LOD2. &lt;/p&gt; &lt;p&gt;In this way one could get a stamp of approval for one&amp;#39;s results regardless of when they were produced, and be free of the arbitrary schedule of third party benchmarking runs. On the relational side this is a process of some cost and complexity, but since the RDF side is still young and more on mutually friendly terms, the process can be somewhat lighter here. I did promise to draft some extra descriptions of process and result disclosure so that we could see how this goes.&lt;/p&gt; &lt;p&gt;We could even do this unilaterally -- just publish &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e0c0690&quot;&gt;Virtuoso&lt;/a&gt; results according to a predefined reporting and verification format. If others wished to publish by the same rules, LOD2 could use some of the benchmarking funds for auditing the proceedings. This could all take place over the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x1ed4b9d8&quot;&gt;net&lt;/a&gt;, so we are not talking about any huge cost or prohibitive amount of trouble. It would be in the FP7 spirit that LOD2 provide this service for free, naturally within reason.&lt;/p&gt; &lt;p&gt;Then there is the matter of the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1ea75360&quot;&gt;BSBM&lt;/a&gt; Business Intelligence (BI) mix. At present, it seems everybody has chosen to defer the matter to another round of BSBM runs in the summer. This seems to fit the pattern of a public challenge with a few months given for contenders to prepare their submissions. Here we certainly should look at bigger scales and more diverse hardware than in the Berlin runs published this time around. The BI workload is in fact fairly cluster friendly, with big joins and aggregations that parallelize well. There it would definitely make sense to reserve an actual cluster, and have all contenders set up their gear on it. If all have access to the run environment and to monitoring tools, we can be reasonably sure that things will be done in a transparent manner. &lt;/p&gt; &lt;p&gt;(I will talk about the BI mix in more detail in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1dfcc038&quot;&gt;part 13&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1edaa388&quot;&gt;part 14&lt;/a&gt; of this series.)&lt;/p&gt; &lt;p&gt;Once the BI mix has settled and there are a few interoperable implementations, likely in the summer, we could pass from the challenge model to a situation where vendors may publish results as they become available, with LOD2 offering its services for audit. &lt;/p&gt; &lt;p&gt;Of course, this could be done even before then, but the content of the mix might not be settled. We likely need to check it on a few implementations first.&lt;/p&gt; &lt;p&gt;For equipment, people can use their own, or LOD2 partners might on a case-by-case basis make some equipment available for running on the same hardware on which say the Virtuoso results were obtained. For example, FU Berlin could give people a login to get their recently published results fixed. Now this might or might not happen, so I will not hold my breath waiting for this but instead close with a proposal.&lt;/p&gt; &lt;p&gt;As a unilateral diplomatic overture I put forth the following: If other vendors are interested in 1:1 comparison of their results with our publications, we can offer them a login to the same equipment. They can set up and tune their systems, and perform the runs. We will just watch. As an extra quid pro quo, they can try Virtuoso as configured for the results we have published, with the same data. Like this, both parties get to see the others&amp;#39; technology with proper tuning and installation. What, if anything, is reported about this activity is up to the owner of the technology being tested. We will publish a set of benchmark rules that can serve as a guideline for mutually comparable reporting, but we cannot force anybody to use these. This all will function as a catalyst for technological advance, all to the ultimate benefit of the end user. If you wish to take advantage of this offer, you may contact &lt;a href=&quot;mailto:hwilliams@openlinksw.com?subject=Collaborative RDF Benchmark&quot; id=&quot;link-id0x1c071100&quot;&gt;Hugh Williams at OpenLink Software, and we will see how this can be arranged in practice.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The next post will talk about the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x19933fd8&quot;&gt;actual content of benchmarks&lt;/a&gt;. The milestone after this will be when we publish the measurement and reporting protocols.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1c554800&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1ec159e8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1dd5eb10&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x18f05940&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ed5ef10&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1e9cb130&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1dfa79d8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1eb6f478&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1de5a918&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 10): LOD2 and the Benchmark Process &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1dae9060&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0xea8f8e8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x1ae34cd8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x19155c48&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x1aa9bf78&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:14.858380-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 9): BSBM With Cluster</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-09#1676</atom:id>
  <atom:published>2011-03-09T22:54:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post is dedicated to our brothers in horizontal partitioning (or sharding), &lt;a class=&quot;auto-href&quot; href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x2a1e9010&quot;&gt;Garlik&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x2acd5218&quot;&gt;Bigdata&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;At first sight, the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2bb33648&quot;&gt;BSBM&lt;/a&gt; &lt;i&gt;Explore&lt;/i&gt; mix appears very cluster-unfriendly, as it contains short queries that access &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2b8fffb8&quot;&gt;data&lt;/a&gt; at random. There is every opportunity for latency and few opportunities for parallelism.&lt;/p&gt; &lt;p&gt;For this reason we had not even run the BSBM mix with &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2a84b780&quot;&gt;Virtuoso&lt;/a&gt; Cluster. We were not surprised to learn that &lt;a href=&quot;http://steveharris.tumblr.com/post/3453040647/bsbm-v3-post-mortem&quot; id=&quot;link-id0x1c4ef8d8&quot;&gt;Garlik hadn&amp;#39;t run BSBM either&lt;/a&gt;. We have understood from &lt;a class=&quot;auto-href&quot; href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x2ad3d050&quot;&gt;Systap&lt;/a&gt; that their Bigdata BSBM experiments were on a single-process configuration.&lt;/p&gt; &lt;p&gt;But the 4Store results in the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1f8090f8&quot;&gt;recent Berlin report&lt;/a&gt; were with a distributed setup, as 4Store always runs a multiprocess configuration, even on a single server, so it seemed interesting to us to compare how Virtuoso Cluster compares with Virtuoso Single with this workload. These tests were run on a different box than the recent BSBM tests, so those 4Store figures are not directly comparable.&lt;/p&gt; &lt;p&gt;The setup here consists of 8 partitions, each managed by its own process, all running on the same box. Any of these processes can have its &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x2ac28380&quot;&gt;HTTP&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2bba8720&quot;&gt;SQL&lt;/a&gt; listener and can provide the same service. Most access to data goes over the interconnect, except when the data is co-resident in the process which is coordinating the query. The interconnect is Unix domain sockets since all 8 processes are on the same box.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Cluster - Load Rates and Times&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 119,204 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 749 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 89 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 121,607 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1486 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 157 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 102,694 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 8737 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 979 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Single - Load Rates and Times&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 74,713 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1192 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 145 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The load times are systematically better than for 6 Single. This is also not bad compared to the 7 Single vectored load rates of 220 Kt/s or so. We note that loading is a cluster friendly operation, going at a steady 1400+% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x296b03b8&quot;&gt;CPU&lt;/a&gt; utilization with an aggregate message throughput of 40MB/s. 7 Single is faster because of vectoring at the index level, not because the clusters were hitting communication overheads. 6 Cluster is faster than 6 Single because scale-out in this case diminishes contention, even on a single box.&lt;/p&gt; &lt;p&gt;Throughput is as follows:&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Cluster - Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7318 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 43120 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6222 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29981 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 2526 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 11156 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Single - Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29433 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6017 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 13335 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1770 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2487 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Below is a snapshot of status during the 6 Cluster 100 Mt run.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Cluster 8 nodes, 15 s. 25784 m/s 25682 KB/s 1160% cpu 0% read 740% clw threads 18r 0w 10i buffers 1133459 12 d 4 w 0 pfs cl 1: 10851 m/s 3911 KB/s 597% cpu 0% read 668% clw threads 17r 0w 10i buffers 143992 4 d 0 w 0 pfs cl 2: 2194 m/s 7959 KB/s 107% cpu 0% read 9% clw threads 1r 0w 0i buffers 143616 3 d 2 w 0 pfs cl 3: 2186 m/s 7818 KB/s 107% cpu 0% read 9% clw threads 0r 0w 0i buffers 140787 0 d 0 w 0 pfs cl 4: 2174 m/s 2804 KB/s 77% cpu 0% read 10% clw threads 0r 0w 0i buffers 140654 0 d 2 w 0 pfs cl 5: 2127 m/s 1612 KB/s 71% cpu 0% read 9% clw threads 0r 0w 0i buffers 140949 1 d 0 w 0 pfs cl 6: 2060 m/s 544 KB/s 66% cpu 0% read 10% clw threads 0r 0w 0i buffers 141295 2 d 0 w 0 pfs cl 7: 2072 m/s 517 KB/s 65% cpu 0% read 11% clw threads 0r 0w 0i buffers 141111 1 d 0 w 0 pfs cl 8: 2105 m/s 522 KB/s 66% cpu 0% read 10% clw threads 0r 0w 0i buffers 141055 1 d 0 w 0 pfs &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The main meters for cluster execution are the messages-per-second (m/s), the message volume (KB/s), and the total CPU% of the processes. &lt;/p&gt; &lt;p&gt;We note that CPU utilization is highly uneven and messages are short, about 1K on the average, compared to about 100K during the load. CPU would be evenly divided between the nodes if each got a share of the HTTP requests. We changed the test driver to round-robin requests between multiple end points. The work does then get evenly divided, but the speed is not affected. Also, this does not improve the message sizes since the workload consists mostly of short lookups. However, with the processes spread over multiple servers, the round-robin would be essential for CPU and especially for interconnect throughput. &lt;/p&gt; &lt;p&gt;Then we try 6 Cluster at 1000 Mt. For Single User, we get 1180 m/s, 6955 KB/s, and 173% cpu. For 16 User, this is 6573 m/s, 44366 KB/s, 1470% cpu.&lt;/p&gt; &lt;p&gt;This is a lot better than the figures with 6 Single, due to lower contention on the index tree, as discussed in &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1e9a0b58&quot;&gt;A Benchmarking Story&lt;/a&gt;&lt;/i&gt;. Also Single User throughput on 6 Cluster outperforms 6 Single, due to the natural parallelism of doing the Q5 joins in parallel in each partition. The larger the scale, the more weight this has in the metric. We see this also in the average message size, i.e., the KB/s throughput is almost double while the messages/s is a bit under a third.&lt;/p&gt; &lt;p&gt;The small-scale 6 Cluster run is about even with the 6 Single figure. Looking at the details, we see that the qps for Q1 in 6 Cluster is half of that on 6 Single, whereas the qps for Q5 on 6 Cluster is about double that of the 6 Single. This is as one might expect; longer queries are favored, and single row lookups are penalized.&lt;/p&gt; &lt;p&gt;Looking further at the 6 Cluster status we see the cluster wait (&lt;code&gt;clw&lt;/code&gt;) to be 740%. For 16 Users, this means that about half of the execution real time is spent waiting for responses from other partitions. A high figure means uneven distribution between partitions; a low figure means even. This is as expected, since many queries are concerned with just one S and its related objects.&lt;/p&gt; &lt;p&gt;We will update this section once 7 Cluster is ready. This will implement vectored execution and column store inside the cluster nodes.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d7894d0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1e434888&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1f6b5260&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1dd29460&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f0d78b8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1f9a9670&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1c055370&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1dc06cd0&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 9): BSBM With Cluster &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x18f04db0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ee729b8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e2e76b8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d75ef48&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ee518c0&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d9244b0&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T19:36:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 9): BSBM With Cluster</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-09#1675</atom:id>
  <atom:published>2011-03-09T22:54:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post is dedicated to our brothers in horizontal partitioning (or sharding), &lt;a class=&quot;auto-href&quot; href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x113d92b0&quot;&gt;Garlik&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x1cca0090&quot;&gt;Bigdata&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;At first sight, the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1c1c1330&quot;&gt;BSBM&lt;/a&gt; &lt;i&gt;Explore&lt;/i&gt; mix appears very cluster-unfriendly, as it contains short queries that access &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa2e1940&quot;&gt;data&lt;/a&gt; at random. There is every opportunity for latency and few opportunities for parallelism.&lt;/p&gt; &lt;p&gt;For this reason we had not even run the BSBM mix with &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e734de0&quot;&gt;Virtuoso&lt;/a&gt; Cluster. We were not surprised to learn that &lt;a href=&quot;http://steveharris.tumblr.com/post/3453040647/bsbm-v3-post-mortem&quot; id=&quot;link-id0x1c4ef8d8&quot;&gt;Garlik hadn&amp;#39;t run BSBM either&lt;/a&gt;. We have understood from &lt;a class=&quot;auto-href&quot; href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x1c579da0&quot;&gt;Systap&lt;/a&gt; that their Bigdata BSBM experiments were on a single-process configuration.&lt;/p&gt; &lt;p&gt;But the 4Store results in the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1f8090f8&quot;&gt;recent Berlin report&lt;/a&gt; were with a distributed setup, as 4Store always runs a multiprocess configuration, even on a single server, so it seemed interesting to us to compare how Virtuoso Cluster compares with Virtuoso Single with this workload. These tests were run on a different box than the recent BSBM tests, so those 4Store figures are not directly comparable.&lt;/p&gt; &lt;p&gt;The setup here consists of 8 partitions, each managed by its own process, all running on the same box. Any of these processes can have its &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1bbcd560&quot;&gt;HTTP&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1ea554c0&quot;&gt;SQL&lt;/a&gt; listener and can provide the same service. Most access to data goes over the interconnect, except when the data is co-resident in the process which is coordinating the query. The interconnect is Unix domain sockets since all 8 processes are on the same box.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Cluster - Load Rates and Times&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 119,204 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 749 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 89 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 121,607 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1486 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 157 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 102,694 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 8737 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 979 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Single - Load Rates and Times&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 74,713 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1192 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 145 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The load times are systematically better than for 6 Single. This is also not bad compared to the 7 Single vectored load rates of 220 Kt/s or so. We note that loading is a cluster friendly operation, going at a steady 1400+% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1c55c8f0&quot;&gt;CPU&lt;/a&gt; utilization with an aggregate message throughput of 40MB/s. 7 Single is faster because of vectoring at the index level, not because the clusters were hitting communication overheads. 6 Cluster is faster than 6 Single because scale-out in this case diminishes contention, even on a single box.&lt;/p&gt; &lt;p&gt;Throughput is as follows:&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Cluster - Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7318 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 43120 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6222 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29981 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 2526 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 11156 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Single - Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29433 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6017 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 13335 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1770 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2487 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Below is a snapshot of status during the 6 Cluster 100 Mt run.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; Cluster 8 nodes, 15 s. 25784 m/s 25682 KB/s 1160% cpu 0% read 740% clw threads 18r 0w 10i buffers 1133459 12 d 4 w 0 pfs cl 1: 10851 m/s 3911 KB/s 597% cpu 0% read 668% clw threads 17r 0w 10i buffers 143992 4 d 0 w 0 pfs cl 2: 2194 m/s 7959 KB/s 107% cpu 0% read 9% clw threads 1r 0w 0i buffers 143616 3 d 2 w 0 pfs cl 3: 2186 m/s 7818 KB/s 107% cpu 0% read 9% clw threads 0r 0w 0i buffers 140787 0 d 0 w 0 pfs cl 4: 2174 m/s 2804 KB/s 77% cpu 0% read 10% clw threads 0r 0w 0i buffers 140654 0 d 2 w 0 pfs cl 5: 2127 m/s 1612 KB/s 71% cpu 0% read 9% clw threads 0r 0w 0i buffers 140949 1 d 0 w 0 pfs cl 6: 2060 m/s 544 KB/s 66% cpu 0% read 10% clw threads 0r 0w 0i buffers 141295 2 d 0 w 0 pfs cl 7: 2072 m/s 517 KB/s 65% cpu 0% read 11% clw threads 0r 0w 0i buffers 141111 1 d 0 w 0 pfs cl 8: 2105 m/s 522 KB/s 66% cpu 0% read 10% clw threads 0r 0w 0i buffers 141055 1 d 0 w 0 pfs &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The main meters for cluster execution are the messages-per-second (m/s), the message volume (KB/s), and the total CPU% of the processes. &lt;/p&gt; &lt;p&gt;We note that CPU utilization is highly uneven and messages are short, about 1K on the average, compared to about 100K during the load. CPU would be evenly divided between the nodes if each got a share of the HTTP requests. We changed the test driver to round-robin requests between multiple end points. The work does then get evenly divided, but the speed is not affected. Also, this does not improve the message sizes since the workload consists mostly of short lookups. However, with the processes spread over multiple servers, the round-robin would be essential for CPU and especially for interconnect throughput. &lt;/p&gt; &lt;p&gt;Then we try 6 Cluster at 1000 Mt. For Single User, we get 1180 m/s, 6955 KB/s, and 173% cpu. For 16 User, this is 6573 m/s, 44366 KB/s, 1470% cpu.&lt;/p&gt; &lt;p&gt;This is a lot better than the figures with 6 Single, due to lower contention on the index tree, as discussed in &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1e9a0b58&quot;&gt;A Benchmarking Story&lt;/a&gt;&lt;/i&gt;. Also Single User throughput on 6 Cluster outperforms 6 Single, due to the natural parallelism of doing the Q5 joins in parallel in each partition. The larger the scale, the more weight this has in the metric. We see this also in the average message size, i.e., the KB/s throughput is almost double while the messages/s is a bit under a third.&lt;/p&gt; &lt;p&gt;The small-scale 6 Cluster run is about even with the 6 Single figure. Looking at the details, we see that the qps for Q1 in 6 Cluster is half of that on 6 Single, whereas the qps for Q5 on 6 Cluster is about double that of the 6 Single. This is as one might expect; longer queries are favored, and single row lookups are penalized.&lt;/p&gt; &lt;p&gt;Looking further at the 6 Cluster status we see the cluster wait (&lt;code&gt;clw&lt;/code&gt;) to be 740%. For 16 Users, this means that about half of the execution real time is spent waiting for responses from other partitions. A high figure means uneven distribution between partitions; a low figure means even. This is as expected, since many queries are concerned with just one S and its related objects.&lt;/p&gt; &lt;p&gt;We will update this section once 7 Cluster is ready. This will implement vectored execution and column store inside the cluster nodes.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d7894d0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1e434888&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1f6b5260&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1dd29460&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f0d78b8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1f9a9670&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1c055370&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1dc06cd0&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 9): BSBM With Cluster &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x18f04db0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ee729b8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac15e08658&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aac15e083d8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aac15cfa158&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aac15cfbd68&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:26.683242-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 8): BSBM Explore and Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-09#1674</atom:id>
  <atom:published>2011-03-09T17:32:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here look at the &lt;i&gt;Explore and Update&lt;/i&gt; scenario of &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1c064218&quot;&gt;BSBM&lt;/a&gt;. This presents us with a novel problem as the specification does not address any aspect of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1c1852b0&quot;&gt;ACID&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A transaction benchmark ought to have something to say about this. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1dbca228&quot;&gt;SPARUL&lt;/a&gt; (also known as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1eaa4fd0&quot;&gt;SPARQL&lt;/a&gt;/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1dd12bb0&quot;&gt;Update&lt;/a&gt;) language does not say anything about transactionality, but I suppose it is in the spirit of the SPARUL protocol to promise atomicity and durability.&lt;/p&gt; &lt;p&gt;We begin by running &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c5f4830&quot;&gt;Virtuoso&lt;/a&gt; 7 Single, with Single User and 16 User, each at scales of 100 Mt, 200 Mt, and 1000 Mt. The transactionality is default, meaning &lt;code&gt;SERIALIZABLE&lt;/code&gt; isolation between &lt;code&gt;INSERTs&lt;/code&gt; and &lt;code&gt;DELETEs&lt;/code&gt;, and &lt;code&gt;READ COMMITTED&lt;/code&gt; isolation between &lt;code&gt;READ&lt;/code&gt; and any &lt;code&gt;UPDATE&lt;/code&gt; transaction. (Figures for Virtuoso 6 will also be presented here in the near future, as they are the currently shipping production versions.)&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 7 Single, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 9,969 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 65,537 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 8,646 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 40,527 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5,512 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 17,293 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 6 Cluster, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; Scale &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; 100 Mt &lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5604.520 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 34079.019 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; 1000 Mt &lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 2866.616 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 10028.325 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 6 Single, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7,152 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 21,065 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5,862 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16,895 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1,542 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4,548 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Each run is preceded by a warm-up of 500 or 300 mixes (the exact number is not material), resulting in a warm &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1d4f13d8&quot;&gt;cache&lt;/a&gt;; see &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1f8ac510&quot;&gt;previous post on read-ahead&lt;/a&gt; for details. All runs do 1000 &lt;i&gt;Explore and Update&lt;/i&gt; mixes. The initial database is in the state following the &lt;i&gt;Explore&lt;/i&gt; only runs.&lt;/p&gt; &lt;p&gt;The results are in line with the &lt;i&gt;Explore&lt;/i&gt; results. There is a fair amount of variability between consecutive runs; the 16 User run at 1000 Mt varies between 14K and 19K QMpH depending on the measurement. The smaller runs exhibit less variability.&lt;/p&gt; &lt;p&gt;In the following we will look at transactions and at how the definition of the workload and reporting could be made complete.&lt;/p&gt; &lt;p&gt;Full ACID means serializable semantic of concurrent insert and delete of the same quad. Non-transactional means that on concurrent insert and delete of overlapping sets of quads the result is undefined. Further if one logged such &amp;quot;transactions,&amp;quot; the replay would give serialization although the initial execution did not, hence further confusing the issue. Considering the hypothetical use case of an e-commerce information portal, there is little chance of deletes and inserts actually needing serialization. An insert-only workload does not need serializability because an insert cannot fail. If the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ec05c10&quot;&gt;data&lt;/a&gt; already exists the insert does nothing, if the quad does not previously exist it is created. The same applies to deletes alone. If a delete and insert overlap, serialization would be needed but the semantics implicit in the use case make this improbable.&lt;/p&gt; &lt;p&gt;Read-only transactions (i.e., the &lt;i&gt;Explore&lt;/i&gt; mix in the &lt;i&gt;Explore and Update&lt;/i&gt; scenario) will be run as &lt;code&gt;READ COMMITTED&lt;/code&gt;. These do not see uncommitted data and never block for lock wait. The reads may not be repeatable.&lt;/p&gt; &lt;p&gt;Our first point of call is to determine the cost of ACID. We run 1000 mixes of &lt;i&gt;Explore and Update&lt;/i&gt; at 1000 Mt. The throughput is 19214 after a warm-up of 500 mixes. This is pretty good in comparison with the diverse read-only results at this scale.&lt;/p&gt; &lt;p&gt;We look at the pertinent statistics:&lt;/p&gt; &lt;p&gt; &lt;code&gt;&lt;/code&gt; &lt;/p&gt; &lt;pre&gt; SELECT TOP 5 * FROM sys_l_stat ORDER BY waits DESC; &lt;/pre&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME LOCKS WAITS WAIT_PCT DEADLOCKS LOCK_ESC WAIT_MSECS =============== ============= ====== ===== ======== ========= ======== ========== DB.DBA.&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x180837c8&quot;&gt;RDF&lt;/a&gt;_QUAD RDF_QUAD_POGS 179205 934 0 0 0 35164 DB.DBA.RDF_IRI RDF_IRI 20752 217 1 0 0 16445 DB.DBA.RDF_QUAD RDF_QUAD_SP 9244 3 0 0 0 235 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We see 934 waits with a total duration of 35 seconds on the index with the most contention. The run was 187 seconds, real time. The lock wait time is not real time since this is the total elapsed wait time summed over all threads. The lock wait frequency is a little over one per query mix, meaning a little over one per five locking transactions. &lt;/p&gt; &lt;p&gt;We note that we do not get deadlocks since all inserts and deletes are in ascending key order due to vectoring. This guarantees the absence of deadlocks for single insert transactions, as long as the transaction stays within the vector size. This is always the case since the inserts are a few hundred triples at the maximum. The waits concentrate on POGS, because this is a bitmap index where the locking resolution is less than a row, and the values do not correlate with insert order. The locking behavior could be better with the column store, where we would have row level locking also for this index. This is to be seen. The column store would otherwise tend to have higher cost per random insert.&lt;/p&gt; &lt;p&gt;Considering these results it does not seem crucial to &amp;quot;drop ACID,&amp;quot; though doing so would save &lt;i&gt;some&lt;/i&gt; time. We will now run measurements for all scales with 16 Users and ACID. &lt;/p&gt; &lt;p&gt;Let us now see what the benchmark writes:&lt;/p&gt; &lt;p&gt; &lt;code&gt;&lt;/code&gt; &lt;/p&gt; &lt;pre&gt; SELECT TOP 10 * FROM sys_d_stat ORDER BY n_dirty DESC; &lt;/pre&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS =========================== ============================ ========= ======= ======== ======= ========= DB.DBA.RDF_QUAD RDF_QUAD_POGS 763846891 237436 0 58040 228606 DB.DBA.RDF_QUAD RDF_QUAD 213282706 1991836 0 30226 1940280 DB.DBA.RDF_OBJ RO_VAL 15474 17837 115 13438 17431 DB.DBA.RO_START RO_START 10573 11195 105 10228 11227 DB.DBA.RDF_IRI RDF_IRI 61902 125711 203 7705 121300 DB.DBA.RDF_OBJ RDF_OBJ 23809053 3205963 13 636 3072517 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 3237687 504486 15 340 488797 DB.DBA.RDF_QUAD RDF_QUAD_SP 89995 70446 78 99 68340 DB.DBA.RDF_QUAD RDF_QUAD_OP 19440 47541 244 66 45583 DB.DBA.VTLOG_DB_DBA_RDF_OBJ VTLOG_DB_DBA_RDF_OBJ 3014 1 0 11 11 DB.DBA.RDF_QUAD RDF_QUAD_GS 1261 801 63 10 751 DB.DBA.RDF_PREFIX RDF_PREFIX 14 168 1120 1 153 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 1807 200 11 1 200 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The most dirty pages are on the &lt;code&gt;POGS&lt;/code&gt; index, which is reasonable; values are spread out at random. After this we have the &lt;code&gt;PSOG&lt;/code&gt; index, likely because of random deletes. New IRIs tend to get consecutive numbers and do not make many dirty pages. Literals come next, with the index from leading string or hash of the literal to id leading, as one would expect, again because of values being distributed at random. After this come IRIs. The distribution of updates is generally as one would expect.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;* * *&lt;/p&gt; &lt;p&gt;Going back to BSBM, at least the following aspects of the benchmark have to be further specified:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Disclosure of ACID properties.&lt;/b&gt; If the benchmark required full ACID many would not run this at all. Besides full ACID is not necessarily an absolute requirement based on the hypothetical usage scenario of the benchmark. However, when publishing numbers the guarantees that go with the numbers must be made explicit. This includes logging, checkpoint frequency or equivalent etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Steady state.&lt;/b&gt; The working set of the &lt;i&gt;Update&lt;/i&gt; mix is different from that of the &lt;i&gt;Explore&lt;/i&gt; mixes. This touches more indices than &lt;i&gt;Explore&lt;/i&gt;. The &lt;i&gt;Explore&lt;/i&gt; warm-up is in part good but does not represent steady state.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Checkpoint and sustained throughput.&lt;/b&gt; Benchmarks involving update generally have rules for checkpointing the state and for sustained throughput. In specific, the throughput of an update benchmark cannot rely on never flushing to persistent storage. Even bulk load must be timed with a checkpoint guaranteeing durability at the end. A steady update stream should be timed with a test interval of sufficient length involving a few checkpoints; for example, a minimum duration of 30 minutes with no less than 3 completed checkpoints in the interval with at least 9 minutes between the end of one and the start of the next. Not all DBMSs work with logs and checkpoints, but if an alternate scheme is used then this needs to be described.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Memory and warm-up issues.&lt;/b&gt;We have seen the test data generator run out of memory when trying to generate update streams of meaningful length. Also the test driver should allow running updates in timed and non-timed mode (warm-up).&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;With an update benchmark, many more things need to be defined, and the set-up becomes more system specific, than with a read-only workload. We will address these shortcomings in the measurement rules proposal to come. Especially with update workloads, the vendors need to provide tuning expertise; however, this will not happen if the benchmark does not properly set the expectations. If benchmarks serve as a catalyst for clearly defining how things are to be set up, then they will have served the end user.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1de61db8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1f9f96f8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1f89eeb0&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1ad83f30&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1de62178&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1b2ec018&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ae6f028&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 8): BSBM Explore and Update &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x132605c0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1a9871b0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1baa20f8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e25a840&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1b53db20&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e7ce520&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1b18f400&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-15T17:18:32-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 8): BSBM Explore and Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-09#1673</atom:id>
  <atom:published>2011-03-09T17:32:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here look at the &lt;i&gt;Explore and Update&lt;/i&gt; scenario of &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2a621a00&quot;&gt;BSBM&lt;/a&gt;. This presents us with a novel problem as the specification does not address any aspect of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x2a2d4310&quot;&gt;ACID&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A transaction benchmark ought to have something to say about this. The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x27cf4478&quot;&gt;SPARUL&lt;/a&gt; (also known as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x29bb7f80&quot;&gt;SPARQL&lt;/a&gt;/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x2978e570&quot;&gt;Update&lt;/a&gt;) language does not say anything about transactionality, but I suppose it is in the spirit of the SPARUL protocol to promise atomicity and durability.&lt;/p&gt; &lt;p&gt;We begin by running &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x27a2b9f0&quot;&gt;Virtuoso&lt;/a&gt; 7 Single, with Single User and 16 User, each at scales of 100 Mt, 200 Mt, and 1000 Mt. The transactionality is default, meaning &lt;code&gt;SERIALIZABLE&lt;/code&gt; isolation between &lt;code&gt;INSERTs&lt;/code&gt; and &lt;code&gt;DELETEs&lt;/code&gt;, and &lt;code&gt;READ COMMITTED&lt;/code&gt; isolation between &lt;code&gt;READ&lt;/code&gt; and any &lt;code&gt;UPDATE&lt;/code&gt; transaction. (Figures for Virtuoso 6 will also be presented here in the near future, as they are the currently shipping production versions.)&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 7 Single, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 9,969 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 65,537 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 8,646 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 40,527 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5,512 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 17,293 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 6 Cluster, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; Scale &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; 100 Mt &lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5604.520 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 34079.019 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; 1000 Mt &lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 2866.616 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 10028.325 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; Virtuoso 6 Single, Full ACID &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7,152 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 21,065 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 5,862 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16,895 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1,542 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4,548 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Each run is preceded by a warm-up of 500 or 300 mixes (the exact number is not material), resulting in a warm &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x298139d0&quot;&gt;cache&lt;/a&gt;; see &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1f8ac510&quot;&gt;previous post on read-ahead&lt;/a&gt; for details. All runs do 1000 &lt;i&gt;Explore and Update&lt;/i&gt; mixes. The initial database is in the state following the &lt;i&gt;Explore&lt;/i&gt; only runs.&lt;/p&gt; &lt;p&gt;The results are in line with the &lt;i&gt;Explore&lt;/i&gt; results. There is a fair amount of variability between consecutive runs; the 16 User run at 1000 Mt varies between 14K and 19K QMpH depending on the measurement. The smaller runs exhibit less variability.&lt;/p&gt; &lt;p&gt;In the following we will look at transactions and at how the definition of the workload and reporting could be made complete.&lt;/p&gt; &lt;p&gt;Full ACID means serializable semantic of concurrent insert and delete of the same quad. Non-transactional means that on concurrent insert and delete of overlapping sets of quads the result is undefined. Further if one logged such &amp;quot;transactions,&amp;quot; the replay would give serialization although the initial execution did not, hence further confusing the issue. Considering the hypothetical use case of an e-commerce information portal, there is little chance of deletes and inserts actually needing serialization. An insert-only workload does not need serializability because an insert cannot fail. If the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x29a2f220&quot;&gt;data&lt;/a&gt; already exists the insert does nothing, if the quad does not previously exist it is created. The same applies to deletes alone. If a delete and insert overlap, serialization would be needed but the semantics implicit in the use case make this improbable.&lt;/p&gt; &lt;p&gt;Read-only transactions (i.e., the &lt;i&gt;Explore&lt;/i&gt; mix in the &lt;i&gt;Explore and Update&lt;/i&gt; scenario) will be run as &lt;code&gt;READ COMMITTED&lt;/code&gt;. These do not see uncommitted data and never block for lock wait. The reads may not be repeatable.&lt;/p&gt; &lt;p&gt;Our first point of call is to determine the cost of ACID. We run 1000 mixes of &lt;i&gt;Explore and Update&lt;/i&gt; at 1000 Mt. The throughput is 19214 after a warm-up of 500 mixes. This is pretty good in comparison with the diverse read-only results at this scale.&lt;/p&gt; &lt;p&gt;We look at the pertinent statistics:&lt;/p&gt; &lt;p&gt; &lt;code&gt;&lt;/code&gt; &lt;/p&gt; &lt;pre&gt; SELECT TOP 5 * FROM sys_l_stat ORDER BY waits DESC; &lt;/pre&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME LOCKS WAITS WAIT_PCT DEADLOCKS LOCK_ESC WAIT_MSECS =============== ============= ====== ===== ======== ========= ======== ========== DB.DBA.&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x299432f0&quot;&gt;RDF&lt;/a&gt;_QUAD RDF_QUAD_POGS 179205 934 0 0 0 35164 DB.DBA.RDF_IRI RDF_IRI 20752 217 1 0 0 16445 DB.DBA.RDF_QUAD RDF_QUAD_SP 9244 3 0 0 0 235 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We see 934 waits with a total duration of 35 seconds on the index with the most contention. The run was 187 seconds, real time. The lock wait time is not real time since this is the total elapsed wait time summed over all threads. The lock wait frequency is a little over one per query mix, meaning a little over one per five locking transactions. &lt;/p&gt; &lt;p&gt;We note that we do not get deadlocks since all inserts and deletes are in ascending key order due to vectoring. This guarantees the absence of deadlocks for single insert transactions, as long as the transaction stays within the vector size. This is always the case since the inserts are a few hundred triples at the maximum. The waits concentrate on POGS, because this is a bitmap index where the locking resolution is less than a row, and the values do not correlate with insert order. The locking behavior could be better with the column store, where we would have row level locking also for this index. This is to be seen. The column store would otherwise tend to have higher cost per random insert.&lt;/p&gt; &lt;p&gt;Considering these results it does not seem crucial to &amp;quot;drop ACID,&amp;quot; though doing so would save &lt;i&gt;some&lt;/i&gt; time. We will now run measurements for all scales with 16 Users and ACID. &lt;/p&gt; &lt;p&gt;Let us now see what the benchmark writes:&lt;/p&gt; &lt;p&gt; &lt;code&gt;&lt;/code&gt; &lt;/p&gt; &lt;pre&gt; SELECT TOP 10 * FROM sys_d_stat ORDER BY n_dirty DESC; &lt;/pre&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS =========================== ============================ ========= ======= ======== ======= ========= DB.DBA.RDF_QUAD RDF_QUAD_POGS 763846891 237436 0 58040 228606 DB.DBA.RDF_QUAD RDF_QUAD 213282706 1991836 0 30226 1940280 DB.DBA.RDF_OBJ RO_VAL 15474 17837 115 13438 17431 DB.DBA.RO_START RO_START 10573 11195 105 10228 11227 DB.DBA.RDF_IRI RDF_IRI 61902 125711 203 7705 121300 DB.DBA.RDF_OBJ RDF_OBJ 23809053 3205963 13 636 3072517 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 3237687 504486 15 340 488797 DB.DBA.RDF_QUAD RDF_QUAD_SP 89995 70446 78 99 68340 DB.DBA.RDF_QUAD RDF_QUAD_OP 19440 47541 244 66 45583 DB.DBA.VTLOG_DB_DBA_RDF_OBJ VTLOG_DB_DBA_RDF_OBJ 3014 1 0 11 11 DB.DBA.RDF_QUAD RDF_QUAD_GS 1261 801 63 10 751 DB.DBA.RDF_PREFIX RDF_PREFIX 14 168 1120 1 153 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 1807 200 11 1 200 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The most dirty pages are on the &lt;code&gt;POGS&lt;/code&gt; index, which is reasonable; values are spread out at random. After this we have the &lt;code&gt;PSOG&lt;/code&gt; index, likely because of random deletes. New IRIs tend to get consecutive numbers and do not make many dirty pages. Literals come next, with the index from leading string or hash of the literal to id leading, as one would expect, again because of values being distributed at random. After this come IRIs. The distribution of updates is generally as one would expect.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;* * *&lt;/p&gt; &lt;p&gt;Going back to BSBM, at least the following aspects of the benchmark have to be further specified:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Disclosure of ACID properties.&lt;/b&gt; If the benchmark required full ACID many would not run this at all. Besides full ACID is not necessarily an absolute requirement based on the hypothetical usage scenario of the benchmark. However, when publishing numbers the guarantees that go with the numbers must be made explicit. This includes logging, checkpoint frequency or equivalent etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Steady state.&lt;/b&gt; The working set of the &lt;i&gt;Update&lt;/i&gt; mix is different from that of the &lt;i&gt;Explore&lt;/i&gt; mixes. This touches more indices than &lt;i&gt;Explore&lt;/i&gt;. The &lt;i&gt;Explore&lt;/i&gt; warm-up is in part good but does not represent steady state.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Checkpoint and sustained throughput.&lt;/b&gt; Benchmarks involving update generally have rules for checkpointing the state and for sustained throughput. In specific, the throughput of an update benchmark cannot rely on never flushing to persistent storage. Even bulk load must be timed with a checkpoint guaranteeing durability at the end. A steady update stream should be timed with a test interval of sufficient length involving a few checkpoints; for example, a minimum duration of 30 minutes with no less than 3 completed checkpoints in the interval with at least 9 minutes between the end of one and the start of the next. Not all DBMSs work with logs and checkpoints, but if an alternate scheme is used then this needs to be described.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Memory and warm-up issues.&lt;/b&gt;We have seen the test data generator run out of memory when trying to generate update streams of meaningful length. Also the test driver should allow running updates in timed and non-timed mode (warm-up).&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;With an update benchmark, many more things need to be defined, and the set-up becomes more system specific, than with a read-only workload. We will address these shortcomings in the measurement rules proposal to come. Especially with update workloads, the vendors need to provide tuning expertise; however, this will not happen if the benchmark does not properly set the expectations. If benchmarks serve as a catalyst for clearly defining how things are to be set up, then they will have served the end user.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1de61db8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1f9f96f8&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1f89eeb0&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1ad83f30&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1de62178&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1b2ec018&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ae6f028&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 8): BSBM Explore and Update &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x132605c0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1a9871b0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1baa20f8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aabe7f1a968&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aabe628feb8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aabe7e4d5d8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aac0214de48&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:37.814559-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 7): What Does BSBM Explore Measure?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-07#1672</atom:id>
  <atom:published>2011-03-07T23:39:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here analyze what the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1db49f28&quot;&gt;BSBM&lt;/a&gt; Explore workload does. This is necessary in order to compare benchmark results at different scales. Historically, BSBM had a Query 6 whose share of the metric approached 100% as scale increased. The present mix does not have this query, but different queries still have different relative importance at different scales.&lt;/p&gt; &lt;p&gt;We will here look at database-running statistics for BSBM at different scales. Finally, we look at &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1f150460&quot;&gt;CPU&lt;/a&gt; profiles.&lt;/p&gt; &lt;p&gt;But first, let us see what BSBM reads in general. The system is in steady state after around 1500 query mixes; after this the working set does not shift much. After several thousand query mixes, we have:&lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT TOP 10 * FROM sys_d_stat ORDER BY reads DESC;&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS ================= ============================ ========== ======= ======== ======= ========= DB.DBA.&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ddb0b50&quot;&gt;RDF&lt;/a&gt;_OBJ RDF_OBJ 114105938 3302150 2 0 3171275 DB.DBA.RDF_QUAD RDF_QUAD 977426773 2041156 0 0 1970712 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 8250414 509239 6 15 491631 DB.DBA.RDF_QUAD RDF_QUAD_POGS 3677233812 183860 0 0 175386 DB.DBA.RDF_IRI RDF_IRI 32 99710 302151 5 95353 DB.DBA.RDF_QUAD RDF_QUAD_OP 30597 51593 168 0 48941 DB.DBA.RDF_QUAD RDF_QUAD_SP 265474 47210 17 0 46078 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 6020 212 3 0 212 DB.DBA.RDF_PREFIX RDF_PREFIX 0 167 16700 0 157 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first column is the table, then the index, then the number of times a row was found. The fourth number is the count of disk pages read. The last number is the count of 8K buffer pool pages in use for caching pages of the index in question. Note that the index is clustered, i.e., there is no table &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d4f9808&quot;&gt;data&lt;/a&gt; structure separate from the index. Most of the reads are for strings or RDF literals. After this comes the &lt;code&gt;PSOG&lt;/code&gt; index for getting a property value given the subject. After this, but much lower, we have lookups of IRI strings given the ID. The index from object value to subject is used the most but the number of pages is small; only a few properties seem to be concerned. The rest is minimal in comparison.&lt;/p&gt; &lt;p&gt;Now let us reset the counts and see what the steady state I/O profile is.&lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT key_stat (key_table, name_part (key_name, 2), &amp;#39;reset&amp;#39;) FROM sys_keys WHERE key_migrate_to IS NULL;&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT TOP 10 * FROM sys_d_stat ORDER BY reads DESC;&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS ================= ============================ ========== ======= ======== ======= ========= DB.DBA.RDF_OBJ RDF_OBJ 30155789 79659 0 0 3191391 DB.DBA.RDF_QUAD RDF_QUAD 259008064 8904 0 0 1948707 DB.DBA.RDF_QUAD RDF_QUAD_SP 68002 7730 11 0 53360 DB.DBA.RDF_IRI RDF_IRI 12 5415 41653 6 98804 DB.DBA.RDF_QUAD RDF_QUAD_POGS 975147136 1597 0 0 173459 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 2213525 1286 0 17 485093 DB.DBA.RDF_QUAD RDF_QUAD_OP 7999 904 11 0 48568 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 1494 1 0 0 213 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Literal strings dominate. The &lt;code&gt;SP&lt;/code&gt; index is used only for situations where the &lt;code&gt;P&lt;/code&gt; is not specified, i.e., the &lt;code&gt;DESCRIBE&lt;/code&gt; query. Based on this, I/O seems to be attributable mostly to this. The first &lt;code&gt;RDF_IRI&lt;/code&gt; represents translations from string to IRI id; the second represents translations from IRI id to string. The touch count for the first &lt;code&gt;RDF_IRI&lt;/code&gt; is not properly recorded, hence the miss % is out of line. We see &lt;code&gt;SP&lt;/code&gt; missing the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x17d2e670&quot;&gt;cache&lt;/a&gt; the most since its use is infrequent in the mix.&lt;/p&gt; &lt;p&gt;We will next look at query processing statistics. For this we introduce a new meter.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;db_activity&lt;/code&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1d4915b8&quot;&gt;SQL&lt;/a&gt; function provides a session-by-session cumulative statistic of activity. The fields are: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;rnd&lt;/code&gt; &lt;/b&gt; - Count of &lt;i&gt;random index lookups&lt;/i&gt;. Each first row of a select or insert counts as one, regardless of whether something was found.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;seq&lt;/code&gt; &lt;/b&gt; - Count of &lt;i&gt;sequential rows&lt;/i&gt;. Every move to next row on a cursor counts as 1, regardless of whether conditions match.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same seg&lt;/code&gt; &lt;/b&gt; - For column store only; counts how many times the next row in a vectored join using an index falls in the &lt;i&gt;same segment&lt;/i&gt; as the previous random access. A segment is the stretch of rows between entries in the sparse top level index on the column projection.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same pg&lt;/code&gt; &lt;/b&gt; - Counts how many times a vectored index join finds the next match on the &lt;i&gt;same page&lt;/i&gt; as the previous one.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same par&lt;/code&gt; &lt;/b&gt; - Counts how many times the next lookup in a vectored index join falls on a different page than the previous but still under the &lt;i&gt;same parent&lt;/i&gt;.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;disk&lt;/code&gt; &lt;/b&gt; - Counts how many &lt;i&gt;disk reads&lt;/i&gt; were made, including any speculative reads initiated.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;spec disk&lt;/code&gt; &lt;/b&gt; - Counts &lt;i&gt;speculative disk reads&lt;/i&gt;.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;messages&lt;/code&gt; &lt;/b&gt; - Counts &lt;i&gt;cluster interconnect messages&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;B (KB, MB, GB)&lt;/code&gt; &lt;/b&gt; - is the &lt;i&gt;total length&lt;/i&gt; of the cluster interconnect messages.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;fork&lt;/code&gt; &lt;/b&gt; - Counts how many times a &lt;i&gt;thread was forked (started)&lt;/i&gt; for query parallelization.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The numbers are given with 4 significant digits and a scale suffix. G is 10^9 (1,000,000,000); M is 10^6 (1,000,000), K is 10^3 (1,000).&lt;/p&gt; &lt;p&gt;We run 2000 query mixes with 16 Users. The special &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1bf7f318&quot;&gt;http&lt;/a&gt;&lt;/code&gt; account keeps a cumulative account of all activity on web server threads.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;code&gt;SELECT db_activity (2, &amp;#39;http&amp;#39;);&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt;1.674G rnd  3.223G seq      0 same seg  1.286G same pg  314.8M same par  6.186M disk  6.461M spec disk      0B /     0 messages  298.6K fork&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;We see that random access dominates. The &lt;code&gt;seq&lt;/code&gt; number is about twice the &lt;code&gt;rnd&lt;/code&gt; number, meaning that the average random lookup gets two rows. Getting a row at random obviously takes more time than getting the next row. Since the index used is row-wise, the &lt;code&gt;same seg&lt;/code&gt; is 0; the &lt;code&gt;same pg&lt;/code&gt; indicates that 77% of the random accesses fall on the same page as the previous random access; most of the remaining random accesses fall under the same parent as the previous one.&lt;/p&gt; &lt;p&gt;There are more speculative reads than disk reads which is an artifact of counting some concurrently speculated reads twice. This does indicate that speculative reads dominate. This is because a large part of the run was in the warm-up state with aggressive speculative reading. We reset the counts and run another 2000 mixes.&lt;/p&gt; &lt;p&gt;Now let us look at the same reading after 2000 mixes, 16 user at 100Mt.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;code&gt;234.3M rnd  420.5M seq      0 same seg   188.8M same pg  29.09M same par  808.9K disk  919.9K spec disk      0B /      0 messages  76K fork&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;We note that the ratios between the random and sequential and same page/parent counts are about the same. The sequential number looks to be even a bit smaller in proportion. The count of random accesses for the 100Mt run is 14% of the count for the 1000Mt run. The count of query parallelization threads is also much lower since it is worthwhile to schedule a new thread only if there are at least a few thousand operations to perform on it. The precise criterion for making a thread is that according to the cost model guess, the thread must have at least 5ms worth of work.&lt;/p&gt; &lt;p&gt;We note that the 100 Mt throughput is a little over three-times that of the 1000 Mt throughput, as reported before. We might justifiably ask why the 100 Mt run is not seven-times faster instead, for this much less work. &lt;/p&gt; &lt;p&gt;We note that for one-off random access, it makes no real difference whether the tree has 100 M or 1000 M rows; this translates to roughly 27 vs 30 comparisons, so the depth of the tree is not a factor &lt;i&gt;per se&lt;/i&gt;. Besides, vectoring makes the tree often look only one or two levels deep, so the total row count matters even less there.&lt;/p&gt; &lt;p&gt;To elucidate this last question, we look at the CPU profiles. We take an &lt;a href=&quot;http://oprofile.sourceforge.net/about/&quot; id=&quot;link-id0x1efb3360&quot;&gt;oprofile&lt;/a&gt; of 100 Single User mixes at both scales.&lt;/p&gt; For 100 Mt: &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 61161 10.1723 cmpf_iri64n_iri64n_anyn_gt_lt 31321 5.2093 box_equal 19027 3.1646 sqlo_parse_tree_has_node 15905 2.6453 dk_alloc 15647 2.6024 itc_next_set_neq 12702 2.1126 itc_vec_split_search 12487 2.0768 itc_dive_transit 11450 1.9044 itc_bm_vec_row_check 10646 1.7706 itc_page_rcf_search 9223 1.5340 id_hash_get 9215 1.5326 gen_qsort 8867 1.4748 sqlo_key_part_best 8807 1.4648 itc_param_cmp 8062 1.3409 cmpf_iri64n_iri64n 6820 1.1343 sqlo_in_list 6005 0.9987 dc_iri_id_cmp 5905 0.9821 dk_free_tree 5801 0.9648 box_hash 5509 0.9163 dks_esc_write 5444 0.9054 sql_tree_hash_1 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; For 1000 Mt &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 754331 31.4149 cmpf_iri64n_iri64n_anyn_gt_lt 146165 6.0872 itc_vec_split_search 144795 6.0301 itc_next_set_neq 131671 5.4836 itc_dive_transit 110870 4.6173 itc_page_rcf_search 66780 2.7811 gen_qsort 66434 2.7667 itc_param_cmp 58450 2.4342 itc_bm_vec_row_check 55213 2.2994 dk_alloc 47793 1.9904 cmpf_iri64n_iri64n 44277 1.8440 dc_iri_id_cmp 39489 1.6446 cmpf_int64n 36880 1.5359 dc_append_bytes 36601 1.5243 dv_compare 31286 1.3029 dc_any_value_prefetch 25457 1.0602 itc_next_set 20852 0.8684 box_equal 19895 0.8285 dk_free_tree 19698 0.8203 itc_page_insert_search 19367 0.8066 dc_copy &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top function in both is the compare for an equality of two leading IRIs and a range for the trailing any. This corresponds to the range check in Q5. At the larger scale this is three times more important. At the smaller scale, the share of query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1bf8ca38&quot;&gt;optimization&lt;/a&gt; is about 6.5 times greater. The top function in this category is &lt;code&gt;box_equal&lt;/code&gt; with 5.2% vs 0.87%. The remaining SQL compiler functions are all in proportion to this, totaling 14.3% of the 100 Mt top-20 profile.&lt;/p&gt; &lt;p&gt;From this sample it appears ten times more scale is seven times more database operations. This is not taken into account in the metric. Query compilation is significant at the small end, and no longer significant at 1000 Mt. From these numbers, we could say that &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1be12350&quot;&gt;Virtuoso&lt;/a&gt; is about two times more efficient in terms of database operation throughput at 1000 Mt than at 100 Mt.&lt;/p&gt; &lt;p&gt;We may conclude that different BSBM scales measure different things. The &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x17eb98a0&quot;&gt;TPC&lt;/a&gt; workloads are relatively better in that they have a balance between metric components that stay relatively constant across a large range of scales.&lt;/p&gt; &lt;p&gt;This is not necessarily something that should be fixed in the BSBM Explore mix. We must however take these factors better into account in developing the BI mix.&lt;/p&gt; &lt;p&gt;Let us also remember that BSBM Explore is a relational workload. Future posts in this series will outline how we propose to make RDF-friendlier benchmarks. &lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1a9bcff8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d3e5470&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1de94770&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1ea66470&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f1118d8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1d1c0cd8&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 7): What Does BSBM Explore Measure? &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1aaf4180&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1a957610&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x127e75c8&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1c9400f0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d2c1d68&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ea1fb40&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1c073a10&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1c5541e8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:57:20-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 7): What Does BSBM Explore Measure?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-07#1671</atom:id>
  <atom:published>2011-03-07T23:39:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;We will here analyze what the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1d1a4e30&quot;&gt;BSBM&lt;/a&gt; Explore workload does. This is necessary in order to compare benchmark results at different scales. Historically, BSBM had a Query 6 whose share of the metric approached 100% as scale increased. The present mix does not have this query, but different queries still have different relative importance at different scales.&lt;/p&gt; &lt;p&gt;We will here look at database-running statistics for BSBM at different scales. Finally, we look at &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1c1df888&quot;&gt;CPU&lt;/a&gt; profiles.&lt;/p&gt; &lt;p&gt;But first, let us see what BSBM reads in general. The system is in steady state after around 1500 query mixes; after this the working set does not shift much. After several thousand query mixes, we have:&lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT TOP 10 * FROM sys_d_stat ORDER BY reads DESC;&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS ================= ============================ ========== ======= ======== ======= ========= DB.DBA.&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1c585f20&quot;&gt;RDF&lt;/a&gt;_OBJ RDF_OBJ 114105938 3302150 2 0 3171275 DB.DBA.RDF_QUAD RDF_QUAD 977426773 2041156 0 0 1970712 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 8250414 509239 6 15 491631 DB.DBA.RDF_QUAD RDF_QUAD_POGS 3677233812 183860 0 0 175386 DB.DBA.RDF_IRI RDF_IRI 32 99710 302151 5 95353 DB.DBA.RDF_QUAD RDF_QUAD_OP 30597 51593 168 0 48941 DB.DBA.RDF_QUAD RDF_QUAD_SP 265474 47210 17 0 46078 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 6020 212 3 0 212 DB.DBA.RDF_PREFIX RDF_PREFIX 0 167 16700 0 157 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The first column is the table, then the index, then the number of times a row was found. The fourth number is the count of disk pages read. The last number is the count of 8K buffer pool pages in use for caching pages of the index in question. Note that the index is clustered, i.e., there is no table &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ac97430&quot;&gt;data&lt;/a&gt; structure separate from the index. Most of the reads are for strings or RDF literals. After this comes the &lt;code&gt;PSOG&lt;/code&gt; index for getting a property value given the subject. After this, but much lower, we have lookups of IRI strings given the ID. The index from object value to subject is used the most but the number of pages is small; only a few properties seem to be concerned. The rest is minimal in comparison.&lt;/p&gt; &lt;p&gt;Now let us reset the counts and see what the steady state I/O profile is.&lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT key_stat (key_table, name_part (key_name, 2), &amp;#39;reset&amp;#39;) FROM sys_keys WHERE key_migrate_to IS NULL;&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt;SELECT TOP 10 * FROM sys_d_stat ORDER BY reads DESC;&lt;/code&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; KEY_TABLE INDEX_NAME TOUCHES READS READ_PCT N_DIRTY N_BUFFERS ================= ============================ ========== ======= ======== ======= ========= DB.DBA.RDF_OBJ RDF_OBJ 30155789 79659 0 0 3191391 DB.DBA.RDF_QUAD RDF_QUAD 259008064 8904 0 0 1948707 DB.DBA.RDF_QUAD RDF_QUAD_SP 68002 7730 11 0 53360 DB.DBA.RDF_IRI RDF_IRI 12 5415 41653 6 98804 DB.DBA.RDF_QUAD RDF_QUAD_POGS 975147136 1597 0 0 173459 DB.DBA.RDF_IRI DB_DBA_RDF_IRI_UNQC_RI_ID 2213525 1286 0 17 485093 DB.DBA.RDF_QUAD RDF_QUAD_OP 7999 904 11 0 48568 DB.DBA.RDF_PREFIX DB_DBA_RDF_PREFIX_UNQC_RP_ID 1494 1 0 0 213 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Literal strings dominate. The &lt;code&gt;SP&lt;/code&gt; index is used only for situations where the &lt;code&gt;P&lt;/code&gt; is not specified, i.e., the &lt;code&gt;DESCRIBE&lt;/code&gt; query. Based on this, I/O seems to be attributable mostly to this. The first &lt;code&gt;RDF_IRI&lt;/code&gt; represents translations from string to IRI id; the second represents translations from IRI id to string. The touch count for the first &lt;code&gt;RDF_IRI&lt;/code&gt; is not properly recorded, hence the miss % is out of line. We see &lt;code&gt;SP&lt;/code&gt; missing the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x11b80700&quot;&gt;cache&lt;/a&gt; the most since its use is infrequent in the mix.&lt;/p&gt; &lt;p&gt;We will next look at query processing statistics. For this we introduce a new meter.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;db_activity&lt;/code&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1ddd4bf0&quot;&gt;SQL&lt;/a&gt; function provides a session-by-session cumulative statistic of activity. The fields are: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;rnd&lt;/code&gt; &lt;/b&gt; - Count of &lt;i&gt;random index lookups&lt;/i&gt;. Each first row of a select or insert counts as one, regardless of whether something was found.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;seq&lt;/code&gt; &lt;/b&gt; - Count of &lt;i&gt;sequential rows&lt;/i&gt;. Every move to next row on a cursor counts as 1, regardless of whether conditions match.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same seg&lt;/code&gt; &lt;/b&gt; - For column store only; counts how many times the next row in a vectored join using an index falls in the &lt;i&gt;same segment&lt;/i&gt; as the previous random access. A segment is the stretch of rows between entries in the sparse top level index on the column projection.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same pg&lt;/code&gt; &lt;/b&gt; - Counts how many times a vectored index join finds the next match on the &lt;i&gt;same page&lt;/i&gt; as the previous one.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;same par&lt;/code&gt; &lt;/b&gt; - Counts how many times the next lookup in a vectored index join falls on a different page than the previous but still under the &lt;i&gt;same parent&lt;/i&gt;.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;disk&lt;/code&gt; &lt;/b&gt; - Counts how many &lt;i&gt;disk reads&lt;/i&gt; were made, including any speculative reads initiated.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;spec disk&lt;/code&gt; &lt;/b&gt; - Counts &lt;i&gt;speculative disk reads&lt;/i&gt;.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;messages&lt;/code&gt; &lt;/b&gt; - Counts &lt;i&gt;cluster interconnect messages&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;B (KB, MB, GB)&lt;/code&gt; &lt;/b&gt; - is the &lt;i&gt;total length&lt;/i&gt; of the cluster interconnect messages.&lt;/li&gt; &lt;li&gt; &lt;b&gt;&lt;code&gt;fork&lt;/code&gt; &lt;/b&gt; - Counts how many times a &lt;i&gt;thread was forked (started)&lt;/i&gt; for query parallelization.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The numbers are given with 4 significant digits and a scale suffix. G is 10^9 (1,000,000,000); M is 10^6 (1,000,000), K is 10^3 (1,000).&lt;/p&gt; &lt;p&gt;We run 2000 query mixes with 16 Users. The special &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1ebdef18&quot;&gt;http&lt;/a&gt;&lt;/code&gt; account keeps a cumulative account of all activity on web server threads.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;code&gt;SELECT db_activity (2, &amp;#39;http&amp;#39;);&lt;/code&gt; &lt;/p&gt; &lt;p&gt; &lt;code&gt;1.674G rnd  3.223G seq      0 same seg  1.286G same pg  314.8M same par  6.186M disk  6.461M spec disk      0B /     0 messages  298.6K fork&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;We see that random access dominates. The &lt;code&gt;seq&lt;/code&gt; number is about twice the &lt;code&gt;rnd&lt;/code&gt; number, meaning that the average random lookup gets two rows. Getting a row at random obviously takes more time than getting the next row. Since the index used is row-wise, the &lt;code&gt;same seg&lt;/code&gt; is 0; the &lt;code&gt;same pg&lt;/code&gt; indicates that 77% of the random accesses fall on the same page as the previous random access; most of the remaining random accesses fall under the same parent as the previous one.&lt;/p&gt; &lt;p&gt;There are more speculative reads than disk reads which is an artifact of counting some concurrently speculated reads twice. This does indicate that speculative reads dominate. This is because a large part of the run was in the warm-up state with aggressive speculative reading. We reset the counts and run another 2000 mixes.&lt;/p&gt; &lt;p&gt;Now let us look at the same reading after 2000 mixes, 16 user at 100Mt.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;code&gt;234.3M rnd  420.5M seq      0 same seg   188.8M same pg  29.09M same par  808.9K disk  919.9K spec disk      0B /      0 messages  76K fork&lt;/code&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;We note that the ratios between the random and sequential and same page/parent counts are about the same. The sequential number looks to be even a bit smaller in proportion. The count of random accesses for the 100Mt run is 14% of the count for the 1000Mt run. The count of query parallelization threads is also much lower since it is worthwhile to schedule a new thread only if there are at least a few thousand operations to perform on it. The precise criterion for making a thread is that according to the cost model guess, the thread must have at least 5ms worth of work.&lt;/p&gt; &lt;p&gt;We note that the 100 Mt throughput is a little over three-times that of the 1000 Mt throughput, as reported before. We might justifiably ask why the 100 Mt run is not seven-times faster instead, for this much less work. &lt;/p&gt; &lt;p&gt;We note that for one-off random access, it makes no real difference whether the tree has 100 M or 1000 M rows; this translates to roughly 27 vs 30 comparisons, so the depth of the tree is not a factor &lt;i&gt;per se&lt;/i&gt;. Besides, vectoring makes the tree often look only one or two levels deep, so the total row count matters even less there.&lt;/p&gt; &lt;p&gt;To elucidate this last question, we look at the CPU profiles. We take an &lt;a href=&quot;http://oprofile.sourceforge.net/about/&quot; id=&quot;link-id0x1efb3360&quot;&gt;oprofile&lt;/a&gt; of 100 Single User mixes at both scales.&lt;/p&gt; For 100 Mt: &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 61161 10.1723 cmpf_iri64n_iri64n_anyn_gt_lt 31321 5.2093 box_equal 19027 3.1646 sqlo_parse_tree_has_node 15905 2.6453 dk_alloc 15647 2.6024 itc_next_set_neq 12702 2.1126 itc_vec_split_search 12487 2.0768 itc_dive_transit 11450 1.9044 itc_bm_vec_row_check 10646 1.7706 itc_page_rcf_search 9223 1.5340 id_hash_get 9215 1.5326 gen_qsort 8867 1.4748 sqlo_key_part_best 8807 1.4648 itc_param_cmp 8062 1.3409 cmpf_iri64n_iri64n 6820 1.1343 sqlo_in_list 6005 0.9987 dc_iri_id_cmp 5905 0.9821 dk_free_tree 5801 0.9648 box_hash 5509 0.9163 dks_esc_write 5444 0.9054 sql_tree_hash_1 &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; For 1000 Mt &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 754331 31.4149 cmpf_iri64n_iri64n_anyn_gt_lt 146165 6.0872 itc_vec_split_search 144795 6.0301 itc_next_set_neq 131671 5.4836 itc_dive_transit 110870 4.6173 itc_page_rcf_search 66780 2.7811 gen_qsort 66434 2.7667 itc_param_cmp 58450 2.4342 itc_bm_vec_row_check 55213 2.2994 dk_alloc 47793 1.9904 cmpf_iri64n_iri64n 44277 1.8440 dc_iri_id_cmp 39489 1.6446 cmpf_int64n 36880 1.5359 dc_append_bytes 36601 1.5243 dv_compare 31286 1.3029 dc_any_value_prefetch 25457 1.0602 itc_next_set 20852 0.8684 box_equal 19895 0.8285 dk_free_tree 19698 0.8203 itc_page_insert_search 19367 0.8066 dc_copy &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The top function in both is the compare for an equality of two leading IRIs and a range for the trailing any. This corresponds to the range check in Q5. At the larger scale this is three times more important. At the smaller scale, the share of query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1ea77ab8&quot;&gt;optimization&lt;/a&gt; is about 6.5 times greater. The top function in this category is &lt;code&gt;box_equal&lt;/code&gt; with 5.2% vs 0.87%. The remaining SQL compiler functions are all in proportion to this, totaling 14.3% of the 100 Mt top-20 profile.&lt;/p&gt; &lt;p&gt;From this sample it appears ten times more scale is seven times more database operations. This is not taken into account in the metric. Query compilation is significant at the small end, and no longer significant at 1000 Mt. From these numbers, we could say that &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c819148&quot;&gt;Virtuoso&lt;/a&gt; is about two times more efficient in terms of database operation throughput at 1000 Mt than at 100 Mt.&lt;/p&gt; &lt;p&gt;We may conclude that different BSBM scales measure different things. The &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1f0ffb40&quot;&gt;TPC&lt;/a&gt; workloads are relatively better in that they have a balance between metric components that stay relatively constant across a large range of scales.&lt;/p&gt; &lt;p&gt;This is not necessarily something that should be fixed in the BSBM Explore mix. We must however take these factors better into account in developing the BI mix.&lt;/p&gt; &lt;p&gt;Let us also remember that BSBM Explore is a relational workload. Future posts in this series will outline how we propose to make RDF-friendlier benchmarks. &lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1a9bcff8&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d3e5470&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1de94770&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1ea66470&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f1118d8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1d1c0cd8&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 7): What Does BSBM Explore Measure? &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1aaf4180&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1a957610&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x127e75c8&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1c9400f0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aab822515c8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aabf7235508&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aabdcfe7418&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aab716d53d8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:43.982705-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 6): BSBM and I/O, continued</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-07#1670</atom:id>
  <atom:published>2011-03-07T22:36:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the words of Jim Gray, disks have become tapes. By this he means that a disk is really only good for sequential access. For this reason, the SSD extent read ahead was incomparably better. We note that in the experiment, every page in the general area of the database the experiment touched would in time be touched, and that the whole working set would end up in memory. Therefore no speculative read would be wasted. Therefore it stands to reason to read whole extents.&lt;/p&gt; &lt;p&gt;So I changed the default behavior to use a very long window for triggering read-ahead as long as the buffer pool was not full. After the initial filling of the buffer pool, the read ahead would require more temporal locality before kicking in. &lt;/p&gt; &lt;p&gt;Still, the scheme was not really good since the rest of the extent would go for background-read and the triggering read would be done right then, leading to extra seeks. Well, this is good for latency but bad for throughput. So I changed this too, going to an &amp;quot;elevator only&amp;quot; scheme where reads that triggered read-ahead would go with the read-ahead batch. Reads that did not trigger read-ahead would still be done right in place, thus favoring latency but breaking any sequentiality with its attendant 10+ ms penalty.&lt;/p&gt; &lt;p&gt;We keep in mind that the test we target is &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x17c88010&quot;&gt;BSBM&lt;/a&gt; warm-up time, which is purely a throughput business. One could have timeouts and could penalize queries that sacrificed too much latency to throughput.&lt;/p&gt; &lt;p&gt;We note that even for this very simple metric, just reading the allocated database pages from start to end is not good since a large number of pages in fact never get read during a run.&lt;/p&gt; &lt;p&gt;We further note that the vectored read-ahead without any speculation will be useful as-is for cases with few threads and striping, since at least one thread&amp;#39;s random I/Os get to go to multiple threads. The benefit is less in multiuser situations where disks are randomly busy anyhow. &lt;/p&gt; &lt;p&gt;In the previous I/O experiments, we saw that with vectored read ahead and no speculation, there were around 50 pages waiting for I/O at all times. With an easily-triggered extent read-ahead, there were around 4000 pages waiting. The more pages are waiting for I/O, the greater the benefit from the elevator algorithm of servicing I/O in order of file offset. &lt;/p&gt; &lt;p&gt;In &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c51fae0&quot;&gt;Virtuoso&lt;/a&gt; 5 we had a trick that would, if the buffer pool was not full, speculatively read every uncached sibling of every index tree node it visited. This filled the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1d6a0cf0&quot;&gt;cache&lt;/a&gt; quite fast, but was useless after the cache was full. The extent read ahead first implemented in 6 was less aggressive, but would continue working with full cache and did in fact help with shifts in the working set.&lt;/p&gt; &lt;p&gt;The next logical step is to combine the vector and extent read-ahead modes. We see what pages we will be getting, then take the distinct extents; if we have been to this extent within the time window, we just add all the uncached allocated pages of the extent to the batch.&lt;/p&gt; &lt;p&gt;With this setting, especially at the start of the run, we get large read-ahead batches and maintain I/O queues of 5000 to 20000 pages. The SSD starting time drops to about 120 seconds from cold start to reach 1200% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1d295448&quot;&gt;CPU&lt;/a&gt;. We see transfer rates of up to 150 MB/s per SSD. With HDDs, we see transfer rates around 14 MB/s per drive, mostly reading chunks of an average of seventy-one (71) 8K pages.&lt;/p&gt; &lt;p&gt;The BSBM workload does not offer better possibilities for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1aca8b40&quot;&gt;optimization&lt;/a&gt;, short of pre-reading the whole database, which is not practical at large scales. &lt;/p&gt; &lt;h2&gt;Some Details&lt;/h2&gt; &lt;p&gt;First we start from cold disk, with and without mandatory read of the whole extent on the touch.&lt;/p&gt; &lt;p&gt;Without any speculation but with vectored read-ahead, here are the times for the first 11 query mixes:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 151560.82 ms, total: 151718 ms 1: 179589.08 ms, total: 179648 ms 2: 71974.49 ms, total: 72017 ms 3: 102701.73 ms, total: 102729 ms 4: 58834.41 ms, total: 58856 ms 5: 65926.34 ms, total: 65944 ms 6: 68244.69 ms, total: 68274 ms 7: 39197.15 ms, total: 39215 ms 8: 45654.93 ms, total: 45674 ms 9: 34850.30 ms, total: 34878 ms 10: 100061.30 ms, total: 100079 ms &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The average CPU during this time was 5%. The best read throughput was 2.5 MB/s; the average was 1.35 MB/s. The average disk read was 16 ms. &lt;/p&gt; &lt;p&gt;With vectored read-ahead and full extents only, i.e., max speculation:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 178854.23 ms, total: 179034 ms 1: 110826.68 ms, total: 110887 ms 2: 19896.11 ms, total: 19941 ms 3: 36724.43 ms, total: 36753 ms 4: 21253.70 ms, total: 21285 ms 5: 18417.73 ms, total: 18439 ms 6: 21668.92 ms, total: 21690 ms 7: 12236.49 ms, total: 12267 ms 8: 14922.74 ms, total: 14945 ms 9: 11502.96 ms, total: 11523 ms 10: 15762.34 ms, total: 15792 ms ... 90: 1747.62 ms, total: 1761 ms 91: 1701.01 ms, total: 1714 ms 92: 1300.62 ms, total: 1318 ms 93: 1873.15 ms, total: 1886 ms 94: 1508.24 ms, total: 1524 ms 95: 1748.15 ms, total: 1761 ms 96: 2076.92 ms, total: 2090 ms 97: 2199.38 ms, total: 2212 ms 98: 2305.75 ms, total: 2319 ms 99: 1771.91 ms, total: 1784 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 1.3006s / 178.8542s Elapsed runtime: 872.993 seconds QMpH: 412.374 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak throughput is 91 MB/s, with average around 50 MB/s; CPU average around 50%.&lt;/p&gt; &lt;p&gt;We note that the latency of the first query mix is hardly greater than in the non-speculative run, but starting from mix 3 the speed is clearly better. &lt;/p&gt; &lt;p&gt;Then the same with cold SSDs. First with no speculation:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 5177.68 ms, total: 5302 ms 1: 2570.16 ms, total: 2614 ms 2: 1353.06 ms, total: 1391 ms 3: 1957.63 ms, total: 1978 ms 4: 1371.13 ms, total: 1386 ms 5: 1765.55 ms, total: 1781 ms 6: 1658.23 ms, total: 1673 ms 7: 1273.87 ms, total: 1289 ms 8: 1355.19 ms, total: 1380 ms 9: 1152.78 ms, total: 1167 ms 10: 1787.91 ms, total: 1802 ms ... 90: 1116.25 ms, total: 1128 ms 91: 989.50 ms, total: 1001 ms 92: 833.24 ms, total: 844 ms 93: 1137.83 ms, total: 1150 ms 94: 969.47 ms, total: 982 ms 95: 1138.04 ms, total: 1149 ms 96: 1155.98 ms, total: 1168 ms 97: 1178.15 ms, total: 1193 ms 98: 1120.18 ms, total: 1132 ms 99: 1013.16 ms, total: 1025 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 0.8201s / 5.1777s Elapsed runtime: 127.555 seconds QMpH: 2822.321 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak I/O is 45 MB/s, with average 28.3 MB/s; CPU average is 168%.&lt;/p&gt; &lt;p&gt;Now, SSDs with max speculation.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 44670.34 ms, total: 44809 ms 1: 18490.44 ms, total: 18548 ms 2: 7306.12 ms, total: 7353 ms 3: 9452.66 ms, total: 9485 ms 4: 5648.56 ms, total: 5668 ms 5: 5493.21 ms, total: 5511 ms 6: 5951.48 ms, total: 5970 ms 7: 3815.59 ms, total: 3834 ms 8: 4560.71 ms, total: 4579 ms 9: 3523.74 ms, total: 3543 ms 10: 4724.04 ms, total: 4741 ms ... 90: 673.53 ms, total: 685 ms 91: 534.62 ms, total: 545 ms 92: 730.81 ms, total: 742 ms 93: 1358.14 ms, total: 1370 ms 94: 1098.64 ms, total: 1110 ms 95: 1232.20 ms, total: 1243 ms 96: 1259.57 ms, total: 1273 ms 97: 1298.95 ms, total: 1310 ms 98: 1156.01 ms, total: 1166 ms 99: 1025.45 ms, total: 1034 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 0.4725s / 44.6703s Elapsed runtime: 269.323 seconds QMpH: 1336.683 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak I/O is 339 MB/s, with average 192 MB/s; average CPU is 121%.&lt;/p&gt; &lt;p&gt;The above was measured with the read-ahead thread doing single-page reads. We repeated the test with merging reads with small differences. The max IO was 353 MB/s, and average 173 MB/s; average CPU 113%.&lt;/p&gt; &lt;p&gt;We see that the start latency is quite a bit longer than without speculation and the CPU % is lower due to higher latency of individual I/O. The I/O rate is fair. We would expect more throughput however. &lt;/p&gt; &lt;p&gt;We find that a supposedly better use of the API, doing single requests of up to 100 pages instead of consecutive requests of 1 page, does not make a lot of difference. The peak I/O is a bit higher; overall throughput is a bit lower.&lt;/p&gt; &lt;p&gt;We will have to retry these experiments with a better controller. We have at no point seen anything like the 50K 4KB random I/Os promised for the SSDs by the manufacturer. We know for a fact that the controller gives about 700 MB/s sequential read with &lt;code&gt;cat file /dev/null&lt;/code&gt; and two drives busy. With 4 drives busy, this does not get better. The best 30 second stretch we saw in a multiuser BSBM warm-up was 590 MB/s, which is consistent with the &lt;code&gt;cat&lt;/code&gt; to &lt;code&gt;/dev/null&lt;/code&gt; figure. We will later test with 8 SSDs with better controllers. &lt;/p&gt; &lt;p&gt;Note that the average I/O and CPU are averages over 30 second measurement windows; thus for short running tests, there is some error from the window during which the activity ended. &lt;/p&gt; &lt;p&gt;Let us now see if we can make a BSBM instance warm up from disk in a reasonable time. We run 16 users with max speculation. We note that after reading 7,500,000 buffers we are not entirely free of disk. The max speculation read-ahead filled the cache in 17 minutes, with an average of 58 MB/s. After the cache is filled, the system shifts to a more conservative policy on extent read-ahead; one which in fact never gets triggered with the BSBM &lt;i&gt;Explore&lt;/i&gt; in steady state. The vectored read-ahead is kept on since this by itself does not read pages that are not needed. However, the vectored read-ahead does not run either, because the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c9bca60&quot;&gt;data&lt;/a&gt; that is accessed in larger batches is already in memory. Thus there remains a trickle of an average 0.49 MB/s from disk. This keeps CPU around 350%. With SSDs, the trickle is about 1.5 MB/s and CPU is around 1300% in steady state. Thus SSDs give approximately triple the throughput in a situation where there is a tiny amount of continuous random disk access. The disk access in question is 80% for retrieving &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1c05e280&quot;&gt;RDF&lt;/a&gt; literal strings, presumably on behalf of the &lt;code&gt;DESCRIBE&lt;/code&gt; query in the mix. This query touches things no other query touches and does so one subject at a time, in a way that can neither be anticipated nor optimized.&lt;/p&gt; &lt;p&gt;The Virtuoso 7 column store will deal with this better because it is more space efficient overall. If we apply stream-compression to literals, these will go in under half the space, while quads will go in maybe one-quarter the space. Thus 3000 Mt all from memory should be possible with 72 GB RAM. 1000 Mt row-wise did fit in in 72 GB RAM except for the random literals accessed by the the &lt;code&gt;DESCRIBE&lt;/code&gt;. This alone drops throughput to under a third of the memory-only throughput if using HDDs. SSDs, on the other hand, can largely neutralize this effect.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;We have looked at basics of I/O. SSDs have been found to be a readily available solution to I/O bottlenecks without need for reconfiguration or complex I/O policies. We have been able to get a decent read rate under conditions of server warm-up or shift of working set even with HDDs.&lt;/p&gt; &lt;p&gt;More advanced I/O matters will be covered with the column store. We note that the techniques discussed here apply identically to rows and columns.&lt;/p&gt; &lt;p&gt;As concerns BSBM, it seems appropriate to include a warm-up time. In practice, this means that the store just must eagerly pre-read. This is not hard to do and can be quite useful.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1b4342b0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d3e7388&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x153c7ba8&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1da11d98&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1d25d630&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 6): BSBM and I/O, continued &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1f1f5ee8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1cd44938&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1d51f848&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x13d333c0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1e77a5e8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ea1fb40&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e7786c8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f8a37f8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1c69e018&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:57:06.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 6): BSBM and I/O, continued</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-07#1669</atom:id>
  <atom:published>2011-03-07T22:36:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the words of Jim Gray, disks have become tapes. By this he means that a disk is really only good for sequential access. For this reason, the SSD extent read ahead was incomparably better. We note that in the experiment, every page in the general area of the database the experiment touched would in time be touched, and that the whole working set would end up in memory. Therefore no speculative read would be wasted. Therefore it stands to reason to read whole extents.&lt;/p&gt; &lt;p&gt;So I changed the default behavior to use a very long window for triggering read-ahead as long as the buffer pool was not full. After the initial filling of the buffer pool, the read ahead would require more temporal locality before kicking in. &lt;/p&gt; &lt;p&gt;Still, the scheme was not really good since the rest of the extent would go for background-read and the triggering read would be done right then, leading to extra seeks. Well, this is good for latency but bad for throughput. So I changed this too, going to an &amp;quot;elevator only&amp;quot; scheme where reads that triggered read-ahead would go with the read-ahead batch. Reads that did not trigger read-ahead would still be done right in place, thus favoring latency but breaking any sequentiality with its attendant 10+ ms penalty.&lt;/p&gt; &lt;p&gt;We keep in mind that the test we target is &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1beac870&quot;&gt;BSBM&lt;/a&gt; warm-up time, which is purely a throughput business. One could have timeouts and could penalize queries that sacrificed too much latency to throughput.&lt;/p&gt; &lt;p&gt;We note that even for this very simple metric, just reading the allocated database pages from start to end is not good since a large number of pages in fact never get read during a run.&lt;/p&gt; &lt;p&gt;We further note that the vectored read-ahead without any speculation will be useful as-is for cases with few threads and striping, since at least one thread&amp;#39;s random I/Os get to go to multiple threads. The benefit is less in multiuser situations where disks are randomly busy anyhow. &lt;/p&gt; &lt;p&gt;In the previous I/O experiments, we saw that with vectored read ahead and no speculation, there were around 50 pages waiting for I/O at all times. With an easily-triggered extent read-ahead, there were around 4000 pages waiting. The more pages are waiting for I/O, the greater the benefit from the elevator algorithm of servicing I/O in order of file offset. &lt;/p&gt; &lt;p&gt;In &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x117fd820&quot;&gt;Virtuoso&lt;/a&gt; 5 we had a trick that would, if the buffer pool was not full, speculatively read every uncached sibling of every index tree node it visited. This filled the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1de04030&quot;&gt;cache&lt;/a&gt; quite fast, but was useless after the cache was full. The extent read ahead first implemented in 6 was less aggressive, but would continue working with full cache and did in fact help with shifts in the working set.&lt;/p&gt; &lt;p&gt;The next logical step is to combine the vector and extent read-ahead modes. We see what pages we will be getting, then take the distinct extents; if we have been to this extent within the time window, we just add all the uncached allocated pages of the extent to the batch.&lt;/p&gt; &lt;p&gt;With this setting, especially at the start of the run, we get large read-ahead batches and maintain I/O queues of 5000 to 20000 pages. The SSD starting time drops to about 120 seconds from cold start to reach 1200% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x180fa748&quot;&gt;CPU&lt;/a&gt;. We see transfer rates of up to 150 MB/s per SSD. With HDDs, we see transfer rates around 14 MB/s per drive, mostly reading chunks of an average of seventy-one (71) 8K pages.&lt;/p&gt; &lt;p&gt;The BSBM workload does not offer better possibilities for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1e0f7078&quot;&gt;optimization&lt;/a&gt;, short of pre-reading the whole database, which is not practical at large scales. &lt;/p&gt; &lt;h2&gt;Some Details&lt;/h2&gt; &lt;p&gt;First we start from cold disk, with and without mandatory read of the whole extent on the touch.&lt;/p&gt; &lt;p&gt;Without any speculation but with vectored read-ahead, here are the times for the first 11 query mixes:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 151560.82 ms, total: 151718 ms 1: 179589.08 ms, total: 179648 ms 2: 71974.49 ms, total: 72017 ms 3: 102701.73 ms, total: 102729 ms 4: 58834.41 ms, total: 58856 ms 5: 65926.34 ms, total: 65944 ms 6: 68244.69 ms, total: 68274 ms 7: 39197.15 ms, total: 39215 ms 8: 45654.93 ms, total: 45674 ms 9: 34850.30 ms, total: 34878 ms 10: 100061.30 ms, total: 100079 ms &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The average CPU during this time was 5%. The best read throughput was 2.5 MB/s; the average was 1.35 MB/s. The average disk read was 16 ms. &lt;/p&gt; &lt;p&gt;With vectored read-ahead and full extents only, i.e., max speculation:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 178854.23 ms, total: 179034 ms 1: 110826.68 ms, total: 110887 ms 2: 19896.11 ms, total: 19941 ms 3: 36724.43 ms, total: 36753 ms 4: 21253.70 ms, total: 21285 ms 5: 18417.73 ms, total: 18439 ms 6: 21668.92 ms, total: 21690 ms 7: 12236.49 ms, total: 12267 ms 8: 14922.74 ms, total: 14945 ms 9: 11502.96 ms, total: 11523 ms 10: 15762.34 ms, total: 15792 ms ... 90: 1747.62 ms, total: 1761 ms 91: 1701.01 ms, total: 1714 ms 92: 1300.62 ms, total: 1318 ms 93: 1873.15 ms, total: 1886 ms 94: 1508.24 ms, total: 1524 ms 95: 1748.15 ms, total: 1761 ms 96: 2076.92 ms, total: 2090 ms 97: 2199.38 ms, total: 2212 ms 98: 2305.75 ms, total: 2319 ms 99: 1771.91 ms, total: 1784 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 1.3006s / 178.8542s Elapsed runtime: 872.993 seconds QMpH: 412.374 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak throughput is 91 MB/s, with average around 50 MB/s; CPU average around 50%.&lt;/p&gt; &lt;p&gt;We note that the latency of the first query mix is hardly greater than in the non-speculative run, but starting from mix 3 the speed is clearly better. &lt;/p&gt; &lt;p&gt;Then the same with cold SSDs. First with no speculation:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 5177.68 ms, total: 5302 ms 1: 2570.16 ms, total: 2614 ms 2: 1353.06 ms, total: 1391 ms 3: 1957.63 ms, total: 1978 ms 4: 1371.13 ms, total: 1386 ms 5: 1765.55 ms, total: 1781 ms 6: 1658.23 ms, total: 1673 ms 7: 1273.87 ms, total: 1289 ms 8: 1355.19 ms, total: 1380 ms 9: 1152.78 ms, total: 1167 ms 10: 1787.91 ms, total: 1802 ms ... 90: 1116.25 ms, total: 1128 ms 91: 989.50 ms, total: 1001 ms 92: 833.24 ms, total: 844 ms 93: 1137.83 ms, total: 1150 ms 94: 969.47 ms, total: 982 ms 95: 1138.04 ms, total: 1149 ms 96: 1155.98 ms, total: 1168 ms 97: 1178.15 ms, total: 1193 ms 98: 1120.18 ms, total: 1132 ms 99: 1013.16 ms, total: 1025 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 0.8201s / 5.1777s Elapsed runtime: 127.555 seconds QMpH: 2822.321 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak I/O is 45 MB/s, with average 28.3 MB/s; CPU average is 168%.&lt;/p&gt; &lt;p&gt;Now, SSDs with max speculation.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; 0: 44670.34 ms, total: 44809 ms 1: 18490.44 ms, total: 18548 ms 2: 7306.12 ms, total: 7353 ms 3: 9452.66 ms, total: 9485 ms 4: 5648.56 ms, total: 5668 ms 5: 5493.21 ms, total: 5511 ms 6: 5951.48 ms, total: 5970 ms 7: 3815.59 ms, total: 3834 ms 8: 4560.71 ms, total: 4579 ms 9: 3523.74 ms, total: 3543 ms 10: 4724.04 ms, total: 4741 ms ... 90: 673.53 ms, total: 685 ms 91: 534.62 ms, total: 545 ms 92: 730.81 ms, total: 742 ms 93: 1358.14 ms, total: 1370 ms 94: 1098.64 ms, total: 1110 ms 95: 1232.20 ms, total: 1243 ms 96: 1259.57 ms, total: 1273 ms 97: 1298.95 ms, total: 1310 ms 98: 1156.01 ms, total: 1166 ms 99: 1025.45 ms, total: 1034 ms Scale factor: 2848260 Number of warmup runs: 0 Seed: 808080 Number of query mix runs (without warmups): 100 times min/max Querymix runtime: 0.4725s / 44.6703s Elapsed runtime: 269.323 seconds QMpH: 1336.683 query mixes per hour &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The peak I/O is 339 MB/s, with average 192 MB/s; average CPU is 121%.&lt;/p&gt; &lt;p&gt;The above was measured with the read-ahead thread doing single-page reads. We repeated the test with merging reads with small differences. The max IO was 353 MB/s, and average 173 MB/s; average CPU 113%.&lt;/p&gt; &lt;p&gt;We see that the start latency is quite a bit longer than without speculation and the CPU % is lower due to higher latency of individual I/O. The I/O rate is fair. We would expect more throughput however. &lt;/p&gt; &lt;p&gt;We find that a supposedly better use of the API, doing single requests of up to 100 pages instead of consecutive requests of 1 page, does not make a lot of difference. The peak I/O is a bit higher; overall throughput is a bit lower.&lt;/p&gt; &lt;p&gt;We will have to retry these experiments with a better controller. We have at no point seen anything like the 50K 4KB random I/Os promised for the SSDs by the manufacturer. We know for a fact that the controller gives about 700 MB/s sequential read with &lt;code&gt;cat file /dev/null&lt;/code&gt; and two drives busy. With 4 drives busy, this does not get better. The best 30 second stretch we saw in a multiuser BSBM warm-up was 590 MB/s, which is consistent with the &lt;code&gt;cat&lt;/code&gt; to &lt;code&gt;/dev/null&lt;/code&gt; figure. We will later test with 8 SSDs with better controllers. &lt;/p&gt; &lt;p&gt;Note that the average I/O and CPU are averages over 30 second measurement windows; thus for short running tests, there is some error from the window during which the activity ended. &lt;/p&gt; &lt;p&gt;Let us now see if we can make a BSBM instance warm up from disk in a reasonable time. We run 16 users with max speculation. We note that after reading 7,500,000 buffers we are not entirely free of disk. The max speculation read-ahead filled the cache in 17 minutes, with an average of 58 MB/s. After the cache is filled, the system shifts to a more conservative policy on extent read-ahead; one which in fact never gets triggered with the BSBM &lt;i&gt;Explore&lt;/i&gt; in steady state. The vectored read-ahead is kept on since this by itself does not read pages that are not needed. However, the vectored read-ahead does not run either, because the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d7674e8&quot;&gt;data&lt;/a&gt; that is accessed in larger batches is already in memory. Thus there remains a trickle of an average 0.49 MB/s from disk. This keeps CPU around 350%. With SSDs, the trickle is about 1.5 MB/s and CPU is around 1300% in steady state. Thus SSDs give approximately triple the throughput in a situation where there is a tiny amount of continuous random disk access. The disk access in question is 80% for retrieving &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1c4adda0&quot;&gt;RDF&lt;/a&gt; literal strings, presumably on behalf of the &lt;code&gt;DESCRIBE&lt;/code&gt; query in the mix. This query touches things no other query touches and does so one subject at a time, in a way that can neither be anticipated nor optimized.&lt;/p&gt; &lt;p&gt;The Virtuoso 7 column store will deal with this better because it is more space efficient overall. If we apply stream-compression to literals, these will go in under half the space, while quads will go in maybe one-quarter the space. Thus 3000 Mt all from memory should be possible with 72 GB RAM. 1000 Mt row-wise did fit in in 72 GB RAM except for the random literals accessed by the the &lt;code&gt;DESCRIBE&lt;/code&gt;. This alone drops throughput to under a third of the memory-only throughput if using HDDs. SSDs, on the other hand, can largely neutralize this effect.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;We have looked at basics of I/O. SSDs have been found to be a readily available solution to I/O bottlenecks without need for reconfiguration or complex I/O policies. We have been able to get a decent read rate under conditions of server warm-up or shift of working set even with HDDs.&lt;/p&gt; &lt;p&gt;More advanced I/O matters will be covered with the column store. We note that the techniques discussed here apply identically to rows and columns.&lt;/p&gt; &lt;p&gt;As concerns BSBM, it seems appropriate to include a warm-up time. In practice, this means that the store just must eagerly pre-read. This is not hard to do and can be quite useful.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1b4342b0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1d3e7388&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x153c7ba8&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1da11d98&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1d25d630&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 6): BSBM and I/O, continued &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1f1f5ee8&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1cd44938&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1d51f848&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x13d333c0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1e77a5e8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aabddff1f28&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aabf6b82c78&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aabf4cb7f28&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aabdfe82538&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:52.436400-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-07#1668</atom:id>
  <atom:published>2011-03-07T19:17:36Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the context of database benchmarks we cannot ignore I/O, as pretty much has been done so far by &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1ea17348&quot;&gt;BSBM&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;There are two approaches:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;run twice or otherwise make sure one runs from memory and forget about I/O, or&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;make rules and metrics for warm-up.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;We will see if the second is possible with BSBM.&lt;/p&gt; &lt;p&gt;From this starting point, we look at various ways of scheduling I/O in &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x125c4f90&quot;&gt;Virtuoso&lt;/a&gt; using a 1000 Mt BSBM database on sets of each of HDDs (hard disk devices) and SSDs (solid-state storage devices). We will see that SSDs in this specific application can make a significant difference. &lt;/p&gt; &lt;p&gt;In this test we have the same 4 stripes of a 1000 Mt BSBM database on each of two storage arrays.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;9&quot; align=&quot;center&quot;&gt;Storage Arrays&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; Type &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Quantity &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Maker &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Size &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Speed &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Interface speed &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Controller &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Drive &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1cab1358&quot;&gt;Cache&lt;/a&gt; &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; RAID &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt; SSD &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; Crucial &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 128 GB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; N/A &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 6Gbit SATA &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; RocketRaid 640 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 128 MB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; None &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt; HDD &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; Samsung &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1000 GB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 7200 RPM &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 3Gbit SATA &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x1ab6edd8&quot;&gt;Intel&lt;/a&gt; ICH on Supermicro motherboard &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16 MB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; None &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We make sure that the files are not in OS cache by filling it with other big files, reading a total of 120 GB off SSDs with &lt;code&gt;`cat file &amp;gt; /dev/null`&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;The configuration files are as in the report on the 1000 Mt run. We note as significant that we have a few file descriptors for each stripe, and that read-ahead for each is handled by its own thread.&lt;/p&gt; &lt;p&gt;Two different read-ahead schemes are used: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;With 6 Single, if a 2MB extent gets a second read within a given time after the first, the whole extent is scheduled for background read.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;With 7 Single, as an index search is vectored, we know a large number of values to fetch at one time and these values are sorted into an ascending sequence. Therefore, by looking at a node in an index tree, we can determine which sub-trees will be accessed and schedule these for read-ahead, skipping any that will not be accessed.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In either model, a sequential scan touching more than a couple of consecutive index leaf pages triggers a read-ahead, to the end of the scanned range or to the next 3000 index leaves, whichever comes first. However, there are no sequential scans of significant size in BSBM.&lt;/p&gt; &lt;p&gt;There are a few different possibilities for the physical I/O: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Using a separate read system call for each page. There may be several open file descriptors on a file so that many such calls can proceed concurrently on different threads; the OS will order the operations.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A thread finds it needs a page and reads it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Using Unix asynchronous I/O, &lt;code&gt;aio.h&lt;/code&gt;, with the &lt;code&gt;aio_*&lt;/code&gt; and &lt;code&gt;lio_listio&lt;/code&gt; functions.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Using single-read system calls for adjacent pages. In this way, the drive sees longer requests and should give better throughput. If there are short gaps in the sequence, the gaps are also read, wasting bandwidth but saving on latency.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The two latter apply only to bulk I/O that are scheduled on background threads, one per independently-addressable device (HDD, SSD, or RAID-set). These bulk-reads operate on an elevator model, keeping a sorted queue of things to read or write and moving through this queue from start to end. At any time, the queue may get more work from other threads.&lt;/p&gt; &lt;p&gt;There is a further choice when seeing single-page random requests. They can either go to the elevator or they can be done in place. Taking the elevator is presumably good for throughput but bad for latency. In general, the elevator should have a notion of fairness; these matters are discussed in the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x1f62abb8&quot;&gt;CWI collaborative scan paper&lt;/a&gt;. Here we do not have long queries, so we do not have to talk about elevator policies or scan sharing; there are no scans. We may touch on these questions later with the column store, the BSBM BI mix, and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1bfb17c0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1e76bfc8&quot;&gt;H&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;While we may know principles, I/O has always given us surprises; the only way to optimize this is to measure.&lt;/p&gt; &lt;p&gt;The metric we try to optimize here is the time it takes for a multiuser BSBM run starting from cold cache to get to 1200% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1d7b1d10&quot;&gt;CPU&lt;/a&gt;. When running from memory, the CPU is around 1350% for the system in question. &lt;/p&gt; &lt;p&gt;This depends on getting I/O throughput, which in turn depends on having a lot of speculative reading since the workload itself does not give any long stretches to read. &lt;/p&gt; &lt;p&gt;The test driver is set at 16 clients, and the run continues for 2000 query mixes or until target throughput is reached. Target throughput is deemed reached after the first 20 second stretch with CPU at 1200% or higher.&lt;/p&gt; &lt;p&gt;The meter is a stored procedure that records the CPU time, count of reads, cumulative elapsed time spent waiting for I/O, and other metrics. The code for this procedure (for 7 Single; this file will not work on Virtuoso 6 or earlier) is &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/ldmeter.sql&quot; id=&quot;link-id0x1b5adb08&quot;&gt;available here&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;The database space allocation gives each index a number of 2MB segments, each with 256 8K pages. When a page splits, the new page is allocated from the same extent if possible, or from a specific second extent which is designated as the overflow extent of this extent. This scheme provides for a sort of pseudo-locality within extents over random insert order. Thus there is a chance that pre-reading an extent will get key values in the same range a the ones on the page being requested in the first place. At least the pre-read pages will be from the same index tree. There are insertion orders that do not create good locality with this allocation scheme, though. In order to generally improve locality, one could shuffle pages of an all-dirty subtree before writing this out so as to have physical order match key order. We will look at some tricks in this vein with the column store.&lt;/p&gt; &lt;p&gt;For the sake of simplicity we only run 7 Single with the 1000 Mt scale.&lt;/p&gt; &lt;p&gt;The first experiment was with SSDs and the vectored read-ahead. The target throughput was reached after 280 seconds. &lt;/p&gt; &lt;p&gt;The next test was with HDDs and extent read-ahead. One hour into the experiment, the CPU was about 70% after processing around 1000 query mixes. It might have been hours before HDD reads became rare enough for hitting 1200% CPU. The test was not worth continuing.&lt;/p&gt; &lt;p&gt;The result with HDDs and vectored read-ahead would be worse since vectored read-ahead leads to smaller read-ahead batches and to less contiguous read patterns. The individual read times here, are over twice the individual read times with per-extent read-ahead. The fact that vectored read-ahead does not read potentially unneeded pages makes no difference. Hence this test is also not worth running to completion.&lt;/p&gt; &lt;p&gt;There are other possibilities for improving HDD I/O. If only 2MB read requests are made, a transfer will be about 20 ms at a sequential transfer speed of 50 MB/s. Then seeking to the next 2MB extent will be a few ms, most often less than 20, so the HDD should give at least half the nominal throughput.&lt;/p&gt; &lt;p&gt;We note that, when reading sequential 8K pages inside a single 2MB (256 page) extent, the seek latency is not 0 as one would expect but an extreme 5 ms. One would think that the drive would buffer a whole track, and a track would hold a large number of 2MB sections, but apparently this is not so. &lt;/p&gt; &lt;p&gt;Therefore, now if we have a sequential read pattern that is more dense than 1 page out of 10, we read all the pages and just keep the ones we want.&lt;/p&gt; &lt;p&gt;So now we set the read-ahead to merge reads that fall within 10 pages. This wastes bandwidth, but supposedly saves on latency. We will see. &lt;/p&gt; &lt;p&gt;So we try, and we find that read-ahead does not account for most pages since it does not get triggered. Thus, we change the triggering condition to be the 2nd read to fall in the extent within 20 seconds of the first.&lt;/p&gt; &lt;p&gt;The HDDs were in all cases 700% busy for 4 HDDs. But with the new setting we get longer requests, most often full extents, which gets a per-HDD transfer rate of about 5 MB/s. With the looser condition for starting read-ahead, 89% of all pages were read in a read-ahead batch. We see the I/O throughput decrease during the run because there are more single-page reads that do not trigger extent read-ahead. So HDDs have 1.7 concurrent operations pending, but the batch size drops, dropping the throughput.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Thus with the best settings, the test with 2000 query mixes finishes in 46 minutes, and the CPU utilization is steadily increasing, hitting 392% for the last minute. In comparison, with SSDs and our worst read-ahead setting we got 1200% CPU in under 5 minutes from cold start. The I/O system can be further tuned; for example, by only reading full extents as long as the buffer pool is not full. In the next post we will measure some more. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h3&gt;BSBM Note &lt;/h3&gt; &lt;p&gt;We look at query times with semi-warm cache, with CPU around 400%. We note that Q8-Q12 are especially bad. Q5 runs at about half speed. Q12 runs at under 1/10th speed. The relatively slowest queries appear to be single-instance lookups. Nothing short of the most aggressive speculative reading can help there. Neither query nor workload has any exploitable pattern. Therefore if an I/O component is to be included in a BSBM metric, the only way to score in this is to use speculative read to the maximum.&lt;/p&gt; &lt;p&gt;Some of the queries take consecutive property values of a single instance. One could parallelize this pipeline, but this would be a one-off and would make sense only when reading from storage (whether HDD, SSD, or otherwise). Multithreading for single rows is not worth the overhead.&lt;/p&gt; &lt;p&gt;A metric for BSBM warm-up is not interesting for database science, but may still be of practical interest in the specific case of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1d6371d8&quot;&gt;RDF&lt;/a&gt; stores. Specially reading large chunks at startup time is good, so putting a section in BSBM that would force one to implement this would be a service to most end users. Measuring and reporting such I/O performance would favor space efficiency in general. Space efficiency is generally a good thing, especially at larger scales, so we can put an optional section in the report for warm-up. This is also good for comparing HDDs and SSDs, and for testing read-ahead, which is still something a database is expected to do. Implementors have it easy; just speculatively read everything.&lt;/p&gt; &lt;p&gt;Looking at the BSBM fictional use case, anybody running such a portal would do this from RAM only, so it makes sense to define the primary metric as running from warm cache, in practice 100% from memory.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1ecb2af0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x19d05678&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1d542328&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x13947e08&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1a7f6b30&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1d67dd40&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1ebcee68&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1a855ba0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1b081e70&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1d7a7940&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d7e2cd0&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e375338&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d199728&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e808818&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:56:52-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-07#1667</atom:id>
  <atom:published>2011-03-07T19:17:36Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the context of database benchmarks we cannot ignore I/O, as pretty much has been done so far by &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2a0452f8&quot;&gt;BSBM&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;There are two approaches:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;run twice or otherwise make sure one runs from memory and forget about I/O, or&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;make rules and metrics for warm-up.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;We will see if the second is possible with BSBM.&lt;/p&gt; &lt;p&gt;From this starting point, we look at various ways of scheduling I/O in &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2a9fdb88&quot;&gt;Virtuoso&lt;/a&gt; using a 1000 Mt BSBM database on sets of each of HDDs (hard disk devices) and SSDs (solid-state storage devices). We will see that SSDs in this specific application can make a significant difference. &lt;/p&gt; &lt;p&gt;In this test we have the same 4 stripes of a 1000 Mt BSBM database on each of two storage arrays.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;9&quot; align=&quot;center&quot;&gt;Storage Arrays&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt; Type &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Quantity &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Maker &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Size &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Speed &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Interface speed &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Controller &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Drive &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x2ad20cd0&quot;&gt;Cache&lt;/a&gt; &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; RAID &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt; SSD &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; Crucial &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 128 GB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; N/A &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 6Gbit SATA &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; RocketRaid 640 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 128 MB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; None &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt; HDD &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 4 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; Samsung &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1000 GB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 7200 RPM &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 3Gbit SATA &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x2a8cfca0&quot;&gt;Intel&lt;/a&gt; ICH on Supermicro motherboard &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16 MB &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; None &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We make sure that the files are not in OS cache by filling it with other big files, reading a total of 120 GB off SSDs with &lt;code&gt;`cat file &amp;gt; /dev/null`&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;The configuration files are as in the report on the 1000 Mt run. We note as significant that we have a few file descriptors for each stripe, and that read-ahead for each is handled by its own thread.&lt;/p&gt; &lt;p&gt;Two different read-ahead schemes are used: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;With 6 Single, if a 2MB extent gets a second read within a given time after the first, the whole extent is scheduled for background read.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;With 7 Single, as an index search is vectored, we know a large number of values to fetch at one time and these values are sorted into an ascending sequence. Therefore, by looking at a node in an index tree, we can determine which sub-trees will be accessed and schedule these for read-ahead, skipping any that will not be accessed.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In either model, a sequential scan touching more than a couple of consecutive index leaf pages triggers a read-ahead, to the end of the scanned range or to the next 3000 index leaves, whichever comes first. However, there are no sequential scans of significant size in BSBM.&lt;/p&gt; &lt;p&gt;There are a few different possibilities for the physical I/O: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Using a separate read system call for each page. There may be several open file descriptors on a file so that many such calls can proceed concurrently on different threads; the OS will order the operations.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;A thread finds it needs a page and reads it.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Using Unix asynchronous I/O, &lt;code&gt;aio.h&lt;/code&gt;, with the &lt;code&gt;aio_*&lt;/code&gt; and &lt;code&gt;lio_listio&lt;/code&gt; functions.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Using single-read system calls for adjacent pages. In this way, the drive sees longer requests and should give better throughput. If there are short gaps in the sequence, the gaps are also read, wasting bandwidth but saving on latency.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The two latter apply only to bulk I/O that are scheduled on background threads, one per independently-addressable device (HDD, SSD, or RAID-set). These bulk-reads operate on an elevator model, keeping a sorted queue of things to read or write and moving through this queue from start to end. At any time, the queue may get more work from other threads.&lt;/p&gt; &lt;p&gt;There is a further choice when seeing single-page random requests. They can either go to the elevator or they can be done in place. Taking the elevator is presumably good for throughput but bad for latency. In general, the elevator should have a notion of fairness; these matters are discussed in the &lt;a href=&quot;http://www.cwi.nl/&quot; id=&quot;link-id0x1f62abb8&quot;&gt;CWI collaborative scan paper&lt;/a&gt;. Here we do not have long queries, so we do not have to talk about elevator policies or scan sharing; there are no scans. We may touch on these questions later with the column store, the BSBM BI mix, and &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2a9067d0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x2a8874f0&quot;&gt;H&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;While we may know principles, I/O has always given us surprises; the only way to optimize this is to measure.&lt;/p&gt; &lt;p&gt;The metric we try to optimize here is the time it takes for a multiuser BSBM run starting from cold cache to get to 1200% &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x2997a660&quot;&gt;CPU&lt;/a&gt;. When running from memory, the CPU is around 1350% for the system in question. &lt;/p&gt; &lt;p&gt;This depends on getting I/O throughput, which in turn depends on having a lot of speculative reading since the workload itself does not give any long stretches to read. &lt;/p&gt; &lt;p&gt;The test driver is set at 16 clients, and the run continues for 2000 query mixes or until target throughput is reached. Target throughput is deemed reached after the first 20 second stretch with CPU at 1200% or higher.&lt;/p&gt; &lt;p&gt;The meter is a stored procedure that records the CPU time, count of reads, cumulative elapsed time spent waiting for I/O, and other metrics. The code for this procedure (for 7 Single; this file will not work on Virtuoso 6 or earlier) is &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/ldmeter.sql&quot; id=&quot;link-id0x1b5adb08&quot;&gt;available here&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;The database space allocation gives each index a number of 2MB segments, each with 256 8K pages. When a page splits, the new page is allocated from the same extent if possible, or from a specific second extent which is designated as the overflow extent of this extent. This scheme provides for a sort of pseudo-locality within extents over random insert order. Thus there is a chance that pre-reading an extent will get key values in the same range a the ones on the page being requested in the first place. At least the pre-read pages will be from the same index tree. There are insertion orders that do not create good locality with this allocation scheme, though. In order to generally improve locality, one could shuffle pages of an all-dirty subtree before writing this out so as to have physical order match key order. We will look at some tricks in this vein with the column store.&lt;/p&gt; &lt;p&gt;For the sake of simplicity we only run 7 Single with the 1000 Mt scale.&lt;/p&gt; &lt;p&gt;The first experiment was with SSDs and the vectored read-ahead. The target throughput was reached after 280 seconds. &lt;/p&gt; &lt;p&gt;The next test was with HDDs and extent read-ahead. One hour into the experiment, the CPU was about 70% after processing around 1000 query mixes. It might have been hours before HDD reads became rare enough for hitting 1200% CPU. The test was not worth continuing.&lt;/p&gt; &lt;p&gt;The result with HDDs and vectored read-ahead would be worse since vectored read-ahead leads to smaller read-ahead batches and to less contiguous read patterns. The individual read times here, are over twice the individual read times with per-extent read-ahead. The fact that vectored read-ahead does not read potentially unneeded pages makes no difference. Hence this test is also not worth running to completion.&lt;/p&gt; &lt;p&gt;There are other possibilities for improving HDD I/O. If only 2MB read requests are made, a transfer will be about 20 ms at a sequential transfer speed of 50 MB/s. Then seeking to the next 2MB extent will be a few ms, most often less than 20, so the HDD should give at least half the nominal throughput.&lt;/p&gt; &lt;p&gt;We note that, when reading sequential 8K pages inside a single 2MB (256 page) extent, the seek latency is not 0 as one would expect but an extreme 5 ms. One would think that the drive would buffer a whole track, and a track would hold a large number of 2MB sections, but apparently this is not so. &lt;/p&gt; &lt;p&gt;Therefore, now if we have a sequential read pattern that is more dense than 1 page out of 10, we read all the pages and just keep the ones we want.&lt;/p&gt; &lt;p&gt;So now we set the read-ahead to merge reads that fall within 10 pages. This wastes bandwidth, but supposedly saves on latency. We will see. &lt;/p&gt; &lt;p&gt;So we try, and we find that read-ahead does not account for most pages since it does not get triggered. Thus, we change the triggering condition to be the 2nd read to fall in the extent within 20 seconds of the first.&lt;/p&gt; &lt;p&gt;The HDDs were in all cases 700% busy for 4 HDDs. But with the new setting we get longer requests, most often full extents, which gets a per-HDD transfer rate of about 5 MB/s. With the looser condition for starting read-ahead, 89% of all pages were read in a read-ahead batch. We see the I/O throughput decrease during the run because there are more single-page reads that do not trigger extent read-ahead. So HDDs have 1.7 concurrent operations pending, but the batch size drops, dropping the throughput.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Thus with the best settings, the test with 2000 query mixes finishes in 46 minutes, and the CPU utilization is steadily increasing, hitting 392% for the last minute. In comparison, with SSDs and our worst read-ahead setting we got 1200% CPU in under 5 minutes from cold start. The I/O system can be further tuned; for example, by only reading full extents as long as the buffer pool is not full. In the next post we will measure some more. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;h3&gt;BSBM Note &lt;/h3&gt; &lt;p&gt;We look at query times with semi-warm cache, with CPU around 400%. We note that Q8-Q12 are especially bad. Q5 runs at about half speed. Q12 runs at under 1/10th speed. The relatively slowest queries appear to be single-instance lookups. Nothing short of the most aggressive speculative reading can help there. Neither query nor workload has any exploitable pattern. Therefore if an I/O component is to be included in a BSBM metric, the only way to score in this is to use speculative read to the maximum.&lt;/p&gt; &lt;p&gt;Some of the queries take consecutive property values of a single instance. One could parallelize this pipeline, but this would be a one-off and would make sense only when reading from storage (whether HDD, SSD, or otherwise). Multithreading for single rows is not worth the overhead.&lt;/p&gt; &lt;p&gt;A metric for BSBM warm-up is not interesting for database science, but may still be of practical interest in the specific case of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x29987c90&quot;&gt;RDF&lt;/a&gt; stores. Specially reading large chunks at startup time is good, so putting a section in BSBM that would force one to implement this would be a service to most end users. Measuring and reporting such I/O performance would favor space efficiency in general. Space efficiency is generally a good thing, especially at larger scales, so we can put an optional section in the report for warm-up. This is also good for comparing HDDs and SSDs, and for testing read-ahead, which is still something a database is expected to do. Implementors have it easy; just speculatively read everything.&lt;/p&gt; &lt;p&gt;Looking at the BSBM fictional use case, anybody running such a portal would do this from RAM only, so it makes sense to define the primary metric as running from warm cache, in practice 100% from memory.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1ecb2af0&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x19d05678&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1d542328&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x13947e08&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1a7f6b30&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1d67dd40&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1ebcee68&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1a855ba0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1b081e70&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1d7a7940&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac00eabec8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aac021b2c78&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aabe483e2b8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aac1400d3c8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:45:58.995101-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-04#1666</atom:id>
  <atom:published>2011-03-04T20:28:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;Below is a questionnaire I sent to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x17f62428&quot;&gt;BSBM&lt;/a&gt; participants in order to get tuning instructions for the runs we were planning. I have filled in the answers for &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1d48ed28&quot;&gt;Virtuoso&lt;/a&gt;, here. This can be a checklist for pretty much any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e11b228&quot;&gt;RDF&lt;/a&gt; database tuning.&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Threading - What settings should be used (e.g., for query parallelization, I/O parallelization [e.g., prefetch, flush of dirty], thread pools [e,.g. web server], any other thread related)? We will run with 8 and 32 cores, so if there are settings controlling number of read/write (R/W) locks or mutexes or such for serializing diverse things, these should be set accordingly to minimize contention.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The following three settings are all &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1ed4fe10&quot;&gt;in the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;. &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;AsyncQueueMaxThreads&lt;/code&gt; &lt;/b&gt; controls the size of a pool of extra threads that can be used for query parallelization. This should be set to either &lt;b&gt;1.5 * the number of cores&lt;/b&gt; or &lt;b&gt;1.5 * the number of core threads&lt;/b&gt;; see which works better.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;ThreadsPerQuery&lt;/code&gt; &lt;/b&gt; is the maximum number of threads a single query will take. This should be set to either &lt;b&gt;the number of cores&lt;/b&gt; or &lt;b&gt;the number of core threads&lt;/b&gt;; see which works better. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;IndexTreeMaps&lt;/code&gt; &lt;/b&gt; is the number of mutexes over which control for buffering an index tree is split. This can generally be left at default (&lt;b&gt;256&lt;/b&gt; in normal operation; valid settings are powers of 2 from 2 to 1024), but setting to &lt;b&gt;64, 128, or 512&lt;/b&gt; may be beneficial.&lt;/p&gt; &lt;p&gt;A low number will lead to frequent contention; upwards of 64 will have little contention. We have sometimes seen a multiuser workload go 10% faster when setting this to 64 (down from 256), which seems counter-intuitive. This may be a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1e12b618&quot;&gt;cache&lt;/a&gt; artifact.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_HTTPServer&quot; id=&quot;link-id0x1f8960a0&quot;&gt;In the &lt;code&gt;[HTTPServer]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, the &lt;b&gt;&lt;code&gt;ServerThreads&lt;/code&gt;&lt;/b&gt; setting is the number of web server threads, i.e., the maximum number of concurrent &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x17e4d690&quot;&gt;SPARQL protocol&lt;/a&gt; requests. Having a value larger than the number of concurrent clients is OK; for large numbers of concurrent clients a lower value may be better, which will result in requests waiting for a thread to be available.&lt;/p&gt; &lt;p&gt;Note — The &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt; are taken from the total pool made available by the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt;. Thus, the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; should always be at least as large as (and is best set greater than) the &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt;, and if using the closed-source Commercial Version, &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; cannot exceed the licensed thread count. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;File layout - Are there settings for striping over multiple devices? Settings for other file access parallelism? Settings for SSDs (e.g., SSD based cache of hot set of larger db files on disk)? The target config is for 4 independent disks and 4 independent SSDs. If you depend on RAID, are there settings for this? If you need RAID to be set up, please provide the settings/script for doing this with 4 SSDs on Linux (RH and Debian). This will be software RAID, as we find the hardware RAID to be much worse than an independent disk setup on the system in question.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;It is best to stripe database files over all available disks, and to not use RAID. If RAID is desired, then stripe database files across many RAID sets. Use the &lt;code&gt;segment&lt;/code&gt; declaration in the &lt;code&gt;virtuoso.ini&lt;/code&gt; file. It is very important to give each independently seekable device its own I/O queue thread. See the documentation on the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e9a6bc0&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1ebdf210&quot;&gt;C&lt;/a&gt; sample for examples. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1f893f48&quot;&gt;in the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, set &lt;code&gt;FDsPerFile&lt;/code&gt; to be &lt;code&gt; (the number of concurrent threads * 1.5) ÷ the number of distinct database files&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;There are no SSD specific settings.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Loading - How many parallel streams work best? We are looking for non-transactional bulk load, with no inference materialization. For partitioned cluster settings, do we divide the load streams over server processes? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Use one stream per core (not per core thread). In the case of a cluster, divide load streams evenly across all processes. The total number of streams on a cluster can equal the total number of cores; adjust up or down depending on what is observed.&lt;/p&gt; &lt;p&gt;Use the built-in bulk load facility, i.e., &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;ld_dir (&amp;#39;&amp;lt;source-filename-or-directory&amp;gt;&amp;#39;, &amp;#39;&amp;lt;file name pattern&amp;gt;&amp;#39;, &amp;#39;&amp;lt;destination graph iri&amp;gt;&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For example,&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1dc52c58&quot;&gt;SQL&lt;/a&gt;&amp;gt; ld_dir (&amp;#39;/path/to/files&amp;#39;, &amp;#39;*.n3&amp;#39;, &amp;#39;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1e76bfc8&quot;&gt;http&lt;/a&gt;://&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1e9a6ad8&quot;&gt;dbpedia&lt;/a&gt;.org&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Then do a &lt;code&gt;rdf_loader_run ()&lt;/code&gt; on enough connections. For example, you can use the shell command &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;isql rdf_loader_run () &amp;amp;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;to start one in a background isql process. When starting background load commands from the shell, you can use the shell &lt;code&gt;wait&lt;/code&gt; command to wait for completion. If starting from isql, use the &lt;code&gt;wait_for_children;&lt;/code&gt; command (see &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/isql.html&quot; id=&quot;link-id0x1ae0f230&quot;&gt;isql documentation&lt;/a&gt; for details). &lt;/p&gt; &lt;p&gt;See the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d635820&quot;&gt;BSBM disclosure report&lt;/a&gt; for an example load script.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command should be used after non-transactional bulk load, to ensure a consistent persistent state on disk, like a log checkpoint or similar? Load and checkpoint will be timed separately, load being &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1e6f1000&quot;&gt;CPU&lt;/a&gt;-bound and checkpoint being I/O-bound. No roll-forward log or similar is required; the load does not have to recover if it fails before the checkpoint.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Execute &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; CHECKPOINT;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;through a SQL client, e.g., &lt;code&gt;isql&lt;/code&gt;. This is not a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c2401d8&quot;&gt;SPARQL&lt;/a&gt; statement and cannot be executed over the SPARQL protocol.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What settings should be used for trickle load of small triple sets into a pre-existing graph? This should be as transactional as supported; at least there should be a roll forward log, unlike the case for the bulk load.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;No special settings are needed for load testing; defaults will produce transactional behavior with a roll forward log. Default transaction isolation is &lt;b&gt;&lt;code&gt;REPEATABLE READ&lt;/code&gt;&lt;/b&gt;, but this may be altered via SQL session settings or at Virtuoso server start-up through &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1a791b80&quot;&gt;the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;&lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/ChangeVirtuosoSDefaultTransactionIsolationLevel&quot; id=&quot;link-id0x1e5536b8&quot;&gt;DefaultIsolation&lt;/a&gt; = 4&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;p&gt; Transaction isolation cannot be set over the SPARQL protocol.&lt;/p&gt; &lt;p&gt; NOTE: When testing full CRUD operations, other isolation settings may be preferable, due to &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1ce6a310&quot;&gt;ACID&lt;/a&gt; considerations. See answer #12, below, and detailed discussion in part 8 of this series, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b7eb5f0&quot;&gt;BSBM &lt;i&gt;Explore and Update&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What settings control allocation of memory for database caching? We will be running mostly from memory, so we need to make sure that there is enough memory configured. &lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1acd8fe8&quot;&gt;In the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, &lt;b&gt;&lt;code&gt;NumberOfBuffers&lt;/code&gt;&lt;/b&gt; controls the amount of RAM used by Virtuoso to cache database files. One buffer caches an 8KB database page. In practice, count 10KB of memory per page. If &amp;quot;swappiness&amp;quot; on Linux is low (e.g., 2), two-thirds or more of physical memory can be used for database buffers. If swapping occurs, decrease the setting.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command gives status on memory allocation (e.g., number of buffers, number of dirty buffers, etc.) so that we can verify that things are indeed in server memory and not, for example, being served from OS disk cache. If the cached format is different from the disk layout (e.g., decompression after disk read), is there a command for space statistics for database cache? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;In an &lt;code&gt;isql&lt;/code&gt; session, execute &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;STATUS ( ? ? );&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The second result paragraph gives counts of total, used, and dirty buffers. If used buffers is steady and less than total, and if the disk read count on the line below does not increase, the system is running from memory. The cached format is the same as the disk based format.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command gives &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1c185f28&quot;&gt;information&lt;/a&gt; on disk allocation for different things? We are looking for the total size of allocated database pages for quads (including table, indices, anything else associated with quads) and dictionaries for literals, IRI names, etc. If there is a text index on literals, what command gives space stats for this? We count used pages, excluding any preallocated unused pages or other gaps. There is one number for quads and another for the dictionaries or other such structures, optionally a third for text index.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Execute on an &lt;code&gt;isql&lt;/code&gt; session: &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CHECKPOINT; SELECT TOP 20 * FROM sys_index_space_stats ORDER BY iss_pages DESC; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;iss_pages&lt;/code&gt; column is the total pages for each index, including blob pages. Pages are 8KB. Only used pages are reported, gaps and unused pages are not counted. The rows pertaining to &lt;code&gt;RDF_QUAD&lt;/code&gt; are for quads; &lt;code&gt;RDF_IRI&lt;/code&gt;, &lt;code&gt;RDF_PREFIX&lt;/code&gt;, &lt;code&gt;RO_START&lt;/code&gt;, &lt;code&gt;RDF_OBJ&lt;/code&gt; are for dictionaries; &lt;code&gt;RDF_OBJ_RO_FLAGS_WORDS&lt;/code&gt; and &lt;code&gt;VTLOG_DB_DBA_RDF_OBJ&lt;/code&gt; are for text index. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;If there is a choice between triples and quads, we will run with quads. How do we ascertain that the run is with quads? How do we find out the index scheme? Should be use an alternate index scheme? Most of the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c573780&quot;&gt;data&lt;/a&gt; will be in a single big graph.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The default scheme uses quads. The default index layout is &lt;code&gt;PSOG&lt;/code&gt;, &lt;code&gt;POGS&lt;/code&gt;, &lt;code&gt;GS&lt;/code&gt;, &lt;code&gt;SP&lt;/code&gt;, &lt;code&gt;OP&lt;/code&gt;. To see the current index scheme, use an &lt;code&gt;isql&lt;/code&gt; session to execute&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;STATISTICS DB.DBA.RDF_QUAD;&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For partitioned cluster settings, are there partitioning-related settings to control even distribution of data between partitions? For example, is there a way to set partitioning by &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;O&lt;/code&gt; depending on which is first in key order for each index? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;The default partitioning settings are good, i.e., partitioning is on &lt;code&gt;O&lt;/code&gt; or &lt;code&gt;S&lt;/code&gt;, whichever is first in key order.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For partitioned clusters, are there settings to control message batching or similar? What are the statistics available for checking interconnect operation, e.g. message counts, latencies, total aggregate throughput of interconnect?&lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusteroperation.html#clusteroperationgeneralclusterinifields&quot; id=&quot;link-id0x1ec6dff0&quot;&gt;In the &lt;code&gt;[Cluster]&lt;/code&gt; section of the &lt;code&gt;cluster.ini&lt;/code&gt; file&lt;/a&gt;, &lt;b&gt;&lt;code&gt;ReqBatchSize&lt;/code&gt;&lt;/b&gt; is the number of query states dispatched between cluster nodes per message round trip. This may be incremented from the default of &lt;code&gt;10000&lt;/code&gt; to &lt;code&gt;50000&lt;/code&gt; or so if this is seen to be useful. &lt;/p&gt; &lt;p&gt;To change this on the fly, the following can be issued through an &lt;code&gt;isql&lt;/code&gt; session:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;cl_exec ( &amp;#39; __dbf_set (&amp;#39;&amp;#39;cl_request_batch_size&amp;#39;&amp;#39;, 50000) &amp;#39; ); &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The commands below may be executed through an &lt;code&gt;isql&lt;/code&gt; session to get a summary of CPU and message traffic for the whole cluster or process-by-process, respectively. The documentation &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusteroperation.html#clusteroperationadminstdispl&quot; id=&quot;link-id0x1dfccec0&quot;&gt;details the fields&lt;/a&gt;. &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; &lt;code&gt;STATUS (&amp;#39;cluster&amp;#39;) ;; whole cluster&lt;/code&gt; &lt;br /&gt; &lt;code&gt;STATUS (&amp;#39;cluster_d&amp;#39;) ;; process-by-process&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Other settings - Are there settings for limiting query planning, when appropriate? For example, the BSBM &lt;i&gt;Explore&lt;/i&gt; mix has a large component of unnecessary query optimizer time, since the queries themselves access almost no data. Any other relevant settings?&lt;/b&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;For BSBM, needless query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1f0ffab8&quot;&gt;optimization&lt;/a&gt; should be capped at Virtuoso server start-up through the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;StopCompilerWhenXOverRun = 1&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;When testing full CRUD operations (not simply CREATE, i.e., load, as discussed in #5, above), it is essential to make queries run with transaction isolation of &lt;code&gt;READ COMMITTED&lt;/code&gt;, to remove most lock contention. Transaction isolation cannot be adjusted via SPARQL. This can be changed through SQL session settings, or at Virtuoso server start-up &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1f3a43c8&quot;&gt;through the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;&lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/ChangeVirtuosoSDefaultTransactionIsolationLevel&quot; id=&quot;link-id0x1a5a51e0&quot;&gt;DefaultIsolation&lt;/a&gt; = 2&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d6e5428&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1c3ea770&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1efeca30&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1bda5158&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1ec74808&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ea253a0&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b02d528&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1ae81fc0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x197515c0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1a78db90&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d32ae10&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1e8fcc18&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ae95050&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1dbf3158&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:56:38.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-04#1665</atom:id>
  <atom:published>2011-03-04T20:28:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;Below is a questionnaire I sent to the &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xa2f6798&quot;&gt;BSBM&lt;/a&gt; participants in order to get tuning instructions for the runs we were planning. I have filled in the answers for &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x195c2070&quot;&gt;Virtuoso&lt;/a&gt;, here. This can be a checklist for pretty much any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e1c9bb0&quot;&gt;RDF&lt;/a&gt; database tuning.&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Threading - What settings should be used (e.g., for query parallelization, I/O parallelization [e.g., prefetch, flush of dirty], thread pools [e,.g. web server], any other thread related)? We will run with 8 and 32 cores, so if there are settings controlling number of read/write (R/W) locks or mutexes or such for serializing diverse things, these should be set accordingly to minimize contention.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The following three settings are all &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1ed4fe10&quot;&gt;in the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;. &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;AsyncQueueMaxThreads&lt;/code&gt; &lt;/b&gt; controls the size of a pool of extra threads that can be used for query parallelization. This should be set to either &lt;b&gt;1.5 * the number of cores&lt;/b&gt; or &lt;b&gt;1.5 * the number of core threads&lt;/b&gt;; see which works better.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;ThreadsPerQuery&lt;/code&gt; &lt;/b&gt; is the maximum number of threads a single query will take. This should be set to either &lt;b&gt;the number of cores&lt;/b&gt; or &lt;b&gt;the number of core threads&lt;/b&gt;; see which works better. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;&lt;code&gt;IndexTreeMaps&lt;/code&gt; &lt;/b&gt; is the number of mutexes over which control for buffering an index tree is split. This can generally be left at default (&lt;b&gt;256&lt;/b&gt; in normal operation; valid settings are powers of 2 from 2 to 1024), but setting to &lt;b&gt;64, 128, or 512&lt;/b&gt; may be beneficial.&lt;/p&gt; &lt;p&gt;A low number will lead to frequent contention; upwards of 64 will have little contention. We have sometimes seen a multiuser workload go 10% faster when setting this to 64 (down from 256), which seems counter-intuitive. This may be a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1262b4b0&quot;&gt;cache&lt;/a&gt; artifact.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_HTTPServer&quot; id=&quot;link-id0x1f8960a0&quot;&gt;In the &lt;code&gt;[HTTPServer]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, the &lt;b&gt;&lt;code&gt;ServerThreads&lt;/code&gt;&lt;/b&gt; setting is the number of web server threads, i.e., the maximum number of concurrent &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x17c1bef0&quot;&gt;SPARQL protocol&lt;/a&gt; requests. Having a value larger than the number of concurrent clients is OK; for large numbers of concurrent clients a lower value may be better, which will result in requests waiting for a thread to be available.&lt;/p&gt; &lt;p&gt;Note — The &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt; are taken from the total pool made available by the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt;. Thus, the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; should always be at least as large as (and is best set greater than) the &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt;, and if using the closed-source Commercial Version, &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; cannot exceed the licensed thread count. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;File layout - Are there settings for striping over multiple devices? Settings for other file access parallelism? Settings for SSDs (e.g., SSD based cache of hot set of larger db files on disk)? The target config is for 4 independent disks and 4 independent SSDs. If you depend on RAID, are there settings for this? If you need RAID to be set up, please provide the settings/script for doing this with 4 SSDs on Linux (RH and Debian). This will be software RAID, as we find the hardware RAID to be much worse than an independent disk setup on the system in question.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;It is best to stripe database files over all available disks, and to not use RAID. If RAID is desired, then stripe database files across many RAID sets. Use the &lt;code&gt;segment&lt;/code&gt; declaration in the &lt;code&gt;virtuoso.ini&lt;/code&gt; file. It is very important to give each independently seekable device its own I/O queue thread. See the documentation on the &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e0deb38&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1ddc2bf0&quot;&gt;C&lt;/a&gt; sample for examples. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1f893f48&quot;&gt;in the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, set &lt;code&gt;FDsPerFile&lt;/code&gt; to be &lt;code&gt; (the number of concurrent threads * 1.5) ÷ the number of distinct database files&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;There are no SSD specific settings.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Loading - How many parallel streams work best? We are looking for non-transactional bulk load, with no inference materialization. For partitioned cluster settings, do we divide the load streams over server processes? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Use one stream per core (not per core thread). In the case of a cluster, divide load streams evenly across all processes. The total number of streams on a cluster can equal the total number of cores; adjust up or down depending on what is observed.&lt;/p&gt; &lt;p&gt;Use the built-in bulk load facility, i.e., &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;ld_dir (&amp;#39;&amp;lt;source-filename-or-directory&amp;gt;&amp;#39;, &amp;#39;&amp;lt;file name pattern&amp;gt;&amp;#39;, &amp;#39;&amp;lt;destination graph iri&amp;gt;&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For example,&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x17c854c0&quot;&gt;SQL&lt;/a&gt;&amp;gt; ld_dir (&amp;#39;/path/to/files&amp;#39;, &amp;#39;*.n3&amp;#39;, &amp;#39;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1f10c3d8&quot;&gt;http&lt;/a&gt;://&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1c6378a0&quot;&gt;dbpedia&lt;/a&gt;.org&amp;#39;);&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Then do a &lt;code&gt;rdf_loader_run ()&lt;/code&gt; on enough connections. For example, you can use the shell command &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;isql rdf_loader_run () &amp;amp;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;to start one in a background isql process. When starting background load commands from the shell, you can use the shell &lt;code&gt;wait&lt;/code&gt; command to wait for completion. If starting from isql, use the &lt;code&gt;wait_for_children;&lt;/code&gt; command (see &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/isql.html&quot; id=&quot;link-id0x1ae0f230&quot;&gt;isql documentation&lt;/a&gt; for details). &lt;/p&gt; &lt;p&gt;See the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d635820&quot;&gt;BSBM disclosure report&lt;/a&gt; for an example load script.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command should be used after non-transactional bulk load, to ensure a consistent persistent state on disk, like a log checkpoint or similar? Load and checkpoint will be timed separately, load being &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1c522378&quot;&gt;CPU&lt;/a&gt;-bound and checkpoint being I/O-bound. No roll-forward log or similar is required; the load does not have to recover if it fails before the checkpoint.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Execute &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; CHECKPOINT;&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;through a SQL client, e.g., &lt;code&gt;isql&lt;/code&gt;. This is not a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c1e95b0&quot;&gt;SPARQL&lt;/a&gt; statement and cannot be executed over the SPARQL protocol.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What settings should be used for trickle load of small triple sets into a pre-existing graph? This should be as transactional as supported; at least there should be a roll forward log, unlike the case for the bulk load.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;No special settings are needed for load testing; defaults will produce transactional behavior with a roll forward log. Default transaction isolation is &lt;b&gt;&lt;code&gt;REPEATABLE READ&lt;/code&gt;&lt;/b&gt;, but this may be altered via SQL session settings or at Virtuoso server start-up through &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1a791b80&quot;&gt;the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;&lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/ChangeVirtuosoSDefaultTransactionIsolationLevel&quot; id=&quot;link-id0x1e5536b8&quot;&gt;DefaultIsolation&lt;/a&gt; = 4&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;p&gt; Transaction isolation cannot be set over the SPARQL protocol.&lt;/p&gt; &lt;p&gt; NOTE: When testing full CRUD operations, other isolation settings may be preferable, due to &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1c592f70&quot;&gt;ACID&lt;/a&gt; considerations. See answer #12, below, and detailed discussion in part 8 of this series, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b7eb5f0&quot;&gt;BSBM &lt;i&gt;Explore and Update&lt;/i&gt;&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What settings control allocation of memory for database caching? We will be running mostly from memory, so we need to make sure that there is enough memory configured. &lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1acd8fe8&quot;&gt;In the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, &lt;b&gt;&lt;code&gt;NumberOfBuffers&lt;/code&gt;&lt;/b&gt; controls the amount of RAM used by Virtuoso to cache database files. One buffer caches an 8KB database page. In practice, count 10KB of memory per page. If &amp;quot;swappiness&amp;quot; on Linux is low (e.g., 2), two-thirds or more of physical memory can be used for database buffers. If swapping occurs, decrease the setting.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command gives status on memory allocation (e.g., number of buffers, number of dirty buffers, etc.) so that we can verify that things are indeed in server memory and not, for example, being served from OS disk cache. If the cached format is different from the disk layout (e.g., decompression after disk read), is there a command for space statistics for database cache? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;In an &lt;code&gt;isql&lt;/code&gt; session, execute &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;STATUS ( ? ? );&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The second result paragraph gives counts of total, used, and dirty buffers. If used buffers is steady and less than total, and if the disk read count on the line below does not increase, the system is running from memory. The cached format is the same as the disk based format.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What command gives &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x11bf3008&quot;&gt;information&lt;/a&gt; on disk allocation for different things? We are looking for the total size of allocated database pages for quads (including table, indices, anything else associated with quads) and dictionaries for literals, IRI names, etc. If there is a text index on literals, what command gives space stats for this? We count used pages, excluding any preallocated unused pages or other gaps. There is one number for quads and another for the dictionaries or other such structures, optionally a third for text index.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Execute on an &lt;code&gt;isql&lt;/code&gt; session: &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; CHECKPOINT; SELECT TOP 20 * FROM sys_index_space_stats ORDER BY iss_pages DESC; &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The &lt;code&gt;iss_pages&lt;/code&gt; column is the total pages for each index, including blob pages. Pages are 8KB. Only used pages are reported, gaps and unused pages are not counted. The rows pertaining to &lt;code&gt;RDF_QUAD&lt;/code&gt; are for quads; &lt;code&gt;RDF_IRI&lt;/code&gt;, &lt;code&gt;RDF_PREFIX&lt;/code&gt;, &lt;code&gt;RO_START&lt;/code&gt;, &lt;code&gt;RDF_OBJ&lt;/code&gt; are for dictionaries; &lt;code&gt;RDF_OBJ_RO_FLAGS_WORDS&lt;/code&gt; and &lt;code&gt;VTLOG_DB_DBA_RDF_OBJ&lt;/code&gt; are for text index. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;If there is a choice between triples and quads, we will run with quads. How do we ascertain that the run is with quads? How do we find out the index scheme? Should be use an alternate index scheme? Most of the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x17eb98f8&quot;&gt;data&lt;/a&gt; will be in a single big graph.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The default scheme uses quads. The default index layout is &lt;code&gt;PSOG&lt;/code&gt;, &lt;code&gt;POGS&lt;/code&gt;, &lt;code&gt;GS&lt;/code&gt;, &lt;code&gt;SP&lt;/code&gt;, &lt;code&gt;OP&lt;/code&gt;. To see the current index scheme, use an &lt;code&gt;isql&lt;/code&gt; session to execute&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;STATISTICS DB.DBA.RDF_QUAD;&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For partitioned cluster settings, are there partitioning-related settings to control even distribution of data between partitions? For example, is there a way to set partitioning by &lt;code&gt;S&lt;/code&gt; or &lt;code&gt;O&lt;/code&gt; depending on which is first in key order for each index? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;The default partitioning settings are good, i.e., partitioning is on &lt;code&gt;O&lt;/code&gt; or &lt;code&gt;S&lt;/code&gt;, whichever is first in key order.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For partitioned clusters, are there settings to control message batching or similar? What are the statistics available for checking interconnect operation, e.g. message counts, latencies, total aggregate throughput of interconnect?&lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusteroperation.html#clusteroperationgeneralclusterinifields&quot; id=&quot;link-id0x1ec6dff0&quot;&gt;In the &lt;code&gt;[Cluster]&lt;/code&gt; section of the &lt;code&gt;cluster.ini&lt;/code&gt; file&lt;/a&gt;, &lt;b&gt;&lt;code&gt;ReqBatchSize&lt;/code&gt;&lt;/b&gt; is the number of query states dispatched between cluster nodes per message round trip. This may be incremented from the default of &lt;code&gt;10000&lt;/code&gt; to &lt;code&gt;50000&lt;/code&gt; or so if this is seen to be useful. &lt;/p&gt; &lt;p&gt;To change this on the fly, the following can be issued through an &lt;code&gt;isql&lt;/code&gt; session:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;cl_exec ( &amp;#39; __dbf_set (&amp;#39;&amp;#39;cl_request_batch_size&amp;#39;&amp;#39;, 50000) &amp;#39; ); &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The commands below may be executed through an &lt;code&gt;isql&lt;/code&gt; session to get a summary of CPU and message traffic for the whole cluster or process-by-process, respectively. The documentation &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusteroperation.html#clusteroperationadminstdispl&quot; id=&quot;link-id0x1dfccec0&quot;&gt;details the fields&lt;/a&gt;. &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; &lt;code&gt;STATUS (&amp;#39;cluster&amp;#39;) ;; whole cluster&lt;/code&gt; &lt;br /&gt; &lt;code&gt;STATUS (&amp;#39;cluster_d&amp;#39;) ;; process-by-process&lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Other settings - Are there settings for limiting query planning, when appropriate? For example, the BSBM &lt;i&gt;Explore&lt;/i&gt; mix has a large component of unnecessary query optimizer time, since the queries themselves access almost no data. Any other relevant settings?&lt;/b&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;For BSBM, needless query &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x11be47b8&quot;&gt;optimization&lt;/a&gt; should be capped at Virtuoso server start-up through the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;StopCompilerWhenXOverRun = 1&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;When testing full CRUD operations (not simply CREATE, i.e., load, as discussed in #5, above), it is essential to make queries run with transaction isolation of &lt;code&gt;READ COMMITTED&lt;/code&gt;, to remove most lock contention. Transaction isolation cannot be adjusted via SPARQL. This can be changed through SQL session settings, or at Virtuoso server start-up &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id0x1f3a43c8&quot;&gt;through the &lt;code&gt;[Parameters]&lt;/code&gt; section of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file&lt;/a&gt;, with&lt;/p&gt; &lt;blockquote&gt; &lt;b&gt;&lt;code&gt;&lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/ChangeVirtuosoSDefaultTransactionIsolationLevel&quot; id=&quot;link-id0x1a5a51e0&quot;&gt;DefaultIsolation&lt;/a&gt; = 2&lt;/code&gt; &lt;/b&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d6e5428&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1c3ea770&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1efeca30&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1bda5158&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1ec74808&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1ea253a0&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1b02d528&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1ae81fc0&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x197515c0&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1a78db90&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aabe7f48408&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aac0351e488&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aac1428d5e8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aac00a80338&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:46:06.565138-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-03-02#1664</atom:id>
  <atom:published>2011-03-02T23:23:16Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post I will summarize the figures for &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1dcf58f8&quot;&gt;BSBM&lt;/a&gt; Load and &lt;i&gt;Explore&lt;/i&gt; mixes at 100 Mt, 200 Mt, and 1000 Mt. (1 Mt = 1 Megatriple, or one million triples.) The measurements were made on a 72GB 2xXeon 5520 with 4 SSDs. The exact specifications and configurations are in the raw reports to follow.&lt;/p&gt; &lt;p&gt;The load time in &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1f3716d8&quot;&gt;the recent Berlin report&lt;/a&gt; was measured with &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html#resultsExplore&quot; id=&quot;link-id0x1dd37f80&quot;&gt;the wrong function&lt;/a&gt;, and so far as we can tell, without multiple threads. The intermediate cut of &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1ddb0c90&quot;&gt;Virtuoso&lt;/a&gt; they tested also &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html#resultsExploreAndUpdate&quot; id=&quot;link-id0x1e5fcf40&quot;&gt; had broken&lt;/a&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1e1d2b70&quot;&gt;SPARQL&lt;/a&gt;/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1bfb00c0&quot;&gt;Update&lt;/a&gt; (also known as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1e0d5fd8&quot;&gt;SPARUL&lt;/a&gt;) features. We have fixed this since, and give &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/results.zip&quot; id=&quot;link-id0x1edf36b0&quot;&gt;here the right numbers&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In the course of the discussion to follow, we talk about 3 different kinds of Virtuoso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; is the generally available single server configuration of Virtuoso. Whether this is open source or not does not make a difference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; is the generally available commercial only cluster-capable Virtuoso.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; is the next generation single server Virtuoso, about to be released as a preview.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To understand the numbers, we must explain how these differ from each other in execution:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; has one thread-per-query, and operates on one state of the query at a time.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; has one thread-per-query-per-process, and between processes it operates on batches of some tens-of-thousands of simultaneous query states. Within each node, these batches run through the execution pipeline one state at a time. Aggregation is distributed, and the query optimizer is generally smart about shipping colocated functions together.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; has multiple threads-per-query and in all situations operates on batches of 10,000 or more simultaneous query states. This means, for example, that index lookups get large numbers of parameters which then are sorted to get an ascending search pattern which benefits from locality, so the &lt;code&gt;n * log(n)&lt;/code&gt; index access for the batch becomes more like linear if the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ceca188&quot;&gt;data&lt;/a&gt; accessed has any locality. Furthermore, if there are many operands to an operator, these can be split on multiple threads. Also, scans of consecutive rows can be split before the scan on multiple threads, each doing a range of the scan. These features are called &lt;i&gt;vectored execution&lt;/i&gt; and &lt;i&gt;query parallelization&lt;/i&gt;. These techniques will also be applied to the cluster variant in due time.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The version 6 and 7 variants discussed here use the same physical storage layout with row-wise &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x1e521fa0&quot;&gt;key compression&lt;/a&gt;. Additionally, there exists a column-wise storage option in 7 that can fit 4x the number of quads in the same space. This column store option is not used here because it still has some problems with random order inserts.&lt;/p&gt; &lt;p&gt; We will first consider loading. Below are the load times and rates for 7 at each scale.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;7 Single&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 261,366 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 301 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 82 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 216,000 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 802 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 123 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 130,378 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 6641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1012 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;In each case the load was made on 8 concurrent streams, each reading a file from a pool of 80 files for the two smaller scales and 360 files for the larger scale.&lt;/p&gt; &lt;p&gt;We also loaded the smallest data set with 6 Single using the same load script. &lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Single&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 74,713 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1192 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 145 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1132ad18&quot;&gt;CPU&lt;/a&gt; time with 6 Single was 8047 seconds. We compare this to 4453 seconds of CPU for the same load on 7 Single. The CPU% during the run was on either side of 700% for 6 Single and 1300% for 7 Single. Note that high percentages involve core threads, not real cores. &lt;/p&gt; &lt;p&gt;The difference is mostly attributable to vectoring and the introduction of a non-transactional insert. The 6 Single inserts transactionally but makes very frequent commits and writes no log, resulting in &lt;i&gt;de facto&lt;/i&gt; non-transactional behavior but still there is a lock and commit cycle. Inserts in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1c750368&quot;&gt;RDF&lt;/a&gt; load usually exhibit locality on all SPOG. Sorting by value gives ascending insert order and eliminates much of the lookup time for deciding where the next row will go. Contention on page read-write locks is less because the engine stays longer on a page, inserting multiple values in one go, instead of re-acquiring the read-write lock and possible transaction locks for each row.&lt;/p&gt; &lt;p&gt;Furthermore, for single stream loading the non-transactional mode can serve one thread doing the parsing with many threads doing the inserting; hence, in practice the speed is bounded by the parsing speed. In multi-stream load this parallelization also happens but is less significant, as adding threads past the count of core threads is not useful. Writes are all in-place, and no delta-merge mechanism is involved. For transactional inserts, the uncommitted rows are not visible to read-committed readers, which do not block. Repeatable and serializable readers would block before an uncommitted insert.&lt;/p&gt; &lt;p&gt;Now for the run (larger numbers indicate more queries executed, and are therefore better):&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Single Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29433 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6017 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 13335 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1770 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2487 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 7 Single Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 11742 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 72278 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 10225 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 60951 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6262 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 24672 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The 100 Mt and 200 Mt runs are entirely in memory; the 1000 Mt run is mostly in memory, with about a 1.6 MB/s trickle from SSD in steady state. Accordingly, the 1000 Mt run is longer, with 2000 query mixes in the timed period, preceded by a warm-up of 2000 mixes with a different seed. For the memory-only scales, we run 500 mixes twice, and take the timing of the second run.&lt;/p&gt; &lt;p&gt;Looking at single user speeds, 6 Single and 7 Single are closest at the small end and drift farther apart at the larger scales. This comes from the increased opportunity to parallelize Q5, since this works on more data and is relatively more important as the scale gets larger. The 100 Mt run of 7 Single has about 130% CPU, and the 1000 Mt run has about 270%. This also explains why adding clients gives a larger boost at the smaller scale. &lt;/p&gt; &lt;p&gt;Now let us look at the relative effects of parallelizing and vectoring in 7 Single. We run 50 mixes of Single User &lt;i&gt;Explore&lt;/i&gt;: 6132 QMpH with both parallelizing and vectoring on; 2805 QMpH with execution limited to a single thread. Then we set the vector size to 1, meaning that the query pipeline runs one row at a time. This gets us 1319 QMpH which is a bit worse than 6 Single. This is to be expected since there is some overhead to running vectored with single-element vectors. Q5 on 7 Single with vectoring and a single thread runs at 1.9 qps; with single-element vectors, at 0.8 qps. The 6 Single engine runs Q5 at 1.13 qps.&lt;/p&gt; &lt;p&gt;The 100 Mt scale 7 Single gains the most from adding clients; the 1000 Mt 6 Single gains the least. The reason for the latter is covered in detail in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1b9ed390&quot;&gt;A Benchmarking Story&lt;/a&gt;. We note that while vectoring is primarily geared to better single-thread speed and better &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1ddc2f48&quot;&gt;cache&lt;/a&gt; hit rates, it delivers a huge multithreaded benefit by eliminating the mutex contention at the index tree top which stops 6 Single dead at 1000 Mt.&lt;/p&gt; &lt;p&gt;In conclusion, we see that even with a workload of short queries and little opportunity for parallelism, we get substantial benefits from query parallelization and vectoring. When moving to more complex workloads, the benefits become more pronounced. For a single user complex query load, we can get 7x speed-up from parallelism (8 core), plus up to 3x from vectoring. These numbers do not take into account the benefits of the column store; those will be analyzed separately a bit later.&lt;/p&gt; &lt;p&gt;The full run details will be supplied at the end of this &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1e9f6960&quot;&gt;blog&lt;/a&gt; series.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d0bb988&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x155fc700&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d96e218&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1d7a5170&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1def9ca0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1a7a7800&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1e9c6c68&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1e80c208&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dafd290&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1f34f7f8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1df24f50&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f4b19c8&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1de90cf8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ebefbe8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:16:56-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-03-02#1663</atom:id>
  <atom:published>2011-03-02T23:23:16Z</atom:published>
  <atom:content type="html">&lt;p&gt;In this post I will summarize the figures for &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1edb1dd0&quot;&gt;BSBM&lt;/a&gt; Load and &lt;i&gt;Explore&lt;/i&gt; mixes at 100 Mt, 200 Mt, and 1000 Mt. (1 Mt = 1 Megatriple, or one million triples.) The measurements were made on a 72GB 2xXeon 5520 with 4 SSDs. The exact specifications and configurations are in the raw reports to follow.&lt;/p&gt; &lt;p&gt;The load time in &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1f3716d8&quot;&gt;the recent Berlin report&lt;/a&gt; was measured with &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html#resultsExplore&quot; id=&quot;link-id0x1dd37f80&quot;&gt;the wrong function&lt;/a&gt;, and so far as we can tell, without multiple threads. The intermediate cut of &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c1c7798&quot;&gt;Virtuoso&lt;/a&gt; they tested also &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html#resultsExploreAndUpdate&quot; id=&quot;link-id0x1e5fcf40&quot;&gt; had broken&lt;/a&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1bfa40b8&quot;&gt;SPARQL&lt;/a&gt;/&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1c1e1320&quot;&gt;Update&lt;/a&gt; (also known as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/page/SPARUL&quot; id=&quot;link-id0x1ddc87d8&quot;&gt;SPARUL&lt;/a&gt;) features. We have fixed this since, and give &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/BenchmarksReduxSupportingFiles/results.zip&quot; id=&quot;link-id0x1edf36b0&quot;&gt;here the right numbers&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In the course of the discussion to follow, we talk about 3 different kinds of Virtuoso:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; is the generally available single server configuration of Virtuoso. Whether this is open source or not does not make a difference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; is the generally available commercial only cluster-capable Virtuoso.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; is the next generation single server Virtuoso, about to be released as a preview.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To understand the numbers, we must explain how these differ from each other in execution:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; has one thread-per-query, and operates on one state of the query at a time.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; has one thread-per-query-per-process, and between processes it operates on batches of some tens-of-thousands of simultaneous query states. Within each node, these batches run through the execution pipeline one state at a time. Aggregation is distributed, and the query optimizer is generally smart about shipping colocated functions together.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; has multiple threads-per-query and in all situations operates on batches of 10,000 or more simultaneous query states. This means, for example, that index lookups get large numbers of parameters which then are sorted to get an ascending search pattern which benefits from locality, so the &lt;code&gt;n * log(n)&lt;/code&gt; index access for the batch becomes more like linear if the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ea197c8&quot;&gt;data&lt;/a&gt; accessed has any locality. Furthermore, if there are many operands to an operator, these can be split on multiple threads. Also, scans of consecutive rows can be split before the scan on multiple threads, each doing a range of the scan. These features are called &lt;i&gt;vectored execution&lt;/i&gt; and &lt;i&gt;query parallelization&lt;/i&gt;. These techniques will also be applied to the cluster variant in due time.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The version 6 and 7 variants discussed here use the same physical storage layout with row-wise &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x1bd035c0&quot;&gt;key compression&lt;/a&gt;. Additionally, there exists a column-wise storage option in 7 that can fit 4x the number of quads in the same space. This column store option is not used here because it still has some problems with random order inserts.&lt;/p&gt; &lt;p&gt; We will first consider loading. Below are the load times and rates for 7 at each scale.&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;7 Single&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 261,366 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 301 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 82 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 216,000 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 802 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 123 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 130,378 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 6641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1012 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;In each case the load was made on 8 concurrent streams, each reading a file from a pool of 80 files for the two smaller scales and 360 files for the larger scale.&lt;/p&gt; &lt;p&gt;We also loaded the smallest data set with 6 Single using the same load script. &lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;4&quot; align=&quot;center&quot;&gt;6 Single&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Rate &lt;br /&gt; (quads per second)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Load time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;th align=&quot;center&quot;&gt;Checkpoint time &lt;br /&gt; (seconds)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 74,713 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 1192 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 145 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1c0b96c0&quot;&gt;CPU&lt;/a&gt; time with 6 Single was 8047 seconds. We compare this to 4453 seconds of CPU for the same load on 7 Single. The CPU% during the run was on either side of 700% for 6 Single and 1300% for 7 Single. Note that high percentages involve core threads, not real cores. &lt;/p&gt; &lt;p&gt;The difference is mostly attributable to vectoring and the introduction of a non-transactional insert. The 6 Single inserts transactionally but makes very frequent commits and writes no log, resulting in &lt;i&gt;de facto&lt;/i&gt; non-transactional behavior but still there is a lock and commit cycle. Inserts in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ddef3e8&quot;&gt;RDF&lt;/a&gt; load usually exhibit locality on all SPOG. Sorting by value gives ascending insert order and eliminates much of the lookup time for deciding where the next row will go. Contention on page read-write locks is less because the engine stays longer on a page, inserting multiple values in one go, instead of re-acquiring the read-write lock and possible transaction locks for each row.&lt;/p&gt; &lt;p&gt;Furthermore, for single stream loading the non-transactional mode can serve one thread doing the parsing with many threads doing the inserting; hence, in practice the speed is bounded by the parsing speed. In multi-stream load this parallelization also happens but is less significant, as adding threads past the count of core threads is not useful. Writes are all in-place, and no delta-merge mechanism is involved. For transactional inserts, the uncommitted rows are not visible to read-committed readers, which do not block. Repeatable and serializable readers would block before an uncommitted insert.&lt;/p&gt; &lt;p&gt;Now for the run (larger numbers indicate more queries executed, and are therefore better):&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 6 Single Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 7641 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 29433 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6017 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 13335 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 1770 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2487 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;2&quot; align=&quot;center&quot; width=&quot;90%&quot;&gt; &lt;tr&gt; &lt;th colspan=&quot;3&quot; align=&quot;center&quot;&gt; 7 Single Throughput &lt;br /&gt; (QMpH, query mixes per hour) &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;Scale&lt;/th&gt; &lt;th align=&quot;center&quot;&gt; Single User &lt;/th&gt; &lt;th align=&quot;center&quot;&gt; 16 User &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;100 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 11742 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 72278 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;200 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 10225 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 60951 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th align=&quot;center&quot;&gt;1000 Mt&lt;/th&gt; &lt;td align=&quot;center&quot;&gt; 6262 &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 24672 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The 100 Mt and 200 Mt runs are entirely in memory; the 1000 Mt run is mostly in memory, with about a 1.6 MB/s trickle from SSD in steady state. Accordingly, the 1000 Mt run is longer, with 2000 query mixes in the timed period, preceded by a warm-up of 2000 mixes with a different seed. For the memory-only scales, we run 500 mixes twice, and take the timing of the second run.&lt;/p&gt; &lt;p&gt;Looking at single user speeds, 6 Single and 7 Single are closest at the small end and drift farther apart at the larger scales. This comes from the increased opportunity to parallelize Q5, since this works on more data and is relatively more important as the scale gets larger. The 100 Mt run of 7 Single has about 130% CPU, and the 1000 Mt run has about 270%. This also explains why adding clients gives a larger boost at the smaller scale. &lt;/p&gt; &lt;p&gt;Now let us look at the relative effects of parallelizing and vectoring in 7 Single. We run 50 mixes of Single User &lt;i&gt;Explore&lt;/i&gt;: 6132 QMpH with both parallelizing and vectoring on; 2805 QMpH with execution limited to a single thread. Then we set the vector size to 1, meaning that the query pipeline runs one row at a time. This gets us 1319 QMpH which is a bit worse than 6 Single. This is to be expected since there is some overhead to running vectored with single-element vectors. Q5 on 7 Single with vectoring and a single thread runs at 1.9 qps; with single-element vectors, at 0.8 qps. The 6 Single engine runs Q5 at 1.13 qps.&lt;/p&gt; &lt;p&gt;The 100 Mt scale 7 Single gains the most from adding clients; the 1000 Mt 6 Single gains the least. The reason for the latter is covered in detail in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1b9ed390&quot;&gt;A Benchmarking Story&lt;/a&gt;. We note that while vectoring is primarily geared to better single-thread speed and better &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1ddc2f78&quot;&gt;cache&lt;/a&gt; hit rates, it delivers a huge multithreaded benefit by eliminating the mutex contention at the index tree top which stops 6 Single dead at 1000 Mt.&lt;/p&gt; &lt;p&gt;In conclusion, we see that even with a workload of short queries and little opportunity for parallelism, we get substantial benefits from query parallelization and vectoring. When moving to more complex workloads, the benefits become more pronounced. For a single user complex query load, we can get 7x speed-up from parallelism (8 core), plus up to 3x from vectoring. These numbers do not take into account the benefits of the column store; those will be analyzed separately a bit later.&lt;/p&gt; &lt;p&gt;The full run details will be supplied at the end of this &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1e9f69f0&quot;&gt;blog&lt;/a&gt; series.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1d0bb988&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x155fc700&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d96e218&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1d7a5170&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1def9ca0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1a7a7800&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1e9c6c68&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1e80c208&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dafd290&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1f34f7f8&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x2aac193e9828&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aabdc4b7a98&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x2aabf5018ad8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x2aabdf3496b8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:46:13.751710-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Data Spaces</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-03-01#1662</atom:id>
  <atom:published>2011-03-01T23:49:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;There is increasing coalescence around the idea that HTTP-based &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e93cbd0&quot;&gt;Linked Data&lt;/a&gt; adds a tangible dimension to the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1dfdde10&quot;&gt;World Wide Web&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;). This &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Dimension&lt;/i&gt; grants end-users, power-users, integrators, and developers the ability to experience the Web not solely as a &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x19d02b00&quot;&gt;Information&lt;/a&gt; Space&lt;/i&gt; or &lt;i&gt;Document Space,&lt;/i&gt; but now also as a &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x1ac33378&quot;&gt;Data Space&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Here is a simple What and Why guide covering the essence of Data Spaces.&lt;/p&gt; &lt;h2&gt;What is a Data Space?&lt;/h2&gt; &lt;p&gt;A Data Space is a point of presence on a network, where every &lt;i&gt;Data Object&lt;/i&gt; (item or &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1d55f910&quot;&gt;entity&lt;/a&gt;) is given a &lt;i&gt;Name&lt;/i&gt; (e.g., a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1736ea28&quot;&gt;URI&lt;/a&gt;) by which it may be Referenced or Identified. &lt;/p&gt; &lt;p&gt;In a Data Space, every &lt;i&gt;Representation&lt;/i&gt; of those Data Objects (i.e., every &lt;i&gt;Object Representation&lt;/i&gt;) has an &lt;i&gt;Address&lt;/i&gt; (e.g., a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1f17f5a8&quot;&gt;URL&lt;/a&gt;) from which it may be Retrieved (or &amp;quot;gotten&amp;quot;).&lt;/p&gt; &lt;p&gt;In a Data Space, every Object Representation is a time variant (that is, it changes over time), streamable, and format-agnostic &lt;i&gt;Resource.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;An Object Representation is simply a Description of that Object. It takes the form of a graph, pictorially constructed from sets of 3 elements which are themselves named &lt;i&gt;Subject,&lt;/i&gt; &lt;i&gt;Predicate,&lt;/i&gt; and &lt;i&gt;Object&lt;/i&gt; (or &lt;i&gt;SPO&lt;/i&gt;); or &lt;i&gt;Entity,&lt;/i&gt; &lt;i&gt;Attribute,&lt;/i&gt; and &lt;i&gt;Value&lt;/i&gt; (or &lt;i&gt;EAV&lt;/i&gt;). Each &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x1dedcfe0&quot;&gt;Entity&lt;/a&gt;+Attribute+Value or Subject+Predicate+Object set (or &lt;i&gt;triple&lt;/i&gt;), is one datum, one piece of data, one persisted observation about a given Subject or Entity.&lt;/p&gt; &lt;p&gt;The underlying Schema that defines and constrains the construction of Object Representations is based on Logic, specifically &lt;i&gt;First-Order Logic&lt;/i&gt;. Each Object Representation is a collection of persisted observations (&lt;i&gt;Data&lt;/i&gt;) about a given Subject, which aid observers in materializing their perception (&lt;i&gt;Information&lt;/i&gt;), and ultimately comprehension (&lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1a4c7bf8&quot;&gt;Knowledge&lt;/a&gt;&lt;/i&gt;), of that Subject.&lt;/p&gt; &lt;h2&gt;Why are Data Spaces important?&lt;/h2&gt; &lt;p&gt;In the real-world -- which is networked by nature -- data is heterogeneously (or &amp;quot;differently&amp;quot;) shaped, and disparately located. &lt;/p&gt; &lt;p&gt;Data has been increasing at an alarming rate since the advent of computing; the interWeb simply provides &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id0x1ad97358&quot;&gt;context&lt;/a&gt; that makes this reality more palpable and more exploitable, and in the process virtuously ups the ante through increasingly exponential growth rates.&lt;/p&gt; &lt;p&gt;We can&amp;#39;t stop data heterogeneity; it is endemic to the nature of its producers -- humans and/or human-directed machines. What we can do, though, is create a powerful Conceptual-level &amp;quot;bus&amp;quot; or &amp;quot;interface&amp;quot; for data integration, based on &lt;i&gt;Data Description oriented Logic&lt;/i&gt; rather than Data Representation oriented Formats. Basically, it&amp;#39;s possible for us to use a &lt;i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/First-order_predicate_logic&quot; id=&quot;link-id0x1a481248&quot;&gt;Common Logic&lt;/a&gt;&lt;/i&gt; as the basis for expressing and blending SPO- or EAV-based Object Representations in a variety of Formats (or &amp;quot;dialects&amp;quot;).&lt;/p&gt; &lt;p&gt;The roadmap boils down to:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Assigning unambiguous Object Names to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Every record (or, in table terms, every row); &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Every record attribute (or, in table terms, every field or column);&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Every record relationship (that is, every relationship between one record and another);&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Every record container (e.g., every table or view in a relational database, every named graph, every spreadsheet, every text file, etc.);&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Making each Object Name resolve to an Address through which Create, Read, Update, and Delete (&amp;quot;CRUD&amp;quot;) operations can be performed against (can &lt;i&gt;access&lt;/i&gt;) the associated Object Representation graph.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2011-03-01T17:26:15-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 2): A Benchmarking Story</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-02-28#1661</atom:id>
  <atom:published>2011-02-28T21:12:28Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;i&gt;Caeterum censeo, benchmarks are for vendors...&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;This is an edifying story about benchmarks and how databases work. I will show how one detail makes a 5+x difference, and how one really must understand how things work in order to make sense of benchmarks.&lt;/p&gt; &lt;p&gt;We begin right after the publication of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1df843f8&quot;&gt;recent Berlin report&lt;/a&gt;. This report gives us OK performance for queries and very bad performance for loading. Trickle updates were not measurable. This comes as a consequence of testing intermediate software cuts and having incomplete instructions for operating them. I will cover the whole &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1d0b6ea0&quot;&gt;BSBM&lt;/a&gt; matter and the general benchmarking question in forthcoming posts; for now, let&amp;#39;s talk about specifics.&lt;/p&gt; &lt;p&gt;In the course of the discussion to follow, we talk about 3 different kinds of &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e09ee88&quot;&gt;Virtuoso&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; is the generally available single-instance-server configuration of Virtuoso. Whether this is open source or not does not make a difference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; is the generally available, commercial-only, cluster-capable Virtuoso.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; is the next-generation single-instance-server Virtuoso, about to be released as a preview.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We began by running the various parts of BSBM at different scales with different Virtuoso variants. In so doing, we noticed that the BSBM &lt;i&gt;Explore&lt;/i&gt; mix at one scale got better throughput as we added more clients, approximately as one would expect based on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1c1b4860&quot;&gt;CPU&lt;/a&gt; usage and number of cores, while at another scale this was not so.&lt;/p&gt; &lt;p&gt;At the 1-billion-triple scale (1000 Mt; 1 Mt = 1 Megatriple, or one million triples) we saw CPU going from 200% with 1 client to 1400% with 16 clients but throughput increased by less than 20%. &lt;/p&gt; &lt;p&gt;When we ran the same scale with our shared-nothing 6 Cluster, running 8 processes on the same box, throughput increased normally with the client count. We have not previously tried BSBM with 6 Cluster simply because there is little to gain and a lot to lose by distributing this workload. But here we got a multiuser throughput with 6 Cluster that is easily 3 times that of the single server, even with a cluster-unfriendly workload. &lt;/p&gt; &lt;p&gt; See, sometimes scaling out even within a shared memory multiprocessor pays! Still, what we saw was rather anomalous.&lt;/p&gt; &lt;p&gt;Over the years we have looked at performance any number of times and have a lot of built-in meters. For cases of high CPU with no throughput, the prime suspect is contention on critical sections. Quite right, when building with the mutex meter enabled, counting how many times each mutex is acquired and how many times this results in a wait, we found a mutex which gets acquired 600M times in the run, of which an insane 450M result in a wait. One can count a microsecond of real time each time a mutex wait results in the kernel switching tasks. The run took 500 s or so, of which 450 s of real time were attributable to the overhead of waiting for this one mutex.&lt;/p&gt; &lt;p&gt;Waiting for a mutex is a real train wreck. We have tried spinning a few times before it, which the OS does anyhow, but this does not help. Using spin locks is good only if waits are extremely rare; with any frequency of waiting, even for very short waits, a mutex is still a lot better.&lt;/p&gt; &lt;p&gt;Now, the mutex in question happens to serialize the buffer &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1e542088&quot;&gt;cache&lt;/a&gt; for one specific page of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x17c853d8&quot;&gt;data&lt;/a&gt;, one level down from the root of the index for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1d64a658&quot;&gt;RDF&lt;/a&gt; PSOG. By the luck of the draw, the Ps falling on that page are commonly accessed Ps pertaining to product features. In order to get any product feature value, one must pass via this page. At the smaller scale, the different properties web their different ways based on the index root.&lt;/p&gt; &lt;p&gt;One might here ask why the problem is one level down from the root and not in the root. The index root is already handled specially, so the read-write locks for buffers usually apply only for the first level down. One might also ask why have a mutex in the first place. Well, unless one is read-only and all in memory, there simply must be a way to say that a buffer must not get written to by one thread while another is reading it. Same for cache replacement. Some in-memory people fork a whole copy of the database process to do a large query and so can forget about serialization. But one must have long queries for this and have all in memory. One can make writes less frequent by keeping deltas, but this does not remove the need to merge the deltas at some point, which cannot happen without serializing this with the readers.&lt;/p&gt; &lt;p&gt;Most of the time the offending mutex is acquired for getting a property of a product in Q5, the one that looks for products with similar values of a numeric property. We retrieve this property for a number of products in one go, due to vectoring. Vectoring is supposed to save us from constantly hitting the index tree top when getting the next match. So how come there is contention in the index tree top? As it happens, the vectored index lookup checks for locality only when all search conditions on key parts are equalities. Here however there is equality on P and S and a range on O; hence, the lookup starts from the index root every time.&lt;/p&gt; &lt;p&gt;So I changed this. The effect was Q5 getting over twice as fast, with the single user throughput at 1000 Mt going from 2000 to 5200 QMpH (Query Mixes per Hour) and the 16-user throughput going from 3800 to over 21000 QMpH. The previously &amp;quot;good&amp;quot; throughput of 40K QMpH at 100 Mt went to 66K QMpH. &lt;/p&gt; &lt;p&gt;Vectoring can make a real difference. The throughputs for the same workload on 6 Single, without vectoring, thus unavoidably hitting the page with the crazy contention, are 1770 QMpH single user and 2487 QMpH with 16 users. The 6 Cluster throughput, avoiding the contention but without the increased locality from vectoring and with the increased latency of going out-of-process for most of the data, was about 11.5K QMpH with 16 users. Each partition had a page getting the hits but since the partitioning was on S and S was about-evenly distributed, each partition got 1/8 of the load; thus waiting on the mutex did not become a killer issue. &lt;/p&gt; &lt;p&gt;We see how detailed analysis of benchmarks can lead to almost an order of magnitude improvements in a short time. This analysis is however both difficult and tedious. It is not readily delegable; one needs real &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1e7249d0&quot;&gt;knowledge&lt;/a&gt; of how things work and of how they ought to work in order to get anywhere with this. Experience tends to show that a competitive situation is needed in order to motivate one to go to the trouble. Unless something really sticks out in an obvious manner, one is most likely not going to look deep enough. Of course, this is seen in applications too but application &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1d429e80&quot;&gt;optimization&lt;/a&gt; tends to stop at a point where the application is usable. Also stored procedures and specially-tweaked queries will usually help. In most application scenarios, we are not simultaneously looking at multiple different implementations, except maybe at the start of development but then this falls under benchmarking and evaluation.&lt;/p&gt; &lt;p&gt;So, the usefulness of benchmarks is again confirmed. There is likely great unexplored space for improvement as we move to more interesting and diverse scenarios.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1f619550&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Benchmarks, Redux (part 2): A Benchmarking Story &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1caa7cd8&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d8b7648&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f2a6ba8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x17b425f0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1a7f6b30&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1ee5ec98&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1b7c5af8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dad7588&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1c5520a0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1eb19bf8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1eb2c398&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1fb6a118&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1f160580&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:16:40-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 2): A Benchmarking Story</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-02-28#1660</atom:id>
  <atom:published>2011-02-28T21:12:28Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;i&gt;Caeterum censeo, benchmarks are for vendors...&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;This is an edifying story about benchmarks and how databases work. I will show how one detail makes a 5+x difference, and how one really must understand how things work in order to make sense of benchmarks.&lt;/p&gt; &lt;p&gt;We begin right after the publication of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1df843f8&quot;&gt;recent Berlin report&lt;/a&gt;. This report gives us OK performance for queries and very bad performance for loading. Trickle updates were not measurable. This comes as a consequence of testing intermediate software cuts and having incomplete instructions for operating them. I will cover the whole &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1da5e160&quot;&gt;BSBM&lt;/a&gt; matter and the general benchmarking question in forthcoming posts; for now, let&amp;#39;s talk about specifics.&lt;/p&gt; &lt;p&gt;In the course of the discussion to follow, we talk about 3 different kinds of &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c1e12f0&quot;&gt;Virtuoso&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Single&lt;/i&gt; is the generally available single-instance-server configuration of Virtuoso. Whether this is open source or not does not make a difference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;6 Cluster&lt;/i&gt; is the generally available, commercial-only, cluster-capable Virtuoso.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;7 Single&lt;/i&gt; is the next-generation single-instance-server Virtuoso, about to be released as a preview.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;We began by running the various parts of BSBM at different scales with different Virtuoso variants. In so doing, we noticed that the BSBM &lt;i&gt;Explore&lt;/i&gt; mix at one scale got better throughput as we added more clients, approximately as one would expect based on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1ddb5200&quot;&gt;CPU&lt;/a&gt; usage and number of cores, while at another scale this was not so.&lt;/p&gt; &lt;p&gt;At the 1-billion-triple scale (1000 Mt; 1 Mt = 1 Megatriple, or one million triples) we saw CPU going from 200% with 1 client to 1400% with 16 clients but throughput increased by less than 20%. &lt;/p&gt; &lt;p&gt;When we ran the same scale with our shared-nothing 6 Cluster, running 8 processes on the same box, throughput increased normally with the client count. We have not previously tried BSBM with 6 Cluster simply because there is little to gain and a lot to lose by distributing this workload. But here we got a multiuser throughput with 6 Cluster that is easily 3 times that of the single server, even with a cluster-unfriendly workload. &lt;/p&gt; &lt;p&gt; See, sometimes scaling out even within a shared memory multiprocessor pays! Still, what we saw was rather anomalous.&lt;/p&gt; &lt;p&gt;Over the years we have looked at performance any number of times and have a lot of built-in meters. For cases of high CPU with no throughput, the prime suspect is contention on critical sections. Quite right, when building with the mutex meter enabled, counting how many times each mutex is acquired and how many times this results in a wait, we found a mutex which gets acquired 600M times in the run, of which an insane 450M result in a wait. One can count a microsecond of real time each time a mutex wait results in the kernel switching tasks. The run took 500 s or so, of which 450 s of real time were attributable to the overhead of waiting for this one mutex.&lt;/p&gt; &lt;p&gt;Waiting for a mutex is a real train wreck. We have tried spinning a few times before it, which the OS does anyhow, but this does not help. Using spin locks is good only if waits are extremely rare; with any frequency of waiting, even for very short waits, a mutex is still a lot better.&lt;/p&gt; &lt;p&gt;Now, the mutex in question happens to serialize the buffer &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1c1c29d8&quot;&gt;cache&lt;/a&gt; for one specific page of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c1c2a30&quot;&gt;data&lt;/a&gt;, one level down from the root of the index for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e543ce0&quot;&gt;RDF&lt;/a&gt; PSOG. By the luck of the draw, the Ps falling on that page are commonly accessed Ps pertaining to product features. In order to get any product feature value, one must pass via this page. At the smaller scale, the different properties web their different ways based on the index root.&lt;/p&gt; &lt;p&gt;One might here ask why the problem is one level down from the root and not in the root. The index root is already handled specially, so the read-write locks for buffers usually apply only for the first level down. One might also ask why have a mutex in the first place. Well, unless one is read-only and all in memory, there simply must be a way to say that a buffer must not get written to by one thread while another is reading it. Same for cache replacement. Some in-memory people fork a whole copy of the database process to do a large query and so can forget about serialization. But one must have long queries for this and have all in memory. One can make writes less frequent by keeping deltas, but this does not remove the need to merge the deltas at some point, which cannot happen without serializing this with the readers.&lt;/p&gt; &lt;p&gt;Most of the time the offending mutex is acquired for getting a property of a product in Q5, the one that looks for products with similar values of a numeric property. We retrieve this property for a number of products in one go, due to vectoring. Vectoring is supposed to save us from constantly hitting the index tree top when getting the next match. So how come there is contention in the index tree top? As it happens, the vectored index lookup checks for locality only when all search conditions on key parts are equalities. Here however there is equality on P and S and a range on O; hence, the lookup starts from the index root every time.&lt;/p&gt; &lt;p&gt;So I changed this. The effect was Q5 getting over twice as fast, with the single user throughput at 1000 Mt going from 2000 to 5200 QMpH (Query Mixes per Hour) and the 16-user throughput going from 3800 to over 21000 QMpH. The previously &amp;quot;good&amp;quot; throughput of 40K QMpH at 100 Mt went to 66K QMpH. &lt;/p&gt; &lt;p&gt;Vectoring can make a real difference. The throughputs for the same workload on 6 Single, without vectoring, thus unavoidably hitting the page with the crazy contention, are 1770 QMpH single user and 2487 QMpH with 16 users. The 6 Cluster throughput, avoiding the contention but without the increased locality from vectoring and with the increased latency of going out-of-process for most of the data, was about 11.5K QMpH with 16 users. Each partition had a page getting the hits but since the partitioning was on S and S was about-evenly distributed, each partition got 1/8 of the load; thus waiting on the mutex did not become a killer issue. &lt;/p&gt; &lt;p&gt;We see how detailed analysis of benchmarks can lead to almost an order of magnitude improvements in a short time. This analysis is however both difficult and tedious. It is not readily delegable; one needs real &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1c1e2578&quot;&gt;knowledge&lt;/a&gt; of how things work and of how they ought to work in order to get anywhere with this. Experience tends to show that a competitive situation is needed in order to motivate one to go to the trouble. Unless something really sticks out in an obvious manner, one is most likely not going to look deep enough. Of course, this is seen in applications too but application &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x1c59f4d8&quot;&gt;optimization&lt;/a&gt; tends to stop at a point where the application is usable. Also stored procedures and specially-tweaked queries will usually help. In most application scenarios, we are not simultaneously looking at multiple different implementations, except maybe at the start of development but then this falls under benchmarking and evaluation.&lt;/p&gt; &lt;p&gt;So, the usefulness of benchmarks is again confirmed. There is likely great unexplored space for improvement as we move to more interesting and diverse scenarios.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1658&quot; id=&quot;link-id0x1f619550&quot;&gt;Benchmarks, Redux (part 1): On RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Benchmarks, Redux (part 2): A Benchmarking Story &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1caa7cd8&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1d8b7648&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1f2a6ba8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x17b425f0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x1a7f6b30&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1ee5ec98&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1b7c5af8&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1dad7588&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1c5520a0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0x199d1098&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x19dd7508&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x1742dac8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x163b7178&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:46:20.966390-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 1): On RDF Benchmarks</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-02-28#1659</atom:id>
  <atom:published>2011-02-28T20:20:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post introduces a series on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e724ae0&quot;&gt;RDF&lt;/a&gt; benchmarking. In these posts I will cover the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Correct misleading &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1e325480&quot;&gt;information&lt;/a&gt; about us in the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1ded41d0&quot;&gt;recent Berlin report&lt;/a&gt;: The load rate is off-the wall and the update mix is missing. We supply the right numbers and explain how to load things so that one gets decent performance.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Discuss configuration options for &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e0a2548&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Tell a story about multithreading and its perils and how vectoring and scale-out can save us.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Analyze the run time behavior of Virtuoso 6 Single, 6 Cluster, and 7 Single.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Look at the benefits of SSDs (solid-state storage devices) over HDDs (hard disk devices; spinning platters), and I/O matters in general.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Talk in general about modalities of benchmark running, and how to reconcile vendors doing what they know best with the air of legitimacy of a third party. Whether to do things a la &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e0ef4f0&quot;&gt;TPC&lt;/a&gt; or a la TREC? We will hopefully try a bit of both, at least so I have proposed to our partners in &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x1e54d3d8&quot;&gt;LOD2&lt;/a&gt;, the EU FP7 that also funded the recent Berlin report.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Outline the desiderata for an RDF benchmark that is not just an RDF-ized relational workload, the Social Intelligence Benchmark.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1e730bc8&quot;&gt;BSBM&lt;/a&gt; in specific. What does it measure?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Discuss some experiments with the BI use case of BSBM.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Document how the results mentioned here were obtained and suggest practices for benchmark running and disclosure.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The background is that the LOD2 FP7 project is supposed to deliver a report about the state of the art and benchmark laboratory by March 1. The Berlin report is a part thereof. In the project proposal we talk about an ongoing benchmarking activity and about having up-to-date installations of the relevant RDF stores and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1c1551e0&quot;&gt;RDBMS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Since this is taxpayer money for supposedly the common good, I see no reason why such a useful thing should be restricted to the project participants. On the other hand, running a display window of stuff for benchmarking, when in at least in some cases licenses prohibit unauthorized publishing of benchmark results might be seen to conflict with the spirit of the license if not its letter. We will see.&lt;/p&gt; &lt;p&gt;For now, my take is that we want to run benchmarks of all interesting software, inviting the vendors to tell us how to do that if they will, and maybe even letting them perform those runs themselves. Then we promise not to disclose results without the vendor&amp;#39;s permission. Access to the installations is limited to whoever operates the equipment. Configuration files and detailed hardware specs and such on the other hand will be made public. If a run is published, it will be with permission and in a format that includes full information for replicating the experiment.&lt;/p&gt; &lt;p&gt;In the LOD2 proposal we also in so many words say that we will stretch the limits of the state of the art. This stretching is surely not limited to the project&amp;#39;s own products but should also include the general benchmarking aspect. I will say with confidence that running single server benchmarks at a max 200 Mtriples of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x11327f10&quot;&gt;data&lt;/a&gt; is not stretching anything.&lt;/p&gt; &lt;p&gt;So to ameliorate this situation, I thought to run the same at 10x the scale on a couple of large boxes we have access to. 1 and 2 billion triples are still comfortably single server scales. Then we could go for example to Giovanni&amp;#39;s cluster at &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x1bfaffa0&quot;&gt;DERI&lt;/a&gt; and do 10 and 20 billion triples, this should fly reasonably on 8 or 16 nodes of the DERI gear. Or we might talk to SEALS who by now should have their own lab. Even Amazon &lt;a class=&quot;auto-href&quot; href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0x1bfafef8&quot;&gt;EC2&lt;/a&gt; might be an option, although not the preferred one.&lt;/p&gt; &lt;p&gt;So I asked everybody about config instructions, which produced a certain amount of dismay as I might be said to be biased and to be skirting the edges of conflict of interest. The inquiry was not altogether negative though since &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x1eccc1e0&quot;&gt;Ontotext&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x1eccc208&quot;&gt;Garlik&lt;/a&gt; provided some information. We will look into these this and next week. We will not publish any information without asking first.&lt;/p&gt; &lt;p&gt;In this series of posts I will only talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1bfa4030&quot;&gt;OpenLink Software&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Benchmarks, Redux (part 1): On RDF Benchmarks &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1b668d10&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1b3a0c08&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1f9f1740&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ad929f8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1db437c0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x17138c38&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1c0e74f8&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1f297d10&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1e4994b8&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ebea6d0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1d5c86c0&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1efec0e0&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1a9941f8&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=&quot; id=&quot;link-id0x1ea26de8&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-14T17:16:34.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Benchmarks, Redux (part 1): On RDF Benchmarks</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-02-28#1658</atom:id>
  <atom:published>2011-02-28T20:20:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post introduces a series on &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ea861a8&quot;&gt;RDF&lt;/a&gt; benchmarking. In these posts I will cover the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Correct misleading &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x17f5faa8&quot;&gt;information&lt;/a&gt; about us in the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/results/V6/index.html&quot; id=&quot;link-id0x1ded41d0&quot;&gt;recent Berlin report&lt;/a&gt;: The load rate is off-the wall and the update mix is missing. We supply the right numbers and explain how to load things so that one gets decent performance.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Discuss configuration options for &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1ac63820&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Tell a story about multithreading and its perils and how vectoring and scale-out can save us.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Analyze the run time behavior of Virtuoso 6 Single, 6 Cluster, and 7 Single.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Look at the benefits of SSDs (solid-state storage devices) over HDDs (hard disk devices; spinning platters), and I/O matters in general.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Talk in general about modalities of benchmark running, and how to reconcile vendors doing what they know best with the air of legitimacy of a third party. Whether to do things a la &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x19c0a7f0&quot;&gt;TPC&lt;/a&gt; or a la TREC? We will hopefully try a bit of both, at least so I have proposed to our partners in &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0xa2e6170&quot;&gt;LOD2&lt;/a&gt;, the EU FP7 that also funded the recent Berlin report.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Outline the desiderata for an RDF benchmark that is not just an RDF-ized relational workload, the Social Intelligence Benchmark.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x17c81c20&quot;&gt;BSBM&lt;/a&gt; in specific. What does it measure?&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Discuss some experiments with the BI use case of BSBM.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Document how the results mentioned here were obtained and suggest practices for benchmark running and disclosure.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The background is that the LOD2 FP7 project is supposed to deliver a report about the state of the art and benchmark laboratory by March 1. The Berlin report is a part thereof. In the project proposal we talk about an ongoing benchmarking activity and about having up-to-date installations of the relevant RDF stores and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x17f2a230&quot;&gt;RDBMS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Since this is taxpayer money for supposedly the common good, I see no reason why such a useful thing should be restricted to the project participants. On the other hand, running a display window of stuff for benchmarking, when in at least in some cases licenses prohibit unauthorized publishing of benchmark results might be seen to conflict with the spirit of the license if not its letter. We will see.&lt;/p&gt; &lt;p&gt;For now, my take is that we want to run benchmarks of all interesting software, inviting the vendors to tell us how to do that if they will, and maybe even letting them perform those runs themselves. Then we promise not to disclose results without the vendor&amp;#39;s permission. Access to the installations is limited to whoever operates the equipment. Configuration files and detailed hardware specs and such on the other hand will be made public. If a run is published, it will be with permission and in a format that includes full information for replicating the experiment.&lt;/p&gt; &lt;p&gt;In the LOD2 proposal we also in so many words say that we will stretch the limits of the state of the art. This stretching is surely not limited to the project&amp;#39;s own products but should also include the general benchmarking aspect. I will say with confidence that running single server benchmarks at a max 200 Mtriples of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d7499d8&quot;&gt;data&lt;/a&gt; is not stretching anything.&lt;/p&gt; &lt;p&gt;So to ameliorate this situation, I thought to run the same at 10x the scale on a couple of large boxes we have access to. 1 and 2 billion triples are still comfortably single server scales. Then we could go for example to Giovanni&amp;#39;s cluster at &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x17c46a88&quot;&gt;DERI&lt;/a&gt; and do 10 and 20 billion triples, this should fly reasonably on 8 or 16 nodes of the DERI gear. Or we might talk to SEALS who by now should have their own lab. Even Amazon &lt;a class=&quot;auto-href&quot; href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0x8bed290&quot;&gt;EC2&lt;/a&gt; might be an option, although not the preferred one.&lt;/p&gt; &lt;p&gt;So I asked everybody about config instructions, which produced a certain amount of dismay as I might be said to be biased and to be skirting the edges of conflict of interest. The inquiry was not altogether negative though since &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x1d269998&quot;&gt;Ontotext&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x1bbc0a48&quot;&gt;Garlik&lt;/a&gt; provided some information. We will look into these this and next week. We will not publish any information without asking first.&lt;/p&gt; &lt;p&gt;In this series of posts I will only talk about &lt;a class=&quot;auto-href&quot; href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1ea6d948&quot;&gt;OpenLink Software&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt; &lt;i&gt;Benchmarks, Redux&lt;/i&gt; Series&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Benchmarks, Redux (part 1): On RDF Benchmarks &lt;i&gt;(this post)&lt;/i&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1660&quot; id=&quot;link-id0x1b668d10&quot;&gt;Benchmarks, Redux (part 2): A Benchmarking Story&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1663&quot; id=&quot;link-id0x1b3a0c08&quot;&gt;Benchmarks, Redux (part 3): Virtuoso 7 vs 6 on BSBM Load and Explore&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1665&quot; id=&quot;link-id0x1f9f1740&quot;&gt;Benchmarks, Redux (part 4): Benchmark Tuning Questionnaire&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1667&quot; id=&quot;link-id0x1ad929f8&quot;&gt;Benchmarks, Redux (part 5): BSBM and I/O; HDDs and SSDs &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1669&quot; id=&quot;link-id0x1db437c0&quot;&gt;Benchmarks, Redux (part 6): BSBM and I/O, continued&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1671&quot; id=&quot;link-id0x17138c38&quot;&gt;Benchmarks, Redux (part 7): What Does BSBM Explore Measure?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1673&quot; id=&quot;link-id0x1c0e74f8&quot;&gt;Benchmarks, Redux (part 8): BSBM Explore and Update &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1675&quot; id=&quot;link-id0x1f297d10&quot;&gt;Benchmarks, Redux (part 9): BSBM With Cluster&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1677&quot; id=&quot;link-id0x1e4994b8&quot;&gt;Benchmarks, Redux (part 10): LOD2 and the Benchmark Process&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1678&quot; id=&quot;link-id0x1ebea6d0&quot;&gt;Benchmarks, Redux (part 11): On the Substance of RDF Benchmarks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1681&quot; id=&quot;link-id0xde5f8d8&quot;&gt;Benchmarks, Redux (part 12): Our Own BSBM Results Report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1682&quot; id=&quot;link-id0x2aac0096f988&quot;&gt;Benchmarks, Redux (part 13): BSBM BI Modifications &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1683&quot; id=&quot;link-id0x1b7a1e98&quot;&gt;Benchmarks, Redux (part 14): BSBM BI Mix &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1684&quot; id=&quot;link-id0x19f13b68&quot;&gt;Benchmarks, Redux (part 15): BSBM Test Driver Enhancements &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2014-08-21T10:46:27.527016-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>New Preconfigured Virtuoso AMI for Amazon EC2 Cloud comprised of Linked Data from BBC &amp; DBpedia</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-02-18#1657</atom:id>
  <atom:published>2011-02-19T01:20:30Z</atom:published>
  <atom:content type="html">&lt;h2&gt;What?&lt;/h2&gt; &lt;p&gt;Introducing a new preloaded and preconfigured &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bbe32d8&quot;&gt;Virtuoso&lt;/a&gt; (Cluster Edition) AMI for the Amazon EC2 Cloud that hosts combined Linked Datasets from: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/About&quot; id=&quot;link-id0x1d21e780&quot;&gt;DBpedia 3.6&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/programmes&quot; id=&quot;link-id0x1e1e0b10&quot;&gt;BBC Programmes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/music&quot; id=&quot;link-id0x1db12bd0&quot;&gt;BBC Music&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/nature/&quot; id=&quot;link-id0x1bd46450&quot;&gt;BBC Nature&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/food/recipes/&quot; id=&quot;link-id0x1d1b2468&quot;&gt;BBC Food Recipes&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Why?&lt;/h2&gt; &lt;p&gt; Predictably instantiate a powerful database with high quality &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; and cross links within minutes, for personal or service specific use. &lt;/p&gt; &lt;h2&gt;How?&lt;/h2&gt; &lt;p&gt;Simply follow the instructions in our &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSBBCMusicProgNatureFoodAndDBpedia36&quot; id=&quot;link-id0x1d4f3210&quot;&gt;Amazon EC2 guide for the BBC + DBpedia 3.6 Linked Dataset&lt;/a&gt; guide.&lt;/p&gt; &lt;p&gt;Your installation steps are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Instantiate a Virtuoso EC2 AMI &lt;/li&gt; &lt;li&gt; Mount the Amazon Elastic Block Storage (EBS) snapshot that hosts the preloaded Virtuoso Database. &lt;/li&gt; &lt;/ol&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/reduxd/beyond-the-polar-bear&quot; id=&quot;link-id0x1b384af0&quot;&gt;BBC Linked Data Spaces Presentation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_music_solo_artists_snapshot.png&quot; id=&quot;link-id0x1a7a5ae0&quot;&gt;BBC Music Linked Dataset Snapshot&lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_programmes_snapshot_sorted_by_genre.png&quot; id=&quot;link-id0x1c2022a8&quot;&gt;BBC Programmes Linked Dataset Snapshot&lt;/a&gt; -- -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_nature_snapshot_sorted_by_adaptation.png&quot; id=&quot;link-id0x1e138ac0&quot;&gt;BBC Nature Linked Dataset Snapshot&lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_recipes_snapshot.png&quot; id=&quot;link-id0x1b795100&quot;&gt;BBC Food Recipes Snapshot &lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/bbc_linkeddata&quot; id=&quot;link-id0x1a581cf8&quot;&gt;My Del.icio.us bookmark collection re. BBC Linked Data Demos&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpediaBBC&quot; id=&quot;link-id0x1dc0cc08&quot;&gt;Amazon EC2 Snapshots for DBpedia 3.6 + BBC combo&lt;/a&gt; -- delivers the BBC and DBpedia dataset combo via a mountable Elastic Block Storage (EBS) device usable with an Amazon Machine Image (AMI) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia351C&quot; id=&quot;link-id0x1de33b50&quot;&gt;Amazon EC2 Snapshots for DBpedia 3.6 &amp;amp; 3.5&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x1c3e27c8&quot;&gt;Virtuoso Commercial Edition Download Page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusterstcnf.html&quot; id=&quot;link-id0x1d0ff170&quot;&gt;Virtuoso Cluster Edition Guide&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-29T09:52:17.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia + BBC (combined) Linked Data Space Installation Guide</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-02-17#1656</atom:id>
  <atom:published>2011-02-17T22:15:41Z</atom:published>
  <atom:content type="html">&lt;h2&gt;What? &lt;/h2&gt; &lt;p&gt; The &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1c489cc8&quot;&gt;DBpedia&lt;/a&gt; + &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/BBC&quot; id=&quot;link-id0x1bf12698&quot;&gt;BBC&lt;/a&gt; Combo Linked Dataset &lt;/i&gt; is a preconfigured &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1b16cbb0&quot;&gt;Virtuoso&lt;/a&gt; Cluster (4 Virtuoso Cluster Nodes, each comprised of one Virtuoso Instance; initial deployment is to a single Cluster Host, but license may be converted for physically distributed deployment), available via the Amazon EC2 Cloud, preloaded with the following datasets: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/About&quot; id=&quot;link-id0x1d21e780&quot;&gt;DBpedia 3.6&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/programmes&quot; id=&quot;link-id0x1e1e0b10&quot;&gt;BBC Programmes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/music&quot; id=&quot;link-id0x1db12bd0&quot;&gt;BBC Music&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/nature/&quot; id=&quot;link-id0x1bd46450&quot;&gt;BBC Nature&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/food/recipes/&quot; id=&quot;link-id0x1d1b2468&quot;&gt;BBC Food Recipes&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Why?&lt;/h2&gt; &lt;p&gt;The BBC has been publishing &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1b15eb60&quot;&gt;Linked Data&lt;/a&gt; from its &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x1c4c38a8&quot;&gt;Data Space&lt;/a&gt; for a number of years. In line with best practices for injecting Linked Data into the &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1e5acda0&quot;&gt;World Wide Web&lt;/a&gt; (Web), the BBC datasets are interlinked with other datasets such as DBpedia and MusicBrainz. &lt;/p&gt; &lt;p&gt;Typical follow-your-nose exploration using a Web Browser (or even via sophisticated &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1d21e728&quot;&gt;SPARQL&lt;/a&gt; query crawls) isn&amp;#39;t always practical once you get past the initial euphoria that comes from comprehending the Linked Data concept. As your queries get more complex, the overhead of remote sub-queries increases its impact, until query results take so long to return that you simply give up.&lt;/p&gt; &lt;p&gt;Thus, maximizing the effects of the BBC&amp;#39;s efforts requires Linked Data that shares locality in a Web-accessible Data Space — i.e., where all Linked Data sets have been loaded into the same data store or warehouse. This holds true even when leveraging SPARQL-FED style virtualization — there&amp;#39;s always a need to localize data as part of any marginally-decent locality-aware cost-optimization algorithm.&lt;/p&gt; &lt;p&gt;This DBpedia + BBC dataset, exposed via a preloaded and preconfigured Virtuoso Cluster, delivers a practical point of presence on the Web for immediate and cost-effective exploitation of Linked Data at the individual and/or service specific levels.&lt;/p&gt; &lt;h2&gt;How?&lt;/h2&gt; To work through this guide, you&amp;#39;ll need to start with 90 GB of free disk space. (Only 41 GB will be consumed after you delete the installer archives, but starting with 90+ GB ensures enough work space for the installation.) &lt;h3&gt;Install Virtuoso&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x1af0d230&quot;&gt;Download Virtuoso installer archive(s)&lt;/a&gt;. You must deploy the Personal or Enterprise Edition; the Open Source Edition does not support Shared-Nothing Cluster Deployment.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/pricing/&quot; id=&quot;link-id0x1e089f40&quot;&gt;Obtain a Virtuoso Cluster license&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/VirtuosoInstallDocs&quot; id=&quot;link-id0x1e86d060&quot;&gt;Install Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Set key environment variables and start the OpenLink License Manager, using command (this may vary depending on your shell and install directory): &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;. /opt/virtuoso/virtuoso-enterprise.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Optional:&lt;/i&gt; To keep the default single-server configuration file and demo database intact, set the &lt;code&gt;VIRTUOSO_HOME&lt;/code&gt; environment variable to a different directory, e.g., &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;export VIRTUOSO_HOME=/opt/virtuoso/cluster-home/&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; You will have to adjust this setting every time you shift between this cluster setup and your single-server setup. Either may be made your environment&amp;#39;s default through the &lt;code&gt;virtuoso-enterprise.sh&lt;/code&gt; and related scripts.&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusterstcnf.html&quot; id=&quot;link-id0x1e184dc0&quot;&gt;Set up your cluster&lt;/a&gt; by running the &lt;code&gt;mkcluster.sh&lt;/code&gt; script. Note that initial deployment of the &lt;i&gt;DBpedia + BBC Combo&lt;/i&gt; requires a 4 node cluster, which is the default for this script.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Start the Virtuoso Cluster with this command:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;virtuoso-start.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Stop the Virtuoso Cluster with this command:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;virtuoso-stop.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Using the DBpedia + BBC Combo dataset&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Navigate to your installation directory.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Download the combo dataset installer script — &lt;code&gt;&lt;a href=&quot;https://s3.amazonaws.com/bbc-dbpedia-36-usa/bbc-dbpedia-install.sh&quot; id=&quot;link-id0x195d7940&quot;&gt;bbc-dbpedia-install.sh&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;For best results, set the downloaded script to fully executable using this command:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;chmod 755 bbc-dbpedia-install.sh &lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Shut down any Virtuoso instances that may be currently running.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Optional:&lt;/i&gt; As above, if you have decided to keep the default single-server configuration file and demo database intact, set the &lt;code&gt;VIRTUOSO_HOME&lt;/code&gt; environment variable appropriately, e.g., &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;export VIRTUOSO_HOME=/opt/virtuoso/cluster-home/&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Run the combo dataset installer script with this command:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;sh bbc-dbpedia-install.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Verify installation&lt;/h3&gt; &lt;p&gt;The combo dataset typically deploys to EC2 virtual machines in under 90 minutes; your time will vary depending on your network connection speed, machine speed, and other variables.&lt;/p&gt; &lt;p&gt;Once the script completes, perform the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Verify that the Virtuoso Conductor (HTTP-based Admin UI) is in place via:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/conductor&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Verify that the Virtuoso SPARQL endpoint is in place via:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/sparql&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Verify that the Precision Search &amp;amp; Find UI is in place via:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/fct&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Verify that the Virtuoso hosted PivotViewer is in place via:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/PivotViewer&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/reduxd/beyond-the-polar-bear&quot; id=&quot;link-id0x1bd43bf0&quot;&gt;BBC Linked Data Spaces Presentation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_music_solo_artists_snapshot.png&quot; id=&quot;link-id0x1a7a5ae0&quot;&gt;BBC Music Linked Dataset Snapshot&lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_programmes_snapshot_sorted_by_genre.png&quot; id=&quot;link-id0x1c2022a8&quot;&gt;BBC Programmes Linked Dataset Snapshot&lt;/a&gt; -- -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_nature_snapshot_sorted_by_adaptation.png&quot; id=&quot;link-id0x1e138ac0&quot;&gt;BBC Nature Linked Dataset Snapshot&lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kidehen-images.s3.amazonaws.com/bbc_recipes_snapshot.png&quot; id=&quot;link-id0x1b795100&quot;&gt;BBC Food Recipes Snapshot &lt;/a&gt; -- PivotViewer Page Screenshot &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/bbc_linkeddata&quot; id=&quot;link-id0x1c0ffcc8&quot;&gt;My Del.icio.us bookmark collection re. BBC Linked Data Demos&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpediaBBC&quot; id=&quot;link-id0x1dc0cc08&quot;&gt;Amazon EC2 Snapshots for DBpedia 3.6 + BBC combo&lt;/a&gt; -- delivers the BBC and DBpedia dataset combo via a mountable Elasti&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1c2ad728&quot;&gt;c&lt;/a&gt; Block Storage (EBS) device usable with an Amazon Machine Image (AMI) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia351C&quot; id=&quot;link-id0x1de33b50&quot;&gt;Amazon EC2 Snapshots for DBpedia 3.6 &amp;amp; 3.5&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x1c3e27c8&quot;&gt;Virtuoso Commercial Edition Download Page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusterstcnf.html&quot; id=&quot;link-id0x1d0ff170&quot;&gt;Virtuoso Cluster Edition Guide&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-03-29T10:09:45.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL Guide for the Perl Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-25#1655</atom:id>
  <atom:published>2011-01-25T16:05:17Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What?&lt;/h3&gt; &lt;p&gt;A simple guide usable by any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Perl&quot; id=&quot;link-id0x1bdcab80&quot;&gt;Perl&lt;/a&gt; developer seeking to exploit &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x17b447e8&quot;&gt;SPARQL&lt;/a&gt; without hassles.&lt;/p&gt; &lt;h3&gt;Why?&lt;/h3&gt; &lt;p&gt;SPARQL is a powerful query language, results serialization format, and an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access protocol from the W3C. It provides a mechanism for accessing and integrating data across &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1cc76540&quot;&gt;Deductive Database Systems&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1d944d78&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c7a87c8&quot;&gt;Linked Data&lt;/a&gt; circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. &lt;/p&gt; &lt;h3&gt;How?&lt;/h3&gt; &lt;p&gt;SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing.&lt;/p&gt; &lt;h4&gt;Steps:&lt;/h4&gt; &lt;ol&gt; &lt;li&gt;Determine which SPARQL endpoint you want to access e.g. &lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d476520&quot;&gt;DBpedia&lt;/a&gt; or a local &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bcfe140&quot;&gt;Virtuoso&lt;/a&gt; instance (typically: http://localhost:8890/sparql). &lt;/li&gt; &lt;li&gt;If using Virtuoso, and you want to populate its quad store using SPARQL, assign &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1c7630b8&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot; (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Script:&lt;/h4&gt; &lt;pre&gt; # # Demonstrating use of a single query to populate a # Virtuoso Quad Store via Perl. # # # HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1d6465e8&quot;&gt;URL&lt;/a&gt; is constructed accordingly with CSV query results format as the default via mime type. # use CGI qw/:standard/; use LWP::UserAgent; use Data::Dumper; use Text::CSV_XS; sub sparqlQuery(@args) { my $query=shift; my $baseURL=shift; my $format=shift; %params=( &amp;quot;default-graph&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;should-sponge&amp;quot; =&amp;gt; &amp;quot;soft&amp;quot;, &amp;quot;query&amp;quot; =&amp;gt; $query, &amp;quot;debug&amp;quot; =&amp;gt; &amp;quot;on&amp;quot;, &amp;quot;timeout&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;format&amp;quot; =&amp;gt; $format, &amp;quot;save&amp;quot; =&amp;gt; &amp;quot;display&amp;quot;, &amp;quot;fname&amp;quot; =&amp;gt; &amp;quot;&amp;quot; ); @fragments=(); foreach $k (keys %params) { $fragment=&amp;quot;$k=&amp;quot;.CGI::escape($params{$k}); push(@fragments,$fragment); } $query=join(&amp;quot;&amp;amp;&amp;quot;, @fragments); $sparqlURL=&amp;quot;${baseURL}?$query&amp;quot;; my $ua = LWP::UserAgent-&amp;gt;new; $ua-&amp;gt;agent(&amp;quot;MyApp/0.1 &amp;quot;); my $req = HTTP::Request-&amp;gt;new(GET =&amp;gt; $sparqlURL); my $res = $ua-&amp;gt;request($req); $str=$res-&amp;gt;content; $csv = Text::CSV_XS-&amp;gt;new(); foreach $line ( split(/^/, $str) ) { $csv-&amp;gt;parse($line); @bits=$csv-&amp;gt;fields(); push(@rows, [ @bits ] ); } return \@rows; } # Setting Data Source Name (DSN) $dsn=&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;; # Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET using the IRI in # FROM clause as Data Source URL en route to DBMS # record Inserts. $query=&amp;quot;DEFINE get:soft \&amp;quot;replace\&amp;quot;\n # Generic (non Virtuoso specific SPARQL # Note: this will not add records to the # DBMS SELECT DISTINCT * FROM &amp;lt;$dsn&amp;gt; WHERE {?s ?p ?o}&amp;quot;; $data=sparqlQuery($query, &amp;quot;http://localhost:8890/sparql/&amp;quot;, &amp;quot;text/csv&amp;quot;); print &amp;quot;Retrieved data:\n&amp;quot;; print Dumper($data); &lt;/pre&gt; &lt;h4&gt;Output&lt;/h4&gt; &lt;pre&gt; Retrieved data: $VAR1 = [ [ &amp;#39;s&amp;#39;, &amp;#39;p&amp;#39;, &amp;#39;o&amp;#39; ], [ &amp;#39;http://dbpedia.org/resource/DBpedia&amp;#39;, &amp;#39;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;#39;, &amp;#39;http://www.w3.org/2002/07/owl#Thing&amp;#39; ], [ &amp;#39;http://dbpedia.org/resource/DBpedia&amp;#39;, &amp;#39;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;#39;, &amp;#39;http://dbpedia.org/ontology/Work&amp;#39; ], [ &amp;#39;http://dbpedia.org/resource/DBpedia&amp;#39;, &amp;#39;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;#39;, &amp;#39;http://dbpedia.org/class/yago/Software106566077&amp;#39; ], ... &lt;/pre&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt; CSV was chosen over XML (re. output format) since this is about a &amp;quot;no-brainer installation and utilization&amp;quot; guide for a Perl developer that already knows how to use Perl for HTTP based data access within HTML. SPARQL just provides an added bonus to URL dexterity (delivered via &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1d29da98&quot;&gt;URI&lt;/a&gt; abstraction) with regards to constructing Data Source Names or Addresses.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://cpansearch.perl.org/src/TOBYINK/RDF-Query-Client-0.103/README&quot; id=&quot;link-id0x1c279130&quot;&gt;RDF::Query::Client Guide&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1653&quot; id=&quot;link-id0x1cf307f0&quot;&gt;SPARQL Guide for the Perl Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1652&quot; id=&quot;link-id0x1b0ffb28&quot;&gt;SPARQL Guide for the PHP Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1651&quot; id=&quot;link-id0x1a8c5ae0&quot;&gt;SPARQL Guide for the Python Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1648&quot; id=&quot;link-id0x1b86ad28&quot;&gt;SPARQL Guide for the Ruby Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1646&quot; id=&quot;link-id0x1c7af188&quot;&gt;Simple Guide for using SPARQL with Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_tutorial&quot; id=&quot;link-id0x1ac1ba48&quot;&gt;General SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/virtuoso_sparql_tutorial&quot; id=&quot;link-id0x1c7be660&quot;&gt;Virtuoso Specific SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1c52b438&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-26T18:11:13-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso + DBpedia 3.6 Installation Guide (Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-24#1654</atom:id>
  <atom:published>2011-01-25T01:08:55Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1d8b5df0&quot;&gt;DBpedia&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt; DBpedia is a community effort to provide a contemporary deductive database derived from Wikipedia content. Project contributions can be partitioned as follows: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Ontology Construction and Maintenance &lt;/li&gt; &lt;li&gt; Dataset Generation via Wikipedia Content Extraction &amp;amp; Transformation &lt;/li&gt; &lt;li&gt; Live Database Maintenance &amp;amp; Administration -- includes actual &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1ba81190&quot;&gt;Linked Data&lt;/a&gt; loading and publishing, provision of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1d8af808&quot;&gt;SPARQL&lt;/a&gt; endpoint, and traditional DBA activity &lt;/li&gt; &lt;li&gt; Internationalization. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Why is DBpedia important?&lt;/h3&gt; &lt;p&gt; Comprising the nucleus of the Linked Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; effort, DBpedia also serves as a fulcrum for the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of Linked Data by delivering a dense and highly-interlinked lookup database. In its most basic form, DBpedia is a great source of strong and resolvable identifiers for People, Places, Organizations, Subject Matter, and many other data items of interest. Naturally, it provides a fantastic starting point for comprehending the fundamental concepts underlying &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id0x1a8cc3d0&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s initial &lt;a href=&quot;http://blogs.usnet.private:8893/www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x1cbbaf50&quot;&gt;Linked Data&lt;/a&gt; meme. &lt;/p&gt; &lt;h3&gt;How do I use DBpedia?&lt;/h3&gt; &lt;p&gt; Depending on your particular requirements, whether personal or service-specific, DBpedia offers the following: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; Datasets that can be loaded on your deductive database (also known as triple or quad stores) platform of choice &lt;/li&gt; &lt;li&gt; Live browsable HTML+&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id0x1d6b2148&quot;&gt;RDFa&lt;/a&gt; based &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1d766a98&quot;&gt;entity&lt;/a&gt; description pages &lt;/li&gt; &lt;li&gt; A wide variety of data formats for importing entity description data into a broad range of existing applications and services &lt;/li&gt; &lt;li&gt; A SPARQL endpoint allowing ad-hoc querying over HTTP using the SPARQL query language, and delivering results serialized in a variety of formats &lt;/li&gt; &lt;li&gt; A broad variety of tools covering query by example, faceted browsing, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id0x1b330ff8&quot;&gt;full text search&lt;/a&gt;, entity name lookups, etc. &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;What is the DBpedia 3.6 + &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1d705780&quot;&gt;Virtuoso&lt;/a&gt; Cluster Edition Combo?&lt;/h3&gt; &lt;p&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1c894338&quot;&gt;OpenLink Software&lt;/a&gt; has preloaded the DBpedia 3.6 datasets into a preconfigured Virtuoso Cluster Edition database, and made the package available for easy installation.&lt;/p&gt; &lt;h3&gt;Why is the DBpedia+Virtuoso package important?&lt;/h3&gt; &lt;p&gt; The DBpedia+Virtuoso package provides a cost-effective option for personal or service-specific incarnations of DBpedia. &lt;/p&gt; &lt;p&gt;For instance, you may have a service that isn&amp;#39;t best-served by competing with the rest of the world for ad-hoc query time and resources on the live instance, which itself operates under various restrictions which enable this ad-hoc query service to be provided at Web Scale.&lt;/p&gt; &lt;p&gt;Now you can easily commission your own instance and quickly exploit DBpedia and Virtuoso&amp;#39;s database feature set to the max, powered by your own hardware and network infrastructure. &lt;/p&gt; &lt;h3&gt;How do I use the DBpedia+Virtuoso package?&lt;/h3&gt; &lt;p&gt;Pre-requisites are simply:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/VirtuosoWikiWeb/VirtuosoInstallConfig&quot; id=&quot;link-id0x19e3e450&quot;&gt;Functional Virtuoso Cluster Edition installation&lt;/a&gt;. &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/pricing/&quot; id=&quot;link-id0x1b703ad8&quot;&gt;Virtuoso Cluster Edition License&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;90 GB of free disk space -- you ultimately only need 43 gigs, but this our recommended free disk space size pre installation completion.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; To install the Virtuoso Cluster Edition simply perform the following steps: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x17b41648&quot;&gt;Download Software&lt;/a&gt;. &lt;/li&gt; &lt;li&gt; Run installer &lt;/li&gt; &lt;li&gt; &lt;p&gt;Set key environment variables and start the OpenLink License Manager, using command (this may vary depending on your shell): &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;. /opt/virtuoso/virtuoso-enterprise.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; Run the &lt;code&gt;mkcluster.sh&lt;/code&gt; script which defaults to a 4 node cluster &lt;/li&gt; &lt;li&gt; Set &lt;code&gt;VIRTUOSO_HOME&lt;/code&gt; environment variable -- if you want to start cluster databases distinct from single server databases via distinct root directory for database files (one that isn&amp;#39;t adjacent to single-server database directories) &lt;/li&gt; &lt;li&gt; Start Virtuoso Cluster Edition instances using command: &lt;blockquote&gt; &lt;code&gt;virtuoso-start.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; Stop Virtuoso Cluster Edition instances using command: &lt;blockquote&gt; &lt;code&gt;virtuoso-stop.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To install your personal or service specific edition of DBpedia simply perform the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Navigate to your installation directory &lt;/li&gt; &lt;li&gt; Download Installer script (&lt;code&gt;&lt;a href=&quot;https://s3.amazonaws.com/dbpedia-36-usa/dbpedia-install.sh&quot; id=&quot;link-id0x1da0c978&quot;&gt;dbpedia-install.sh&lt;/a&gt;&lt;/code&gt;) &lt;/li&gt; &lt;li&gt; Set execution mode on script using command: &lt;blockquote&gt; &lt;code&gt;chmod 755 dbpedia-install.sh &lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; Shutdown any Virtuoso instances that may be currently running &lt;/li&gt; &lt;li&gt; Set your &lt;code&gt;VIRTUOSO_HOME&lt;/code&gt; environment variable, e.g., to the current directory, via command (this may vary depending on your shell): &lt;blockquote&gt; &lt;code&gt;export VIRTUOSO_HOME=`pwd`&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; Run script using command: &lt;blockquote&gt; &lt;code&gt;sh dbpedia-install.sh&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Once the installation completes (approximately 1 hour and 30 minutes from start time), perform the following steps: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Verify that the Virtuoso Conductor (HTML based Admin UI) is in place via: &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/conductor&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt; Verify that the Precision Search &amp;amp; Find UI is in place via: &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/fct&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;li&gt;Verify that DBpedia&amp;#39;s Green Entity Description Pages are in place via: &lt;blockquote&gt; &lt;code&gt;http://localhost:[port]/resource/DBpedia&lt;/code&gt; &lt;/blockquote&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia351C&quot; id=&quot;link-id0x1d819b90&quot;&gt;Amazon EC2 Snapshots for DBpedia 3.6 &amp;amp; 3.5&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/download/&quot; id=&quot;link-id0x1c3e27c8&quot;&gt;Virtuoso Commercial Edition Download Page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/clusterstcnf.html&quot; id=&quot;link-id0x1d0ff170&quot;&gt;Virtuoso Cluster Edition Guide&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1594&quot; id=&quot;link-id0x1c891cf8&quot;&gt;What is the DBpedia Project?&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-25T14:46:26-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL Guide for the Javascript Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-21#1653</atom:id>
  <atom:published>2011-01-21T19:59:49Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What?&lt;/h3&gt; &lt;p&gt;A simple guide usable by any Javascript developer seeking to exploit &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x17b447e8&quot;&gt;SPARQL&lt;/a&gt; without hassles.&lt;/p&gt; &lt;h3&gt;Why?&lt;/h3&gt; &lt;p&gt;SPARQL is a powerful query language, results serialization format, and an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access protocol from the W3C. It provides a mechanism for accessing and integrating data across &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1cc76540&quot;&gt;Deductive Database Systems&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1d944d78&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c7a87c8&quot;&gt;Linked Data&lt;/a&gt; circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. &lt;/p&gt; &lt;h3&gt;How?&lt;/h3&gt; &lt;p&gt;SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing.&lt;/p&gt; &lt;h4&gt;Steps:&lt;/h4&gt; &lt;ol&gt; &lt;li&gt;Determine which SPARQL endpoint you want to access e.g. &lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d476520&quot;&gt;DBpedia&lt;/a&gt; or a local &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bcfe140&quot;&gt;Virtuoso&lt;/a&gt; instance (typically: http://localhost:8890/sparql). &lt;/li&gt; &lt;li&gt;If using Virtuoso, and you want to populate its quad store using SPARQL, assign &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1c7630b8&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot; (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Script:&lt;/h4&gt; &lt;pre&gt; /* Demonstrating use of a single query to populate a # Virtuoso Quad Store via Javascript. */ /* HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1bc27a18&quot;&gt;URL&lt;/a&gt; is constructed accordingly with JSON query results format as the default via mime type. */ function sparqlQuery(query, baseURL, format) { if(!format) format=&amp;quot;application/json&amp;quot;; var params={ &amp;quot;default-graph&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;should-sponge&amp;quot;: &amp;quot;soft&amp;quot;, &amp;quot;query&amp;quot;: query, &amp;quot;debug&amp;quot;: &amp;quot;on&amp;quot;, &amp;quot;timeout&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;format&amp;quot;: format, &amp;quot;save&amp;quot;: &amp;quot;display&amp;quot;, &amp;quot;fname&amp;quot;: &amp;quot;&amp;quot; }; var querypart=&amp;quot;&amp;quot;; for(var k in params) { querypart+=k+&amp;quot;=&amp;quot;+encodeURIComponent(params[k])+&amp;quot;&amp;amp;&amp;quot;; } var queryURL=baseURL + &amp;#39;?&amp;#39; + querypart; if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;); } xmlhttp.open(&amp;quot;GET&amp;quot;,queryURL,false); xmlhttp.send(); return JSON.parse(xmlhttp.responseText); } /* setting Data Source Name (DSN) */ var dsn=&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;; /* Virtuoso pragma &amp;quot;DEFINE get:soft &amp;quot;replace&amp;quot; instructs Virtuoso SPARQL engine to perform an HTTP GET using the IRI in FROM clause as Data Source URL with regards to DBMS record inserts */ var query=&amp;quot;DEFINE get:soft \&amp;quot;replace\&amp;quot;\nSELECT DISTINCT * FROM &amp;lt;&amp;quot;+dsn+&amp;quot;&amp;gt; WHERE {?s ?p ?o}&amp;quot;; var data=sparqlQuery(query, &amp;quot;/sparql/&amp;quot;); &lt;/pre&gt; &lt;h4&gt;Output&lt;/h4&gt; &lt;p&gt; Place the snippet above into the &amp;lt;script/&amp;gt; section of an HTML document to see the &lt;a href=&quot;http://twitpic.com/3s2vs3/full&quot; id=&quot;link-id0x1cff2288&quot;&gt;query result&lt;/a&gt;. &lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt; JSON was chosen over XML (re. output format) since this is about a &amp;quot;no-brainer installation and utilization&amp;quot; guide for a Javascript developer that already knows how to use Javascript for HTTP based data access within HTML. SPARQL just provides an added bonus to URL dexterity (delivered via &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1d29da98&quot;&gt;URI&lt;/a&gt; abstraction) with regards to constructing Data Source Names or Addresses.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1652&quot; id=&quot;link-id0x1b0ffb28&quot;&gt;SPARQL Guide for the PHP Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1651&quot; id=&quot;link-id0x1a8c5ae0&quot;&gt;SPARQL Guide for the Python Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1648&quot; id=&quot;link-id0x1b86ad28&quot;&gt;SPARQL Guide for the Ruby Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1646&quot; id=&quot;link-id0x1c7af188&quot;&gt;Simple Guide for using SPARQL with Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_tutorial&quot; id=&quot;link-id0x1ac1ba48&quot;&gt;General SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/virtuoso_sparql_tutorial&quot; id=&quot;link-id0x1c7be660&quot;&gt;Virtuoso Specific SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1c52b438&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-26T18:10:28-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL Guide for the PHP Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-20#1652</atom:id>
  <atom:published>2011-01-20T21:25:49Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What?&lt;/h3&gt; &lt;p&gt;A simple guide usable by any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/PHP_programming_language&quot; id=&quot;link-id0x1bdca7b8&quot;&gt;PHP&lt;/a&gt; developer seeking to exploit &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c894338&quot;&gt;SPARQL&lt;/a&gt; without hassles.&lt;/p&gt; &lt;h3&gt;Why?&lt;/h3&gt; &lt;p&gt;SPARQL is a powerful query language, results serialization format, and an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access protocol from the W3C. It provides a mechanism for accessing and integrating data across &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1c319af0&quot;&gt;Deductive Database Systems&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1d944d78&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c7a87c8&quot;&gt;Linked Data&lt;/a&gt; circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. &lt;/p&gt; &lt;h3&gt;How?&lt;/h3&gt; &lt;p&gt;SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing e.g. local object binding re. PHP.&lt;/p&gt; &lt;h4&gt;Steps:&lt;/h4&gt; &lt;ol&gt; &lt;li&gt; From your command line execute: aptitude search &amp;#39;^PHP26&amp;#39;, to verify PHP is in place &lt;/li&gt; &lt;li&gt;Determine which SPARQL endpoint you want to access e.g. &lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d476520&quot;&gt;DBpedia&lt;/a&gt; or a local &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bcfe140&quot;&gt;Virtuoso&lt;/a&gt; instance (typically: http://localhost:8890/sparql). &lt;/li&gt; &lt;li&gt;If using Virtuoso, and you want to populate its quad store using SPARQL, assign &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1c7630b8&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot; (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Script:&lt;/h4&gt; &lt;pre&gt; #!/usr/bin/env php &amp;lt;?php # # Demonstrating use of a single query to populate a # Virtuoso Quad Store via PHP. # # HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1ce1d6d8&quot;&gt;URL&lt;/a&gt; is constructed accordingly with JSON query results format in mind. function sparqlQuery($query, $baseURL, $format=&amp;quot;application/json&amp;quot;) { $params=array( &amp;quot;default-graph&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;should-sponge&amp;quot; =&amp;gt; &amp;quot;soft&amp;quot;, &amp;quot;query&amp;quot; =&amp;gt; $query, &amp;quot;debug&amp;quot; =&amp;gt; &amp;quot;on&amp;quot;, &amp;quot;timeout&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;format&amp;quot; =&amp;gt; $format, &amp;quot;save&amp;quot; =&amp;gt; &amp;quot;display&amp;quot;, &amp;quot;fname&amp;quot; =&amp;gt; &amp;quot;&amp;quot; ); $querypart=&amp;quot;?&amp;quot;; foreach($params as $name =&amp;gt; $value) { $querypart=$querypart . $name . &amp;#39;=&amp;#39; . urlencode($value) . &amp;quot;&amp;amp;&amp;quot;; } $sparqlURL=$baseURL . $querypart; return json_decode(file_get_contents($sparqlURL)); }; # Setting Data Source Name (DSN) $dsn=&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;; #Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET #using the IRI in FROM clause as Data Source URL $query=&amp;quot;DEFINE get:soft \&amp;quot;replace\&amp;quot; SELECT DISTINCT * FROM &amp;lt;$dsn&amp;gt; WHERE {?s ?p ?o}&amp;quot;; $data=sparqlQuery($query, &amp;quot;http://localhost:8890/sparql/&amp;quot;); print &amp;quot;Retrieved data:\n&amp;quot; . json_encode($data); ?&amp;gt; &lt;/pre&gt; &lt;h4&gt;Output&lt;/h4&gt; &lt;pre&gt; Retrieved data: {&amp;quot;head&amp;quot;: {&amp;quot;link&amp;quot;:[],&amp;quot;vars&amp;quot;:[&amp;quot;s&amp;quot;,&amp;quot;p&amp;quot;,&amp;quot;o&amp;quot;]}, &amp;quot;results&amp;quot;: {&amp;quot;distinct&amp;quot;:false,&amp;quot;ordered&amp;quot;:true, &amp;quot;bindings&amp;quot;:[ {&amp;quot;s&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1ca44a98&quot;&gt;uri&lt;/a&gt;&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/dbpedia.org\/resource\/DBpedia&amp;quot;},&amp;quot;p&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type&amp;quot;},&amp;quot;o&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/www.w3.org\/2002\/07\/owl#Thing&amp;quot;}}, {&amp;quot;s&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/dbpedia.org\/resource\/DBpedia&amp;quot;},&amp;quot;p&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type&amp;quot;},&amp;quot;o&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/dbpedia.org\/ontology\/Work&amp;quot;}}, {&amp;quot;s&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/dbpedia.org\/resource\/DBpedia&amp;quot;},&amp;quot;p&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#type&amp;quot;},&amp;quot;o&amp;quot;: {&amp;quot;type&amp;quot;:&amp;quot;uri&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;http:\/\/dbpedia.org\/class\/yago\/Software106566077&amp;quot;}}, ... &lt;/pre&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt; JSON was chosen over XML (re. output format) since this is about a &amp;quot;no-brainer installation and utilization&amp;quot; guide for a PHP developer that already knows how to use PHP for HTTP based data access. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1651&quot; id=&quot;link-id0x1a8c5ae0&quot;&gt;SPARQL Guide for the Python Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1648&quot; id=&quot;link-id0x1b86ad28&quot;&gt;SPARQL Guide for the Ruby Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1646&quot; id=&quot;link-id0x1c7af188&quot;&gt;Simple Guide for using SPARQL with Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_tutorial&quot; id=&quot;link-id0x1ac1ba48&quot;&gt;General SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/virtuoso_sparql_tutorial&quot; id=&quot;link-id0x1c7be660&quot;&gt;Virtuoso Specific SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1c52b438&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-25T10:36:58-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL Guide for Python Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-19#1651</atom:id>
  <atom:published>2011-01-19T17:13:30Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What?&lt;/h3&gt; &lt;p&gt;A simple guide usable by any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Python_programming_language&quot; id=&quot;link-id0x1bdca7b8&quot;&gt;Python&lt;/a&gt; developer seeking to exploit &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c894338&quot;&gt;SPARQL&lt;/a&gt; without hassles.&lt;/p&gt; &lt;h3&gt;Why?&lt;/h3&gt; &lt;p&gt;SPARQL is a powerful query language, results serialization format, and an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access protocol from the W3C. It provides a mechanism for accessing and integrating data across &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1c319af0&quot;&gt;Deductive Database Systems&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1d944d78&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c7a87c8&quot;&gt;Linked Data&lt;/a&gt; circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. &lt;/p&gt; &lt;h3&gt;How?&lt;/h3&gt; &lt;p&gt;SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing e.g. local object binding re. Python.&lt;/p&gt; &lt;h4&gt;Steps:&lt;/h4&gt; &lt;ol&gt; &lt;li&gt; From your command line execute: aptitude search &amp;#39;^python26&amp;#39;, to verify Python is in place &lt;/li&gt; &lt;li&gt;Determine which SPARQL endpoint you want to access e.g. &lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d476520&quot;&gt;DBpedia&lt;/a&gt; or a local &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bcfe140&quot;&gt;Virtuoso&lt;/a&gt; instance (typically: http://localhost:8890/sparql). &lt;/li&gt; &lt;li&gt;If using Virtuoso, and you want to populate its quad store using SPARQL, assign &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1c7630b8&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot; (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Script:&lt;/h4&gt; &lt;pre&gt; #!/usr/bin/env python # # Demonstrating use of a single query to populate a # Virtuoso Quad Store via Python. # import urllib, json # HTTP &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1bd91cf0&quot;&gt;URL&lt;/a&gt; is constructed accordingly with JSON query results format in mind. def sparqlQuery(query, baseURL, format=&amp;quot;application/json&amp;quot;): params={ &amp;quot;default-graph&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;should-sponge&amp;quot;: &amp;quot;soft&amp;quot;, &amp;quot;query&amp;quot;: query, &amp;quot;debug&amp;quot;: &amp;quot;on&amp;quot;, &amp;quot;timeout&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;format&amp;quot;: format, &amp;quot;save&amp;quot;: &amp;quot;display&amp;quot;, &amp;quot;fname&amp;quot;: &amp;quot;&amp;quot; } querypart=urllib.urlencode(params) response = urllib.urlopen(baseURL,querypart).read() return json.loads(response) # Setting Data Source Name (DSN) dsn=&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot; # Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET # using the IRI in FROM clause as Data Source URL query=&amp;quot;&amp;quot;&amp;quot;DEFINE get:soft &amp;quot;replace&amp;quot; SELECT DISTINCT * FROM &amp;lt;%s&amp;gt; WHERE {?s ?p ?o}&amp;quot;&amp;quot;&amp;quot; % dsn data=sparqlQuery(query, &amp;quot;http://localhost:8890/sparql/&amp;quot;) print &amp;quot;Retrieved data:\n&amp;quot; + json.dumps(data, sort_keys=True, indent=4) # # End &lt;/pre&gt; &lt;h4&gt;Output&lt;/h4&gt; &lt;pre&gt; Retrieved data: { &amp;quot;head&amp;quot;: { &amp;quot;link&amp;quot;: [], &amp;quot;vars&amp;quot;: [ &amp;quot;s&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;o&amp;quot; ] }, &amp;quot;results&amp;quot;: { &amp;quot;bindings&amp;quot;: [ { &amp;quot;o&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1b1470b8&quot;&gt;uri&lt;/a&gt;&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;http://www.w3.org/2002/07/owl#Thing&amp;quot; }, &amp;quot;p&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;uri&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;quot; }, &amp;quot;s&amp;quot;: { &amp;quot;type&amp;quot;: &amp;quot;uri&amp;quot;, &amp;quot;value&amp;quot;: &amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot; } }, ... &lt;/pre&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt; JSON was chosen over XML (re. output format) since this is about a &amp;quot;no-brainer installation and utilization&amp;quot; guide for a Python developer that already knows how to use Python for HTTP based data access. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1648&quot; id=&quot;link-id0x1c9e26b0&quot;&gt;SPARQL Guide for the Ruby Developer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1646&quot; id=&quot;link-id0x1c7af188&quot;&gt;Simple Guide for using SPARQL with Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_tutorial&quot; id=&quot;link-id0x1ac1ba48&quot;&gt;General SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/virtuoso_sparql_tutorial&quot; id=&quot;link-id0x1c7be660&quot;&gt;Virtuoso Specific SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1c52b438&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-25T10:35:46-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Directions for 2011</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2011-01-19#1650</atom:id>
  <atom:published>2011-01-19T16:29:37Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x1d584720&quot;&gt;At the start of 2010, I wrote&lt;/a&gt; that 2010 would be the year when &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2007b778&quot;&gt;RDF&lt;/a&gt; became performance- and cost-competitive with relational technology for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x7f5bf68&quot;&gt;data&lt;/a&gt; warehousing and analytics. More specifically, RDF would shine where data was heterogenous and/or where there was a high frequency of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1ffa18b0&quot;&gt;schema&lt;/a&gt; change.&lt;/p&gt; &lt;p&gt;I will now discuss what we have done towards this end in 2010 and how you will gain by this in 2011.&lt;/p&gt; &lt;p&gt;At the start of 2010, we had internally demonstrated 4x space efficiency gains from column-wise compression and 3x loop join speed gains from vectored execution. To recap, &lt;i&gt;column-wise compression&lt;/i&gt; means a column-wise storage layout where values of consecutive rows of a single column are consecutive in memory/disk and are compressed in a manner that benefits from the homogenous data type and possible sort order of the column. &lt;i&gt;Vectored execution&lt;/i&gt; means passing large numbers of query variable bindings between query operators and possibly sorting inputs to joins for improving locality. Furthermore, always operating on large sets of values gives extra opportunities for parallelism, from instruction level to threads to scale out.&lt;/p&gt; &lt;p&gt;So, during 2010, we integrated these technologies into &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1fdf3f90&quot;&gt;Virtuoso&lt;/a&gt;, for relational- and graph-based applications alike. Further, even if we say that RDF will be close to relational speed in Virtuoso, the point is moot if Virtuoso&amp;#39;s relational speed is not up there with the best of analytics-oriented &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x7bf0d40&quot;&gt;RDBMS&lt;/a&gt;. RDF performance does rest on the basis of general-purpose database performance; what is sauce for the goose is sauce for the gander. So we reimplemented &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x7815c60&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt;, and fine-tuned many of the tricks required by &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x213d6de8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1fd92690&quot;&gt;H. TPC-H&lt;/a&gt; is not the sole final destination, but it is a step on the way and a valuable checklist for what a database ought to do.&lt;/p&gt; &lt;p&gt;At the Semdata workshop of &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x21178a50&quot;&gt;VLDB 2010&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1632&quot; id=&quot;link-id0x1de8fee8&quot;&gt;we presented some results&lt;/a&gt; of our column store applied to RDF and relational tasks. As noted in the paper, the implementation did demonstrate significant gains over the previous row-wise architecture but was not yet well optimized, so not ready to be compared with the best of the relational analytics world. A good part of the fall of 2010 went into optimizing the column store and completing functionality such as transaction support with columns.&lt;/p&gt; &lt;p&gt;A lot of this work is not specifically RDF oriented, but all of this work is constantly informed by the specific requirements of RDF. For example, the general idea of vectored execution is to eliminate overheads and optimize &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x7ae0d58&quot;&gt;CPU&lt;/a&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x7bb7150&quot;&gt;cache&lt;/a&gt; and other locality by doing single query operations on arrays of operands so that the whole batch runs more or less in CPU cache. Are the gains not lost if data is typed at run time, as in RDF? In fact, the cost of run-time-typing turns out to be small, since data in practice tends to be of homogenous type and with locality of reference in values. Virtuoso&amp;#39;s column store implementation resembles in broad outline other column stores like &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x7f61080&quot;&gt;Vertica&lt;/a&gt; or &lt;a class=&quot;auto-href&quot; href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x2154ce38&quot;&gt;VectorWise&lt;/a&gt;, the main difference being the built-in support for run-time heterogenous types.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x755e668&quot;&gt;LOD2&lt;/a&gt; EU FP 7 project &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1630&quot; id=&quot;link-id0x1d8eaf28&quot;&gt;started in September 2010&lt;/a&gt;. In this project OpenLink and the celebrated heroes of the column store, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1feba470&quot;&gt;CWI&lt;/a&gt; of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x223bbe70&quot;&gt;MonetDB&lt;/a&gt; and VectorWise fame, represent the database side.&lt;/p&gt; &lt;p&gt;The first database task of LOD2 is making a survey of the state of the art and a round of benchmarking of RDF stores. The &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x20f50c20&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x780c430&quot;&gt;BSBM&lt;/a&gt;) has accordingly evolved to include a business intelligence section and an update stream. Initial results from running these will become available in February/March, 2011. The specifics of this process merit another post; let it for now be said that benchmarking is making progress. In the end, it is our conviction that we need a situation where vendors may publish results as and when they are available and where there exists a well defined process for documenting and checking results.&lt;/p&gt; &lt;p&gt;LOD2 will continue by &lt;i&gt;linking the universe,&lt;/i&gt; as I half-facetiously put it on a presentation slide. This means alignment of anything from schema to instance identifiers, with and without supervision, and always with provenance, summarization, visualization, and so forth. In fact, putting it this way, this gets to sound like the old chimera of generating applications from data or allowing users to derive actionable intelligence from data of which they do not even know the structure. No, we are not that unrealistic. But we are moving toward more ad-hoc discovery and faster time to answer. And since we provide an infrastructure element under all this, we want to do away with the &amp;quot;RDF tax,&amp;quot; by which we mean any significant extra cost of RDF compared to an alternate technology. To put it another way, you ought to pay for unpredictable heterogeneity or complex inference only when you actually use them, not as a fixed up-front overhead.&lt;/p&gt; &lt;p&gt;So much for promises. When will you see something? It is safe to say that we cannot very well publish benchmarks of systems that are not generally available in some form. This places an initial technology preview cut of Virtuoso 7 with vectored execution somewhere in January or early February. The column store feature will be built in, but more than likely the row-wise compressed RDF format of Virtuoso 6 will still be the default. Version 6 and 7 databases will be interchangeable unless column-store structures are used.&lt;/p&gt; &lt;p&gt;For now, our priority is to release the substantial gains that have already been accomplished.&lt;/p&gt; &lt;p&gt;After an initial preview cut, we will return to the agenda of making sure Virtuoso is up there with the best in relational analytics, and that the equivalent workload with an RDF data model runs as close as possible to relational performance. As a first step this means taking TPC-H as is, and then converting the data and queries to the trivially equivalent RDF and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x25716618&quot;&gt;SPARQL&lt;/a&gt; and seeing how it goes. In &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1627&quot; id=&quot;link-id0x1af60d40&quot;&gt;the September paper&lt;/a&gt; we dabbled a little with the data at a small scale but now we must run the full set of queries at 100GB and 300GB scales, which come to about 14 billion and 42 billion triples, respectively. A well done analysis of the issues encountered, covering similarities and dissimilarities of the implementation of the workload as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x223b0a88&quot;&gt;SQL&lt;/a&gt; and SPARQL, should make a good VLDB paper.&lt;/p&gt; &lt;p&gt;Database performance is an entirely open-ended quest and the bag of potentially applicable tricks is as good as infinite. Having said this, it seems that the scales comfortably reached in the TPC benchmarks are more than adequate for pretty much anything one is likely to encounter in real world applications involving comparable workloads. Businesses getting over 6 million new order transactions per minute (the high score of TPC-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1f72a180&quot;&gt;C&lt;/a&gt;) or analyzing a warehouse of 60 billion orders shipped to 6 billion customers over 7 years (10000GB or 10TB TPC-H) are not very common if they exist at all.&lt;/p&gt; &lt;p&gt;The real world frontier has moved on. Scaling up the TPC workloads remains a generally useful exercise that continues to contribute to the state of the art but the applications requiring this advance are changing.&lt;/p&gt; &lt;p&gt;Someone once said that for a new technology to become mainstream, it needs to solve a new class of problem. Yes, while it is a preparatory step to run TPC-H translated to SPARQL without dying of overheads, there is little point in doing this in production since SQL is anyway likely better and already known, proven, and deployed.&lt;/p&gt; &lt;p&gt;The new class of problem, as LOD2 sees it, is the matter of web-wide cross-organizational data integration. Web-wide does not necessarily mean crawling the whole web, but does tend to mean running into significant heterogeneity of sources, both in terms of modeling and in terms of usage of more-or-less standard data models. Around this topic we hear two messages. The database people say that inference beyond what you can express in SQL views is theoretically nice but practically not needed; on the other side, we hear that the inference now being standardized in efforts like &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Rule_Interchange_Format&quot; id=&quot;link-id0x22b3ad68&quot;&gt;RIF&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x22b3ad90&quot;&gt;OWL&lt;/a&gt; is not expressive enough for the real world. As one expert put it, &lt;i&gt;if enterprise data integration in the 1980s was between a few databases, today it is more like between 1000 databases,&lt;/i&gt; which makes this matter similar to searching the web. How can one know in such a situation that the data being aggregated is in fact meaningfully aggregate-able?&lt;/p&gt; &lt;p&gt;Add to this the prevalence of unstructured data in the world and the need to mine it for actionable intelligence. Think of combining data from CRM, worldwide media coverage of own and competitive brands, and in-house emails for assessing organizational response to events on the market.&lt;/p&gt; &lt;p&gt;These are the actual use cases for which we need RDF at relational DW performance and scale. This is not limited to RDF and OWL profiles, since we fully believe that inference needs are more diverse. The reason why this is RDF and not SQL plus some extension of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Datalog&quot; id=&quot;link-id0x7ee5130&quot;&gt;Datalog&lt;/a&gt;, is the widespread adoption of RDF and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2111f968&quot;&gt;linked data&lt;/a&gt; as a data publishing format, with all the schema-last and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id0x2111f990&quot;&gt;open world&lt;/a&gt; aspects that have been there from the start.&lt;/p&gt; &lt;p&gt;Stay tuned for more news later this month!&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x1de6b370&quot;&gt;Linked Data and Virtuoso in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1510&quot; id=&quot;link-id0x1b031180&quot;&gt;Linked Data &amp;amp; The Year 2009&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1286&quot; id=&quot;link-id0x1a582d10&quot;&gt;Retrospective and Outlook for 2008&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-20T12:54:42.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Directions for 2011</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2011-01-19#1649</atom:id>
  <atom:published>2011-01-19T16:29:37Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x1d584720&quot;&gt;At the start of 2010, I wrote&lt;/a&gt; that 2010 would be the year when &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x29d4eeb8&quot;&gt;RDF&lt;/a&gt; became performance- and cost-competitive with relational technology for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d92cc18&quot;&gt;data&lt;/a&gt; warehousing and analytics. More specifically, RDF would shine where data was heterogenous and/or where there was a high frequency of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1ccf1d80&quot;&gt;schema&lt;/a&gt; change.&lt;/p&gt; &lt;p&gt;I will now discuss what we have done towards this end in 2010 and how you will gain by this in 2011.&lt;/p&gt; &lt;p&gt;At the start of 2010, we had internally demonstrated 4x space efficiency gains from column-wise compression and 3x loop join speed gains from vectored execution. To recap, &lt;i&gt;column-wise compression&lt;/i&gt; means a column-wise storage layout where values of consecutive rows of a single column are consecutive in memory/disk and are compressed in a manner that benefits from the homogenous data type and possible sort order of the column. &lt;i&gt;Vectored execution&lt;/i&gt; means passing large numbers of query variable bindings between query operators and possibly sorting inputs to joins for improving locality. Furthermore, always operating on large sets of values gives extra opportunities for parallelism, from instruction level to threads to scale out.&lt;/p&gt; &lt;p&gt;So, during 2010, we integrated these technologies into &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c294c00&quot;&gt;Virtuoso&lt;/a&gt;, for relational- and graph-based applications alike. Further, even if we say that RDF will be close to relational speed in Virtuoso, the point is moot if Virtuoso&amp;#39;s relational speed is not up there with the best of analytics-oriented &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1d7bc8d0&quot;&gt;RDBMS&lt;/a&gt;. RDF performance does rest on the basis of general-purpose database performance; what is sauce for the goose is sauce for the gander. So we reimplemented &lt;code&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x29d25c10&quot;&gt;HASH JOIN&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt;, and fine-tuned many of the tricks required by &lt;a class=&quot;auto-href&quot; href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x8ce58b8&quot;&gt;TPC&lt;/a&gt;-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1d610298&quot;&gt;H. TPC-H&lt;/a&gt; is not the sole final destination, but it is a step on the way and a valuable checklist for what a database ought to do.&lt;/p&gt; &lt;p&gt;At the Semdata workshop of &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x1950c050&quot;&gt;VLDB 2010&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1632&quot; id=&quot;link-id0x1de8fee8&quot;&gt;we presented some results&lt;/a&gt; of our column store applied to RDF and relational tasks. As noted in the paper, the implementation did demonstrate significant gains over the previous row-wise architecture but was not yet well optimized, so not ready to be compared with the best of the relational analytics world. A good part of the fall of 2010 went into optimizing the column store and completing functionality such as transaction support with columns.&lt;/p&gt; &lt;p&gt;A lot of this work is not specifically RDF oriented, but all of this work is constantly informed by the specific requirements of RDF. For example, the general idea of vectored execution is to eliminate overheads and optimize &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1d75a9c0&quot;&gt;CPU&lt;/a&gt; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1ce80608&quot;&gt;cache&lt;/a&gt; and other locality by doing single query operations on arrays of operands so that the whole batch runs more or less in CPU cache. Are the gains not lost if data is typed at run time, as in RDF? In fact, the cost of run-time-typing turns out to be small, since data in practice tends to be of homogenous type and with locality of reference in values. Virtuoso&amp;#39;s column store implementation resembles in broad outline other column stores like &lt;a class=&quot;auto-href&quot; href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x1b303538&quot;&gt;Vertica&lt;/a&gt; or &lt;a class=&quot;auto-href&quot; href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x279f6968&quot;&gt;VectorWise&lt;/a&gt;, the main difference being the built-in support for run-time heterogenous types.&lt;/p&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x29d48f00&quot;&gt;LOD2&lt;/a&gt; EU FP 7 project &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1630&quot; id=&quot;link-id0x1d8eaf28&quot;&gt;started in September 2010&lt;/a&gt;. In this project OpenLink and the celebrated heroes of the column store, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x19ec66f0&quot;&gt;CWI&lt;/a&gt; of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x1cda7178&quot;&gt;MonetDB&lt;/a&gt; and VectorWise fame, represent the database side.&lt;/p&gt; &lt;p&gt;The first database task of LOD2 is making a survey of the state of the art and a round of benchmarking of RDF stores. The &lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1e144608&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a class=&quot;auto-href&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x139cd920&quot;&gt;BSBM&lt;/a&gt;) has accordingly evolved to include a business intelligence section and an update stream. Initial results from running these will become available in February/March, 2011. The specifics of this process merit another post; let it for now be said that benchmarking is making progress. In the end, it is our conviction that we need a situation where vendors may publish results as and when they are available and where there exists a well defined process for documenting and checking results.&lt;/p&gt; &lt;p&gt;LOD2 will continue by &lt;i&gt;linking the universe,&lt;/i&gt; as I half-facetiously put it on a presentation slide. This means alignment of anything from schema to instance identifiers, with and without supervision, and always with provenance, summarization, visualization, and so forth. In fact, putting it this way, this gets to sound like the old chimera of generating applications from data or allowing users to derive actionable intelligence from data of which they do not even know the structure. No, we are not that unrealistic. But we are moving toward more ad-hoc discovery and faster time to answer. And since we provide an infrastructure element under all this, we want to do away with the &amp;quot;RDF tax,&amp;quot; by which we mean any significant extra cost of RDF compared to an alternate technology. To put it another way, you ought to pay for unpredictable heterogeneity or complex inference only when you actually use them, not as a fixed up-front overhead.&lt;/p&gt; &lt;p&gt;So much for promises. When will you see something? It is safe to say that we cannot very well publish benchmarks of systems that are not generally available in some form. This places an initial technology preview cut of Virtuoso 7 with vectored execution somewhere in January or early February. The column store feature will be built in, but more than likely the row-wise compressed RDF format of Virtuoso 6 will still be the default. Version 6 and 7 databases will be interchangeable unless column-store structures are used.&lt;/p&gt; &lt;p&gt;For now, our priority is to release the substantial gains that have already been accomplished.&lt;/p&gt; &lt;p&gt;After an initial preview cut, we will return to the agenda of making sure Virtuoso is up there with the best in relational analytics, and that the equivalent workload with an RDF data model runs as close as possible to relational performance. As a first step this means taking TPC-H as is, and then converting the data and queries to the trivially equivalent RDF and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x29b26b50&quot;&gt;SPARQL&lt;/a&gt; and seeing how it goes. In &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1627&quot; id=&quot;link-id0x1af60d40&quot;&gt;the September paper&lt;/a&gt; we dabbled a little with the data at a small scale but now we must run the full set of queries at 100GB and 300GB scales, which come to about 14 billion and 42 billion triples, respectively. A well done analysis of the issues encountered, covering similarities and dissimilarities of the implementation of the workload as &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1ce99a98&quot;&gt;SQL&lt;/a&gt; and SPARQL, should make a good VLDB paper.&lt;/p&gt; &lt;p&gt;Database performance is an entirely open-ended quest and the bag of potentially applicable tricks is as good as infinite. Having said this, it seems that the scales comfortably reached in the TPC benchmarks are more than adequate for pretty much anything one is likely to encounter in real world applications involving comparable workloads. Businesses getting over 6 million new order transactions per minute (the high score of TPC-&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1ce764f8&quot;&gt;C&lt;/a&gt;) or analyzing a warehouse of 60 billion orders shipped to 6 billion customers over 7 years (10000GB or 10TB TPC-H) are not very common if they exist at all.&lt;/p&gt; &lt;p&gt;The real world frontier has moved on. Scaling up the TPC workloads remains a generally useful exercise that continues to contribute to the state of the art but the applications requiring this advance are changing.&lt;/p&gt; &lt;p&gt;Someone once said that for a new technology to become mainstream, it needs to solve a new class of problem. Yes, while it is a preparatory step to run TPC-H translated to SPARQL without dying of overheads, there is little point in doing this in production since SQL is anyway likely better and already known, proven, and deployed.&lt;/p&gt; &lt;p&gt;The new class of problem, as LOD2 sees it, is the matter of web-wide cross-organizational data integration. Web-wide does not necessarily mean crawling the whole web, but does tend to mean running into significant heterogeneity of sources, both in terms of modeling and in terms of usage of more-or-less standard data models. Around this topic we hear two messages. The database people say that inference beyond what you can express in SQL views is theoretically nice but practically not needed; on the other side, we hear that the inference now being standardized in efforts like &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Rule_Interchange_Format&quot; id=&quot;link-id0x1cb916b0&quot;&gt;RIF&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x29dd4a60&quot;&gt;OWL&lt;/a&gt; is not expressive enough for the real world. As one expert put it, &lt;i&gt;if enterprise data integration in the 1980s was between a few databases, today it is more like between 1000 databases,&lt;/i&gt; which makes this matter similar to searching the web. How can one know in such a situation that the data being aggregated is in fact meaningfully aggregate-able?&lt;/p&gt; &lt;p&gt;Add to this the prevalence of unstructured data in the world and the need to mine it for actionable intelligence. Think of combining data from CRM, worldwide media coverage of own and competitive brands, and in-house emails for assessing organizational response to events on the market.&lt;/p&gt; &lt;p&gt;These are the actual use cases for which we need RDF at relational DW performance and scale. This is not limited to RDF and OWL profiles, since we fully believe that inference needs are more diverse. The reason why this is RDF and not SQL plus some extension of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Datalog&quot; id=&quot;link-id0x1cde9dc8&quot;&gt;Datalog&lt;/a&gt;, is the widespread adoption of RDF and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1d029c80&quot;&gt;linked data&lt;/a&gt; as a data publishing format, with all the schema-last and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id0x1d81f5b0&quot;&gt;open world&lt;/a&gt; aspects that have been there from the start.&lt;/p&gt; &lt;p&gt;Stay tuned for more news later this month!&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x1de6b370&quot;&gt;Linked Data and Virtuoso in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1510&quot; id=&quot;link-id0x1b031180&quot;&gt;Linked Data &amp;amp; The Year 2009&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1286&quot; id=&quot;link-id0x1a582d10&quot;&gt;Retrospective and Outlook for 2008&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-20T12:54:30.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL for the Ruby Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-18#1648</atom:id>
  <atom:published>2011-01-18T19:48:34Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What?&lt;/h3&gt; &lt;p&gt;A simple guide usable by any &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Ruby_programming_language&quot; id=&quot;link-id0x1bb88908&quot;&gt;Ruby&lt;/a&gt; developer seeking to exploit &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1ae67500&quot;&gt;SPARQL&lt;/a&gt; without hassles.&lt;/p&gt; &lt;h3&gt;Why?&lt;/h3&gt; &lt;p&gt;SPARQL is a powerful query language, results serialization format, and an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access protocol from the W3C. It provides a mechanism for accessing and integrating data across &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1bc61d88&quot;&gt;Deductive Database Systems&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1cc11420&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1b2e7780&quot;&gt;Linked Data&lt;/a&gt; circles) -- database systems (or data spaces) that manage proposition oriented records in 3-tuple (triples) or 4-tuple (quads) form. &lt;/p&gt; &lt;h3&gt;How?&lt;/h3&gt; &lt;p&gt;SPARQL queries are actually HTTP payloads (typically). Thus, using a RESTful client-server interaction pattern, you can dispatch calls to a SPARQL compliant data server and receive a payload for local processing e.g. local object binding re. Ruby. &lt;/p&gt; &lt;h4&gt;Steps:&lt;/h4&gt; &lt;ol&gt; &lt;li&gt; From your command line execute: aptitude search &amp;#39;^ruby&amp;#39;, to verify Ruby is in place &lt;/li&gt; &lt;li&gt;Determine which SPARQL endpoint you want to access e.g. &lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d476520&quot;&gt;DBpedia&lt;/a&gt; or a local &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bcfe140&quot;&gt;Virtuoso&lt;/a&gt; instance (typically: http://localhost:8890/sparql). &lt;/li&gt; &lt;li&gt;If using Virtuoso, and you want to populate its quad store using SPARQL, assign &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1c7630b8&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot; (this is basic control, more sophisticated WebID based ACLs are available for controlling SPARQL access).&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Script:&lt;/h4&gt; &lt;pre&gt; #!/usr/bin/env ruby # # Demonstrating use of a single query to populate a # Virtuoso Quad Store. # require &amp;#39;net/http&amp;#39; require &amp;#39;cgi&amp;#39; require &amp;#39;csv&amp;#39; # # We opt for CSV based output since handling this format is straightforward in Ruby, by default. # HTTP &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1acee348&quot;&gt;URL&lt;/a&gt; is constructed accordingly with CSV as query results format in mind. def sparqlQuery(query, baseURL, format=&amp;quot;text/csv&amp;quot;) params={ &amp;quot;default-graph&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;should-sponge&amp;quot; =&amp;gt; &amp;quot;soft&amp;quot;, &amp;quot;query&amp;quot; =&amp;gt; query, &amp;quot;debug&amp;quot; =&amp;gt; &amp;quot;on&amp;quot;, &amp;quot;timeout&amp;quot; =&amp;gt; &amp;quot;&amp;quot;, &amp;quot;format&amp;quot; =&amp;gt; format, &amp;quot;save&amp;quot; =&amp;gt; &amp;quot;display&amp;quot;, &amp;quot;fname&amp;quot; =&amp;gt; &amp;quot;&amp;quot; } querypart=&amp;quot;&amp;quot; params.each { |k,v| querypart+=&amp;quot;#{k}=#{CGI.escape(v)}&amp;amp;&amp;quot; } sparqlURL=baseURL+&amp;quot;?#{querypart}&amp;quot; response = Net::HTTP.get_response(&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1d24dfd8&quot;&gt;URI&lt;/a&gt;.parse(sparqlURL)) return CSV::parse(response.body) end # Setting Data Source Name (DSN) dsn=&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot; #Virtuoso pragmas for instructing SPARQL engine to perform an HTTP GET #using the IRI in FROM clause as Data Source URL query=&amp;quot;DEFINE get:soft \&amp;quot;replace\&amp;quot; SELECT DISTINCT * FROM &amp;lt;#{dsn}&amp;gt; WHERE {?s ?p ?o} &amp;quot; #Assume use of local installation of Virtuoso #otherwise you can change URL to that of a public endpoint #for example DBpedia: http://dbpedia.org/sparql data=sparqlQuery(query, &amp;quot;http://localhost:8890/sparql/&amp;quot;) puts &amp;quot;Got data:&amp;quot; p data # # End &lt;/pre&gt;&lt;h4&gt;Output&lt;/h4&gt; &lt;pre&gt; Got data: [[&amp;quot;s&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;o&amp;quot;], [&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;, &amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;quot;, &amp;quot;http://www.w3.org/2002/07/owl#Thing&amp;quot;], [&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;, &amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;quot;, &amp;quot;http://dbpedia.org/ontology/Work&amp;quot;], [&amp;quot;http://dbpedia.org/resource/DBpedia&amp;quot;, &amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#type&amp;quot;, &amp;quot;http://dbpedia.org/class/yago/Software106566077&amp;quot;], ... &lt;/pre&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Comma-separated_values&quot; id=&quot;link-id0x1cac8420&quot;&gt;CSV&lt;/a&gt; was chosen over XML (re. output format) since this is about a &amp;quot;no-brainer installation and utilization&amp;quot; guide for a Ruby developer that already knows how to use Ruby for HTTP based data access. SPARQL just provides an added bonus to URL dexterity (delivered via URI abstraction) with regards to constructing Data Source Names or Addresses.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.taxonconcept.org/how-to/ruby-code-examples/how-do-i-use-ruby-to-query-a-sparql-endpoint.html&quot; id=&quot;link-id0x1aa83678&quot;&gt;SPARQL and Ruby SPARQL Client Library Example&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1646&quot; id=&quot;link-id0x1c7af188&quot;&gt;Simple Guide for using SPARQL with Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_tutorial&quot; id=&quot;link-id0x1ac1ba48&quot;&gt;General SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.delicious.com/kidehen/virtuoso_sparql_tutorial&quot; id=&quot;link-id0x1c7be660&quot;&gt;Virtuoso Specific SPARQL Tutorial Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1c52b438&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2011-01-25T10:17:12.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Simple Virtuoso Installation &amp; Utilization Guide for SPARQL Users (Update 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2011-01-16#1647</atom:id>
  <atom:published>2011-01-16T07:06:21Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1ab60ac0&quot;&gt;SPARQL&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;A declarative query language from the W3C for querying structured propositional &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; (in the form of 3-&lt;a href=&quot;http://en.wikipedia.org/wiki/Tuple&quot; id=&quot;link-id0x1b1e0010&quot;&gt;tuple&lt;/a&gt; [triples] or 4-tuple [quads] records) stored in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Deductive_database&quot; id=&quot;link-id0x1cf8af98&quot;&gt;deductive database&lt;/a&gt; (colloquially referred to as triple or quad stores in &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1caf5050&quot;&gt;Semantic Web&lt;/a&gt; and &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x19d781b8&quot;&gt;Linked Data&lt;/a&gt; parlance).&lt;/p&gt; &lt;p&gt;SPARQL is inherently platform independent. Like &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1b879140&quot;&gt;SQL&lt;/a&gt;, the query language and the backend database engine are distinct. Database clients capture SPARQL queries which are then passed on to compliant backend databases.&lt;/p&gt; &lt;h3&gt;Why is it important?&lt;/h3&gt; &lt;p&gt;Like SQL for relational databases, it provides a powerful mechanism for accessing and joining data across one or more data partitions (named graphs identified by IRIs). The aforementioned capability also enables the construction of sophisticated Views, Reports (HTML or those produced in native form by desktop productivity tools), and data streams for other services.&lt;/p&gt; &lt;p&gt;Unlike SQL, SPARQL includes result serialization formats and an HTTP based wire protocol. Thus, the ubiquity and sophistication of HTTP is integral to SPARQL i.e., client side applications (user agents) only need to be able to perform an HTTP GET against a &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1ba287e8&quot;&gt;URL&lt;/a&gt; en route to exploiting the power of SPARQL.&lt;/p&gt; &lt;h3&gt;How do I use it, generally?&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Locate a SPARQL endpoint (&lt;a href=&quot;http://dbpedia.org/sparql&quot; id=&quot;link-id0x1d7436b0&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://lod.openlinksw.com/sparql&quot; id=&quot;link-id0x1bf20690&quot;&gt;LOD Cloud Cache&lt;/a&gt;, &lt;a href=&quot;http://semantic.data.gov&quot; id=&quot;link-id0x1a8ebc28&quot;&gt;Data.Gov&lt;/a&gt;, &lt;a href=&quot;http://linkeddata.uriburner.com/sparql&quot; id=&quot;link-id0x1be93070&quot;&gt;URIBurner&lt;/a&gt;, &lt;a href=&quot;http://www.delicious.com/kidehen/sparql_endpoint&quot; id=&quot;link-id0x1cce9b40&quot;&gt;others&lt;/a&gt;), or;&lt;/li&gt; &lt;li&gt;Install a SPARQL compliant database server (quad or triple store) on your desktop, workgroup server, data center, or cloud (e.g., &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtuosoEC2AMI&quot; id=&quot;link-id0x1cd697a0&quot;&gt;Amazon EC2 AMI&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Start the database server&lt;/li&gt; &lt;li&gt;Execute SPARQL Queries via the &lt;a href=&quot;http://lod.openlinksw.com/sparql&quot; id=&quot;link-id0x1b99d790&quot;&gt;SPARQL endpoint.&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;How do I use SPARQL with &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c9adc80&quot;&gt;Virtuoso&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;What follows is a very simple guide for using SPARQL against your own instance of Virtuoso:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Software Download and Installation&lt;/li&gt; &lt;li&gt;Data Loading from Data Sources exposed at Network Addresses (e.g. HTTP URLs) using very simple methods&lt;/li&gt; &lt;li&gt;Actual SPARQL query execution via SPARQL endpoint.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Installation Steps&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; Download &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSDownload&quot; id=&quot;link-id0x1b795100&quot;&gt;Virtuoso Open Source&lt;/a&gt; or &lt;a href=&quot;http://download.openlinksw.com/virtwiz/virtuoso.php&quot; id=&quot;link-id0x1cce46f0&quot;&gt;Virtuoso Commercial&lt;/a&gt; Editions &lt;/li&gt; &lt;li&gt; Run installer (if using Commercial edition of Windows Open Source Edition, otherwise follow build guide) &lt;/li&gt; &lt;li&gt; Follow post-installation guide and verify installation by typing in the command: virtuoso -? (if this fails check you&amp;#39;ve followed installation and setup steps, then verify environment variables have been set) &lt;/li&gt; &lt;li&gt; Start the Virtuoso server using the command: virtuoso-start.sh &lt;/li&gt; &lt;li&gt; Verify you have a connection to the Virtuoso Server via the command: isql localhost (assuming you&amp;#39;re using default DB settings) or the command: isql localhost:1112 (assuming demo database) or goto your browser and type in: http://&amp;lt;virtuoso-server-host-name&amp;gt;:[port]/conductor (e.g. http://localhost:8889/conductor for default DB or http://localhost:8890/conductor if using Demo DB) &lt;/li&gt; &lt;li&gt; Go to SPARQL endpoint which is typically -- http://&amp;lt;virtuoso-server-host-name&amp;gt;:[port]/sparql &lt;/li&gt; &lt;li&gt; Run a quick sample query (since the database always has system data in place): select distinct * where {?s ?p ?o} limit 50 .&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Troubleshooting&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Ensure environment settings are set and functional -- if using Mac OS X or Windows, so you don&amp;#39;t have to worry about this, just start and stop your Virtuoso server using native OS services applets&lt;/li&gt; &lt;li&gt;If using the Open Source Edition, follow the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSMake#Getting%20Started&quot; id=&quot;link-id0x1bfa7548&quot;&gt;getting started guide&lt;/a&gt; -- it covers PATH and startup directory location re. starting and stopping Virtuoso servers.&lt;/li&gt; &lt;li&gt;Sponging (HTTP GETs against external Data Sources) within SPARQL queries is disabled by default. You can enable this feature by assigning &amp;quot;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparql.html#rdfsupportedprotocolendpointuri&quot; id=&quot;link-id0x1d566270&quot;&gt;SPARQL_SPONGE&lt;/a&gt;&amp;quot; privileges to user &amp;quot;SPARQL&amp;quot;. Note, more sophisticated security exists via &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAuthPolicyFOAFSSL&quot; id=&quot;link-id0x1a3c9eb8&quot;&gt;WebID based ACLs&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Data Loading Steps&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; Identify an RDF based structured data source of interest -- a file that contains 3-tuple / triples available at an address on a public or private HTTP based network &lt;/li&gt; &lt;li&gt;Determine the Address (URL) of the RDF data source&lt;/li&gt; &lt;li&gt;Go to your Virtuoso SPARQL endpoint and type in the following SPARQL query: DEFINE GET:SOFT &amp;quot;replace&amp;quot; SELECT DISTINCT * FROM &amp;lt;RDFDataSourceURL&amp;gt; WHERE {?s ?p ?o} &lt;/li&gt; &lt;li&gt; All the triples in the RDF resource (data source accessed via URL) will be loaded into the Virtuoso Quad Store (using RDF Data Source URL as the internal quad store Named Graph IRI) as part of the SPARQL query processing pipeline. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Note: the data source URL doesn&amp;#39;t even have to be RDF based -- which is where the Virtuoso &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1d1a0978&quot;&gt;Sponger&lt;/a&gt; Middleware comes into play (download and install the &lt;a href=&quot;http://s3.amazonaws.com/opldownload/uda/vad-packages/6.1/virtuoso/rdf_mappers_dav.vad&quot; id=&quot;link-id0x1d0e1530&quot;&gt;VAD installer package&lt;/a&gt; first) since it delivers the following features to Virtuoso&amp;#39;s SPARQL engine: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Transformation of data from non RDF data sources (file content, hypermedia resources, &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;web&lt;/a&gt; services output etc..) into RDF based 3-tuples (triples)&lt;/li&gt; &lt;li&gt; Cache Invalidation Scheme Construction -- thus, subsequent queries (without the define get:soft &amp;quot;replace&amp;quot; pragma will not be required bar when you forcefully want to override cache).&lt;/li&gt; &lt;li&gt; If you have very large data sources like DBpedia etc. from CKAN, simply use our &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtBulkRDFLoader&quot; id=&quot;link-id0x1d19b4b0&quot;&gt;bulk loader&lt;/a&gt; . &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;SPARQL Endpoint Discovery&lt;/h3&gt; &lt;p&gt;Public SPARQL endpoints are emerging at an ever increasing rate. Thus, we&amp;#39;ve setup up a DNS lookup service that provides access to a large number of SPARQL endpoints. Of course, this doesn&amp;#39;t cover all existing endpoints, so if our endpoint is missing please ping &lt;a class=&quot;auto-href&quot; href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id0x1d634848&quot;&gt;me&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Here are a collection of commands for using DNS-SD to discover SPARQL endpoints:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;dns-sd -B _sparql._tcp sparql.openlinksw.com -- browse for services instances&lt;/li&gt; &lt;li&gt;dns-sd -Z _sparql._tcp sparql.openlinksw.com -- output results in Zone File format&lt;/li&gt; &lt;li&gt;&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/http/rdoc/index.html&quot; id=&quot;link-id0x1b156610&quot;&gt;Using HTTP from Ruby&lt;/a&gt; -- you can just make &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSSparqlProtocol&quot; id=&quot;link-id0x1d024d60&quot;&gt;SPARQL Protocol URLs&lt;/a&gt; re. SPARQL&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://sparql.rubyforge.org/client/&quot; id=&quot;link-id0x1cd43a48&quot;&gt;Using SPARQL Endpoints via Ruby&lt;/a&gt; -- Ruby example using DBpedia endpoint&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/OATWikiWeb/InteractiveSparqlQueryBuilder&quot; id=&quot;link-id0x1b9d2190&quot;&gt;Interactive SPARQL Query By Example (QBE) tool&lt;/a&gt; -- provides a graphical user interface (as is common in SQL realm re. query building against &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1bfffb70&quot;&gt;RDBMS&lt;/a&gt; engines) that works with any SPARQL endpoint &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtRDFInsert&quot; id=&quot;link-id0x1ab63de0&quot;&gt;Other methods of loading RDF data into Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; id=&quot;link-id0x1ca248e0&quot;&gt;Virtuoso Sponger&lt;/a&gt; -- architecture and how it turns a wide variety of non RDF data sources into SPARQL accessible data &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://ode.openlinksw.com/example.html&quot; id=&quot;link-id0x1be34758&quot;&gt;Using OpenLink Data Explorer&lt;/a&gt; (ODE) to populate Virtuoso -- locate a resource of interest; click on a bookmarklet or use &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id0x1ca84af0&quot;&gt;context&lt;/a&gt; menus (if using ODE extensions for Firefox, Safari, or Chrome); and you&amp;#39;ll have SPARQL accessible data automatically inserted into your Virtuoso instance. &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1295&quot; id=&quot;link-id0x1c9060f0&quot;&gt;W3C&amp;#39;s SPARQLing Data Access Ingenuity&lt;/a&gt; -- an older generic SPARQL introduction post &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSPARQLRef&quot; id=&quot;link-id0x1cf1e298&quot;&gt;Collection of SPARQL Query Examples &lt;/a&gt;-- GoodRelations (Product Offers), &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id0x1c0445d0&quot;&gt;FOAF&lt;/a&gt; (Profiles), &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SIOC&quot; id=&quot;link-id0x1b785e48&quot;&gt;SIOC&lt;/a&gt; (Data Spaces -- &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleBlog&quot; id=&quot;link-id0x1b6c9f78&quot;&gt;Blogs&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleWiki&quot; id=&quot;link-id0x1c188280&quot;&gt;Wikis&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleBookmarks&quot; id=&quot;link-id0x1a9a8f98&quot;&gt;Bookmarks&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleFeeds&quot; id=&quot;link-id0x1720c658&quot;&gt;Feed Collections&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleGallery&quot; id=&quot;link-id0x1cdba348&quot;&gt;Photo Galleries&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleBriefcase&quot; id=&quot;link-id0x1c8f1148&quot;&gt;Briefcase/DropBox&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleAddressbook&quot; id=&quot;link-id0x1b5eb7e0&quot;&gt;AddressBook&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleCalendar&quot; id=&quot;link-id0x1c575120&quot;&gt;Calendars&lt;/a&gt;, &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSAtomOWLRefExampleDiscussions&quot; id=&quot;link-id0x1c73be98&quot;&gt;Discussion Forums&lt;/a&gt;) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lod.openlinksw.com/demo_queries/&quot; id=&quot;link-id0x1b08aa00&quot;&gt;Collection of Live SPARQL Queries against LOD Cloud Cache&lt;/a&gt; -- simple and advanced queries. &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2011-01-19T10:43:35-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Rough draft poem: Document, what art thou?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-11-11#1646</atom:id>
  <atom:published>2010-11-11T18:44:36Z</atom:published>
  <atom:content type="html">&lt;em&gt;I am the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Container, Disseminator, and Canvas.&lt;br /&gt; I came to be when the cognitive skills of mankind deemed oral history inadequate.&lt;br /&gt; I am transcendent, I take many forms, but my core purpose is constant - Container, Disseminator, and Canvas.&lt;br /&gt; I am dexterous, so I can be blank, partitioned horizontally, horizontally and vertically, and if you get moi excited and I&amp;#39;ll show you fractals.&lt;br /&gt; I am accessible in a number of ways, across a plethora of media.&lt;br /&gt; I am loose, so you can access my content too.&lt;br /&gt; I am loose in a cool way, so you can refer to moi independent of my content.&lt;br /&gt; I am cool in a loose way, so you can refer to my content independent of moi.&lt;br /&gt; I am even cool and loose enough to let you figure out stuff from my content including how its totally distinct from moi.&lt;br /&gt; &lt;strong&gt;But...&lt;/strong&gt; &lt;br /&gt; I am possessive about my coolness, so all Containment, Dissemination, and Canvas requirements must first call upon moi, wherever I might be.&lt;br /&gt; &lt;strong&gt;So...&lt;/strong&gt; &lt;br /&gt; If you postulate about my demise or irrelevance, across any medium, I will punish you with confusion!&lt;br /&gt; &lt;strong&gt;Remember...&lt;/strong&gt; &lt;br /&gt; I just told you who I am. &lt;br /&gt; &lt;strong&gt;Lesson to be learned..&lt;/strong&gt; &lt;br /&gt; When something tells you what it is, and it is as powerful as I, best you believe it.&lt;br /&gt; BTW -- I am Okay with HTTP response code 200 OK :-) &lt;/em&gt;</atom:content>
  <atom:updated>2010-11-12T18:08:25-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>7 Things Brought to You by HTTP-based Hypermedia</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-11-08#1644</atom:id>
  <atom:published>2010-11-08T21:43:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;There are some very powerful benefits that accrue from the use of &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1b498648&quot;&gt;HTTP&lt;/a&gt; based &lt;a href=&quot;http://dbpedia.org/resource/Hypermedia&quot; id=&quot;link-id0x1be1e208&quot;&gt;Hypermedia&lt;/a&gt;. 7 that come to mind immediately include: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Structured &amp;amp; Platform Independent Enterprise &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x1ab5d6c8&quot;&gt;Data Virtualization&lt;/a&gt; -- concrete conceptual level access and provisioning of abstract domain entities such as Customers, Orders, Employees, Products, Countries, Competitors etc.&lt;/li&gt; &lt;li&gt;Distributed Application State (&lt;a href=&quot;http://dbpedia.org/resource/Representational_State_Transfer&quot; id=&quot;link-id0x1a8a0e38&quot;&gt;REST&lt;/a&gt;) -- application state transitions via links&lt;/li&gt; &lt;li&gt; Structured Data Representation (&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1acf1aa0&quot;&gt;Linked Data&lt;/a&gt;) -- whole data data representation via links &lt;/li&gt; &lt;li&gt; Structured Identity (&lt;a href=&quot;http://esw.w3.org/WebID&quot; id=&quot;link-id0x1a484548&quot;&gt;WebID&lt;/a&gt;) -- verifiable distributed identity &lt;/li&gt; &lt;li&gt; Structured Profiles (&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id0xa00bca8&quot;&gt;FOAF&lt;/a&gt;) -- platform independent profiles for people and organizations &lt;/li&gt; &lt;li&gt; Articulation of Structured Value Propositions (&lt;a href=&quot;http://www.heppnetz.de/projects/goodrelations/&quot; id=&quot;link-id0x1a4793d0&quot;&gt;GoodRelations&lt;/a&gt;) -- Product &amp;amp; Service Offers, Business Entities, Locations, Business Hours, etc. &lt;/li&gt; &lt;li&gt; Structured Collaboration Spaces (&lt;a href=&quot;http://rdfs.org/sioc/spec/&quot; id=&quot;link-id0x1afb8b40&quot;&gt;SIOC&lt;/a&gt;) -- Blogs, Wikis, File Sharing, Discussion Forums, Aggregated Feeds, Statuses, Photo Galleries, Polls etc.&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2010-11-08T15:29:43-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>6 Things That Must Remain Distinct re. Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-11-03#1643</atom:id>
  <atom:published>2010-11-03T17:02:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;Conflation is the tech industry&amp;#39;s equivalent of macroeconomic inflation. Whenever it rears it head, we lose value courtesy of diminishing productivity.&lt;/p&gt; &lt;p&gt;Looking retrospectively at any technology failure -- enterprises or industry at large -- you will eventually discover -- at the core -- messy conflation of at least one of the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Model (Semantics) &lt;/li&gt; &lt;li&gt; Data Object (&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x138a4c88&quot;&gt;Entity&lt;/a&gt;) Names (Identifiers) &lt;/li&gt; &lt;li&gt; Data Representation Syntax (Markup) &lt;/li&gt; &lt;li&gt; Data Access Protocol &lt;/li&gt; &lt;li&gt; Data Presentation Syntax (Markup) &lt;/li&gt; &lt;li&gt; Data Presentation Media. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x1b4a9918&quot;&gt;Internet&lt;/a&gt; &amp;amp; &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1a8f8700&quot;&gt;World Wide Web&lt;/a&gt; (InterWeb) are massive successes because their respective architectural cores embody the critical separation outlined above.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x156246e0&quot;&gt;Linked Data&lt;/a&gt; is going to become a global reality, and massive success, because it leverages inherently sound architecture -- bar conflationary distractions of RDF. :-)&lt;/p&gt;</atom:content>
  <atom:updated>2010-11-04T11:01:39.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Linked Data Deployment 3-Step</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-10-29#1641</atom:id>
  <atom:published>2010-10-29T22:54:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;Injecting &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x17012e18&quot;&gt;Linked Data&lt;/a&gt; into the Web has been a major pain point for those who seek personal, service, or organization-specific variants of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x196518a8&quot;&gt;DBpedia&lt;/a&gt;. Basically, the sequence goes something like this: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; You encounter DBpedia or the &lt;a class=&quot;auto-href&quot; href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1b26d008&quot;&gt;LOD&lt;/a&gt; Cloud Pictorial.&lt;/li&gt; &lt;li&gt; You look around (typically following your nose from link to link). &lt;/li&gt; &lt;li&gt; You attempt to publish your own stuff. &lt;/li&gt; &lt;li&gt; You get stuck. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The problems typically take the following form:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Functionality confusion about the complementary Name and Address functionality of a single &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xa108a00&quot;&gt;URI&lt;/a&gt; abstraction &lt;/li&gt; &lt;li&gt; Terminology confusion due to conflation and over-loading of terms such as Resource, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1b3d08f8&quot;&gt;URL&lt;/a&gt;, Representation, Document, etc. &lt;/li&gt; &lt;li&gt; Inability to find robust tools with which to generate Linked Data from existing data sources such as relational databases, CSV files, XML, Web Services, etc. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To start addressing these problems, here is a simple guide for generating and publishing Linked Data using &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1a7841e0&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Step 1 - RDF Data Generation&lt;/h3&gt; &lt;p&gt;Existing RDF data can be added to the Virtuoso RDF Quad Store via a variety of built-in data loader utilities.&lt;/p&gt; &lt;p&gt;Many options allow you to easily and quickly generate RDF data from other data sources:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Install the Sponger Bookmarklet for the &lt;a href=&quot;http://uriburner.com&quot; id=&quot;link-id0x1aa50800&quot;&gt;URIBurner service&lt;/a&gt;. Bind this to your own &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1a4255e0&quot;&gt;SPARQL&lt;/a&gt;-compliant backend RDF database (in this scenario, your local Virtuoso instance), and then Sponge some HTTP-accessible resources. &lt;/li&gt; &lt;li&gt; Convert relational DBMS data to RDF using the Virtuoso RDF Views Wizard. &lt;/li&gt; &lt;li&gt; Starting with CSV files, you can &lt;ul&gt; &lt;li&gt;Place them at an HTTP-accessible location, and use the Virtuoso &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x16f7ba58&quot;&gt;Sponger&lt;/a&gt; to convert them to RDF or; &lt;/li&gt; &lt;li&gt; Use the CVS import feature to import their content into Virtuoso&amp;#39;s relational data engine; then use the built-in RDF Views Wizard as with other &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1982ea80&quot;&gt;RDBMS&lt;/a&gt; data. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Starting from XML files, you can &lt;ul&gt; &lt;li&gt; Use Virtuoso&amp;#39;s inbuilt XSLT-Processor for manual XML to RDF/XML transformation or;&lt;/li&gt; &lt;li&gt;Leverage the Sponger Cartridge for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/GRDDL&quot; id=&quot;link-id0x1b350968&quot;&gt;GRDDL&lt;/a&gt;, if there is a transformation service associated with your XML data source, or;&lt;/li&gt; &lt;li&gt;Let the Sponger analyze the XML data source and make a best-effort transformation to RDF.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Step 2 - Linked Data Deployment&lt;/h3&gt; &lt;p&gt; Install the &lt;a href=&quot;http://download.openlinksw.com/packages/6.2/virtuoso/fct_dav.vad&quot; id=&quot;link-id0x19845ad0&quot;&gt;Faceted Browser VAD package (&lt;code&gt;fct_dav.vad&lt;/code&gt;)&lt;/a&gt; which delivers the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Faceted Browser Engine UI&lt;/li&gt; &lt;li&gt; Dynamic Hypermedia Resource Generator &lt;ul&gt; &lt;li&gt;delivers descriptor resources for every &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1b3a69f0&quot;&gt;entity&lt;/a&gt; (data object) in the Native or Virtual Quad Stores&lt;/li&gt; &lt;li&gt;supports a broad array of output formats, including HTML+&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id0x1a92d2f8&quot;&gt;RDFa&lt;/a&gt;, RDF/XML, N3/Turtle, NTriples, RDF-JSON, OData+Atom, and OData+JSON. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Step 3 - Linked Data Consumption &amp;amp; Exploitation&lt;/h3&gt; &lt;p&gt; Three simple steps allow you, your enterprise, and your customers to consume and exploit your newly deployed Linked Data -- &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Load a page like this in your browser: &lt;code&gt;http://&amp;lt;cname&amp;gt;[:&amp;lt;port&amp;gt;]/describe/?uri=&amp;lt;entity-uri&amp;gt;&lt;/code&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&amp;lt;cname&amp;gt;[:&amp;lt;port&amp;gt;]&lt;/code&gt; gets replaced by the host and port of your Virtuoso instance&lt;/li&gt; &lt;li&gt; &lt;code&gt;&amp;lt;entity-uri&amp;gt;&lt;/code&gt; gets replaced by the URI you want to see described -- for instance, the URI of one of the resources you let the Sponger handle. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Follow the links presented in the descriptor page. &lt;/li&gt; &lt;li&gt;If you ever see a blank page with a hyperlink subject name in the About: section at the top of the page, simply add the parameter &amp;quot;&amp;amp;sp=1&amp;quot; to the URL in the browser&amp;#39;s Address box, and hit [ENTER]. This will result in an &amp;quot;on the fly&amp;quot; resource retrieval, transformation, and descriptor page generation.&lt;/li&gt; &lt;li&gt; Use the navigator controls to page up and down the data associated with the &amp;quot;in scope&amp;quot; resource descriptor. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Flinkeddata.uriburner.com%2Fabout%2Fid%2Fentity%2Fhttp%2Fwww.amazon.com%2Fo%2FASIN%2F006251587X&quot; id=&quot;link-id0x1a8aeaf8&quot;&gt;Sample Descriptor Page&lt;/a&gt; (what you see post completion of the steps in this post) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1639&quot; id=&quot;link-id0x1af66f38&quot;&gt;What is Linked Data, really?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1613&quot; id=&quot;link-id0x1acdbc58&quot;&gt;Painless Linked Data Generation via URIBurner&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtRDFInsert&quot; id=&quot;link-id0x1abe3b18&quot;&gt;How To Load RDF Data Into Virtuoso&lt;/a&gt; (various methods)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtBulkRDFLoader&quot; id=&quot;link-id0x1a441ff0&quot;&gt;Virtuoso Bulk Loader Script for RDF&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtCsvFileBulkLoader&quot; id=&quot;link-id0x190382e8&quot;&gt;Bulk Loader Script for CSV&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtRdb2RDFViewsGeneration#OneClickLinkedDataGenerationAndDemployment&quot; id=&quot;link-id0x1ac9c9c0&quot;&gt;Wizard based generation of RDF based Linked Data from ODBC accessible Relational Databases &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-11-02T11:57:47.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Linked Data Deployment In 3 Simple Steps</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-10-29#1642</atom:id>
  <atom:published>2010-10-29T22:54:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;Injecting &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x17012e18&quot;&gt;Linked Data&lt;/a&gt; into the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; has been a major pain point for those who seek personal, service, or organization-specific variants of &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x196518a8&quot;&gt;DBpedia&lt;/a&gt;. Basically, the sequence goes something like this: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; You encounter DBpedia or the &lt;a class=&quot;auto-href&quot; href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1b26d008&quot;&gt;LOD&lt;/a&gt; Cloud Pictorial.&lt;/li&gt; &lt;li&gt; You look around (typically following your nose from link to link). &lt;/li&gt; &lt;li&gt; You attempt to publish your own stuff. &lt;/li&gt; &lt;li&gt; You get stuck. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The problems typically take the following form:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Functionality confusion about the complementary Name and Address functionality of a single &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xa108a00&quot;&gt;URI&lt;/a&gt; abstraction &lt;/li&gt; &lt;li&gt; Terminology confusion due to conflation and over-loading of terms such as Resource, &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1b3d08f8&quot;&gt;URL&lt;/a&gt;, Representation, Document, etc. &lt;/li&gt; &lt;li&gt; Inability to find robust tools with which to generate Linked Data from existing &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; sources such as relational databases, CSV files, XML, Web Services, etc. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To start addressing these problems, here is a simple guide for generating and publishing Linked Data using &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1a7841e0&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Step 1 - RDF Data Generation&lt;/h3&gt; &lt;p&gt;Existing RDF data can be added to the Virtuoso RDF Quad Store via a variety of built-in data loader utilities.&lt;/p&gt; &lt;p&gt;Many options allow you to easily and quickly generate RDF data from other data sources:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Install the Sponger Bookmarklet for the &lt;a href=&quot;http://uriburner.com&quot; id=&quot;link-id0x1aa50800&quot;&gt;URIBurner service&lt;/a&gt;. Bind this to your own &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1a4255e0&quot;&gt;SPARQL&lt;/a&gt;-compliant backend RDF database (in this scenario, your local Virtuoso instance), and then Sponge some HTTP-accessible resources. &lt;/li&gt; &lt;li&gt; Convert relational DBMS data to RDF using the Virtuoso RDF Views Wizard. &lt;/li&gt; &lt;li&gt; Starting with CSV files, you can &lt;ul&gt; &lt;li&gt;Place them at an HTTP-accessible location, and use the Virtuoso &lt;a class=&quot;auto-href&quot; href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x16f7ba58&quot;&gt;Sponger&lt;/a&gt; to convert them to RDF or; &lt;/li&gt; &lt;li&gt; Use the CVS import feature to import their content into Virtuoso&amp;#39;s relational data engine; then use the built-in RDF Views Wizard as with other &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1982ea80&quot;&gt;RDBMS&lt;/a&gt; data. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Starting from XML files, you can &lt;ul&gt; &lt;li&gt; Use Virtuoso&amp;#39;s inbuilt XSLT-Processor for manual XML to RDF/XML transformation or;&lt;/li&gt; &lt;li&gt;Leverage the Sponger Cartridge for &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/GRDDL&quot; id=&quot;link-id0x1b350968&quot;&gt;GRDDL&lt;/a&gt;, if there is a transformation service associated with your XML data source, or;&lt;/li&gt; &lt;li&gt;Let the Sponger analyze the XML data source and make a best-effort transformation to RDF.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Step 2 - Linked Data Deployment&lt;/h3&gt; &lt;p&gt; Install the &lt;a href=&quot;http://download.openlinksw.com/packages/6.2/virtuoso/fct_dav.vad&quot; id=&quot;link-id0x19845ad0&quot;&gt;Faceted Browser VAD package (&lt;code&gt;fct_dav.vad&lt;/code&gt;)&lt;/a&gt; which delivers the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Faceted Browser Engine UI&lt;/li&gt; &lt;li&gt; Dynamic Hypermedia Resource Generator &lt;ul&gt; &lt;li&gt;delivers descriptor resources for every &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1b3a69f0&quot;&gt;entity&lt;/a&gt; (data object) in the Native or Virtual Quad Stores&lt;/li&gt; &lt;li&gt;supports a broad array of output formats, including HTML+&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id0x1a92d2f8&quot;&gt;RDFa&lt;/a&gt;, RDF/XML, N3/Turtle, NTriples, RDF-JSON, OData+Atom, and OData+JSON. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Step 3 - Linked Data Consumption &amp;amp; Exploitation&lt;/h3&gt; &lt;p&gt; Three simple steps allow you, your enterprise, and your customers to consume and exploit your newly deployed Linked Data -- &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Load a page like this in your browser: &lt;code&gt;http://&amp;lt;cname&amp;gt;[:&amp;lt;port&amp;gt;]/describe/?uri=&amp;lt;entity-uri&amp;gt;&lt;/code&gt; &lt;ul&gt; &lt;li&gt; &lt;code&gt;&amp;lt;cname&amp;gt;[:&amp;lt;port&amp;gt;]&lt;/code&gt; gets replaced by the host and port of your Virtuoso instance&lt;/li&gt; &lt;li&gt; &lt;code&gt;&amp;lt;entity-uri&amp;gt;&lt;/code&gt; gets replaced by the URI you want to see described -- for instance, the URI of one of the resources you let the Sponger handle. &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt; Follow the links presented in the descriptor page. &lt;/li&gt; &lt;li&gt;If you ever see a blank page with a hyperlink subject name in the About: section at the top of the page, simply add the parameter &amp;quot;&amp;amp;sp=1&amp;quot; to the URL in the browser&amp;#39;s Address box, and hit [ENTER]. This will result in an &amp;quot;on the fly&amp;quot; resource retrieval, transformation, and descriptor page generation.&lt;/li&gt; &lt;li&gt; Use the navigator controls to page up and down the data associated with the &amp;quot;in scope&amp;quot; resource descriptor. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/describe/?url=http%3A%2F%2Flinkeddata.uriburner.com%2Fabout%2Fid%2Fentity%2Fhttp%2Fwww.amazon.com%2Fo%2FASIN%2F006251587X&quot; id=&quot;link-id0x1a8aeaf8&quot;&gt;Sample Descriptor Page&lt;/a&gt; (what you see post completion of the steps in this post) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1639&quot; id=&quot;link-id0x1af66f38&quot;&gt;What is Linked Data, really?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1613&quot; id=&quot;link-id0x1acdbc58&quot;&gt;Painless Linked Data Generation via URIBurner&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtRDFInsert&quot; id=&quot;link-id0x1abe3b18&quot;&gt;How To Load RDF Data Into Virtuoso&lt;/a&gt; (various methods)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtBulkRDFLoader&quot; id=&quot;link-id0x1a441ff0&quot;&gt;Virtuoso Bulk Loader Script for RDF&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtCsvFileBulkLoader&quot; id=&quot;link-id0x190382e8&quot;&gt;Bulk Loader Script for CSV&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtRdb2RDFViewsGeneration#OneClickLinkedDataGenerationAndDemployment&quot; id=&quot;link-id0x1ac9c9c0&quot;&gt;Wizard based generation of RDF based Linked Data from ODBC accessible Relational Databases &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-11-02T11:55:31.000005-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Business Of Linked Data: Data Quality Factors</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-10-25#1640</atom:id>
  <atom:published>2010-10-25T17:50:23Z</atom:published>
  <atom:content type="html">&lt;p&gt;Via my &amp;quot;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id0x1a39dd88&quot;&gt;context&lt;/a&gt; lenses&amp;quot; (i.e., my subjective view of the world) a unit of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; (or Datum) is like a cube of sugar, each side representing a value factor along the following dimensions:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Identity -- via Resolvable URIs based Names for everything &lt;/li&gt; &lt;li&gt; Data Representation Format Dexterity -- e.g., HTTP based Content Negotiation which loosens the coupling between Data Model Semantics and actual Data Representation (Syntax/Markup) &lt;/li&gt; &lt;li&gt; Platform Agnostic Data Access -- e.g. via ubiquitous HTTP &lt;/li&gt; &lt;li&gt; Change Sensitivity -- data warehouses are like real-world warehouses, goods rot and perish overtime &lt;/li&gt; &lt;li&gt;Provenance -- data about the data (metadata) that helps establish &amp;quot;Who&amp;quot;, &amp;quot;What&amp;quot;, &amp;quot;When&amp;quot;, &amp;quot;Where&amp;quot;, and at least approximate or guesstimate &amp;quot;Why&amp;quot; &lt;/li&gt; &lt;li&gt; Data Mesh Navigability -- delivered via inference rules.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The quality of service factors above nullify many of the typical concerns associated data driven business models, such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Wholesale Imports (crawls) - where your data is crawled and/or imported wholesale into a new &lt;a class=&quot;auto-href&quot; href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x1b1aaa98&quot;&gt;data space&lt;/a&gt; with zero attribution to the source &lt;/li&gt; &lt;li&gt; Lossy Attribution -- attribution is delivered in literal form which doesn&amp;#39;t deliver branding fidelity across many value chain layers or entire life cycle of a given data item &lt;/li&gt; &lt;li&gt; Service Provisioning -- effectively build any business model if you can align services with unambiguously identifiable consumers with actual data items or across entire data spaces. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-10-25T17:09:02.000013-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is Linked Data, really?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-10-14#1645</atom:id>
  <atom:published>2010-10-14T23:10:26Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;b&gt; &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e81beb0&quot;&gt;Linked Data&lt;/a&gt; &lt;/i&gt; &lt;/b&gt; is simply &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Hypermedia&quot; id=&quot;link-id0x1d9d5e30&quot;&gt;hypermedia&lt;/a&gt;-based structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Linked Data offers everyone a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;-scale, Enterprise-grade mechanism for platform-independent creation, curation, access, and integration of data.&lt;/p&gt; &lt;p&gt;The fundamental steps to creating Linked Data are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;Name Reference Mechanism&lt;/i&gt; — i.e., URIs.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;Data Model&lt;/i&gt; with which to Structure your Data — minimally, you need a model which clearly distinguishes&lt;/p&gt; &lt;ol type=&quot;a&quot;&gt; &lt;li&gt; &lt;i&gt;Subjects&lt;/i&gt; (also known as &lt;i&gt;Entities&lt;/i&gt;)&lt;/li&gt; &lt;li&gt; &lt;i&gt;Subject Attributes&lt;/i&gt; (also known as &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x171a1808&quot;&gt;Entity&lt;/a&gt; Attributes&lt;/i&gt;), and&lt;/li&gt; &lt;li&gt; &lt;i&gt;Attribute Values&lt;/i&gt; (also known as &lt;i&gt;Subject Attribute Values&lt;/i&gt; or &lt;i&gt;Entity Attribute Values&lt;/i&gt;).&lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose one or more &lt;i&gt;Data Representation Syntaxes&lt;/i&gt; (also called &lt;i&gt;Markup Languages&lt;/i&gt; or &lt;i&gt;Data Formats&lt;/i&gt;) to use when creating &lt;i&gt;Resources&lt;/i&gt; with &lt;i&gt;Content&lt;/i&gt; based on your chosen &lt;i&gt;Data Model.&lt;/i&gt; Some Syntaxes in common use today are HTML+&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id0x1a95cc58&quot;&gt;RDFa&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/DesignIssues/Notation3&quot; id=&quot;link-id0x1f596330&quot;&gt;N3&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TeamSubmission/turtle/&quot; id=&quot;link-id0x16fdca68&quot;&gt;Turtle&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/REC-rdf-syntax/&quot; id=&quot;link-id0x1d7cf0c0&quot;&gt;RDF/XML&lt;/a&gt;, &lt;a href=&quot;http://sw.nokia.com/trix/TriX.html&quot; id=&quot;link-id0x19690b60&quot;&gt;TriX&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Extensible_Resource_Descriptor&quot; id=&quot;link-id0x1bb46968&quot;&gt;XRDS&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/apis/gdata/index.html&quot; id=&quot;link-id0x18f63f20&quot;&gt;GData&lt;/a&gt;, &lt;a href=&quot;http://odata.org&quot; id=&quot;link-id0x19aee1e0&quot;&gt;OData&lt;/a&gt;, &lt;a href=&quot;http://opengraphprotocol.org/&quot; id=&quot;link-id0x1a43eb78&quot;&gt;OpenGraph&lt;/a&gt;, and many others.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x19aa3900&quot;&gt;URI&lt;/a&gt; Scheme&lt;/i&gt; that facilitates binding &lt;i&gt;Referenced Names&lt;/i&gt; to the &lt;i&gt;Resources&lt;/i&gt; which will carry your &lt;i&gt;Content&lt;/i&gt; -- your &lt;i&gt;Structured Data.&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Create &lt;i&gt;Structured Data&lt;/i&gt; by using your chosen &lt;i&gt;Name Reference Mechanism,&lt;/i&gt; your chosen &lt;i&gt;Data Model,&lt;/i&gt; and your chosen &lt;i&gt;Data Representation Syntax,&lt;/i&gt; as follows:&lt;/p&gt; &lt;ol type=&quot;a&quot;&gt; &lt;li&gt;Identify &lt;i&gt;Subject(s)&lt;/i&gt; using &lt;i&gt;Resolvable URI(s).&lt;/i&gt; &lt;/li&gt; &lt;li&gt;Identify &lt;i&gt;Subject Attribute(s)&lt;/i&gt; using &lt;i&gt;Resolvable URI(s).&lt;/i&gt; &lt;/li&gt; &lt;li&gt;Assign &lt;i&gt;Attribute Values&lt;/i&gt; to &lt;i&gt;Subject Attributes.&lt;/i&gt; These &lt;i&gt;Values&lt;/i&gt; may be either &lt;i&gt;Literals&lt;/i&gt; (e.g., STRINGs, BLOBs) or &lt;i&gt;Resolvable URIs.&lt;/i&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;You can create Linked Data (hypermedia-based data representations) Resources from or for many things. Examples include: personal profiles, calendars, address books, blogs, photo albums; there are many, many more.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://socialmedia.net/linked-data-introduction&quot; id=&quot;link-id0x1bb13d50&quot;&gt;Linked Data an Introduction&lt;/a&gt; -- simple introduction to Linked Data and its virtues&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://gigaom.com/2010/10/11/jeff-jonas-big-data/&quot; id=&quot;link-id0xa00d7e8&quot;&gt;How Data Makes Corporations Dumb&lt;/a&gt; -- Jeff Jonas (IBM) interview&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.amundsen.com/hypermedia/&quot; id=&quot;link-id0x18f64958&quot;&gt;Hypermedia Types&lt;/a&gt; -- evolving &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1903b880&quot;&gt;information&lt;/a&gt; portal covering different aspects of Hypermedia resource types&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com&quot; id=&quot;link-id0x18af0cf8&quot;&gt;URIBurner &lt;/a&gt;-- service that generates Linked Data from a plethora of heterogeneous data sources&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x1929eea0&quot;&gt;Linked Data Meme&lt;/a&gt; -- &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id0x1e8127c8&quot;&gt;TimbL&lt;/a&gt; design issues note about Linked Data&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1624&quot; id=&quot;link-id0x18a5b768&quot;&gt;Data 3.0 Manifesto&lt;/a&gt; -- note about format agnostic Linked Data&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/About&quot; id=&quot;link-id0x19ae9338&quot;&gt;DBpedia&lt;/a&gt; -- large Linked Data Hub&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://richard.cyganiak.de/2007/10/lod/&quot; id=&quot;link-id0x14d677f8&quot;&gt;Linked Open Data Cloud&lt;/a&gt; -- collection of Linked Data Spaces&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkedopencommerce.com&quot; id=&quot;link-id0x17c6dbf8&quot;&gt;Linked Open Commerce Cloud &lt;/a&gt;-- commerce (clicks &amp;amp; mortar and/or clicks &amp;amp; clicks) oriented &lt;a class=&quot;auto-href&quot; href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x13959308&quot;&gt;Linked Data Space&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id0x18ccb9e8&quot;&gt;LOD Cloud Cache &lt;/a&gt;-- massive Linked Data Space hosting most of the LOD Cloud Datasets&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lod2.eu&quot; id=&quot;link-id0x1a472c20&quot;&gt;LOD2 Initiative&lt;/a&gt; -- EU Co-Funded Project to develop global &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1c0ae7d0&quot;&gt;knowledge&lt;/a&gt; space from LOD&lt;/li&gt;. &lt;/ol&gt;</atom:content>
  <atom:updated>2010-11-09T13:53:01-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is Linked Data, really?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-10-14#1639</atom:id>
  <atom:published>2010-10-14T21:54:31Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;b&gt; &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e81beb0&quot;&gt;Linked Data&lt;/a&gt; &lt;/i&gt; &lt;/b&gt; is simply &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Hypermedia&quot; id=&quot;link-id0x1d9d5e30&quot;&gt;hypermedia&lt;/a&gt;-based structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Linked Data offers everyone a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;-scale, Enterprise-grade mechanism for platform-independent creation, curation, access, and integration of data.&lt;/p&gt; &lt;p&gt;The fundamental steps to creating Linked Data are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;Name Reference Mechanism&lt;/i&gt; — i.e., URIs.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;Data Model&lt;/i&gt; with which to Structure your Data — minimally, you need a model which clearly distinguishes&lt;/p&gt; &lt;ol type=&quot;a&quot;&gt; &lt;li&gt; &lt;i&gt;Subjects&lt;/i&gt; (also known as &lt;i&gt;Entities&lt;/i&gt;)&lt;/li&gt; &lt;li&gt; &lt;i&gt;Subject Attributes&lt;/i&gt; (also known as &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x171a1808&quot;&gt;Entity&lt;/a&gt; Attributes&lt;/i&gt;), and&lt;/li&gt; &lt;li&gt; &lt;i&gt;Attribute Values&lt;/i&gt; (also known as &lt;i&gt;Subject Attribute Values&lt;/i&gt; or &lt;i&gt;Entity Attribute Values&lt;/i&gt;).&lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose one or more &lt;i&gt;Data Representation Syntaxes&lt;/i&gt; (also called &lt;i&gt;Markup Languages&lt;/i&gt; or &lt;i&gt;Data Formats&lt;/i&gt;) to use when creating &lt;i&gt;Resources&lt;/i&gt; with &lt;i&gt;Content&lt;/i&gt; based on your chosen &lt;i&gt;Data Model.&lt;/i&gt; Some Syntaxes in common use today are HTML+&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id0x1a95cc58&quot;&gt;RDFa&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/DesignIssues/Notation3&quot; id=&quot;link-id0x1f596330&quot;&gt;N3&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TeamSubmission/turtle/&quot; id=&quot;link-id0x16fdca68&quot;&gt;Turtle&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/REC-rdf-syntax/&quot; id=&quot;link-id0x1d7cf0c0&quot;&gt;RDF/XML&lt;/a&gt;, &lt;a href=&quot;http://sw.nokia.com/trix/TriX.html&quot; id=&quot;link-id0x19690b60&quot;&gt;TriX&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Extensible_Resource_Descriptor&quot; id=&quot;link-id0x1bb46968&quot;&gt;XRDS&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/apis/gdata/index.html&quot; id=&quot;link-id0x18f63f20&quot;&gt;GData&lt;/a&gt;, and &lt;a href=&quot;http://odata.org&quot; id=&quot;link-id0x19aee1e0&quot;&gt;OData&lt;/a&gt;; there are many others.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Choose a &lt;i&gt;&lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x19aa3900&quot;&gt;URI&lt;/a&gt; Scheme&lt;/i&gt; that facilitates binding &lt;i&gt;Referenced Names&lt;/i&gt; to the &lt;i&gt;Resources&lt;/i&gt; which will carry your &lt;i&gt;Content&lt;/i&gt; -- your &lt;i&gt;Structured Data.&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Create &lt;i&gt;Structured Data&lt;/i&gt; by using your chosen &lt;i&gt;Name Reference Mechanism,&lt;/i&gt; your chosen &lt;i&gt;Data Model,&lt;/i&gt; and your chosen &lt;i&gt;Data Representation Syntax,&lt;/i&gt; as follows:&lt;/p&gt; &lt;ol type=&quot;a&quot;&gt; &lt;li&gt;Identify &lt;i&gt;Subject(s)&lt;/i&gt; using &lt;i&gt;Resolvable URI(s).&lt;/i&gt; &lt;/li&gt; &lt;li&gt;Identify &lt;i&gt;Subject Attribute(s)&lt;/i&gt; using &lt;i&gt;Resolvable URI(s).&lt;/i&gt; &lt;/li&gt; &lt;li&gt;Assign &lt;i&gt;Attribute Values&lt;/i&gt; to &lt;i&gt;Subject Attributes.&lt;/i&gt; These &lt;i&gt;Values&lt;/i&gt; may be either &lt;i&gt;Literals&lt;/i&gt; (e.g., STRINGs, BLOBs) or &lt;i&gt;Resolvable URIs.&lt;/i&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;You can create Linked Data (hypermedia-based data representations) Resources from or for many things. Examples include: personal profiles, calendars, address books, blogs, photo albums; there are many, many more.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://www.amundsen.com/hypermedia/&quot; id=&quot;link-id0x18f64958&quot;&gt;Hypermedia Types&lt;/a&gt; -- evolving &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1903b880&quot;&gt;information&lt;/a&gt; portal covering different aspects of Hypermedia resource types&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com&quot; id=&quot;link-id0x18af0cf8&quot;&gt;URIBurner &lt;/a&gt;-- service that generates Linked Data from a plethora of heterogeneous data sources&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x1929eea0&quot;&gt;Linked Data Meme&lt;/a&gt; -- &lt;a class=&quot;auto-href&quot; href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id0x1e8127c8&quot;&gt;TimbL&lt;/a&gt; design issues note about Linked Data&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1624&quot; id=&quot;link-id0x18a5b768&quot;&gt;Data 3.0 Manifesto&lt;/a&gt; -- note about format agnostic Linked Data&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/About&quot; id=&quot;link-id0x19ae9338&quot;&gt;DBpedia&lt;/a&gt; -- large Linked Data Hub&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://richard.cyganiak.de/2007/10/lod/&quot; id=&quot;link-id0x14d677f8&quot;&gt;Linked Open Data Cloud&lt;/a&gt; -- collection of Linked Data Spaces&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkedopencommerce.com&quot; id=&quot;link-id0x17c6dbf8&quot;&gt;Linked Open Commerce Cloud &lt;/a&gt;-- commerce (clicks &amp;amp; mortar and/or clicks &amp;amp; clicks) oriented &lt;a class=&quot;auto-href&quot; href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x13959308&quot;&gt;Linked Data Space&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id0x18ccb9e8&quot;&gt;LOD Cloud Cache &lt;/a&gt;-- massive Linked Data Space hosting most of the LOD Cloud Datasets&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lod2.eu&quot; id=&quot;link-id0x1a472c20&quot;&gt;LOD2 Initiative&lt;/a&gt; -- EU Co-Funded Project to develop global &lt;a class=&quot;auto-href&quot; href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1c0ae7d0&quot;&gt;knowledge&lt;/a&gt; space from LOD&lt;/li&gt;. &lt;/ol&gt;</atom:content>
  <atom:updated>2011-02-15T17:28:06.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 6.2 brings New Features!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-22#1638</atom:id>
  <atom:published>2010-09-22T21:08:24Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2015-08-21T14:43:46.770292-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Business of Semantically Linked Data (&quot;SemData&quot;)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-22#1637</atom:id>
  <atom:published>2010-09-22T18:20:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;I had the opportunity the other day to converse about the semantic technology business proposition in terms of business development. My interlocutor was a business development consultant who had little prior &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x245787f0&quot;&gt;knowledge&lt;/a&gt; of this technology but a background in business development inside a large diversified enterprise.&lt;/p&gt; &lt;p&gt;I will here recap some of the points discussed, since these can be of broader interest.&lt;/p&gt; &lt;b&gt;&lt;i&gt;Why is there no single dominant vendor?&lt;/i&gt;&lt;/b&gt; &lt;p&gt;The field is young. We can take the relational database industry as a historical precedent. From the inception of the relational database around 1970, it took 15 years for the relational model to become mainstream. &amp;quot;Mainstream&amp;quot; here does not mean dominant in installed base, but does mean something that one tends to include as a component in new systems. The figure of 15 years might repeat with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x25147d40&quot;&gt;RDF&lt;/a&gt;, from around 1990 for the first beginnings to 2015 for routine inclusion in new systems, where applicable.&lt;/p&gt; &lt;p&gt;This does not necessarily mean that the RDF graph &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x25325290&quot;&gt;data&lt;/a&gt; model (or more properly, &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x23dc23b0&quot;&gt;EAV&lt;/a&gt;+CR; &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x25d7c238&quot;&gt;Entity&lt;/a&gt;-Attribute-Value + Classes and Relationships) will take the place of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x268cd248&quot;&gt;RDBMS&lt;/a&gt; as the preferred data backbone. This could mean that RDF model serialization formats will be supported as data exchange mechanisms, and that systems will integrate data extracted by semantic technology from unstructured sources. Some degree of EAV storage is likely to be common, but on-line transactional data is guaranteed to stay pure relational, as EAV is suboptimal for OLTP. Analytics will see EAV alongside relational especially in applications where in-house data is being combined with large numbers of outside structured sources or with other open sources such as &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x23ce37d8&quot;&gt;information&lt;/a&gt; extracted from the web.&lt;/p&gt; &lt;p&gt;EAV offerings will become integrated by major DBMS vendors, as is already the case with &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x26a17030&quot;&gt;Oracle&lt;/a&gt;. Specialized vendors will exist alongside these, just as is the case with relational databases.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Can there be a positive reinforcement cycle (e.g., building cars creates a need for road construction, and better roads drive demand for more cars)? Or is this an up-front infrastructure investment that governments make for some future payoff or because of science-funding policies?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;The Document Web did not start as a government infrastructure initiative. The infrastructure was already built, albeit first originating with the US defense establishment. The &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x2551cf60&quot;&gt;Internet&lt;/a&gt; became ubiquitous through the adoption of the Web. The general public&amp;#39;s adoption of the Web was bootstrapped by all major business and media adopting the Web. They did not adopt the web because they particularly liked it, as it was essentially a threat to the position of media and to the market dominance of big players who could afford massive advertising in this same media. Adopting the web became necessary because of the prohibitive opportunity cost of &lt;i&gt;not&lt;/i&gt; adopting it.&lt;/p&gt; &lt;p&gt;A similar process may take place with open data. For example, in E-commerce, vendors do not necessarily welcome easy-and-automatic machine-based comparison of their offerings against those of their competitors. Publishing data will however be necessary in order to be listed at all. Also, in social networks, we have the identity portability movement which strives to open the big social network silos. Data exchange via RDF serializations, as already supported in many places, is the natural enabling technology for this.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Will the web of structured data parallel the development of web 2.0?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Web 2.0 was about the blogosphere, exposure of web site service APIs, creation of affiliate programs, and so forth. If the Document Web was like a universal printing press, where anybody could publish at will, Web 2.0 was a newspaper, bringing the democratization of journalism, creating the blogger, the citizen journalist. The Data Web will create the Citizen Analyst, the Mini Media Mogul (e.g., social-network-driven coops comprised of citizen journalists, analysts, and other content providers such as video and audio producers and publishers). As the blogosphere became an alternative news source to the big media, the web of data may create an ecosystem of alternative data products. Analytics is no longer a government or big business only proposition.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Is there a specifically semantic market or business model, or will semantic technology be exploited under established business models and merged as a component technology into existing offerings?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;We have seen a migration from capital expenses to operating expenses in the IT sector in general, as exemplified by cloud computing&amp;#39;s Platform as a Service (PaaS) and Software as a Service (SaaS). It is reasonable to anticipate that this trend will continue to Data as a Service (DaaS). &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x25382248&quot;&gt;Microsoft&lt;/a&gt; Odata and Dallas are early examples of this and go towards legitimizing the data as service concept. DaaS is not related to semantic technology &lt;i&gt;per se&lt;/i&gt;, but since this will involve integration of data, RDF serializations will be attractive, especially given the takeoff of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x24d9ac10&quot;&gt;linked data&lt;/a&gt; in general. The data models in Odata are also much like RDF, as both stem from EAV+CR, which makes for easy translation and a degree of inherent interoperability.&lt;/p&gt; &lt;p&gt;The integration of semantic technology into existing web properties and business applications will manifest to the end user as increased serendipity. The systems will be able to provide more relevant and better contextualized data for the user&amp;#39;s situation. This applies equally to the consumer and business user cases.&lt;/p&gt; &lt;p&gt;Identity virtualization in the forms of WebID and Webfinger — making first-class de-referenceable identifiers of &lt;code&gt;mailto:&lt;/code&gt; and &lt;code&gt;acct:&lt;/code&gt; schemes — is emerging as a new way to open social network and Web 2.0 data silos.&lt;/p&gt; &lt;p&gt;On the software production side, especially as concerns data integration, the increased &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x252fd428&quot;&gt;schema&lt;/a&gt;- and inference-flexibility of EAV will lead to a quicker time to answer in many situations. The more complex the task or the more diverse the data, the higher the potential payoff. Data in &lt;a href=&quot;http://dbpedia.org/resource/Cyberspace&quot; id=&quot;link-id0x28ca9510&quot;&gt;cyberspace&lt;/a&gt; is mirroring the complexity and diversity of the real world, where heterogeneity and disparity are simply facts of life, and such flexibility is becoming an inescapable necessity.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-22T13:44:18-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Business of Semantically Linked Data (&quot;SemData&quot;)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-22#1636</atom:id>
  <atom:published>2010-09-22T18:20:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;I had the opportunity the other day to converse about the semantic technology business proposition in terms of business development. My interlocutor was a business development consultant who had little prior &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x23fd79c0&quot;&gt;knowledge&lt;/a&gt; of this technology but a background in business development inside a large diversified enterprise.&lt;/p&gt; &lt;p&gt;I will here recap some of the points discussed, since these can be of broader interest.&lt;/p&gt; &lt;b&gt;&lt;i&gt;Why is there no single dominant vendor?&lt;/i&gt;&lt;/b&gt; &lt;p&gt;The field is young. We can take the relational database industry as a historical precedent. From the inception of the relational database around 1970, it took 15 years for the relational model to become mainstream. &amp;quot;Mainstream&amp;quot; here does not mean dominant in installed base, but does mean something that one tends to include as a component in new systems. The figure of 15 years might repeat with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x2682f278&quot;&gt;RDF&lt;/a&gt;, from around 1990 for the first beginnings to 2015 for routine inclusion in new systems, where applicable.&lt;/p&gt; &lt;p&gt;This does not necessarily mean that the RDF graph &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x26d601e0&quot;&gt;data&lt;/a&gt; model (or more properly, &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x2689c570&quot;&gt;EAV&lt;/a&gt;+CR; &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x2512f268&quot;&gt;Entity&lt;/a&gt;-Attribute-Value + Classes and Relationships) will take the place of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x24423890&quot;&gt;RDBMS&lt;/a&gt; as the preferred data backbone. This could mean that RDF model serialization formats will be supported as data exchange mechanisms, and that systems will integrate data extracted by semantic technology from unstructured sources. Some degree of EAV storage is likely to be common, but on-line transactional data is guaranteed to stay pure relational, as EAV is suboptimal for OLTP. Analytics will see EAV alongside relational especially in applications where in-house data is being combined with large numbers of outside structured sources or with other open sources such as &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x25134320&quot;&gt;information&lt;/a&gt; extracted from the web.&lt;/p&gt; &lt;p&gt;EAV offerings will become integrated by major DBMS vendors, as is already the case with &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x25759780&quot;&gt;Oracle&lt;/a&gt;. Specialized vendors will exist alongside these, just as is the case with relational databases.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Can there be a positive reinforcement cycle (e.g., building cars creates a need for road construction, and better roads drive demand for more cars)? Or is this an up-front infrastructure investment that governments make for some future payoff or because of science-funding policies?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;The Document Web did not start as a government infrastructure initiative. The infrastructure was already built, albeit first originating with the US defense establishment. The &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x24613448&quot;&gt;Internet&lt;/a&gt; became ubiquitous through the adoption of the Web. The general public&amp;#39;s adoption of the Web was bootstrapped by all major business and media adopting the Web. They did not adopt the web because they particularly liked it, as it was essentially a threat to the position of media and to the market dominance of big players who could afford massive advertising in this same media. Adopting the web became necessary because of the prohibitive opportunity cost of &lt;i&gt;not&lt;/i&gt; adopting it.&lt;/p&gt; &lt;p&gt;A similar process may take place with open data. For example, in E-commerce, vendors do not necessarily welcome easy-and-automatic machine-based comparison of their offerings against those of their competitors. Publishing data will however be necessary in order to be listed at all. Also, in social networks, we have the identity portability movement which strives to open the big social network silos. Data exchange via RDF serializations, as already supported in many places, is the natural enabling technology for this.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Will the web of structured data parallel the development of web 2.0?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Web 2.0 was about the blogosphere, exposure of web site service APIs, creation of affiliate programs, and so forth. If the Document Web was like a universal printing press, where anybody could publish at will, Web 2.0 was a newspaper, bringing the democratization of journalism, creating the blogger, the citizen journalist. The Data Web will create the Citizen Analyst, the Mini Media Mogul (e.g., social-network-driven coops comprised of citizen journalists, analysts, and other content providers such as video and audio producers and publishers). As the blogosphere became an alternative news source to the big media, the web of data may create an ecosystem of alternative data products. Analytics is no longer a government or big business only proposition.&lt;/p&gt; &lt;p&gt; &lt;b&gt;&lt;i&gt;Is there a specifically semantic market or business model, or will semantic technology be exploited under established business models and merged as a component technology into existing offerings?&lt;/i&gt; &lt;/b&gt; &lt;/p&gt; &lt;p&gt;We have seen a migration from capital expenses to operating expenses in the IT sector in general, as exemplified by cloud computing&amp;#39;s Platform as a Service (PaaS) and Software as a Service (SaaS). It is reasonable to anticipate that this trend will continue to Data as a Service (DaaS). &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x25d44398&quot;&gt;Microsoft&lt;/a&gt; Odata and Dallas are early examples of this and go towards legitimizing the data as service concept. DaaS is not related to semantic technology &lt;i&gt;per se&lt;/i&gt;, but since this will involve integration of data, RDF serializations will be attractive, especially given the takeoff of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2578b788&quot;&gt;linked data&lt;/a&gt; in general. The data models in Odata are also much like RDF, as both stem from EAV+CR, which makes for easy translation and a degree of inherent interoperability.&lt;/p&gt; &lt;p&gt;The integration of semantic technology into existing web properties and business applications will manifest to the end user as increased serendipity. The systems will be able to provide more relevant and better contextualized data for the user&amp;#39;s situation. This applies equally to the consumer and business user cases.&lt;/p&gt; &lt;p&gt;Identity virtualization in the forms of WebID and Webfinger — making first-class de-referenceable identifiers of &lt;code&gt;mailto:&lt;/code&gt; and &lt;code&gt;acct:&lt;/code&gt; schemes — is emerging as a new way to open social network and Web 2.0 data silos.&lt;/p&gt; &lt;p&gt;On the software production side, especially as concerns data integration, the increased &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x243877e8&quot;&gt;schema&lt;/a&gt;- and inference-flexibility of EAV will lead to a quicker time to answer in many situations. The more complex the task or the more diverse the data, the higher the potential payoff. Data in &lt;a href=&quot;http://dbpedia.org/resource/Cyberspace&quot; id=&quot;link-id0x2428fd30&quot;&gt;cyberspace&lt;/a&gt; is mirroring the complexity and diversity of the real world, where heterogeneity and disparity are simply facts of life, and such flexibility is becoming an inescapable necessity.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-22T13:44:12.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB Semdata Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-21#1635</atom:id>
  <atom:published>2010-09-21T21:14:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will begin by extending my thanks to the organizers, in specific &lt;a href=&quot;http://members.deri.at/~retok&quot; id=&quot;link-id0x236ebfd0&quot;&gt;Reto Krummenacher&lt;/a&gt; of &lt;a href=&quot;http://www.sti-innsbruck.at/&quot; id=&quot;link-id0x2371aca8&quot;&gt;STI&lt;/a&gt; and Atanas Kiryakov of &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x22e24190&quot;&gt;Ontotext&lt;/a&gt; for inviting me to give a position paper at the workshop. Indeed, it is the builders of bridges, the pontifs (pontifex) amongst us who shall be remembered by history. The idea of organizing a semantic &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23781ba8&quot;&gt;data&lt;/a&gt; management workshop at VLDB is a laudable attempt at rapprochement between two communities to the advantage of all concerned.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x22e09fa8&quot;&gt;Franz&lt;/a&gt;, Ontotext, and OpenLink were the vendors present at the workshop. To summarize very briefly, &lt;a href=&quot;http://data.semanticweb.org/person/jans-aasman&quot; id=&quot;link-id0x2380e7c8&quot;&gt;Jans Aasman&lt;/a&gt; of Franz talked about the telco call center automation solution by Amdocs, where the &lt;a href=&quot;http://semanticweb.org/id/AllegroGraph&quot; id=&quot;link-id0x237c9408&quot;&gt;AllegroGraph&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x236f96a8&quot;&gt;RDF&lt;/a&gt; store is integrated. On the technical side, AllegroGraph has Javascript as a stored procedure language, which is certainly a good idea. Naso of Ontotext talked about the BBC FIFA World Cup site. The technical proposition was that materialization is good and data partitioning is not needed; a set of replicated read-only copies is good enough.&lt;/p&gt; &lt;p&gt;I talked about making RDF cost competitive with relational for data integration and BI. The crux is space efficiency and column store techniques.&lt;/p&gt; &lt;p&gt;One question that came up was that maybe RDF could approach relational in some things, but what about string literals being stored in a separate table? Or &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x22ff2c78&quot;&gt;URI&lt;/a&gt; strings being stored in a separate table?&lt;/p&gt; &lt;p&gt;The answer is that if one accesses a lot of these literals the access will be local and fairly efficient. If one accesses just a few, it does not matter. For user-facing reports, there is no point in returning a million strings that the user will not read anyhow. But then it turned out that there in fact exist reports in bioinformatics where there are 100,000 strings. Now taking the worst abuse of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x236e43f8&quot;&gt;SPARQL&lt;/a&gt;, a regexp over all literals in a property of a given class. With a column store this is a scan of the column; with RDF, a three table join. The join is about 10x slower than the column scan. Quite OK, considering that a full text index is the likely solution for such workloads anyway. Besides, a sensible relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x22e31050&quot;&gt;schema&lt;/a&gt; will also not use strings for foreign keys, and will therefore incur a similar burden from fetching the strings before returning the result.&lt;/p&gt; &lt;p&gt;Another question was about whether the attitude was one of confrontation between RDF and relational and whether it would not be better to join forces. Well, as said in my talk, sauce for the goose is sauce for the gander and generally speaking relational techniques apply equally to RDF. There are a few RDB tricks that have no RDF equivalent, like clustering a fact table on dimension values, e.g., sales ordered by country, manufacturer, month. But by and large, column-store techniques apply. The execution engine can be essentially identical, just needing a couple of extra data types and some run-time typing and in some cases producing nulls instead of errors. Query &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x237d76e0&quot;&gt;optimization&lt;/a&gt; is much the same, except that RDB stats are not applicable as such; one needs to sample the data in the cost model. All in all, these adaptations to a RDB are not so large, even though they do require changes to source code.&lt;/p&gt; &lt;p&gt;Another question was about combining data models, e.g., relational (rows and columns), RDF (graph), &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x23845418&quot;&gt;XML&lt;/a&gt; (tree), and full text. Here I would say that it is a fault of our messaging that we do not constantly repeat the necessity of this combining, as we take it for granted. Most RDF stores have a full text index on literal values. OWLIM and a &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x22feefa0&quot;&gt;CWI&lt;/a&gt; prototype even have it for URIs. XML is a valid data type for an RDF literal, even though this does not get used very much. So doing SPARQL to select the values, and then doing &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x235b5890&quot;&gt;XPath&lt;/a&gt; and XSLT on the values, is entirely possible, at least in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x237f6428&quot;&gt;Virtuoso&lt;/a&gt; which has an XPath/XSLT engine built in. Same for invoking SPARQL from an XSLT sheet. Colocating a native &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x238265a8&quot;&gt;RDBMS&lt;/a&gt; with local and federated &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x236f7bc8&quot;&gt;SQL&lt;/a&gt; is what Virtuoso has always done. One can, for example, map tables in heterogenous remote RDBs into tables in Virtuoso, then map these into RDF, and run SPARQL queries that get translated into SQL against the original tables, thereby getting SPARQL access without any materialization. Alongside this, one can ETL relational data into RDF via the same declarative mapping.&lt;/p&gt; &lt;p&gt;Further, there are RDF extensions for geospatial queries in Virtuoso and AllegroGraph, and soon also in others.&lt;/p&gt; &lt;p&gt;With all this cross-model operation, RDF is definitely not a closed island. We&amp;#39;ll have to repeat this more.&lt;/p&gt; &lt;p&gt;Of the academic papers, the SpiderStore (&lt;a href=&quot;http://dbis-informatik.uibk.ac.at/5-1-Publications.html&quot; id=&quot;link-id0x19ecd3f0&quot;&gt;paper&lt;/a&gt; is not yet available at time of writing, but should be soon) and &lt;a href=&quot;http://www.few.vu.nl/~jui200/webpie.html&quot; id=&quot;link-id0x1d60a498&quot;&gt;Webpie&lt;/a&gt; that should be specially noted.&lt;/p&gt; &lt;p&gt;Let us talk about SpiderStore first.&lt;/p&gt; &lt;h2&gt;SpiderStore&lt;/h2&gt; &lt;p&gt;The SpiderStore from the University of Innsbruck is a main-memory-only system that has a record for each distinct IRI. The IRI record has one array of pointers to all IRI records that are objects where the referencing record is the subject, and a similar array of pointers to all records where the referencing record is the object. Both sets of pointers are clustered based on the predicate labeling the edge.&lt;/p&gt; &lt;p&gt;According to the authors (Robert Binna, Wolfgang Gassler, Eva Zangerle, Dominic Pacher, and Günther Specht), a distinct IRI is 5 pointers and each triple is 3 pointers. This would make about 4 pointers per triple, i.e., 32 bytes with 64-bit pointers.&lt;/p&gt; &lt;p&gt;This is not particularly memory efficient, since one must count unused space after growing the lists, fragmentation, etc., which will make the space consumption closer to 40 bytes per triple, plus should one add a graph to the mix one would need another pointer per distinct predicate, adding another 1-4 bytes per triple. Supporting non-IRI types in the object position is not a problem, as long as all distinct values have a chunk of memory to them with a type &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0x236fe4d0&quot;&gt;tag&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We get a few times better memory efficiency with column compressed quads, plus we are not limited to main memory.&lt;/p&gt; &lt;p&gt;But SpiderStore has a point. Making the traversal of an edge in the graph into a pointer dereference is not such a bad deal, especially if the data set is not that big. Furthermore, compiling the queries into &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x235a2228&quot;&gt;C&lt;/a&gt; procedures playing with the pointers alone would give performance to match or exceed any hard coded graph traversal library and would not be very difficult. Supporting multithreaded updates would spoil much of the gain but allowing single threaded updates and forking read-only copies for reading would be fine.&lt;/p&gt; &lt;p&gt;SpiderStore as such is not attractive for what we intend to do, this being aggregating RDF quads in volumes far exceeding main memory and scaling to clusters. We note that SpiderStore hits problems with distributed memory, since SpiderStore executes depth first, which is manifestly impossible if significant latencies are involved. In other words, if there can be latency, one must amortize by having a lot of other possible work available. Running with long vectors of values is one way, as in &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x236e14a0&quot;&gt;MonetDB&lt;/a&gt; or Virtuoso Cluster. The other way is to have a massively multithreaded platform which favors code with few instructions but little memory locality. SpiderStore could be a good fit for massive multithreading, specially if queries were compiled to C, dramatically cutting down on the count of instructions to execute.&lt;/p&gt; &lt;p&gt;We too could adopt some ideas from SpiderStore. Namely, if running vectored, one just in passing, without extra overhead, generates an array of links to the next IRI, a bit like the array that SpiderStore has for each predicate for the incoming and outgoing edges of a given IRI. Of course, here these would be persistent IDs and not pointers, but a hash from one to the other takes almost no time. So, while SpiderStore alone may not be what we are after for data warehousing, Spiderizing parts of the working set would not be so bad. This is especially so since the Spiderizable data structure almost gets made as a by-product of query evaluation.&lt;/p&gt; &lt;p&gt;If an algorithm made several passes over a relatively small subgraph of the whole database, Spiderizing it would accelerate things. The memory overhead could have a fixed cap so as not to ruin the working set if locality happened not to hold.&lt;/p&gt; &lt;p&gt;Running a SpiderStore-like execution model on vectors instead of single values would likely do no harm and might even result in better &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x237eb508&quot;&gt;cache&lt;/a&gt; behavior. The exception is in the event of completely unpredictable patterns of connections which may only be amortized by massive multithreading.&lt;/p&gt; &lt;h2&gt;Webpie&lt;/h2&gt; &lt;p&gt;Webpie from &lt;a href=&quot;http://www.vu.nl/&quot; id=&quot;link-id0x23811bf8&quot;&gt;VU Amsterdam&lt;/a&gt; and the &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x22ff8fe8&quot;&gt;LarKC&lt;/a&gt; EU FP 7 project is, as it were, the opposite of SpiderStore. This is a map-reduce-based RDFS and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x238482a0&quot;&gt;OWL&lt;/a&gt; Horst inference engine which is all about breadth-first passes over the data in a map-reduce framework with intermediate disk-based storage.&lt;/p&gt; &lt;p&gt;Webpie is not however a database. After the inference result has been materialized, it must be loaded into a SPARQL engine in order to evaluate a query against the result.&lt;/p&gt; &lt;p&gt;The execution plan of Webpie is made from the ontology whose consequences must be materialized. The steps are sorted and run until a fixed point is reached for each. This is similar to running SPARQL &lt;code&gt;INSERT … SELECT&lt;/code&gt; statements until no new inserts are produced. The only requirement is that the &lt;code&gt;INSERT&lt;/code&gt; statement should report whether new inserts were actually made. This is easy to do. In this way, a comparison between map-reduce plus memory-based joining and a parallel RDF database could be made.&lt;/p&gt; &lt;p&gt;We have suggested such an experiment to the LarKC people. We will see.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:18-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB Semdata Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-21#1632</atom:id>
  <atom:published>2010-09-21T21:14:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will begin by extending my thanks to the organizers, in specific &lt;a href=&quot;http://members.deri.at/~retok&quot; id=&quot;link-id0x23923550&quot;&gt;Reto Krummenacher&lt;/a&gt; of &lt;a href=&quot;http://www.sti-innsbruck.at/&quot; id=&quot;link-id0x22ff3fb0&quot;&gt;STI&lt;/a&gt; and Atanas Kiryakov of &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x236e43f8&quot;&gt;Ontotext&lt;/a&gt; for inviting me to give a position paper at the workshop. Indeed, it is the builders of bridges, the pontifs (pontifex) amongst us who shall be remembered by history. The idea of organizing a semantic &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23707ad0&quot;&gt;data&lt;/a&gt; management workshop at VLDB is a laudable attempt at rapprochement between two communities to the advantage of all concerned.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x237b5010&quot;&gt;Franz&lt;/a&gt;, Ontotext, and OpenLink were the vendors present at the workshop. To summarize very briefly, &lt;a href=&quot;http://data.semanticweb.org/person/jans-aasman&quot; id=&quot;link-id0x22e6d8e0&quot;&gt;Jans Aasman&lt;/a&gt; of Franz talked about the telco call center automation solution by Amdocs, where the &lt;a href=&quot;http://semanticweb.org/id/AllegroGraph&quot; id=&quot;link-id0x237e95a0&quot;&gt;AllegroGraph&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x23908828&quot;&gt;RDF&lt;/a&gt; store is integrated. On the technical side, AllegroGraph has Javascript as a stored procedure language, which is certainly a good idea. Naso of Ontotext talked about the BBC FIFA World Cup site. The technical proposition was that materialization is good and data partitioning is not needed; a set of replicated read-only copies is good enough.&lt;/p&gt; &lt;p&gt;I talked about making RDF cost competitive with relational for data integration and BI. The crux is space efficiency and column store techniques.&lt;/p&gt; &lt;p&gt;One question that came up was that maybe RDF could approach relational in some things, but what about string literals being stored in a separate table? Or &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x23845418&quot;&gt;URI&lt;/a&gt; strings being stored in a separate table?&lt;/p&gt; &lt;p&gt;The answer is that if one accesses a lot of these literals the access will be local and fairly efficient. If one accesses just a few, it does not matter. For user-facing reports, there is no point in returning a million strings that the user will not read anyhow. But then it turned out that there in fact exist reports in bioinformatics where there are 100,000 strings. Now taking the worst abuse of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x237f6320&quot;&gt;SPARQL&lt;/a&gt;, a regexp over all literals in a property of a given class. With a column store this is a scan of the column; with RDF, a three table join. The join is about 10x slower than the column scan. Quite OK, considering that a full text index is the likely solution for such workloads anyway. Besides, a sensible relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2380cba0&quot;&gt;schema&lt;/a&gt; will also not use strings for foreign keys, and will therefore incur a similar burden from fetching the strings before returning the result.&lt;/p&gt; &lt;p&gt;Another question was about whether the attitude was one of confrontation between RDF and relational and whether it would not be better to join forces. Well, as said in my talk, sauce for the goose is sauce for the gander and generally speaking relational techniques apply equally to RDF. There are a few RDB tricks that have no RDF equivalent, like clustering a fact table on dimension values, e.g., sales ordered by country, manufacturer, month. But by and large, column-store techniques apply. The execution engine can be essentially identical, just needing a couple of extra data types and some run-time typing and in some cases producing nulls instead of errors. Query &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x23918db8&quot;&gt;optimization&lt;/a&gt; is much the same, except that RDB stats are not applicable as such; one needs to sample the data in the cost model. All in all, these adaptations to a RDB are not so large, even though they do require changes to source code.&lt;/p&gt; &lt;p&gt;Another question was about combining data models, e.g., relational (rows and columns), RDF (graph), &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x23915530&quot;&gt;XML&lt;/a&gt; (tree), and full text. Here I would say that it is a fault of our messaging that we do not constantly repeat the necessity of this combining, as we take it for granted. Most RDF stores have a full text index on literal values. OWLIM and a &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x2382cc70&quot;&gt;CWI&lt;/a&gt; prototype even have it for URIs. XML is a valid data type for an RDF literal, even though this does not get used very much. So doing SPARQL to select the values, and then doing &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x235a57b0&quot;&gt;XPath&lt;/a&gt; and XSLT on the values, is entirely possible, at least in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x22ff2c78&quot;&gt;Virtuoso&lt;/a&gt; which has an XPath/XSLT engine built in. Same for invoking SPARQL from an XSLT sheet. Colocating a native &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x237cbde8&quot;&gt;RDBMS&lt;/a&gt; with local and federated &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x22e63b28&quot;&gt;SQL&lt;/a&gt; is what Virtuoso has always done. One can, for example, map tables in heterogenous remote RDBs into tables in Virtuoso, then map these into RDF, and run SPARQL queries that get translated into SQL against the original tables, thereby getting SPARQL access without any materialization. Alongside this, one can ETL relational data into RDF via the same declarative mapping.&lt;/p&gt; &lt;p&gt;Further, there are RDF extensions for geospatial queries in Virtuoso and AllegroGraph, and soon also in others.&lt;/p&gt; &lt;p&gt;With all this cross-model operation, RDF is definitely not a closed island. We&amp;#39;ll have to repeat this more.&lt;/p&gt; &lt;p&gt;Of the academic papers, the SpiderStore (&lt;a href=&quot;http://dbis-informatik.uibk.ac.at/5-1-Publications.html&quot; id=&quot;link-id0x19ecd3f0&quot;&gt;paper&lt;/a&gt; is not yet available at time of writing, but should be soon) and &lt;a href=&quot;http://www.few.vu.nl/~jui200/webpie.html&quot; id=&quot;link-id0x1d60a498&quot;&gt;Webpie&lt;/a&gt; that should be specially noted.&lt;/p&gt; &lt;p&gt;Let us talk about SpiderStore first.&lt;/p&gt; &lt;h2&gt;SpiderStore&lt;/h2&gt; &lt;p&gt;The SpiderStore from the University of Innsbruck is a main-memory-only system that has a record for each distinct IRI. The IRI record has one array of pointers to all IRI records that are objects where the referencing record is the subject, and a similar array of pointers to all records where the referencing record is the object. Both sets of pointers are clustered based on the predicate labeling the edge.&lt;/p&gt; &lt;p&gt;According to the authors (Robert Binna, Wolfgang Gassler, Eva Zangerle, Dominic Pacher, and Günther Specht), a distinct IRI is 5 pointers and each triple is 3 pointers. This would make about 4 pointers per triple, i.e., 32 bytes with 64-bit pointers.&lt;/p&gt; &lt;p&gt;This is not particularly memory efficient, since one must count unused space after growing the lists, fragmentation, etc., which will make the space consumption closer to 40 bytes per triple, plus should one add a graph to the mix one would need another pointer per distinct predicate, adding another 1-4 bytes per triple. Supporting non-IRI types in the object position is not a problem, as long as all distinct values have a chunk of memory to them with a type &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0x22f9d318&quot;&gt;tag&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We get a few times better memory efficiency with column compressed quads, plus we are not limited to main memory.&lt;/p&gt; &lt;p&gt;But SpiderStore has a point. Making the traversal of an edge in the graph into a pointer dereference is not such a bad deal, especially if the data set is not that big. Furthermore, compiling the queries into &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x2370e520&quot;&gt;C&lt;/a&gt; procedures playing with the pointers alone would give performance to match or exceed any hard coded graph traversal library and would not be very difficult. Supporting multithreaded updates would spoil much of the gain but allowing single threaded updates and forking read-only copies for reading would be fine.&lt;/p&gt; &lt;p&gt;SpiderStore as such is not attractive for what we intend to do, this being aggregating RDF quads in volumes far exceeding main memory and scaling to clusters. We note that SpiderStore hits problems with distributed memory, since SpiderStore executes depth first, which is manifestly impossible if significant latencies are involved. In other words, if there can be latency, one must amortize by having a lot of other possible work available. Running with long vectors of values is one way, as in &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x23919348&quot;&gt;MonetDB&lt;/a&gt; or Virtuoso Cluster. The other way is to have a massively multithreaded platform which favors code with few instructions but little memory locality. SpiderStore could be a good fit for massive multithreading, specially if queries were compiled to C, dramatically cutting down on the count of instructions to execute.&lt;/p&gt; &lt;p&gt;We too could adopt some ideas from SpiderStore. Namely, if running vectored, one just in passing, without extra overhead, generates an array of links to the next IRI, a bit like the array that SpiderStore has for each predicate for the incoming and outgoing edges of a given IRI. Of course, here these would be persistent IDs and not pointers, but a hash from one to the other takes almost no time. So, while SpiderStore alone may not be what we are after for data warehousing, Spiderizing parts of the working set would not be so bad. This is especially so since the Spiderizable data structure almost gets made as a by-product of query evaluation.&lt;/p&gt; &lt;p&gt;If an algorithm made several passes over a relatively small subgraph of the whole database, Spiderizing it would accelerate things. The memory overhead could have a fixed cap so as not to ruin the working set if locality happened not to hold.&lt;/p&gt; &lt;p&gt;Running a SpiderStore-like execution model on vectors instead of single values would likely do no harm and might even result in better &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x235a1f00&quot;&gt;cache&lt;/a&gt; behavior. The exception is in the event of completely unpredictable patterns of connections which may only be amortized by massive multithreading.&lt;/p&gt; &lt;h2&gt;Webpie&lt;/h2&gt; &lt;p&gt;Webpie from &lt;a href=&quot;http://www.vu.nl/&quot; id=&quot;link-id0x236fc430&quot;&gt;VU Amsterdam&lt;/a&gt; and the &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x22e53810&quot;&gt;LarKC&lt;/a&gt; EU FP 7 project is, as it were, the opposite of SpiderStore. This is a map-reduce-based RDFS and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x235f4960&quot;&gt;OWL&lt;/a&gt; Horst inference engine which is all about breadth-first passes over the data in a map-reduce framework with intermediate disk-based storage.&lt;/p&gt; &lt;p&gt;Webpie is not however a database. After the inference result has been materialized, it must be loaded into a SPARQL engine in order to evaluate a query against the result.&lt;/p&gt; &lt;p&gt;The execution plan of Webpie is made from the ontology whose consequences must be materialized. The steps are sorted and run until a fixed point is reached for each. This is similar to running SPARQL &lt;code&gt;INSERT … SELECT&lt;/code&gt; statements until no new inserts are produced. The only requirement is that the &lt;code&gt;INSERT&lt;/code&gt; statement should report whether new inserts were actually made. This is easy to do. In this way, a comparison between map-reduce plus memory-based joining and a parallel RDF database could be made.&lt;/p&gt; &lt;p&gt;We have suggested such an experiment to the LarKC people. We will see.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:09.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Suggested Extensions to the BSBM</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-21#1634</atom:id>
  <atom:published>2010-09-21T21:13:39Z</atom:published>
  <atom:content type="html">&lt;p&gt;Below is a list of possible extensions to the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x236e9d38&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;. Our previous critique of &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x237b63c0&quot;&gt;BSBM&lt;/a&gt; consists of:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;The queries touch very little &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x23845418&quot;&gt;data&lt;/a&gt;, to the point where compilation is a large fraction of execution time. This is not representative of the data integration/analytics orientation of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x237a80a0&quot;&gt;RDF&lt;/a&gt;. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Most queries are logarithmic to scale factor, but some are linear. The linear ones come to dominate the metric at larger scales.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;An update stream would make the workload more realistic.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;We could rectify this all with almost no changes to the data generator or test driver by adding one or two more metrics.&lt;/p&gt; &lt;p&gt;So I am publishing the below as a starting point for discussion.&lt;/p&gt; &lt;h2&gt;BSBM Analytics Mix&lt;/h2&gt; &lt;p&gt;Below is a set of business questions that can be answered with the BSBM data set. These are more complex and touch a greater percentage of the data than the initial mix. Their evaluation is between linear and &lt;i&gt;n * log(n)&lt;/i&gt; to the data size. The &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x2381e420&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x2380e7c8&quot;&gt;H&lt;/a&gt; rules can be used for a power (single user) and a throughput (multi-user, where each submits queries from the mix with different parameters and in different order). The TPC-H score formula and executive summary formats are directly applicable.&lt;/p&gt; &lt;p&gt;This can be a separate metric from the &amp;quot;restricted&amp;quot; BSBM score. Restricted means &amp;quot;without a full scan with regexp&amp;quot; which will dominate the whole metric at larger scales.&lt;/p&gt; &lt;p&gt;Vendor specific variations in syntax will occur, hence these are allowed but disclosure of specific query text should accompany results. Hints for &lt;code&gt;JOIN&lt;/code&gt; order and the like are not allowed; queries must be declarative. We note that both &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2380dc10&quot;&gt;SPARQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x237c98e8&quot;&gt;SQL&lt;/a&gt; implementations of the queries are possible.&lt;/p&gt; &lt;p&gt;The queries are ordered so that the first ones fill the &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x236f8170&quot;&gt;cache&lt;/a&gt;. Running the analytics mix immediately after backup post initial load is allowed, resulting in semi-warm cache. Steady-state rules will be defined later, seeing the characteristics of the actual workload.&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;For each country, list the top 10 product categories, ordered by the count of reviews from the country.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product with the most reviews during its first month on the market&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;10 products most similar to X, with similarity score based on the count of features in common&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Top 10 reviewers of category X&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product with largest increase in reviews in month X compared to month X-minus-1.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product of category X with largest change in mean price in the last month &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Most active American reviewer of Japanese cameras last year&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Correlation of price and average review&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Features with greatest impact on price — for features occurring in category X, find the top 10 features where the mean price with the feature is most above the mean price without the feature&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Country with greatest popularity of products in category X — reviews of category X from country Y divided by total reviews&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Leading product of category X by country, mentioning mean price in each country and number of offers, sort by number of offers&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Fans of manufacturer — find top reviewers who score manufacturer above their mean score&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Products sold only in country X&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2&gt;BSBM IR&lt;/h2&gt; &lt;p&gt;Since RDF stores often implement a full text index, and since a full scan with regexp matching would never be used in an online E-commerce portal, it is meaningful to extend the benchmark to have some full text queries.&lt;/p&gt; &lt;p&gt;For the SPARQL implementation, text indexing should be enabled for all string-valued literals even though only some of them will be queried in the workload.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Q6 from the original mix, now allowing use of text index.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Reviews of products of category X where the review contains the names of 1 to 3 product features that occur in said category of products; e.g., MP3 players with support for mp4 and ogg.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;ibid but now specifying review author. The intent is that structured criteria are here more selective than text.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Difference in the frequency of use of &amp;quot;awesome&amp;quot;, &amp;quot;super&amp;quot;, and &amp;quot;suck(s)&amp;quot; by American vs. European vs. Asian review authors.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Changes to Test Driver&lt;/h2&gt; &lt;p&gt;For full text queries, the search terms have to be selected according to a realistic distribution. &lt;a href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x2383bd48&quot;&gt;DERI&lt;/a&gt; has offered to provide a definition and possibly an implementation for this.&lt;/p&gt; &lt;p&gt;The parameter distribution for the analytics queries will be defined when developing the queries; the intent is that one run will touch 90% of the values in the properties mentioned in the queries.&lt;/p&gt; &lt;p&gt;The result report will have to be adapted to provide a TPC-H executive summary-style report and appropriate metrics.&lt;/p&gt; &lt;h2&gt;Changes to Data Generation&lt;/h2&gt; &lt;p&gt;For supporting the IR mix, reviews should, in addition to random text, contain the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;For each feature in the product concerned, add the label of said feature to 60% of the reviews.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Add the names of review author, product, product category, and manufacturer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The review score should be expressed in the text by adjectives (e.g., awesome, super, good, dismal, bad, sucky). Every 20th word can be an adjective from the list correlating with the score in 80% of uses of the word and random in 20%. For 90% of adjectives, pick the adjectives from lists of idiomatic expressions corresponding to the country of the reviewer. In 10% of cases, use a random list of idioms.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Skew the review scores so that comparatively expensive products have a smaller chance for a bad review.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Update Stream&lt;/h2&gt; &lt;p&gt;During the benchmark run:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;1% of products are added;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;3% of initial offers are deleted and 3% are added; and &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;5% of reviews are added.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Updates may be divided into transactions and run in series or in parallel in a manner specified by the test sponsor. The code for loading the update stream is vendor specific but must be disclosed.&lt;/p&gt; &lt;p&gt;The initial bulk load does not have to be transactional in any way.&lt;/p&gt; &lt;p&gt;Loading the update stream must be transactional, guaranteeing that all &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x236f20f0&quot;&gt;information&lt;/a&gt; pertaining to a product or an offer constitutes a transaction. Multiple offers or products may be combined in a transaction. Queries should run at least in &lt;code&gt;READ COMMITTED&lt;/code&gt; isolation, so that half-inserted products or offers are not seen.&lt;/p&gt; &lt;p&gt;Full text indices do not have to be updated transactionally; the update can lag up to 2 minutes behind the insertion of the literal being indexed.&lt;/p&gt; &lt;p&gt;The test data generator generates the update stream together with the initial data. The update stream is a set of files containing Turtle-serialized data for the updates, with all triples belonging to a transaction in consecutive order. The possible transaction boundaries are marked with a comment distinguishable from the text. The test sponsor may implement a special load program if desired. The files must be loaded in sequence but a single file may be loaded on any number of parallel threads.&lt;/p&gt; &lt;p&gt;The data generator should generate multiple files for the initial dump in order to facilitate parallel loading.&lt;/p&gt; &lt;p&gt;The same update stream can be used during all tests, starting each run from a backup containing only the initial state. In the original run, the update stream is applied starting at the measurement interval, after the SUT is in steady state.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:15-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Suggested Extensions to the BSBM</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-21#1631</atom:id>
  <atom:published>2010-09-21T21:13:39Z</atom:published>
  <atom:content type="html">&lt;p&gt;Below is a list of possible extensions to the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x236ebfd0&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;. Our previous critique of &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x237c3af0&quot;&gt;BSBM&lt;/a&gt; consists of:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;The queries touch very little &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x22e140a8&quot;&gt;data&lt;/a&gt;, to the point where compilation is a large fraction of execution time. This is not representative of the data integration/analytics orientation of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x237ccb50&quot;&gt;RDF&lt;/a&gt;. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Most queries are logarithmic to scale factor, but some are linear. The linear ones come to dominate the metric at larger scales.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;An update stream would make the workload more realistic.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;We could rectify this all with almost no changes to the data generator or test driver by adding one or two more metrics.&lt;/p&gt; &lt;p&gt;So I am publishing the below as a starting point for discussion.&lt;/p&gt; &lt;h2&gt;BSBM Analytics Mix&lt;/h2&gt; &lt;p&gt;Below is a set of business questions that can be answered with the BSBM data set. These are more complex and touch a greater percentage of the data than the initial mix. Their evaluation is between linear and &lt;i&gt;n * log(n)&lt;/i&gt; to the data size. The &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x237c81a8&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x2382baf0&quot;&gt;H&lt;/a&gt; rules can be used for a power (single user) and a throughput (multi-user, where each submits queries from the mix with different parameters and in different order). The TPC-H score formula and executive summary formats are directly applicable.&lt;/p&gt; &lt;p&gt;This can be a separate metric from the &amp;quot;restricted&amp;quot; BSBM score. Restricted means &amp;quot;without a full scan with regexp&amp;quot; which will dominate the whole metric at larger scales.&lt;/p&gt; &lt;p&gt;Vendor specific variations in syntax will occur, hence these are allowed but disclosure of specific query text should accompany results. Hints for &lt;code&gt;JOIN&lt;/code&gt; order and the like are not allowed; queries must be declarative. We note that both &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x235c9048&quot;&gt;SPARQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x239194b0&quot;&gt;SQL&lt;/a&gt; implementations of the queries are possible.&lt;/p&gt; &lt;p&gt;The queries are ordered so that the first ones fill the &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x23845240&quot;&gt;cache&lt;/a&gt;. Running the analytics mix immediately after backup post initial load is allowed, resulting in semi-warm cache. Steady-state rules will be defined later, seeing the characteristics of the actual workload.&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;For each country, list the top 10 product categories, ordered by the count of reviews from the country.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product with the most reviews during its first month on the market&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;10 products most similar to X, with similarity score based on the count of features in common&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Top 10 reviewers of category X&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product with largest increase in reviews in month X compared to month X-minus-1.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Product of category X with largest change in mean price in the last month &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Most active American reviewer of Japanese cameras last year&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Correlation of price and average review&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Features with greatest impact on price — for features occurring in category X, find the top 10 features where the mean price with the feature is most above the mean price without the feature&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Country with greatest popularity of products in category X — reviews of category X from country Y divided by total reviews&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Leading product of category X by country, mentioning mean price in each country and number of offers, sort by number of offers&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Fans of manufacturer — find top reviewers who score manufacturer above their mean score&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Products sold only in country X&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2&gt;BSBM IR&lt;/h2&gt; &lt;p&gt;Since RDF stores often implement a full text index, and since a full scan with regexp matching would never be used in an online E-commerce portal, it is meaningful to extend the benchmark to have some full text queries.&lt;/p&gt; &lt;p&gt;For the SPARQL implementation, text indexing should be enabled for all string-valued literals even though only some of them will be queried in the workload.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Q6 from the original mix, now allowing use of text index.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Reviews of products of category X where the review contains the names of 1 to 3 product features that occur in said category of products; e.g., MP3 players with support for mp4 and ogg.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;ibid but now specifying review author. The intent is that structured criteria are here more selective than text.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Difference in the frequency of use of &amp;quot;awesome&amp;quot;, &amp;quot;super&amp;quot;, and &amp;quot;suck(s)&amp;quot; by American vs. European vs. Asian review authors.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Changes to Test Driver&lt;/h2&gt; &lt;p&gt;For full text queries, the search terms have to be selected according to a realistic distribution. &lt;a href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x2391c0a0&quot;&gt;DERI&lt;/a&gt; has offered to provide a definition and possibly an implementation for this.&lt;/p&gt; &lt;p&gt;The parameter distribution for the analytics queries will be defined when developing the queries; the intent is that one run will touch 90% of the values in the properties mentioned in the queries.&lt;/p&gt; &lt;p&gt;The result report will have to be adapted to provide a TPC-H executive summary-style report and appropriate metrics.&lt;/p&gt; &lt;h2&gt;Changes to Data Generation&lt;/h2&gt; &lt;p&gt;For supporting the IR mix, reviews should, in addition to random text, contain the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;For each feature in the product concerned, add the label of said feature to 60% of the reviews.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Add the names of review author, product, product category, and manufacturer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The review score should be expressed in the text by adjectives (e.g., awesome, super, good, dismal, bad, sucky). Every 20th word can be an adjective from the list correlating with the score in 80% of uses of the word and random in 20%. For 90% of adjectives, pick the adjectives from lists of idiomatic expressions corresponding to the country of the reviewer. In 10% of cases, use a random list of idioms.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Skew the review scores so that comparatively expensive products have a smaller chance for a bad review.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Update Stream&lt;/h2&gt; &lt;p&gt;During the benchmark run:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;1% of products are added;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;3% of initial offers are deleted and 3% are added; and &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;5% of reviews are added.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Updates may be divided into transactions and run in series or in parallel in a manner specified by the test sponsor. The code for loading the update stream is vendor specific but must be disclosed.&lt;/p&gt; &lt;p&gt;The initial bulk load does not have to be transactional in any way.&lt;/p&gt; &lt;p&gt;Loading the update stream must be transactional, guaranteeing that all &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x237aa408&quot;&gt;information&lt;/a&gt; pertaining to a product or an offer constitutes a transaction. Multiple offers or products may be combined in a transaction. Queries should run at least in &lt;code&gt;READ COMMITTED&lt;/code&gt; isolation, so that half-inserted products or offers are not seen.&lt;/p&gt; &lt;p&gt;Full text indices do not have to be updated transactionally; the update can lag up to 2 minutes behind the insertion of the literal being indexed.&lt;/p&gt; &lt;p&gt;The test data generator generates the update stream together with the initial data. The update stream is a set of files containing Turtle-serialized data for the updates, with all triples belonging to a transaction in consecutive order. The possible transaction boundaries are marked with a comment distinguishable from the text. The test sponsor may implement a special load program if desired. The files must be loaded in sequence but a single file may be loaded on any number of parallel threads.&lt;/p&gt; &lt;p&gt;The data generator should generate multiple files for the initial dump in order to facilitate parallel loading.&lt;/p&gt; &lt;p&gt;The same update stream can be used during all tests, starting each run from a backup containing only the initial state. In the original run, the update stream is applied starting at the measurement interval, after the SUT is in steady state.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:06-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Kick Off</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-21#1633</atom:id>
  <atom:published>2010-09-21T21:13:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x22e06810&quot;&gt;LOD2&lt;/a&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/9-press-release-lod2-project-launch.html&quot; id=&quot;link-id0x18c0c770&quot;&gt;kick off meeting&lt;/a&gt; was held in Leipzig on Sept 6-8. I will here talk about OpenLink plans as concerns LOD2; hence this is not to be taken as representative of the whole project. I will first discuss the immediate and conclude with the long term.&lt;/p&gt; &lt;p&gt;As concerns OpenLink specifically, we have two short term activities, namely publishing the initial LOD2 repository in December and publishing a set of RDB and &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x22f9ba70&quot;&gt;RDF&lt;/a&gt; benchmarks in February.&lt;/p&gt; &lt;p&gt;The LOD2 repository is a fusion of the OpenLink &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x2378d288&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lod.openlinksw.com/&quot; id=&quot;link-id0x23908828&quot;&gt;Cloud&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x2378e6c8&quot;&gt;Cache&lt;/a&gt; (which includes &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x237d7d20&quot;&gt;data&lt;/a&gt; from &lt;a href=&quot;http://uriburner.com/&quot; id=&quot;link-id0x237c9408&quot;&gt;URIBurner&lt;/a&gt; and &lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0x235b03b0&quot;&gt;PingTheSemanticWeb&lt;/a&gt;) and &lt;a href=&quot;http://sindice.com/&quot; id=&quot;link-id0x22e24190&quot;&gt;Sindice&lt;/a&gt;, both hosted at &lt;a href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x237b80f8&quot;&gt;DERI&lt;/a&gt;. The value-add compared to Sindice or the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x237b63c0&quot;&gt;Virtuoso&lt;/a&gt;-based LOD Cloud Cache alone is the merger of the timeliness and ping-ping crawling of Sindice with the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x237f7568&quot;&gt;SPARQL&lt;/a&gt; of Virtuoso.&lt;/p&gt; &lt;p&gt;Further down the road, after we migrate the system to the Virtuoso column store, we will also see gains in performance, primarily due to much better working set, as data is many times more compact than with the present row-wise &lt;a href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x235b0c38&quot;&gt;key compression&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Still further, but before next September, we will have dynamic repartitioning; the time of availability is set as this is part of the LOD2 project roadmap. The operational need for this is pushed back somewhat by the compression gains from column-wise storage.&lt;/p&gt; &lt;p&gt;As for benchmarks, I just compiled &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/&quot; id=&quot;link-id0x1c29e720&quot;&gt;a draft of suggested extensions to the BSBM&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x22e31050&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;). I talked about this with &lt;a href=&quot;http://nl.linkedin.com/in/peterboncz&quot; id=&quot;link-id0x237c90b0&quot;&gt;Peter Boncz&lt;/a&gt; and &lt;a href=&quot;http://data.semanticweb.org/person/christian-bizer&quot; id=&quot;link-id0x23813340&quot;&gt;Chris Bizer&lt;/a&gt;, to the effect that some extensions of BSBM could be done but that the time was a bit short for making a RDF-specific benchmark. We do recall that BSBM is fully feasible with a relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x236f7ef8&quot;&gt;schema&lt;/a&gt; and that RDF offers no fundamental edge for the workload.&lt;/p&gt; &lt;p&gt;There was a graph benchmark talk at the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x236f8170&quot;&gt;TPC&lt;/a&gt; workshop at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x235c6b90&quot;&gt;VLDB 2010&lt;/a&gt;. There too, the authors were suggesting a social network use case for benchmarking anything from RDF stores to graph libraries. The presentation did not include any specification of test data, so it may be that some cooperation is possible there. The need for such a benchmark is well acknowledged. The final form of this is not yet set but LOD2 will in time publish results from such.&lt;/p&gt; &lt;p&gt;We did informally talk about a process for publishing with our colleagues from &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x23781d28&quot;&gt;Franz&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x23782740&quot;&gt;Ontotext&lt;/a&gt; at VLDB 2010. The idea is that vendors tune their own systems and do the runs and that the others check on this, preferably all using the same hardware.&lt;/p&gt; &lt;p&gt;Now, the LOD2 benchmarks will also include relational-to-RDF comparisons, for example TPC-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x235a3568&quot;&gt;H&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x22e67370&quot;&gt;SQL&lt;/a&gt; and SPARQL. The SQL will be Virtuoso, &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x22e70db0&quot;&gt;MonetDB&lt;/a&gt;, and possibly &lt;a href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x2378f750&quot;&gt;VectorWise&lt;/a&gt; and others, depending on what legal restrictions apply at the time. This will give an RDF-to-SQL comparison of TPC-H at least on Virtuoso, later also on MonetDB, depending on the schedule for a MonetDB SPARQL front-end.&lt;/p&gt; &lt;p&gt;In the immediate term, this of course focuses our efforts on productizing the Virtuoso column store extension and the optimizations that go with it.&lt;/p&gt; &lt;p&gt;LOD2 is however about much more than database benchmarks. Over the longer term, we plan to apply suitable parts of the ground-breaking database research done at &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x23911830&quot;&gt;CWI&lt;/a&gt; to RDF use cases.&lt;/p&gt; &lt;p&gt;This involves anything from adaptive indexing, to reuse and caching of intermediate results, to adaptive execution. This is however more than just mapping column store concepts to RDF. New challenges are posed by running on clusters and dealing with more expressive queries than just SQL, in specific queries with Datalog-like rules and recursion.&lt;/p&gt; &lt;p&gt;LOD2 is principally about integration and alignment, from the schema to the instance level. This involves complex batch processing, close to the data, on large volumes of data. Map-reduce is not the be-all-end-all of this. Of course, a parallel database like Virtuoso, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x22feb520&quot;&gt;Greenplum&lt;/a&gt;, or &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x237f7428&quot;&gt;Vertica&lt;/a&gt; can do map-reduce style operations under control of the SQL engine. After all, the SQL engine needs to do map-reduce and a lot more to provide good throughput for parallel, distributed SQL. Something like the &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x235c2e28&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x2380e7c8&quot;&gt;BOOM&lt;/a&gt;) distributed Datalog implementation (Overlog, Deadalus, BLOOM) could be a parallel computation framework that would subsume any map-reduce-style functionality under a more elegant declarative framework while still leaving control of execution to the developer for the cases where this is needed.&lt;/p&gt; &lt;p&gt;From our viewpoint, the project&amp;#39;s gains include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Significant narrowing of the RDB to RDF performance gap. RDF will be an option for large scale warehousing, cutting down on time to integration by providing greater schema flexibility.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Ready to use toolbox for data integration, including schema alignment and resolution of coreference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Data discovery, summarization and visualization&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Integrating this into a relatively unified stack of tools is possible, since these all cluster around the task of linking the universe with RDF and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x236e14a0&quot;&gt;linked data&lt;/a&gt;. In this respect the integration of results may be stronger than often seen in European large scale integrating projects.&lt;/p&gt; &lt;p&gt;The use cases fit the development profile well: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Wolters_Kluwer&quot; id=&quot;link-id0x23820568&quot;&gt;Wolters Kluwer&lt;/a&gt; will develop an application for integrating resources around law, from the actual laws to court cases to media coverage. The content is modeled in a fine grained legal ontology.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Exalead&quot; id=&quot;link-id0x22e50ba0&quot;&gt;Exalead&lt;/a&gt; will implement the linked data enterprise, addressing enterprise search and any typical enterprise data integration plus generating added value from open sources.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The Open &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x236fb248&quot;&gt;Knowledge&lt;/a&gt; Foundation will create a portal of all government published data for easy access by citizens.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In all these cases, the integration requirements of schema alignment, resolution of identity, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x2381ebb0&quot;&gt;information&lt;/a&gt; extraction, and efficient storage and retrieval play a significant role. The end user interfaces will be task-specific but developer interfaces around integration tools and query formulation may be quite generic and suited for generic RDF application development.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:12-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>LOD2 Kick Off</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-21#1630</atom:id>
  <atom:published>2010-09-21T21:13:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x236f6368&quot;&gt;LOD2&lt;/a&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/9-press-release-lod2-project-launch.html&quot; id=&quot;link-id0x18c0c770&quot;&gt;kick off meeting&lt;/a&gt; was held in Leipzig on Sept 6-8. I will here talk about OpenLink plans as concerns LOD2; hence this is not to be taken as representative of the whole project. I will first discuss the immediate and conclude with the long term.&lt;/p&gt; &lt;p&gt;As concerns OpenLink specifically, we have two short term activities, namely publishing the initial LOD2 repository in December and publishing a set of RDB and &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x22e46c78&quot;&gt;RDF&lt;/a&gt; benchmarks in February.&lt;/p&gt; &lt;p&gt;The LOD2 repository is a fusion of the OpenLink &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x235aaf00&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lod.openlinksw.com/&quot; id=&quot;link-id0x237a3470&quot;&gt;Cloud&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x237d6380&quot;&gt;Cache&lt;/a&gt; (which includes &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x236d3830&quot;&gt;data&lt;/a&gt; from &lt;a href=&quot;http://uriburner.com/&quot; id=&quot;link-id0x22ff6f88&quot;&gt;URIBurner&lt;/a&gt; and &lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0x235a3be8&quot;&gt;PingTheSemanticWeb&lt;/a&gt;) and &lt;a href=&quot;http://sindice.com/&quot; id=&quot;link-id0x23783d68&quot;&gt;Sindice&lt;/a&gt;, both hosted at &lt;a href=&quot;http://dbpedia.org/resource/Digital_Enterprise_Research_Institute&quot; id=&quot;link-id0x22e48ff8&quot;&gt;DERI&lt;/a&gt;. The value-add compared to Sindice or the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x23904730&quot;&gt;Virtuoso&lt;/a&gt;-based LOD Cloud Cache alone is the merger of the timeliness and ping-ping crawling of Sindice with the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x2382c800&quot;&gt;SPARQL&lt;/a&gt; of Virtuoso.&lt;/p&gt; &lt;p&gt;Further down the road, after we migrate the system to the Virtuoso column store, we will also see gains in performance, primarily due to much better working set, as data is many times more compact than with the present row-wise &lt;a href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x236e64d0&quot;&gt;key compression&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Still further, but before next September, we will have dynamic repartitioning; the time of availability is set as this is part of the LOD2 project roadmap. The operational need for this is pushed back somewhat by the compression gains from column-wise storage.&lt;/p&gt; &lt;p&gt;As for benchmarks, I just compiled &lt;a href=&quot;http://www.openlinksw.com/weblogs/oerling/&quot; id=&quot;link-id0x1c29e720&quot;&gt;a draft of suggested extensions to the BSBM&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x2391d000&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;). I talked about this with &lt;a href=&quot;http://nl.linkedin.com/in/peterboncz&quot; id=&quot;link-id0x22e4efe8&quot;&gt;Peter Boncz&lt;/a&gt; and &lt;a href=&quot;http://data.semanticweb.org/person/christian-bizer&quot; id=&quot;link-id0x23910980&quot;&gt;Chris Bizer&lt;/a&gt;, to the effect that some extensions of BSBM could be done but that the time was a bit short for making a RDF-specific benchmark. We do recall that BSBM is fully feasible with a relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x236fd5c8&quot;&gt;schema&lt;/a&gt; and that RDF offers no fundamental edge for the workload.&lt;/p&gt; &lt;p&gt;There was a graph benchmark talk at the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x236eaa88&quot;&gt;TPC&lt;/a&gt; workshop at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x2391e818&quot;&gt;VLDB 2010&lt;/a&gt;. There too, the authors were suggesting a social network use case for benchmarking anything from RDF stores to graph libraries. The presentation did not include any specification of test data, so it may be that some cooperation is possible there. The need for such a benchmark is well acknowledged. The final form of this is not yet set but LOD2 will in time publish results from such.&lt;/p&gt; &lt;p&gt;We did informally talk about a process for publishing with our colleagues from &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x235a4c40&quot;&gt;Franz&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x236ec978&quot;&gt;Ontotext&lt;/a&gt; at VLDB 2010. The idea is that vendors tune their own systems and do the runs and that the others check on this, preferably all using the same hardware.&lt;/p&gt; &lt;p&gt;Now, the LOD2 benchmarks will also include relational-to-RDF comparisons, for example TPC-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x23819e80&quot;&gt;H&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2382b890&quot;&gt;SQL&lt;/a&gt; and SPARQL. The SQL will be Virtuoso, &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x2382b8b8&quot;&gt;MonetDB&lt;/a&gt;, and possibly &lt;a href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x237c2b10&quot;&gt;VectorWise&lt;/a&gt; and others, depending on what legal restrictions apply at the time. This will give an RDF-to-SQL comparison of TPC-H at least on Virtuoso, later also on MonetDB, depending on the schedule for a MonetDB SPARQL front-end.&lt;/p&gt; &lt;p&gt;In the immediate term, this of course focuses our efforts on productizing the Virtuoso column store extension and the optimizations that go with it.&lt;/p&gt; &lt;p&gt;LOD2 is however about much more than database benchmarks. Over the longer term, we plan to apply suitable parts of the ground-breaking database research done at &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x2381d9a0&quot;&gt;CWI&lt;/a&gt; to RDF use cases.&lt;/p&gt; &lt;p&gt;This involves anything from adaptive indexing, to reuse and caching of intermediate results, to adaptive execution. This is however more than just mapping column store concepts to RDF. New challenges are posed by running on clusters and dealing with more expressive queries than just SQL, in specific queries with Datalog-like rules and recursion.&lt;/p&gt; &lt;p&gt;LOD2 is principally about integration and alignment, from the schema to the instance level. This involves complex batch processing, close to the data, on large volumes of data. Map-reduce is not the be-all-end-all of this. Of course, a parallel database like Virtuoso, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x22e1f068&quot;&gt;Greenplum&lt;/a&gt;, or &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x23905c58&quot;&gt;Vertica&lt;/a&gt; can do map-reduce style operations under control of the SQL engine. After all, the SQL engine needs to do map-reduce and a lot more to provide good throughput for parallel, distributed SQL. Something like the &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x23905c80&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x234bc1f8&quot;&gt;BOOM&lt;/a&gt;) distributed Datalog implementation (Overlog, Deadalus, BLOOM) could be a parallel computation framework that would subsume any map-reduce-style functionality under a more elegant declarative framework while still leaving control of execution to the developer for the cases where this is needed.&lt;/p&gt; &lt;p&gt;From our viewpoint, the project&amp;#39;s gains include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;Significant narrowing of the RDB to RDF performance gap. RDF will be an option for large scale warehousing, cutting down on time to integration by providing greater schema flexibility.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Ready to use toolbox for data integration, including schema alignment and resolution of coreference.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;Data discovery, summarization and visualization&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Integrating this into a relatively unified stack of tools is possible, since these all cluster around the task of linking the universe with RDF and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2390bdf8&quot;&gt;linked data&lt;/a&gt;. In this respect the integration of results may be stronger than often seen in European large scale integrating projects.&lt;/p&gt; &lt;p&gt;The use cases fit the development profile well: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Wolters_Kluwer&quot; id=&quot;link-id0x237a3420&quot;&gt;Wolters Kluwer&lt;/a&gt; will develop an application for integrating resources around law, from the actual laws to court cases to media coverage. The content is modeled in a fine grained legal ontology.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Exalead&quot; id=&quot;link-id0x235c5d70&quot;&gt;Exalead&lt;/a&gt; will implement the linked data enterprise, addressing enterprise search and any typical enterprise data integration plus generating added value from open sources.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;The Open &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x235f8138&quot;&gt;Knowledge&lt;/a&gt; Foundation will create a portal of all government published data for easy access by citizens.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In all these cases, the integration requirements of schema alignment, resolution of identity, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x22fef2e8&quot;&gt;information&lt;/a&gt; extraction, and efficient storage and retrieval play a significant role. The end user interfaces will be task-specific but developer interfaces around integration tools and query formulation may be quite generic and suited for generic RDF application development.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T16:22:02-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Perseus, Andromeda, and RDF</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-13#1629</atom:id>
  <atom:published>2010-09-13T22:10:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;It has been several months since &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1622&quot; id=&quot;link-id0x1c86c3a0&quot;&gt;my last&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x15fa418&quot;&gt;blog&lt;/a&gt; post. In this day and age of the attention economy, what gives me the insolence so to neglect my duty to mindshare?&lt;/p&gt; &lt;p&gt;Well, Perseus wasn&amp;#39;t blogging or checking his email either, when he went to fetch the Gorgon&amp;#39;s head. As Joseph Campbell puts it, the hero breaks into a world separate from the ordinary in order to bring back a blessing which will revitalize the community.&lt;/p&gt; &lt;p&gt;Thus, I deliberately withdrew from the public conversation, in faith that it would take care of itself and that I would still not be altogether forgotten. As it happens, I was confirmed in this when recently invited to submit a talk for the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x1c319338&quot;&gt;Semdata workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org&quot; id=&quot;link-id0x1b334640&quot;&gt;VLDB 2010&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Great deeds are not only personal accomplishments but also play a role in a broader context. The quest may appear remote and difficult to execute but its outcome can be quite tangible: Andromeda needed no elaborate sales pitch to convince her of the advantages of not being eaten by the sea serpent.&lt;/p&gt; &lt;p&gt;Thus right after &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1614&quot; id=&quot;link-id0x15fd6968&quot;&gt;the meeting in Sofia last March&lt;/a&gt;, I followed the vertical treasure map into the realm of first principles. As Perseus received advice from Athena, so was I informed by the Platonic ideas of locality and concurrency.&lt;/p&gt; &lt;p&gt;The great quests have an outer and inner aspect. Likewise here, bringing the ideas to physical reality gave me a great deal of material on cognitive function itself. For human and computer alike, it appears that the main reason why anything at all works is &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x140f1dc0&quot;&gt;cache&lt;/a&gt;. Locality and parallelism again. Maybe I will say something more about memory, attention, interface, and paradigm some other time. On the other hand, such material is bound to be unpopular even if valid.&lt;/p&gt; &lt;p&gt;By now, you may ask yourself what I am talking about.&lt;/p&gt; &lt;p&gt;We remember that Andromeda&amp;#39;s fix was due to her mother, Cassiopeia, having claimed greater beauty than the daughters of the sea-god Poseidon. To transpose the archetype into the present, it is like Tim B-L saying that OWLs (by the way sacred to Athena) are more semantic than Codd&amp;#39;s brainchild. Yet the relational community sees &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1d241648&quot;&gt;RDF&lt;/a&gt; as something not quite serious. A matter of scale(s) — just think of the sea serpent.&lt;/p&gt; &lt;p&gt;So, I am talking about what I alluded to in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x19182b88&quot;&gt;2010 New Year&amp;#39;s statement on this blog&lt;/a&gt;: RDF as a viable alternative to relational for big &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1b896350&quot;&gt;data&lt;/a&gt;. This means that RDF is no longer a specialty niche where, due to the hopeless task of bringing everything into a relational model, the fact of everything taking several times both the time and space is tolerated because there is no real alternative.&lt;/p&gt; &lt;p&gt;The value proposition is that for any current RDF user, the present assets will go four times farther than before with the next release of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x6a223b0&quot;&gt;Virtuoso&lt;/a&gt;. For a prospective RDF user, the cost of keeping an ETLed RDF integration warehouse is now in the same ballpark as the relational cost, except that &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x15f8ed8&quot;&gt;schema&lt;/a&gt; is now flexible, and the time to integrate and answer is accordingly shorter. For users of analytics-oriented &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x8bc44d8&quot;&gt;RDBMS&lt;/a&gt;, the next Virtuoso is a full cluster-capable &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x127faf40&quot;&gt;SQL&lt;/a&gt; column store. Its merits compared to others in this space will be published later with benchmarks like &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x6af7ae0&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1d46f230&quot;&gt;H&lt;/a&gt;. As an extra bonus for such users, Virtuoso brings SQL federation and a growth path to RDF, should this become interesting.&lt;/p&gt; &lt;p&gt;This is accomplished by introducing a new column-wise compressed-storage engine with corresponding changes to query execution. The general principles are explained in &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x1d259a88&quot;&gt;Daniel Abadi&amp;#39;s famous Ph.D. thesis&lt;/a&gt;. The compression is tuned by the data itself, without user intervention. Further, our implementation remains capable of run-time-typing, thus the column-store advantages to RDF are obtained without going to a task-specific schema. But since data types, even if determined at run-time, are still in practice repetitive, the advantages of running on homogenous vectors are not lost.&lt;/p&gt; &lt;p&gt;When storing an RDF extraction of TPC-H data, we get a storage usage of 6.3 bytes per quad. If you do not care about queries where the predicate is unspecified, the storage requirement drops to 4.7 bytes per quad. Whether storing the data as RDF quads or as Vertica-style multicolumn projections, the working set is about the same. Since having enough of the data in memory is the &lt;i&gt;sine qua non&lt;/i&gt; prerequisite of flexible querying, the point is made. QED.&lt;/p&gt; &lt;p&gt;In Virtuoso also, relational remains a bit faster but a penalty of 1.3x or so for RDF is quite tolerable, considering that &lt;i&gt;a priori&lt;/i&gt; schema is no longer needed.&lt;/p&gt; &lt;p&gt;This means that we are coming into an age where the warehouse becomes an &lt;i&gt;ad hoc&lt;/i&gt; asset, to be filled with RDF, without the need to develop an &lt;i&gt;a priori&lt;/i&gt; universal schema for all data one may ever wish to integrate, now or in the future. The data can be stored as RDF and projected from there into any form that may be needed at any time, whether the target format is more RDF or a task-specific relational schema.&lt;/p&gt; &lt;p&gt;Availability is planned for late 2010, first as a Virtuoso Open Source preview.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-13T17:35:04-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Perseus, Andromeda, and RDF</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-13#1627</atom:id>
  <atom:published>2010-09-13T22:10:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;It has been several months since &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1622&quot; id=&quot;link-id0x1c86c3a0&quot;&gt;my last&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x7816808&quot;&gt;blog&lt;/a&gt; post. In this day and age of the attention economy, what gives me the insolence so to neglect my duty to mindshare?&lt;/p&gt; &lt;p&gt;Well, Perseus wasn&amp;#39;t blogging or checking his email either, when he went to fetch the Gorgon&amp;#39;s head. As Joseph Campbell puts it, the hero breaks into a world separate from the ordinary in order to bring back a blessing which will revitalize the community.&lt;/p&gt; &lt;p&gt;Thus, I deliberately withdrew from the public conversation, in faith that it would take care of itself and that I would still not be altogether forgotten. As it happens, I was confirmed in this when recently invited to submit a talk for the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x1c319338&quot;&gt;Semdata workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org&quot; id=&quot;link-id0x1b334640&quot;&gt;VLDB 2010&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Great deeds are not only personal accomplishments but also play a role in a broader context. The quest may appear remote and difficult to execute but its outcome can be quite tangible: Andromeda needed no elaborate sales pitch to convince her of the advantages of not being eaten by the sea serpent.&lt;/p&gt; &lt;p&gt;Thus right after &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1614&quot; id=&quot;link-id0x15fd6968&quot;&gt;the meeting in Sofia last March&lt;/a&gt;, I followed the vertical treasure map into the realm of first principles. As Perseus received advice from Athena, so was I informed by the Platonic ideas of locality and concurrency.&lt;/p&gt; &lt;p&gt;The great quests have an outer and inner aspect. Likewise here, bringing the ideas to physical reality gave me a great deal of material on cognitive function itself. For human and computer alike, it appears that the main reason why anything at all works is &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x6177050&quot;&gt;cache&lt;/a&gt;. Locality and parallelism again. Maybe I will say something more about memory, attention, interface, and paradigm some other time. On the other hand, such material is bound to be unpopular even if valid.&lt;/p&gt; &lt;p&gt;By now, you may ask yourself what I am talking about.&lt;/p&gt; &lt;p&gt;We remember that Andromeda&amp;#39;s fix was due to her mother, Cassiopeia, having claimed greater beauty than the daughters of the sea-god Poseidon. To transpose the archetype into the present, it is like Tim B-L saying that OWLs (by the way sacred to Athena) are more semantic than Codd&amp;#39;s brainchild. Yet the relational community sees &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x15ffc78&quot;&gt;RDF&lt;/a&gt; as something not quite serious. A matter of scale(s) — just think of the sea serpent.&lt;/p&gt; &lt;p&gt;So, I am talking about what I alluded to in the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x19182b88&quot;&gt;2010 New Year&amp;#39;s statement on this blog&lt;/a&gt;: RDF as a viable alternative to relational for big &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x141372d0&quot;&gt;data&lt;/a&gt;. This means that RDF is no longer a specialty niche where, due to the hopeless task of bringing everything into a relational model, the fact of everything taking several times both the time and space is tolerated because there is no real alternative.&lt;/p&gt; &lt;p&gt;The value proposition is that for any current RDF user, the present assets will go four times farther than before with the next release of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2b7a148&quot;&gt;Virtuoso&lt;/a&gt;. For a prospective RDF user, the cost of keeping an ETLed RDF integration warehouse is now in the same ballpark as the relational cost, except that &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x23357490&quot;&gt;schema&lt;/a&gt; is now flexible, and the time to integrate and answer is accordingly shorter. For users of analytics-oriented &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x12f83a0&quot;&gt;RDBMS&lt;/a&gt;, the next Virtuoso is a full cluster-capable &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x6aede08&quot;&gt;SQL&lt;/a&gt; column store. Its merits compared to others in this space will be published later with benchmarks like &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1d1e860&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x12774b8&quot;&gt;H&lt;/a&gt;. As an extra bonus for such users, Virtuoso brings SQL federation and a growth path to RDF, should this become interesting.&lt;/p&gt; &lt;p&gt;This is accomplished by introducing a new column-wise compressed-storage engine with corresponding changes to query execution. The general principles are explained in &lt;a href=&quot;http://cs-www.cs.yale.edu/homes/dna/papers/abadiphd.pdf&quot; id=&quot;link-id0x1d259a88&quot;&gt;Daniel Abadi&amp;#39;s famous Ph.D. thesis&lt;/a&gt;. The compression is tuned by the data itself, without user intervention. Further, our implementation remains capable of run-time-typing, thus the column-store advantages to RDF are obtained without going to a task-specific schema. But since data types, even if determined at run-time, are still in practice repetitive, the advantages of running on homogenous vectors are not lost.&lt;/p&gt; &lt;p&gt;When storing an RDF extraction of TPC-H data, we get a storage usage of 6.3 bytes per quad. If you do not care about queries where the predicate is unspecified, the storage requirement drops to 4.7 bytes per quad. Whether storing the data as RDF quads or as Vertica-style multicolumn projections, the working set is about the same. Since having enough of the data in memory is the &lt;i&gt;sine qua non&lt;/i&gt; prerequisite of flexible querying, the point is made. QED.&lt;/p&gt; &lt;p&gt;In Virtuoso also, relational remains a bit faster but a penalty of 1.3x or so for RDF is quite tolerable, considering that &lt;i&gt;a priori&lt;/i&gt; schema is no longer needed.&lt;/p&gt; &lt;p&gt;This means that we are coming into an age where the warehouse becomes an &lt;i&gt;ad hoc&lt;/i&gt; asset, to be filled with RDF, without the need to develop an &lt;i&gt;a priori&lt;/i&gt; universal schema for all data one may ever wish to integrate, now or in the future. The data can be stored as RDF and projected from there into any form that may be needed at any time, whether the target format is more RDF or a task-specific relational schema.&lt;/p&gt; &lt;p&gt;Availability is planned for late 2010, first as a Virtuoso Open Source preview.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-13T17:34:58.000014-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB Semdata Workshop - The New Frontier of Semdata</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-09-13#1628</atom:id>
  <atom:published>2010-09-13T22:09:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is a revised version of the talk I will be giving at the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x1d137fe0&quot;&gt;Semdata workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x2533b280&quot;&gt;VLDB 2010&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x1cff6678&quot;&gt;The paper&lt;/a&gt; shows how we store &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x244a65c0&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x25136af8&quot;&gt;H&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x259a6460&quot;&gt;data&lt;/a&gt; as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x268767b0&quot;&gt;RDF&lt;/a&gt; with relational-level efficiency and how we query both RDF and relational versions in comparable time. We also compare row-wise and column-wise storage formats as implemented in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2596dbc8&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A question that has come up a few times during the Semdata initiative is how semantic data will avoid the fate of other would-be database revolutions like OODBMS and deductive databases.&lt;/p&gt; &lt;p&gt;The need and opportunity are driven by the explosion of data in quantity and diversity of structure. The competition consists of analytics &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x2681bb10&quot;&gt;RDBMS&lt;/a&gt;, point solutions done with map-reduce or the like, and lastly in some cases from key-value stores with relaxed &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x2493ca50&quot;&gt;schema&lt;/a&gt; but limited querying.&lt;/p&gt; &lt;p&gt;The benefits of RDF are the ever expanding volume of data published in it, reuse of vocabulary, and well-defined semantics. The downside is efficiency. This is not so much a matter of absolute scalability — you can run an RDF database on a cluster — but a question of relative cost as opposed to alternatives.&lt;/p&gt; &lt;p&gt;The baseline is that for relational-style queries, one should get relational performance or close enough. We outline in the paper how RDF reduces to a run-time-typed relational column-store, and gets all the compression and locality advantages traditionally associated with such. After memory is no longer the differentiator, the rest is engineering. So much for the scalability barrier to adoption.&lt;/p&gt; &lt;p&gt;I do not need to talk here about the benefits of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x245f72e8&quot;&gt;linked data&lt;/a&gt; and more or less &lt;i&gt;ad hoc&lt;/i&gt; integration &lt;i&gt;per se&lt;/i&gt;. But again, to make these practical, there are logistics to resolve: How to keep data up to date? How to distribute it incrementally? How to monetize freshness? We propose some solutions for these, looking at diverse-RDF replication and RDB-to-RDF replication in Virtuoso.&lt;/p&gt; &lt;p&gt;But to realize the ultimate promise of RDF/Linked Data/Semdata, however we call it, we must look farther into the landscape of what is being done with big data. Here we are no longer so much running against the RDBMS, but against map-reduce and key-value stores.&lt;/p&gt; &lt;p&gt;Given the psychology of geekdom, the charm of map-reduce is understandable: One controls what is going on, can work in the usual languages, can run on big iron without being picked to pieces by the endless concurrency and timing and order-of-events issues one gets when programming a cluster. Tough for the best, and unworkable for the rest.&lt;/p&gt; &lt;p&gt;The key-value store has some of the same appeal, as it is the DBMS laid bare, so to say, made understandable, without the again intractably-complex questions of fancy query planning and distributed &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x25c9a008&quot;&gt;ACID&lt;/a&gt; transactions. The psychological rewards of the sense of control are there, never mind the complex query; one can always hard code a point solution for the business question, if really must — maybe even in map-reduce.&lt;/p&gt; &lt;p&gt;Besides, for some things that go beyond &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x25149078&quot;&gt;SQL&lt;/a&gt; (for example, with graph structures), there really isn&amp;#39;t a good solution.&lt;/p&gt; &lt;p&gt;Now, enter &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x268ecb90&quot;&gt;Vertica&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x25954eb8&quot;&gt;Greenplum&lt;/a&gt;, &lt;a href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x28cac500&quot;&gt;VectorWise&lt;/a&gt; (a &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x28c239f8&quot;&gt;MonetDB&lt;/a&gt; project derivative from &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id0x24a2f498&quot;&gt;Ingres&lt;/a&gt;) and Virtuoso, maybe others, who all propose some combination of SQL- and explicit map-reduce-style control structures. This is nice but better is possible.&lt;/p&gt; &lt;p&gt;Here we find the next frontier of Semdata. Take &lt;a href=&quot;http://dbpedia.org/resource/Joseph_M._Hellerstein&quot; id=&quot;link-id0x257db7c0&quot;&gt;Joe Hellerstein&lt;/a&gt; et al&amp;#39;s work on &lt;a href=&quot;http://www.eecs.berkeley.edu/Pubs/TechRpts/2010/EECS-2010-90.html&quot; id=&quot;link-id0x1c64ba98&quot;&gt;declarative logic for the data centric data center&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We have heard it many times — when the data is big, the logic must go to it. We can take declarative, location-conscious rules, &lt;i&gt;à la&lt;/i&gt; &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x29affc18&quot;&gt;BOOM&lt;/a&gt; and BLOOM, and combine these with the declarative query, well-defined semantics, parallel-database capability of the leading RDF stores. Merge this with locality compression and throughput from the best analytics DBMS.&lt;/p&gt; &lt;p&gt;Here we have a data infrastructure that subsumes map-reduce as a special case of arbitrary distributed-parallel control flow, can send the processing to the data, and has flexible queries and schema-last capability.&lt;/p&gt; &lt;p&gt;Further, since RDF more or less reduces to relational columns, the techniques of caching and reuse and materialized joins and demand-driven indexing, &lt;i&gt;à la&lt;/i&gt; MonetDB, are applicable with minimal if any adaptation.&lt;/p&gt; &lt;p&gt;Such a hybrid database-fusion frontier is relevant because it addresses heterogenous, large-scale data, with operations that are not easy to reduce to SQL, still without loss of the advantages of SQL. Apply this to anything from enhancing the business intelligence process by faster integration, including integration with &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x268168c8&quot;&gt;linked open data&lt;/a&gt; to the map-reduce bulk processing of today. Do it with strong semantics and inference close to the data.&lt;/p&gt; &lt;p&gt;In short, RDF stays relevant by tackling real issues, with scale second to none, and decisive advantages in time-to-integrate and expressive power.&lt;/p&gt; &lt;p&gt;Last week I was at the &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x29e23be8&quot;&gt;LOD2&lt;/a&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/9-press-release-lod2-project-launch.html&quot; id=&quot;link-id0x1aec1c10&quot;&gt;kick off&lt;/a&gt; and a &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x245f1168&quot;&gt;LarKC&lt;/a&gt; meeting. The capabilities envisioned in this and the following post mirror our commitments to the EU co-funded LOD2 project. This week is VLDB and the Semdata workshop. I will talk more about how these trends are taking shape within the Virtuoso product development roadmap in future posts.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T10:52:19.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB Semdata Workshop - The New Frontier of Semdata</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-09-13#1626</atom:id>
  <atom:published>2010-09-13T22:09:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is a revised version of the talk I will be giving at the &lt;a href=&quot;http://semdata.org/events/2010/vldb&quot; id=&quot;link-id0x1d137fe0&quot;&gt;Semdata workshop&lt;/a&gt; at &lt;a href=&quot;http://www.vldb2010.org/&quot; id=&quot;link-id0x24e5c4d0&quot;&gt;VLDB 2010&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtDirectionsChallengesSemdata&quot; id=&quot;link-id0x1cff6678&quot;&gt;The paper&lt;/a&gt; shows how we store &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x25037270&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x28c239f8&quot;&gt;H&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x242a5378&quot;&gt;data&lt;/a&gt; as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x25900d40&quot;&gt;RDF&lt;/a&gt; with relational-level efficiency and how we query both RDF and relational versions in comparable time. We also compare row-wise and column-wise storage formats as implemented in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x25904ab8&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A question that has come up a few times during the Semdata initiative is how semantic data will avoid the fate of other would-be database revolutions like OODBMS and deductive databases.&lt;/p&gt; &lt;p&gt;The need and opportunity are driven by the explosion of data in quantity and diversity of structure. The competition consists of analytics &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x24c7c6b8&quot;&gt;RDBMS&lt;/a&gt;, point solutions done with map-reduce or the like, and lastly in some cases from key-value stores with relaxed &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x23ce37d8&quot;&gt;schema&lt;/a&gt; but limited querying.&lt;/p&gt; &lt;p&gt;The benefits of RDF are the ever expanding volume of data published in it, reuse of vocabulary, and well-defined semantics. The downside is efficiency. This is not so much a matter of absolute scalability — you can run an RDF database on a cluster — but a question of relative cost as opposed to alternatives.&lt;/p&gt; &lt;p&gt;The baseline is that for relational-style queries, one should get relational performance or close enough. We outline in the paper how RDF reduces to a run-time-typed relational column-store, and gets all the compression and locality advantages traditionally associated with such. After memory is no longer the differentiator, the rest is engineering. So much for the scalability barrier to adoption.&lt;/p&gt; &lt;p&gt;I do not need to talk here about the benefits of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x25345270&quot;&gt;linked data&lt;/a&gt; and more or less &lt;i&gt;ad hoc&lt;/i&gt; integration &lt;i&gt;per se&lt;/i&gt;. But again, to make these practical, there are logistics to resolve: How to keep data up to date? How to distribute it incrementally? How to monetize freshness? We propose some solutions for these, looking at diverse-RDF replication and RDB-to-RDF replication in Virtuoso.&lt;/p&gt; &lt;p&gt;But to realize the ultimate promise of RDF/Linked Data/Semdata, however we call it, we must look farther into the landscape of what is being done with big data. Here we are no longer so much running against the RDBMS, but against map-reduce and key-value stores.&lt;/p&gt; &lt;p&gt;Given the psychology of geekdom, the charm of map-reduce is understandable: One controls what is going on, can work in the usual languages, can run on big iron without being picked to pieces by the endless concurrency and timing and order-of-events issues one gets when programming a cluster. Tough for the best, and unworkable for the rest.&lt;/p&gt; &lt;p&gt;The key-value store has some of the same appeal, as it is the DBMS laid bare, so to say, made understandable, without the again intractably-complex questions of fancy query planning and distributed &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x25365e30&quot;&gt;ACID&lt;/a&gt; transactions. The psychological rewards of the sense of control are there, never mind the complex query; one can always hard code a point solution for the business question, if really must — maybe even in map-reduce.&lt;/p&gt; &lt;p&gt;Besides, for some things that go beyond &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2533b280&quot;&gt;SQL&lt;/a&gt; (for example, with graph structures), there really isn&amp;#39;t a good solution.&lt;/p&gt; &lt;p&gt;Now, enter &lt;a href=&quot;http://www.vertica.com/&quot; id=&quot;link-id0x253fe1d8&quot;&gt;Vertica&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x257102a0&quot;&gt;Greenplum&lt;/a&gt;, &lt;a href=&quot;http://www.ingres.com/vectorwise/&quot; id=&quot;link-id0x248ce120&quot;&gt;VectorWise&lt;/a&gt; (a &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x2596a8a8&quot;&gt;MonetDB&lt;/a&gt; project derivative from &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id0x2502a170&quot;&gt;Ingres&lt;/a&gt;) and Virtuoso, maybe others, who all propose some combination of SQL- and explicit map-reduce-style control structures. This is nice but better is possible.&lt;/p&gt; &lt;p&gt;Here we find the next frontier of Semdata. Take &lt;a href=&quot;http://dbpedia.org/resource/Joseph_M._Hellerstein&quot; id=&quot;link-id0x24d3dca8&quot;&gt;Joe Hellerstein&lt;/a&gt; et al&amp;#39;s work on &lt;a href=&quot;http://www.eecs.berkeley.edu/Pubs/TechRpts/2010/EECS-2010-90.html&quot; id=&quot;link-id0x1c64ba98&quot;&gt;declarative logic for the data centric data center&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We have heard it many times — when the data is big, the logic must go to it. We can take declarative, location-conscious rules, &lt;i&gt;à la&lt;/i&gt; &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x257d2988&quot;&gt;BOOM&lt;/a&gt; and BLOOM, and combine these with the declarative query, well-defined semantics, parallel-database capability of the leading RDF stores. Merge this with locality compression and throughput from the best analytics DBMS.&lt;/p&gt; &lt;p&gt;Here we have a data infrastructure that subsumes map-reduce as a special case of arbitrary distributed-parallel control flow, can send the processing to the data, and has flexible queries and schema-last capability.&lt;/p&gt; &lt;p&gt;Further, since RDF more or less reduces to relational columns, the techniques of caching and reuse and materialized joins and demand-driven indexing, &lt;i&gt;à la&lt;/i&gt; MonetDB, are applicable with minimal if any adaptation.&lt;/p&gt; &lt;p&gt;Such a hybrid database-fusion frontier is relevant because it addresses heterogenous, large-scale data, with operations that are not easy to reduce to SQL, still without loss of the advantages of SQL. Apply this to anything from enhancing the business intelligence process by faster integration, including integration with &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x25455a40&quot;&gt;linked open data&lt;/a&gt; to the map-reduce bulk processing of today. Do it with strong semantics and inference close to the data.&lt;/p&gt; &lt;p&gt;In short, RDF stays relevant by tackling real issues, with scale second to none, and decisive advantages in time-to-integrate and expressive power.&lt;/p&gt; &lt;p&gt;Last week I was at the &lt;a href=&quot;http://lod2.eu/&quot; id=&quot;link-id0x2438c3e0&quot;&gt;LOD2&lt;/a&gt; &lt;a href=&quot;http://lod2.eu/BlogPost/9-press-release-lod2-project-launch.html&quot; id=&quot;link-id0x1aec1c10&quot;&gt;kick off&lt;/a&gt; and a &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x2836b780&quot;&gt;LarKC&lt;/a&gt; meeting. The capabilities envisioned in this and the following post mirror our commitments to the EU co-funded LOD2 project. This week is VLDB and the Semdata workshop. I will talk more about how these trends are taking shape within the Virtuoso product development roadmap in future posts.&lt;/p&gt;</atom:content>
  <atom:updated>2010-09-21T10:52:12.000038-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Solving Real Problems by Leveraging Linked Data: Unambiguous &amp; Verifiable Identity for HTTP Networks</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-07-11#1625</atom:id>
  <atom:published>2010-07-12T03:25:03Z</atom:published>
  <atom:content type="html">&lt;h3&gt;Problem: Unambiguous Verifiable Network Identity.&lt;/h3&gt; &lt;p&gt;How Does &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1b1ad1d0&quot;&gt;Linked Data&lt;/a&gt; Address This Problem? It provides critical infrastructure for the WebID Protocol that enables an innovative tweak of SSL/TLS. &lt;/p&gt; &lt;p&gt;What about OpenID? The WebID Protocol embraces and extends OpenID (&lt;strong&gt;&lt;em&gt;in an open and positive way&lt;/em&gt;&lt;/strong&gt;) via the WebID + OpenID Hybrid variant of the protocol -- basic effect is that OpenID calls are re-routed to the WebID aspect which simply removes Username and Password Authentication from the authentication challenge interaction pattern.&lt;/p&gt; &lt;h3&gt;WebID Components&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; X.509 Certificate and Private Key Generator &lt;/li&gt; &lt;li&gt; Structured Profile Document (e.g. a &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id0x1a301338&quot;&gt;FOAF&lt;/a&gt; based Profile) published to an HTTP Network (e.g. &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1ba50e10&quot;&gt;World Wide Web&lt;/a&gt;) and accessible at an Address (&lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x12ded2e0&quot;&gt;URL&lt;/a&gt;) &lt;/li&gt; &lt;li&gt; An Agent Identifier aka. WebID (an HTTP Name Reference re. &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1b197378&quot;&gt;URI&lt;/a&gt; variant) that&amp;#39;s the Subject of a Structured Profile Document (actually a Descriptor Resource)&lt;/li&gt; &lt;li&gt; Mechanism for persisting Public Key data from X.509 Certificate to Structured Profile Document and associating it with Subject WebID (e.g. SPARUL or other HTTP based methods) &lt;/li&gt; &lt;li&gt; Mechanism for de-referencing Public Key data associated with a WebID (from its Structured Profile Document) for comparison against Public Key data following successful standard SSL/TLS protocol handshake (e.g. via &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x16d26ec8&quot;&gt;SPARQL&lt;/a&gt; Query). &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Demo&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=mjgXsjd8PDE&quot; id=&quot;link-id0x1b9cc4d8&quot;&gt;WebID + OpenID Hybrid Protocol Demo using ODS, Stackoverflow.com, and identi.ca.&lt;/a&gt; - YouTube Screencast Demo Part 1 using Firefox&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=eXoxUo7Py4M &quot; id=&quot;link-id0x1a2db140&quot;&gt;WebID + OpenID Hybrid Protocol Demo using ODS, Stackoverflow.com, and identi.ca.&lt;/a&gt; - YouTube Screencast Demo Part 2 using Safari &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=webid&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id0x1bc37a58&quot;&gt;Prior Posts about WebIDs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://payswarm.com/webid/drafts/ED-webid-20100711/&quot; id=&quot;link-id0x1a0eecb8&quot;&gt;Draft WebID Spec&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-07-12T07:22:02.000018-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Data 3.0 (a Manifesto for Platform Agnostic Structured Data) Update 5</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-04-16#1624</atom:id>
  <atom:published>2010-04-16T21:09:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;After a long period of trying to demystify and unravel the wonders of standards compliant structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access, combined with protocols (e.g., HTTP) that separate: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Identity,&lt;/li&gt; &lt;li&gt;Access,&lt;/li&gt; &lt;li&gt;Storage,&lt;/li&gt; &lt;li&gt;Representation, and&lt;/li&gt; &lt;li&gt;Presentation.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;I ended up with what I can best describe as the Data 3.0 Manifesto. A manifesto for standards complaint access to structured data object (or &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1a0bc238&quot;&gt;entity&lt;/a&gt;) descriptors.&lt;/p&gt; &lt;h3&gt;Some Related Work&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://blogs.msdn.com/alexj/&quot; id=&quot;link-id0x1a3c5b70&quot;&gt;Alex James&lt;/a&gt; (Program Manager &lt;a href=&quot;http://blogs.msdn.com/efdesign/&quot; id=&quot;link-id0x1a3c5bd8&quot;&gt;Entity Frameworks&lt;/a&gt; at Microsoft), put together something quite similar to this via his Base4 &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x13c374c8&quot;&gt;blog&lt;/a&gt; (around the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 2.0 bootstrap time), sadly -- quoting Alex -- that post has gone where discontinued blogs and their host platforms go (deep deep irony here). &lt;/p&gt; &lt;p&gt;It&amp;#39;s also important to note that this manifesto is also a variant of the &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id0x1a29f338&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x1a4e8580&quot;&gt;Linked Data Design Issues&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id0x199efc30&quot;&gt;meme&lt;/a&gt; re. Linked Data, but totally decoupled from RDF (data representation formats aspect) and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x199efc58&quot;&gt;SPARQL&lt;/a&gt; which -- in my world view -- remain implementation details.&lt;/p&gt; &lt;h3&gt;Data 3.0 manifesto&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;An &amp;quot;Entity&amp;quot; is the &amp;quot;Referent&amp;quot; of an &amp;quot;Identifier.&amp;quot;&lt;/li&gt; &lt;li&gt;An &amp;quot;Identifier&amp;quot; SHOULD provide a global, unambiguous, and unchanging (though it MAY be opaque!) &amp;quot;Name&amp;quot; for its &amp;quot;Referent&amp;quot;.&lt;/li&gt; &lt;li&gt;A &amp;quot;Referent&amp;quot; MAY have many &amp;quot;Identifiers&amp;quot; (Names), but each &amp;quot;Identifier&amp;quot; MUST have only one &amp;quot;Referent&amp;quot;.&lt;/li&gt; &lt;li&gt;Structured Entity Descriptions SHOULD be based on the &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x1a2a15c0&quot;&gt;Entity-Attribute-Value (EAV) Data Model&lt;/a&gt;, and SHOULD therefore take the form of one or more 3-tuples (triples), each comprised of: &lt;ul&gt; &lt;li&gt;an &amp;quot;Identifier&amp;quot; that names an &amp;quot;Entity&amp;quot; (i.e., Entity Name),&lt;/li&gt; &lt;li&gt;an &amp;quot;Identifier&amp;quot; that names an &amp;quot;Attribute&amp;quot; (i.e., Attribute Name), and&lt;/li&gt; &lt;li&gt;an &amp;quot;Attribute Value&amp;quot;, which may be an &amp;quot;Identifier&amp;quot; or a &amp;quot;Literal&amp;quot;.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Structured Descriptions SHOULD be CARRIED by &amp;quot;Descriptor Documents&amp;quot; (i.e., purpose specific documents where Entity Identifiers, Attribute Identifiers, and Attribute Values are clearly discernible by the document&amp;#39;s intended consumers, e.g., humans or machines).&lt;/li&gt; &lt;li&gt;Structured Descriptor Documents can contain (carry) several Structured Entity Descriptions&lt;/li&gt; &lt;li&gt;Stuctured Descriptor Documents SHOULD be network accessible via network addresses (e.g., HTTP URLs when dealing with HTTP-based Networks).&lt;/li&gt; &lt;li&gt;An Identifier SHOULD resolve (de-reference) to a Structured Representation of the Referent&amp;#39;s Structured Description.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://twitpic.com/1g02q8/full&quot; id=&quot;link-id0x1a3d1428&quot;&gt;Referent, Identifier, and Descriptor/Sense (The Data Perception Trinity)&lt;/a&gt; illustration&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://twitpic.com/1g03vo/full&quot; id=&quot;link-id0x1a353a20&quot;&gt;Referent, Identifier, and Descriptor/Sense Trinity&lt;/a&gt; (as exploited in &lt;a href=&quot;http://esw.w3.org/Foaf%2Bssl&quot; id=&quot;link-id0x135ed828&quot;&gt;FOAF+SSL&lt;/a&gt; based Secure WebIDs) illustration&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/kidehen/understanding-linked-data-via-eav-model-based-structured-descriptions&quot; id=&quot;link-id0x1961ae30&quot;&gt;Demystifying Linked Data via EAV Model based Structured Descriptions&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1388&quot; id=&quot;link-id0x1a28db38&quot;&gt;What do people have against URIs and URLs?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id0x1a4cedc8&quot;&gt;The URI, URL, and Linked Data Meme&amp;#39;s Generic HTTP URI&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id0x19ac04c8&quot;&gt;Simple Explanation of RDF and Linked Data Dynamics&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1547&quot; id=&quot;link-id0x13c24748&quot;&gt;Linked Data and Identity&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://esw.w3.org/Foaf%2Bssl/FAQ&quot; id=&quot;link-id0x199ef720&quot;&gt;FOAF+SSL FAQ&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/2010Apr/0278.html&quot; id=&quot;link-id0x1a361640&quot;&gt;LOD Community Thread&lt;/a&gt; (showing evolution of this manifesto based on feedback from members such as &lt;a href=&quot;http://richard.cyganiak.de/foaf.rdf#cygri&quot; id=&quot;link-id0x1a361668&quot;&gt;Richard Cyganiak&lt;/a&gt;).&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://code.google.com/apis/base/starting-out.html#terms&quot; id=&quot;link-id0x18e0b578&quot;&gt;Googlebase Data API Docs&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://code.google.com/apis/gdata/docs/2.0/basics.html&quot; id=&quot;link-id0x199c77b0&quot;&gt;Google Data Protocol&lt;/a&gt; (GData)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://odata.org&quot; id=&quot;link-id0x19d1e578&quot;&gt;Microsoft&amp;#39;s OData Protocol&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=6pmWojisM_E&quot; id=&quot;link-id0x1a40a998&quot;&gt;Magic of De-referencable Names and actual Data via Binky Video&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/jyri/building-sites-around-social-objects-web-20-expo-sf-2009&quot; id=&quot;link-id0x19ad7e70&quot;&gt;Social Objects Presentation&lt;/a&gt; (aka. Social Linked Data Objects) - by &lt;a href=&quot;http://www.slideshare.net/jyri&quot; id=&quot;link-id0x19e71700&quot;&gt;Jyri Engeström&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Reference_%28computer_science%29&quot; id=&quot;link-id0x199c6178&quot;&gt;What&amp;#39;s a Reference?&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-05-25T17:10:28.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transactional High Availability in Virtuoso Cluster Edition</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-04-14#1623</atom:id>
  <atom:published>2010-04-14T22:21:52Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Introduction&lt;/h2&gt; &lt;p&gt;This post discusses the technical specifics of how we accomplish smooth transactional operation in a database server cluster under different failure conditions. (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1621&quot; id=&quot;link-id0x198e8e68&quot;&gt;A higher-level short version&lt;/a&gt; was posted last week.) The reader is expected to be familiar with the basics of &lt;a href=&quot;http://dbpedia.org/resource/Distributed_transaction&quot; id=&quot;link-id0x25088028&quot;&gt;distributed transactions&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Someone on a cloud computing discussion list called &lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x21addd50&quot;&gt;two-phase commit&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x1eb6bc90&quot;&gt;2PC&lt;/a&gt;) the &amp;quot;anti-availability protocol.&amp;quot; There is indeed a certain anti-&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x28e1dbd0&quot;&gt;SQL&lt;/a&gt; and anti-2PC sentiment out there, with key-value stores and &amp;quot;eventual consistency&amp;quot; being talked about a lot. Indeed, if we are talking about wide-area replication over high-latency connections, then 2PC with synchronously-sharp transaction boundaries over all copies is not really workable.&lt;/p&gt; &lt;p&gt;For multi-site operations, a level of &lt;i&gt;eventual&lt;/i&gt; consistency is indeed quite unavoidable. Exactly what the requirements are depends on the application, so I will focus here on operations inside one site.&lt;/p&gt; &lt;p&gt;The key-value store culture seems to focus on workloads where a record is relatively self-contained. The record can be quite long, with repeating fields, different selections of fields in consecutive records, and so forth. Such a record would typically be split over many tables of a relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x216479f8&quot;&gt;schema&lt;/a&gt;. In the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x672d740&quot;&gt;RDF&lt;/a&gt; world, such a record would be split even wider, with the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x72c8ec0&quot;&gt;information&lt;/a&gt; needed to reconstitute the full record almost invariably split over many servers. This comes from the mapping between the text of URIs and their internal IDs being partitioned in one way, and the many indices on the RDF quads each in yet another way.&lt;/p&gt; &lt;p&gt;So it comes to pass that in the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x216c6280&quot;&gt;data&lt;/a&gt; models we are most interested in, the application-level &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x224444c0&quot;&gt;entity&lt;/a&gt; (&lt;i&gt;e.g.,&lt;/i&gt; a user account in a social network) is not a contiguous unit with a single global identifier. The social network user account, that the key-value store would consider a unit of replication mastering and eventual consistency, will be in RDF or SQL a set of maybe hundreds of tuples, each with more than one index, nearly invariably spanning multiple nodes of the database cluster.&lt;/p&gt; &lt;p&gt;So, before we can talk about wide-area replication and eventual consistency with application-level semantics, we need a database that can run on a fair-sized cluster and have cast-iron consistency within its bounds. If such a cluster is to be large and is to operate continuously, it must have some form of redundancy to cover for hardware failures, software upgrades, reboots, etc., without interruption of service.&lt;/p&gt; &lt;p&gt;This is the point of the design space we are tackling here.&lt;/p&gt; &lt;h2&gt;Non Fault-Tolerant Operation&lt;/h2&gt; &lt;p&gt;There are two basic modes of operation we cover: bulk load, and online transactions.&lt;/p&gt; &lt;p&gt;In the case of bulk load, we start with a consistent image of the database; load data; and finish by making another consistent image. If there is a failure during load, we lose the whole load, and restart from the initial consistent image. This is quite simple and is not properly transactional. It is quicker for filling a warehouse but is not to be used for anything else. In the remainder, we will only talk about online transactions.&lt;/p&gt; &lt;p&gt;When all cluster nodes are online, operation is relatively simple. Each entry of each index belongs to a partition that is determined by the values of one or more partitioning columns of said index. There are no tables separate from indices; the relational row is on the index leaf of its primary key. Secondary indices reference the row by including the primary key. Blobs are in the same partition as the row which contains the blob. Each partition is then stored on a &amp;quot;cluster node.&amp;quot; In non fault-tolerant operations, each such cluster node is a single process with exclusive access to its own permanent storage, consisting of database files and logs; &lt;i&gt;i.e.,&lt;/i&gt; each node is a single server instance. It does not matter if the storage is local or on a SAN, the cluster node is still the only one accessing it.&lt;/p&gt; &lt;p&gt;When things are not fault tolerant, transactions work as follows:&lt;/p&gt; &lt;p&gt;When there are updates, two-phase commit is used to guarantee a consistent result. Each transaction is coordinated by one cluster node, which issues the updates in parallel to all cluster nodes concerned. Sending two update messages instead of one does not significantly impact latency. The coordinator of each transaction is the primary authority for the transaction&amp;#39;s outcome. If the coordinator of the transaction dies between the phases of the commit, the transaction branches stay in the prepared state until the coordinator is recovered and can be asked again about the outcome of the transaction. Likewise, if a non-coordinating cluster node with a transaction branch dies between the phases, it will do a roll-forward and ask the coordinator for the outcome of the transaction.&lt;/p&gt; &lt;p&gt;If cluster nodes occasionally crash and then recover relatively quickly, without ever losing transaction logs or database files, this is resilient enough. Everything is symmetrical; there are no cluster nodes with special functions, except for one master node that has the added task of resolving distributed deadlocks.&lt;/p&gt; &lt;p&gt;I suppose our anti-SQL person called 2PC &amp;quot;anti-availability&amp;quot; because in the above situation we have the following problems: if any one cluster node is offline, it is quite likely that no transaction can be committed. This is so unless the data is partitioned on a key with application semantics, and all data touched by a transaction usually stays within a single partition. Then operations could proceed on most of the data while one cluster node was recovering. But, especially with RDF, this is never the case, since keys are partitioned in ways that have nothing to do with application semantics. Further, if one uses XA or &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x785bc50&quot;&gt;Microsoft&lt;/a&gt; DTC with the monitor on a single box, this box can become a bottleneck and/or a single point of failure. (Among other considerations, this is why &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x72a1ea8&quot;&gt;Virtuoso&lt;/a&gt; does not rely on any such monitor.) Further, if a cluster node dies never to be heard of again, leaving prepared but uncommitted transaction branches, the rest of the system has no way of telling what to do with them, again unless relying on a monitor that is itself liable to fail.&lt;/p&gt; &lt;p&gt;If transactions have a real world counterpart, it is possible, at least in theory, to check the outcome against the real world state: One can ask a customer if an order was actually placed or a shipment delivered. But when a transaction has to do with internal identifiers of things, for example whether &lt;b&gt;&lt;code&gt;mailto://plaidskirt@hotdate.com&lt;/code&gt;&lt;/b&gt; has internal ID &lt;b&gt;&lt;code&gt;0xacebabe&lt;/code&gt;&lt;/b&gt;, such a check against external reality is not possible.&lt;/p&gt; &lt;h2&gt;Fault-Tolerant Operation&lt;/h2&gt; &lt;p&gt;In a fault tolerant setting, we introduce the following extra elements: Cluster nodes are comprised of &amp;quot;quorums&amp;quot; of mutually-mirroring server instances. Each such quorum holds a partition of the data. Such a quorum typically consists of two server instances, but may have three for extra safety. If all server instances in the quorum are offline, then the cluster node is offline, and the cluster is not fully operational. If at least one server instance in a quorum is online, then the cluster node is online, and the cluster is operational and can process new transactions.&lt;/p&gt; &lt;p&gt;We designate one cluster node (&lt;i&gt;i.e.,&lt;/i&gt; one quorum of 2 or 3 server instances) to act as a master node, and we set an order of precedence among its member instances. In addition to arbitrating distributed deadlocks, the master instance on duty will handle reports of server instance failures, and answer questions about any transactions left hanging in prepared state by a dead transaction coordinator. If the master on duty fails, the next master in line will either notice this itself in the line of normal business or get a complaint from another server instance about not being able to contact the previous master.&lt;/p&gt; &lt;p&gt;There is no global heartbeat messaging &lt;i&gt;per se,&lt;/i&gt; but since connections between server instances are reused long-term, a dropped connection will be noticed and the master on duty will be notified. If all masters are unavailable, that entire quorum (&lt;i&gt;i.e.,&lt;/i&gt; the master node) is offline and thus (as with any entire node going offline) most operations will fail anyway, unless by chance they do not hit any data managed by that failed quorum.&lt;/p&gt; &lt;p&gt;When it receives a notice of unavailability, the master instance on duty tries to contact the unavailable server instance and if it fails, it will notify all remaining instances that that server instance is removed from the cluster. The effect is that the remaining server instances will stop attempting to access the failed instance. Updates to the partitions managed by the failed server instance are no longer sent to it, which results in updates to this data succeeding, as they are made against the other server instances in that quorum. Updates to the data of the failed server instance &lt;i&gt;will&lt;/i&gt; fail in the window of time between the actual failure and the removal, which is typically well under a second. The removal of a failed server instance is delegated to a central authority in order not to have everybody get in each other&amp;#39;s way when trying to effect the removal.&lt;/p&gt; &lt;p&gt;If the failed server instance left prepared uncommitted transactions behind, the server instances having such branches will in due order contact the transaction coordinator to ask what should be done. This is a normal procedure for dealing with possibly dropped commit or rollback messages. When they discover that the coordinator has been removed, the master on duty will be contacted instead. Each prepare message of a transaction lists all the server instances participating in the transaction; thus the master can check whether each has received the prepare. If all have the prepare and none has an abort, the transaction is committed. The dead coordinator may not know this or may indeed not have the transaction logged, since it sends the prepares before logging its own prepare. The recovery will handle this though. We note that of the remaining branches, there is at least one copy of the branch with the failed server instance, or else we would have a whole quorum failed. In cases where there are branches participating in an unresolved transaction where all the quorum members have failed, the system cannot decide the outcome, and will periodically retry until at least one member of the failed quorum becomes available.&lt;/p&gt; &lt;p&gt;The most complex part of the protocol is the recovery of a failed server instance. The recovery starts with a normal roll forward from the local transaction log. After this, the server instance will contact the master on duty to ask for its state. Typically, the master will reply that the recovering server instance had been removed and is out of date. When this is established, the recovering server instance will contact a live member of its quorum and ask for sync. The failed server instance has an approximate timestamp of its last received transaction. It knows this from the roll forward, where time markers are interspersed now and then between transaction records. The live partner then sends its transaction log(s) covering the time from a few seconds before the last transaction of the failed partner up to the present. A few transactions may get rolled forward twice but this does no harm, since these records have absolute values and no deltas and the second insert of a key is simply ignored. When the sender of the log reaches its last committed log entry, it asks the recovering server instance to confirm successful replay of the log so far. Having the confirmation, the sender will abort all unprepared transactions affecting it and will not accept any new ones until the sync is completed. If new transactions were committed between sending the last of the log and killing the uncommitted new transactions, these too are shipped to the recovering server instance in their committed or prepared state. When these are also confirmed replayed, the recovering server instance is in exact sync up to the transaction. The sender then notifies the rest of the cluster that the sync is complete and that the recovered server instance will be included in any updates of its slice of the data. The time between freeze and re-enable of transactions is the time to replay what came in between the first sync and finishing the freeze. Typically nothing came in, so the time is in milliseconds. If an application got its transaction killed in this maneuver, it will be seen as a deadlock.&lt;/p&gt; &lt;p&gt;If the recovering server instance received transactions in prepared state, it will ask about their outcome as a part of the periodic sweep through pending transactions. One of these transactions could have been one originally prepared by itself, where the prepares had gone out before it had time to log the transaction. Thus, this eventuality too is covered and has a consistent outcome. Failures can interrupt the recovery process. The recovering server instance will have logged as far as it got, and will pick up from this point onward. Real time clocks on the host nodes of the cluster will have to be in approximate sync, within a margin of a minute or so. This is not a problem in a closely connected network.&lt;/p&gt; &lt;p&gt;For simultaneous failure of a entire quorum of server instances (&lt;i&gt;i.e.,&lt;/i&gt; a set of mutually-mirroring partners; a cluster node), the rule is that the last one to fail must be the first to come back up. In order to have uninterrupted service across arbitrary double failures, one must store things in triplicate; statistically, however, most double failures will not hit cluster nodes of the same group.&lt;/p&gt; &lt;p&gt;The protocol for recovery of failed server instances of the master quorum (&lt;i&gt;i.e.,&lt;/i&gt; the master cluster node) is identical, except that a recovering master will have to ask the other master(s) which one is more up to date. If the recovering master has a log entry of having excluded all other masters in its quorum from the cluster, it can come back online without asking anybody. If there is no such entry, it must ask the other master(s). If all had failed at the exact same instant, none has an entry of the other(s) being excluded and all will know that they are in the same state since any update to one would also have been sent to the other(s).&lt;/p&gt; &lt;h2&gt;Failure of Storage Media&lt;/h2&gt; &lt;p&gt;When a server instance fails, its permanent storage may or may not survive. Especially with mirrored disks, storage most often survives a failure. However, the survival of the database does not depend on any single server instance retaining any permanent storage over failure. If storage is left in place, as in the case of an OS reboot or replacing a faulty memory chip, rejoining the cluster is done based on the existing copy of the database on the server instance. if there is no existing copy, a copy can be taken from any surviving member of the same quorum. This consists of the following steps: First, a log checkpoint is forced on the surviving instance. Normally log checkpoints are done at regular intervals, independently on each server instance. The log checkpoint writes a consistent state of the database to permanent storage. The disk pages forming this consistent image will not be written to until the next log checkpoint. Therefore copying the database file is safe and consistent as long as a log checkpoint does not take place between the start and end of copy. Thus checkpoints are disabled right after the initial checkpoint. The copy can take a relatively long time; consider 20s per gigabyte on a 1GbE network a good day. At the end of copy, checkpoints are re-enabled on the surviving cluster node. The recovering database starts without a log, sees the timestamp of the checkpoint in the database, and asks for transactions from just before this time up to present. The recovery then proceeds as outlined above.&lt;/p&gt; &lt;h2&gt;Network Failures&lt;/h2&gt; &lt;p&gt;The CAP theorem states that Consistency, Availability, and Partition-tolerance do not mix. &amp;quot;Partition&amp;quot; here means the split of a network.&lt;/p&gt; &lt;p&gt;It is trivially true that if the network splits so that on both sides there is a copy of each partition of the data, both sides will think themselves the live copy left online after the other died, and each will thus continue to accumulate updates. Such an event is not very probable within one site where all machines are redundantly connected to two independent switches. Most servers have dual 1GbE on the motherboard, and both ports should be used for cluster interconnect for best performance, with each attached to an independent switch. Both switches would have to fail in such a way as to split their respective network for a single-site network split to happen. Of course, the likelihood of a network split in multi-site situations is higher.&lt;/p&gt; &lt;p&gt;One way of guarding against network splits is to require that at least one partition of the data have all copies online. Additionally, the master on duty can request each cluster node or server instance it expects to be online to connect to every other node or instance, and to report which they could reach. If the reports differ, there is a network problem. This procedure can be performed using both interfaces or only the first or second interface of each server to determine if one of the switches selectively blocks some paths. These simple sanity checks protect against arbitrary network errors. Using TCP for inter-cluster-node communication in principle protects against random message loss, but the Virtuoso cluster protocols do not rely on this. Instead, there are protocols for retry of any transaction messages and for using keep-alive messages on any long-running functions sent across the cluster. Failure to get a keep-alive message within a certain period will abort a query even if the network connections look OK. &lt;/p&gt; &lt;h2&gt;Backups, and Recovery from Loss of Entire Site&lt;/h2&gt; &lt;p&gt;For a constantly-operating distributed system, it is hard to define what exactly constitutes a consistent snapshot. The checkpointed state on each cluster node is consistent as far as this cluster node is concerned (&lt;i&gt;i.e.,&lt;/i&gt; it contains no uncommitted data), but the checkpointed states on all the cluster nodes are not from exactly the same moment in time. The complete state of a cluster is the checkpoint state of each cluster node plus the current transaction log of each. If the logs were shipped in real time to off-site storage, a consistent image could be reconstructed from them. Since such shipping cannot be synchronous due to latency considerations, some transactions could be received only in part in the event of a failure of the off-site link. Such partial transactions can however be detected at reconstruction time because each record contains the list of all participants of the transaction. If some piece is found missing, the whole can be discarded. In this way integrity is guaranteed but it is possible that a few milliseconds worth of transactions get lost. In these cases, the online client will almost certainly fail to get the final success message and will recheck the status after recovery.&lt;/p&gt; &lt;p&gt;For business continuity purposes, a live feed of transactions can be constantly streamed off-site, for example to a cloud infrastructure provider. One low-cost virtual machine on the cloud will typically be enough for receiving the feed. In the event of long-term loss of the whole site, replacement servers can be procured on the cloud; thus, capital is not tied up in an aging inventory of spare servers. The cloud-based substitute can be maintained for the time it takes to rebuild an owned infrastructure, which is still at present more economical than a cloud-only solution.&lt;/p&gt; &lt;p&gt;Switching a cluster from an owned site to the cloud could be accomplished in a few hours. The prerequisite of this is that there are reasonably recent snapshots of the database files, so that replay of logs does not take too long. The bulk of the time taken by such a switch would be in transferring the database snapshots from S3 or similar to the newly provisioned machines, formatting the newly provisioned virtual disks, etc.&lt;/p&gt; &lt;p&gt;Rehearsing such a maneuver beforehand is quite necessary for predictable execution. We do not presently have a productized set of tools for such a switch, but can advise any interested parties on implementing and testing such a disaster recovery scheme.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;In conclusion, we have shown how we can have strong transactional guarantees in a database cluster without single points of failure or performance penalties when compared with a non fault-tolerant cluster. Operator intervention is not required for anything short of hardware failure. Recovery procedures are simple, at most consisting of installing software and copying database files from a surviving cluster node. Unless permanent storage is lost in the failure, not even this is required. Real-time off-site log shipment can easily be added to these procedures to protect against site-wide failures.&lt;/p&gt; &lt;p&gt;Future work may be directed toward concurrent operation of geographically-distributed data centers with eventual consistency. Such a setting would allow for migration between sites in the event of whole-site failures, and for reconciliation between inconsistent histories of different halves of a temporarily split network. Such schemes are likely to require application-level logic for reconciliation and cannot consist of an out-of-the-box DBMS alone. All techniques discussed here are application-agnostic and will work equally well for Graph Model (&lt;i&gt;e.g.,&lt;/i&gt; RDF) and Relational Model (&lt;i&gt;e.g.,&lt;/i&gt; SQL) workloads.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Glossary&quot; id=&quot;link-id0x24f4e378&quot;&gt;Glossary&lt;/a&gt; &lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster (VC)&lt;/b&gt; -- a collection of Virtuoso Cluster Nodes on one or more machines, working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster Node (VCN)&lt;/b&gt; -- a Virtuoso Server Instance (Non Fault-Tolerant Operations), or a Quorum of Server Instances (Fault Tolerant Operations), which is a member of a collection of Virtuoso Cluster Nodes working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster (VHC)&lt;/b&gt; -- a collection of machines, each hosting one or more Virtuoso Server Instances, making up a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster Node (VHCN)&lt;/b&gt; -- a machine hosting one or more Virtuoso Server Instances that are members of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Server Instance (VSI)&lt;/b&gt; -- a single Virtuoso process with exclusive access to its own permanent storage, consisting of database files and logs. May comprise an entire Virtuoso Cluster Node (Non Fault-Tolerant Operations), or be one member of a quorum which comprises a Virtuoso Cluster Node (Fault Tolerant Operations).&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Also see&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.gbcacm.org/sites/www.gbcacm.org/files/slides/SpecialRelativity[1]_0.pdf&quot; id=&quot;link-id0x16cb22d8&quot;&gt;Special Relativity and the Problem of Database Scalability (PDF)&lt;/a&gt;, by James Starkey of &lt;a href=&quot;http://www.nimbusdb.com/&quot; id=&quot;link-id0x18f30d58&quot;&gt;NimbusDB, Inc.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-04-14T19:13:00-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transactional High Availability in Virtuoso Cluster Edition</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-04-14#1622</atom:id>
  <atom:published>2010-04-14T22:21:52Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Introduction&lt;/h2&gt; &lt;p&gt;This post discusses the technical specifics of how we accomplish smooth transactional operation in a database server cluster under different failure conditions. (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1621&quot; id=&quot;link-id0x198e8e68&quot;&gt;A higher-level short version&lt;/a&gt; was posted last week.) The reader is expected to be familiar with the basics of &lt;a href=&quot;http://dbpedia.org/resource/Distributed_transaction&quot; id=&quot;link-id0x6674ec8&quot;&gt;distributed transactions&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Someone on a cloud computing discussion list called &lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x6ab2480&quot;&gt;two-phase commit&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x66e9568&quot;&gt;2PC&lt;/a&gt;) the &amp;quot;anti-availability protocol.&amp;quot; There is indeed a certain anti-&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2238b330&quot;&gt;SQL&lt;/a&gt; and anti-2PC sentiment out there, with key-value stores and &amp;quot;eventual consistency&amp;quot; being talked about a lot. Indeed, if we are talking about wide-area replication over high-latency connections, then 2PC with synchronously-sharp transaction boundaries over all copies is not really workable.&lt;/p&gt; &lt;p&gt;For multi-site operations, a level of &lt;i&gt;eventual&lt;/i&gt; consistency is indeed quite unavoidable. Exactly what the requirements are depends on the application, so I will focus here on operations inside one site.&lt;/p&gt; &lt;p&gt;The key-value store culture seems to focus on workloads where a record is relatively self-contained. The record can be quite long, with repeating fields, different selections of fields in consecutive records, and so forth. Such a record would typically be split over many tables of a relational &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1ae05058&quot;&gt;schema&lt;/a&gt;. In the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x6956f38&quot;&gt;RDF&lt;/a&gt; world, such a record would be split even wider, with the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x21ae7cc8&quot;&gt;information&lt;/a&gt; needed to reconstitute the full record almost invariably split over many servers. This comes from the mapping between the text of URIs and their internal IDs being partitioned in one way, and the many indices on the RDF quads each in yet another way.&lt;/p&gt; &lt;p&gt;So it comes to pass that in the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2bd28d30&quot;&gt;data&lt;/a&gt; models we are most interested in, the application-level &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x214d55c0&quot;&gt;entity&lt;/a&gt; (&lt;i&gt;e.g.,&lt;/i&gt; a user account in a social network) is not a contiguous unit with a single global identifier. The social network user account, that the key-value store would consider a unit of replication mastering and eventual consistency, will be in RDF or SQL a set of maybe hundreds of tuples, each with more than one index, nearly invariably spanning multiple nodes of the database cluster.&lt;/p&gt; &lt;p&gt;So, before we can talk about wide-area replication and eventual consistency with application-level semantics, we need a database that can run on a fair-sized cluster and have cast-iron consistency within its bounds. If such a cluster is to be large and is to operate continuously, it must have some form of redundancy to cover for hardware failures, software upgrades, reboots, etc., without interruption of service.&lt;/p&gt; &lt;p&gt;This is the point of the design space we are tackling here.&lt;/p&gt; &lt;h2&gt;Non Fault-Tolerant Operation&lt;/h2&gt; &lt;p&gt;There are two basic modes of operation we cover: bulk load, and online transactions.&lt;/p&gt; &lt;p&gt;In the case of bulk load, we start with a consistent image of the database; load data; and finish by making another consistent image. If there is a failure during load, we lose the whole load, and restart from the initial consistent image. This is quite simple and is not properly transactional. It is quicker for filling a warehouse but is not to be used for anything else. In the remainder, we will only talk about online transactions.&lt;/p&gt; &lt;p&gt;When all cluster nodes are online, operation is relatively simple. Each entry of each index belongs to a partition that is determined by the values of one or more partitioning columns of said index. There are no tables separate from indices; the relational row is on the index leaf of its primary key. Secondary indices reference the row by including the primary key. Blobs are in the same partition as the row which contains the blob. Each partition is then stored on a &amp;quot;cluster node.&amp;quot; In non fault-tolerant operations, each such cluster node is a single process with exclusive access to its own permanent storage, consisting of database files and logs; &lt;i&gt;i.e.,&lt;/i&gt; each node is a single server instance. It does not matter if the storage is local or on a SAN, the cluster node is still the only one accessing it.&lt;/p&gt; &lt;p&gt;When things are not fault tolerant, transactions work as follows:&lt;/p&gt; &lt;p&gt;When there are updates, two-phase commit is used to guarantee a consistent result. Each transaction is coordinated by one cluster node, which issues the updates in parallel to all cluster nodes concerned. Sending two update messages instead of one does not significantly impact latency. The coordinator of each transaction is the primary authority for the transaction&amp;#39;s outcome. If the coordinator of the transaction dies between the phases of the commit, the transaction branches stay in the prepared state until the coordinator is recovered and can be asked again about the outcome of the transaction. Likewise, if a non-coordinating cluster node with a transaction branch dies between the phases, it will do a roll-forward and ask the coordinator for the outcome of the transaction.&lt;/p&gt; &lt;p&gt;If cluster nodes occasionally crash and then recover relatively quickly, without ever losing transaction logs or database files, this is resilient enough. Everything is symmetrical; there are no cluster nodes with special functions, except for one master node that has the added task of resolving distributed deadlocks.&lt;/p&gt; &lt;p&gt;I suppose our anti-SQL person called 2PC &amp;quot;anti-availability&amp;quot; because in the above situation we have the following problems: if any one cluster node is offline, it is quite likely that no transaction can be committed. This is so unless the data is partitioned on a key with application semantics, and all data touched by a transaction usually stays within a single partition. Then operations could proceed on most of the data while one cluster node was recovering. But, especially with RDF, this is never the case, since keys are partitioned in ways that have nothing to do with application semantics. Further, if one uses XA or &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x16f60a98&quot;&gt;Microsoft&lt;/a&gt; DTC with the monitor on a single box, this box can become a bottleneck and/or a single point of failure. (Among other considerations, this is why &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x21c1aaa0&quot;&gt;Virtuoso&lt;/a&gt; does not rely on any such monitor.) Further, if a cluster node dies never to be heard of again, leaving prepared but uncommitted transaction branches, the rest of the system has no way of telling what to do with them, again unless relying on a monitor that is itself liable to fail.&lt;/p&gt; &lt;p&gt;If transactions have a real world counterpart, it is possible, at least in theory, to check the outcome against the real world state: One can ask a customer if an order was actually placed or a shipment delivered. But when a transaction has to do with internal identifiers of things, for example whether &lt;b&gt;&lt;code&gt;mailto://plaidskirt@hotdate.com&lt;/code&gt;&lt;/b&gt; has internal ID &lt;b&gt;&lt;code&gt;0xacebabe&lt;/code&gt;&lt;/b&gt;, such a check against external reality is not possible.&lt;/p&gt; &lt;h2&gt;Fault-Tolerant Operation&lt;/h2&gt; &lt;p&gt;In a fault tolerant setting, we introduce the following extra elements: Cluster nodes are comprised of &amp;quot;quorums&amp;quot; of mutually-mirroring server instances. Each such quorum holds a partition of the data. Such a quorum typically consists of two server instances, but may have three for extra safety. If all server instances in the quorum are offline, then the cluster node is offline, and the cluster is not fully operational. If at least one server instance in a quorum is online, then the cluster node is online, and the cluster is operational and can process new transactions.&lt;/p&gt; &lt;p&gt;We designate one cluster node (&lt;i&gt;i.e.,&lt;/i&gt; one quorum of 2 or 3 server instances) to act as a master node, and we set an order of precedence among its member instances. In addition to arbitrating distributed deadlocks, the master instance on duty will handle reports of server instance failures, and answer questions about any transactions left hanging in prepared state by a dead transaction coordinator. If the master on duty fails, the next master in line will either notice this itself in the line of normal business or get a complaint from another server instance about not being able to contact the previous master.&lt;/p&gt; &lt;p&gt;There is no global heartbeat messaging &lt;i&gt;per se,&lt;/i&gt; but since connections between server instances are reused long-term, a dropped connection will be noticed and the master on duty will be notified. If all masters are unavailable, that entire quorum (&lt;i&gt;i.e.,&lt;/i&gt; the master node) is offline and thus (as with any entire node going offline) most operations will fail anyway, unless by chance they do not hit any data managed by that failed quorum.&lt;/p&gt; &lt;p&gt;When it receives a notice of unavailability, the master instance on duty tries to contact the unavailable server instance and if it fails, it will notify all remaining instances that that server instance is removed from the cluster. The effect is that the remaining server instances will stop attempting to access the failed instance. Updates to the partitions managed by the failed server instance are no longer sent to it, which results in updates to this data succeeding, as they are made against the other server instances in that quorum. Updates to the data of the failed server instance &lt;i&gt;will&lt;/i&gt; fail in the window of time between the actual failure and the removal, which is typically well under a second. The removal of a failed server instance is delegated to a central authority in order not to have everybody get in each other&amp;#39;s way when trying to effect the removal.&lt;/p&gt; &lt;p&gt;If the failed server instance left prepared uncommitted transactions behind, the server instances having such branches will in due order contact the transaction coordinator to ask what should be done. This is a normal procedure for dealing with possibly dropped commit or rollback messages. When they discover that the coordinator has been removed, the master on duty will be contacted instead. Each prepare message of a transaction lists all the server instances participating in the transaction; thus the master can check whether each has received the prepare. If all have the prepare and none has an abort, the transaction is committed. The dead coordinator may not know this or may indeed not have the transaction logged, since it sends the prepares before logging its own prepare. The recovery will handle this though. We note that of the remaining branches, there is at least one copy of the branch with the failed server instance, or else we would have a whole quorum failed. In cases where there are branches participating in an unresolved transaction where all the quorum members have failed, the system cannot decide the outcome, and will periodically retry until at least one member of the failed quorum becomes available.&lt;/p&gt; &lt;p&gt;The most complex part of the protocol is the recovery of a failed server instance. The recovery starts with a normal roll forward from the local transaction log. After this, the server instance will contact the master on duty to ask for its state. Typically, the master will reply that the recovering server instance had been removed and is out of date. When this is established, the recovering server instance will contact a live member of its quorum and ask for sync. The failed server instance has an approximate timestamp of its last received transaction. It knows this from the roll forward, where time markers are interspersed now and then between transaction records. The live partner then sends its transaction log(s) covering the time from a few seconds before the last transaction of the failed partner up to the present. A few transactions may get rolled forward twice but this does no harm, since these records have absolute values and no deltas and the second insert of a key is simply ignored. When the sender of the log reaches its last committed log entry, it asks the recovering server instance to confirm successful replay of the log so far. Having the confirmation, the sender will abort all unprepared transactions affecting it and will not accept any new ones until the sync is completed. If new transactions were committed between sending the last of the log and killing the uncommitted new transactions, these too are shipped to the recovering server instance in their committed or prepared state. When these are also confirmed replayed, the recovering server instance is in exact sync up to the transaction. The sender then notifies the rest of the cluster that the sync is complete and that the recovered server instance will be included in any updates of its slice of the data. The time between freeze and re-enable of transactions is the time to replay what came in between the first sync and finishing the freeze. Typically nothing came in, so the time is in milliseconds. If an application got its transaction killed in this maneuver, it will be seen as a deadlock.&lt;/p&gt; &lt;p&gt;If the recovering server instance received transactions in prepared state, it will ask about their outcome as a part of the periodic sweep through pending transactions. One of these transactions could have been one originally prepared by itself, where the prepares had gone out before it had time to log the transaction. Thus, this eventuality too is covered and has a consistent outcome. Failures can interrupt the recovery process. The recovering server instance will have logged as far as it got, and will pick up from this point onward. Real time clocks on the host nodes of the cluster will have to be in approximate sync, within a margin of a minute or so. This is not a problem in a closely connected network.&lt;/p&gt; &lt;p&gt;For simultaneous failure of a entire quorum of server instances (&lt;i&gt;i.e.,&lt;/i&gt; a set of mutually-mirroring partners; a cluster node), the rule is that the last one to fail must be the first to come back up. In order to have uninterrupted service across arbitrary double failures, one must store things in triplicate; statistically, however, most double failures will not hit cluster nodes of the same group.&lt;/p&gt; &lt;p&gt;The protocol for recovery of failed server instances of the master quorum (&lt;i&gt;i.e.,&lt;/i&gt; the master cluster node) is identical, except that a recovering master will have to ask the other master(s) which one is more up to date. If the recovering master has a log entry of having excluded all other masters in its quorum from the cluster, it can come back online without asking anybody. If there is no such entry, it must ask the other master(s). If all had failed at the exact same instant, none has an entry of the other(s) being excluded and all will know that they are in the same state since any update to one would also have been sent to the other(s).&lt;/p&gt; &lt;h2&gt;Failure of Storage Media&lt;/h2&gt; &lt;p&gt;When a server instance fails, its permanent storage may or may not survive. Especially with mirrored disks, storage most often survives a failure. However, the survival of the database does not depend on any single server instance retaining any permanent storage over failure. If storage is left in place, as in the case of an OS reboot or replacing a faulty memory chip, rejoining the cluster is done based on the existing copy of the database on the server instance. if there is no existing copy, a copy can be taken from any surviving member of the same quorum. This consists of the following steps: First, a log checkpoint is forced on the surviving instance. Normally log checkpoints are done at regular intervals, independently on each server instance. The log checkpoint writes a consistent state of the database to permanent storage. The disk pages forming this consistent image will not be written to until the next log checkpoint. Therefore copying the database file is safe and consistent as long as a log checkpoint does not take place between the start and end of copy. Thus checkpoints are disabled right after the initial checkpoint. The copy can take a relatively long time; consider 20s per gigabyte on a 1GbE network a good day. At the end of copy, checkpoints are re-enabled on the surviving cluster node. The recovering database starts without a log, sees the timestamp of the checkpoint in the database, and asks for transactions from just before this time up to present. The recovery then proceeds as outlined above.&lt;/p&gt; &lt;h2&gt;Network Failures&lt;/h2&gt; &lt;p&gt;The CAP theorem states that Consistency, Availability, and Partition-tolerance do not mix. &amp;quot;Partition&amp;quot; here means the split of a network.&lt;/p&gt; &lt;p&gt;It is trivially true that if the network splits so that on both sides there is a copy of each partition of the data, both sides will think themselves the live copy left online after the other died, and each will thus continue to accumulate updates. Such an event is not very probable within one site where all machines are redundantly connected to two independent switches. Most servers have dual 1GbE on the motherboard, and both ports should be used for cluster interconnect for best performance, with each attached to an independent switch. Both switches would have to fail in such a way as to split their respective network for a single-site network split to happen. Of course, the likelihood of a network split in multi-site situations is higher.&lt;/p&gt; &lt;p&gt;One way of guarding against network splits is to require that at least one partition of the data have all copies online. Additionally, the master on duty can request each cluster node or server instance it expects to be online to connect to every other node or instance, and to report which they could reach. If the reports differ, there is a network problem. This procedure can be performed using both interfaces or only the first or second interface of each server to determine if one of the switches selectively blocks some paths. These simple sanity checks protect against arbitrary network errors. Using TCP for inter-cluster-node communication in principle protects against random message loss, but the Virtuoso cluster protocols do not rely on this. Instead, there are protocols for retry of any transaction messages and for using keep-alive messages on any long-running functions sent across the cluster. Failure to get a keep-alive message within a certain period will abort a query even if the network connections look OK. &lt;/p&gt; &lt;h2&gt;Backups, and Recovery from Loss of Entire Site&lt;/h2&gt; &lt;p&gt;For a constantly-operating distributed system, it is hard to define what exactly constitutes a consistent snapshot. The checkpointed state on each cluster node is consistent as far as this cluster node is concerned (&lt;i&gt;i.e.,&lt;/i&gt; it contains no uncommitted data), but the checkpointed states on all the cluster nodes are not from exactly the same moment in time. The complete state of a cluster is the checkpoint state of each cluster node plus the current transaction log of each. If the logs were shipped in real time to off-site storage, a consistent image could be reconstructed from them. Since such shipping cannot be synchronous due to latency considerations, some transactions could be received only in part in the event of a failure of the off-site link. Such partial transactions can however be detected at reconstruction time because each record contains the list of all participants of the transaction. If some piece is found missing, the whole can be discarded. In this way integrity is guaranteed but it is possible that a few milliseconds worth of transactions get lost. In these cases, the online client will almost certainly fail to get the final success message and will recheck the status after recovery.&lt;/p&gt; &lt;p&gt;For business continuity purposes, a live feed of transactions can be constantly streamed off-site, for example to a cloud infrastructure provider. One low-cost virtual machine on the cloud will typically be enough for receiving the feed. In the event of long-term loss of the whole site, replacement servers can be procured on the cloud; thus, capital is not tied up in an aging inventory of spare servers. The cloud-based substitute can be maintained for the time it takes to rebuild an owned infrastructure, which is still at present more economical than a cloud-only solution.&lt;/p&gt; &lt;p&gt;Switching a cluster from an owned site to the cloud could be accomplished in a few hours. The prerequisite of this is that there are reasonably recent snapshots of the database files, so that replay of logs does not take too long. The bulk of the time taken by such a switch would be in transferring the database snapshots from S3 or similar to the newly provisioned machines, formatting the newly provisioned virtual disks, etc.&lt;/p&gt; &lt;p&gt;Rehearsing such a maneuver beforehand is quite necessary for predictable execution. We do not presently have a productized set of tools for such a switch, but can advise any interested parties on implementing and testing such a disaster recovery scheme.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;In conclusion, we have shown how we can have strong transactional guarantees in a database cluster without single points of failure or performance penalties when compared with a non fault-tolerant cluster. Operator intervention is not required for anything short of hardware failure. Recovery procedures are simple, at most consisting of installing software and copying database files from a surviving cluster node. Unless permanent storage is lost in the failure, not even this is required. Real-time off-site log shipment can easily be added to these procedures to protect against site-wide failures.&lt;/p&gt; &lt;p&gt;Future work may be directed toward concurrent operation of geographically-distributed data centers with eventual consistency. Such a setting would allow for migration between sites in the event of whole-site failures, and for reconciliation between inconsistent histories of different halves of a temporarily split network. Such schemes are likely to require application-level logic for reconciliation and cannot consist of an out-of-the-box DBMS alone. All techniques discussed here are application-agnostic and will work equally well for Graph Model (&lt;i&gt;e.g.,&lt;/i&gt; RDF) and Relational Model (&lt;i&gt;e.g.,&lt;/i&gt; SQL) workloads.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Glossary&quot; id=&quot;link-id0x28eef990&quot;&gt;Glossary&lt;/a&gt; &lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster (VC)&lt;/b&gt; -- a collection of Virtuoso Cluster Nodes on one or more machines, working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster Node (VCN)&lt;/b&gt; -- a Virtuoso Server Instance (Non Fault-Tolerant Operations), or a Quorum of Server Instances (Fault Tolerant Operations), which is a member of a collection of Virtuoso Cluster Nodes working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster (VHC)&lt;/b&gt; -- a collection of machines, each hosting one or more Virtuoso Server Instances, making up a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster Node (VHCN)&lt;/b&gt; -- a machine hosting one or more Virtuoso Server Instances that are members of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Server Instance (VSI)&lt;/b&gt; -- a single Virtuoso process with exclusive access to its own permanent storage, consisting of database files and logs. May comprise an entire Virtuoso Cluster Node (Non Fault-Tolerant Operations), or be one member of a quorum which comprises a Virtuoso Cluster Node (Fault Tolerant Operations).&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Also see&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.gbcacm.org/sites/www.gbcacm.org/files/slides/SpecialRelativity[1]_0.pdf&quot; id=&quot;link-id0x16cb22d8&quot;&gt;Special Relativity and the Problem of Database Scalability (PDF)&lt;/a&gt;, by James Starkey of &lt;a href=&quot;http://www.nimbusdb.com/&quot; id=&quot;link-id0x18f30d58&quot;&gt;NimbusDB, Inc.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-04-14T19:12:36-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Fault Tolerance in Virtuoso Cluster Edition (Short Version)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-04-07#1621</atom:id>
  <atom:published>2010-04-07T16:40:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have for some time had the option of storing &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x28eb2178&quot;&gt;data&lt;/a&gt; in a cluster in multiple copies, in the Commercial Edition of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x25178ed0&quot;&gt;Virtuoso&lt;/a&gt;. (This feature is not in and is not planned to be added to the Open Source Edition.)&lt;/p&gt; &lt;p&gt;Based on some feedback from the field, we decided to make this feature more user friendly. The gist of the matter is that failure and recovery processes have been automated so that neither application developer nor operating personnel needs any &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x21fea428&quot;&gt;knowledge&lt;/a&gt; of how things actually work.&lt;/p&gt; &lt;p&gt;So I will here make a few high level statements about what we offer for fault tolerance. I will follow up with technical specifics in another post.&lt;/p&gt; &lt;p&gt;Three types of individuals need to know about fault tolerance:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Executives: What does it cost? Will it really eliminate downtime?&lt;/li&gt; &lt;li&gt;System Administrators: Is it hard to configure? What do I do when I get an alert?&lt;/li&gt; &lt;li&gt;Application Developers/Programmers: Will I need to write extra code? Can old applications get fault tolerance with no changes?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I will explain the matter to each of these three groups:&lt;/p&gt; &lt;h2&gt;Executives&lt;/h2&gt; &lt;p&gt;The value gained is elimination of downtime. The cost is in purchasing twice (or thrice) the hardware and software licenses. In reality, the cost is less since you get the whole money&amp;#39;s worth of read throughput and half the money&amp;#39;s worth of write throughput. Since most applications are about reading, this is a good deal. You do not end up paying for unused capacity.&lt;/p&gt; &lt;p&gt;Server instances are grouped in &amp;quot;quorums&amp;quot; of two or, for extra safety, three; as long as one member of each quorum is available, the system keeps running and nobody sees a difference, except maybe for slower response. This does not protect against widespread power outage or the building burning down; the scope is limited to hardware and software failures at one site.&lt;/p&gt; &lt;p&gt;The most basic site-wide disaster recovery plan consists of constantly streaming updates off-site. Using an off-site backup plus update stream, one can reconstitute the failed data center on a cloud provider in a few hours. Details will vary; please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x2bdb0db8&quot;&gt;contact us&lt;/a&gt; for specifics.&lt;/p&gt; &lt;p&gt;Running multiple sites in parallel is also possible but specifics will depend on the application. Again, please contact us if you have a specific case in mind.&lt;/p&gt; &lt;h2&gt; System Administrators&lt;/h2&gt; &lt;p&gt;To configure, divide your server instances into quorums of 2 or 3, according to which will be mirrors of each other, with each quorum member on a different host from the others in its quorum. These things are declared in a configuration file. Table definitions do not have to be altered for fault tolerance. It is enough for tables and indices to specify partitioning. Use two switches, and two NICs per machine, and connect one of each server&amp;#39;s network cables to each switch, to cover switch failures.&lt;/p&gt; &lt;p&gt;When things break, as long as there is at least one server instance up from each quorum, things will continue to work. Reboots and the like are handled without operator intervention; if there is a broken host, then remove it and put a spare in its place. If the disks are OK, put the old disks in the replacement host and start. If the disks are gone, then copy the database files from the live copy. Finally start the replacement database, and the system will do the rest. The system is online in read-write mode during all this time, including during copying.&lt;/p&gt; &lt;p&gt;Having mirrored disks in individual hosts is optional since data will anyhow be in two copies. Mirrored disks will shorten the vulnerability window of running a partition on a single server instance since this will for the most part eliminate the need to copy many (hundreds) of GB of database files when recovering a failed instance.&lt;/p&gt; &lt;h2&gt; Application Developers/Programmers&lt;/h2&gt; &lt;p&gt;An application can connect to any server instance in the cluster and have access to the same data, with full &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x6451870&quot;&gt;ACID&lt;/a&gt; properties.&lt;/p&gt; &lt;p&gt;There are two types of errors that can occur in any database application: The database server instance may be offline or otherwise unreachable; and a transaction may be aborted due to a deadlock.&lt;/p&gt; &lt;p&gt;For the missing server instance, the application should try to reconnect. An &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x28e859b8&quot;&gt;ODBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x28e11940&quot;&gt;JDBC&lt;/a&gt; connect string can specify a list of alternate server instances; thus as long as the application is written to try to reconnect as best practices dictate, there is no new code needed.&lt;/p&gt; &lt;p&gt;For the deadlock, the application is supposed to retry the transaction. Sometimes when a server instance drops out or rejoins a running cluster, some transactions will have to be retried. To the application, these conditions look like a deadlock. If the application handles deadlocks (&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2bda4e40&quot;&gt;SQL&lt;/a&gt; State 40001) as best practices dictate, there is no change needed.&lt;/p&gt; &lt;h2&gt;Conclusion&lt;/h2&gt; &lt;p&gt;In summary...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Limited extra cost for fault tolerance; no equipment sitting idle.&lt;/li&gt; &lt;li&gt;Easy operation: Replace servers when they fail; the cluster does the rest.&lt;/li&gt; &lt;li&gt;No changes needed to most applications.&lt;/li&gt; &lt;li&gt;No proprietary SQL APIs or special fault tolerance logic needed in applications.&lt;/li&gt; &lt;li&gt;Fully transactional programming model.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All the above applies to both the Graph Model (&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x22606f10&quot;&gt;RDF&lt;/a&gt;) and Relational (SQL) sides of Virtuoso. These features will be in the commercial release of Virtuoso to be publicly available in the next 2-3 weeks. Please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x24f35648&quot;&gt;contact OpenLink Software&lt;/a&gt; Sales for details of availability or for getting advance evaluation copies.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Glossary&quot; id=&quot;link-id0x6648890&quot;&gt;Glossary&lt;/a&gt; &lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster (VC)&lt;/b&gt; -- a collection of Virtuoso Cluster Nodes on one or more machines, working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster Node (VCN)&lt;/b&gt; -- a Virtuoso Server Instance (Non Fault-Tolerant Operations), or a Quorum of Server Instances (Fault Tolerant Operations), which is a member of a collection of Virtuoso Cluster Nodes working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster (VHC)&lt;/b&gt; -- a collection of machines, each hosting one or more Virtuoso Server Instances, making up a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster Node (VHCN)&lt;/b&gt; -- a machine hosting one or more Virtuoso Server Instances that are members of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Server Instance (VSI)&lt;/b&gt; -- a single Virtuoso process with exclusive access to its own permanent storage, consisting of database files and logs. May comprise an entire Virtuoso Cluster Node (Non Fault-Tolerant Operations), or be one member of a quorum which comprises a Virtuoso Cluster Node (Fault Tolerant Operations).&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Also see&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.gbcacm.org/sites/www.gbcacm.org/files/slides/SpecialRelativity[1]_0.pdf&quot; id=&quot;link-id0x1320f1e8&quot;&gt;Special Relativity and the Problem of Database Scalability (PDF)&lt;/a&gt;, by James Starkey of &lt;a href=&quot;http://www.nimbusdb.com/&quot; id=&quot;link-id0x1320f2b0&quot;&gt;NimbusDB, Inc.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-04-14T19:12:47.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Fault Tolerance in Virtuoso Cluster Edition (Short Version)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-04-07#1620</atom:id>
  <atom:published>2010-04-07T16:40:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have for some time had the option of storing &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x7278bc0&quot;&gt;data&lt;/a&gt; in a cluster in multiple copies, in the Commercial Edition of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x16da4d00&quot;&gt;Virtuoso&lt;/a&gt;. (This feature is not in and is not planned to be added to the Open Source Edition.)&lt;/p&gt; &lt;p&gt;Based on some feedback from the field, we decided to make this feature more user friendly. The gist of the matter is that failure and recovery processes have been automated so that neither application developer nor operating personnel needs any &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x22447f98&quot;&gt;knowledge&lt;/a&gt; of how things actually work.&lt;/p&gt; &lt;p&gt;So I will here make a few high level statements about what we offer for fault tolerance. I will follow up with technical specifics in another post.&lt;/p&gt; &lt;p&gt;Three types of individuals need to know about fault tolerance:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Executives: What does it cost? Will it really eliminate downtime?&lt;/li&gt; &lt;li&gt;System Administrators: Is it hard to configure? What do I do when I get an alert?&lt;/li&gt; &lt;li&gt;Application Developers/Programmers: Will I need to write extra code? Can old applications get fault tolerance with no changes?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I will explain the matter to each of these three groups:&lt;/p&gt; &lt;h2&gt;Executives&lt;/h2&gt; &lt;p&gt;The value gained is elimination of downtime. The cost is in purchasing twice (or thrice) the hardware and software licenses. In reality, the cost is less since you get the whole money&amp;#39;s worth of read throughput and half the money&amp;#39;s worth of write throughput. Since most applications are about reading, this is a good deal. You do not end up paying for unused capacity.&lt;/p&gt; &lt;p&gt;Server instances are grouped in &amp;quot;quorums&amp;quot; of two or, for extra safety, three; as long as one member of each quorum is available, the system keeps running and nobody sees a difference, except maybe for slower response. This does not protect against widespread power outage or the building burning down; the scope is limited to hardware and software failures at one site.&lt;/p&gt; &lt;p&gt;The most basic site-wide disaster recovery plan consists of constantly streaming updates off-site. Using an off-site backup plus update stream, one can reconstitute the failed data center on a cloud provider in a few hours. Details will vary; please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x227c91d0&quot;&gt;contact us&lt;/a&gt; for specifics.&lt;/p&gt; &lt;p&gt;Running multiple sites in parallel is also possible but specifics will depend on the application. Again, please contact us if you have a specific case in mind.&lt;/p&gt; &lt;h2&gt; System Administrators&lt;/h2&gt; &lt;p&gt;To configure, divide your server instances into quorums of 2 or 3, according to which will be mirrors of each other, with each quorum member on a different host from the others in its quorum. These things are declared in a configuration file. Table definitions do not have to be altered for fault tolerance. It is enough for tables and indices to specify partitioning. Use two switches, and two NICs per machine, and connect one of each server&amp;#39;s network cables to each switch, to cover switch failures.&lt;/p&gt; &lt;p&gt;When things break, as long as there is at least one server instance up from each quorum, things will continue to work. Reboots and the like are handled without operator intervention; if there is a broken host, then remove it and put a spare in its place. If the disks are OK, put the old disks in the replacement host and start. If the disks are gone, then copy the database files from the live copy. Finally start the replacement database, and the system will do the rest. The system is online in read-write mode during all this time, including during copying.&lt;/p&gt; &lt;p&gt;Having mirrored disks in individual hosts is optional since data will anyhow be in two copies. Mirrored disks will shorten the vulnerability window of running a partition on a single server instance since this will for the most part eliminate the need to copy many (hundreds) of GB of database files when recovering a failed instance.&lt;/p&gt; &lt;h2&gt; Application Developers/Programmers&lt;/h2&gt; &lt;p&gt;An application can connect to any server instance in the cluster and have access to the same data, with full &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x6af3708&quot;&gt;ACID&lt;/a&gt; properties.&lt;/p&gt; &lt;p&gt;There are two types of errors that can occur in any database application: The database server instance may be offline or otherwise unreachable; and a transaction may be aborted due to a deadlock.&lt;/p&gt; &lt;p&gt;For the missing server instance, the application should try to reconnect. An &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x80112c8&quot;&gt;ODBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x66956d8&quot;&gt;JDBC&lt;/a&gt; connect string can specify a list of alternate server instances; thus as long as the application is written to try to reconnect as best practices dictate, there is no new code needed.&lt;/p&gt; &lt;p&gt;For the deadlock, the application is supposed to retry the transaction. Sometimes when a server instance drops out or rejoins a running cluster, some transactions will have to be retried. To the application, these conditions look like a deadlock. If the application handles deadlocks (&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x6a34cc0&quot;&gt;SQL&lt;/a&gt; State 40001) as best practices dictate, there is no change needed.&lt;/p&gt; &lt;h2&gt;Conclusion&lt;/h2&gt; &lt;p&gt;In summary...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Limited extra cost for fault tolerance; no equipment sitting idle.&lt;/li&gt; &lt;li&gt;Easy operation: Replace servers when they fail; the cluster does the rest.&lt;/li&gt; &lt;li&gt;No changes needed to most applications.&lt;/li&gt; &lt;li&gt;No proprietary SQL APIs or special fault tolerance logic needed in applications.&lt;/li&gt; &lt;li&gt;Fully transactional programming model.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;All the above applies to both the Graph Model (&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x20533288&quot;&gt;RDF&lt;/a&gt;) and Relational (SQL) sides of Virtuoso. These features will be in the commercial release of Virtuoso to be publicly available in the next 2-3 weeks. Please &lt;a href=&quot;http://www.openlinksw.com/contact/&quot; id=&quot;link-id0x6809510&quot;&gt;contact OpenLink Software&lt;/a&gt; Sales for details of availability or for getting advance evaluation copies.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Glossary&quot; id=&quot;link-id0x24faaae8&quot;&gt;Glossary&lt;/a&gt; &lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster (VC)&lt;/b&gt; -- a collection of Virtuoso Cluster Nodes on one or more machines, working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Cluster Node (VCN)&lt;/b&gt; -- a Virtuoso Server Instance (Non Fault-Tolerant Operations), or a Quorum of Server Instances (Fault Tolerant Operations), which is a member of a collection of Virtuoso Cluster Nodes working in parallel as part of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster (VHC)&lt;/b&gt; -- a collection of machines, each hosting one or more Virtuoso Server Instances, making up a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Host Cluster Node (VHCN)&lt;/b&gt; -- a machine hosting one or more Virtuoso Server Instances that are members of a Virtuoso Cluster.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Virtuoso Server Instance (VSI)&lt;/b&gt; -- a single Virtuoso process with exclusive access to its own permanent storage, consisting of database files and logs. May comprise an entire Virtuoso Cluster Node (Non Fault-Tolerant Operations), or be one member of a quorum which comprises a Virtuoso Cluster Node (Fault Tolerant Operations).&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Also see&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.gbcacm.org/sites/www.gbcacm.org/files/slides/SpecialRelativity[1]_0.pdf&quot; id=&quot;link-id0x1320f1e8&quot;&gt;Special Relativity and the Problem of Database Scalability (PDF)&lt;/a&gt;, by James Starkey of &lt;a href=&quot;http://www.nimbusdb.com/&quot; id=&quot;link-id0x1320f2b0&quot;&gt;NimbusDB, Inc.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-04-14T19:12:23-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>&quot;The Acquired, The Innate, and the Semantic&quot; or &quot;Teaching Sem Tech&quot;</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-04-05#1619</atom:id>
  <atom:published>2010-04-05T15:21:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was recently asked to write a section for a policy document touching the intersection of database and semantics, as a follow up to the meeting in Sofia I &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1614&quot; id=&quot;link-id0x19c4f938&quot;&gt;blogged about earlier&lt;/a&gt;. I will write about technology, but this same document also touches the matter of education and computer science curricula. Since the matter came up, I will share a few thoughts on the latter topic.&lt;/p&gt; &lt;p&gt;I have over the years trained a few truly excellent engineers and managed a heterogeneous lot of people. These days, since what we are doing is in fact quite difficult and the world is not totally without competition, I find that I must stick to core competence, which is hardcore tech and leave management to those who have time for it.&lt;/p&gt; &lt;p&gt;When younger, I thought that I could, through sheer personal charisma, transfer either technical skills, sound judgment, or drive and ambition to people I was working with. Well, to the extent I believed this, my own judgment was not sound. Transferring anything at all is difficult and chancy. I must here think of a fantasy novel where a wizard said that, &amp;quot;working such magic that makes things do what they already want to do is easy.&amp;quot; There is a grain of truth in that.&lt;/p&gt; &lt;p&gt;In order to build or manage organizations, we must work, as the wizard put it, &lt;i&gt;with&lt;/i&gt; nature, not against it. There are also counter-examples, for example my wife&amp;#39;s grandmother had decided to transform a regular willow into a weeping one by tying down the branches. Such &amp;quot;magic,&amp;quot; needless to say, takes constant maintenance; else the spell breaks.&lt;/p&gt; &lt;p&gt;To operate efficiently, either in business or education, we need to steer away from such endeavors. This is a valuable lesson, but now consider teaching this to somebody. Those who would most benefit from this wisdom are the least receptive to it. So again, we are reminded to stay away from the fantasy of being able to transfer some understanding we think to have and to have this take root. It will if it will and if it does not, it will take constant follow up, like the would-be weeping willow.&lt;/p&gt; &lt;p&gt;Now, in more specific terms, what can we realistically expect to teach about computer science?&lt;/p&gt; &lt;p&gt;Complexity of algorithms would be the first thing. Understanding the relative throughputs and latencies of the memory hierarchy (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x13fcc8b8&quot;&gt;cache&lt;/a&gt;, memory, local network, disk, wide area network) is the second. Understanding the difference of synchronous and asynchronous and the cost of synchronization (i.e., anything from waiting for a mutex to waiting for a network message) is the third.&lt;/p&gt; &lt;p&gt;Understanding how a database works would be immensely helpful for almost any application development task but this is probably asking too much.&lt;/p&gt; &lt;p&gt;Then there is the question of engineering. Where do we put interfaces and what should these interfaces expose? Well, they certainly should expose multiple instances of whatever it is they expose, since passing through an interface takes time.&lt;/p&gt; &lt;p&gt;I tried once to tell the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x72d7490&quot;&gt;SPARQL&lt;/a&gt; committee that parameterized queries and array parameters are a self-evident truism on the database side. This is an example of an interface that exposes multiple instances of what it exposes. But the committee decided not to standardize these. There is something in the &amp;quot;semanticist&amp;quot; mind that is irrationally antagonistic to what is self-evident for databasers. This is further an example of ignoring precept 2 above, the point about the throughputs and latencies in the memory hierarchy. Nature is a better and more patient teacher than I; the point will become clear of itself in due time, no worry.&lt;/p&gt; &lt;p&gt;Interfaces seem to be overvalued in education. This is tricky because we should not teach that interfaces are bad either. Nature has islands of tightly intertwined processes, separated by fairly narrow interfaces. People are taught to think in block diagrams, so they probably project this also where it does not apply, thereby missing some connections and porosity of interfaces.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x1c5591f0&quot;&gt;LarKC&lt;/a&gt; (EU FP7 Large &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x15fae798&quot;&gt;Knowledge&lt;/a&gt; Collider project) is an exercise in interfaces. The lessons so far are that coupling needs to be tight, and that the roles of the components are not always as neatly separable as the block diagram suggests.&lt;/p&gt; &lt;p&gt;Recognizing the points where interfaces are naturally narrow is very difficult. Teaching this in a curriculum is likely impossible. This is not to say that the matter should not be mentioned and examples of over-&amp;quot;paradigmatism&amp;quot; given. The geek mind likes to latch on to a paradigm (e.g., object orientation), and then they try to put it everywhere. It is safe to say that taking block diagrams too naively or too seriously makes for poor performance and needless code. In some cases, block diagrams can serve as tactical disinformation; i.e., you give lip service to the values of structure, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x6f03e90&quot;&gt;information&lt;/a&gt; hiding, and reuse, which one is not allowed to challenge, ever, and at the same time you do not disclose the competitive edge, which is pretty much always a breach of these same principles.&lt;/p&gt; &lt;p&gt;I was once at a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d524ce0&quot;&gt;data&lt;/a&gt; integration workshop in the US where some very qualified people talked about the process of science. They had this delightfully American metaphor for it:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;The edge is created in the &amp;quot;Wild West&amp;quot; — there are no standards or hard-and-fast rules, and paradigmatism for paradigmatism&amp;#39;s sake is a laughing matter with the cowboys in the fringe where new ground is broken. Then there is the OK Corral, where the cowboys shoot it out to see who prevails. Then there is Dodge City, where the lawman already reigns, and compliance, standards, and paradigms are not to be trifled with, lest one get the tar-and-feather treatment and be &amp;quot;driven out o&amp;#39;Dodge.&amp;quot;&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;So, if reality is like this, what attitude should the curriculum have towards it? Do we make innovators or followers? Well, as said before, they are not made. Or if they are made, they are not at least made in the university but much before that. I never made any of either, in spite of trying, but did meet many of both kinds. The education system needs to recognize individual differences, even though this is against the trend of turning out a standardized product. Enforced mediocrity makes mediocrity. The world has an amazing tolerance for mediocrity, it is true. But the edge is not created with this, if edge is what we are after.&lt;/p&gt; &lt;p&gt;But let us move to specifics of semantic technology. What are the core precepts, the equivalent of the complexity/memory/synchronization triangle of general purpose CS basics? Let us not forget that, especially in semantic technology, when we have complex operations, lots of data, and almost always multiple distributed data sources, forgetting the laws of physics carries an especially high penalty.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Know when to ontologize, when to folksonomize.&lt;/b&gt; The history of standards has examples of &amp;quot;stacks of Babel,&amp;quot; sky-high and all-encompassing, which just result in non-communication and non-adoption. Lighter weight, community driven, &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0x1dbd9018&quot;&gt;tag&lt;/a&gt; folksonomy, VoCamp-style approaches can be better. But this is a judgment call, entirely contextual, having to do with the maturity of the domain of discourse, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Answer only questions that are actually asked.&lt;/b&gt; This precept is two-pronged. The literal interpretation is not to do inferential closure for its own sake, materializing all implied facts of the knowledge base.&lt;/p&gt; &lt;p&gt;The broader interpretation is to take real-world problems. Expanding RDFS semantics with map-reduce and proving how many iterations this will take is a thing one can do but real-world problems will be more complex and less neat.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Deal with ambiguity.&lt;/b&gt; Data on which semantic technologies will be applied will be dirty, with errors from machine processing of natural language to erroneous human annotations. The knowledge bases will not be contradiction free. Michael Witbrock of CYC said many good things about this in Sofia; he would have something to say about a curriculum, no doubt.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Here we see that semantic technology is a younger discipline than computer science. We can outline some desirable skills and directions to follow but the idea of core precepts is not as well formed.&lt;/p&gt; &lt;p&gt;So we can approach the question from the angle of needed skills more than of precepts of science. What should the certified semantician be able to do?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data integration.&lt;/b&gt; Given heterogenous relational schemas talking about the same entities, the semantician should find existing ontologies for the domain, possibly extend these, and then map the relational data to them. After the mapping is conceptually done, the semantician must know what combination of ETL and on-the-fly mapping fits the situation. This does mean that the semantician indeed must understand databases, which I above classified as an almost unreachable ideal. But there is no getting around this. Data is increasingly what makes the world go round. From this it follows that everybody must increasingly publish, consume, and refine, i.e., integrate. The anti-database attitude of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x2038d520&quot;&gt;semantic web&lt;/a&gt; community simply has to go.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Design and implement workflows for content extraction,&lt;/b&gt; e.g., &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x713cdc0&quot;&gt;NLP&lt;/a&gt; or information extraction from images. This also means familiarity with NLP, desirably to the point of being able to tune the extraction rule sets of various NLP frameworks.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Design SOA workflows.&lt;/b&gt; The semantician should be able to extract and represent the semantics of business transactions and the data involved therein.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Lightweight knowledge engineering.&lt;/b&gt; The experience of building expert systems from the early days of AI is not the best possible, but with semantics attached to data, some sort of rules seem about inevitable. The rule systems will merge into the DBMS in time. Some ability to work with these, short of making expert systems, will be desirable.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Understand information quality&lt;/b&gt; in the sense of trust, provenance, errors in the information, etc. If the world is run based on data analytics, then one must know what the data in the warehouse means, what accidental and deliberate errors it contains, etc.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Of course, most of these tasks take place at some sort of organizational crossroads or interface. This means that the semantician must have some project management skills; must be capable of effectively communicating with different publics and simply getting the job done, always in the face of organizational inertia and often in the face of active resistance from people who view the semantician as some kind of intruder on their turf.&lt;/p&gt; &lt;p&gt;Now, this is a tall order. The semantician will have to be reasonably versatile technically, reasonably clever, and a self-starter on top. The self-starter aspect is the hardest.&lt;/p&gt; &lt;p&gt;The semanticists I have met are more of the scholar than the IT consultant profile. I say &lt;i&gt;semanticist&lt;/i&gt; for the semantic web research people and &lt;i&gt;semantician&lt;/i&gt; for the practitioner we are trying to define.&lt;/p&gt; &lt;p&gt;We could start by taking people who already do data integration projects and educating them in some semantic technology. We are here talking about a different breed than the one that by nature gravitates to description logics and AI. Projecting semanticist interests or attributes on this public is a source of bias and error.&lt;/p&gt; &lt;p&gt;If we talk about a university curriculum, the part that cannot be taught is the leadership and self-starter aspect, or whatever makes a good IT consultant. Thus the semantic technology studies must be profiled so as to attract people with this profile. As quoted before, the dream job for each era is a scarce skill that makes value from something that is plentiful in the environment. At this moment and for a few moments to come, this is the data geek, or maybe even semantician profile, if we take data geek past statistics and traditional business intelligence skills.&lt;/p&gt; &lt;p&gt;The semantic tech community, especially the academic branch of it, needs to reinvent itself in order to rise to this occasion. The flavor of the dream job curriculum will be away from the theoretical computer science towards the hands-on of database, large systems performance, and the practicalities of getting data intensive projects delivered.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Related&lt;/b&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Linked_Data_Virtualization/Linked_Data_Virtualization.html&quot; id=&quot;link-id0x199aca78&quot;&gt;Linked Data Driven Data Virtualization for Web-scale Integration (presentation)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x13297a70&quot;&gt;Linked Data and Virtuoso in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1595&quot; id=&quot;link-id0x1a3d0bd0&quot;&gt;Getting The Linked Data Value Pyramid Layers Right&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1572&quot; id=&quot;link-id0x1802b170&quot;&gt;Provenance and Reification in Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id0x19af4220&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1375&quot; id=&quot;link-id0x1a07a378&quot;&gt;Aspects of RDF to RDF Mapping&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-05-05T13:49:57-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>&quot;The Acquired, The Innate, and the Semantic&quot; or &quot;Teaching Sem Tech&quot;</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-04-05#1618</atom:id>
  <atom:published>2010-04-05T15:21:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was recently asked to write a section for a policy document touching the intersection of database and semantics, as a follow up to the meeting in Sofia I &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1614&quot; id=&quot;link-id0x19c4f938&quot;&gt;blogged about earlier&lt;/a&gt;. I will write about technology, but this same document also touches the matter of education and computer science curricula. Since the matter came up, I will share a few thoughts on the latter topic.&lt;/p&gt; &lt;p&gt;I have over the years trained a few truly excellent engineers and managed a heterogeneous lot of people. These days, since what we are doing is in fact quite difficult and the world is not totally without competition, I find that I must stick to core competence, which is hardcore tech and leave management to those who have time for it.&lt;/p&gt; &lt;p&gt;When younger, I thought that I could, through sheer personal charisma, transfer either technical skills, sound judgment, or drive and ambition to people I was working with. Well, to the extent I believed this, my own judgment was not sound. Transferring anything at all is difficult and chancy. I must here think of a fantasy novel where a wizard said that, &amp;quot;working such magic that makes things do what they already want to do is easy.&amp;quot; There is a grain of truth in that.&lt;/p&gt; &lt;p&gt;In order to build or manage organizations, we must work, as the wizard put it, &lt;i&gt;with&lt;/i&gt; nature, not against it. There are also counter-examples, for example my wife&amp;#39;s grandmother had decided to transform a regular willow into a weeping one by tying down the branches. Such &amp;quot;magic,&amp;quot; needless to say, takes constant maintenance; else the spell breaks.&lt;/p&gt; &lt;p&gt;To operate efficiently, either in business or education, we need to steer away from such endeavors. This is a valuable lesson, but now consider teaching this to somebody. Those who would most benefit from this wisdom are the least receptive to it. So again, we are reminded to stay away from the fantasy of being able to transfer some understanding we think to have and to have this take root. It will if it will and if it does not, it will take constant follow up, like the would-be weeping willow.&lt;/p&gt; &lt;p&gt;Now, in more specific terms, what can we realistically expect to teach about computer science?&lt;/p&gt; &lt;p&gt;Complexity of algorithms would be the first thing. Understanding the relative throughputs and latencies of the memory hierarchy (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x15761008&quot;&gt;cache&lt;/a&gt;, memory, local network, disk, wide area network) is the second. Understanding the difference of synchronous and asynchronous and the cost of synchronization (i.e., anything from waiting for a mutex to waiting for a network message) is the third.&lt;/p&gt; &lt;p&gt;Understanding how a database works would be immensely helpful for almost any application development task but this is probably asking too much.&lt;/p&gt; &lt;p&gt;Then there is the question of engineering. Where do we put interfaces and what should these interfaces expose? Well, they certainly should expose multiple instances of whatever it is they expose, since passing through an interface takes time.&lt;/p&gt; &lt;p&gt;I tried once to tell the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x5ca2ea8&quot;&gt;SPARQL&lt;/a&gt; committee that parameterized queries and array parameters are a self-evident truism on the database side. This is an example of an interface that exposes multiple instances of what it exposes. But the committee decided not to standardize these. There is something in the &amp;quot;semanticist&amp;quot; mind that is irrationally antagonistic to what is self-evident for databasers. This is further an example of ignoring precept 2 above, the point about the throughputs and latencies in the memory hierarchy. Nature is a better and more patient teacher than I; the point will become clear of itself in due time, no worry.&lt;/p&gt; &lt;p&gt;Interfaces seem to be overvalued in education. This is tricky because we should not teach that interfaces are bad either. Nature has islands of tightly intertwined processes, separated by fairly narrow interfaces. People are taught to think in block diagrams, so they probably project this also where it does not apply, thereby missing some connections and porosity of interfaces.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x7f63780&quot;&gt;LarKC&lt;/a&gt; (EU FP7 Large &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x4f50c00&quot;&gt;Knowledge&lt;/a&gt; Collider project) is an exercise in interfaces. The lessons so far are that coupling needs to be tight, and that the roles of the components are not always as neatly separable as the block diagram suggests.&lt;/p&gt; &lt;p&gt;Recognizing the points where interfaces are naturally narrow is very difficult. Teaching this in a curriculum is likely impossible. This is not to say that the matter should not be mentioned and examples of over-&amp;quot;paradigmatism&amp;quot; given. The geek mind likes to latch on to a paradigm (e.g., object orientation), and then they try to put it everywhere. It is safe to say that taking block diagrams too naively or too seriously makes for poor performance and needless code. In some cases, block diagrams can serve as tactical disinformation; i.e., you give lip service to the values of structure, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1f00c378&quot;&gt;information&lt;/a&gt; hiding, and reuse, which one is not allowed to challenge, ever, and at the same time you do not disclose the competitive edge, which is pretty much always a breach of these same principles.&lt;/p&gt; &lt;p&gt;I was once at a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2021f598&quot;&gt;data&lt;/a&gt; integration workshop in the US where some very qualified people talked about the process of science. They had this delightfully American metaphor for it:&lt;/p&gt; &lt;blockquote&gt; &lt;i&gt;The edge is created in the &amp;quot;Wild West&amp;quot; — there are no standards or hard-and-fast rules, and paradigmatism for paradigmatism&amp;#39;s sake is a laughing matter with the cowboys in the fringe where new ground is broken. Then there is the OK Corral, where the cowboys shoot it out to see who prevails. Then there is Dodge City, where the lawman already reigns, and compliance, standards, and paradigms are not to be trifled with, lest one get the tar-and-feather treatment and be &amp;quot;driven out o&amp;#39;Dodge.&amp;quot;&lt;/i&gt; &lt;/blockquote&gt; &lt;p&gt;So, if reality is like this, what attitude should the curriculum have towards it? Do we make innovators or followers? Well, as said before, they are not made. Or if they are made, they are not at least made in the university but much before that. I never made any of either, in spite of trying, but did meet many of both kinds. The education system needs to recognize individual differences, even though this is against the trend of turning out a standardized product. Enforced mediocrity makes mediocrity. The world has an amazing tolerance for mediocrity, it is true. But the edge is not created with this, if edge is what we are after.&lt;/p&gt; &lt;p&gt;But let us move to specifics of semantic technology. What are the core precepts, the equivalent of the complexity/memory/synchronization triangle of general purpose CS basics? Let us not forget that, especially in semantic technology, when we have complex operations, lots of data, and almost always multiple distributed data sources, forgetting the laws of physics carries an especially high penalty.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Know when to ontologize, when to folksonomize.&lt;/b&gt; The history of standards has examples of &amp;quot;stacks of Babel,&amp;quot; sky-high and all-encompassing, which just result in non-communication and non-adoption. Lighter weight, community driven, &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0x6b5d288&quot;&gt;tag&lt;/a&gt; folksonomy, VoCamp-style approaches can be better. But this is a judgment call, entirely contextual, having to do with the maturity of the domain of discourse, etc.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Answer only questions that are actually asked.&lt;/b&gt; This precept is two-pronged. The literal interpretation is not to do inferential closure for its own sake, materializing all implied facts of the knowledge base.&lt;/p&gt; &lt;p&gt;The broader interpretation is to take real-world problems. Expanding RDFS semantics with map-reduce and proving how many iterations this will take is a thing one can do but real-world problems will be more complex and less neat.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Deal with ambiguity.&lt;/b&gt; Data on which semantic technologies will be applied will be dirty, with errors from machine processing of natural language to erroneous human annotations. The knowledge bases will not be contradiction free. Michael Witbrock of CYC said many good things about this in Sofia; he would have something to say about a curriculum, no doubt.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Here we see that semantic technology is a younger discipline than computer science. We can outline some desirable skills and directions to follow but the idea of core precepts is not as well formed.&lt;/p&gt; &lt;p&gt;So we can approach the question from the angle of needed skills more than of precepts of science. What should the certified semantician be able to do?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data integration.&lt;/b&gt; Given heterogenous relational schemas talking about the same entities, the semantician should find existing ontologies for the domain, possibly extend these, and then map the relational data to them. After the mapping is conceptually done, the semantician must know what combination of ETL and on-the-fly mapping fits the situation. This does mean that the semantician indeed must understand databases, which I above classified as an almost unreachable ideal. But there is no getting around this. Data is increasingly what makes the world go round. From this it follows that everybody must increasingly publish, consume, and refine, i.e., integrate. The anti-database attitude of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1c5f5398&quot;&gt;semantic web&lt;/a&gt; community simply has to go.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Design and implement workflows for content extraction,&lt;/b&gt; e.g., &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x16443fe0&quot;&gt;NLP&lt;/a&gt; or information extraction from images. This also means familiarity with NLP, desirably to the point of being able to tune the extraction rule sets of various NLP frameworks.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Design SOA workflows.&lt;/b&gt; The semantician should be able to extract and represent the semantics of business transactions and the data involved therein.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Lightweight knowledge engineering.&lt;/b&gt; The experience of building expert systems from the early days of AI is not the best possible, but with semantics attached to data, some sort of rules seem about inevitable. The rule systems will merge into the DBMS in time. Some ability to work with these, short of making expert systems, will be desirable.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Understand information quality&lt;/b&gt; in the sense of trust, provenance, errors in the information, etc. If the world is run based on data analytics, then one must know what the data in the warehouse means, what accidental and deliberate errors it contains, etc.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Of course, most of these tasks take place at some sort of organizational crossroads or interface. This means that the semantician must have some project management skills; must be capable of effectively communicating with different publics and simply getting the job done, always in the face of organizational inertia and often in the face of active resistance from people who view the semantician as some kind of intruder on their turf.&lt;/p&gt; &lt;p&gt;Now, this is a tall order. The semantician will have to be reasonably versatile technically, reasonably clever, and a self-starter on top. The self-starter aspect is the hardest.&lt;/p&gt; &lt;p&gt;The semanticists I have met are more of the scholar than the IT consultant profile. I say &lt;i&gt;semanticist&lt;/i&gt; for the semantic web research people and &lt;i&gt;semantician&lt;/i&gt; for the practitioner we are trying to define.&lt;/p&gt; &lt;p&gt;We could start by taking people who already do data integration projects and educating them in some semantic technology. We are here talking about a different breed than the one that by nature gravitates to description logics and AI. Projecting semanticist interests or attributes on this public is a source of bias and error.&lt;/p&gt; &lt;p&gt;If we talk about a university curriculum, the part that cannot be taught is the leadership and self-starter aspect, or whatever makes a good IT consultant. Thus the semantic technology studies must be profiled so as to attract people with this profile. As quoted before, the dream job for each era is a scarce skill that makes value from something that is plentiful in the environment. At this moment and for a few moments to come, this is the data geek, or maybe even semantician profile, if we take data geek past statistics and traditional business intelligence skills.&lt;/p&gt; &lt;p&gt;The semantic tech community, especially the academic branch of it, needs to reinvent itself in order to rise to this occasion. The flavor of the dream job curriculum will be away from the theoretical computer science towards the hands-on of database, large systems performance, and the practicalities of getting data intensive projects delivered.&lt;/p&gt; &lt;p&gt; &lt;b&gt;Related&lt;/b&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Linked_Data_Virtualization/Linked_Data_Virtualization.html&quot; id=&quot;link-id0x199aca78&quot;&gt;Linked Data Driven Data Virtualization for Web-scale Integration (presentation)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1603&quot; id=&quot;link-id0x13297a70&quot;&gt;Linked Data and Virtuoso in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1595&quot; id=&quot;link-id0x1a3d0bd0&quot;&gt;Getting The Linked Data Value Pyramid Layers Right&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1572&quot; id=&quot;link-id0x1802b170&quot;&gt;Provenance and Reification in Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id0x19af4220&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1375&quot; id=&quot;link-id0x1a07a378&quot;&gt;Aspects of RDF to RDF Mapping&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-05-05T13:49:44-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Upcoming RDF Loader in Unclustered Virtuoso loads Uniprot at 279 Ktriples/s!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-04-02#1617</atom:id>
  <atom:published>2010-04-02T14:15:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently heard that &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x21414c58&quot;&gt;Oracle&lt;/a&gt; 11G loaded &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x28281e50&quot;&gt;RDF&lt;/a&gt; faster than we did. Now, we never thought the speed of loading a database was as important as the speed of query results, but since this is the &lt;b&gt;&lt;i&gt;sole&lt;/i&gt;&lt;/b&gt; area where they have reportedly been tested as faster, we decided it was time loading was addressed. Indeed, without Oracle to challenge us on query performance, we would not be half as good as we are. So, spurred on by the Oracular influence, we did something about our RDF loading.&lt;/p&gt; &lt;p&gt;Performance, I have said before, is a matter of locality and parallelism. So we applied both to the otherwise quite boring exercise of loading RDF. The recipe is this: Take a large set of triples; resolve the IRIs and literals into their IDs; then insert each index of the triple table on its own thread. All the lookups and inserts are first sorted in key order to get the locality. Running the indices in parallel gets the parallelism. Then run the parser on its own thread, fetching chunks of consecutive triples and queueing them for a pool of loader threads. Then run several parsers concurrently on different files so as to make sure there is work enough at all times. Do not make many more process threads than available &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x30f3b20&quot;&gt;CPU&lt;/a&gt; threads, since they would just get in each other&amp;#39;s way.&lt;/p&gt; &lt;p&gt;The whole process is non-transactional, starting from a checkpoint and ending with a checkpoint.&lt;/p&gt; &lt;p&gt;The test system was a dual-Xeon 5520 with 72G RAM. The &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x3256138&quot;&gt;Virtuoso&lt;/a&gt; was a single server; no cluster capability was used.&lt;/p&gt; &lt;p&gt;We loaded English &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x33b3e58&quot;&gt;Dbpedia&lt;/a&gt;, 179M triples, in 15 minutes, for a rate of 198 Kt/s. Uniprot with 1.33 G triples loaded in 79 minutes, for 279 Kt/s.&lt;/p&gt; &lt;p&gt;The source files were the Dbpedia 3.4 English files and the &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x28266c20&quot;&gt;Bio2RDF&lt;/a&gt; copy of Uniprot, both in Turtle syntax. The uniref, uniparc and uniprot files from the Bio2RDF set were sliced into smaller chunks so as to have more files to load in parallel; the taxonomy file was as such; and no other Bio2RDF files were loaded. Both experiments ran with 8 load streams, 1 per core. The CPU utilization was mostly between 1400% and 1500%, 14-15 of 16 CPU threads busy. Top load speed for a measurement window of 2 minutes was 383 Kt/s.&lt;/p&gt; &lt;p&gt;The index scheme for RDF quads was the default Virtuoso 6 configuration of 5 indices — GS, SP, OP, PSOG, and POGS. (We call this &amp;quot;3+2&amp;quot; indexing, because there are 3 partial and 2 full indices, delivering massive performance benefits over most other index schemes.) IRIs and literals reside in their own tables, each indexed from string to ID and vice versa. A full-text index on literals was not used.&lt;/p&gt; &lt;p&gt;Compared to previous performance, we have more than tripled our best single server multi-stream load speed, and multiplied our single stream load speed by a factor of 8. Some further gains may be reached by adjusting thread counts and matching vector sizes to CPU &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x20403130&quot;&gt;cache&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This will be available in a forthcoming release; this is not for download yet. Now that you know this, you may guess what we are doing with queries. More on this another time.&lt;/p&gt;</atom:content>
  <atom:updated>2010-04-02T12:59:15-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Upcoming RDF Loader in Unclustered Virtuoso loads Uniprot at 279 Ktriples/s!</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-04-02#1616</atom:id>
  <atom:published>2010-04-02T14:15:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently heard that &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x20585a18&quot;&gt;Oracle&lt;/a&gt; 11G loaded &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1fdae3e0&quot;&gt;RDF&lt;/a&gt; faster than we did. Now, we never thought the speed of loading a database was as important as the speed of query results, but since this is the &lt;b&gt;&lt;i&gt;sole&lt;/i&gt;&lt;/b&gt; area where they have reportedly been tested as faster, we decided it was time loading was addressed. Indeed, without Oracle to challenge us on query performance, we would not be half as good as we are. So, spurred on by the Oracular influence, we did something about our RDF loading.&lt;/p&gt; &lt;p&gt;Performance, I have said before, is a matter of locality and parallelism. So we applied both to the otherwise quite boring exercise of loading RDF. The recipe is this: Take a large set of triples; resolve the IRIs and literals into their IDs; then insert each index of the triple table on its own thread. All the lookups and inserts are first sorted in key order to get the locality. Running the indices in parallel gets the parallelism. Then run the parser on its own thread, fetching chunks of consecutive triples and queueing them for a pool of loader threads. Then run several parsers concurrently on different files so as to make sure there is work enough at all times. Do not make many more process threads than available &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x200f9570&quot;&gt;CPU&lt;/a&gt; threads, since they would just get in each other&amp;#39;s way.&lt;/p&gt; &lt;p&gt;The whole process is non-transactional, starting from a checkpoint and ending with a checkpoint.&lt;/p&gt; &lt;p&gt;The test system was a dual-Xeon 5520 with 72G RAM. The &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x21415250&quot;&gt;Virtuoso&lt;/a&gt; was a single server; no cluster capability was used.&lt;/p&gt; &lt;p&gt;We loaded English &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x24604630&quot;&gt;Dbpedia&lt;/a&gt;, 179M triples, in 15 minutes, for a rate of 198 Kt/s. Uniprot with 1.33 G triples loaded in 79 minutes, for 279 Kt/s.&lt;/p&gt; &lt;p&gt;The source files were the Dbpedia 3.4 English files and the &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x20366360&quot;&gt;Bio2RDF&lt;/a&gt; copy of Uniprot, both in Turtle syntax. The uniref, uniparc and uniprot files from the Bio2RDF set were sliced into smaller chunks so as to have more files to load in parallel; the taxonomy file was as such; and no other Bio2RDF files were loaded. Both experiments ran with 8 load streams, 1 per core. The CPU utilization was mostly between 1400% and 1500%, 14-15 of 16 CPU threads busy. Top load speed for a measurement window of 2 minutes was 383 Kt/s.&lt;/p&gt; &lt;p&gt;The index scheme for RDF quads was the default Virtuoso 6 configuration of 5 indices — GS, SP, OP, PSOG, and POGS. (We call this &amp;quot;3+2&amp;quot; indexing, because there are 3 partial and 2 full indices, delivering massive performance benefits over most other index schemes.) IRIs and literals reside in their own tables, each indexed from string to ID and vice versa. A full-text index on literals was not used.&lt;/p&gt; &lt;p&gt;Compared to previous performance, we have more than tripled our best single server multi-stream load speed, and multiplied our single stream load speed by a factor of 8. Some further gains may be reached by adjusting thread counts and matching vector sizes to CPU &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x201033c8&quot;&gt;cache&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This will be available in a forthcoming release; this is not for download yet. Now that you know this, you may guess what we are doing with queries. More on this another time.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:30:31.198816-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SemData@Sofia Roundtable write-up</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-03-15#1615</atom:id>
  <atom:published>2010-03-15T14:46:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was last week an &lt;a href=&quot;http://www.semdata.org/&quot; id=&quot;link-id11a83cf98&quot;&gt;invitation-based roundtable&lt;/a&gt; about semantic &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d37f598&quot;&gt;data&lt;/a&gt; management in &lt;a href=&quot;http://www.dbpedia.org/resource/Sofia&quot; id=&quot;link-id0x1ba4a208&quot;&gt;Sofia, Bulgaria&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Lots of smart people together. The meeting was hosted by &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x1cfc83f8&quot;&gt;Ontotext&lt;/a&gt; and chaired by &lt;a href=&quot;http://www.dbpedia.org/resource/Dieter_Fensel&quot; id=&quot;link-id0x1dc6e0d0&quot;&gt;Dieter Fensel&lt;/a&gt;. On the database side we had Ontotext, &lt;a href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x1cda77f0&quot;&gt;SYSTAP&lt;/a&gt; (&lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x1dba6a30&quot;&gt;Bigdata&lt;/a&gt;), &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1d8e1d88&quot;&gt;CWI&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x1d8cbcf0&quot;&gt;MonetDB&lt;/a&gt;), &lt;a href=&quot;http://www.dbpedia.org/resource/Karlsruhe_Institute_of_Technology&quot; id=&quot;link-id0x1e204cb0&quot;&gt;Karlsruhe Institute of Technology&lt;/a&gt; (YARS2/&lt;a href=&quot;http://swse.deri.ie/&quot; id=&quot;link-id0x1e653bf0&quot;&gt;SWSE&lt;/a&gt;). &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x1e6a4408&quot;&gt;LarKC&lt;/a&gt; was well represented, being our hosts, with STI, Ontotext, CYC, and &lt;a href=&quot;http://www.vu.nl/&quot; id=&quot;link-id0x1c8a6090&quot;&gt;VU Amsterdam&lt;/a&gt;. Notable absences were &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1e5ab690&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x1f5e5ff0&quot;&gt;Garlik&lt;/a&gt;, &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x1d9c08f0&quot;&gt;Franz&lt;/a&gt;, and &lt;a href=&quot;http://www.talis.com/&quot; id=&quot;link-id0x1d338b30&quot;&gt;Talis&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Now of semantic data management... What is the difference between a relational database and a semantic repository, a triple/quad store, a whatever-you-call-them?&lt;/p&gt; &lt;p&gt;I had last fall a meeting at CWI with Martin Kersten, Peter Boncz and Lefteris Sidirourgos from CWI, and Frank van Harmelen and Spiros Kotoulas of VU Amsterdam, to start a dialogue between semanticists and databasers. Here we were with many more people trying to discover what the case might be. What are the differences?&lt;/p&gt; &lt;p&gt;Michael &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x1da55730&quot;&gt;Stonebraker&lt;/a&gt; and Martin Kersten have basically said that what is sauce for the goose is sauce for the gander, and that there is no real difference between relational DB and &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1d828310&quot;&gt;RDF&lt;/a&gt; storage, except maybe for a little tuning in some data structures or parameters. Semantic repository implementors on the other hand say that when they tried putting triples inside an RDB it worked so poorly that they did everything from scratch. (It is a geekly penchant to do things from scratch, but then this is not always unjustified.)&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1cf1e620&quot;&gt;OpenLink Software&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1cfbc1d8&quot;&gt;Virtuoso&lt;/a&gt; are in agreement with both sides, contradictory as this might sound. We took our &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1e1f6a20&quot;&gt;RDBMS&lt;/a&gt; and added data types and structures and cost model alterations to an existing platform. Oracle did the same. MonetDB considers doing this and time will tell the extent of their RDF-oriented alterations. Right now the estimate is that this will be small and not in the kernel.&lt;/p&gt; &lt;p&gt;I would say with confidence that without source code access to the RDB, RDF will not be particularly convenient or efficient to accommodate. With source access, we found that what serves RDB also serves RDF. For example, execution engine and data compression considerations are the same, with minimal tweaks for RDF&amp;#39;s run time typing needs.&lt;/p&gt; &lt;p&gt;So now we are founding a platform for continuing this discussion. There will be workshops and calls for papers and the beginnings of a research community.&lt;/p&gt; &lt;p&gt;After the initial meeting at CWI, I tried to figure what the difference was between the databaser and semanticist minds. Really, the things are close but there is still a disconnect. Database is about big sets and semantics is about individuals, maybe. The databaser discovers that the operation on each member of the set is not always the same, and the semanticist discovers that the operation on each member of the set is often the same.&lt;/p&gt; &lt;p&gt;So the semanticist says that big joins take time. The databaser tells the semanticist not to repeat what&amp;#39;s been obvious for 40 years and for which there is anything from partitioned hashes to merges to various vectored execution models. Not to mention columns.&lt;/p&gt; &lt;p&gt;Spiros of VU Amsterdam/LarKC says that map-reduce materializes inferential closure really fast. Lefteris of CWI says that while he is not a semantic person, he does not understand what the point of all this materializing is, nobody is asking the question, right? So why answer? I say that computing inferential closure is a semanticist tradition; this is just what they do. Atanas Kiryakov of Ontotext says that this is not just a tradition whose start and justification is in the forgotten mists of history, but actually a clear and present need; just look at all the joining you would need.&lt;/p&gt; &lt;p&gt;Michael Witbrock of CYC says that it is not about forward or backward inference on toy rule sets, but that both will be needed and on massively bigger rule sets at that. Further, there can be machine learning to direct the inference, doing the meta-reasoning merged with the reasoning itself.&lt;/p&gt; &lt;p&gt;I say that there is nothing wrong with materialization if it is guided by need, in the vein of memo-ization or cracking or recycling as is done in MonetDB. Do the work when it is needed, and do not do it again.&lt;/p&gt; &lt;p&gt;Brian Thompson of Systap/Bigdata asks whether it is not a contradiction in terms to both want pluggability and merging inference into the data, like LarKC would be doing. I say that this is difficult but not impossible and that when you run joins in a cluster database, as you decide based on the data where the next join step will be, so it will be with inference. Right there, between join steps, integrated with whatever data partitioning logic you have, for partitioning you &lt;i&gt;will&lt;/i&gt; have, data being bigger and bigger. And if you have reuse of intermediates and demand driven indexing &lt;i&gt;à la&lt;/i&gt; MonetDB, this too integrates and applies to inference results.&lt;/p&gt; &lt;p&gt;So then, LarKC and CYC, can you picture a pluggable inference interface at this level of granularity? So far, I have received some more detail as to the needs of inference and database integration, essentially validating our previous intuitions and plans.&lt;/p&gt; &lt;p&gt;Aside talking of inference, we have the more immediate issue of creating an industry out of the semantic data management offerings of today.&lt;/p&gt; &lt;p&gt;What do we need for this? We need close-to-parity with relational — doing your warehouse in RDF with the attendant agility thereof can&amp;#39;t cost 10x more to deploy than the equivalent relational solution.&lt;/p&gt; &lt;p&gt;We also want to tell the key-value, anti-&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x172e8c80&quot;&gt;SQL&lt;/a&gt; people, who throw away transactions and queries, that there is a better way. And for this, we need to improve our gig just a little bit. Then you have the union of some level of &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1e0de2e8&quot;&gt;ACID&lt;/a&gt;, at least consistent read, availability, complex query, large scale.&lt;/p&gt; &lt;p&gt;And to do this, we need a benchmark. It needs a differentiation of online queries and browsing and analytics, graph algorithms and such. We are getting there. We will soon propose a social web benchmark for RDF which has both online and analytical aspects, a data generator, a test driver, and so on, with a &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1e3cb130&quot;&gt;TPC&lt;/a&gt;-style set of rules. If there is agreement on this, we will all get a few times faster. At this point, RDF will be a lot more competitive with mainstream and we will cross another qualitative threshold. &lt;/p&gt;</atom:content>
  <atom:updated>2010-03-22T12:34:40.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SemData@Sofia Roundtable write-up</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2010-03-15#1614</atom:id>
  <atom:published>2010-03-15T14:46:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;There was last week an &lt;a href=&quot;http://www.semdata.org/&quot; id=&quot;link-id11a83cf98&quot;&gt;invitation-based roundtable&lt;/a&gt; about semantic &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d5ae638&quot;&gt;data&lt;/a&gt; management in &lt;a href=&quot;http://www.dbpedia.org/resource/Sofia&quot; id=&quot;link-id0x1c147340&quot;&gt;Sofia, Bulgaria&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Lots of smart people together. The meeting was hosted by &lt;a href=&quot;http://dbpedia.org/resource/Ontotext&quot; id=&quot;link-id0x1c77a6e8&quot;&gt;Ontotext&lt;/a&gt; and chaired by &lt;a href=&quot;http://www.dbpedia.org/resource/Dieter_Fensel&quot; id=&quot;link-id0x1e64f350&quot;&gt;Dieter Fensel&lt;/a&gt;. On the database side we had Ontotext, &lt;a href=&quot;http://www.systap.com/&quot; id=&quot;link-id0x1cc261c8&quot;&gt;SYSTAP&lt;/a&gt; (&lt;a href=&quot;http://www.systap.com/bigdata.htm&quot; id=&quot;link-id0x1dad5348&quot;&gt;Bigdata&lt;/a&gt;), &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x1d3b68f8&quot;&gt;CWI&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x1dba4028&quot;&gt;MonetDB&lt;/a&gt;), &lt;a href=&quot;http://www.dbpedia.org/resource/Karlsruhe_Institute_of_Technology&quot; id=&quot;link-id0x1a01f668&quot;&gt;Karlsruhe Institute of Technology&lt;/a&gt; (YARS2/&lt;a href=&quot;http://swse.deri.ie/&quot; id=&quot;link-id0x1ceeed50&quot;&gt;SWSE&lt;/a&gt;). &lt;a href=&quot;http://www.larkc.eu/&quot; id=&quot;link-id0x1e650c98&quot;&gt;LarKC&lt;/a&gt; was well represented, being our hosts, with STI, Ontotext, CYC, and &lt;a href=&quot;http://www.vu.nl/&quot; id=&quot;link-id0x1ca044f0&quot;&gt;VU Amsterdam&lt;/a&gt;. Notable absences were &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1b9e5418&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://freebase.com/guid/9202a8c04000641f8000000005c908d6&quot; id=&quot;link-id0x1e55adc8&quot;&gt;Garlik&lt;/a&gt;, &lt;a href=&quot;http://semanticweb.org/id/Franz_Inc&quot; id=&quot;link-id0x1cf1d4b8&quot;&gt;Franz&lt;/a&gt;, and &lt;a href=&quot;http://www.talis.com/&quot; id=&quot;link-id0x1cbb8740&quot;&gt;Talis&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Now of semantic data management... What is the difference between a relational database and a semantic repository, a triple/quad store, a whatever-you-call-them?&lt;/p&gt; &lt;p&gt;I had last fall a meeting at CWI with Martin Kersten, Peter Boncz and Lefteris Sidirourgos from CWI, and Frank van Harmelen and Spiros Kotoulas of VU Amsterdam, to start a dialogue between semanticists and databasers. Here we were with many more people trying to discover what the case might be. What are the differences?&lt;/p&gt; &lt;p&gt;Michael &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x1e7b3080&quot;&gt;Stonebraker&lt;/a&gt; and Martin Kersten have basically said that what is sauce for the goose is sauce for the gander, and that there is no real difference between relational DB and &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1dba61f8&quot;&gt;RDF&lt;/a&gt; storage, except maybe for a little tuning in some data structures or parameters. Semantic repository implementors on the other hand say that when they tried putting triples inside an RDB it worked so poorly that they did everything from scratch. (It is a geekly penchant to do things from scratch, but then this is not always unjustified.)&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1cf45d00&quot;&gt;OpenLink Software&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1d8b3ac0&quot;&gt;Virtuoso&lt;/a&gt; are in agreement with both sides, contradictory as this might sound. We took our &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1d51e110&quot;&gt;RDBMS&lt;/a&gt; and added data types and structures and cost model alterations to an existing platform. Oracle did the same. MonetDB considers doing this and time will tell the extent of their RDF-oriented alterations. Right now the estimate is that this will be small and not in the kernel.&lt;/p&gt; &lt;p&gt;I would say with confidence that without source code access to the RDB, RDF will not be particularly convenient or efficient to accommodate. With source access, we found that what serves RDB also serves RDF. For example, execution engine and data compression considerations are the same, with minimal tweaks for RDF&amp;#39;s run time typing needs.&lt;/p&gt; &lt;p&gt;So now we are founding a platform for continuing this discussion. There will be workshops and calls for papers and the beginnings of a research community.&lt;/p&gt; &lt;p&gt;After the initial meeting at CWI, I tried to figure what the difference was between the databaser and semanticist minds. Really, the things are close but there is still a disconnect. Database is about big sets and semantics is about individuals, maybe. The databaser discovers that the operation on each member of the set is not always the same, and the semanticist discovers that the operation on each member of the set is often the same.&lt;/p&gt; &lt;p&gt;So the semanticist says that big joins take time. The databaser tells the semanticist not to repeat what&amp;#39;s been obvious for 40 years and for which there is anything from partitioned hashes to merges to various vectored execution models. Not to mention columns.&lt;/p&gt; &lt;p&gt;Spiros of VU Amsterdam/LarKC says that map-reduce materializes inferential closure really fast. Lefteris of CWI says that while he is not a semantic person, he does not understand what the point of all this materializing is, nobody is asking the question, right? So why answer? I say that computing inferential closure is a semanticist tradition; this is just what they do. Atanas Kiryakov of Ontotext says that this is not just a tradition whose start and justification is in the forgotten mists of history, but actually a clear and present need; just look at all the joining you would need.&lt;/p&gt; &lt;p&gt;Michael Witbrock of CYC says that it is not about forward or backward inference on toy rule sets, but that both will be needed and on massively bigger rule sets at that. Further, there can be machine learning to direct the inference, doing the meta-reasoning merged with the reasoning itself.&lt;/p&gt; &lt;p&gt;I say that there is nothing wrong with materialization if it is guided by need, in the vein of memo-ization or cracking or recycling as is done in MonetDB. Do the work when it is needed, and do not do it again.&lt;/p&gt; &lt;p&gt;Brian Thompson of Systap/Bigdata asks whether it is not a contradiction in terms to both want pluggability and merging inference into the data, like LarKC would be doing. I say that this is difficult but not impossible and that when you run joins in a cluster database, as you decide based on the data where the next join step will be, so it will be with inference. Right there, between join steps, integrated with whatever data partitioning logic you have, for partitioning you &lt;i&gt;will&lt;/i&gt; have, data being bigger and bigger. And if you have reuse of intermediates and demand driven indexing &lt;i&gt;à la&lt;/i&gt; MonetDB, this too integrates and applies to inference results.&lt;/p&gt; &lt;p&gt;So then, LarKC and CYC, can you picture a pluggable inference interface at this level of granularity? So far, I have received some more detail as to the needs of inference and database integration, essentially validating our previous intuitions and plans.&lt;/p&gt; &lt;p&gt;Aside talking of inference, we have the more immediate issue of creating an industry out of the semantic data management offerings of today.&lt;/p&gt; &lt;p&gt;What do we need for this? We need close-to-parity with relational — doing your warehouse in RDF with the attendant agility thereof can&amp;#39;t cost 10x more to deploy than the equivalent relational solution.&lt;/p&gt; &lt;p&gt;We also want to tell the key-value, anti-&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1cbeaf70&quot;&gt;SQL&lt;/a&gt; people, who throw away transactions and queries, that there is a better way. And for this, we need to improve our gig just a little bit. Then you have the union of some level of &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x1e11fbd0&quot;&gt;ACID&lt;/a&gt;, at least consistent read, availability, complex query, large scale.&lt;/p&gt; &lt;p&gt;And to do this, we need a benchmark. It needs a differentiation of online queries and browsing and analytics, graph algorithms and such. We are getting there. We will soon propose a social web benchmark for RDF which has both online and analytical aspects, a data generator, a test driver, and so on, with a &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x1a950de0&quot;&gt;TPC&lt;/a&gt;-style set of rules. If there is agreement on this, we will all get a few times faster. At this point, RDF will be a lot more competitive with mainstream and we will cross another qualitative threshold. &lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:29:59.615038-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>URIBurner: Painless Generation &amp; Exploitation of Linked Data (Update 1 - Demo Links Added)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-03-10#1613</atom:id>
  <atom:published>2010-03-10T17:52:03Z</atom:published>
  <atom:content type="html">&lt;h2&gt;What is URIBurner? &lt;/h2&gt; &lt;p&gt;A service from &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id11a8a2768&quot;&gt;OpenLink Software&lt;/a&gt;, available at: &lt;a href=&quot;http://uriburner.com&quot; id=&quot;link-id11ace9988&quot;&gt;http://uriburner.com&lt;/a&gt;, that enables anyone to generate structured descriptions -on the fly- for resources that are already published to HTTP based networks. These descriptions exist as hypermedia resource representations where links are used to identify: &lt;/p&gt; &lt;ul&gt; &lt;li&gt; the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id11ae10768&quot;&gt;entity&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; object or datum) being described,&lt;/li&gt; &lt;li&gt;each of its attributes, and&lt;/li&gt; &lt;li&gt;each of its attributes values (optionally).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The hypermedia resource representation outlined above is what is commonly known as an &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id121aec368&quot;&gt;Entity&lt;/a&gt;-Attribute-Value (EAV) Graph. The use of generic HTTP scheme based Identifiers is what distinguishes this type of hypermedia resource from others.&lt;/p&gt; &lt;h2&gt;Why is it Important?&lt;/h2&gt; &lt;p&gt; The virtues (dual pronged serendipitous discovery) of publishing HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11f5f53e8&quot;&gt;Linked Data&lt;/a&gt; across public (&lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id11b14e1f8&quot;&gt;World Wide Web&lt;/a&gt;) or private (Intranets and/or Extranets) is rapidly becoming clearer to everyone. That said, the nuance laced nature of Linked Data publishing presents significant challenges to most. Thus, for Linked Data to really blossom the process of publishing needs to be simplified i.e., &amp;quot;just click and go&amp;quot; (for human interaction) or REST-ful orchestration of HTTP CRUD (Create, Read, Update, Delete) operations between Client Applications and Linked Data Servers.&lt;/p&gt; &lt;h2&gt;How Do I Use It?&lt;/h2&gt; &lt;p&gt; In similar vane to the role played by FeedBurner with regards to Atom and RSS feed generation, during the early stages of the Blogosphere, it enables anyone to publish Linked Data bearing hypermedia resources on an HTTP network. Thus, its usage covers two profiles: Content Publisher and Content Consumer. &lt;/p&gt; &lt;h3&gt; &lt;/h3&gt; &lt;h3&gt;Content Publisher &lt;/h3&gt; &lt;h3&gt; &lt;/h3&gt; &lt;p&gt;The steps that follow cover all you need to do:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;place a &lt;link /&gt; &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id11a62f908&quot;&gt;tag&lt;/a&gt; within your HTTP based hypermedia resource (e.g. within section for HTML )&lt;/li&gt; &lt;li&gt;use a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id11e7e5228&quot;&gt;URL&lt;/a&gt; via the @href attribute value to identify the location of the structured description of your resource, in this case it takes the form: http://linkeddata.uriburner.com/about/id/{scheme-or-protocol}/{your-hostname-or-authority}/{your-local-resource}&lt;/li&gt; &lt;li&gt;for human visibility you may consider adding associating a button (as you do with Atom and RSS) with the URL above.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; That&amp;#39;s it! The discoverability (SDQ) of your content has just multiplied significantly, its structured description is now part of the Linked Data Cloud with a reference back to your site (which is now a bona fide HTTP based Linked Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id120a6e5c8&quot;&gt;Space&lt;/a&gt;).&lt;/p&gt; &lt;h4&gt;Examples&lt;/h4&gt; &lt;p&gt; &lt;strong&gt;HTML+&lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id11ae8fdc8&quot;&gt;RDFa&lt;/a&gt; based representation of a structured resource description:&lt;/strong&gt; &lt;/p&gt; &lt;blockquote&gt; &amp;lt;link rel=&amp;quot;describedby&amp;quot; title=&amp;quot;Resource Description (HTML)&amp;quot;type=&amp;quot;text/html&amp;quot; href=&amp;quot;http://linkeddata.uriburner.com/about/id/http/example.org/xyz.html&amp;quot;/&amp;gt;&lt;/blockquote&gt; &lt;p&gt; &lt;strong&gt;JSON based representation of a structured resource description:&lt;/strong&gt; &lt;/p&gt; &lt;blockquote&gt;&amp;lt;link rel=&amp;quot;describedby&amp;quot; title=&amp;quot;Resource Description (JSON)&amp;quot; type=&amp;quot;application/json&amp;quot; href=&amp;quot;http://linkeddata.uriburner.com/about/id/http/example.org/xyz.html&amp;quot;/&amp;gt;&lt;/blockquote&gt; &lt;p&gt; &lt;strong&gt;N3 based representation of a structured resource description:&lt;/strong&gt; &lt;/p&gt; &lt;blockquote&gt;&amp;lt;link rel=&amp;quot;describedby&amp;quot; title=&amp;quot;Resource Description (N3)&amp;quot; type=&amp;quot;text/n3&amp;quot; href=&amp;quot;http://linkeddata.uriburner.com/about/id/http/example.org/xyz.html&amp;quot;/&amp;gt;&lt;/blockquote&gt; &lt;p&gt; &lt;strong&gt;RDF/XML based representations of a structured resource description&lt;/strong&gt;: &lt;/p&gt; &lt;blockquote&gt;&amp;lt;link rel=&amp;quot;describedby&amp;quot; title=&amp;quot;Resource Description (RDF/XML)&amp;quot; type=&amp;quot;application/rdf+xml&amp;quot; href=&amp;quot;http://linkeddata.uriburner.com/about/id/http/example.org/xyz.html&amp;quot;/&amp;gt;&lt;/blockquote&gt; &lt;h3&gt;Content Consumer&lt;/h3&gt; &lt;p&gt;As an end-user, obtaining a structured description of any resource published to an HTTP network boils down to the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;go to: http://uriburner.com&lt;/li&gt; &lt;li&gt;drag the Page Metadata Bookmarklet link to your Browser&amp;#39;s toolbar&lt;/li&gt; &lt;li&gt;whenever you encounter a resource of interest (e.g. an HTML page) simply click on the Bookmarklet&lt;/li&gt; &lt;li&gt;you will be presented with an HTML representation of a structured resource description (i.e., identifier of the entity being described, its attributes, and its attribute values will be clearly presented).&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Examples&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/www.amazon.com/o/ASIN/1591842778&quot; id=&quot;link-id11ba54a48&quot;&gt;Description of a Book culled from an Amazon web page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/www.bestbuy.com/site/Flip+Video+-+UltraHD+Camcorder+-+Black/Chrome/9281984.p?id=1218073822126&amp;amp;skuId=9281984&quot; id=&quot;link-id11f621848&quot;&gt;Description of a product offering culled from a BestBuy web page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/reviews.cnet.com/digital-cameras/canon-eos-5d-mark/4505-6501_7-33280763.html?tag=tpr&quot; id=&quot;link-id115f27e08&quot;&gt;Description of a product (a camera) culled from a CNET web page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/cgi.ebay.com/23PORT-Canon-SLR-EOS-5D-Mark-II-Body-Only-New_W0QQitemZ140367785136QQcategoryZ31388QQcmdZViewItem#Offer&quot; id=&quot;link-id120b4b258&quot;&gt;Description of the same CNET product as an Offer on eBay&lt;/a&gt; (exposed by the description above via seeAlso property value).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;If you are a developer, you can simply perform an HTTP operation request (from your development environment of choice) using any of the URL patterns presented below:&lt;/p&gt; &lt;a id=&quot;HTML:&quot;&gt; &lt;/a&gt;&lt;strong&gt;HTML: &lt;/strong&gt; &lt;ul&gt; &lt;li&gt; &lt;tt&gt;curl -I -H &amp;quot;Accept: text/html&amp;quot; http://linkeddata.uriburner.com/about/id/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h4&gt; &lt;a id=&quot;JSON:&quot;&gt; &lt;/a&gt;JSON:&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;tt&gt;curl -I -H &amp;quot;Accept: application/json&amp;quot; http://linkeddata.uriburner.com/about/id/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;li&gt; &lt;tt&gt;curl http://linkeddata.uriburner.com/about/data/json/{scheme}/{authority}/{local-path}&lt;/tt&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h4&gt; &lt;a id=&quot;Notation_3_N3:&quot;&gt; &lt;/a&gt;Notation 3 (N3):&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;tt&gt;curl -I -H &amp;quot;Accept: text/n3&amp;quot; http://linkeddata.uriburner.com/about/id/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;li&gt; &lt;tt&gt;curl http://linkeddata.uriburner.com/about/data/n3/{scheme}/{authority}/{local-path}&lt;/tt&gt; &lt;/li&gt; &lt;/ul&gt; &lt;ul&gt; &lt;li&gt; &lt;tt&gt;curl -I -H &amp;quot;Accept: text/turtle&amp;quot; http://linkeddata.uriburner.com/about/id/{scheme}/{authority}/{local-path}&lt;/tt&gt; &lt;/li&gt; &lt;li&gt; &lt;tt&gt;curl http://linkeddata.uriburner.com/about/data/ttl/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h4&gt; &lt;a id=&quot;RDFXML:&quot;&gt; &lt;/a&gt;RDF/XML:&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;tt&gt;curl -I -H &amp;quot;Accept: application/rdf+xml&amp;quot; http://linkeddata.uriburner.com/about/id/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;li&gt; &lt;tt&gt;curl http://linkeddata.uriburner.com/about/data/xml/{scheme}/{authority}/{local-path} &lt;/tt&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Conclusion&lt;/h2&gt; &lt;p&gt;URIBurner is a &amp;quot;deceptively simple&amp;quot; solution for cost-effective exploitation of HTTP based Linked Data meshes. It doesn&amp;#39;t require any programming or customization en route to immediately realizing its virtues. &lt;/p&gt; &lt;p&gt; If you like what URIBurner offers, but prefer to leverage its capabilities within your domain -- such that resource description URLs reside in your domain, all you have to do is perform the following steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://download.openlinksw.com/virtwiz/&quot; id=&quot;link-id1158f8658&quot;&gt;download a copy of Virtuoso&lt;/a&gt; (for local desktop, workgroup, or data center installation) or&lt;/li&gt; &lt;li&gt;instantiate &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtInstallationEC2&quot; id=&quot;link-id11e03e558&quot;&gt;Virtuoso via the Amazon EC2 Cloud&lt;/a&gt; &lt;/li&gt; &lt;li&gt;enable the Sponger Middleware component via the RDF Mapper VAD package (which includes &lt;a href=&quot;http://www.openlinksw.com/dataspace/dav/wiki/Main/VirtSpongerCartridgeSupportedDataSources&quot; id=&quot;link-id1205ffe78&quot;&gt;cartridges for over 30 different resources types&lt;/a&gt;)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;When you install your own URIBurner instances, you also have the ability to perform customizations that increase resource description fidelity in line with your specific needs. All you need to do is develop a custom extractor cartridge and/or meta cartridge. &lt;/p&gt; &lt;h2&gt;Related:&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; id=&quot;link-id120582118&quot;&gt; Virtuoso Sponger Middleware&lt;/a&gt; -- (technology behind &lt;a href=&quot;http://uriburner.com&quot; id=&quot;link-id11b634448&quot;&gt;URIBurner Service&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/screencasts/virtuoso-rdf-middleware3.swf&quot; id=&quot;link-id12082e958&quot;&gt;Animation demonstrating how the Virtuoso Sponger works&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-11T10:16:34.000003-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Meshups Demonstrating How SPARQL-GEO Enhances Linked Data Exploitation (Update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-03-06#1612</atom:id>
  <atom:published>2010-03-06T22:43:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;Deceptively simple demonstrations of how &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11dfe45b8&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id11a3d8968&quot;&gt;SPARQL&lt;/a&gt;-GEO extensions to SPARQL lay critical foundation for Geo Spatial solutions that seek to leverage the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11ae855b8&quot;&gt;Linked Data&lt;/a&gt;. &lt;/p&gt; &lt;h3&gt;Setup &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id120a6f478&quot;&gt;Information&lt;/a&gt; &lt;/h3&gt; &lt;p&gt;SPARQL Endpoint: &lt;a href=&quot;http://lod.openlinksw.com/sparql&quot; id=&quot;link-id120401958&quot;&gt;Linked Open Data Cache&lt;/a&gt; (8.5 Billion+ Quad Store which includes data from Geonames and the &lt;a href=&quot;http://dl-learner.org/Projects/LinkedGeoData&quot; id=&quot;link-id11b8f31d8&quot;&gt;Linked GeoData Project&lt;/a&gt; Data Sets) .&lt;/p&gt; &lt;h3&gt;Live Linked Data Meshup Links:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://bit.ly/cyJjwo&quot; id=&quot;link-id120396168&quot;&gt;LinkedGeoData things within 2km ORDER BY Dist LIMIT 10 &lt;/a&gt;(Use from &lt;strong&gt;iPhone&lt;/strong&gt; only since its an iPhone oriented Linked Data driven application)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uriburner.com/isparql/view/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX%20lgv%3A%20%3Chttp%3A%2F%2Flinkedgeodata.org%2Fvocabulary%23%3E%0Aconstruct%20%7B%3Fthing%20a%20%3Ftype%3B%0A%20geo%3Ageometry%20%3Fgeo%3B%0A%20foaf%3Aname%20%3Fname%7D%0Awhere%20%7B%0A%3Fthing%20geo%3Ageometry%20%3Fgeo%20.%0A%3Fthing%20lgv%3Aname%20%3Fname%20.%0A%3Fthing%20a%20%3Ftype.%0AFILTER%20%28bif%3Ast_intersects%20%28%3Fgeo%2C%20bif%3Ast_point%20%28-0.128056%2C%2051.508057%29%2C%202%29%29%0A%7D%0ALIMIT%20100&amp;amp;endpoint=http://lod.openlinksw.com/sparql&amp;amp;resultview=map&amp;amp;maxrows=50&quot; id=&quot;link-id1209a6f38&quot;&gt;LinkedGeoData things within 2km of Trafalgar Square&lt;/a&gt; | &lt;a href=&quot;http://uriburner.com/isparql/view/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX%20lgv%3A%20%3Chttp%3A%2F%2Flinkedgeodata.org%2Fvocabulary%23%3E%0Aconstruct%20%7B%0A%20%3Fthing%20rdfs%3Atype%20%3Ftype%3B%0A%20geo%3Ageometry%20%3Fgeo%3B%0A%20foaf%3Aname%20%3Fname%7D%0Awhere%20%7B%0A%20%3Fthing%20geo%3Ageometry%20%3Fgeo%20.%0A%20%3Fthing%20lgv%3Aname%20%3Fname%20.%0A%20%3Fthing%20a%20%3Ftype.%0AFILTER%20(bif%3Ast_intersects%20(%3Fgeo%2C%20bif%3Ast_point%20(-0.128056%2C%2051.508057)%2C%202))%0A%7D%0Aorder%20by%20asc%20(bif%3Ast_distance%20(%3Fgeo%2C%20bif%3Ast_point%20(-0.128056%2C%2051.508057)))%0ALIMIT%20100&amp;amp;endpoint=http://lod.openlinksw.com/sparql&amp;amp;resultview=map&amp;amp;maxrows=50&quot; id=&quot;link-id11ebb07f8&quot;&gt;ORDER By Distance - closest first&lt;/a&gt; | &lt;a href=&quot;http://uriburner.com/isparql/view/?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX%20lgv%3A%20%3Chttp%3A%2F%2Flinkedgeodata.org%2Fvocabulary%23%3E%0Aconstruct%20%7B%0A%20%3Fthing%20rdfs%3Atype%20%3Ftype%3B%0A%20geo%3Ageometry%20%3Fgeo%3B%0A%20foaf%3Aname%20%3Fname%7D%0Awhere%20%7B%0A%20%3Fthing%20geo%3Ageometry%20%3Fgeo%20.%0A%20%3Fthing%20lgv%3Aname%20%3Fname%20.%0A%20%3Fthing%20a%20%3Ftype.%0AFILTER%20(bif%3Ast_intersects%20(%3Fgeo%2C%20bif%3Ast_point%20(-0.128056%2C%2051.508057)%2C%202))%0A%7D%0Aorder%20by%20desc%20(bif%3Ast_distance%20(%3Fgeo%2C%20bif%3Ast_point%20(-0.128056%2C%2051.508057)))%0ALIMIT%20100&amp;amp;endpoint=http://lod.openlinksw.com/sparql&amp;amp;resultview=map&amp;amp;maxrows=50&quot; id=&quot;link-id1207a27e8&quot;&gt;ORDER By Distance - most distant first&lt;/a&gt; .&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://delicious.com/kidehen/linked_data_demo&quot; id=&quot;link-id11ac9a2a8&quot;&gt;Collection of Live Linked Data Demos&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1587&quot; id=&quot;link-id11aca1d68&quot;&gt;Virtuoso&amp;#39;s SPARQL-GEO Extensions&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-24T11:44:24.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Revisiting HTTP based Linked Data (Update 1 - Demo Video Links Added)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-03-04#1611</atom:id>
  <atom:published>2010-03-04T15:16:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;Motivation for this post arose from a series of Twitter exchanges between &lt;a href=&quot;http://ouseful.wordpress.com/about/#this&quot; id=&quot;link-id115699ae8&quot;&gt;Tony Hirst&lt;/a&gt; and I, in relation to his &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id11a0cbc08&quot;&gt;blog&lt;/a&gt; post titled: &lt;a href=&quot;http://ouseful.wordpress.com/2010/03/03/so-what-is-it-about-linked-data-that-makes-it-linked-data%e2%84%a2/&quot; id=&quot;link-id1158f8ce8&quot;&gt;So What Is It About Linked Data that Makes it Linked Data™ ?&lt;/a&gt; &lt;/p&gt; &lt;p&gt;At the end of the marathon session, it was clear to &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id11557da58&quot;&gt;me&lt;/a&gt; that a blog post was required for future reference, at the very least :-)&lt;/p&gt; &lt;h3&gt;What is &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11a7ee3a8&quot;&gt;Linked Data&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;&amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id11a682338&quot;&gt;Data Access by Reference&lt;/a&gt;&amp;quot; mechanism for Data Objects (or Entities) on HTTP networks. It enables you to Identify a Data Object and Access its structured Data Representation via a single Generic HTTP scheme based Identifier (HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id125037288&quot;&gt;URI&lt;/a&gt;). Data Object representation formats may vary; but in all cases, they are &lt;a href=&quot;http://dbpedia.org/resource/Hypermedia&quot; id=&quot;link-id115548f78&quot;&gt;hypermedia&lt;/a&gt; oriented, fully structured, and negotiable within the &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id11c955888&quot;&gt;context&lt;/a&gt; of a client-server message exchange.&lt;/p&gt; &lt;h3&gt;Why is it Important?&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id125154778&quot;&gt;Information&lt;/a&gt; makes the world tick!&lt;/p&gt; &lt;p&gt;Information doesn&amp;#39;t exist without data to contextualize.&lt;/p&gt; &lt;p&gt;Information is inaccessible without a projection (presentation) medium. &lt;/p&gt; &lt;p&gt;All information (without exception, when produced by humans) is subjective. Thus, to truly maximize the innate heterogeneity of collective human intelligence, loose coupling of our information and associated data sources is imperative.&lt;/p&gt; &lt;h3&gt;How is Linked Data Delivered?&lt;/h3&gt; &lt;p&gt;Linked Data is exposed to HTTP networks (e.g. &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id125321238&quot;&gt;World Wide Web&lt;/a&gt;) via hypermedia resources bearing structured representations of data object descriptions. Remember, you have a single Identifier abstraction (generic HTTP URI) that embodies: Data Object Name and Data Representation Location (aka &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id1249a7a88&quot;&gt;URL&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;How are Linked Data Object Representations Structured?&lt;/h3&gt; &lt;p&gt;A structured representation of data exists when an &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1250630d8&quot;&gt;Entity&lt;/a&gt; (Datum), its Attributes, and its Attribute Values are clearly discernible. In the case of a Linked Data Object, structured descriptions take the form of a hypermedia based &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id126ed7608&quot;&gt;Entity&lt;/a&gt;-Attribute-Value (EAV) graph pictorial -- where each Entity, its Attributes, and its Attribute Values (optionally) are identified using Generic HTTP URIs. &lt;/p&gt; &lt;p&gt;Examples of structured data representation formats (content types) associated with Linked Data Objects include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;text/html&lt;/li&gt; &lt;li&gt;text/turtle&lt;/li&gt; &lt;li&gt;text/n3&lt;/li&gt; &lt;li&gt;application/json&lt;/li&gt; &lt;li&gt;application/rdf+xml&lt;/li&gt; &lt;li&gt;Others &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;How Do I Create Linked Data oriented Hypermedia Resources?&lt;/h3&gt; &lt;p&gt;You markup resources by expressing distinct entity-attribute-value statements (basically these a 3-tuple records) using a variety of notations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;(X)HTML+&lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id1252975b8&quot;&gt;RDFa&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://n2.talis.com/wiki/RDF_JSON_Specification&quot; id=&quot;link-id115015458&quot;&gt;JSON&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.dajobe.org/2004/01/turtle/&quot; id=&quot;link-id116458478&quot;&gt;Turtle&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/DesignIssues/Notation3&quot; id=&quot;link-id11a62f9f8&quot;&gt;N3&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://swdev.nokia.com/trix/trix.html&quot; id=&quot;link-id11a8f56b8&quot;&gt;TriX&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/TriG/&quot; id=&quot;link-id117156978&quot;&gt;TriG&lt;/a&gt;,&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/TR/REC-rdf-syntax/&quot; id=&quot;link-id126f52a58&quot;&gt;RDF/XML&lt;/a&gt;, and&lt;/li&gt; &lt;li&gt;Others (for instance you can use Atom data format extensions to model EAV graph as per OData initiative from Microsoft).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;You can achieve this task using any of the following approaches:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Notepad&lt;/li&gt; &lt;li&gt;WYSIWYG Editor &lt;/li&gt; &lt;li&gt;Transformation of Database Records via Middleware&lt;/li&gt; &lt;li&gt;Transformation of XML based &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Services output via Middleware&lt;/li&gt; &lt;li&gt;Transformation of other Hypermedia Resources via Middleware&lt;/li&gt; &lt;li&gt;Transformation of non Hypermedia Resources via Middleware&lt;/li&gt; &lt;li&gt;Use a platform that delivers all of the above.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Practical Examples of Linked Data Objects Enable&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Describe Who You Are, What You Offer, and What You Need via your structured profile, then leave your HTTP network to perform the REST (serendipitous discovery of relevant things)&lt;/li&gt; &lt;li&gt;Identify (via map overlay) all items of interest based on a 2km+ radious of my current location (this could include vendor offerings or services sought by existing or future customers)&lt;/li&gt; &lt;li&gt;Share the latest and greatest family photos with family members *only* without forcing them to signup for Yet Another Web 2.0 service or Social Network&lt;/li&gt; &lt;li&gt;No repetitive signup and username and password based login sequences per Web 2.0 or Mobile Application combo&lt;/li&gt; &lt;li&gt;Going beyond imprecise Keyword Search to the new frontier of Precision Find - Example, Find Data Objects associated with the keywords: Tiger, while enabling the seeker disambiguate across the &amp;quot;Who&amp;quot;, &amp;quot;What&amp;quot;, &amp;quot;Where&amp;quot;, &amp;quot;When&amp;quot; dimensions (with negation capability)&lt;/li&gt; &lt;li&gt;Determine how two Data Objects are Connected - person to person, person to subject matter etc. (LinkedIn outside the walled garden)&lt;/li&gt; &lt;li&gt;Use any resource address (e.g &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id124fd8118&quot;&gt;blog&lt;/a&gt; or bookmark URL) as the conduit into a Data Object mesh that exposes all associated Entities and their social network relationships&lt;/li&gt; &lt;li&gt;Apply patterns (social dimensions) above to traditional enterprise data sources in combination (optionally) with external data without compromising security etc.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;How Do &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id124fd0d98&quot;&gt;OpenLink Software&lt;/a&gt; Products Enable Linked Data Exploitation?&lt;/h3&gt; &lt;p&gt;Our data access middleware heritage (which spans 16+ years) has enabled us to assemble a rich portfolio of coherently integrated products that enable cost-effective evaluation and utilization of Linked Data, without writing a single line of code, or exposing you to the hidden, but extensive admin and configuration costs. Post installation, the benefits of Linked Data simply materialize (along the lines described above).&lt;/p&gt; &lt;p&gt;Our main Linked Data oriented products include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id125058d68&quot;&gt;OpenLink Data Explorer&lt;/a&gt; -- visualizes Linked Data or Linked Data transformed &amp;quot;on the fly&amp;quot; from hypermedia and non hypermedia data sources &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uriburner.com&quot; id=&quot;link-id1251db6a8&quot;&gt;URIBurner&lt;/a&gt; -- a &amp;quot;deceptively simple&amp;quot; solution that enables the generation of Linked Data &amp;quot;on the fly&amp;quot; from a broad collection of data sources and resource types&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://ods.openlinksw.com/wiki/ODS/&quot; id=&quot;link-id1252caae8&quot;&gt;OpenLink Data Spaces&lt;/a&gt; -- a platform for enterprises and individuals that enhances distributed collaboration via Linked Data driven virtualization of data across its native and/or 3rd party content manager for: Blogs, Wikis, Shared Bookmarks, Discussion Forums, Social Networks etc&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/overview/index.htm&quot; id=&quot;link-id124809b58&quot;&gt;OpenLink Virtuoso&lt;/a&gt; -- a secure and high-performance native hybrid data server (Relational, RDF-Graph, Document models) that includes in-built Linked Data transformation middleware (aka. Sponger). &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.ietf.org/rfc/rfc2616.txt&quot; id=&quot;link-id125306d78&quot;&gt;Hypertext Transfer Protocol 1.1 RFC&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.odata.org/docs/%5BMC-APDSU%5D.htm#_Toc246716495&quot; id=&quot;link-id11c948e98&quot;&gt;Open Data Protocol Glossary&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id126fae278&quot;&gt;Simple Explanation of RDF and Linked Data Dynamics&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=linked%20data%0D%0A&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1252e0018&quot;&gt;Collection of post from the past about Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1584&quot; id=&quot;link-id124fefea8&quot;&gt;Are We There Yet Re. Web++?&lt;/a&gt; -- includes link to &lt;a href=&quot;http://itc.conversationsnetwork.org/shows/detail4233.html&quot; id=&quot;link-id125188078&quot;&gt;podcast conversation with Jon Udell&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.ted.com/talks/gary_flake_is_pivot_a_turning_point_for_web_exploration.html&quot; id=&quot;link-id11a501c28&quot;&gt;Web of Linked Data Pivoting Demo from TED&lt;/a&gt; -- by Microsoft&amp;#39;s Gary Flake &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=G29DBIEcIuQ&quot; id=&quot;link-id1204fff18&quot;&gt;Microsoft Pivot atop Virtuoso Quad Store&amp;#39;s Faceted Browser Engine&lt;/a&gt;-- My Demonstration of EAV model transcending data representation variations (i.e., RDF&amp;#39;s EAV data model data served up in Microsoft CXML data representation format). &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-08T09:59:37.000010-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data &amp; Socially Enhanced Collaboration (Enterprise or Individual) -- Update 1</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-03-02#1610</atom:id>
  <atom:published>2010-03-02T20:47:54Z</atom:published>
  <atom:content type="html">&lt;p&gt;Socially enhanced enterprise and invididual collaboration is becoming a focal point for a variety of solutions that offer erswhile distinct content managment features across the realms of Blogging, Wikis, Shared Bookmarks, Discussion Forums etc.. as part of an integrated platform suite. Recently, &lt;a href=&quot;http://www.socialtext.com/&quot; id=&quot;link-id112be850&quot;&gt;Socialtext&lt;/a&gt; has caught my attention courtesy of its nice &lt;a href=&quot;http://www.socialtext.com/products/socialnetworking.php&quot; id=&quot;link-id145d9850&quot;&gt;features and benefits page&lt;/a&gt; . In addition, I&amp;#39;ve also found the &lt;a href=&quot;http://mike2.openmethodology.org/&quot; id=&quot;link-id14103cc8&quot;&gt;Mike 2.0 portal&lt;/a&gt; immensely interesting and valuable, for those with an enterprise collaboration bent.&lt;/p&gt; &lt;p&gt;Anyway, Socialtext and Mike 2.0 (they aren&amp;#39;t identical and juxtaposition isn&amp;#39;t seeking to imply this) provide nice demonstrations of socially enhanced collaboration for individuals and/or enterprises is all about:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Identifying Yourself&lt;/li&gt; &lt;li&gt;Identifying Others (key contributors, peers, collaborators)&lt;/li&gt; &lt;li&gt;Serendipitous Discovery of key contributors, peers, and collaborators&lt;/li&gt; &lt;li&gt;Serendipitous Discovery by key contributors, peers, and collaborators&lt;/li&gt; &lt;li&gt;Develop and sustain relationships via socially enhanced professional network hybrid&lt;/li&gt; &lt;li&gt;Utilize your new &amp;quot;trusted network&amp;quot; (which you&amp;#39;ve personally indexed) when seeking help or propagating a &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id13ad00d0&quot;&gt;meme&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;As is typically the case in this emerging realm, the critical issue of discrete &amp;quot;identifiers&amp;quot; (record keys in sense) for &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; items, data containers, and data creators (individuals and groups) is overlooked albeit unintentionally. &lt;/p&gt; &lt;h3&gt;How HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id112e1ba8&quot;&gt;Linked Data&lt;/a&gt; Addresses the Identifier Issue&lt;/h3&gt; &lt;p&gt;Rather than using platform constrained identifiers such as: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;email address (a &amp;quot;mailto&amp;quot; scheme identifier), &lt;/li&gt; &lt;li&gt;a dbms user account, &lt;/li&gt; &lt;li&gt;application specific account, or&lt;/li&gt; &lt;li&gt;OpenID.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;It enables you to leverage the platform independence of HTTP scheme Identifiers (Generic URIs) such that Identifiers for: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;You, &lt;/li&gt; &lt;li&gt;Your Peers, &lt;/li&gt; &lt;li&gt;Your Groups, and &lt;/li&gt; &lt;li&gt;Your Activity Generated Data, &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;simply become conduits into a mesh of &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/images/My_Data_Spaces.png&quot; id=&quot;link-id13fe1168&quot;&gt;HTTP -- referencable and accessible -- Linked Data Objects&lt;/a&gt; endowed with High SDQ (Serendipitious Discovery Quotient). For example my &lt;a href=&quot;http://kingsley.idehen.name/dataspace/person/kidehen#this&quot; id=&quot;link-id13bdcc80&quot;&gt;Personal WebID &lt;/a&gt;is all anyone needs to know if they want to explore:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;My Profile (which includes references to data objects associated with my interests, social-network, calendar, bookmarks etc.)&lt;/li&gt; &lt;li&gt;Data generated by my activities across various data spaces (via data objects associated with my online accounts e.g. &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/feeds.delicious.com/v2/rss/kidehen?count=15&quot; id=&quot;link-id141cce38&quot;&gt;Del.icio.us&lt;/a&gt;, &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/twitter.com/kidehen&quot; id=&quot;link-id11802ce8&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;http://linkeddata.uriburner.com/about/id/entity/http/www.last.fm/user/kidehen&quot; id=&quot;link-id118bf470&quot;&gt;Last.FM&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uriburner.com/fct/rdfdesc/usage.vsp?g=http%3A%2F%2Fkingsley.idehen.name%2Fdataspace%2Fperson%2Fkidehen%23this&amp;amp;tp=4&quot; id=&quot;link-id13c0f528&quot;&gt;Linked Data Meshups via URIBurner&lt;/a&gt; (or any other &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11334f00&quot;&gt;Virtuoso&lt;/a&gt; instance) that provide an extend view of my profile&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;How &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id14324eb0&quot;&gt;FOAF&lt;/a&gt;+SSL adds Socially aware Security &lt;/h3&gt; &lt;p&gt;Even when you reach a point of equilibrium where: your daily activities trigger orchestratestration of CRUD (Create, Read, Update, Delete) operations against Linked Data Objects within your socially enhanced collaboration network, you still have to deal with the thorny issues of security, that includes the following: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Single Sign On, &lt;/li&gt; &lt;li&gt;Authentication, and &lt;/li&gt; &lt;li&gt;Data Access Policies.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;FOAF+SSL, an application of HTTP based Linked Data, enables you to enhance your Personal HTTP scheme based Identifer (or WebID) via the following steps (peformed by a FOAF+SSL compliant platform):&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Imprint WebID within a self-signed x.509 based public key (certificate) associated with your private key (generated by FOAF+SSL platform or manually via OpenSSL)&lt;/li&gt; &lt;li&gt;Store public key components (modulous and exponent) into your FOAF based profile document which references your Personal HTTP Identifier as its primary topic&lt;/li&gt; &lt;li&gt;Leverage HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id141f8b30&quot;&gt;URL&lt;/a&gt; component of WebID for making public key components (modulous and exponent) available for x.509 certificate based authentication challenges posed by systems secured by FOAF+SSL (directly) or OpenID (indirectly via FOAF+SSL to OpenID proxy services).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Contrary to conventional experiences with all things PKI (Public Key Infrastructure) related, FOAF+SSL compliant platforms typically handle the PKI issues as part of the protocol implementation; thereby protecting you from any administrative tedium without compromising security.&lt;/p&gt; &lt;h3&gt;Conclusions&lt;/h3&gt; &lt;p&gt;Understanding how new technology innovations address long standing problems, or understanding how new solutions inadvertently fail to address old problems, provides time tested mechanisms for product selection and value proposition comprehension that ultimately save scarce resources such as time and money. &lt;/p&gt; &lt;p&gt;If you want to understand real world problem solution #1 with regards to HTTP based Linked Data look no further than the issues of secure, socially aware, and platform independent identifiers for data objects, that build bridges across erstwhile data silos.&lt;/p&gt; &lt;p&gt;If you want to cost-effectively experience what I&amp;#39;ve outlined in this post, take a look at &lt;a href=&quot;http://ods.openlinksw.com/wiki/ODS/&quot; id=&quot;link-id13c21220&quot;&gt;OpenLink Data Spaces&lt;/a&gt; (&lt;a href=&quot;http://ods.openlinksw.com/wiki/ODS/&quot; id=&quot;link-id1422cdd8&quot;&gt;ODS&lt;/a&gt;) which is a distributed collaboration engine (enterprise of individual) built around the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14211c98&quot;&gt;Virtuoso&lt;/a&gt; database engines. It simply enhances existing collaboration tools via the following capabilities:&lt;/p&gt; &lt;p&gt;Addition of Social Dimensions via HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Identity_(object-oriented_programming)&quot; id=&quot;link-id116ecd88&quot;&gt;Data Object Identifiers&lt;/a&gt; for all Data Items (if missing)&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Ability to integrate across a myriad of Data Source Types rather than a select few across RDBM Engines, LDAP, &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Services, and various HTTP accessible Resources (Hypermedia or Non Hypermedia content types)&lt;/li&gt; &lt;li&gt;Addition of FOAF+SSL based authentication&lt;/li&gt; &lt;li&gt;Addition of FOAF+SSL based Access Control Lists (ACLs) for policy based data access.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/GetAPersonalURIIn5MinutesOrLess&quot; id=&quot;link-id117b2610&quot;&gt;Get Yourself A WebID in 5 Minutes or Less&lt;/a&gt; via OpenLink Data Spaces (an application layer built atop Virtuoso)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://ods.openlinksw.com/dataspace/dav/wiki/ODS/ODSBriefcaseFOAFSSL&quot; id=&quot;link-id140311a0&quot;&gt;How To Share Resources Securely Using FOAF+SSL&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=CRbdeNMPCug&quot; id=&quot;link-id11ad5448&quot;&gt;FOAF+SSL &amp;amp; WebID Demonstration&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/kidehen/linked-data-spaces-data-portability-access&quot; id=&quot;link-id141f43a8&quot;&gt;OpenLink Data Spaces &amp;amp; Data Portability&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-03T19:50:37-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>OpenLink Virtuoso - Product Value Proposition Overiew</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-02-26#1609</atom:id>
  <atom:published>2010-02-26T19:12:32Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Situation Analysis&lt;/h2&gt; &lt;p&gt;Since the beginning of the modern IT era, each period of innovation has inadvertently introduced its fair share of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Silos. The driving force behind this anomaly remains an overemphasis on the role of applications when selecting problem solutions. Unfortunately, most solution selecting decision makers remain oblivious to the fact that most applications are architecturally monolithic; i.e., they fail to separate the following five layers that are critical to all solutions: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Data Unit (Datum or Data Object) Identity,&lt;/li&gt; &lt;li&gt;Data Storage/Persistence,&lt;/li&gt; &lt;li&gt;Data Access,&lt;/li&gt; &lt;li&gt;Data Representation, and&lt;/li&gt; &lt;li&gt;Data Presentation/Visualization. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The rise of the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id13fe21b0&quot;&gt;Internet&lt;/a&gt;, and its exponentially-growing user-friendly enclave known as the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id1233c608&quot;&gt;World Wide Web&lt;/a&gt;, is bringing the intrinsic costs of the monolithic application architecture anomaly to bear -- in manners unanticipated by many. For example, the emergence of network-oriented solutions across the realms of Enterprise 2.0-based Collaboration and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 2.0-based Software-as-a-Service (SaaS), combined with the overarching influence of Social Media, are producing more heterogeneously-structured and disparately-located data sources than people can effectively process.&lt;/p&gt; &lt;p&gt;As is often the case, a variety of problem and product monikers have emerged for the data access and integration challenges outlined above. Contemporary examples include Enterprise &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13f7e458&quot;&gt;Information&lt;/a&gt; Integration, Master Data Management, and &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id13f57da0&quot;&gt;Data Virtualization&lt;/a&gt;. Labeling aside, the fundamental issues of the unresolved Data Integration challenge boil down to the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Data Model Heterogeneity&lt;/li&gt; &lt;li&gt;Data Quality (Cleanliness)&lt;/li&gt; &lt;li&gt;Semantic Variance across Contexts (e.g., weights and measures).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Effectively solving today&amp;#39;s data integration challenges requires a move away from monolithic application architecture to loosely-coupled, network-centric application architectures. Basically, we need a ubiquitous network-centric application protocol that lends itself to loosely-coupled across-the-wire orchestration of data interactions. In short, this will be what revitalizes the art of application development and deployment.&lt;/p&gt; &lt;p&gt;The World Wide Web is built around a network application protocol called HTTP. This protocol intrinsically separates the five layers listed earlier, thereby enabling:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Use of Generic HTTP URIs as Data Object (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id113b7318&quot;&gt;Entity&lt;/a&gt;) Identifiers;&lt;/li&gt; &lt;li&gt;Identifier Co-reference, such that multiple &lt;a href=&quot;http://dbpedia.org/resource/Identity_(object-oriented_programming)&quot; id=&quot;link-id117151d8&quot;&gt;Data Object Identifiers&lt;/a&gt; may reference the same Data Object;&lt;/li&gt; &lt;li&gt;Use of the &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id13fa4fa0&quot;&gt;Entity&lt;/a&gt;-Attribute-Value Model to describe Data Objects using real world modeling friendly conceptual graphs;&lt;/li&gt; &lt;li&gt;Use of HTTP URLs to Identify Locations of Resources that bear (host) Data Object Descriptions (Representations);&lt;/li&gt; &lt;li&gt;Data Access mechanism for retrieving Data Object Representations from persistent or transient storage locations.&lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;What is &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id116af950&quot;&gt;Virtuoso&lt;/a&gt;?&lt;/h2&gt; &lt;p&gt;A uniquely designed to address today&amp;#39;s escalating Data Access and Integration challenges without compromising performance, security, or platform independence. At its core lies an unrivaled commitment to industry standards combined with unique technology innovation that transcends erstwhile distinct realms such as: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Data Management (&lt;a href=&quot;http://blogs.usnet.private:8893/main/rdbms-engine.html&quot; id=&quot;link-id11943dc0&quot;&gt;Relational&lt;/a&gt;, &lt;a href=&quot;http://blogs.usnet.private:8893/main/rdf-quad-store.html&quot; id=&quot;link-id12312240&quot;&gt;RDF Graph&lt;/a&gt;, or Document), &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/main/middleware.htm&quot; id=&quot;link-id115d71c0&quot;&gt;Data Access Middleware&lt;/a&gt;, &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/main/web-application-server.html&quot; id=&quot;link-id142ca788&quot;&gt;Web Application &amp;amp; Services Deployment&lt;/a&gt;, &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/main/linked-data.html&quot; id=&quot;link-id112b92c0&quot;&gt;Linked Data Deployment&lt;/a&gt;, and &lt;/li&gt; &lt;li&gt;Messaging. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;When Virtuoso is installed and running, HTTP-based Data Objects are automatically created as a by-product of its powerful data virtualization, transcending data sources and data representation formats. The benefits of such power extend across profiles such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/information-and-knowledge-worker-benefits&quot; id=&quot;link-id118df198&quot;&gt;Information &amp;amp; Knowledge Workers&lt;/a&gt;, &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/systems-integrator-benefits&quot; id=&quot;link-id1429d178&quot;&gt;Systems Integrators &amp;amp; Architects&lt;/a&gt;, &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/distributed-collaboration-benefits&quot; id=&quot;link-id142fa2a0&quot;&gt;Distributed Collaboration &amp;amp; Social Media&lt;/a&gt;, &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/cloud-computing-benefits&quot; id=&quot;link-id11aee6b0&quot;&gt;Cloud Computing&lt;/a&gt;, and &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/application-developer-benefits&quot; id=&quot;link-id142440b8&quot;&gt;Application Development&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Product Benefits Summary&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;b&gt;Enterprise Agility&lt;/b&gt; — Virtuoso lets you mix-&amp;amp;-match best-of-class combinations of Operating Systems, Programming Environments, Database Engines and Data-Access Middleware when building or tweaking your IS infrastructure, without the typical impedance of vendor-lock-in.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Data Model Dexterity&lt;/b&gt; — By supporting multiple protocols and data models in a single product, Virtuoso protects you against costly vulnerabilities such as: perennial acquisition and accumulation of expensive data model specific DBMS products that still operate on the fundamental principle of: proprietary technology lock-in, at a time when heterogeneity continues to intrinsically define the information technology landscape.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Cost-effectiveness&lt;/b&gt; — By providing a single point of access (and single-sign-on, SSO) to a plethora of Web 2.0-style social networks, Web Services, and Content Management Systems, and by using Data Object Identifiers as units of Data Virtualization that become the focal points of all data access, Virtuoso lowers the cost to exploit emerging frontiers such as socially-enhanced enterprise collaboration.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Speed of Exploitation&lt;/b&gt; — Virtuoso provides the ability to rapidly assemble 360-degree conceptual views of data, across internal line-of-business application (CRM, ERP, ECM, HR, etc.) data and/or external data sources, whether these are unstructured, semi-structured, or fully structured.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Bottom line, Virtuoso delivers unrivaled flexibility and scalability, without compromising performance or security.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com&#39;s BLOG [127]/1567&quot; id=&quot;link-id13ee6840&quot;&gt;HTTP URI Abstraction and Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blog.jonudell.net/2009/09/09/talking-with-kingsley-idehen-about-mastering-your-own-search-index/&quot; id=&quot;link-id1428b698&quot;&gt;Be The Master of Your Own Search Index&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-1.html&quot; id=&quot;link-id117db508&quot;&gt;Who&amp;#39;s Data Is It?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1482&quot; id=&quot;link-id13f64d90&quot;&gt;MDM &amp;amp; Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1453&quot; id=&quot;link-id118861d8&quot;&gt;What is Linked Data Oriented RDF-zation?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1444&quot; id=&quot;link-id11820d70&quot;&gt;Semantic Web: Travails to Harmony Illustrated&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2010-02-27T12:46:36-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Re-introducing the Virtuoso Virtual Database Engine</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-02-17#1608</atom:id>
  <atom:published>2010-02-17T21:38:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;In recent times a lot of the commentary and focus re. &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id16a22f48&quot;&gt;Virtuoso&lt;/a&gt; has centered on the RDF Quad Store and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id112d82a0&quot;&gt;Linked Data&lt;/a&gt;. What sometimes gets overlooked is the sophisticated &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id6493cc8&quot;&gt;Virtual Database&lt;/a&gt; Engine that provides the foundation for all of Virtuoso&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; integration capabilities.&lt;/p&gt; &lt;p&gt;In this post I provide a brief re-introduction to this essential aspect of Virtuoso.&lt;/p&gt; &lt;h3&gt;What is it?&lt;/h3&gt; &lt;p&gt;This component of Virtuoso is known as the Virtual Database Engine (VDBMS). It provides transparent high-performance and secure access to disparate data sources that are external to Virtuoso. It enables federated access and integration of data hosted by any &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13c26008&quot;&gt;ODBC&lt;/a&gt;- or &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id166604c0&quot;&gt;JDBC&lt;/a&gt;-accessible &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id139dfdb8&quot;&gt;RDBMS&lt;/a&gt;, RDF Store, XML database, or Document (Free Text)-oriented Content Management System. In addition, it facilitates integration with &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Services (SOAP-based SOA RPCs or REST-fully accessible Web Resources). &lt;/p&gt; &lt;h3&gt;Why is it important?&lt;/h3&gt; &lt;p&gt;In the most basic sense, you shouldn&amp;#39;t need to upgrade your existing database engine version simply because your current DBMS and Data Access Driver combo isn&amp;#39;t compatible with ODBC-compliant desktop tools such as Microsoft Access, Crystal Reports, BusinessObjects, Impromptu, or other of ODBC, JDBC, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id13c7ceb8&quot;&gt;ADO&lt;/a&gt;.NET, or OLE DB-compliant applications. Simply place Virtuoso in front of your so-called &amp;quot;legacy database,&amp;quot; and let it deliver the compliance levels sought by these tools&lt;/p&gt; &lt;p&gt;In addition, it&amp;#39;s important to note that today&amp;#39;s enterprise, through application evolution, company mergers, or acquisitions, is often faced with disparately-structured data residing in any number of line-of-business-oriented data silos. Compounding the problem is the exponential growth of user-generated data via new social media-oriented collaboration tools and platforms. For companies to cost-effectively harness the opportunities accorded by the increasing intersection between line-of-business applications and social media, virtualization of data silos must be achieved, and this virtualization must be delivered in a manner that doesn&amp;#39;t prohibitively compromise performance or completely undermine security at either the enterprise or personal level. Again, this is what you get by simply installing Virtuoso.&lt;/p&gt; &lt;h3&gt;How do I use it?&lt;/h3&gt; &lt;p&gt;The VDBMS may be used in a variety of ways, depending on the data access and integration task at hand. Examples include: &lt;/p&gt; &lt;h4&gt;Relational Database Federation&lt;/h4&gt; &lt;p&gt;You can make a single ODBC, JDBC, ADO.NET, OLE DB, or XMLA connection to multiple ODBC- or JDBC-accessible RDBMS data sources, concurrently, with the ability to perform intelligent distributed joins against externally-hosted database tables. For instance, you can join internal human resources data against internal sales and external stock market data, even when the HR team uses &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id16706720&quot;&gt;Oracle&lt;/a&gt;, the Sales team uses &lt;a href=&quot;http://dbpedia.org/resource/IBM_Informix&quot; id=&quot;link-ide5a15c8&quot;&gt;Informix&lt;/a&gt;, and the Stock Market figures come from &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id13c0e138&quot;&gt;Ingres&lt;/a&gt;!&lt;/p&gt; &lt;h4&gt;Conceptual Level Data Access using the RDF Model&lt;/h4&gt; &lt;p&gt;You can construct RDF Model-based Conceptual Views atop Relational Data Sources. This is about generating HTTP-based &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id115150f8&quot;&gt;Entity&lt;/a&gt;-Attribute-Value (E-A-V) graphs using data culled &amp;quot;on the fly&amp;quot; from native or external data sources (Relational Tables/Views, XML-based Web Services, or User Defined Types).&lt;/p&gt; &lt;p&gt;You can also derive RDF Model-based Conceptual Views from Web Resource transformations &amp;quot;on the fly&amp;quot; -- the Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id1675db50&quot;&gt;Sponger&lt;/a&gt; (RDFizing middleware component) enables you to generate RDF Model Linked Data via a RESTful Web Service or within the process pipeline of the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id166b8d90&quot;&gt;SPARQL&lt;/a&gt; query engine (i.e., you simply use the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id167d00c8&quot;&gt;URL&lt;/a&gt; of a Web Resource in the FROM clause of a SPARQL query).&lt;/p&gt; &lt;p&gt;It&amp;#39;s important to note that Views take the form of HTTP links that serve as both Data Source Names and Data Source Addresses. This enables you to query and explore relationships across entities (i.e., People, Places, and other Real World Things) via HTTP clients (e.g., Web Browsers) or directly via SPARQL Query Language constructs transmitted over HTTP.&lt;/p&gt; &lt;h4&gt;Conceptual Level Data Access using ADO.NET &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id13c6bb60&quot;&gt;Entity&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id16ad3f68&quot;&gt;Frameworks&lt;/a&gt; &lt;/h4&gt; &lt;p&gt;As an alternative to RDF, Virtuoso can expose ADO.NET Entity Frameworks-based Conceptual Views over Relational Data Sources. It achieves this by generating Entity Relationship graphs via its native ADO.NET Provider, exposing all externally attached ODBC- and JDBC-accessible data sources. In addition, the ADO.NET Provider supports direct access to Virtuoso&amp;#39;s native RDF database engine, eliminating the need for resource intensive Entity Frameworks model transformations.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtLinkRemoteTables&quot; id=&quot;link-id1183acd8&quot;&gt;Attaching ODBC or JDBC accessible Relational Tables to Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtRdb2RDFViewsGeneration#One-Click%20Linked%20Data%20Generation%20&amp;amp;%20Deployment&quot; id=&quot;link-id113f2fd8&quot;&gt;Using an HTML based Wizard to Generate RDF based Linked Views over Relational Tables&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=bj7AbJ0ZYCk&amp;amp;feature=channel&quot; id=&quot;link-id16ad4480&quot;&gt;Screencast Demonstrating Wizard based generation of RDF based Linked Data Views Part 1&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=yXNlcISS0aY&amp;amp;feature=channel&quot; id=&quot;link-id114eb720&quot;&gt;Screencast Demonstrating Wizard based generation of RDF based Linked Data Views Part 1&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; id=&quot;link-id116e5810&quot;&gt;Generating RDF based Linked Data from non RDF based Web Resources via the Sponger&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAdoNet35Provider&quot; id=&quot;link-id16706118&quot;&gt;Building ADO.NET based Entity Frameworks Views over Relational Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSilverlightSPARQLExample&quot; id=&quot;link-id139c1278&quot;&gt;Building Silverlight Rich Internat Applicaitons using ADO.NET, Entity Frameworks, and RDF based Linked Data&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-17T16:46:53-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Compare &amp; Contrast: SQL Server&#39;s Linked Server vs Virtuoso&#39;s Virtual Database Layer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-02-12#1607</atom:id>
  <atom:published>2010-02-12T21:44:10Z</atom:published>
  <atom:content type="html">&lt;h2&gt; &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id166785f0&quot;&gt;Microsoft&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id169b6bb8&quot;&gt;SQL&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Microsoft_SQL_Server&quot; id=&quot;link-id163b8350&quot;&gt;Server&lt;/a&gt;&amp;#39;s Linked Server Promise&lt;/h2&gt; &lt;p&gt;The ability to use distributed queries -- i.e., to issue SQL queries against any OLE-DB-accessible back end -- via Linked Servers.&lt;/p&gt; &lt;p&gt;The promise fails to materialize, primarily because while there are several ways of issuing such distributed queries, none of them work with all &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1675e128&quot;&gt;data&lt;/a&gt; access providers, and even for those that do, results received via different methods may differ.&lt;/p&gt; &lt;p&gt;Compounding the issue, there are specific configuration options which must be set correctly, often differing from defaults, to permit such things as &amp;quot;ad-hoc distributed queries&amp;quot;.&lt;/p&gt; &lt;p&gt;Common tools that are typically used with such Linked Servers include SSIS and DTS. Such generic tools typically rely on four-part naming for their queries, expecting SQL Server to properly rewrite remotely executed queries for the DBMS engine which ultimately executes them.&lt;/p&gt; &lt;p&gt;The most common cause of failure is that when SQL Server rewrites a query, it typically does so using SQL-92 syntax, regardless of the back-end&amp;#39;s abilities, and using the Transact-SQL dialect for implementation-specific query syntaxes, regardless of the back-end&amp;#39;s dialect. This leads to problems especially when the Linked Server is an older variant which doesn&amp;#39;t support SQL-92 (e.g., Progress 8.x or earlier, &lt;a href=&quot;http://dbpedia.org/resource/IBM_Informix&quot; id=&quot;link-id167f6fa0&quot;&gt;Informix&lt;/a&gt; 7 or earlier), or which SQL dialect differs substantially from Transact-SQL (e.g., Informix, Progress, &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id166c7848&quot;&gt;MySQL&lt;/a&gt;, etc.).&lt;/p&gt; &lt;h3&gt;Basic Four-Part Naming&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;SELECT * &lt;br /&gt;  FROM linked_server.[catalog].[&lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id163c3f78&quot;&gt;schema&lt;/a&gt;].object&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Four-part naming presumes that you have pre-defined a Linked Server, and executes the query on SQL Server. SQL Server decides what if any sub- or partial-queries to execute on the linked server, tends not to use appropriate syntax for these, and usually does not take advantage of linked server or provider features.&lt;/p&gt; &lt;h3&gt;OpenQuery&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;SELECT * &lt;br /&gt;  FROM OPENQUERY ( linked_server , &amp;#39;query&amp;#39; )&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;OpenQuery also presumes that you have pre-defined a Linked Server, but executes the query as a &amp;quot;pass-through&amp;quot;, handing it directly to the remote provider. Features of the remote server and the data access provider may be taken advantage of, but only if the query author knows about them.&lt;/p&gt; &lt;h4&gt;From the product docs:&lt;/h4&gt; &lt;blockquote&gt; &lt;p&gt; &lt;i&gt;SQL Server&amp;#39;s Linked Server extension executes the specified pass-through query on the specified linked server. This server is an OLE DB data source. &lt;code&gt;OPENQUERY&lt;/code&gt; can be referenced in the &lt;code&gt;FROM&lt;/code&gt; clause of a query as if it were a table name. &lt;code&gt;OPENQUERY&lt;/code&gt; can also be referenced as the target table of an &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, or &lt;code&gt;DELETE&lt;/code&gt; statement. This is subject to the capabilities of the OLE DB provider. Although the query may return multiple result sets, &lt;code&gt;OPENQUERY&lt;/code&gt; returns only the first one.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;...&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;code&gt;OPENQUERY&lt;/code&gt; does not accept variables for its arguments. &lt;code&gt;OPENQUERY&lt;/code&gt; cannot be used to execute extended stored procedures on a linked server. However, an extended stored procedure can be executed on a linked server by using a four-part name. &lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;h3&gt;OpenRowset&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;SELECT * &lt;br /&gt;  FROM OPENROWSET &lt;br /&gt;    ( &amp;#39;provider_name&amp;#39; , &lt;br /&gt;      &amp;#39;datasource&amp;#39; ; &amp;#39;user_id&amp;#39; ; &amp;#39;password&amp;#39;, &lt;br /&gt;      { [ catalog. ] [ schema. ] object | &amp;#39;query&amp;#39; }&lt;br /&gt;    )&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;code&gt;OpenRowset&lt;/code&gt; does not require a pre-defined Linked Server, but does require the user to know what data access providers are available on the SQL Server host, and how to manually construct a valid connection string for the chosen provider. It does permit both &amp;quot;pass-through&amp;quot; and &amp;quot;local execution&amp;quot; queries, which can lead to confusion when the results differ (as they regularly will).&lt;/p&gt; &lt;h4&gt;More from product docs:&lt;/h4&gt; &lt;blockquote&gt; &lt;p&gt; &lt;i&gt;Includes all connection &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id163ab840&quot;&gt;information&lt;/a&gt; that is required to access remote data from an OLE DB data source. This method is an alternative to accessing tables in a linked server and is a one-time, ad hoc method of connecting and accessing remote data by using OLE DB. For more frequent references to OLE DB data sources, use linked servers instead. For more information, see Linking Servers. The &lt;code&gt;OPENROWSET&lt;/code&gt; function can be referenced in the &lt;code&gt;FROM&lt;/code&gt; clause of a query as if it were a table name. The &lt;code&gt;OPENROWSET&lt;/code&gt; function can also be referenced as the target table of an &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, or &lt;code&gt;DELETE&lt;/code&gt; statement, subject to the capabilities of the OLE DB provider. Although the query might return multiple result sets, &lt;code&gt;OPENROWSET&lt;/code&gt; returns only the first one.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;OPENROWSET also supports bulk operations through a built-in &lt;code&gt;BULK&lt;/code&gt; provider that enables data from a file to be read and returned as a rowset.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;...&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;code&gt;OPENROWSET&lt;/code&gt; can be used to access remote data from OLE DB data sources only when the &lt;code&gt;DisallowAdhocAccess&lt;/code&gt; registry option is explicitly set to &lt;code&gt;0&lt;/code&gt; for the specified provider, and the &lt;code&gt;Ad Hoc Distributed Queries&lt;/code&gt; advanced configuration option is enabled. When these options are not set, the default behavior does not allow for ad hoc access. When accessing remote OLE DB data sources, the login identity of trusted connections is not automatically delegated from the server on which the client is connected to the server that is being queried. Authentication delegation must be configured. For more information, see Configuring Linked Servers for Delegation.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;Catalog and schema names are required if the OLE DB provider supports multiple catalogs and schemas in the specified data source. Values for catalog and schema can be omitted when the OLE DB provider does not support them. If the provider supports only schema names, a two-part name of the form &lt;code&gt;schema.object&lt;/code&gt; must be specified. If the provider supports only catalog names, a three-part name of the form &lt;code&gt;catalog.schema.object&lt;/code&gt; must be specified. Three-part names must be specified for pass-through queries that use the SQL Server Native Client OLE DB provider. For more information, see Transact-SQL Syntax Conventions (Transact-SQL). &lt;code&gt;OPENROWSET&lt;/code&gt; does not accept variables for its arguments.&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;h3&gt;OpenDataSource&lt;/h3&gt; &lt;blockquote&gt; &lt;code&gt;SELECT * &lt;br /&gt;  FROM OPENDATASOURCE&lt;br /&gt;    ( &amp;#39;provider_name&amp;#39;,&lt;br /&gt;      &amp;#39;provider_specific_datasource_specification&amp;#39;&lt;br /&gt;    ).[catalog].[schema].object&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;As with basic four-part naming, &lt;code&gt;OpenDataSource&lt;/code&gt; executes the query on SQL Server. SQL Server decides what if any sub-queries to execute on the linked server, tends not to use appropriate syntax for these, and usually does not take advantage of linked server or provider features.&lt;/p&gt; &lt;h4&gt;Additional doc excerpts&lt;/h4&gt; &lt;blockquote&gt; &lt;p&gt; &lt;i&gt;Provides ad hoc connection information as part of a four-part object name without using a linked server name.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;...&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&lt;code&gt;OPENDATASOURCE&lt;/code&gt; can be used to access remote data from OLE DB data sources only when the &lt;code&gt;DisallowAdhocAccess&lt;/code&gt; registry option is explicitly set to &lt;code&gt;0&lt;/code&gt; for the specified provider, and the &lt;code&gt;Ad Hoc Distributed Queries&lt;/code&gt; advanced configuration option is enabled. When these options are not set, the default behavior does not allow for ad hoc access.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;The &lt;code&gt;OPENDATASOURCE&lt;/code&gt; function can be used in the same Transact-SQL syntax locations as a linked-server name. Therefore, &lt;code&gt;OPENDATASOURCE&lt;/code&gt; can be used as the first part of a four-part name that refers to a table or view name in a &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, or &lt;code&gt;DELETE&lt;/code&gt; statement, or to a remote stored procedure in an &lt;code&gt;EXECUTE&lt;/code&gt; statement. When executing remote stored procedures, &lt;code&gt;OPENDATASOURCE&lt;/code&gt; should refer to another instance of SQL Server. &lt;code&gt;OPENDATASOURCE&lt;/code&gt; does not accept variables for its arguments.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;Like the &lt;code&gt;OPENROWSET&lt;/code&gt; function, &lt;code&gt;OPENDATASOURCE&lt;/code&gt; should only reference OLE DB data sources that are accessed infrequently. Define a linked server for any data sources accessed more than several times. Neither &lt;code&gt;OPENDATASOURCE&lt;/code&gt; nor &lt;code&gt;OPENROWSET&lt;/code&gt; provide all the functionality of linked-server definitions, such as security management and the ability to query catalog information. All connection information, including passwords, must be provided every time that &lt;code&gt;OPENDATASOURCE&lt;/code&gt; is called.&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;h2&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id122c66b8&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id167af7d8&quot;&gt;Virtual Database&lt;/a&gt; Promise &amp;amp; Deliverables&lt;/h2&gt; &lt;p&gt;The ability to link objects (tables, views, stored procedures) from any &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id1394ab90&quot;&gt;ODBC&lt;/a&gt;-accessible data source. This includes any &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id11c38748&quot;&gt;JDBC&lt;/a&gt;-accessible data source, through the OpenLink ODBC Driver for JDBC Data Sources.&lt;/p&gt; &lt;p&gt;There are no limitations on the data types which can be queried or read, nor must the target DBMS have primary keys set on linked tables or views.&lt;/p&gt; &lt;p&gt;All linked objects may be used in single-site or distributed queries, and the user need not know anything about the actual data structure, including whether the objects being queried are remote or local to Virtuoso -- all objects are made to appear as part of a Virtuoso-local schema.&lt;/p&gt;</atom:content>
  <atom:updated>2010-02-17T11:21:26-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Compare &amp; Contrast: Oracle Heterogeneous Services (HSODBC, DG4ODBC) vs Virtuoso&#39;s Virtual Database Layer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2010-02-12#1606</atom:id>
  <atom:published>2010-02-12T21:43:51Z</atom:published>
  <atom:content type="html">&lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id12349be8&quot;&gt;Oracle&lt;/a&gt; Gateway Promise&lt;/h3&gt; &lt;p&gt;Ability to use distributed queries over a generic connectivity gateway (HSODBC, DG4ODBC) -- i.e., to issue &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id167e5760&quot;&gt;SQL&lt;/a&gt; queries against any &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13c6bfa0&quot;&gt;ODBC&lt;/a&gt;- or OLE-DB-accessible linked back end.&lt;/p&gt; &lt;h3&gt;Reality&lt;/h3&gt; &lt;p&gt;Promise fails to materialize for several reasons. Immediate limitations include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;All tables locked by a &lt;code&gt;FOR UPDATE&lt;/code&gt; clause and all tables with &lt;code&gt;LONG&lt;/code&gt; columns selected by the query must be located in the same external database.&lt;/li&gt; &lt;li&gt;Distributed queries cannot select user-defined types or object &lt;code&gt;REF&lt;/code&gt; datatypes on remote tables.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;In addition to the above, which apply to database-specific heterogeneous environments, the database-agnostic generic connectivity components have the following limitations:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A table including a &lt;code&gt;BLOB&lt;/code&gt; column must have a separate column that serves as a primary key.&lt;/li&gt; &lt;li&gt; &lt;code&gt;BLOB&lt;/code&gt; and &lt;code&gt;CLOB&lt;/code&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id163e07f0&quot;&gt;data&lt;/a&gt; cannot be read by passthrough queries.&lt;/li&gt; &lt;li&gt;Updates or deletes that include unsupported functions within a &lt;code&gt;WHERE&lt;/code&gt; clause are not allowed.&lt;/li&gt; &lt;li&gt;Generic Connectivity does not support stored procedures.&lt;/li&gt; &lt;li&gt;Generic Connectivity agents cannot participate in distributed transactions; they support single-site transactions only.&lt;/li&gt; &lt;li&gt;Generic Connectivity does not support multithreaded agents.&lt;/li&gt; &lt;li&gt;Updating &lt;code&gt;LONG&lt;/code&gt; columns with bind variables is not supported.&lt;/li&gt; &lt;li&gt;Generic Connectivity does not support &lt;code&gt;ROWID&lt;/code&gt;s.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Compounding the issue, the HSODBC and DG4ODBC generic connectivity agents perform many of their functions by brute-force methods. Rather than interrogating the data access provider (whether ODBC or OLE DB) or DBMS to which they are connected, to learn their capabilities, many things are done by using the lowest possible function.&lt;/p&gt; &lt;p&gt;For instance, when a &lt;code&gt;SELECT COUNT (*) FROM table@link&lt;/code&gt; is issued through Oracle SQL, the target DBMS doesn&amp;#39;t simply perform a &lt;code&gt;SELECT COUNT (*) FROM table&lt;/code&gt;. Rather, it performs a &lt;code&gt;SELECT * FROM table&lt;/code&gt; which is used to inventory all columns in the table, and then performs and fully retrieves &lt;code&gt;SELECT field FROM table&lt;/code&gt; into an internal temporary table, where it does the &lt;code&gt;COUNT (*)&lt;/code&gt; itself, locally. Testing has confirmed this process to be the case despite Oracle documentation stating that target data sources must support &lt;code&gt;COUNT (*)&lt;/code&gt; (among other functions).&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id16814bd8&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id1185b9d0&quot;&gt;Virtual Database&lt;/a&gt; Comparison&lt;/h3&gt; &lt;p&gt;The Virtuoso &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id1666f658&quot;&gt;Universal Server&lt;/a&gt; will link/attach objects (tables, views, stored procedures) from any ODBC-accessible data source. This includes any &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id1668aec8&quot;&gt;JDBC&lt;/a&gt;-accessible data source, through the OpenLink ODBC Driver for JDBC Data Sources.&lt;/p&gt; &lt;p&gt;There are no limitations on the data types which can be queried or read, nor must the target DBMS have primary keys set on linked tables or views.&lt;/p&gt; &lt;p&gt;All linked objects may be used in single-site or distributed queries, and the user need not know anything about the actual data structure, including whether the objects being queried are remote or local to Virtuoso -- all objects are made to appear as part of a Virtuoso-local &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id1628c438&quot;&gt;schema&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2010-02-17T11:21:22.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Why Do I Need To Pay For ODBC, JDBC, ADO.NET, OLE-DB Drivers?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2010-02-05#1605</atom:id>
  <atom:published>2010-02-05T06:03:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;Payment is a function of pain alleviation (opportunity cost) monetization. &lt;/p&gt; &lt;p&gt; This post is about highlighting the real pains associated with the $0.00 misconception associated with Data Access Drivers: &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13bcea18&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id137def30&quot;&gt;JDBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id14da8ce8&quot;&gt;ADO&lt;/a&gt;.NET, &lt;a href=&quot;http://dbpedia.org/resource/OLE_DB&quot; id=&quot;link-id113ee4f0&quot;&gt;OLE-DB&lt;/a&gt; etc.&lt;/p&gt; &lt;p&gt;In the most basic sense, there are some fundament aspects of data access that are complex to implement and rarely implemented (if at all) by free drivers, the list includes:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Escape Syntaxes for Dates and Functions&lt;/li&gt; &lt;li&gt;Metadata Calls which enable smarter ODBC compliant applications (this feature is typically missing on Driver Side and abused on the Client side i.e., making clients DBMS specific by testing for specific DBMS names)&lt;/li&gt; &lt;li&gt;Scrollable Cursors, this is how you deal with change sensitivity, and most drivers actually fake support and get away with it due to shortage of applications to test proper cursor types (Static, Forward-Only, Key-Set, Dynamic, and Mixed models).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Okay, so we&amp;#39;re done with actual driver sophistication re. implementation of critical features. Let&amp;#39;s Up the ante by veering into the area of security. At the most basic level, It&amp;#39;s extremely important to understand that all data access driver types provide read-write access to your databases; thus, it&amp;#39;s imperative that data access drivers address the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Read-Only or Read-Write Access scoped to specific Users&lt;/li&gt; &lt;li&gt; Ditto applied to specific User Groups &lt;/li&gt; &lt;li&gt; Ditto applied to Database Names &lt;/li&gt; &lt;li&gt; Ditto applied to specific ODBC compliant applications &lt;/li&gt; &lt;li&gt; Ditto applied to specific ODBC host operating systems &lt;/li&gt; &lt;li&gt; Ditto applied to specific IP addresses or Ranges on your Network &lt;/li&gt; &lt;li&gt; Any combination of items 1-6 as part of a configurable data access rules/policy system. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Once you&amp;#39;re done with security, you then have the thorny issue of data access and data flow management. In a nutshell, your driver needs to be able to handle:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Protection against cartesian product network flooding (e.g., user clicks on Customer Table via an ODBC compliant application without comprehension of back-end implications)&lt;/li&gt; &lt;li&gt; Enabling or Disabling of key DBMS engine data access optimization features (e.g. DBMS specific extensions exposed via Environment Variables of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id113cc808&quot;&gt;SQL&lt;/a&gt; commands based settings) &lt;/li&gt; &lt;li&gt; Conditional Connection Pooling across User, User Groups, Applications, Host Operating System, IP Address dimensions.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Once you&amp;#39;ve dealt with Security and Data Flow, you then have to address the enforcement of these settings across a myriad of ODBC compliant host, which is where Zeroconfig and centralized data access administration comes into play i.e., configure once (locally) and enforce globally.&lt;/p&gt; &lt;p&gt;When &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id1161faf0&quot;&gt;OpenLink Software&lt;/a&gt; entered the ODBC Driver Market segment in 1992, the issues above where the fundamental basis of our Multi-Tier Drivers. Thus, although we distinguished ourselves via performance, stability, and specification adherence, our fundamental engineering focus has always been skewed towards security and configurability, alongside high-performance and scalability.&lt;/p&gt; &lt;p&gt;As we close 2009, the security issues that pervade Native DBMS Drives, ODBC, JDBC, ADO.NET, OLE-DB etc. Drivers have only increased, courtesy of ubiquitous computing, sadly though, there remains a fundamental illusion that Data Access Drivers simply connect you to DBMS back-ends, and since you can get these drivers at $0.00 from most DBMS vendors they can&amp;#39;t be that important. &lt;/p&gt; &lt;p&gt;I hope that this post brings some clarity to a very serious security and general configuration management issues associated with Data Access Drivers. Free ODBC Drivers offer nothing, when it comes to the real issues of Open Data Access. If they did, they wouldn&amp;#39;t be worth $0.00!&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note:&lt;/strong&gt; wondering if this has anything to do with &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1188f968&quot;&gt;Linked Data&lt;/a&gt; (my current data access focal point)? Well, remember, the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id14d6d788&quot;&gt;Linked Data meme&lt;/a&gt; is fundamentally about &lt;a href=&quot;http://dbpedia.org/resource/Representational_State_Transfer&quot; id=&quot;link-id114051e8&quot;&gt;REST&lt;/a&gt; based Open Data Access &amp;amp; Integration via HTTP; thus, what applies to Relational Model databases naturally applies to their more granular Graph Model relatives. Basically, data access security never goes away, it just gets more granular, complex, and ultimately, mercurial.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/res/oplfeatures/index.html&quot; id=&quot;link-id1388e920&quot;&gt;OpenLink Universal Data Access Drivers Overview&lt;/a&gt; - clickable diagram exposing features and benefits&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/odbc/mt/&quot; id=&quot;link-id118ab728&quot;&gt;OpenLink Multi-Tier ODBC Drivers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/jdbc/mt/&quot; id=&quot;link-id13dea018&quot;&gt;OpenLink Multi-Tier JDBC Drivers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uda.openlinksw.com/dotnet/mt/&quot; id=&quot;link-id13b4aec8&quot;&gt;OpenLink Multi-Tier ADO.NET Providers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/info/docs/odbcwhp/mtarc.htm&quot; id=&quot;link-id137d74d0&quot;&gt;Multi-Tier Drivers Overview&lt;/a&gt; (1993 White Paper excerpt)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/info/docs/odbcwhp/tableof.htm#Table%20of%20Contents&quot; id=&quot;link-id13b8fb28&quot;&gt;OpenLink ODBC White Paper&lt;/a&gt; (actual 1993 White Paper)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14702040&quot;&gt;OpenLink Virtuoso&lt;/a&gt; - which provides a Virtual Conceptual Model (via HTTP, RDF, based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11b01080&quot;&gt;Linked Data&lt;/a&gt;) Layer above ODBC or JDBC accessible Data Sources &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.dba-oracle.com/t_auditing4_horror_stories_inside_jobs.htm&quot; id=&quot;link-id13e64618&quot;&gt;Oracle Security Auditing Horror Stories&lt;/a&gt; -- Social Dimensions of Security compounded by Value (literal username and password) Based User Identity&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://searchoracle.techtarget.com/news/2240015728/Database-security-strategies-need-to-grow-up-in-2010?&quot; id=&quot;link-id116c25c8&quot;&gt;Database Security Strategies Need to Grow Up in 2010&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.dataflux.com/dfblog/?p=1458&quot; id=&quot;link-id13e92180&quot;&gt;First Law of Data Quality&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-1.html&quot; id=&quot;link-id13fa4948&quot;&gt;Who&amp;#39;s Data is it? Part 1&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-2.html&quot; id=&quot;link-id13f00b08&quot;&gt;Who&amp;#39;s Data is it? Part 2&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2015-07-17T13:21:13.919963-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Business Of Linked Data (BOLD) Discussion Space</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1596</atom:id>
  <atom:published>2010-01-31T22:48:36Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve created a new discussion space that&amp;#39;s squarely focused on the business development and marketing aspects of &amp;quot;HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id129e32d8&quot;&gt;Linked Data&amp;quot; (Linked Data&lt;/a&gt;). As its name indicates, It&amp;#39;s a BOLD attempt to fill a VoiD. :-)&lt;/p&gt; &lt;h3&gt;Background&lt;/h3&gt; &lt;p&gt;A few months ago, &lt;a href=&quot;http://blog.aldobucchi.com/#this&quot; id=&quot;link-id1110eb30&quot;&gt;Aldo Bucchi&lt;/a&gt; posted a message to the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id111d08a0&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/&quot; id=&quot;link-id118b3778&quot;&gt;mailing list&lt;/a&gt; seeking a discussion space for more business and marketing oriented topic, in relation to Linked Data. At the time, my assumption was that the existing LOD mailing list served that purpose absolutely fine, but in due course I came to realize that Aldo&amp;#39;s request had a much lager foundation than I initially suspected.&lt;/p&gt; &lt;h3&gt;Historic Oversight&lt;/h3&gt; &lt;p&gt;Linked Data, like its umbrella &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id16ceb618&quot;&gt;Semantic Web&lt;/a&gt; Project, has suffered from an inadvertent oversight on the parts of many of its enthusiasts (myself included): 100% of the discussion spaces are created by, geared towards, or dominated by researchers (from Academia primarily) and/or developers. Thus, at the very least, we&amp;#39;ve been operating in an echo chamber that only feed the existing void between the core community and those who are more interested in discussing business and marketing related topics.&lt;/p&gt; &lt;p&gt;The new discussion space seeks to cover the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Brainstorming Value Proposition Articulation&lt;/li&gt; &lt;li&gt;War Story Exchanges&lt;/li&gt; &lt;li&gt;Case Studies and Use-cases&lt;/li&gt; &lt;li&gt;Market Research &amp;amp; Positioning (for instance Linked Data is killer technology that redefines &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d491e90&quot;&gt;Data&lt;/a&gt; Integration, but none of the major research firms currently make that connection)&lt;/li&gt;. &lt;/ol&gt; &lt;p&gt;How Do I Join The Conversation? Simply sign up on the Google hosted &lt;a href=&quot;http://groups.google.com/group/business-of-linked-data-bold&quot; id=&quot;link-id129e4d08&quot;&gt;BOLD mailing list&lt;/a&gt;, introduce yourself (ideally), and then start conversing! :-)&lt;/p&gt;</atom:content>
  <atom:updated>2010-01-31T17:48:48-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Getting The Linked Data Value Pyramid Layers Right (Update #2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1595</atom:id>
  <atom:published>2010-01-31T22:46:47Z</atom:published>
  <atom:content type="html">&lt;p&gt; One of the real problems that pervades all routes to &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13539328&quot;&gt;Linked Data&lt;/a&gt; value prop. incomprehension stems from the layering of its value pyramid; especially when communicating with -initially detached- end-users. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note to &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1c85f498&quot;&gt;Web&lt;/a&gt; Programmers:&lt;/strong&gt; Linked Data is about &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c85f650&quot;&gt;Data&lt;/a&gt; (Wine) and not about Code (Fish). Thus, it isn&amp;#39;t a &amp;quot;programmer only zone&amp;quot;, far from it. More than anything else, its inherently inclusive and spreads its participation net widely across: Data Architects, Data Integrators, Power Users, &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id13600d98&quot;&gt;Knowledge&lt;/a&gt; Workers, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id149f8230&quot;&gt;Information&lt;/a&gt; Workers, Data Analysts, etc.. Basically, everyone that can &amp;quot;click on a link&amp;quot; is invited to this particular party; remember, it is about &amp;quot;Linked Data&amp;quot; not &amp;quot;Linked Code&amp;quot;, after all. :-) &lt;/p&gt; &lt;h3&gt;Problematic Value Pyramid Layering&lt;/h3&gt; &lt;p&gt; Here is an example of a Linked Data value pyramid that I am stumbling across --with some frequency-- these days (note: 1 being the pyramid apex):&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10e85538&quot;&gt;SPARQL&lt;/a&gt; Queries&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id1495b578&quot;&gt;RDF&lt;/a&gt; Data Stores&lt;/li&gt; &lt;li&gt; RDF Data Sets &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id158e4be0&quot;&gt;HTTP&lt;/a&gt; scheme URIs&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Basically, Linked Data deployment (assigning de-referencable HTTP URIs to DBMS records, their attributes, and attribute values [optionally] ) is occurring last. Even worse, this happens in the &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id626d988&quot;&gt;context&lt;/a&gt; of Linked Open Data oriented endeavors, resulting in nothing but confusion or inadvertent perpetuation of the overarching pragmatically challenged &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id111774b8&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; stereotype. &lt;/p&gt; &lt;p&gt; As you can imagine, hitting SPARQL as your introduction to Linked Data is akin to hitting &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id151f9938&quot;&gt;SQL&lt;/a&gt; as your introduction to Relational Database Technology, neither is an elevator-style value prop. relay mechanism. &lt;/p&gt; &lt;p&gt; In the relational realm, killer demos always started with desktop productivity tools (spreadsheets, report-writers, SQL QBE tools etc.) accessing, relational data sources en route to unveiling the &amp;quot;Productivity&amp;quot; and &amp;quot;Agility&amp;quot; value prop. that such binding delivered i.e., the desktop application (clients) and the databases (servers) are distinct, but operating in a mutually beneficial manner to all, courtesy of a data access standards such as &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id1519aac0&quot;&gt;ODBC&lt;/a&gt; (Open Database Connectivity). &lt;/p&gt; &lt;p&gt; In the Linked Data realm, learning to embrace and extend best practices from the relational dbms realm remains a challenge, a lot of this has to do with hangovers from a misguided perception that RDF databases will somehow completely replace &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id110dec88&quot;&gt;RDBMS&lt;/a&gt; engines, rather than compliment them. Thus, you have a counter productive variant of NIH (Not Invented Here) in play, taking us to the dreaded realm of: Break the Pot and You Own It (exemplified by the 11+ year Semantic Web Project comprehension and appreciation odyssey). &lt;/p&gt; &lt;p&gt; From my vantage point, here is how I believe the &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/images/URI_Data_Source_SemWeb.png&quot; id=&quot;link-id1592f528&quot;&gt;Linked Data value pyramid should be layered&lt;/a&gt;, especially when communicating the essential value prop.: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; HTTP URLs -- LINKs to documents (Reports) that users already appreciate, across the public Web and/or Intranets &lt;/li&gt; &lt;li&gt; HTTP URIs -- typically not visually distinguishable from the URLs, so use the Data exposed by de-referencing a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id11209ce8&quot;&gt;URL&lt;/a&gt; to show how each Data Item (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1449b558&quot;&gt;Entity&lt;/a&gt; or Object) is uniquely identified by a Generic HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id112065f8&quot;&gt;URI&lt;/a&gt;, and how clicking on the said URIs leads to more structured metadata bearing documents available in a variety of data representation formats, thereby enabling flexible data presentation (e.g., smarter HTML pages) &lt;/li&gt; &lt;li&gt; SPARQL -- when a user appreciates the data representation and presentation dexterity of a Generic HTTP URI, they will be more inclined to drill down an additional layer to unravel how HTTP URIs mechanically deliver such flexibility &lt;/li&gt; &lt;li&gt; RDF Data Stores -- at this stage the user is now interested data sources behind the Generic HTTP URIs, courtesy of natural desire to tweak the data presented in the report; thus, you now have an engaged user ready to absorb the &amp;quot;How Generic HTTP URIs Pull This Off&amp;quot; message &lt;/li&gt; &lt;li&gt;RDF Data Sets -- while attempting to make or tweak HTTP URIs, users become curious about the actual data loaded into the RDF Data Store, which is where data sets used to create powerful Lookup Data Spaces (e.g., &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id110675c0&quot;&gt;DBpedia&lt;/a&gt;) come into play such as those from the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2009-07-14.html&quot; id=&quot;link-id11127ff8&quot;&gt;LOD&lt;/a&gt; constellation as exemplified by &lt;a href=&quot;http://wiki.dbpedia.org/Datasets&quot; id=&quot;link-id14a2fad8&quot;&gt;DBpedia (extractions from Wikipedia)&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1565&quot; id=&quot;link-id149c7048&quot;&gt;Exploring the Linked Data Value Proposition&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id14998f98&quot;&gt;Simple Explanation of Linked Data &amp;amp; RDF Dynamics&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1546&quot; id=&quot;link-id114fbd58&quot;&gt;What is the Linked Data Meme About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1547&quot; id=&quot;link-id1447ada0&quot;&gt;Linked Data &amp;amp; Data Item Identifiers (Identity)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-01-31T17:47:04-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is the DBpedia Project? (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1594</atom:id>
  <atom:published>2010-01-31T22:45:55Z</atom:published>
  <atom:content type="html">&lt;p&gt;The recent &lt;a href=&quot;http://en.wikipedia.org/wiki/Talk:DBpedia&quot; id=&quot;link-id1120a260&quot;&gt;Wikipedia imbroglio&lt;/a&gt; centered around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id14a5e588&quot;&gt;DBpedia&lt;/a&gt; is the fundamental driver for this particular &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id113ddc10&quot;&gt;blog&lt;/a&gt; post. At time of writing this blog post, the &lt;a href=&quot;http://en.wikipedia.org/wiki/DBpedia&quot; id=&quot;link-id158edec0&quot;&gt;DBpedia project definition in Wikipedia&lt;/a&gt; remains unsatisfactory due to the following shortcomings:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;inaccurate and incomplete definition of the Project&amp;#39;s What, Why, Who, Where, When, and How&lt;/li&gt; &lt;li&gt;inaccurate reflection of project essence, by skewing focus towards &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1bc892d0&quot;&gt;data&lt;/a&gt; extraction and data set dump production, which is at best a quarter of the project.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Here are some insights on DBpedia, from the perspective of someone intimately involved with the other three-quarters of the project.&lt;/p&gt; &lt;h3&gt;What is DBpedia?&lt;/h3&gt; &lt;p&gt;A live &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1c0c0cc0&quot;&gt;Web&lt;/a&gt; accessible RDF model database (Quad Store) derived from Wikipedia content snapshots, taken periodically. The RDF database underlies a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11ba0ad0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1183c978&quot;&gt;Space&lt;/a&gt; comprised of: HTML (and most recently HTML+&lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id602eab8&quot;&gt;RDFa&lt;/a&gt;) based data browser pages and a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id11af5400&quot;&gt;SPARQL&lt;/a&gt; endpoint.&lt;/p&gt; &lt;p&gt;Note: &lt;a href=&quot;http://blog.dbpedia.org/2009/11/11/dbpedia-34-released/&quot; id=&quot;link-id110b8248&quot;&gt;DBpedia 3.4&lt;/a&gt; now exists in snapshot (warehouse) and &lt;a href=&quot;http://dbpedia-live.openlinksw.com/stats/&quot; id=&quot;link-id6473258&quot;&gt;Live Editions&lt;/a&gt; (currently being hot-staged). This post is about the snapshot (warehouse) edition, I&amp;#39;ll drop a different post about the DBpedia Live Edition where a new Delta-Engine covers both extraction and database record replacement, in realtime.&lt;/p&gt; &lt;h3&gt;When was it Created?&lt;/h3&gt; &lt;p&gt;As an idea under the moniker &amp;quot;DBpedia&amp;quot; it was conceptualized in late 2006 by researchers at University of Leipzig (lead by Soren Auer) and Freie University, Berlin (lead by &lt;a href=&quot;http://www.wiwiss.fu-berlin.de/en/institute/pwo/bizer/&quot; id=&quot;link-id14982c78&quot;&gt;Chris Bizer&lt;/a&gt;). The first public instance of DBpedia (as described above) was released in February 2007. The official DBpedia coming out party occurred at &lt;a href=&quot;http://www2007.org/&quot; id=&quot;link-id1497c788&quot;&gt;WWW2007&lt;/a&gt;, Banff, during the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData/BanffGathering&quot; id=&quot;link-id1448b9e8&quot;&gt;inaugural Linked Data gathering&lt;/a&gt;, where it showcased the virtues and immense potential of &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id152257e0&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id111759a8&quot;&gt;Linked Data meme&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Who&amp;#39;s Behind It?&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id110e70f8&quot;&gt;OpenLink Software&lt;/a&gt; (developers of OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14462f60&quot;&gt;Virtuoso&lt;/a&gt; and providers of Web Hosting infrastructure), University of Leipzig, and Freie Univerity, Berlin. In addition, there is a burgeoning community of collaborators and contributors responsible DBpedia based applications, cross-linked data sets, ontologies (&lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id11244aa0&quot;&gt;OpenCyc&lt;/a&gt;, &lt;a href=&quot;http://www.ontologyportal.org/&quot; id=&quot;link-id110e4a40&quot;&gt;SUMO&lt;/a&gt;, &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id11109e48&quot;&gt;UMBEL&lt;/a&gt;, and &lt;a href=&quot;http://www.mpi-inf.mpg.de/yago-naga/yago/&quot; id=&quot;link-id10fb4218&quot;&gt;YAGO&lt;/a&gt;) and other utilities. Finally, DBpedia wouldn&amp;#39;t be possible without the global content contribution and curation efforts of Wikipedians, a point typically overlooked (albeit inadvertently).&lt;/p&gt; &lt;h3&gt;How is it Constructed?&lt;/h3&gt; &lt;p&gt;The steps are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; RDF data set dump preparation via Wikipedia content extraction and transformation to RDF model data, using the N3 data representation format - Java and &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id111c93b8&quot;&gt;PHP&lt;/a&gt; extraction code produced and maintained by the teams at Leipzig and Berlin &lt;/li&gt; &lt;li&gt; Deployment of Linked Data that enables Data browsing and exploration using any HTTP aware user agent (e.g. basic Web Browsers) - handled by OpenLink Virtuoso (handled by Berlin via the Pubby Linked Data Server during the early months of the DBpedia project) &lt;/li&gt; &lt;li&gt; SPARQL compliant Quad Store, enabling direct access to database records via SPARQL (Query language, REST or SOAP Web Service, plus a variety of query results serialization formats) - OpenLink Virtuoso since first public release of DBpedia &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; In a nutshell, there are four distinct and vital components to DBpedia. Thus, DBpedia doesn&amp;#39;t exist if all the project offered was a collection of RDF data dumps. Likewise, it doesn&amp;#39;t exist if you have a SPARQL compliant Quad Store without loaded data sets, and of course it doesn&amp;#39;t exist if you have a fully loaded SPARQL compliant Quad Store is up to the cocktail of challenges presented by live Web accessibility.&lt;/p&gt; &lt;h3&gt;Why is it Important?&lt;/h3&gt; &lt;p&gt; It remains a live exemplar for any individual or organization seeking to publishing or exploit HTTP based Linked Data on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id118e6388&quot;&gt;World Wide Web&lt;/a&gt;. Its existence continues to stimulate growth in both density and quality of the burgeoning Web of Linked Data.&lt;/p&gt; &lt;h3&gt;How Do I Use it?&lt;/h3&gt; &lt;p&gt; In the most basic sense, simply browse the HTML pages en route to discovery erstwhile relationships that exist across &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id112def88&quot;&gt;named entities&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id1591c5f8&quot;&gt;subject matter concepts&lt;/a&gt; / headings. Beyond that, simply look at DBpedia as a master lookup table in a Web hosted &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id11762618&quot;&gt;distributed database&lt;/a&gt; setup; enabling you to mesh your local domain specific details with DBpedia records via structured relations (triples or 3-tuples records) comprised of HTTP URIs from both realms e.g., owl:sameAs relations.&lt;/p&gt; &lt;h3&gt;What Can I Use it For?&lt;/h3&gt; &lt;p&gt; Expanding on the Master-Details point above, you can use its rich &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1170c000&quot;&gt;URI&lt;/a&gt; corpus to alleviate tedium associated with activities such as: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;List maintenance - e.g., Countries, States, Companies, Units of Measurement, Subject Headings etc.&lt;/li&gt; &lt;li&gt;Tagging - as a compliment to existing practices&lt;/li&gt; &lt;li&gt;Analytical Research - you&amp;#39;re only a LINK (URI) away from erstwhile difficult to attain research data spread across a broad range of topics&lt;/li&gt; &lt;li&gt;Closed Vocabulary Construction - rather than commence the futile quest of building your own closed vocabulary, simply leverage Wikipedia&amp;#39;s human curated vocabulary as our common base. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia34S&quot; id=&quot;link-id14a2e698&quot;&gt;Pre-loaded and Pre-configured instances of DBpedia 3.4&lt;/a&gt; - via publicly shared &lt;a href=&quot;http://aws.amazon.com/ebs/&quot; id=&quot;link-id1147fcf0&quot;&gt;Amazon Elastic Block Storage&lt;/a&gt; Snapshots&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfperformancetuning.html#rdfperfgeneraldbpedia&quot; id=&quot;link-id149ab528&quot;&gt;Virtuoso &amp;amp; DBpedia Tunning Guide&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dowhatimean.net/2009/11/whats-in-a-name-and-the-linked-data-police&quot; id=&quot;link-id110cba10&quot;&gt;What&amp;#39;s In a Name &amp;amp; The Linked Data Police&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-01-31T17:46:10.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Getting The Linked Data Value Pyramid Layers Right (Update #2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1593</atom:id>
  <atom:published>2010-01-31T22:44:04Z</atom:published>
  <atom:content type="html">&lt;p&gt; One of the real problems that pervades all routes to &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13539328&quot;&gt;Linked Data&lt;/a&gt; value prop. incomprehension stems from the layering of its value pyramid; especially when communicating with -initially detached- end-users. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note to &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Programmers:&lt;/strong&gt; Linked Data is about &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; (Wine) and not about Code (Fish). Thus, it isn&amp;#39;t a &amp;quot;programmer only zone&amp;quot;, far from it. More than anything else, its inherently inclusive and spreads its participation net widely across: Data Architects, Data Integrators, Power Users, &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id13600d98&quot;&gt;Knowledge&lt;/a&gt; Workers, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id149f8230&quot;&gt;Information&lt;/a&gt; Workers, Data Analysts, etc.. Basically, everyone that can &amp;quot;click on a link&amp;quot; is invited to this particular party; remember, it is about &amp;quot;Linked Data&amp;quot; not &amp;quot;Linked Code&amp;quot;, after all. :-) &lt;/p&gt; &lt;h3&gt;Problematic Value Pyramid Layering&lt;/h3&gt; &lt;p&gt; Here is an example of a Linked Data value pyramid that I am stumbling across --with some frequency-- these days (note: 1 being the pyramid apex):&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10e85538&quot;&gt;SPARQL&lt;/a&gt; Queries&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id1495b578&quot;&gt;RDF&lt;/a&gt; Data Stores&lt;/li&gt; &lt;li&gt; RDF Data Sets &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id158e4be0&quot;&gt;HTTP&lt;/a&gt; scheme URIs&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Basically, Linked Data deployment (assigning de-referencable HTTP URIs to DBMS records, their attributes, and attribute values [optionally] ) is occurring last. Even worse, this happens in the &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id626d988&quot;&gt;context&lt;/a&gt; of Linked Open Data oriented endeavors, resulting in nothing but confusion or inadvertent perpetuation of the overarching pragmatically challenged &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id111774b8&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; stereotype. &lt;/p&gt; &lt;p&gt; As you can imagine, hitting SPARQL as your introduction to Linked Data is akin to hitting &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id151f9938&quot;&gt;SQL&lt;/a&gt; as your introduction to Relational Database Technology, neither is an elevator-style value prop. relay mechanism. &lt;/p&gt; &lt;p&gt; In the relational realm, killer demos always started with desktop productivity tools (spreadsheets, report-writers, SQL QBE tools etc.) accessing, relational data sources en route to unveiling the &amp;quot;Productivity&amp;quot; and &amp;quot;Agility&amp;quot; value prop. that such binding delivered i.e., the desktop application (clients) and the databases (servers) are distinct, but operating in a mutually beneficial manner to all, courtesy of a data access standards such as &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id1519aac0&quot;&gt;ODBC&lt;/a&gt; (Open Database Connectivity). &lt;/p&gt; &lt;p&gt; In the Linked Data realm, learning to embrace and extend best practices from the relational dbms realm remains a challenge, a lot of this has to do with hangovers from a misguided perception that RDF databases will somehow completely replace &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id110dec88&quot;&gt;RDBMS&lt;/a&gt; engines, rather than compliment them. Thus, you have a counter productive variant of NIH (Not Invented Here) in play, taking us to the dreaded realm of: Break the Pot and You Own It (exemplified by the 11+ year Semantic Web Project comprehension and appreciation odyssey). &lt;/p&gt; &lt;p&gt; From my vantage point, here is how I believe the &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/images/URI_Data_Source_SemWeb.png&quot; id=&quot;link-id1592f528&quot;&gt;Linked Data value pyramid should be layered&lt;/a&gt;, especially when communicating the essential value prop.: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; HTTP URLs -- LINKs to documents (Reports) that users already appreciate, across the public Web and/or Intranets &lt;/li&gt; &lt;li&gt; HTTP URIs -- typically not visually distinguishable from the URLs, so use the Data exposed by de-referencing a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id11209ce8&quot;&gt;URL&lt;/a&gt; to show how each Data Item (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1449b558&quot;&gt;Entity&lt;/a&gt; or Object) is uniquely identified by a Generic HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id112065f8&quot;&gt;URI&lt;/a&gt;, and how clicking on the said URIs leads to more structured metadata bearing documents available in a variety of data representation formats, thereby enabling flexible data presentation (e.g., smarter HTML pages) &lt;/li&gt; &lt;li&gt; SPARQL -- when a user appreciates the data representation and presentation dexterity of a Generic HTTP URI, they will be more inclined to drill down an additional layer to unravel how HTTP URIs mechanically deliver such flexibility &lt;/li&gt; &lt;li&gt; RDF Data Stores -- at this stage the user is now interested data sources behind the Generic HTTP URIs, courtesy of natural desire to tweak the data presented in the report; thus, you now have an engaged user ready to absorb the &amp;quot;How Generic HTTP URIs Pull This Off&amp;quot; message &lt;/li&gt; &lt;li&gt;RDF Data Sets -- while attempting to make or tweak HTTP URIs, users become curious about the actual data loaded into the RDF Data Store, which is where data sets used to create powerful Lookup Data Spaces (e.g., &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id110675c0&quot;&gt;DBpedia&lt;/a&gt;) come into play such as those from the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2009-07-14.html&quot; id=&quot;link-id11127ff8&quot;&gt;LOD&lt;/a&gt; constellation as exemplified by &lt;a href=&quot;http://wiki.dbpedia.org/Datasets&quot; id=&quot;link-id14a2fad8&quot;&gt;DBpedia (extractions from Wikipedia)&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1565&quot; id=&quot;link-id149c7048&quot;&gt;Exploring the Linked Data Value Proposition&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id14998f98&quot;&gt;Simple Explanation of Linked Data &amp;amp; RDF Dynamics&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1546&quot; id=&quot;link-id114fbd58&quot;&gt;What is the Linked Data Meme About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1547&quot; id=&quot;link-id1447ada0&quot;&gt;Linked Data &amp;amp; Data Item Identifiers (Identity)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:02:14.000004-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is the DBpedia Project? (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1592</atom:id>
  <atom:published>2010-01-31T22:43:08Z</atom:published>
  <atom:content type="html">&lt;p&gt; The recent &lt;a href=&quot;http://en.wikipedia.org/wiki/Talk:DBpedia&quot; id=&quot;link-id1120a260&quot;&gt;Wikipedia imbroglio&lt;/a&gt; centered around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id14a5e588&quot;&gt;DBpedia&lt;/a&gt; is the fundamental driver for this particular &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id113ddc10&quot;&gt;blog&lt;/a&gt; post. At time of writing this blog post, the &lt;a href=&quot;http://en.wikipedia.org/wiki/DBpedia&quot; id=&quot;link-id158edec0&quot;&gt;DBpedia project definition in Wikipedia&lt;/a&gt; remains unsatisfactory due to the following shortcomings:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; inaccurate and incomplete definition of the Project&amp;#39;s What, Why, Who, Where, When, and How&lt;/li&gt; &lt;li&gt; inaccurate reflection of project essence, by skewing focus towards &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; extraction and data set dump production, which is at best a quarter of the project.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Here are some insights on DBpedia, from the perspective of someone intimately involved with the other three-quarters of the project.&lt;/p&gt; &lt;h3&gt; What is DBpedia?&lt;/h3&gt; &lt;p&gt; A live &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; accessible RDF model database (Quad Store) derived from Wikipedia content snapshots, taken periodically. The RDF database underlies a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11ba0ad0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1183c978&quot;&gt;Space&lt;/a&gt; comprised of: HTML (and most recently HTML+&lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id602eab8&quot;&gt;RDFa&lt;/a&gt;) based data browser pages and a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id11af5400&quot;&gt;SPARQL&lt;/a&gt; endpoint.&lt;/p&gt; &lt;p&gt; Note: &lt;a href=&quot;http://blog.dbpedia.org/2009/11/11/dbpedia-34-released/&quot; id=&quot;link-id110b8248&quot;&gt;DBpedia 3.4&lt;/a&gt; now exists in snapshot (warehouse) and &lt;a href=&quot;http://dbpedia-live.openlinksw.com/stats/&quot; id=&quot;link-id6473258&quot;&gt;Live Editions&lt;/a&gt; (currently being hot-staged). This post is about the snapshot (warehouse) edition, I&amp;#39;ll drop a different post about the DBpedia Live Edition where a new Delta-Engine covers both extraction and database record replacement, in realtime.&lt;/p&gt; &lt;h3&gt; When was it Created?&lt;/h3&gt; &lt;p&gt; As an idea under the moniker &amp;quot;DBpedia&amp;quot; it was conceptualized in late 2006 by researchers at University of Leipzig (lead by Soren Auer) and Freie University, Berlin (lead by &lt;a href=&quot;http://www.wiwiss.fu-berlin.de/en/institute/pwo/bizer/&quot; id=&quot;link-id14982c78&quot;&gt;Chris Bizer&lt;/a&gt;). The first public instance of DBpedia (as described above) was released in February 2007. The official DBpedia coming out party occurred at &lt;a href=&quot;http://www2007.org/&quot; id=&quot;link-id1497c788&quot;&gt;WWW2007&lt;/a&gt;, Banff, during the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData/BanffGathering&quot; id=&quot;link-id1448b9e8&quot;&gt;inaugural Linked Data gathering&lt;/a&gt;, where it showcased the virtues and immense potential of &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id152257e0&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id111759a8&quot;&gt;Linked Data meme&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt; Who&amp;#39;s Behind It?&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id110e70f8&quot;&gt;OpenLink Software&lt;/a&gt; (developers of OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14462f60&quot;&gt;Virtuoso&lt;/a&gt; and providers of Web Hosting infrastructure), University of Leipzig, and Freie Univerity, Berlin. In addition, there is a burgeoning community of collaborators and contributors responsible DBpedia based applications, cross-linked data sets, ontologies (&lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id11244aa0&quot;&gt;OpenCyc&lt;/a&gt;, &lt;a href=&quot;http://www.ontologyportal.org/&quot; id=&quot;link-id110e4a40&quot;&gt;SUMO&lt;/a&gt;, &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id11109e48&quot;&gt;UMBEL&lt;/a&gt;, and &lt;a href=&quot;http://www.mpi-inf.mpg.de/yago-naga/yago/&quot; id=&quot;link-id10fb4218&quot;&gt;YAGO&lt;/a&gt;) and other utilities. Finally, DBpedia wouldn&amp;#39;t be possible without the global content contribution and curation efforts of Wikipedians, a point typically overlooked (albeit inadvertently).&lt;/p&gt; &lt;h3&gt; How is it Constructed?&lt;/h3&gt; &lt;p&gt; The steps are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; RDF data set dump preparation via Wikipedia content extraction and transformation to RDF model data, using the N3 data representation format - Java and &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id111c93b8&quot;&gt;PHP&lt;/a&gt; extraction code produced and maintained by the teams at Leipzig and Berlin&lt;/li&gt; &lt;li&gt; Deployment of Linked Data that enables Data browsing and exploration using any HTTP aware user agent (e.g. basic Web Browsers) - handled by OpenLink Virtuoso (handled by Berlin via the Pubby Linked Data Server during the early months of the DBpedia project)&lt;/li&gt; &lt;li&gt; SPARQL compliant Quad Store, enabling direct access to database records via SPARQL (Query language, REST or SOAP Web Service, plus a variety of query results serialization formats) - OpenLink Virtuoso since first public release of DBpedia&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; In a nutshell, there are four distinct and vital components to DBpedia. Thus, DBpedia doesn&amp;#39;t exist if all the project offered was a collection of RDF data dumps. Likewise, it doesn&amp;#39;t exist without a fully populated SPARQL compliant Quad Store. Last but not least, it doesn&amp;#39;t exist if you have a fully loaded SPARQL compliant Quad Store isn&amp;#39;t up to the cocktail of challenges (query load and complexity) presented by live Web database accessibility.&lt;/p&gt; &lt;h3&gt; Why is it Important?&lt;/h3&gt; &lt;p&gt; It remains a live exemplar for any individual or organization seeking to publishing or exploit HTTP based Linked Data on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id118e6388&quot;&gt;World Wide Web&lt;/a&gt;. Its existence continues to stimulate growth in both density and quality of the burgeoning Web of Linked Data.&lt;/p&gt; &lt;h3&gt; How Do I Use it?&lt;/h3&gt; &lt;p&gt; In the most basic sense, simply browse the HTML based resource decriptor pages en route to discovering erstwhile undiscovered relationships that exist across &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id112def88&quot;&gt;named entities&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id1591c5f8&quot;&gt;subject matter concepts&lt;/a&gt; / headings. Beyond that, simply look at DBpedia as a master lookup table in a Web hosted &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id11762618&quot;&gt;distributed database&lt;/a&gt; setup; enabling you to mesh your local domain specific details with DBpedia records via structured relations (triples or 3-tuples records), comprised of HTTP URIs from both realms e.g., via owl:sameAs relations.&lt;/p&gt; &lt;h3&gt; What Can I Use it For?&lt;/h3&gt; &lt;p&gt; Expanding on the Master-Details point above, you can use its rich &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1170c000&quot;&gt;URI&lt;/a&gt; corpus to alleviate tedium associated with activities such as:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; List maintenance - e.g., Countries, States, Companies, Units of Measurement, Subject Headings etc.&lt;/li&gt; &lt;li&gt; Tagging - as a compliment to existing practices&lt;/li&gt; &lt;li&gt; Analytical Research - you&amp;#39;re only a LINK (URI) away from erstwhile difficult to attain research data spread across a broad range of topics&lt;/li&gt; &lt;li&gt; Closed Vocabulary Construction - rather than commence the futile quest of building your own closed vocabulary, simply leverage Wikipedia&amp;#39;s human curated vocabulary as our common base.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia34S&quot; id=&quot;link-id14a2e698&quot;&gt;Pre-loaded and Pre-configured instances of DBpedia 3.4&lt;/a&gt; - via publicly shared &lt;a href=&quot;http://aws.amazon.com/ebs/&quot; id=&quot;link-id1147fcf0&quot;&gt;Amazon Elastic Block Storage&lt;/a&gt; Snapshots&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfperformancetuning.html#rdfperfgeneraldbpedia&quot; id=&quot;link-id149ab528&quot;&gt;Virtuoso &amp;amp; DBpedia Tunning Guide&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dowhatimean.net/2009/11/whats-in-a-name-and-the-linked-data-police&quot; id=&quot;link-id110cba10&quot;&gt;What&amp;#39;s In a Name &amp;amp; The Linked Data Police&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-09-15T18:10:51.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>5 Very Important Things to Note about HTTP based Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1591</atom:id>
  <atom:published>2010-01-31T22:31:35Z</atom:published>
  <atom:content type="html">&lt;ol&gt; &lt;li&gt; It isn&amp;#39;t &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id115dfd68&quot;&gt;World Wide Web&lt;/a&gt; Specific (HTTP != World Wide Web)&lt;/li&gt; &lt;li&gt; It isn&amp;#39;t Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Specific &lt;/li&gt; &lt;li&gt; It isn&amp;#39;t about &amp;quot;Free&amp;quot; (Beer or Speech) &lt;/li&gt; &lt;li&gt; It isn&amp;#39;t about Markup (so don&amp;#39;t expect to grok it via &amp;quot;markup first&amp;quot; approach) &lt;/li&gt; &lt;li&gt;It&amp;#39;s about &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13a6aa98&quot;&gt;Hyperdata&lt;/a&gt; - the use of HTTP and REST to deliver a powerful platform agnostic mechanism for Data Reference, Access, and Integration.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; When trying to understand HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id18aa1490&quot;&gt;Linked Data&lt;/a&gt;, especially if you&amp;#39;re well versed in DBMS technology use (User, Power User, Architect, Analyst, DBA, or Programmer) think: &lt;br /&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; Open Database Connectivity (&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id1428fba0&quot;&gt;ODBC&lt;/a&gt;) without operating system, data model, or wire-protocol specificity or lock-in potential &lt;/li&gt; &lt;li&gt; Java Database Connectivity (&lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id18d3c2a8&quot;&gt;JDBC&lt;/a&gt;) without programming language specificity &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id125725b8&quot;&gt;ADO&lt;/a&gt;.NET without .NET runtime specificity and .NET bound language specificity &lt;/li&gt; &lt;li&gt; OLE-DB without Windows operating system &amp;amp; programming language specificity &lt;/li&gt; &lt;li&gt; XMLA without XML format specificity - with Tabular and Multidimensional results formats expressible in a variety of data representation formats. &lt;/li&gt; &lt;li&gt;All of the above scoped to the Record rather than Container level, with Generic HTTP scheme URIs associated with each Record, Field, and Field value (optionally) &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Remember the need for Data Access &amp;amp; Integration technology is the by product of the following realities:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Human curated data is ultimately dirty, because: &lt;ul&gt; &lt;li&gt;our thick thumbs, inattention, distractions, and general discomfort with typing, make typos prevalent&lt;/li&gt; &lt;li&gt;database engines exist for a variety of data models - Graph, Relational, Hierarchical;&lt;/li&gt; &lt;li&gt;within databases you have different record container/partition names e.g. Table Names;&lt;/li&gt; &lt;li&gt;within a database record container you have records that are really aspects of the same thing (different keys exist in a plethora of operational / line of business systems that expose aspects of the same &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id13378338&quot;&gt;entity&lt;/a&gt; e.g., customer data that spans Accounts, CRM, ERP application databases);&lt;/li&gt; &lt;li&gt;different field names (one database has &amp;quot;EMP&amp;quot; while another has &amp;quot;Employee&amp;quot;) for the same record&lt;/li&gt;.&lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Units of measurement is driven by locale, the UK office wants to see sales in Pounds Sterling while the French office prefers Euros etc.&lt;/li&gt; &lt;li&gt;All of the above is subject to &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id17e46398&quot;&gt;context&lt;/a&gt; halos which can be quite granular re. sensitivity e.g. staff travel between locations that alter locales and their roles; basically, profiles matters a lot.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1364&quot; id=&quot;link-id128f0fe8&quot;&gt;ODBC and WODBC (Web Open Database Connectivity) Comparison&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1364&quot; id=&quot;link-id1367cd18&quot;&gt;Creating, Deploying, and Exploiting Linked Data Presentation&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.odata.org/&quot; id=&quot;link-id122ab708&quot;&gt;Open Data Protocol Project&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:00:56-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>5 Game Changing Things about the OpenLink Virtuoso + AWS Cloud Combo</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-31#1590</atom:id>
  <atom:published>2010-01-31T22:29:34Z</atom:published>
  <atom:content type="html">&lt;p&gt; Here are 5 powerful benefits you can immediately derive from the combination of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id17eb8988&quot;&gt;Virtuoso&lt;/a&gt; and Amazon&amp;#39;s AWS services (specifically the EC2 and EBS components): &lt;br /&gt; &lt;/p&gt; &lt;ol&gt; &lt;li&gt; Acquire your own personal or service specific &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1423e520&quot;&gt;data space&lt;/a&gt; in the Cloud. Think DBase, Paradox, FoxPRO, Access of yore, but with the power of &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id136c6290&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/IBM_Informix&quot; id=&quot;link-id11b269b8&quot;&gt;Informix&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Microsoft_SQL_Server&quot; id=&quot;link-id138084b8&quot;&gt;Microsoft SQL Server&lt;/a&gt; etc.. using a Conceptual, as opposed to solely Logical, model based DBMS (i.e., a Hybrid DBMS Engine for: &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id132a7938&quot;&gt;SQL&lt;/a&gt;, RDF, XML, and Full Text) &lt;/li&gt; &lt;li&gt; Ability to share and control access to your resources using innovations like &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id17ee9d28&quot;&gt;FOAF&lt;/a&gt;+SSL, OpenID, and OAuth, all from one place &lt;/li&gt; &lt;li&gt; Construction of personal or organization based FOAF profiles in a matter of minutes; by simply creating a basic DBMS (or &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id14784ae0&quot;&gt;ODS&lt;/a&gt; application layer) account; and then using this profile to create strong links (references) to all your Data silos (esp. those from the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 2.0 realm) &lt;/li&gt; &lt;li&gt; Load data sets from the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id17e6ac98&quot;&gt;LOD&lt;/a&gt; cloud or Sponge existing Web resources (i.e., on the fly data transformation to RDF model based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id17e65d38&quot;&gt;Linked Data&lt;/a&gt;) and then use the combination to build powerful lookup services that enrich the value of URLs (think: Web addressable reports holding query results) that you publish &lt;/li&gt; &lt;li&gt; Bind all of the above to a domain that you own (e.g. a .Name domain) so that you have an attribution-friendly &amp;quot;authority&amp;quot; component for resource URLs and &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id118a08d8&quot;&gt;Entity&lt;/a&gt; URIs published from your Personal Linked Data Space on the Web (or private HTTP network). &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; In a nutshell, the AWS Cloud infrastructure simplifies the process of generating Federated presence on the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id1380af38&quot;&gt;Internet&lt;/a&gt; and/or &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id11633b10&quot;&gt;World Wide Web&lt;/a&gt;. Remember, centralized networking models always end up creating data silos, in some &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id142006f0&quot;&gt;context&lt;/a&gt;, ultimately! :-) &lt;/p&gt;</atom:content>
  <atom:updated>2010-02-01T08:59:36-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Chronicles from the Field: Nepomuk, KDE, and the quest for a sophisticated RDF DBMS.</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-28#1602</atom:id>
  <atom:published>2010-01-28T16:14:04Z</atom:published>
  <atom:content type="html">&lt;p&gt;For this particular user experience chronicle, I&amp;#39;ve simply inserted the content of &lt;a href=&quot;http://trueg.wordpress.com&quot; id=&quot;link-id1368b4d8&quot;&gt;Sebastian Trueg&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://trueg.wordpress.com/2010/01/26/what-we-did-last-summer-and-the-rest-of-2009-a-look-back-onto-the-nepomuk-development-year-with-an-obscenely-long-title/#comments&quot; id=&quot;link-id139dddb0&quot;&gt;What We Did Last Summer (And the Rest of 2009) – A Look Back Onto the Nepomuk Development Year ...&lt;/a&gt;, directly into this post, without any additional commentary or modification.&lt;/p&gt; &lt;div class=&quot;snap_preview&quot;&gt; &lt;p&gt;2009 is over. &lt;em&gt;Yeah, sure, trueg, we know that, it has been over for a while now!&lt;/em&gt; Ok, ok, I am a bit late, but still I would like to get this one out - if only for my archive. So here goes.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id64672f0&quot;&gt;Virtuoso&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;Let’s start with the major topic of 2009 (and also the beginning of 2010): The new Nepomuk database backend: &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/&quot; id=&quot;link-id13cc47e0&quot;&gt;Virtuoso&lt;/a&gt;. Everybody who used Nepomuk had the same problems: you either used the &lt;a href=&quot;http://openrdf.org/&quot; id=&quot;link-id13a4ac88&quot;&gt;sesame2&lt;/a&gt; backend which depends on Java and steals all of your memory or you were stuck with &lt;a href=&quot;http://librdf.org/&quot; id=&quot;link-id11b6a550&quot;&gt;Redland&lt;/a&gt; which had the worst performance and missed some &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id139d82b8&quot;&gt;SPARQL&lt;/a&gt; features making important parts of Nepomuk  like queries unusable. So more than a year ago I had the idea to use the one GPL’ed database server out there that supported RDF in a professional manner: &lt;a href=&quot;http://www.openlinksw.com/&quot; id=&quot;link-id139fd948&quot;&gt;OpenLin&lt;/a&gt;k’s &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/&quot; id=&quot;link-id12329590&quot;&gt;Virtuoso&lt;/a&gt;. It has all the features we need, has a very good performance, and scales up to dimensions we will probably never reach on the desktop (&lt;em&gt;yeah, right, and 64k main memory will be enough forever!&lt;/em&gt;). So very early I started coding the necessary Soprano plugin which would talk to a locally running Virtuoso server through &lt;a href=&quot;http://en.wikipedia.org/wiki/Open_Database_Connectivity&quot; id=&quot;link-id14930d90&quot;&gt;ODBC&lt;/a&gt;. But since I ran into tons of small problems (as always) and got sidetracked by other tasks I did not finish it right away. OpenLink, however, was very interested in the idea of their server being part of every KDE installation (why wouldn’t they ;)). So they not only introduced a &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/databaseadmsrv.html#ini_Parameters&quot; id=&quot;link-id136763c0&quot;&gt;lite-mode&lt;/a&gt; which makes Virtuoso suitable for the desktop but also helped in debugging all the problems that I had left. Many test runs, patches, and a Virtuoso 5.0.12 release later &lt;a href=&quot;http://trueg.wordpress.com/2009/10/22/virtuoso-once-more-with-feeling/&quot; id=&quot;link-id13c5a5a0&quot;&gt;I could finally announce the Virtuoso integration&lt;/a&gt; as usable.&lt;/p&gt; &lt;p&gt;Then end of last year I dropped the support for sesame2 and redland. Virtuoso is now the only supported database backend. The reason is simple: Virtuoso is way more powerful than the rest - not only in terms of performance - and it is fully implemented in &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id13a17cd8&quot;&gt;C&lt;/a&gt;(++) without any traces of Java. Maybe even more important is the integration of the full text index which makes the previously used CLucene index unnecessary. Thus, we can finally combine full text and graph queries in one SPARQL query. This results in a cleaner API and way faster return of  search results since there is no need to combine the results from several queries anymore. A direct result of that is the new &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk/html/namespaceNepomuk_1_1Query.html&quot; id=&quot;link-id149a9fd8&quot;&gt;Nepomuk Query API&lt;/a&gt; which I will discuss later.&lt;/p&gt; &lt;p&gt;So now the only thing I am waiting for is the first bugfix release of Virtuoso 6, i.e. 6.0.1 which will fix the bugs that make 6.0.0 fail with Nepomuk. Should be out any day now. :)&lt;/p&gt; &lt;h2&gt;The Nepomuk Query API&lt;/h2&gt; &lt;p&gt;Querying &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; in Nepomuk pre-KDE-4.4 could be done in one of two ways: 1. Use the very limited capabilities of the &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk/html/classNepomuk_1_1ResourceManager.html&quot; id=&quot;link-id139ad3d0&quot;&gt;ResourceManager&lt;/a&gt; to list resources with certain properties or of a certain type; or 2. Write your own &lt;a href=&quot;http://techbase.kde.org/Development/Tutorials/Metadata/Nepomuk/AdvancedQueries&quot; id=&quot;link-id13c74608&quot;&gt;SPARQL query using ugly QString::arg replacements&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;With the introduction of Virtuoso and its awesome power we can now do pretty much everything in one query. This allowed &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id13c4cf18&quot;&gt;me&lt;/a&gt; to finally create a query API for KDE: &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk/html/classNepomuk_1_1Query_1_1Query.html&quot; id=&quot;link-id602e818&quot;&gt;Nepomuk::Query::Query&lt;/a&gt; and friends. I won’t go into much detail here since I did that &lt;a href=&quot;http://trueg.wordpress.com/2009/12/07/convenient-querying-in-libnepomuk/&quot; id=&quot;link-id11282ff8&quot;&gt;before&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;All in all you should remember one thing: whenever you think about writing your own SPARQL query in a KDE application - have a look at libnepomukquery. It is very likely that you can avoid the hassle of debugging a query by using the query API.&lt;/p&gt; &lt;p&gt;The first nice effect of the new API (apart from me using it all over the place obviously) is the new query interface in Dolphin. Internally it simply combines a bunch of &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk/html/classNepomuk_1_1Query_1_1Term.html&quot; id=&quot;link-id11952270&quot;&gt;Nepomuk::Query::Term&lt;/a&gt; objects into a &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/nepomuk/html/classNepomuk_1_1Query_1_1AndTerm.html&quot; id=&quot;link-id13aa85b8&quot;&gt;Nepomuk::Query::AndTerm&lt;/a&gt;. All very readable and no ugly query strings.&lt;/p&gt; &lt;div id=&quot;attachment_234&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 610px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/dolphin-kde-4-4-search-panel.png&quot; id=&quot;link-id11454028&quot;&gt;&lt;img class=&quot;size-full wp-image-234&quot; title=&quot;Dolphin Search Panel in KDE SC 4.4&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/dolphin-kde-4-4-search-panel.png?w=600&amp;amp;h=208&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;208&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;Dolphin Search Panel in KDE SC 4.4&lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Shared Desktop Ontologies&lt;/h2&gt; &lt;p&gt;An important part of the &lt;a href=&quot;http://nepomuk.semanticdesktop.org/&quot; id=&quot;link-id13a35a90&quot;&gt;Nepomuk research project&lt;/a&gt; was the creation of a set of &lt;a href=&quot;http://www.semanticdesktop.org/ontologies/&quot; id=&quot;link-id123a6700&quot;&gt;ontologies&lt;/a&gt; for describing desktop resources and their metadata. After the &lt;a href=&quot;http://xesam.org/main/XesamAbout&quot; id=&quot;link-id13c70ab8&quot;&gt;Xesam&lt;/a&gt; project under the umbrella of &lt;a href=&quot;http://www.freedesktop.org/&quot; id=&quot;link-id139e2108&quot;&gt;freedesktop.org&lt;/a&gt; had been convinced to use RDF for describing file metadata they developed their own ontology. Thanks to Evgeny (phreedom) Egorochkin and Antonie Mylka both the Xesam ontology and the Nepomuk &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id119be318&quot;&gt;Information&lt;/a&gt; Elements Ontology were already very close in design. Thus, it was relatively easy to merge the two and be left with only one ontology to support. Since then not only KDE but also &lt;a href=&quot;http://strigi.sourceforge.net/&quot; id=&quot;link-id123b63f0&quot;&gt;Strigi&lt;/a&gt; and &lt;a href=&quot;http://projects.gnome.org/tracker/&quot; id=&quot;link-id13d02a30&quot;&gt;Tracker&lt;/a&gt; are using the Nepomuk ontologies.&lt;/p&gt; &lt;p&gt;At the Gran Canaria Desktop Summit I met some of the guys from Tracker and we tried to come up with a plan to create a joint project to maintain the ontologies. This got off to a rough start as nobody really felt responsible. So I simply took the initiative and released the &lt;a href=&quot;http://sourceforge.net/projects/oscaf/files/&quot; id=&quot;link-id148d7078&quot;&gt;shared-desktop-ontologies&lt;/a&gt; version 0.1 in November 2009. The result was a s***-load of hate-mails and bug reports due to me breaking KDE build. But in the end it was worth it. Now the package is established and other projects can start to pick it up to create data compatible to the Nepomuk system and Tracker.&lt;/p&gt; &lt;p&gt;Today the ontologies (and the shared-desktop-ontologies package) are maintained in the &lt;a href=&quot;http://sourceforge.net/apps/trac/oscaf/&quot; id=&quot;link-id10ce1038&quot;&gt;Oscaf project at Sourceforge&lt;/a&gt;. The situation is far from perfect but it is a good start. If you need specific properties in the ontologies or are thinking about creating one for your own application - come and join us in the &lt;a href=&quot;http://sourceforge.net/apps/trac/oscaf/report/1&quot; id=&quot;link-id11413910&quot;&gt;bug tracker&lt;/a&gt;…&lt;/p&gt; &lt;h2&gt;Timeline KIO Slave&lt;/h2&gt; &lt;p&gt;It was at the Akonadi meeting that Will Stephenson and myself got into talking about mimicking some &lt;a href=&quot;http://live.gnome.org/Zeitgeist&quot; id=&quot;link-id116888b0&quot;&gt;Zeitgeist&lt;/a&gt; functionality through Nepomuk. Basically it meant gathering some data when opening and when saving files. We quickly came up with a hacky patch for KIO and &lt;a href=&quot;http://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/classKFileDialog.html&quot; id=&quot;link-id13637348&quot;&gt;KFileDialog&lt;/a&gt; which covered most cases and allowed us to track when a file was modified and by which application. This little experiment did not leave that state though (it will, however, this year) but another one did: Zeitgeist also provides a fuse filesystem which allows to browse the files by modification dates. Well, whatever fuse can do, KIO can do as well. &lt;a href=&quot;http://trueg.wordpress.com/2009/10/26/just-another-way-of-browsing-your-files/&quot; id=&quot;link-id13cf58c0&quot;&gt;Introducing the timeline:/ KIO slave&lt;/a&gt; which gives a calendar view onto your files.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://trueg.wordpress.com/2009/10/26/just-another-way-of-browsing-your-files/&quot; id=&quot;link-id113d4988&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-208&quot; title=&quot;timeline-october&quot; src=&quot;http://trueg.files.wordpress.com/2009/10/timeline-october.png?w=300&amp;amp;h=235&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;235&quot; /&gt; &lt;/a&gt; &lt;/p&gt; &lt;h2&gt;Tips And Tricks&lt;/h2&gt; &lt;p&gt;Well, I thought I would mention the &lt;a href=&quot;http://techbase.kde.org/Development/Tutorials/Metadata/Nepomuk/TipsAndTricks&quot; id=&quot;link-id116357d0&quot;&gt;Tips And Tricks&lt;/a&gt; section I wrote for the &lt;a href=&quot;http://techbase.kde.org/Development/Tutorials/Metadata/Nepomuk&quot; id=&quot;link-id14473520&quot;&gt;techbase&lt;/a&gt;. It might not be a big deal but I think it contains some valuable information in case you are using Nepomuk as a developer.&lt;/p&gt; &lt;h2&gt;Google Summer Of Code 2009&lt;/h2&gt; &lt;p&gt;This time around I had the privilege to &lt;a href=&quot;http://trueg.wordpress.com/2009/04/22/nepomuk-in-the-summer-x2/&quot; id=&quot;link-id116b0cf8&quot;&gt;mentor two students&lt;/a&gt; in the Google Summer of Code. Alessandro Sivieri and Adam Kidder did outstanding work on &lt;a href=&quot;http://trueg.wordpress.com/2009/08/25/gsoc-wrap-up-part-1/&quot; id=&quot;link-id13c9f2f8&quot;&gt;Improved Virtual Folders&lt;/a&gt; and the &lt;a href=&quot;http://trueg.wordpress.com/2009/08/28/gsoc-wrap-up-part-2/&quot; id=&quot;link-id123bac00&quot;&gt;Smart File Dialog&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Adam’s work lead me to some heavy improvements in the Nepomuk KIO slaves myself which I only finished this week (more details on that coming up). Alessandro continued his work on faceted file browsing in KDE and created:&lt;/p&gt; &lt;h3&gt;Sembrowser&lt;/h3&gt; &lt;p&gt;Alessandro is following up on his work to make faceted file browsing a reality in 2010 (and KDE SC 4.5). Since it was too late to get faceted browsing into KDE SC 4.4 he is working on &lt;a href=&quot;http://www.kde-apps.org/content/show.php/Sembrowser?content=117692&quot; id=&quot;link-id117c67d0&quot;&gt;Sembrowser&lt;/a&gt;, a stand-alone faceted file browser which will be the grounds for experiments until the code is merged into Dolphin.&lt;/p&gt; &lt;div id=&quot;attachment_238&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 310px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/sembrowser.png&quot; id=&quot;link-id13aa8e80&quot;&gt;&lt;img class=&quot;size-medium wp-image-238&quot; title=&quot;sembrowser&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/sembrowser.png?w=300&amp;amp;h=189&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;189&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;Faceted Browsing in KDE with Sembrowser&lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Nepomuk Workshops&lt;/h2&gt; &lt;p&gt;In 2009 I organized the first Nepomuk workshop in Freiburg, Germany. And also the second one. While &lt;a href=&quot;http://trueg.wordpress.com/2009/06/23/the-first-nepomuk-workshop-its-a-wrap/&quot; id=&quot;link-id13b553e0&quot;&gt;I reported properly on the first one&lt;/a&gt; I still owe a summary for the second one. I will get around to that - sooner or later. ;)&lt;/p&gt; &lt;h2&gt;CMake Magic&lt;/h2&gt; &lt;p&gt; &lt;a href=&quot;http://soprano.sourceforge.net/&quot; id=&quot;link-id148bfad8&quot;&gt;Soprano&lt;/a&gt; gives us a nice command line tool to create a C++ namespace from an ontology file: &lt;a href=&quot;http://soprano.sourceforge.net/apidox/trunk/soprano_devel_tools.html&quot; id=&quot;link-iddac3b58&quot;&gt;onto2vocabularyclass&lt;/a&gt;. It produces nice convenience namespaces like &lt;a href=&quot;http://soprano.sourceforge.net/apidox/trunk/namespaceSoprano_1_1Vocabulary_1_1NAO.html&quot; id=&quot;link-idfd4b970&quot;&gt;Soprano::Vocabulary::NAO&lt;/a&gt;. Nepomuk adds another tool named &lt;a href=&quot;http://techbase.kde.org/Development/Tutorials/Metadata/Nepomuk/ResourceGenerator&quot; id=&quot;link-id11b60200&quot;&gt;nepomuk-rcgen&lt;/a&gt;. Both were a bit clumsy to use before. Now we have nice cmake macros which make it very simple to use both.&lt;/p&gt; &lt;p&gt;See the &lt;a href=&quot;http://techbase.kde.org/Development/Tutorials/Metadata/Nepomuk/ResourceGenerator&quot; id=&quot;link-id11963490&quot;&gt;techbase article&lt;/a&gt; on how to use the new macros.&lt;/p&gt; &lt;h2&gt;Bangarang&lt;/h2&gt; &lt;p&gt;Without my &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-iddcbd7c8&quot;&gt;knowledge&lt;/a&gt; (imagine that!) Andrew Lake created an amazing new media player named &lt;a href=&quot;http://bangarangkde.wordpress.com/&quot; id=&quot;link-id113d9500&quot;&gt;Bangarang&lt;/a&gt; - &lt;em&gt;a Jamaican word for noise, chaos or disorder.&lt;/em&gt; This player is Nepomuk-enabled in the sense that it has a media library which lets you browse your media files based on the Nepomuk data. It remembers the number of times a song or a video has been played and when it was played last. It allows to add detail such as the TV series name, season, episode number, or actors that are in the video - all through Nepomuk (I hope we will soon get &lt;a href=&quot;http://thetvdb.com/&quot; id=&quot;link-id1154d7a0&quot;&gt;tvdb&lt;/a&gt; integration).&lt;/p&gt; &lt;div id=&quot;attachment_242&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 310px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/bangarang2.png&quot; id=&quot;link-id148bcdb8&quot;&gt;&lt;img class=&quot;size-medium wp-image-242&quot; title=&quot;bangarang2&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/bangarang2.png?w=300&amp;amp;h=208&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;208&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;Edit metadata directly in Bangarang&lt;/p&gt; &lt;/div&gt; &lt;div id=&quot;attachment_243&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 303px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/bangarang-dolphin-fileinfo.png&quot; id=&quot;link-id11c70a48&quot;&gt;&lt;img class=&quot;size-full wp-image-243&quot; title=&quot;bangarang-dolphin-fileinfo&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/bangarang-dolphin-fileinfo.png?w=293&amp;amp;h=242&quot; alt=&quot;&quot; width=&quot;293&quot; height=&quot;242&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;Dolphin showing TV episode metadata created by Bangarang&lt;/p&gt; &lt;/div&gt; &lt;div id=&quot;attachment_245&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 310px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/bangarang-dolphin-search.png&quot; id=&quot;link-id149200f8&quot;&gt;&lt;img class=&quot;size-medium wp-image-245&quot; title=&quot;bangarang-dolphin-search&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/bangarang-dolphin-search.png?w=300&amp;amp;h=212&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;212&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;And of course searching for it works, too...&lt;/p&gt; &lt;/div&gt; &lt;div id=&quot;attachment_244&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 310px&quot;&gt; &lt;a href=&quot;http://trueg.files.wordpress.com/2010/01/bangarang1.png&quot; id=&quot;link-id114f7c80&quot;&gt;&lt;img class=&quot;size-medium wp-image-244&quot; title=&quot;bangarang1&quot; src=&quot;http://trueg.files.wordpress.com/2010/01/bangarang1.png?w=300&amp;amp;h=225&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt; &lt;/a&gt; &lt;p class=&quot;wp-caption-text&quot;&gt;And it is pretty, too...&lt;/p&gt; &lt;/div&gt; &lt;p&gt;I am especially excited about this since finally applications not written or mentored by me start contributing Nepomuk data.&lt;/p&gt; &lt;h2&gt;Gran Canaria Desktop Summit&lt;/h2&gt; &lt;p&gt;2009 was also the year of the first Gnome-KDE joint-conference. Let me make a bulletin for completeness and refer to &lt;a href=&quot;http://trueg.wordpress.com/2009/07/13/gran-canaria-desktop-summit-2009-the-nepomuk-perspective/&quot; id=&quot;link-id143ff668&quot;&gt;my previous blog post reporting on my experiences on the island&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Well, that was by far not all I did in 2009 but I think I covered most of the important topics. And after all it is ‘just a blog entry’ - there is no need for completeness. Thanks for reading.&lt;/p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/trueg.wordpress.com/232/&quot; id=&quot;link-id118a1950&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/trueg.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/trueg.wordpress.com/232/&quot; id=&quot;link-id148ffb08&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/trueg.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/trueg.wordpress.com/232/&quot; id=&quot;link-id13c65a88&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/trueg.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/trueg.wordpress.com/232/&quot; id=&quot;link-id119b85a0&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/trueg.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/trueg.wordpress.com/232/&quot; id=&quot;link-id13f5d6b8&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/trueg.wordpress.com/232/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=trueg.wordpress.com&amp;amp;blog=6648236&amp;amp;post=232&amp;amp;subd=trueg&amp;amp;ref=&amp;amp;feed=1&quot; /&gt; &lt;/div&gt;&amp;quot;</atom:content>
  <atom:updated>2010-02-01T09:02:55-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>One Technology That Will Rock 2010 (Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2010-01-02#1601</atom:id>
  <atom:published>2010-01-02T17:30:38Z</atom:published>
  <atom:content type="html">&lt;p&gt;Thanks to the &lt;a href=&quot;http://www.techcrunch.com/&quot; id=&quot;link-id114eb070&quot;&gt;TechCrunch&lt;/a&gt; post titled: &lt;a href=&quot;http://www.techcrunch.com/2010/01/01/ten-technologies-2010/&quot; id=&quot;link-id1146e550&quot;&gt;Ten Technologies That Will Rock 2010&lt;/a&gt;, I&amp;#39;ve been able to quickly construct a derivative post that condenses the ten item list down to a Single Technology That Will Rock 2010 :-)&lt;/p&gt; &lt;p&gt;Sticking with the TechCrunch layout, here is why all roads simply lead to &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11141d50&quot;&gt;Linked Data&lt;/a&gt; come 2010 and beyond: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;strong&gt;The Tablet: &lt;/strong&gt;a new form factor addition re. &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id13f09418&quot;&gt;Internet&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; application hosts which is just another way of saying: Linked Data will be accessible from Tablet applications.&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Geo:&lt;/strong&gt; GPS chips are now standard features of mobile phones, so &lt;a href=&quot;http://www.techcrunch.com/2009/12/23/location-2010/&quot; id=&quot;link-id112cfdd0&quot;&gt;geolocation&lt;/a&gt; is increasingly becoming a necessary feature for any killer app. Thus, GeoSpatial Linked Data and GeopSpatial Queries are going to be a critical success factor for any endeavor that seeks to engage mobile applications developers and ultimately their end-users. Basiacally, you want to be able to perform Esoteric Search from these devices of the form: Find Vendors of a Camcorder (e.g., with a Zoom Factor: Weight Ratio of X) within a 2km Radius of my current location. Or how many items from my WishList are available from a Vendor within a 2km radius of my current location. Conversely, provide Vendors with the ability to spot potential Customers within a 2km of a given &amp;quot;clicks &amp;amp; mortar&amp;quot; location (e.g. BestBuy store).&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Realtime Search: &lt;/strong&gt;Rich Structured Profiles that leverage standards such as &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id140ece38&quot;&gt;FOAF&lt;/a&gt; and &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global&quot; id=&quot;link-id11856318&quot;&gt;FOAF+SSL&lt;/a&gt; will enable Highly Personalized Realtime Search (HPRS) without compromisng privacy. Tecnically, this is about &lt;a href=&quot;http://esw.w3.org/topic/WebID&quot; id=&quot;link-id13ec6260&quot;&gt;WebID&lt;/a&gt;s securely bound to X.509 Certificates, providing access to verifiable and highly navigable Personal Profile &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Spaces that also double as personal search index entry points.&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Chrome OS: &lt;/strong&gt;Just another operating system for exploiting the burgeoning Web of Linked Data&lt;/li&gt; &lt;li&gt; &lt;strong&gt;HTML5: &lt;/strong&gt;Courtesy of &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id115b08f0&quot;&gt;RDFa&lt;/a&gt;, just another mechanism for exposing Linked Data by making HTML+RDFa a bona fide markup for &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id1195b070&quot;&gt;metadata&lt;/a&gt; (i.e., format for describing real world objects via their attribute-value graphs)&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Mobile Video:&lt;/strong&gt; Simplifies the production and sharing of Video annotations (comments, reviews etc.) en route to creating rich Linked Discourse Data Spaces.&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Augmented Reality:&lt;/strong&gt; Ditto&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Mobile Transactions:&lt;/strong&gt; As per points 1&amp;amp;2 above, Vendor Discovery and Transaction Conusmation will increasingly be driven by high SDQ applications. The &amp;quot;Funnel Effect&amp;quot; (more choices based on individual preferences) will be a critical success factor for any one operating in the Mobile Transaction realm. Note, without Linked Data you cannot deliver scalable solutions that handle the combined requirements of: SDQ, &amp;quot;Funnel Effect&amp;quot;, and Mobile Device form factor, will simply maginify the importance of Web accessible Linked Data.&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Android:&lt;/strong&gt; An additional platform for items 1-8; basically, 2010 isn&amp;#39;t going to be an iPhone only zone. Personally, this reminds &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id111ab5e8&quot;&gt;me&lt;/a&gt; of a battle from the past i.e., Microsoft vs Apple, re. desktop computing dominance. Google has studied history very well :-)&lt;/li&gt; &lt;li&gt; &lt;strong&gt;Social CRM:&lt;/strong&gt; this is simply about applying points 1-9 alongide the construction of Linked Data from eCRM Data Spaces.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;As I&amp;#39;ve stated in the past (across a variety of mediums), you cannot build applications that have long term value without addressing the following issues:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Data Item or Object Identity&lt;/li&gt; &lt;li&gt;Data Structure -- Data Models&lt;/li&gt; &lt;li&gt;Data Representation -- Data Model &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1148eaf8&quot;&gt;Entity&lt;/a&gt; &amp;amp; Relationships Representation mechanism (as delivered by metadata oriented markup)&lt;/li&gt; &lt;li&gt;Data Storage -- Database Management Systems&lt;/li&gt; &lt;li&gt;Data Access -- Data Access Protocols &lt;/li&gt; &lt;li&gt;Data Presentation -- How you present Views and Reports from Structured Data Sources&lt;/li&gt; &lt;li&gt;Data Security -- Data Access Policies&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The items above basically showcase the very essence of the HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1239af68&quot;&gt;URI&lt;/a&gt; abstraction that drives HTTP based Linked Data; which is also the basic payload unit that underlies &lt;a href=&quot;http://dbpedia.org/resource/Representational_State_Transfer&quot; id=&quot;link-id11489a98&quot;&gt;REST&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;I simply hope that the next decade marks a period of broad appreciation and comprehension of Data Access, Integration, and Management issues on the parts of: application developers, integrators, analysts, end-users, and decision makers. Remember, without structured Data we cannot produce or share &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13cb5040&quot;&gt;Information&lt;/a&gt;, and without Information, we cannot produce of share &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id647abb0&quot;&gt;Knowledge&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1567&quot; id=&quot;link-id13fa3a20&quot;&gt;HTTP URI Abstraction and Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.dataflux.com/dfblog/?p=1458,&quot; id=&quot;link-id138f3ea8&quot;&gt;First Law of Data Quality&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://walkingoncoals.blogspot.com/2009/12/whos-data-is-it-part-1.html&quot; id=&quot;link-id13efccb8&quot;&gt;Who&amp;#39;s Data Is It?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1442&quot; id=&quot;link-id1355df68&quot;&gt;Serendipitous Discovery Quotient&lt;/a&gt; (SDQ)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.seangolliher.com/2009/linked-data/serendipitous-discovery-quotient-sdq-the-future-of-seo-or-an-abstract-concept/&quot; id=&quot;link-id11217cb8&quot;&gt;SDQ: The Future of SEO or an Abstract Concept?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1587&quot; id=&quot;link-id139cfbe0&quot;&gt;SPARQL &amp;amp; GeoSpatial Indexing&lt;/a&gt; (implications of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id13f51b78&quot;&gt;SPARQL&lt;/a&gt;-GEO)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blog.jonudell.net/2009/09/09/talking-with-kingsley-idehen-about-mastering-your-own-search-index/&quot; id=&quot;link-id13c5c248&quot;&gt;Mastering Your Own Search Index&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blog.jonudell.net/2009/11/23/talking-with-martin-hepp-about-solving-the-paradox-of-choice/&quot; id=&quot;link-id135ba4d0&quot;&gt;Solving the Paradox of Choice&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:02:41-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data and Virtuoso in 2010</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-12-29#1603</atom:id>
  <atom:published>2009-12-29T15:24:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is again time for the end-of-year &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1f82a100&quot;&gt;blog&lt;/a&gt; post.&lt;/p&gt; &lt;p&gt;In 2009, &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1dab31a0&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?tag=scalability&quot; id=&quot;link-id11951c50&quot;&gt;scalability questions&lt;/a&gt; were solved in their broad outline and the corresponding &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x116a7b20&quot;&gt;Virtuoso&lt;/a&gt; release was built and used in production internally. Its general availability is now imminent while it has been available on a case-by-case basis thus far.&lt;/p&gt; &lt;p&gt;In 2010, we take on a new challenge: To bring RDF closer to parity with equivalent relational solutions. This will also entail some significant improvements to our relational technology.&lt;/p&gt; &lt;p&gt;Storage density is a key ingredient of performance. Some of the advances will be in this area; other advances will be in increased parallelism of execution. Right now we run things in vectored batches in cluster situations where message latency forces operations to be shipped in large chunks. Next we will do this across the board, also in single servers. The advantages of this for &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1c7819f0&quot;&gt;cache&lt;/a&gt; behavior and other factors are known in the literature.&lt;/p&gt; &lt;p&gt;Looking at environmental factors, we have a new &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1ed04da0&quot;&gt;SPARQL&lt;/a&gt; at a Working Draft stage. We have basic parity with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1cd94b40&quot;&gt;SQL&lt;/a&gt; expressivity, which is a prerequisite for RDF to become a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x16f2d758&quot;&gt;data&lt;/a&gt; model that can be an alternative to relational outside of very specialized contexts.&lt;/p&gt; &lt;p&gt;As the standards process makes SPARQL closer to being an alternative to SQL for data integration, we will make the database engine technology such that RDF&amp;#39;s inherent penalty in terms of storage overhead and processing time substantially decreases. This will make RDF a workable integration medium also in places where it was not such before. Of course, an application-specific &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x1e670768&quot;&gt;schema&lt;/a&gt; will retain some advantage over a generic one, but then one can have a purely relational application on Virtuoso as well. Just think of the possibility of an application-specific schema emerging by itself in a workload-driven fashion.&lt;/p&gt; &lt;p&gt;As background data for an increasing number of fields becomes available as &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e6e0848&quot;&gt;linked data&lt;/a&gt;, using this together with proprietary data for analytics and discovery becomes increasingly interesting. This is the initial line of RDF data warehousing. The biomedical field has many examples. The technologies we will release during 2010 will be geared towards enabling a second line of RDF applications, where ad hoc agile integration with RDF as a lingua franca becomes a real alternative to relational solutions with ETL point solutions for harvesting &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1e22a3a0&quot;&gt;information&lt;/a&gt; from diverse systems. One may see how RDF&amp;#39;s flexibility and expressivity may add to agility in any number of situations where data from heterogenous sources needs to be integrated. Which of today&amp;#39;s business scenarios does not face this issue?&lt;/p&gt; &lt;p&gt; &lt;b&gt;References:&lt;/b&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1510&quot; id=&quot;link-id13a91d58&quot;&gt;Linked Data &amp;amp; The Year 2009&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1286&quot; id=&quot;link-id11302a68&quot;&gt;Retrospective and Outlook for 2008&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Other &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?tag=scalability&quot; id=&quot;link-id13c50578&quot;&gt;Scalability&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?tag=benchmarking&quot; id=&quot;link-id13a2d8a8&quot;&gt;Benchmarking&lt;/a&gt; posts&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:14:21.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Business Of Linked Data (BOLD) Discussion Space</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-12-04#1600</atom:id>
  <atom:published>2009-12-04T19:40:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve created a new discussion space that&amp;#39;s squarely focused on the business development and marketing aspects of &amp;quot;HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id129e32d8&quot;&gt;Linked Data&amp;quot; (Linked Data&lt;/a&gt;). As its name indicates, It&amp;#39;s a BOLD attempt to fill a VoiD. :-)&lt;/p&gt; &lt;h3&gt;Background&lt;/h3&gt; &lt;p&gt;A few months ago, &lt;a href=&quot;http://blog.aldobucchi.com/#this&quot; id=&quot;link-id1110eb30&quot;&gt;Aldo Bucchi&lt;/a&gt; posted a message to the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id111d08a0&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/&quot; id=&quot;link-id118b3778&quot;&gt;mailing list&lt;/a&gt; seeking a discussion space for more business and marketing oriented topic, in relation to Linked Data. At the time, my assumption was that the existing LOD mailing list served that purpose absolutely fine, but in due course I came to realize that Aldo&amp;#39;s request had a much lager foundation than I initially suspected.&lt;/p&gt; &lt;h3&gt;Historic Oversight&lt;/h3&gt; &lt;p&gt;Linked Data, like its umbrella &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id16ceb618&quot;&gt;Semantic Web&lt;/a&gt; Project, has suffered from an inadvertent oversight on the parts of many of its enthusiasts (myself included): 100% of the discussion spaces are created by, geared towards, or dominated by researchers (from Academia primarily) and/or developers. Thus, at the very least, we&amp;#39;ve been operating in an echo chamber that only feed the existing void between the core community and those who are more interested in discussing business and marketing related topics.&lt;/p&gt; &lt;p&gt;The new discussion space seeks to cover the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Brainstorming Value Proposition Articulation&lt;/li&gt; &lt;li&gt;War Story Exchanges&lt;/li&gt; &lt;li&gt;Case Studies and Use-cases&lt;/li&gt; &lt;li&gt;Market Research &amp;amp; Positioning (for instance Linked Data is killer technology that redefines &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Integration, but none of the major research firms currently make that connection)&lt;/li&gt;. &lt;/ol&gt; &lt;p&gt;How Do I Join The Conversation? Simply sign up on the Google hosted &lt;a href=&quot;http://groups.google.com/group/business-of-linked-data-bold&quot; id=&quot;link-id129e4d08&quot;&gt;BOLD mailing list&lt;/a&gt;, introduce yourself (ideally), and then start conversing! :-)&lt;/p&gt;</atom:content>
  <atom:updated>2010-02-01T09:02:27.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Personal and/or Service Specific Linked Data Spaces in the Cloud: DBpedia 3.4</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-11-16#1589</atom:id>
  <atom:published>2009-11-16T18:17:46Z</atom:published>
  <atom:content type="html">&lt;p&gt; We have just released an Amazon EC2 based public Snapshot of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id18e899b8&quot;&gt;DBpedia&lt;/a&gt; 3.4. Thus, you can now instantiate a personal and/or service specific variant of the DBpedia 3.4 &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id168dec90&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id18911268&quot;&gt;Space&lt;/a&gt;. Basically, you can replicate what we host, within minutes (as opposed to days). In addition, you no longer need to squabble --on an unpredictable basis with others-- for the infrastructure resources behind DBpedia&amp;#39;s public instance, when using the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id18d5bd78&quot;&gt;SPARQL&lt;/a&gt; Endpoint, Faceted Search &amp;amp; Find Services, or HTML Browser Pages etc.&lt;/p&gt; &lt;h3&gt;How Does It work?&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtInstallationEC2&quot; id=&quot;link-id115932b8&quot;&gt;Instantiate a Virtuoso EC2 AMI&lt;/a&gt; (paid variety, which is aggressively priced at $49.99 for setup and $19.99 per month thereafter)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia34S&quot; id=&quot;link-id182dc800&quot;&gt; Mount the shared DBpedia 3.4 public snapshot&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Start Virtuoso Server&lt;/li&gt; &lt;li&gt; Start exploiting the DBpedia Linked Data Space.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;What Interfaces are exposed?&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; SPARQL Endpoint&lt;/li&gt; &lt;li&gt; Linked Data Viewer Pages (as you see in the public DBpedia instance)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtFacetBrowserInstallConfig&quot; id=&quot;link-id117f6e80&quot;&gt;Faceted Search &amp;amp; Find UI and Web Services&lt;/a&gt; (REST or SOAP)&lt;/li&gt; &lt;li&gt; All the inference rules for &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id144b84a8&quot;&gt;UMBEL&lt;/a&gt;, SUMO, YAGO, &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id16b69da8&quot;&gt;OpenCYC&lt;/a&gt;, and DBpedia-OWL &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; dictionaries&lt;/li&gt; &lt;li&gt;Type Correlations Between DBpedia and Freebase&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</atom:content>
  <atom:updated>2009-11-16T13:30:20-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Personal and/or Service Specific Linked Data Spaces in the Cloud: DBpedia 3.4</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-11-16#1599</atom:id>
  <atom:published>2009-11-16T18:17:46Z</atom:published>
  <atom:content type="html">&lt;p&gt; We have just released an Amazon EC2 based public Snapshot of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id18e899b8&quot;&gt;DBpedia&lt;/a&gt; 3.4. Thus, you can now instantiate a personal and/or service specific variant of the DBpedia 3.4 &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id168dec90&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id18911268&quot;&gt;Space&lt;/a&gt;. Basically, you can replicate what we host, within minutes (as opposed to days). In addition, you no longer need to squabble --on an unpredictable basis with others-- for the infrastructure resources behind DBpedia&amp;#39;s public instance, when using the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id18d5bd78&quot;&gt;SPARQL&lt;/a&gt; Endpoint, Faceted Search &amp;amp; Find Services, or HTML Browser Pages etc.&lt;/p&gt; &lt;h3&gt;How Does It work?&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtInstallationEC2&quot; id=&quot;link-id115932b8&quot;&gt;Instantiate a Virtuoso EC2 AMI&lt;/a&gt; (paid variety, which is aggressively priced at $49.99 for setup and $19.99 per month thereafter)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAWSDBpedia34S&quot; id=&quot;link-id182dc800&quot;&gt; Mount the shared DBpedia 3.4 public snapshot&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Start Virtuoso Server&lt;/li&gt; &lt;li&gt; Start exploiting the DBpedia Linked Data Space.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;What Interfaces are exposed?&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; SPARQL Endpoint&lt;/li&gt; &lt;li&gt; Linked Data Viewer Pages (as you see in the public DBpedia instance)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtFacetBrowserInstallConfig&quot; id=&quot;link-id117f6e80&quot;&gt;Faceted Search &amp;amp; Find UI and Web Services&lt;/a&gt; (REST or SOAP)&lt;/li&gt; &lt;li&gt; All the inference rules for &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id144b84a8&quot;&gt;UMBEL&lt;/a&gt;, SUMO, YAGO, &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id16b69da8&quot;&gt;OpenCYC&lt;/a&gt;, and DBpedia-OWL &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; dictionaries&lt;/li&gt; &lt;li&gt;Type Correlations Between DBpedia and Freebase&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</atom:content>
  <atom:updated>2010-02-01T08:58:14-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF Geography With Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-11-11#1588</atom:id>
  <atom:published>2009-11-11T17:17:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have just added a geometry &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c0e02b0&quot;&gt;data&lt;/a&gt; type and corresponding &lt;a href=&quot;http://dbpedia.org/resource/R-tree&quot; id=&quot;link-id0x1e093220&quot;&gt;R&lt;/a&gt;-tree index to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1ddccfe8&quot;&gt;Virtuoso&lt;/a&gt;. This follows the general scheme of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1b88a580&quot;&gt;SQL&lt;/a&gt;/MM, as is implemented by &lt;a href=&quot;http://dbpedia.org/resource/PostGIS&quot; id=&quot;link-id0x1d271a90&quot;&gt;PostGIS&lt;/a&gt; and many others. We have all the engine-side stuff, including optimizer support for geometry cardinality sampling and good execution plans for combinations of spatial and other joins. We have however not yet implemented all the different geometry types and library function support for them, like shortest distance between two arbitrary shapes.&lt;/p&gt; &lt;p&gt;The geometry support is for both SQL and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1b8d4ca8&quot;&gt;SPARQL&lt;/a&gt;. On the SQL side, it works with the ISO/IEC 13249 SQL/MM API; with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ed69318&quot;&gt;RDF&lt;/a&gt;, a geometry can occur as the object of a quad. If the object is a typed-literal of the &lt;code&gt;virtrdf:Geometry&lt;/code&gt; type, it gets indexed in a geometry index over all geometries in quads; no special declarations are needed. After this, SQL MM predicates and functions can be used with SPARQL, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; PREFIX geo: &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1d2d0ae0&quot;&gt;http&lt;/a&gt;://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; SELECT ?class COUNT (*) WHERE { ?m geo:geometry ?geo . ?m a ?class . FILTER ( &amp;lt;bif:st_intersects&amp;gt; ( ?geo, &amp;lt;bif:st_point&amp;gt; (0, 52), 100 ) ) } GROUP BY ?class ORDER BY DESC 2 &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This returns the counts of objects of each class occurring within 100 km of (0, 52), a point near London.&lt;/p&gt; &lt;p&gt;For any data set with &lt;a href=&quot;http://dbpedia.org/resource/World_Geodetic_System&quot; id=&quot;link-id0x1ec00578&quot;&gt;WGS 84&lt;/a&gt; &lt;code&gt;geo:long&lt;/code&gt; and &lt;code&gt;geo:lat&lt;/code&gt; values, a simple SQL function makes a point geometry for each such coordinate pair and adds it as the &lt;code&gt;geo:geometry&lt;/code&gt; property of the subject with the long/lat. This then enables fast spatial access to arbitrary location data in RDF.&lt;/p&gt; &lt;p&gt;Right now, we hardly see any geometries other than points in RDF data, even though there are some efforts for vocabularies for more complex entities. As these get adopted we will support them.&lt;/p&gt; &lt;p&gt;For scalability, we tried the implementation with &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x1c781e68&quot;&gt;OpenStreetMap&lt;/a&gt;&amp;#39;s 350 million or so points. The geometry implementation partitions well over a cluster, similarly to a full text index, i.e., every server has its slice of the geometries, partitioned by the geometry object&amp;#39;s key, thus not by range of coordinates or such. Like this, the items are evenly spread even though the coordinate distribution is highly uneven.&lt;/p&gt; &lt;p&gt;We can do spatial joins like —&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; SELECT ?s ( &amp;lt;sql:num_or_null&amp;gt; (?p) ) COUNT (*) WHERE { ?s &amp;lt;http://&lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1f885868&quot;&gt;dbpedia&lt;/a&gt;.org/ontology/populationTotal&amp;gt; ?p . FILTER ( &amp;lt;sql:num_or_null&amp;gt; (?p) &amp;gt; 1000000 ) . ?s geo:geometry ?geo . FILTER ( &amp;lt;bif:st_intersects&amp;gt; ( ?pt, ?geo, 5 ) ) . ?xx geo:geometry ?pt } GROUP BY ?s ( &amp;lt;sql:num_or_null&amp;gt; (?p) ) ORDER BY DESC 3 LIMIT 20 &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This takes the DBpedia subjects that have a population over 1 million and a geometry. We then count all the geometries within 5 km of the point location of the first geometry. With DBpedia (about 5 million points), &lt;a href=&quot;http://www.geonames.org/&quot; id=&quot;link-id0x1d4279b0&quot;&gt;GeoNames&lt;/a&gt; (7 million points), and OpenStreetMap (350 million points), we get the result:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;http://dbpedia.org/resource/Munich 1356594 117280 http://dbpedia.org/resource/London 7355400 81486 http://dbpedia.org/resource/Davao_City 1363337 58640 http://dbpedia.org/resource/Belo_Horizonte 2412937 58640 http://dbpedia.org/resource/Chengde 3610000 58640 http://dbpedia.org/resource/Hamburg 1769117 51664 http://dbpedia.org/resource/San_Diego%2C_California 1266731 47685 http://dbpedia.org/resource/Bursa 1562828 47685 http://dbpedia.org/resource/Port-au-Prince 1082800 47685 http://dbpedia.org/resource/Oakland_County%2C_Michigan 1194156 45636 http://dbpedia.org/resource/Sana%27a 1747627 40923 http://dbpedia.org/resource/Milan 1303437 40923 http://dbpedia.org/resource/Campinas 1059420 40923 http://dbpedia.org/resource/Hohhot 2580000 40923 http://dbpedia.org/resource/Brussels 1031215 40923 http://dbpedia.org/resource/Bogra_District 2988567 40923 http://dbpedia.org/resource/Cort%C3%A9s_Department 1202510 40923 http://dbpedia.org/resource/Berlin 3416300 35668 http://dbpedia.org/resource/New_York_City 8274527 30810 http://dbpedia.org/resource/Los_Angeles%2C_California 3849378 25614&lt;br /&gt; 20 Rows. -- 1733 msec.&lt;br /&gt; Cluster 8 nodes, 1 s. 358 m/s 1596 KB/s 664% &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x1e6403b0&quot;&gt;cpu&lt;/a&gt; 2% read 16% clw threads 1r 0w 0i buffers 1124351 0 d 0 w 0 pfs &lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This takes 1.7 seconds on a Virtuoso Cluster configured with 8 processes on a single dual-Xeon 5520 box, running at about 664% CPU with warm &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1e81f610&quot;&gt;cache&lt;/a&gt;. Fair enough for a first crack, this can obviously be optimized further. Still, the geo part of the processing is already as good as instantaneous.&lt;/p&gt; &lt;p&gt;We will shortly have the geography features installed on DBpedia and the other data sets we host. As these come online we will show more demo queries.&lt;/p&gt; &lt;p&gt;For more about SQL/MM, you can look to a couple of PDFs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.fer.hr/_download/repository/SQLMM_Spatial-_The_Standard_to_Manage_Spatial_Data_in_Relational_Database_Systems.pdf&quot; id=&quot;link-id133775f0&quot;&gt;SQL/MM Spatial: The Standard to Manage Spatial Data in Relational Database Systems&lt;/a&gt; by Knut Stolze&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.sigmod.org/record/issues/0112/standards.pdf&quot; id=&quot;link-id1433c5e0&quot;&gt;SQL Multimedia and Application Packages (SQL/MM)&lt;/a&gt; by Jim Melton and Andrew Eisenberg&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:14:29.000012-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>RDF Geography With Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-11-11#1587</atom:id>
  <atom:published>2009-11-11T17:17:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have just added a geometry &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c728fb0&quot;&gt;data&lt;/a&gt; type and corresponding &lt;a href=&quot;http://dbpedia.org/resource/R-tree&quot; id=&quot;link-id0x1d0e9368&quot;&gt;R&lt;/a&gt;-tree index to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e999000&quot;&gt;Virtuoso&lt;/a&gt;. This follows the general scheme of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1c1d2790&quot;&gt;SQL&lt;/a&gt;/MM, as is implemented by &lt;a href=&quot;http://dbpedia.org/resource/PostGIS&quot; id=&quot;link-id0x1c682eb8&quot;&gt;PostGIS&lt;/a&gt; and many others. We have all the engine-side stuff, including optimizer support for geometry cardinality sampling and good execution plans for combinations of spatial and other joins. We have however not yet implemented all the different geometry types and library function support for them, like shortest distance between two arbitrary shapes.&lt;/p&gt; &lt;p&gt;The geometry support is for both SQL and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1bba2728&quot;&gt;SPARQL&lt;/a&gt;. On the SQL side, it works with the ISO/IEC 13249 SQL/MM API; with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1b28c330&quot;&gt;RDF&lt;/a&gt;, a geometry can occur as the object of a quad. If the object is a typed-literal of the &lt;code&gt;virtrdf:Geometry&lt;/code&gt; type, it gets indexed in a geometry index over all geometries in quads; no special declarations are needed. After this, SQL MM predicates and functions can be used with SPARQL, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; PREFIX geo: &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1e574ed8&quot;&gt;http&lt;/a&gt;://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; SELECT ?class COUNT (*) WHERE { ?m geo:geometry ?geo . ?m a ?class . FILTER ( &amp;lt;bif:st_intersects&amp;gt; ( ?geo, &amp;lt;bif:st_point&amp;gt; (0, 52), 100 ) ) } GROUP BY ?class ORDER BY DESC 2 &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This returns the counts of objects of each class occurring within 100 km of (0, 52), a point near London.&lt;/p&gt; &lt;p&gt;For any data set with &lt;a href=&quot;http://dbpedia.org/resource/World_Geodetic_System&quot; id=&quot;link-id0x1d7feae8&quot;&gt;WGS 84&lt;/a&gt; &lt;code&gt;geo:long&lt;/code&gt; and &lt;code&gt;geo:lat&lt;/code&gt; values, a simple SQL function makes a point geometry for each such coordinate pair and adds it as the &lt;code&gt;geo:geometry&lt;/code&gt; property of the subject with the long/lat. This then enables fast spatial access to arbitrary location data in RDF.&lt;/p&gt; &lt;p&gt;Right now, we hardly see any geometries other than points in RDF data, even though there are some efforts for vocabularies for more complex entities. As these get adopted we will support them.&lt;/p&gt; &lt;p&gt;For scalability, we tried the implementation with &lt;a href=&quot;http://www.openstreetmap.org/&quot; id=&quot;link-id0x1cb79580&quot;&gt;OpenStreetMap&lt;/a&gt;&amp;#39;s 350 million or so points. The geometry implementation partitions well over a cluster, similarly to a full text index, i.e., every server has its slice of the geometries, partitioned by the geometry object&amp;#39;s key, thus not by range of coordinates or such. Like this, the items are evenly spread even though the coordinate distribution is highly uneven.&lt;/p&gt; &lt;p&gt;We can do spatial joins like —&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt; SELECT ?s ( &amp;lt;sql:num_or_null&amp;gt; (?p) ) COUNT (*) WHERE { ?s &amp;lt;http://&lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1d4179e8&quot;&gt;dbpedia&lt;/a&gt;.org/ontology/populationTotal&amp;gt; ?p . FILTER ( &amp;lt;sql:num_or_null&amp;gt; (?p) &amp;gt; 1000000 ) . ?s geo:geometry ?geo . FILTER ( &amp;lt;bif:st_intersects&amp;gt; ( ?pt, ?geo, 5 ) ) . ?xx geo:geometry ?pt } GROUP BY ?s ( &amp;lt;sql:num_or_null&amp;gt; (?p) ) ORDER BY DESC 3 LIMIT 20 &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This takes the DBpedia subjects that have a population over 1 million and a geometry. We then count all the geometries within 5 km of the point location of the first geometry. With DBpedia (about 5 million points), &lt;a href=&quot;http://www.geonames.org/&quot; id=&quot;link-id0x19ee61b8&quot;&gt;GeoNames&lt;/a&gt; (7 million points), and OpenStreetMap (350 million points), we get the result:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;http://dbpedia.org/resource/Munich 1356594 117280 http://dbpedia.org/resource/London 7355400 81486 http://dbpedia.org/resource/Davao_City 1363337 58640 http://dbpedia.org/resource/Belo_Horizonte 2412937 58640 http://dbpedia.org/resource/Chengde 3610000 58640 http://dbpedia.org/resource/Hamburg 1769117 51664 http://dbpedia.org/resource/San_Diego%2C_California 1266731 47685 http://dbpedia.org/resource/Bursa 1562828 47685 http://dbpedia.org/resource/Port-au-Prince 1082800 47685 http://dbpedia.org/resource/Oakland_County%2C_Michigan 1194156 45636 http://dbpedia.org/resource/Sana%27a 1747627 40923 http://dbpedia.org/resource/Milan 1303437 40923 http://dbpedia.org/resource/Campinas 1059420 40923 http://dbpedia.org/resource/Hohhot 2580000 40923 http://dbpedia.org/resource/Brussels 1031215 40923 http://dbpedia.org/resource/Bogra_District 2988567 40923 http://dbpedia.org/resource/Cort%C3%A9s_Department 1202510 40923 http://dbpedia.org/resource/Berlin 3416300 35668 http://dbpedia.org/resource/New_York_City 8274527 30810 http://dbpedia.org/resource/Los_Angeles%2C_California 3849378 25614&lt;br /&gt; 20 Rows. -- 1733 msec.&lt;br /&gt; Cluster 8 nodes, 1 s. 358 m/s 1596 KB/s 664% &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x120b8e30&quot;&gt;cpu&lt;/a&gt; 2% read 16% clw threads 1r 0w 0i buffers 1124351 0 d 0 w 0 pfs &lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This takes 1.7 seconds on a Virtuoso Cluster configured with 8 processes on a single dual-Xeon 5520 box, running at about 664% CPU with warm &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1cb17380&quot;&gt;cache&lt;/a&gt;. Fair enough for a first crack, this can obviously be optimized further. Still, the geo part of the processing is already as good as instantaneous.&lt;/p&gt; &lt;p&gt;We will shortly have the geography features installed on DBpedia and the other data sets we host. As these come online we will show more demo queries.&lt;/p&gt; &lt;p&gt;For more about SQL/MM, you can look to a couple of PDFs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.fer.hr/_download/repository/SQLMM_Spatial-_The_Standard_to_Manage_Spatial_Data_in_Relational_Database_Systems.pdf&quot; id=&quot;link-id133775f0&quot;&gt;SQL/MM Spatial: The Standard to Manage Spatial Data in Relational Database Systems&lt;/a&gt; by Knut Stolze&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.sigmod.org/record/issues/0112/standards.pdf&quot; id=&quot;link-id1433c5e0&quot;&gt;SQL Multimedia and Application Packages (SQL/MM)&lt;/a&gt; by Jim Melton and Andrew Eisenberg&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T09:14:16.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>European Commission and the Data Overflow</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-10-27#1586</atom:id>
  <atom:published>2009-10-27T18:29:51Z</atom:published>
  <atom:content type="html">&lt;p&gt;The European Commission recently circulated a questionnaire to selected experts on what could be done for the future of big &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x43bae00&quot;&gt;data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Since the &lt;a href=&quot;http://cordis.europa.eu/fp7/ict/content-knowledge/consultation_en.html&quot; id=&quot;link-id1191c0f8&quot;&gt;questionnaire is public&lt;/a&gt;, I am publishing my answers below.&lt;/p&gt; &lt;ol type=&quot;1&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data and data types&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What volumes of data are we dealing with today? What is the growth rate? Where can we expect to be in 2015? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Private data warehouses of corporations have more than doubled yearly for the past years; hundreds of TB is not exceptional. This will continue. The real shift is in structured data being published in increasing quantities with a minimum level of integrate-ability through use of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x5c7add0&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x5c7adb8&quot;&gt;linked data&lt;/a&gt; principles. There are rewards for use of standard vocabularies and identifiers through search engines recognizing such data. There is convergence around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x5c7ada0&quot;&gt;DBpedia&lt;/a&gt; identifiers for real-world entities, e.g., most things that would be in the news.&lt;/p&gt; &lt;p&gt;This also means that internal data processes and silos may be enriched with this content. There is consequent pressure for accommodating more diversity of data, with more flexible &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x7d87a88&quot;&gt;schema&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ultimately, all content presently stored in RDBs and presented in public accessible dynamic web pages will end up on the web of linked data. Examples are product catalogs, price lists, event schedules and the like.&lt;/p&gt; &lt;p&gt;The volume of the well known linked data sets is around 10 billion statements. With the above mentioned trends, growth by two or three orders of magnitude by 2015 seems reasonable, This is so especially if explicit semantics are extracted from the document web and if there is some further progress in the precision/recall of such extraction.&lt;/p&gt; &lt;p&gt;Relevant sections of this mass of data are a potential addition to any present or future analytics application.&lt;/p&gt; &lt;p&gt;Since arbitrary analytics over the database which is the web cannot be economically provided by a centralized search engine, a cloud model may be used for on-demand selection of relevant data and mixing it with private data. This will drive database innovation for the next years even more than the continued classical warehouse growth.&lt;/p&gt; &lt;p&gt;Science data is another driver of the data overflow. For example, faster gene sequencing, more accurate measurements in high energy physics, better imaging, and remote sensing will produce large volumes of data. This data has highly regular structure but labeling this data with source and lineage calls for a flexible, schema-last, self-describing model, such as RDF and linked data. Data and &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x7a3fb40&quot;&gt;metadata&lt;/a&gt; should travel together but may have different data models.&lt;/p&gt; &lt;p&gt;By and large, the metadata of science data will be another stream to the web of linked data, at least to the degree it is publicly accessible. Restricted circles can and likely will implement similar ideas.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What types of data can we deal with intelligently due to their inherent structure (geospatial, temporal, social or &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x5a48058&quot;&gt;knowledge&lt;/a&gt; graphs, 3D, sensor streams...)?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;All the above types should be supported inside one DBMS so as to allow efficient querying combining conditions on all these types of data, e.g., &lt;i&gt;photos of sunsets taken last summer in Ibiza, with over 20 megapixels, by people I know.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Note that the test for being a sunset is an operation on the image blob that should be taken to the data; the images cannot be economically transferred.&lt;/p&gt; &lt;p&gt;Interleaving of all database functions and types becomes increasingly important.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Industries, communities&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Who is producing these data and why? Could they do it better? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Right now, projects such as &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x2a29de8&quot;&gt;Bio2RDF&lt;/a&gt;, &lt;a href=&quot;http://neurocommons.org/page/Main_Page&quot; id=&quot;link-id0x7ddaed0&quot;&gt;Neurocommons&lt;/a&gt;, and DBPedia produce this data. The processes are in place and are reasonable. Incremental improvement is to be expected. These processes, along with the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0xbab4dfd0&quot;&gt;linked data meme&lt;/a&gt; generally taking off, drive demand for better &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x51f4e0&quot;&gt;NLP&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x51a1b48&quot;&gt;Natural Language Processing&lt;/a&gt;), e.g., &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x956680&quot;&gt;entity&lt;/a&gt; and relationship extraction, especially extraction that can produce instance data in given ontologies (e.g., events) using common identifiers (e.g., DBPedia URIs).&lt;/p&gt; &lt;p&gt;Mapping of RDBs to RDF is possible, and a W3C working group is developing standards for this. The required baseline level has been reached; the rest is a matter of automating deployment. Within the enterprise, there are advantages to be gained for &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x7da9e80&quot;&gt;information&lt;/a&gt; integration; e.g., all entities in the CRM space can be integrated with all email and support tickets through giving everything a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x71673f8&quot;&gt;URI&lt;/a&gt;. Some of this information may even be published on an &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id0x9aa6e0&quot;&gt;extranet&lt;/a&gt; for self-service and web-service interfaces. This has been done at small scales and the rest is a matter of spreading adoption and lowering the entry barrier. Incremental progress will take place, eventually resulting in qualitatively better integration along the value chain when adoption is sufficiently widespread.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Who is consuming these data and why? Could they do it better? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Consumers are various. The greatest need is for tools that summarize complex data and allow getting a bird&amp;#39;s eye view of what data is in the first instance available. Consuming the data is hindered by the user not even necessarily knowing what data there is. This is somewhat new, as traditionally the business analyst did know the schema of the warehouse and was proficient with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x7f7b148&quot;&gt;SQL&lt;/a&gt; report generators and statistics packages.&lt;/p&gt; &lt;p&gt;Where Web 2.0 made the &lt;i&gt;citizen journalist&lt;/i&gt;, the web of linked data will make the &lt;i&gt;citizen analyst&lt;/i&gt;. For this to happen, with benefits for individuals, enterprises, and governments alike, more work in user interfaces, knowledge discovery, and query composition will be useful. We may envision a &amp;quot;meshup economy&amp;quot; where data is plentiful, but the unit of value and exchange is the smart report that crystallizes actionable value from this ocean.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What industrial sectors in Europe could become more competitive if they became much better at managing data?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Any sector could benefit. Early adopters are seen in the biomedical field and to an extent in media. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Is the regulation landscape imposing constraints (privacy, compliance ...) that don&amp;#39;t have today good tool support?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The regulation landscape drives database demand through data retention requirements and the like.&lt;/p&gt; &lt;p&gt;With data integration, especially with privacy-sensitive data (as in medicine), there are issues of whether one dares put otherwise-shareable information online. Regulation is needed to protect individuals, but integration should still be possible for science.&lt;/p&gt; &lt;p&gt;For this, we see a need for progress in applying policy-based approaches (e.g., row level security) to relatively schema-last data such as RDF. This is possible but needs some more work. Also, creating on-the-fly-anonymizing views on data might help.&lt;/p&gt; &lt;p&gt;More research is needed for reconciling the need for security with the advantages of broad-based &lt;i&gt;ad hoc&lt;/i&gt; integration. Ideally, data should be intelligent, aware of its origins and classification and cautious of whom it interacts with, all of this supported under the covers so that the user could ask anything but the data might refuse to answer or might restrict answers according to the user&amp;#39;s profile. This is a tall order and implementing something of the sort is an open question.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What are the main practical problem identified for individuals and organizations? Please give examples and tell us about the main obstacles and barriers.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;We have come across the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Knowing that the data exists in the first place.&lt;/li&gt; &lt;li&gt;If the data is found, figuring out the provenance, units and precision of measurement, identifiers, and the like.&lt;/li&gt; &lt;li&gt;Compatible subject matter but incompatible representation: For example, one has numbers on a map with different maps for different points in time; another has time series of instrument data with geo-location for the instrument. It is only to be expected that the time interval between measurements is not the same. So there is need for a lot of one-off programming to align data.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Other problems have to do with sheer volume, i.e., transfer of data even in a local area network is too slow, let alone over a wide area network. Computation needs to go to the data, and databases need to support this.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Services, software stacks, protocols, standards, benchmarks&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What combinations of components are needed to deal with these problems?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Recent times have seen a proliferation of special purpose databases. Since the data needs of the future are about combining data with maximum agility and minimum performance hit, there is need to gather the currently-separate functionality into an integrated system with sufficient flexibility. We see some of this in integration of map-reduce and scale-out databases. The former antagonists have become partners. Vertica, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x7a94e70&quot;&gt;Greenplum&lt;/a&gt;, and OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2ab2868&quot;&gt;Virtuoso&lt;/a&gt; are example of DBMS featuring work in this direction.&lt;/p&gt; &lt;p&gt;Interoperability and at least &lt;i&gt;de facto&lt;/i&gt; standards in ways of doing this will emerge.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What data exchange and processing mechanisms will be needed to work across platforms and programming languages?&lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x78a0458&quot;&gt;HTTP&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x7ff2360&quot;&gt;XML&lt;/a&gt;, and RDF are in fact very verbose, yet these are the formats and models that have uptake. Thus, these will continue to be used even though one might think binary formats to be more efficient.&lt;/p&gt; &lt;p&gt;There are of course science data set standards that are more compressed and these will continue, hopefully adding a practice of rich metadata in RDF.&lt;/p&gt; &lt;p&gt;For internals of systems, MPI and TCP/IP with proprietary optimized wire formats will continue. Inter-system communication will likely continue to be HTTP, XML, and RDF as appropriate.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What data environments are today so wastefully messy that they would benefit from the development of standards?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;RDF and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x5643d70&quot;&gt;OWL&lt;/a&gt; are not messy but they could use some more performance; we are working on this. &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x152ab18&quot;&gt;SPARQL&lt;/a&gt; is finally acquiring the capabilities of a serious query language, so things are slowly coming together.&lt;/p&gt; &lt;p&gt;Community process for developing application domain specific vocabularies works quite well, even though one could argue it is &lt;i&gt;ad hoc&lt;/i&gt; and not up to what a modeling purist might wish.&lt;/p&gt; &lt;p&gt;Top-down imposition of standards has a mixed history, with long and expensive development and sometimes no or little uptake, consider some WS* standards for example.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What kind of performance is expected or required of these systems? Who will measure it reliably? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Relational databases have a history of substantial investment in &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0xecc100&quot;&gt;optimization&lt;/a&gt; and some of them are very good for what they do, e.g., the newer generation of analytics databases.&lt;/p&gt; &lt;p&gt;The very large schema-last, no-SQL, sometimes eventually consistent key-value stores have a somewhat shorter history but do fill a real need.&lt;/p&gt; &lt;p&gt;These trends will merge: Extreme scale, schema-last, complex queries, even more complex inference, custom code for in-database machine learning and other bulk processing.&lt;/p&gt; &lt;p&gt;We find RDF augmented with some binary types at this crossroads. This point of the design space will have to provide performance roughly on the level of today&amp;#39;s best relational solution for workloads that fit the relational model. The added cost of schema-last and inference must come down. We are working on this. Research work such as carried out with &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x7ae2890&quot;&gt;MonetDB&lt;/a&gt; gives clues as to how these aims can be reached.&lt;/p&gt; &lt;p&gt;The separation of query language and inference is artificial. After the concepts are mature, these functions will merge and execute close to the data; there are clear evolutionary pressures in this direction.&lt;/p&gt; &lt;p&gt;Benchmarks are key. Some gain can be had even from repurposing standard relational benchmarks like &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x71eb528&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x5e16a40&quot;&gt;H&lt;/a&gt;. But the TPC-H rules do not allow official reporting of such.&lt;/p&gt; &lt;p&gt;Development of benchmarks for RDF, complex queries, and inference is needed. A bold challenge to the community, it should be rooted in real-life integration needs and involve high heterogeneity. A key-value store benchmark might also be conceived. A transaction benchmark like TPC-&lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x78562d0&quot;&gt;C&lt;/a&gt; might be the basis, maybe augmented with massive user-generated content like reviews and blogs.&lt;/p&gt; &lt;p&gt;If benchmarks exist and are not too easy nor inaccessibly difficult nor too expensive to run — think of the high end TPC-C results — then TPC-style rules and processes would be quite adequate. The threshold to publish should be lowered: Everybody runs the TPC workloads internally but few publish.&lt;/p&gt; &lt;p&gt;Some EC initiative for benchmarking could make sense, similar to the TREC initiative of the US government. Industry should be consulted for the specific content; possibly the answers to the present questionnaire can provide an approximate direction.&lt;/p&gt; &lt;p&gt;Benchmarks should be run by software vendors on their own systems, tuned by themselves. But there should be a process of disclosure and auditing; the TPC rules give an example. Compliance should not be too expensive or time consuming. Some community development for automating these things would be a worthwhile target for EC funding.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Usability and training&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;How difficult will it be for a developer of average competence to deploy components whose core is based on rather deep computer science? Do we all need to understand Monads and Continuations? What can be done to make it ever easier?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;In the database world, huge advances in technology have taken place behind a relatively simple and stable interface: SQL. For the linked data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x7761e50&quot;&gt;web&lt;/a&gt;, the same will take place behind SPARQL.&lt;/p&gt; &lt;p&gt;Beyond these, for example, programming with MPI with good utilization of a cluster platform for an arbitrary algorithm, is quite difficult. The casual amateur is hereby warned.&lt;/p&gt; &lt;p&gt;There is no single solution. For automatic parallelization, since explicit, programmatic parallelization of things with MPI for example is very unscalable in terms of required skill, we should favor declarative and/or functional approaches.&lt;/p&gt; &lt;p&gt;Developing a debugger and explanation engine for rule-based and description-logics-based inference would be an idea.&lt;/p&gt; &lt;p&gt;For procedural workloads, things like Erlang may be good in cases and are not overly difficult in principle, especially if there are good debugging facilities.&lt;/p&gt; &lt;p&gt;For shipping functions in a cluster or cloud, the &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x5494b0&quot;&gt;BOOM&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x7f1f148&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt;) approach or logic programming with explicit specification of compute location seem promising, surely more flexible than map-reduce. The question is whether a &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x5c758c8&quot;&gt;PHP&lt;/a&gt; developer can be made to do logic programming.&lt;/p&gt; &lt;p&gt;This bridge will be crossed only with actual need and even then reluctantly. We may look at the Web 2.0 practice of sharding &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x432f868&quot;&gt;MySQL&lt;/a&gt;, inconvenient as this may be, for an example. There is inertia and thus re-architecting is a constant process that is generally in reaction to facts, &lt;i&gt;post hoc&lt;/i&gt;, often a point solution. One could argue that planning ahead would be smarter but by and large the world does not work so.&lt;/p&gt; &lt;p&gt;One part of the answer is an infinitely-scalable SQL database that expands and shrinks in the clouds, with the usual semantics, maybe optional eventual consistency and built-in map reduce. If such a thing is inexpensive enough and syntax-level-compatible with present installed base, many developers do not have to learn very much more.&lt;/p&gt; &lt;p&gt;This is maybe good for the bread-and-butter IT, but European competitiveness should not rest on this. Therefore we wish to go for bold new application types for which the client-server database application is not the model. Data-centric languages like BOOM, if they can be made very efficient and have good debugging support, are attractive there. These do require more intellectual investment but that is not a problem since the less-inquisitive part of the developer community is served by the first part of the answer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;How is a developer of average skills going to learn about these new advanced tools? How can we plan for excellent documentation and training, community mentoring, exchange of good practices, etc... across all EU countries?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;For the most part, developers do not learn things for the sake of learning. When they have learned something and it is adequate, they stay with it for the most part and are even reluctant to engage in cross-camps interaction. The research world is often similarly insular. A new inflection in the application landscape is needed to drive learning. This inflection is provided by the &lt;a href=&quot;https://wiki.mozilla.org/Labs/Ubiquity&quot; id=&quot;link-id0x7f051c8&quot;&gt;ubiquity&lt;/a&gt; of mobile devices, sensor data, explicit semantics, NLP concept extraction, web of linked data, and such factors.&lt;/p&gt; &lt;p&gt;RDFa is a good example of a new technique piggybacking on something everybody uses, namely HTML. These new things should, within possibility, be deployed in the usual technology stack, &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-id0x77151e0&quot;&gt;LAMP&lt;/a&gt; or Java. Of course these do not have to be LAMP or Java or HTML or HTTP themselves but they must manifest through these.&lt;/p&gt; &lt;p&gt;A lot of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x7940cd0&quot;&gt;semantic web&lt;/a&gt; potential can be realized within the client-server database application model, thus no fundamental re-architecting, just some new data types and queries.&lt;/p&gt; &lt;p&gt;For data- or processing-intensive tasks, an on-demand hookup to cloud-based servers with Erlang and/or BOOM for programming model would be easy enough to learn and utilize.&lt;/p&gt; &lt;p&gt;The question is one of providing challenges. Addressing actual challenges with these techniques will lead to maturity, documentation, examples, and training. With virtual, Europe-wide distributed teams a reality in many places, Europe-wide dissemination is no longer insurmountable.&lt;/p&gt; &lt;p&gt;As the data overflow proceeds, its victims will multiply and create demand for solutions. The EC could here encourage research project use cases gaining an extended life past the end of research projects, possibly being maintained and multiplied and spun off.&lt;/p&gt; &lt;p&gt;If such things could be mutated into self-sustaining service businesses with pay-per-use revenue, say through a cloud SaaS business model, still primarily leveraging an open source technology stack, we could have self-propagating and self-supporting models for exploiting advanced IT. This would create interest, and interest would drive training and dissemination.&lt;/p&gt; &lt;p&gt;The problem is creating the pull.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Challenges&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What should be, in this domain, the equivalent of the Netflix challenge, Ansari X Prize, &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x7e72f40&quot;&gt;Google&lt;/a&gt; Lunar X Prize, etc. ... ?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The EC itself no doubt suffers from data overflow in one function or another. Unless security/secrecy prohibits, simply publishing a large data set and a description of what operations should be done on it would be a start. The more real the data, the better — reality is consistently more complex and surprising than imagination. Since many interesting problems touch on fraud detection and law enforcement, there may be some security obstacles for using these application domains as subject matters of open challenges.&lt;/p&gt; &lt;p&gt;Once there is a good benchmark, as discussed above, there can be some prize money allocated for the winners, specially if the race is tight.&lt;/p&gt; &lt;p&gt;The Semantic Web Challenge and the Billion Triples Challenge exist and are useful as such, but do not seem to have any huge impact.&lt;/p&gt; &lt;p&gt;The incentives should be sufficient and part of the expenses arising from running for such challenges could be funded. Otherwise investing in existing business development will be more interesting to industry. Some industry participation seems necessary; we would wish academia and industry to work closer. Also, having industry supply the baseline guarantees that academia actually does further the state of the art. This is not always certain.&lt;/p&gt; &lt;p&gt;If challenges are based on actual problems, whether of the EC, its member governments, or private entities, and winning the challenge may lead to a contract for supplying an actual solution, these will naturally become more interesting for consortia involving integrators, specialist software vendors, and academia. Such a model would build actual capacity to deploy leading edge technologies in production, which is sorely needed.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What should one do to set up such a challenge, administer, and monitor it?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The EC should probably circulate a call for actual problem scenarios involving big data. If the matter of the overflow is as dire as represented, cases should be easy to find. A few should be selected and then anonymized if needed.&lt;/p&gt; &lt;p&gt;The party with the use case would benefit by having hopefully the best work on it. The contestants would benefit from having real world needs guide R&amp;amp;D. The EC would not have to do very much, except possibly use some money for funding the best proposals. The winner would possibly get a large account and related sales and service income. The contestants would have to be teams possibly involving many organizations; for example, development and first-line services and support could come from different companies along a systems integrator model such as is widely used in the US.&lt;/p&gt; &lt;p&gt;There may be a good benchmark at the time, possibly resulting from FP7 itself. In such a case, the EC could offer a prize for winners. Details would have to be worked out case by case. Such a challenge could be repeated a few times, as benchmark-driven progress in databases or TREC for example have taken some years to reach a point of slowdown in progress.&lt;/p&gt; &lt;p&gt;Administrating such an activity should not be prohibitive, as most of the expertise can be found with the stakeholders.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2009-10-27T14:57:31-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>European Commission and the Data Overflow</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-10-27#1585</atom:id>
  <atom:published>2009-10-27T18:29:51Z</atom:published>
  <atom:content type="html">&lt;p&gt;The European Commission recently circulated a questionnaire to selected experts on what could be done for the future of big &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x79cfe58&quot;&gt;data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Since the &lt;a href=&quot;http://cordis.europa.eu/fp7/ict/content-knowledge/consultation_en.html&quot; id=&quot;link-id1191c0f8&quot;&gt;questionnaire is public&lt;/a&gt;, I am publishing my answers below.&lt;/p&gt; &lt;ol type=&quot;1&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Data and data types&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What volumes of data are we dealing with today? What is the growth rate? Where can we expect to be in 2015? &lt;/b&gt; &lt;/p&gt; &lt;p&gt;Private data warehouses of corporations have more than doubled yearly for the past years; hundreds of TB is not exceptional. This will continue. The real shift is in structured data being published in increasing quantities with a minimum level of integrate-ability through use of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x7d7e7a0&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x7f2a788&quot;&gt;linked data&lt;/a&gt; principles. There are rewards for use of standard vocabularies and identifiers through search engines recognizing such data. There is convergence around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x7dfbca8&quot;&gt;DBpedia&lt;/a&gt; identifiers for real-world entities, e.g., most things that would be in the news.&lt;/p&gt; &lt;p&gt;This also means that internal data processes and silos may be enriched with this content. There is consequent pressure for accommodating more diversity of data, with more flexible &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x7babaf8&quot;&gt;schema&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ultimately, all content presently stored in RDBs and presented in public accessible dynamic web pages will end up on the web of linked data. Examples are product catalogs, price lists, event schedules and the like.&lt;/p&gt; &lt;p&gt;The volume of the well known linked data sets is around 10 billion statements. With the above mentioned trends, growth by two or three orders of magnitude by 2015 seems reasonable, This is so especially if explicit semantics are extracted from the document web and if there is some further progress in the precision/recall of such extraction.&lt;/p&gt; &lt;p&gt;Relevant sections of this mass of data are a potential addition to any present or future analytics application.&lt;/p&gt; &lt;p&gt;Since arbitrary analytics over the database which is the web cannot be economically provided by a centralized search engine, a cloud model may be used for on-demand selection of relevant data and mixing it with private data. This will drive database innovation for the next years even more than the continued classical warehouse growth.&lt;/p&gt; &lt;p&gt;Science data is another driver of the data overflow. For example, faster gene sequencing, more accurate measurements in high energy physics, better imaging, and remote sensing will produce large volumes of data. This data has highly regular structure but labeling this data with source and lineage calls for a flexible, schema-last, self-describing model, such as RDF and linked data. Data and &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x96ce60&quot;&gt;metadata&lt;/a&gt; should travel together but may have different data models.&lt;/p&gt; &lt;p&gt;By and large, the metadata of science data will be another stream to the web of linked data, at least to the degree it is publicly accessible. Restricted circles can and likely will implement similar ideas.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What types of data can we deal with intelligently due to their inherent structure (geospatial, temporal, social or &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x7e8e248&quot;&gt;knowledge&lt;/a&gt; graphs, 3D, sensor streams...)?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;All the above types should be supported inside one DBMS so as to allow efficient querying combining conditions on all these types of data, e.g., &lt;i&gt;photos of sunsets taken last summer in Ibiza, with over 20 megapixels, by people I know.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;Note that the test for being a sunset is an operation on the image blob that should be taken to the data; the images cannot be economically transferred.&lt;/p&gt; &lt;p&gt;Interleaving of all database functions and types becomes increasingly important.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Industries, communities&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Who is producing these data and why? Could they do it better? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Right now, projects such as &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id0x43bd098&quot;&gt;Bio2RDF&lt;/a&gt;, &lt;a href=&quot;http://neurocommons.org/page/Main_Page&quot; id=&quot;link-id0x5c074b0&quot;&gt;Neurocommons&lt;/a&gt;, and DBPedia produce this data. The processes are in place and are reasonable. Incremental improvement is to be expected. These processes, along with the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x72131d0&quot;&gt;linked data meme&lt;/a&gt; generally taking off, drive demand for better &lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x71e7798&quot;&gt;NLP&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Natural_language_processing&quot; id=&quot;link-id0x7e0e2f0&quot;&gt;Natural Language Processing&lt;/a&gt;), e.g., &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x71ab500&quot;&gt;entity&lt;/a&gt; and relationship extraction, especially extraction that can produce instance data in given ontologies (e.g., events) using common identifiers (e.g., DBPedia URIs).&lt;/p&gt; &lt;p&gt;Mapping of RDBs to RDF is possible, and a W3C working group is developing standards for this. The required baseline level has been reached; the rest is a matter of automating deployment. Within the enterprise, there are advantages to be gained for &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x7a8e9a8&quot;&gt;information&lt;/a&gt; integration; e.g., all entities in the CRM space can be integrated with all email and support tickets through giving everything a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x599f630&quot;&gt;URI&lt;/a&gt;. Some of this information may even be published on an &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id0x2a28f98&quot;&gt;extranet&lt;/a&gt; for self-service and web-service interfaces. This has been done at small scales and the rest is a matter of spreading adoption and lowering the entry barrier. Incremental progress will take place, eventually resulting in qualitatively better integration along the value chain when adoption is sufficiently widespread.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Who is consuming these data and why? Could they do it better? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Consumers are various. The greatest need is for tools that summarize complex data and allow getting a bird&amp;#39;s eye view of what data is in the first instance available. Consuming the data is hindered by the user not even necessarily knowing what data there is. This is somewhat new, as traditionally the business analyst did know the schema of the warehouse and was proficient with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x5999558&quot;&gt;SQL&lt;/a&gt; report generators and statistics packages.&lt;/p&gt; &lt;p&gt;Where Web 2.0 made the &lt;i&gt;citizen journalist&lt;/i&gt;, the web of linked data will make the &lt;i&gt;citizen analyst&lt;/i&gt;. For this to happen, with benefits for individuals, enterprises, and governments alike, more work in user interfaces, knowledge discovery, and query composition will be useful. We may envision a &amp;quot;meshup economy&amp;quot; where data is plentiful, but the unit of value and exchange is the smart report that crystallizes actionable value from this ocean.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What industrial sectors in Europe could become more competitive if they became much better at managing data?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Any sector could benefit. Early adopters are seen in the biomedical field and to an extent in media. &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Is the regulation landscape imposing constraints (privacy, compliance ...) that don&amp;#39;t have today good tool support?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The regulation landscape drives database demand through data retention requirements and the like.&lt;/p&gt; &lt;p&gt;With data integration, especially with privacy-sensitive data (as in medicine), there are issues of whether one dares put otherwise-shareable information online. Regulation is needed to protect individuals, but integration should still be possible for science.&lt;/p&gt; &lt;p&gt;For this, we see a need for progress in applying policy-based approaches (e.g., row level security) to relatively schema-last data such as RDF. This is possible but needs some more work. Also, creating on-the-fly-anonymizing views on data might help.&lt;/p&gt; &lt;p&gt;More research is needed for reconciling the need for security with the advantages of broad-based &lt;i&gt;ad hoc&lt;/i&gt; integration. Ideally, data should be intelligent, aware of its origins and classification and cautious of whom it interacts with, all of this supported under the covers so that the user could ask anything but the data might refuse to answer or might restrict answers according to the user&amp;#39;s profile. This is a tall order and implementing something of the sort is an open question.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What are the main practical problem identified for individuals and organizations? Please give examples and tell us about the main obstacles and barriers.&lt;/b&gt; &lt;/p&gt; &lt;p&gt;We have come across the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Knowing that the data exists in the first place.&lt;/li&gt; &lt;li&gt;If the data is found, figuring out the provenance, units and precision of measurement, identifiers, and the like.&lt;/li&gt; &lt;li&gt;Compatible subject matter but incompatible representation: For example, one has numbers on a map with different maps for different points in time; another has time series of instrument data with geo-location for the instrument. It is only to be expected that the time interval between measurements is not the same. So there is need for a lot of one-off programming to align data.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Other problems have to do with sheer volume, i.e., transfer of data even in a local area network is too slow, let alone over a wide area network. Computation needs to go to the data, and databases need to support this.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Services, software stacks, protocols, standards, benchmarks&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What combinations of components are needed to deal with these problems?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Recent times have seen a proliferation of special purpose databases. Since the data needs of the future are about combining data with maximum agility and minimum performance hit, there is need to gather the currently-separate functionality into an integrated system with sufficient flexibility. We see some of this in integration of map-reduce and scale-out databases. The former antagonists have become partners. Vertica, &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x45ecfa0&quot;&gt;Greenplum&lt;/a&gt;, and OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x7f73fc8&quot;&gt;Virtuoso&lt;/a&gt; are example of DBMS featuring work in this direction.&lt;/p&gt; &lt;p&gt;Interoperability and at least &lt;i&gt;de facto&lt;/i&gt; standards in ways of doing this will emerge.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What data exchange and processing mechanisms will be needed to work across platforms and programming languages?&lt;/b&gt; &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x776a1a0&quot;&gt;HTTP&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2a4e8d0&quot;&gt;XML&lt;/a&gt;, and RDF are in fact very verbose, yet these are the formats and models that have uptake. Thus, these will continue to be used even though one might think binary formats to be more efficient.&lt;/p&gt; &lt;p&gt;There are of course science data set standards that are more compressed and these will continue, hopefully adding a practice of rich metadata in RDF.&lt;/p&gt; &lt;p&gt;For internals of systems, MPI and TCP/IP with proprietary optimized wire formats will continue. Inter-system communication will likely continue to be HTTP, XML, and RDF as appropriate.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What data environments are today so wastefully messy that they would benefit from the development of standards?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;RDF and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2a35960&quot;&gt;OWL&lt;/a&gt; are not messy but they could use some more performance; we are working on this. &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x12362e8&quot;&gt;SPARQL&lt;/a&gt; is finally acquiring the capabilities of a serious query language, so things are slowly coming together.&lt;/p&gt; &lt;p&gt;Community process for developing application domain specific vocabularies works quite well, even though one could argue it is &lt;i&gt;ad hoc&lt;/i&gt; and not up to what a modeling purist might wish.&lt;/p&gt; &lt;p&gt;Top-down imposition of standards has a mixed history, with long and expensive development and sometimes no or little uptake, consider some WS* standards for example.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What kind of performance is expected or required of these systems? Who will measure it reliably? How?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Relational databases have a history of substantial investment in &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x7b2d7c8&quot;&gt;optimization&lt;/a&gt; and some of them are very good for what they do, e.g., the newer generation of analytics databases.&lt;/p&gt; &lt;p&gt;The very large schema-last, no-SQL, sometimes eventually consistent key-value stores have a somewhat shorter history but do fill a real need.&lt;/p&gt; &lt;p&gt;These trends will merge: Extreme scale, schema-last, complex queries, even more complex inference, custom code for in-database machine learning and other bulk processing.&lt;/p&gt; &lt;p&gt;We find RDF augmented with some binary types at this crossroads. This point of the design space will have to provide performance roughly on the level of today&amp;#39;s best relational solution for workloads that fit the relational model. The added cost of schema-last and inference must come down. We are working on this. Research work such as carried out with &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x794ee48&quot;&gt;MonetDB&lt;/a&gt; gives clues as to how these aims can be reached.&lt;/p&gt; &lt;p&gt;The separation of query language and inference is artificial. After the concepts are mature, these functions will merge and execute close to the data; there are clear evolutionary pressures in this direction.&lt;/p&gt; &lt;p&gt;Benchmarks are key. Some gain can be had even from repurposing standard relational benchmarks like &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x7d45c58&quot;&gt;TPC&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x45b0198&quot;&gt;H&lt;/a&gt;. But the TPC-H rules do not allow official reporting of such.&lt;/p&gt; &lt;p&gt;Development of benchmarks for RDF, complex queries, and inference is needed. A bold challenge to the community, it should be rooted in real-life integration needs and involve high heterogeneity. A key-value store benchmark might also be conceived. A transaction benchmark like TPC-&lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x7e32178&quot;&gt;C&lt;/a&gt; might be the basis, maybe augmented with massive user-generated content like reviews and blogs.&lt;/p&gt; &lt;p&gt;If benchmarks exist and are not too easy nor inaccessibly difficult nor too expensive to run — think of the high end TPC-C results — then TPC-style rules and processes would be quite adequate. The threshold to publish should be lowered: Everybody runs the TPC workloads internally but few publish.&lt;/p&gt; &lt;p&gt;Some EC initiative for benchmarking could make sense, similar to the TREC initiative of the US government. Industry should be consulted for the specific content; possibly the answers to the present questionnaire can provide an approximate direction.&lt;/p&gt; &lt;p&gt;Benchmarks should be run by software vendors on their own systems, tuned by themselves. But there should be a process of disclosure and auditing; the TPC rules give an example. Compliance should not be too expensive or time consuming. Some community development for automating these things would be a worthwhile target for EC funding.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Usability and training&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;How difficult will it be for a developer of average competence to deploy components whose core is based on rather deep computer science? Do we all need to understand Monads and Continuations? What can be done to make it ever easier?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;In the database world, huge advances in technology have taken place behind a relatively simple and stable interface: SQL. For the linked data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x7e01618&quot;&gt;web&lt;/a&gt;, the same will take place behind SPARQL.&lt;/p&gt; &lt;p&gt;Beyond these, for example, programming with MPI with good utilization of a cluster platform for an arbitrary algorithm, is quite difficult. The casual amateur is hereby warned.&lt;/p&gt; &lt;p&gt;There is no single solution. For automatic parallelization, since explicit, programmatic parallelization of things with MPI for example is very unscalable in terms of required skill, we should favor declarative and/or functional approaches.&lt;/p&gt; &lt;p&gt;Developing a debugger and explanation engine for rule-based and description-logics-based inference would be an idea.&lt;/p&gt; &lt;p&gt;For procedural workloads, things like Erlang may be good in cases and are not overly difficult in principle, especially if there are good debugging facilities.&lt;/p&gt; &lt;p&gt;For shipping functions in a cluster or cloud, the &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x43665a8&quot;&gt;BOOM&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id0x7718f00&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt;) approach or logic programming with explicit specification of compute location seem promising, surely more flexible than map-reduce. The question is whether a &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x7d64f68&quot;&gt;PHP&lt;/a&gt; developer can be made to do logic programming.&lt;/p&gt; &lt;p&gt;This bridge will be crossed only with actual need and even then reluctantly. We may look at the Web 2.0 practice of sharding &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0xbab1ae98&quot;&gt;MySQL&lt;/a&gt;, inconvenient as this may be, for an example. There is inertia and thus re-architecting is a constant process that is generally in reaction to facts, &lt;i&gt;post hoc&lt;/i&gt;, often a point solution. One could argue that planning ahead would be smarter but by and large the world does not work so.&lt;/p&gt; &lt;p&gt;One part of the answer is an infinitely-scalable SQL database that expands and shrinks in the clouds, with the usual semantics, maybe optional eventual consistency and built-in map reduce. If such a thing is inexpensive enough and syntax-level-compatible with present installed base, many developers do not have to learn very much more.&lt;/p&gt; &lt;p&gt;This is maybe good for the bread-and-butter IT, but European competitiveness should not rest on this. Therefore we wish to go for bold new application types for which the client-server database application is not the model. Data-centric languages like BOOM, if they can be made very efficient and have good debugging support, are attractive there. These do require more intellectual investment but that is not a problem since the less-inquisitive part of the developer community is served by the first part of the answer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;How is a developer of average skills going to learn about these new advanced tools? How can we plan for excellent documentation and training, community mentoring, exchange of good practices, etc... across all EU countries?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;For the most part, developers do not learn things for the sake of learning. When they have learned something and it is adequate, they stay with it for the most part and are even reluctant to engage in cross-camps interaction. The research world is often similarly insular. A new inflection in the application landscape is needed to drive learning. This inflection is provided by the &lt;a href=&quot;https://wiki.mozilla.org/Labs/Ubiquity&quot; id=&quot;link-id0x770df38&quot;&gt;ubiquity&lt;/a&gt; of mobile devices, sensor data, explicit semantics, NLP concept extraction, web of linked data, and such factors.&lt;/p&gt; &lt;p&gt;RDFa is a good example of a new technique piggybacking on something everybody uses, namely HTML. These new things should, within possibility, be deployed in the usual technology stack, &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-id0x55596a8&quot;&gt;LAMP&lt;/a&gt; or Java. Of course these do not have to be LAMP or Java or HTML or HTTP themselves but they must manifest through these.&lt;/p&gt; &lt;p&gt;A lot of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x3d5378&quot;&gt;semantic web&lt;/a&gt; potential can be realized within the client-server database application model, thus no fundamental re-architecting, just some new data types and queries.&lt;/p&gt; &lt;p&gt;For data- or processing-intensive tasks, an on-demand hookup to cloud-based servers with Erlang and/or BOOM for programming model would be easy enough to learn and utilize.&lt;/p&gt; &lt;p&gt;The question is one of providing challenges. Addressing actual challenges with these techniques will lead to maturity, documentation, examples, and training. With virtual, Europe-wide distributed teams a reality in many places, Europe-wide dissemination is no longer insurmountable.&lt;/p&gt; &lt;p&gt;As the data overflow proceeds, its victims will multiply and create demand for solutions. The EC could here encourage research project use cases gaining an extended life past the end of research projects, possibly being maintained and multiplied and spun off.&lt;/p&gt; &lt;p&gt;If such things could be mutated into self-sustaining service businesses with pay-per-use revenue, say through a cloud SaaS business model, still primarily leveraging an open source technology stack, we could have self-propagating and self-supporting models for exploiting advanced IT. This would create interest, and interest would drive training and dissemination.&lt;/p&gt; &lt;p&gt;The problem is creating the pull.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Challenges&lt;/b&gt; &lt;/p&gt; &lt;ol type=&quot;a&quot; start=&quot;1&quot;&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What should be, in this domain, the equivalent of the Netflix challenge, Ansari X Prize, &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x6a6c2b0&quot;&gt;Google&lt;/a&gt; Lunar X Prize, etc. ... ?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The EC itself no doubt suffers from data overflow in one function or another. Unless security/secrecy prohibits, simply publishing a large data set and a description of what operations should be done on it would be a start. The more real the data, the better — reality is consistently more complex and surprising than imagination. Since many interesting problems touch on fraud detection and law enforcement, there may be some security obstacles for using these application domains as subject matters of open challenges.&lt;/p&gt; &lt;p&gt;Once there is a good benchmark, as discussed above, there can be some prize money allocated for the winners, specially if the race is tight.&lt;/p&gt; &lt;p&gt;The Semantic Web Challenge and the Billion Triples Challenge exist and are useful as such, but do not seem to have any huge impact.&lt;/p&gt; &lt;p&gt;The incentives should be sufficient and part of the expenses arising from running for such challenges could be funded. Otherwise investing in existing business development will be more interesting to industry. Some industry participation seems necessary; we would wish academia and industry to work closer. Also, having industry supply the baseline guarantees that academia actually does further the state of the art. This is not always certain.&lt;/p&gt; &lt;p&gt;If challenges are based on actual problems, whether of the EC, its member governments, or private entities, and winning the challenge may lead to a contract for supplying an actual solution, these will naturally become more interesting for consortia involving integrators, specialist software vendors, and academia. Such a model would build actual capacity to deploy leading edge technologies in production, which is sorely needed.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;What should one do to set up such a challenge, administer, and monitor it?&lt;/b&gt; &lt;/p&gt; &lt;p&gt;The EC should probably circulate a call for actual problem scenarios involving big data. If the matter of the overflow is as dire as represented, cases should be easy to find. A few should be selected and then anonymized if needed.&lt;/p&gt; &lt;p&gt;The party with the use case would benefit by having hopefully the best work on it. The contestants would benefit from having real world needs guide R&amp;amp;D. The EC would not have to do very much, except possibly use some money for funding the best proposals. The winner would possibly get a large account and related sales and service income. The contestants would have to be teams possibly involving many organizations; for example, development and first-line services and support could come from different companies along a systems integrator model such as is widely used in the US.&lt;/p&gt; &lt;p&gt;There may be a good benchmark at the time, possibly resulting from FP7 itself. In such a case, the EC could offer a prize for winners. Details would have to be worked out case by case. Such a challenge could be repeated a few times, as benchmark-driven progress in databases or TREC for example have taken some years to reach a point of slowdown in progress.&lt;/p&gt; &lt;p&gt;Administrating such an activity should not be prohibitive, as most of the expertise can be found with the stakeholders.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2009-10-27T14:57:28.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Conversation with Jon Udell: Are We There Yet Re. Web++ ?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-09-10#1584</atom:id>
  <atom:published>2009-09-10T15:03:01Z</atom:published>
  <atom:content type="html">&lt;p&gt; Personally, I believe that we&amp;#39;ve actually reached a watershed moment re. the evolution of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; from a mesh of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id123169a8&quot;&gt;Linked Data&lt;/a&gt; Containers (Web of Linked Documents) to a mesh of Linked Data Items (entities or real world objects).&lt;/p&gt; &lt;p&gt; The journey towards this watershed moment started with the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id14f69f48&quot;&gt;Semantic Web&lt;/a&gt; Project, gained focus and pragmatism via the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id11155f78&quot;&gt;Linked Data meme&lt;/a&gt;, attained substance &amp;amp; credibility via efforts such as &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id15857c78&quot;&gt;DBpedia&lt;/a&gt; and the resulting cloud of &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2009-07-14.html&quot; id=&quot;link-id16adf918&quot;&gt;Open Linked Data Spaces&lt;/a&gt;, and finally arrived at the most important destination of all: broad comprehension and coherence, via &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id1229b960&quot;&gt;RDFa&lt;/a&gt;. &lt;/p&gt; &lt;p&gt; Over the years, I&amp;#39;ve chronicled the journey above via entries in this particular &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id14f76338&quot;&gt;data space&lt;/a&gt; (my &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-idfd32c88&quot;&gt;blog&lt;/a&gt;) and most recently, via my rapid-fire comments and debates on &lt;a href=&quot;http://twitter.com&quot; id=&quot;link-id11339e80&quot;&gt;Twitter&lt;/a&gt; (basically hastag #linkeddata account: &lt;a href=&quot;http://twitter.com/kidehen#this&quot; id=&quot;link-id115e9af8&quot;&gt;kidehen&lt;/a&gt;). &lt;/p&gt; &lt;p&gt; On a parallel front re. my chronicles, I&amp;#39;ve periodically had conversations with &lt;a href=&quot;http://blog.jonudell.net/about/&quot; id=&quot;link-id11829170&quot;&gt;Jon Udell&lt;/a&gt;, who has always provided a coherent sounding board and reconciliation framework for my world views and open data access vision; naturally, this has a lot to do with his holistic grasp of the big picture issues, associated technical details, and special communication prowess :-) &lt;/p&gt; &lt;p&gt; Against this backdrop, I refer you to my &lt;a href=&quot;http://itc.conversationsnetwork.org/shows/detail4233.html&quot; id=&quot;link-id14ac9c08&quot;&gt;most recent podcast conversation with Jon&lt;/a&gt;, which is about how the tandem of HTML+RDFa and the &lt;a href=&quot;http://www.heppnetz.de/projects/goodrelations/&quot; id=&quot;link-id14279be8&quot;&gt;GoodRelations vocabulary&lt;/a&gt; deliver the critical missing links re. broad comprehension of the Semantic Web vision en route to mass exploitation. &lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://webbackplane.com/node/57&quot; id=&quot;link-id113b5b00&quot;&gt;Mark Birbeck Introduces RDFa&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://webbackplane.com/rdfa-handbook&quot; id=&quot;link-id11b36ac0&quot;&gt;RDFa Handbook&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.ebusiness-unibw.org/wiki/GoodRelations#CookBook:_GoodRelations_Recipes_and_Examples&quot; id=&quot;link-id1519f458&quot;&gt;GoodRelations Usage Examples &amp;amp; Templates&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blog.jonudell.net/2009/09/09/talking-with-kingsley-idehen-about-mastering-your-own-search-index/&quot; id=&quot;link-id11a62ce0&quot;&gt;Be the master of your own search index&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://itc.conversationsnetwork.org/shows/detail4312.html&quot; id=&quot;link-id115d54f0&quot;&gt;Jon Udell Interviews Martin Hepp about GoodRelations, RDFa, and Esoteric Web Search&lt;/a&gt; &lt;br /&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-02-01T08:58:04.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 Web Scale Data Management Panel (5 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1583</atom:id>
  <atom:published>2009-09-01T16:24:17Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;p&gt; &lt;i&gt;&amp;quot;The universe of cycles is not exactly one of literal cycles, but rather one of spirals,&amp;quot; mused &lt;a href=&quot;http://db.cs.berkeley.edu/jmh/&quot; id=&quot;link-id117455a0&quot;&gt;Joe Hellerstein&lt;/a&gt; of UC Berkeley.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Come on, let&amp;#39;s all drop some &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id16b3db50&quot;&gt;ACID&lt;/a&gt;,&amp;quot; interjected another.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;It is not that we end up repeating the exact same things, rather even if some patterns seem to repeat, they do so at a higher level, enhanced by the experience gained,&amp;quot; continued Joe.&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Thus did the Web Scale &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id11061ae0&quot;&gt;Data&lt;/a&gt; Management panel conclude.&lt;/p&gt; &lt;p&gt;Whether successive generations are made wiser by the ones that have gone before may be argued either way.&lt;/p&gt; &lt;p&gt;The cycle in question was that of developers discovering ACID in the 1960s, i.e. Atomicity, Consistency, Integrity, Durability. Thus did the DBMS come into being. Then DBMSs kept becoming more complex until, as there will be a counter-force to each force, came the &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id11076cc8&quot;&gt;meme&lt;/a&gt; of key value stores and BASE, no multiple-row transactions, eventual consistency, no query language but scaling to thousands of computers. So now, the DBMS community asks itself what went wrong.&lt;/p&gt; &lt;p&gt;In the words of one panelist, another demonstrated a &amp;quot;shocking familiarity with the subject matter of substance abuse&amp;quot; when he called for the DBMS community to get on a &lt;a href=&quot;http://dbpedia.org/resource/Twelve-step_program&quot; id=&quot;link-id15d954a8&quot;&gt;12 step program&lt;/a&gt; and to look where addiction to certain ideas, among which ACID, had brought its life. Look at yourself: The influential papers in what ought to be your space by rights are coming from the OS community: &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id166675f0&quot;&gt;Google&lt;/a&gt; Bigtable, Amazon Dynamo, want more? When you ought to drive, you give excuses and play catch up! Stop denial, drop &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1105adf0&quot;&gt;SQL&lt;/a&gt;, drop ACID!&lt;/p&gt; &lt;p&gt;The web developers have revolted against the time-honored principles of the DBMS. This is true. Sharded &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id1221c230&quot;&gt;MySQL&lt;/a&gt; is not the ticket — or is it? Must they rediscover the virtues of ACID, just like the previous generation did?&lt;/p&gt; &lt;p&gt;Nothing under the sun is new. As in music and fashion, trends keep cycling also in science and engineering.&lt;/p&gt; &lt;p&gt;But seriously, does the full-featured DBMS scale to web scale? &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id10ffcaf8&quot;&gt;Microsoft&lt;/a&gt; says the Azure version of SQL server does. &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id16b3f138&quot;&gt;Yahoo&lt;/a&gt; says they want no SQL but &lt;a href=&quot;http://dbpedia.org/resource/Hadoop&quot; id=&quot;link-id11046ef0&quot;&gt;Hadoop&lt;/a&gt; and &lt;a href=&quot;http://research.yahoo.com/node/2304&quot; id=&quot;link-id110a0040&quot;&gt;PNUTS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Twitter, Facebook, and other web names got their own discussion. Why do they not go to serious DBMS vendors for their data but make their own, like Facebook with Hive?&lt;/p&gt; &lt;p&gt;Who can divine the mind of the web developer? What makes them go to &lt;a href=&quot;http://www.danga.com/memcached/&quot; id=&quot;link-id1109e280&quot;&gt;memcached&lt;/a&gt;, manually sharded MySQL, and &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id1107cd60&quot;&gt;MapReduce&lt;/a&gt;, walking away from the 40 years of technology invested in declarative query and ACID? What is this highly visible but hard to grasp &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1105b6b8&quot;&gt;entity&lt;/a&gt;? My guess is that they want something they can understand, at least at the beginning. A DBMS, especially on a cluster, is complicated, and it is not so easy to say how it works and how its performance is determined. The big brands, if deployed on a thousand PCs, would also be prohibitively expensive. But if all you do with the DBMS is single row selects and updates, it is no longer so scary, but you end up doing all the distributed things in a middle layer, and abandoning expressive queries, transactions, and database-supported transparency of location. But at least now you know how it works and what it is good/not good for.&lt;/p&gt; &lt;p&gt;This would be the case for those who make a conscious choice. But by and large the choice is not deliberate; it is something one drifts into: The application gains popularity; the single &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-iddc68d28&quot;&gt;LAMP&lt;/a&gt; can no longer keep all in memory; you need a second MySQL in the LAMP and you decide that users A–M go left and N–Z right (horizontal partitioning). This siren of sharding beckons you and all is good until you hit the reef of re-architecting. Memcached and duct-tape help, like aspirin helps with hangover, but the root cause of the headache lies unaddressed.&lt;/p&gt; &lt;p&gt;The conclusion was that there ought to be something incrementally scalable from the get-go. Low cost of entry and built-in scale-out. No, the web developers do not hate SQL; they just have gotten the idea that it does not scale. But they would really wish it to. So, DBMS people, show there is life in you yet.&lt;/p&gt; &lt;p&gt;Joe Hellerstein was the philosopher and paradigmatician of the panel. His team had developed a protocol-compatible Hadoop in a few months using a declarative logic programming style approach. His claim was that developers made the market. Thus, for writing applications against web scale data, there would have to be data centric languages. Why not? These are discussed in &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id110ba0e0&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id16aab768&quot;&gt;BOOM&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;I come from &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_%28programming_language%29&quot; id=&quot;link-id10f2cd68&quot;&gt;Lisp&lt;/a&gt; myself, way back. I have since abandoned any desire to tell anybody what they ought to program in. This is a bit like religion: Attempting to impose or legislate or ram it on somebody just results in anything from lip service to rejection to war. The appeal exerted by the diverse language/paradigm -isms on their followers seems to be based on hitting a simplification of reality that coincides with a problem in the air. MapReduce is an example of this. &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-ide22cdd0&quot;&gt;PHP&lt;/a&gt; is another. A quick fix for a present need: Scripting web servers (PHP) or processing tons of files (MapReduce). The full database is not as quick a fix, even though it has many desirable features. It is also not as easy to tell what happens inside one, so MapReduce may give a greater feeling of control.&lt;/p&gt; &lt;p&gt;Totally self-managing, dynamically-scalable &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id152864b0&quot;&gt;RDF&lt;/a&gt; would be a fix for not having to design or administer databases: Since it would be indexed on everything, complex queries would be possible; no full database scans would stop everything. For the mid-size segment of web sites this might be a fit. For the extreme ends of the spectrum, the choice is likely something custom built and much less expressive.&lt;/p&gt; &lt;p&gt;The BOOM rule language for data-centric programming would be something very easy for us to implement, in fact we will get something of the sort essentially for free when we do the rule support already planned.&lt;/p&gt; &lt;p&gt;The question is, can one induce web developers to do logic? The history is one of procedures, both in LAMP and MapReduce. On the other hand, the query languages that were ever universally adopted were declarative, i.e., keyword search and SQL. There certainly is a quest for an application model for the cloud space beyond just migrating apps. We&amp;#39;ll see. More on this another time.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-02T12:05:26-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 Web Scale Data Management Panel (5 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1582</atom:id>
  <atom:published>2009-09-01T16:24:17Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;p&gt; &lt;i&gt;&amp;quot;The universe of cycles is not exactly one of literal cycles, but rather one of spirals,&amp;quot; mused &lt;a href=&quot;http://db.cs.berkeley.edu/jmh/&quot; id=&quot;link-id117455a0&quot;&gt;Joe Hellerstein&lt;/a&gt; of UC Berkeley.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;Come on, let&amp;#39;s all drop some &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id16b3db50&quot;&gt;ACID&lt;/a&gt;,&amp;quot; interjected another.&lt;/i&gt; &lt;/p&gt; &lt;p&gt; &lt;i&gt;&amp;quot;It is not that we end up repeating the exact same things, rather even if some patterns seem to repeat, they do so at a higher level, enhanced by the experience gained,&amp;quot; continued Joe.&lt;/i&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Thus did the Web Scale &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id11061ae0&quot;&gt;Data&lt;/a&gt; Management panel conclude.&lt;/p&gt; &lt;p&gt;Whether successive generations are made wiser by the ones that have gone before may be argued either way.&lt;/p&gt; &lt;p&gt;The cycle in question was that of developers discovering ACID in the 1960s, i.e. Atomicity, Consistency, Integrity, Durability. Thus did the DBMS come into being. Then DBMSs kept becoming more complex until, as there will be a counter-force to each force, came the &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id11076cc8&quot;&gt;meme&lt;/a&gt; of key value stores and BASE, no multiple-row transactions, eventual consistency, no query language but scaling to thousands of computers. So now, the DBMS community asks itself what went wrong.&lt;/p&gt; &lt;p&gt;In the words of one panelist, another demonstrated a &amp;quot;shocking familiarity with the subject matter of substance abuse&amp;quot; when he called for the DBMS community to get on a &lt;a href=&quot;http://dbpedia.org/resource/Twelve-step_program&quot; id=&quot;link-id15d954a8&quot;&gt;12 step program&lt;/a&gt; and to look where addiction to certain ideas, among which ACID, had brought its life. Look at yourself: The influential papers in what ought to be your space by rights are coming from the OS community: &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id166675f0&quot;&gt;Google&lt;/a&gt; Bigtable, Amazon Dynamo, want more? When you ought to drive, you give excuses and play catch up! Stop denial, drop &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1105adf0&quot;&gt;SQL&lt;/a&gt;, drop ACID!&lt;/p&gt; &lt;p&gt;The web developers have revolted against the time-honored principles of the DBMS. This is true. Sharded &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id1221c230&quot;&gt;MySQL&lt;/a&gt; is not the ticket — or is it? Must they rediscover the virtues of ACID, just like the previous generation did?&lt;/p&gt; &lt;p&gt;Nothing under the sun is new. As in music and fashion, trends keep cycling also in science and engineering.&lt;/p&gt; &lt;p&gt;But seriously, does the full-featured DBMS scale to web scale? &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id10ffcaf8&quot;&gt;Microsoft&lt;/a&gt; says the Azure version of SQL server does. &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id16b3f138&quot;&gt;Yahoo&lt;/a&gt; says they want no SQL but &lt;a href=&quot;http://dbpedia.org/resource/Hadoop&quot; id=&quot;link-id11046ef0&quot;&gt;Hadoop&lt;/a&gt; and &lt;a href=&quot;http://research.yahoo.com/node/2304&quot; id=&quot;link-id110a0040&quot;&gt;PNUTS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Twitter, Facebook, and other web names got their own discussion. Why do they not go to serious DBMS vendors for their data but make their own, like Facebook with Hive?&lt;/p&gt; &lt;p&gt;Who can divine the mind of the web developer? What makes them go to &lt;a href=&quot;http://www.danga.com/memcached/&quot; id=&quot;link-id1109e280&quot;&gt;memcached&lt;/a&gt;, manually sharded MySQL, and &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id1107cd60&quot;&gt;MapReduce&lt;/a&gt;, walking away from the 40 years of technology invested in declarative query and ACID? What is this highly visible but hard to grasp &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1105b6b8&quot;&gt;entity&lt;/a&gt;? My guess is that they want something they can understand, at least at the beginning. A DBMS, especially on a cluster, is complicated, and it is not so easy to say how it works and how its performance is determined. The big brands, if deployed on a thousand PCs, would also be prohibitively expensive. But if all you do with the DBMS is single row selects and updates, it is no longer so scary, but you end up doing all the distributed things in a middle layer, and abandoning expressive queries, transactions, and database-supported transparency of location. But at least now you know how it works and what it is good/not good for.&lt;/p&gt; &lt;p&gt;This would be the case for those who make a conscious choice. But by and large the choice is not deliberate; it is something one drifts into: The application gains popularity; the single &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-iddc68d28&quot;&gt;LAMP&lt;/a&gt; can no longer keep all in memory; you need a second MySQL in the LAMP and you decide that users A–M go left and N–Z right (horizontal partitioning). This siren of sharding beckons you and all is good until you hit the reef of re-architecting. Memcached and duct-tape help, like aspirin helps with hangover, but the root cause of the headache lies unaddressed.&lt;/p&gt; &lt;p&gt;The conclusion was that there ought to be something incrementally scalable from the get-go. Low cost of entry and built-in scale-out. No, the web developers do not hate SQL; they just have gotten the idea that it does not scale. But they would really wish it to. So, DBMS people, show there is life in you yet.&lt;/p&gt; &lt;p&gt;Joe Hellerstein was the philosopher and paradigmatician of the panel. His team had developed a protocol-compatible Hadoop in a few months using a declarative logic programming style approach. His claim was that developers made the market. Thus, for writing applications against web scale data, there would have to be data centric languages. Why not? These are discussed in &lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id110ba0e0&quot;&gt;Berkeley Orders Of Magnitude&lt;/a&gt; (&lt;a href=&quot;http://www.eecs.berkeley.edu/Research/Projects/Data/105733.html&quot; id=&quot;link-id16aab768&quot;&gt;BOOM&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;I come from &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_%28programming_language%29&quot; id=&quot;link-id10f2cd68&quot;&gt;Lisp&lt;/a&gt; myself, way back. I have since abandoned any desire to tell anybody what they ought to program in. This is a bit like religion: Attempting to impose or legislate or ram it on somebody just results in anything from lip service to rejection to war. The appeal exerted by the diverse language/paradigm -isms on their followers seems to be based on hitting a simplification of reality that coincides with a problem in the air. MapReduce is an example of this. &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-ide22cdd0&quot;&gt;PHP&lt;/a&gt; is another. A quick fix for a present need: Scripting web servers (PHP) or processing tons of files (MapReduce). The full database is not as quick a fix, even though it has many desirable features. It is also not as easy to tell what happens inside one, so MapReduce may give a greater feeling of control.&lt;/p&gt; &lt;p&gt;Totally self-managing, dynamically-scalable &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id152864b0&quot;&gt;RDF&lt;/a&gt; would be a fix for not having to design or administer databases: Since it would be indexed on everything, complex queries would be possible; no full database scans would stop everything. For the mid-size segment of web sites this might be a fit. For the extreme ends of the spectrum, the choice is likely something custom built and much less expressive.&lt;/p&gt; &lt;p&gt;The BOOM rule language for data-centric programming would be something very easy for us to implement, in fact we will get something of the sort essentially for free when we do the rule support already planned.&lt;/p&gt; &lt;p&gt;The question is, can one induce web developers to do logic? The history is one of procedures, both in LAMP and MapReduce. On the other hand, the query languages that were ever universally adopted were declarative, i.e., keyword search and SQL. There certainly is a quest for an application model for the cloud space beyond just migrating apps. We&amp;#39;ll see. More on this another time.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-02T12:05:20.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 Yahoo Keynote (4 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1581</atom:id>
  <atom:published>2009-09-01T16:04:36Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Raghu_Ramakrishnan&quot; id=&quot;link-id0x177f3ef8&quot;&gt;Raghu Ramakrishnan&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id0x2a4aad0&quot;&gt;Yahoo&lt;/a&gt;! gave a keynote about &lt;a href=&quot;http://research.yahoo.com/node/2304&quot; id=&quot;link-id0x5584570&quot;&gt;PNUTS&lt;/a&gt;, the Yahoo solution for managing massive user &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x3805628&quot;&gt;data&lt;/a&gt;, from front page preferences to mail to social networks.&lt;/p&gt; &lt;p&gt;Dynamic scale, wide area replication, and high availability are the issues. Transactions on multiple records, complex queries, and absolute consistency at all times are traded off. Also, the programming interfaces are lower level than with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x17bfc928&quot;&gt;SQL&lt;/a&gt;. Replication and consistency rules are choices for the application developer; the platform offers some basic alternatives. Implementation-wise, there is a &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x1862f7a8&quot;&gt;MySQL&lt;/a&gt; back-end and all the partitioning, query routing, replication, and balancing take place in a layer of front-ends.&lt;/p&gt; &lt;p&gt;Now what do we say to this?&lt;/p&gt; &lt;p&gt;In the Yahoo! case, even if complex queries were possible, which they are not, one would probably keep them off the online system since latency and availability are everything. A latency of some tens of milliseconds is however acceptable, which is not so terrible for single record operations: There is time for a couple of messages on the data center network and even maybe for a disk read.&lt;/p&gt; &lt;p&gt;PNUTS is probably the fastest way of getting to the desired beachhead of simple access to data at infinite scale in multiple geographies. In the identical situation, I might have done something similar.&lt;/p&gt; &lt;p&gt;But we are in a different situation, concerned with complex queries, a highly-normalized &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x25c942e8&quot;&gt;schema&lt;/a&gt;-last situation, i.e., index on everything, large objects normalized away, as is done in &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x4a3d080&quot;&gt;RDF&lt;/a&gt;. Then we are also in the relational situation. Infinite scale, fault tolerance, and wide-area replication do come up regularly in user needs. The applications for which people would like RDF are not only complex reasoning things but very big &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x19101128&quot;&gt;metadata&lt;/a&gt; stores for user generated content, social networks, and the like.&lt;/p&gt; &lt;p&gt;Which of the PNUTS principles could we apply?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Division in tablets:&lt;/b&gt; When a partition of the data grows too big, it should split.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Migration of partitions:&lt;/b&gt; as capacity/demand change, partitions should migrate so as to equalize load.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;High availability:&lt;/b&gt; This is divided in two — on one hand inside the data center; on the other between data centers. Inside the data center, storing partitions in duplicate and running them synchronously is possible. This is manifestly impossible in wide area settings, though. For this, we need a log-shipping style of asynchronous replication. But how does one deal with split networks and transfer of replication mastery?&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;PNUTS determines the master copy record by record. This makes sense when the record, for example, corresponds to a user. For RDF, doing this by the triple would be prohibitive. Doing this by the graph, or by the subject of a set of triples across all graphs, would be better. We would agree with PNUTS that transferring mastery by the storage chunk is not desired, as the chunk will contain arbitrary unrelated data.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;The eventual consistency mechanisms can be generalized to RDF readily enough. In a social RDF application, the graph is the most likely unit of data ownership and update authorization, so the graph would also be the unit of eventual consistency. Keeping a separate data structure listing recent inserts/deletes to a graph with timestamps would serve for establishing consistency. The size of this would be a small fraction of the size of the graph.&lt;/p&gt; &lt;p&gt;RDF cannot do anything without joining between partitions, whereas for PNUTS the join between partitions is an application matter. But then PNUTS does have an extra step of RPC between the PNUTS infrastructure and the back-end. Doing query routing in the back-end gets rid of this. RDF does remain more dependent on even performance and short interconnect latencies, though. It also likely takes more space. But the essential consistency and availability features can be generalized to it, providing the merge of semi-structured data at infinite scale and availability with complex query.&lt;/p&gt; &lt;p&gt;At any rate, repartitioning-on-demand and partition-migration remain the key agenda items for us, confirmed over and over at VLDB.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:55.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 Yahoo Keynote (4 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1577</atom:id>
  <atom:published>2009-09-01T16:04:36Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Raghu_Ramakrishnan&quot; id=&quot;link-id0x19076030&quot;&gt;Raghu Ramakrishnan&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id0x47142b8&quot;&gt;Yahoo&lt;/a&gt;! gave a keynote about &lt;a href=&quot;http://research.yahoo.com/node/2304&quot; id=&quot;link-id0x186c1288&quot;&gt;PNUTS&lt;/a&gt;, the Yahoo solution for managing massive user &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x4e966e0&quot;&gt;data&lt;/a&gt;, from front page preferences to mail to social networks.&lt;/p&gt; &lt;p&gt;Dynamic scale, wide area replication, and high availability are the issues. Transactions on multiple records, complex queries, and absolute consistency at all times are traded off. Also, the programming interfaces are lower level than with &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x23e68948&quot;&gt;SQL&lt;/a&gt;. Replication and consistency rules are choices for the application developer; the platform offers some basic alternatives. Implementation-wise, there is a &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x182cead8&quot;&gt;MySQL&lt;/a&gt; back-end and all the partitioning, query routing, replication, and balancing take place in a layer of front-ends.&lt;/p&gt; &lt;p&gt;Now what do we say to this?&lt;/p&gt; &lt;p&gt;In the Yahoo! case, even if complex queries were possible, which they are not, one would probably keep them off the online system since latency and availability are everything. A latency of some tens of milliseconds is however acceptable, which is not so terrible for single record operations: There is time for a couple of messages on the data center network and even maybe for a disk read.&lt;/p&gt; &lt;p&gt;PNUTS is probably the fastest way of getting to the desired beachhead of simple access to data at infinite scale in multiple geographies. In the identical situation, I might have done something similar.&lt;/p&gt; &lt;p&gt;But we are in a different situation, concerned with complex queries, a highly-normalized &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x197b7948&quot;&gt;schema&lt;/a&gt;-last situation, i.e., index on everything, large objects normalized away, as is done in &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x385a900&quot;&gt;RDF&lt;/a&gt;. Then we are also in the relational situation. Infinite scale, fault tolerance, and wide-area replication do come up regularly in user needs. The applications for which people would like RDF are not only complex reasoning things but very big &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x25a30d98&quot;&gt;metadata&lt;/a&gt; stores for user generated content, social networks, and the like.&lt;/p&gt; &lt;p&gt;Which of the PNUTS principles could we apply?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Division in tablets:&lt;/b&gt; When a partition of the data grows too big, it should split.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Migration of partitions:&lt;/b&gt; as capacity/demand change, partitions should migrate so as to equalize load.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;High availability:&lt;/b&gt; This is divided in two — on one hand inside the data center; on the other between data centers. Inside the data center, storing partitions in duplicate and running them synchronously is possible. This is manifestly impossible in wide area settings, though. For this, we need a log-shipping style of asynchronous replication. But how does one deal with split networks and transfer of replication mastery?&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;PNUTS determines the master copy record by record. This makes sense when the record, for example, corresponds to a user. For RDF, doing this by the triple would be prohibitive. Doing this by the graph, or by the subject of a set of triples across all graphs, would be better. We would agree with PNUTS that transferring mastery by the storage chunk is not desired, as the chunk will contain arbitrary unrelated data.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;The eventual consistency mechanisms can be generalized to RDF readily enough. In a social RDF application, the graph is the most likely unit of data ownership and update authorization, so the graph would also be the unit of eventual consistency. Keeping a separate data structure listing recent inserts/deletes to a graph with timestamps would serve for establishing consistency. The size of this would be a small fraction of the size of the graph.&lt;/p&gt; &lt;p&gt;RDF cannot do anything without joining between partitions, whereas for PNUTS the join between partitions is an application matter. But then PNUTS does have an extra step of RPC between the PNUTS infrastructure and the back-end. Doing query routing in the back-end gets rid of this. RDF does remain more dependent on even performance and short interconnect latencies, though. It also likely takes more space. But the essential consistency and availability features can be generalized to it, providing the merge of semi-structured data at infinite scale and availability with complex query.&lt;/p&gt; &lt;p&gt;At any rate, repartitioning-on-demand and partition-migration remain the key agenda items for us, confirmed over and over at VLDB.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:35.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 TPC Workshop (3 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1580</atom:id>
  <atom:published>2009-09-01T15:51:09Z</atom:published>
  <atom:content type="html">&lt;p&gt;Michael &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x1641ef70&quot;&gt;Stonebraker&lt;/a&gt; gave the keynote at the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x554d380&quot;&gt;TPC&lt;/a&gt; workshop. His message was that the TPC, at the venerable age of 21, was already a decade late in reinventing itself. From the height of relevance at the time of the debit/credit benchmark twenty years back, it was slipping into the sunset of irrelevance unless it paid attention.&lt;/p&gt; &lt;p&gt;Now we are great fans of the TPC and while we have not published results by the TPC book, we have extensively used TPC material for guiding &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x16475bd8&quot;&gt;optimization&lt;/a&gt;, as has pretty much everybody else.&lt;/p&gt; &lt;p&gt;It is true that the rules encourage unrealistic configurations. The emphasis on random access from disk that is built into the rules leads to disk configurations that are very improbable in practice, such as 1PB of disks for 3TB of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x18f0b720&quot;&gt;data&lt;/a&gt;, just so there are enough disk arms in parallel. Stonebraker also pointed out that replication and failover were ubiquitous in real life and that roll forward from logs was unrealistic as a recovery model since it took so long. Benchmarks should therefore include replication.&lt;/p&gt; &lt;p&gt;Further, Stonebraker challenged the TPC to go for the new frontier, which he described as the huge data sets in science and on big web sites. Scientists, the ones who would save our planet from the diverse ills confronting it, do not like relational databases. They avoid them when can. They want arrays for physics, and graphs for biology and chemistry. &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x150376a8&quot;&gt;MapReduce&lt;/a&gt; is eating database&amp;#39;s lunch; what will you do about this?&lt;/p&gt; &lt;p&gt;I later suggested incorporating an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x41cd4c0&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x15904698&quot;&gt;metadata&lt;/a&gt; benchmark into the TPC suite. We&amp;#39;ll see about this; we&amp;#39;ll first have to come up with a suitable one. There is a great deal of pressure for making good RDF benchmarks but this is not yet in the center of the mainstream that TPC tends to cover.&lt;/p&gt; &lt;p&gt;TPC&amp;#39;s own talk was about the life cycle of benchmarks. A benchmark begins a bit ahead of the mainstream, with a problem that is difficult but not so difficult as to be uncommon. When the solution to this problem becomes commonplace, the benchmark&amp;#39;s relevance gradually drops.&lt;/p&gt; &lt;p&gt;There was a talk on robustness of query plans which was well to the point. Indeed, there are performance cliffs at certain points; for example, when passing from memory-only to disk-pageable data structures, or when switching from indexed access to table scans, or from loop to hash joins. Quite so. The analysis I really would have liked to see would have been one of what happens when passing from single server to a cluster, and from local joins to cross-partition ones. Also contrasting of &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x16dd6710&quot;&gt;cache&lt;/a&gt; fusion and partitioning. We have our own data and experience but we find we don&amp;#39;t have time to measure all the other systems.&lt;/p&gt; &lt;p&gt;Anyway it is good to raise the question of smooth and predictable performance.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:50.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 TPC Workshop (3 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1576</atom:id>
  <atom:published>2009-09-01T15:51:09Z</atom:published>
  <atom:content type="html">&lt;p&gt;Michael &lt;a href=&quot;http://dbpedia.org/resource/Michael_Stonebraker&quot; id=&quot;link-id0x15e5efe0&quot;&gt;Stonebraker&lt;/a&gt; gave the keynote at the &lt;a href=&quot;http://www.tpc.org/&quot; id=&quot;link-id0x18cee5f0&quot;&gt;TPC&lt;/a&gt; workshop. His message was that the TPC, at the venerable age of 21, was already a decade late in reinventing itself. From the height of relevance at the time of the debit/credit benchmark twenty years back, it was slipping into the sunset of irrelevance unless it paid attention.&lt;/p&gt; &lt;p&gt;Now we are great fans of the TPC and while we have not published results by the TPC book, we have extensively used TPC material for guiding &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x4e55368&quot;&gt;optimization&lt;/a&gt;, as has pretty much everybody else.&lt;/p&gt; &lt;p&gt;It is true that the rules encourage unrealistic configurations. The emphasis on random access from disk that is built into the rules leads to disk configurations that are very improbable in practice, such as 1PB of disks for 3TB of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x191cd880&quot;&gt;data&lt;/a&gt;, just so there are enough disk arms in parallel. Stonebraker also pointed out that replication and failover were ubiquitous in real life and that roll forward from logs was unrealistic as a recovery model since it took so long. Benchmarks should therefore include replication.&lt;/p&gt; &lt;p&gt;Further, Stonebraker challenged the TPC to go for the new frontier, which he described as the huge data sets in science and on big web sites. Scientists, the ones who would save our planet from the diverse ills confronting it, do not like relational databases. They avoid them when can. They want arrays for physics, and graphs for biology and chemistry. &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x53f6040&quot;&gt;MapReduce&lt;/a&gt; is eating database&amp;#39;s lunch; what will you do about this?&lt;/p&gt; &lt;p&gt;I later suggested incorporating an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x18902070&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Metadata&quot; id=&quot;link-id0x3990af8&quot;&gt;metadata&lt;/a&gt; benchmark into the TPC suite. We&amp;#39;ll see about this; we&amp;#39;ll first have to come up with a suitable one. There is a great deal of pressure for making good RDF benchmarks but this is not yet in the center of the mainstream that TPC tends to cover.&lt;/p&gt; &lt;p&gt;TPC&amp;#39;s own talk was about the life cycle of benchmarks. A benchmark begins a bit ahead of the mainstream, with a problem that is difficult but not so difficult as to be uncommon. When the solution to this problem becomes commonplace, the benchmark&amp;#39;s relevance gradually drops.&lt;/p&gt; &lt;p&gt;There was a talk on robustness of query plans which was well to the point. Indeed, there are performance cliffs at certain points; for example, when passing from memory-only to disk-pageable data structures, or when switching from indexed access to table scans, or from loop to hash joins. Quite so. The analysis I really would have liked to see would have been one of what happens when passing from single server to a cluster, and from local joins to cross-partition ones. Also contrasting of &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1942aca8&quot;&gt;cache&lt;/a&gt; fusion and partitioning. We have our own data and experience but we find we don&amp;#39;t have time to measure all the other systems.&lt;/p&gt; &lt;p&gt;Anyway it is good to raise the question of smooth and predictable performance.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:30-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Some Interesting VLDB 2009 Papers (2 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1579</atom:id>
  <atom:published>2009-09-01T15:46:14Z</atom:published>
  <atom:content type="html">&lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x449c5e0&quot;&gt;Intel&lt;/a&gt; on &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x4e82430&quot;&gt;Hash Join&lt;/a&gt; &lt;/h3&gt; &lt;p&gt;Intel and &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x10bae5e8&quot;&gt;Oracle&lt;/a&gt; had measured hash and sort merge joins on Intel Core i7. The result was that hash join with both tables partitioned to match &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x3827798&quot;&gt;CPU&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x2545b978&quot;&gt;cache&lt;/a&gt; was still the best but that sort/merge would catch up with more &lt;a href=&quot;http://dbpedia.org/resource/SIMD&quot; id=&quot;link-id0x32f4e40&quot;&gt;SIMD&lt;/a&gt; instructions in the future.&lt;/p&gt; &lt;p&gt;We should probably experiment with this but the most important partitioning of hash joins is still between cluster nodes. Within the process, we will see. The tradeoff of doing all in cache-sized partitions is larger intermediate results which in turn will impact the working set of disk pages in RAM. For one-off queries this is OK; for online use this has an effect.&lt;/p&gt; &lt;h3&gt;1000 TABLE Queries&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/SAP_AG&quot; id=&quot;link-id0x4ed7710&quot;&gt;SAP&lt;/a&gt; presented a paper about &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x26827fd8&quot;&gt;federating relational databases&lt;/a&gt;. Queries would be expressed against VIEWs defined over remote TABLEs, UNIONed together and so forth. Traditional methods of &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x3838888&quot;&gt;optimization&lt;/a&gt; would run out of memory; a single 1000 TABLE plan is already a big thing. Enumerating multiple variations of such is not possible in practice. So the solution was to plan in two stages — first arrange the subqueries and derived TABLEs, and then do the JOIN orders locally. Further, local JOIN orders could even be adjusted at run time based on the actual &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x26033030&quot;&gt;data&lt;/a&gt;. Nice.&lt;/p&gt; &lt;h3&gt;Oracle Subqueries and New Implementation of LOBs&lt;/h3&gt; &lt;p&gt;Oracle presented some new &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x23a0eb48&quot;&gt;SQL&lt;/a&gt; optimizations, combining and inlining subqueries and derived TABLEs. We do fairly similar things and might extend the repertoire of tricks in the direction outlined by Oracle as and when the need presents itself. This further confirms that SQL and other query optimization is really an incremental collection of specially recognized patterns. We still have not found any other way of doing it.&lt;/p&gt; &lt;p&gt;Another interesting piece by Oracle was about their re-implementation of large object support, where they compared LOB loading to file system and raw device speeds.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Amadeus_CRS&quot; id=&quot;link-id0x1566d470&quot;&gt;Amadeus CRS&lt;/a&gt; booking system, steady query time for arbitrary single table queries&lt;/h3&gt; &lt;p&gt;There was a paper about a memory-resident database that could give steady time for any kind of single-table scan query. The innovation was to not use indices, but to have one partition of the table per processor core, all in memory. Then each core would have exactly two cursors — one reading, the other writing. The write cursor should keep ahead of the read cursor. Like this, there would be no read/write contention on pages, no locking, no multiple threads splitting a tree at different points, none of the complexity of a multithreaded database engine. Then, when the cursor would hit a row, it would look at the set of queries or updates and add the result to the output if there was a result. The data indexes the queries, not the other way around. We have done something similar for detecting changes in a full text corpus but never thought of doing queries this way.&lt;/p&gt; &lt;p&gt;Well, we are all about JOINs so this is not for us, but it deserves a mention for being original and clever. And indeed, anything one can ask about a table will likely be served with great predictability.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x196b0538&quot;&gt;Greenplum&lt;/a&gt; &lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x108f8878&quot;&gt;Google&lt;/a&gt;&amp;#39;s chief economist said that the winning career choice would be to pick a scarce skill that made value from something that was plentiful. For the 2010s this career is that of the statistician/data analyst. We&amp;#39;ve said it before — the next web is analytics for all. The Greenplum talk was divided between the Fox use case, with 200TB of data about ads, web site traffic, and other things, growing 5TB a day. The message was that cubes and drill down are passé, that it is about complex statistical methods that have to run in the database, that the new kind of geek is the data geek, whose vocation it is to consume and spit out data, discover things in it, and so forth.&lt;/p&gt; &lt;p&gt;The technical part was about Greenplum, a SQL database running on a cluster with a &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x3106d00&quot;&gt;PostgreSQL&lt;/a&gt; back-end. The interesting points were embedding &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x17968370&quot;&gt;MapReduce&lt;/a&gt; into SQL, and using relational tables for arrays and complex data types — pretty much what we also do. Greenplum emphasized scale-out and found column orientation more like a nice-to-have.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x119f7948&quot;&gt;MonetDB&lt;/a&gt;, optimizing database for CPU cache&lt;/h3&gt; &lt;p&gt;The MonetDB people from &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x3617658&quot;&gt;CWI&lt;/a&gt; in Amsterdam gave a 10 year best paper award talk about optimizing database for CPU cache. The key point was that if data is stored as columns, it ought also to be transferred as columns inside the execution engine. Materialize big chunks of state to cut down on interpretation overhead and use cache to best effect. They vector for CPU cache; we vector for scale-out, since the only way to ship operations is to ship many at a time. So we might as well vector also in single servers. This could be worth an experiment. Also we regularly visit the topic of &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x38d43d8&quot;&gt;column storage&lt;/a&gt;. But we are not yet convinced that it would be better than row-style covering indices for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x17e25760&quot;&gt;RDF&lt;/a&gt; quads. But something could certainly be tried, given time.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:45.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Some Interesting VLDB 2009 Papers (2 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1575</atom:id>
  <atom:published>2009-09-01T15:46:14Z</atom:published>
  <atom:content type="html">&lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Intel_Corporation&quot; id=&quot;link-id0x3588e30&quot;&gt;Intel&lt;/a&gt; on &lt;a href=&quot;http://dbpedia.org/resource/Hash_join&quot; id=&quot;link-id0x1bc77c90&quot;&gt;Hash Join&lt;/a&gt; &lt;/h3&gt; &lt;p&gt;Intel and &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x2f1d4d8&quot;&gt;Oracle&lt;/a&gt; had measured hash and sort merge joins on Intel Core i7. The result was that hash join with both tables partitioned to match &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x55b2b70&quot;&gt;CPU&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x2a4fef8&quot;&gt;cache&lt;/a&gt; was still the best but that sort/merge would catch up with more &lt;a href=&quot;http://dbpedia.org/resource/SIMD&quot; id=&quot;link-id0x4fe8670&quot;&gt;SIMD&lt;/a&gt; instructions in the future.&lt;/p&gt; &lt;p&gt;We should probably experiment with this but the most important partitioning of hash joins is still between cluster nodes. Within the process, we will see. The tradeoff of doing all in cache-sized partitions is larger intermediate results which in turn will impact the working set of disk pages in RAM. For one-off queries this is OK; for online use this has an effect.&lt;/p&gt; &lt;h3&gt;1000 TABLE Queries&lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/SAP_AG&quot; id=&quot;link-id0x55a1018&quot;&gt;SAP&lt;/a&gt; presented a paper about &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id0x5500758&quot;&gt;federating relational databases&lt;/a&gt;. Queries would be expressed against VIEWs defined over remote TABLEs, UNIONed together and so forth. Traditional methods of &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x4f038f0&quot;&gt;optimization&lt;/a&gt; would run out of memory; a single 1000 TABLE plan is already a big thing. Enumerating multiple variations of such is not possible in practice. So the solution was to plan in two stages — first arrange the subqueries and derived TABLEs, and then do the JOIN orders locally. Further, local JOIN orders could even be adjusted at run time based on the actual &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x41d3560&quot;&gt;data&lt;/a&gt;. Nice.&lt;/p&gt; &lt;h3&gt;Oracle Subqueries and New Implementation of LOBs&lt;/h3&gt; &lt;p&gt;Oracle presented some new &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x39ad838&quot;&gt;SQL&lt;/a&gt; optimizations, combining and inlining subqueries and derived TABLEs. We do fairly similar things and might extend the repertoire of tricks in the direction outlined by Oracle as and when the need presents itself. This further confirms that SQL and other query optimization is really an incremental collection of specially recognized patterns. We still have not found any other way of doing it.&lt;/p&gt; &lt;p&gt;Another interesting piece by Oracle was about their re-implementation of large object support, where they compared LOB loading to file system and raw device speeds.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Amadeus_CRS&quot; id=&quot;link-id0x3aa1378&quot;&gt;Amadeus CRS&lt;/a&gt; booking system, steady query time for arbitrary single table queries&lt;/h3&gt; &lt;p&gt;There was a paper about a memory-resident database that could give steady time for any kind of single-table scan query. The innovation was to not use indices, but to have one partition of the table per processor core, all in memory. Then each core would have exactly two cursors — one reading, the other writing. The write cursor should keep ahead of the read cursor. Like this, there would be no read/write contention on pages, no locking, no multiple threads splitting a tree at different points, none of the complexity of a multithreaded database engine. Then, when the cursor would hit a row, it would look at the set of queries or updates and add the result to the output if there was a result. The data indexes the queries, not the other way around. We have done something similar for detecting changes in a full text corpus but never thought of doing queries this way.&lt;/p&gt; &lt;p&gt;Well, we are all about JOINs so this is not for us, but it deserves a mention for being original and clever. And indeed, anything one can ask about a table will likely be served with great predictability.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x3670360&quot;&gt;Greenplum&lt;/a&gt; &lt;/h3&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x2c5dfb8&quot;&gt;Google&lt;/a&gt;&amp;#39;s chief economist said that the winning career choice would be to pick a scarce skill that made value from something that was plentiful. For the 2010s this career is that of the statistician/data analyst. We&amp;#39;ve said it before — the next web is analytics for all. The Greenplum talk was divided between the Fox use case, with 200TB of data about ads, web site traffic, and other things, growing 5TB a day. The message was that cubes and drill down are passé, that it is about complex statistical methods that have to run in the database, that the new kind of geek is the data geek, whose vocation it is to consume and spit out data, discover things in it, and so forth.&lt;/p&gt; &lt;p&gt;The technical part was about Greenplum, a SQL database running on a cluster with a &lt;a href=&quot;http://dbpedia.org/resource/PostgreSQL&quot; id=&quot;link-id0x4e15798&quot;&gt;PostgreSQL&lt;/a&gt; back-end. The interesting points were embedding &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x4fd3e00&quot;&gt;MapReduce&lt;/a&gt; into SQL, and using relational tables for arrays and complex data types — pretty much what we also do. Greenplum emphasized scale-out and found column orientation more like a nice-to-have.&lt;/p&gt; &lt;h3&gt; &lt;a href=&quot;http://dbpedia.org/resource/MonetDB&quot; id=&quot;link-id0x416d288&quot;&gt;MonetDB&lt;/a&gt;, optimizing database for CPU cache&lt;/h3&gt; &lt;p&gt;The MonetDB people from &lt;a href=&quot;http://dbpedia.org/resource/National_Research_Institute_for_Mathematics_and_Computer_Science&quot; id=&quot;link-id0x4ebedb0&quot;&gt;CWI&lt;/a&gt; in Amsterdam gave a 10 year best paper award talk about optimizing database for CPU cache. The key point was that if data is stored as columns, it ought also to be transferred as columns inside the execution engine. Materialize big chunks of state to cut down on interpretation overhead and use cache to best effect. They vector for CPU cache; we vector for scale-out, since the only way to ship operations is to ship many at a time. So we might as well vector also in single servers. This could be worth an experiment. Also we regularly visit the topic of &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x4d34cb0&quot;&gt;column storage&lt;/a&gt;. But we are not yet convinced that it would be better than row-style covering indices for &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x4d55d78&quot;&gt;RDF&lt;/a&gt; quads. But something could certainly be tried, given time.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T17:32:24.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 (1 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1578</atom:id>
  <atom:published>2009-09-01T15:30:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was at the &lt;a href=&quot;http://vldb2009.org/&quot; id=&quot;link-id0x77dd108&quot;&gt;VLDB 2009&lt;/a&gt; conference in Lyon, France. I will in the next few posts discuss some of the prominent themes and how they relate to our products or to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1a765238&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x6966070&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Firstly, RDF was as good as absent from the presentations and discussions we saw. There were a few mentions in the panel on structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x3a536e8&quot;&gt;data&lt;/a&gt; on the web, however RDF was not in any way seen to be essential for this. There were also a couple of RDF mentions in questions at other sessions, but that was about it.&lt;/p&gt; &lt;p&gt;It is a common perception that RDF and database people do not talk with each other. Evidence seems to bear this out.&lt;/p&gt; &lt;p&gt;As a database developer I did get a lot of readily applicable ideas from the VLDB talks. These run across the whole range of DBMS topics, from &lt;a href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x6302f60&quot;&gt;key compression&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x69163c0&quot;&gt;SQL&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x63a5cf0&quot;&gt;optimization&lt;/a&gt;, to &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x1b56daf8&quot;&gt;column storage&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x57c6168&quot;&gt;CPU&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x1c504710&quot;&gt;cache&lt;/a&gt; optimization, and the like. In this sense, VLDB is directly relevant to all we do. In a conversation, someone was mildly confused that I should on one hand mention I was doing RDF, and on the other hand also be concerned about database performance. These things are not seen to belong together, even though making RDF do something useful certainly depends on a great deal of database optimization.&lt;/p&gt; &lt;p&gt;The question of all questions — that of infinite scale-out with complex queries, resilience, replication, and full database semantics — was strongly in the air.&lt;/p&gt; &lt;p&gt;But it was in the air more as a question than as an answer. Not very much at all was said about the performance of distributed query plans, of &lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x637c6b0&quot;&gt;2pc&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x69386a8&quot;&gt;two-phase commit&lt;/a&gt;), of the impact of interconnect latency, and such things. On the other hand, people were talking quite liberally about optimizing CPU cache and local multi-core execution, not to mention SQL plans and rewrites. Also, almost nothing was said about transactions.&lt;/p&gt; &lt;p&gt;Still, there is bound to be a great deal of work in scale-out of complex workloads by any number of players. Either these things are all figured out and considered self-evidently trivial, or they are so hot that people will go there only by way of allusion and vague reference. I think it is the latter.&lt;/p&gt; &lt;p&gt;By and large, we were confirmed in our understanding that infinite scale-out on the go, with redundancy, is the ticket, especially if one can offer complex queries and transactional semantics coupled with instant data loading and &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x7f90a20&quot;&gt;schema&lt;/a&gt;-last.&lt;/p&gt; &lt;p&gt;Column storage and cache optimizations seem to come right after these.&lt;/p&gt; &lt;p&gt;Certainly the database space is diversifying.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x485bd40&quot;&gt;MapReduce&lt;/a&gt; was discussed quite a bit, as an intruder into what would be the database turf. We have no great problem with MapReduce; we do that in SQL procedures if one likes to program in this way. &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x7cc58c8&quot;&gt;Greenplum&lt;/a&gt; also seems to have come by the same idea.&lt;/p&gt; &lt;p&gt;As said before, RDF and RDF reasoning were ignored. Do these actually offer something to the database side? Certainly for search, discovery, integration, and resource discovery, linked data has evident advantages.&lt;/p&gt; &lt;p&gt;Two points of the design space — the warehouse, and the web-scale key-value store — got a lot of attention. Would I do either in RDF? RDF is a slightly different design space point, like key-value with complex queries — on the surface, a fusion of the two. As opposed to RDF, the relational warehouse gains from fixed data-types and task-specific layout, whether row or column. The key-value store gains from having a concept of a semi-structured record, a bit like the RDF subject of a triple, but now with ad-hoc (if any) secondary indices, and inline blobs. The latter is much simpler and more compact than the generic RDF subject with graphs and all, and can be easily treated as a unit of version control and replication mastering. RDF, being more generic and more normalized, is representationally neither as ad-hoc nor as compact.&lt;/p&gt; &lt;p&gt;But RDF will be the natural choice when complex queries and ad-hoc schema meet, for example in web-wide integrations of application data.&lt;/p&gt; &lt;p&gt;There seems to be a huge divide in understanding between database-developing people and those who would be using databases. On one side, this has led to a back-to-basics movement with no SQL, no &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x6390650&quot;&gt;ACID&lt;/a&gt;, key-value pairs instead of schema, MapReduce instead of fancy but hard-to-follow parallel execution plans. On the other side, the database space specializes more and more; it is no longer simply transactions vs. analytics, but many more points of specialization.&lt;/p&gt; &lt;p&gt;Some frustration can be sensed in the ivory towers of science when it is seen that the ones most in need of database understanding in fact have the least. &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x1af4e7e0&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id0x75145d8&quot;&gt;Yahoo&lt;/a&gt;!, and &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x17bd7d90&quot;&gt;Microsoft&lt;/a&gt; know what they are doing, with or without SQL, but the medium-size or fast-growing web sites seem to be in confusion when &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-id0x1bf238e0&quot;&gt;LAMP&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Ruby_programming_language&quot; id=&quot;link-id0x6ca3848&quot;&gt;Ruby&lt;/a&gt; or the scripting-du-jour can no longer cut it.&lt;/p&gt; &lt;p&gt;Can somebody using a database be expected to understand how it works? I would say no, not in general. Can a database be expected to unerringly self-configure based on workload? Sure, a database can suggest layouts, but it ought not restructure itself on the spur of the moment under full load.&lt;/p&gt; &lt;p&gt;It is safe to say that the community at large no longer believes in &amp;quot;one size fits all&amp;quot;. Since there is no general solution, there is a fragmented space of specific solutions. We will be looking at some of these issues in the following posts.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T16:53:25-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>VLDB 2009 (1 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1574</atom:id>
  <atom:published>2009-09-01T15:30:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was at the &lt;a href=&quot;http://vldb2009.org/&quot; id=&quot;link-id0x6700588&quot;&gt;VLDB 2009&lt;/a&gt; conference in Lyon, France. I will in the next few posts discuss some of the prominent themes and how they relate to our products or to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x69386a8&quot;&gt;RDF&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x7537ce0&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Firstly, RDF was as good as absent from the presentations and discussions we saw. There were a few mentions in the panel on structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c201ed0&quot;&gt;data&lt;/a&gt; on the web, however RDF was not in any way seen to be essential for this. There were also a couple of RDF mentions in questions at other sessions, but that was about it.&lt;/p&gt; &lt;p&gt;It is a common perception that RDF and database people do not talk with each other. Evidence seems to bear this out.&lt;/p&gt; &lt;p&gt;As a database developer I did get a lot of readily applicable ideas from the VLDB talks. These run across the whole range of DBMS topics, from &lt;a href=&quot;http://dbpedia.org/resource/Data_compression&quot; id=&quot;link-id0x1b802010&quot;&gt;key compression&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x48bc820&quot;&gt;SQL&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Program_optimization&quot; id=&quot;link-id0x218bd558&quot;&gt;optimization&lt;/a&gt;, to &lt;a href=&quot;http://dbpedia.org/resource/Column-oriented_DBMS&quot; id=&quot;link-id0x238a39c8&quot;&gt;column storage&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Central_processing_unit&quot; id=&quot;link-id0x6694538&quot;&gt;CPU&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Cache&quot; id=&quot;link-id0x4895568&quot;&gt;cache&lt;/a&gt; optimization, and the like. In this sense, VLDB is directly relevant to all we do. In a conversation, someone was mildly confused that I should on one hand mention I was doing RDF, and on the other hand also be concerned about database performance. These things are not seen to belong together, even though making RDF do something useful certainly depends on a great deal of database optimization.&lt;/p&gt; &lt;p&gt;The question of all questions — that of infinite scale-out with complex queries, resilience, replication, and full database semantics — was strongly in the air.&lt;/p&gt; &lt;p&gt;But it was in the air more as a question than as an answer. Not very much at all was said about the performance of distributed query plans, of &lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x7a4b208&quot;&gt;2pc&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Two-phase_commit_protocol&quot; id=&quot;link-id0x1a0e8ac8&quot;&gt;two-phase commit&lt;/a&gt;), of the impact of interconnect latency, and such things. On the other hand, people were talking quite liberally about optimizing CPU cache and local multi-core execution, not to mention SQL plans and rewrites. Also, almost nothing was said about transactions.&lt;/p&gt; &lt;p&gt;Still, there is bound to be a great deal of work in scale-out of complex workloads by any number of players. Either these things are all figured out and considered self-evidently trivial, or they are so hot that people will go there only by way of allusion and vague reference. I think it is the latter.&lt;/p&gt; &lt;p&gt;By and large, we were confirmed in our understanding that infinite scale-out on the go, with redundancy, is the ticket, especially if one can offer complex queries and transactional semantics coupled with instant data loading and &lt;a href=&quot;http://dbpedia.org/resource/Database_schema&quot; id=&quot;link-id0x23a0c590&quot;&gt;schema&lt;/a&gt;-last.&lt;/p&gt; &lt;p&gt;Column storage and cache optimizations seem to come right after these.&lt;/p&gt; &lt;p&gt;Certainly the database space is diversifying.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/MapReduce&quot; id=&quot;link-id0x185e6370&quot;&gt;MapReduce&lt;/a&gt; was discussed quite a bit, as an intruder into what would be the database turf. We have no great problem with MapReduce; we do that in SQL procedures if one likes to program in this way. &lt;a href=&quot;http://dbpedia.org/resource/Greenplum&quot; id=&quot;link-id0x1ad96d68&quot;&gt;Greenplum&lt;/a&gt; also seems to have come by the same idea.&lt;/p&gt; &lt;p&gt;As said before, RDF and RDF reasoning were ignored. Do these actually offer something to the database side? Certainly for search, discovery, integration, and resource discovery, linked data has evident advantages.&lt;/p&gt; &lt;p&gt;Two points of the design space — the warehouse, and the web-scale key-value store — got a lot of attention. Would I do either in RDF? RDF is a slightly different design space point, like key-value with complex queries — on the surface, a fusion of the two. As opposed to RDF, the relational warehouse gains from fixed data-types and task-specific layout, whether row or column. The key-value store gains from having a concept of a semi-structured record, a bit like the RDF subject of a triple, but now with ad-hoc (if any) secondary indices, and inline blobs. The latter is much simpler and more compact than the generic RDF subject with graphs and all, and can be easily treated as a unit of version control and replication mastering. RDF, being more generic and more normalized, is representationally neither as ad-hoc nor as compact.&lt;/p&gt; &lt;p&gt;But RDF will be the natural choice when complex queries and ad-hoc schema meet, for example in web-wide integrations of application data.&lt;/p&gt; &lt;p&gt;There seems to be a huge divide in understanding between database-developing people and those who would be using databases. On one side, this has led to a back-to-basics movement with no SQL, no &lt;a href=&quot;http://dbpedia.org/resource/ACID&quot; id=&quot;link-id0x2ec4088&quot;&gt;ACID&lt;/a&gt;, key-value pairs instead of schema, MapReduce instead of fancy but hard-to-follow parallel execution plans. On the other side, the database space specializes more and more; it is no longer simply transactions vs. analytics, but many more points of specialization.&lt;/p&gt; &lt;p&gt;Some frustration can be sensed in the ivory towers of science when it is seen that the ones most in need of database understanding in fact have the least. &lt;a href=&quot;http://dbpedia.org/resource/Google&quot; id=&quot;link-id0x7748540&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Yahoo%21&quot; id=&quot;link-id0x1ba44020&quot;&gt;Yahoo&lt;/a&gt;!, and &lt;a href=&quot;http://dbpedia.org/resource/Microsoft&quot; id=&quot;link-id0x5788710&quot;&gt;Microsoft&lt;/a&gt; know what they are doing, with or without SQL, but the medium-size or fast-growing web sites seem to be in confusion when &lt;a href=&quot;http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29&quot; id=&quot;link-id0x18098f18&quot;&gt;LAMP&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Ruby_programming_language&quot; id=&quot;link-id0x4844138&quot;&gt;Ruby&lt;/a&gt; or the scripting-du-jour can no longer cut it.&lt;/p&gt; &lt;p&gt;Can somebody using a database be expected to understand how it works? I would say no, not in general. Can a database be expected to unerringly self-configure based on workload? Sure, a database can suggest layouts, but it ought not restructure itself on the spur of the moment under full load.&lt;/p&gt; &lt;p&gt;It is safe to say that the community at large no longer believes in &amp;quot;one size fits all&amp;quot;. Since there is no general solution, there is a fragmented space of specific solutions. We will be looking at some of these issues in the following posts.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T16:53:20-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Provenance and Reification in Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-09-01#1573</atom:id>
  <atom:published>2009-09-01T14:44:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;These days, &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x37019c8&quot;&gt;data&lt;/a&gt; provenance is a big topic across the board, ranging from the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x53c3620&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x4aa3848&quot;&gt;web&lt;/a&gt;, to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x385aff0&quot;&gt;RDF&lt;/a&gt; in general, to any kind of data integration, with or without RDF. Especially with scientific data we encounter the need for metadata and provenance, repeatability of experiments, etc. Data without context is worthless, yet the producers of said data do not always have a model or budget for metadata. And if they do, the approach is often a proprietary relational schema with web services in front.&lt;/p&gt; &lt;p&gt;RDF and linked data principles could evidently be a great help. This is a large topic that goes into the culture of doing science and will deserve a more extensive treatment down the road.&lt;/p&gt; &lt;p&gt;For now, I will talk about possible ways of dealing with provenance annotations in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x51c4da0&quot;&gt;Virtuoso&lt;/a&gt; at a fairly technical level.&lt;/p&gt; &lt;p&gt;If data comes many-triples-at-a-time from some source (e.g., library catalogue, user of a social network), then it is often easiest to put the data from each source/user into its own graph. Annotations can then be made on the graph. The graph IRI will simply occur as the subject of a triple in the same or some other graph. For example, all such annotations could go into a special annotations graph.&lt;/p&gt; &lt;p&gt;On the query side, having lots of distinct graphs does not have to be a problem if the index scheme is the right one, i.e., the 4 index scheme &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfperformancetuning.html#rdfperfindexes&quot; id=&quot;link-id142a0798&quot;&gt;discussed in the Virtuoso documentation&lt;/a&gt;. If the query does not specify a graph, then triples in any graph will be considered when evaluating the query.&lt;/p&gt; &lt;p&gt;One could write queries like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT ?pub WHERE { GRAPH ?g { ?person foaf:knows ?contact } ?contact foaf:name &amp;quot;Alice&amp;quot; . ?g xx:has_publisher ?pub }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return the publishers of graphs that assert that somebody knows Alice.&lt;/p&gt; &lt;p&gt;Of course, the &lt;a href=&quot;http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#reification&quot; id=&quot;link-id14fa9488&quot;&gt;RDF reification vocabulary&lt;/a&gt; can be used as-is to say things about single triples. It is however very inefficient and is not supported by any specific optimization. Further, reification does not seem to get used very much; thus there is no great pressure to specially optimize it.&lt;/p&gt; &lt;p&gt;If we have to say things about specific triples and this occurs frequently (i.e., for more than 10% or so of the triples), then modifying the quad table becomes an option. For all its inefficiency, the RDF reification vocabulary is applicable if reification is a rarity.&lt;/p&gt; &lt;p&gt;Virtuoso&amp;#39;s &lt;code&gt;RDF_QUAD&lt;/code&gt; table can be altered to have more columns. The problem with this is that space usage is increased and the RDF loading and query functions will not know about the columns. A &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x4784bf0&quot;&gt;SQL&lt;/a&gt; update statement can be used to set values for these additional columns if one knows the &lt;code&gt;G,S,P,O&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;Suppose we annotated each quad with the user who inserted it and a timestamp. These would be columns in the &lt;code&gt;RDF_QUAD&lt;/code&gt; table. The next choice would be whether these were primary key parts or dependent parts. If primary key parts, these would be non-&lt;code&gt;NULL&lt;/code&gt; and would occur on every index. The same quad would exist for each distinct user and time this quad had been inserted. For loading functions to work, these columns would need a default. In practice, we think that having such metadata as a dependent part is more likely, so that &lt;code&gt;G,S,P,O&lt;/code&gt; are the unique identifier of the quad. Whether one would then include these columns on indices other than the primary key would depend on how frequently they were accessed.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x4a8a7c0&quot;&gt;SPARQL&lt;/a&gt;, one could use an extension syntax like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { ?person foaf:knows ?connection OPTION ( time ?ts ) . ?connection foaf:name &amp;quot;Alice&amp;quot; . FILTER ( ?ts &amp;gt; &amp;quot;2009-08-08&amp;quot;^^xsd:datetime ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return everybody who knows Alice since a date more recent than 2009-08-08. This presupposes that the quad table has been extended with a datetime column.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;OPTION (time ?ts)&lt;/code&gt; syntax is not presently supported but we can easily add something of the sort if there is user demand for it. In practice, this would be an extension mechanism enabling one to access extension columns of &lt;code&gt;RDF_QUAD&lt;/code&gt; via a column &lt;code&gt;?variable&lt;/code&gt; syntax in the &lt;code&gt;OPTION&lt;/code&gt; clause.&lt;/p&gt; &lt;p&gt;If quad metadata were not for every quad but still relatively frequent, another possibility would be making a separate table with a key of &lt;code&gt;GSPO&lt;/code&gt; and a dependent part of &lt;code&gt;R&lt;/code&gt;, where &lt;code&gt;R&lt;/code&gt; would be the reification &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x49e6108&quot;&gt;URI&lt;/a&gt; of the quad. Reification statements would then be made with &lt;code&gt;R&lt;/code&gt; as a subject. This would be more compact than the reification vocabulary and would not modify the &lt;code&gt;RDF_QUAD&lt;/code&gt; table. The syntax for referring to this could be something like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { ?person foaf:knows ?contact OPTION ( reify ?r ) . ?r xx:assertion_time ?ts . ?contact foaf:name &amp;quot;Alice&amp;quot; . FILTER ( ?ts &amp;gt; &amp;quot;2008-8-8&amp;quot;^^xsd:datetime ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We could even recognize the reification vocabulary and convert it into the reify option if this were really necessary. But since it is so unwieldy I don&amp;#39;t think there would be huge demand. Who knows? You tell us.&lt;/p&gt;</atom:content>
  <atom:updated>2009-09-01T11:20:46.000006-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Provenance and Reification in Virtuoso</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-09-01#1572</atom:id>
  <atom:published>2009-09-01T14:44:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;These days, &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x4a44870&quot;&gt;data&lt;/a&gt; provenance is a big topic across the board, ranging from the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x4e10e60&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x4738350&quot;&gt;web&lt;/a&gt;, to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1fe33310&quot;&gt;RDF&lt;/a&gt; in general, to any kind of data integration, with or without RDF. Especially with scientific data we encounter the need for metadata and provenance, repeatability of experiments, etc. Data without context is worthless, yet the producers of said data do not always have a model or budget for metadata. And if they do, the approach is often a proprietary relational schema with web services in front.&lt;/p&gt; &lt;p&gt;RDF and linked data principles could evidently be a great help. This is a large topic that goes into the culture of doing science and will deserve a more extensive treatment down the road.&lt;/p&gt; &lt;p&gt;For now, I will talk about possible ways of dealing with provenance annotations in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x36581e8&quot;&gt;Virtuoso&lt;/a&gt; at a fairly technical level.&lt;/p&gt; &lt;p&gt;If data comes many-triples-at-a-time from some source (e.g., library catalogue, user of a social network), then it is often easiest to put the data from each source/user into its own graph. Annotations can then be made on the graph. The graph IRI will simply occur as the subject of a triple in the same or some other graph. For example, all such annotations could go into a special annotations graph.&lt;/p&gt; &lt;p&gt;On the query side, having lots of distinct graphs does not have to be a problem if the index scheme is the right one, i.e., the 4 index scheme &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfperformancetuning.html#rdfperfindexes&quot; id=&quot;link-id142a0798&quot;&gt;discussed in the Virtuoso documentation&lt;/a&gt;. If the query does not specify a graph, then triples in any graph will be considered when evaluating the query.&lt;/p&gt; &lt;p&gt;One could write queries like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT ?pub WHERE { GRAPH ?g { ?person foaf:knows ?contact } ?contact foaf:name &amp;quot;Alice&amp;quot; . ?g xx:has_publisher ?pub }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return the publishers of graphs that assert that somebody knows Alice.&lt;/p&gt; &lt;p&gt;Of course, the &lt;a href=&quot;http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#reification&quot; id=&quot;link-id14fa9488&quot;&gt;RDF reification vocabulary&lt;/a&gt; can be used as-is to say things about single triples. It is however very inefficient and is not supported by any specific optimization. Further, reification does not seem to get used very much; thus there is no great pressure to specially optimize it.&lt;/p&gt; &lt;p&gt;If we have to say things about specific triples and this occurs frequently (i.e., for more than 10% or so of the triples), then modifying the quad table becomes an option. For all its inefficiency, the RDF reification vocabulary is applicable if reification is a rarity.&lt;/p&gt; &lt;p&gt;Virtuoso&amp;#39;s &lt;code&gt;RDF_QUAD&lt;/code&gt; table can be altered to have more columns. The problem with this is that space usage is increased and the RDF loading and query functions will not know about the columns. A &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x4b1d938&quot;&gt;SQL&lt;/a&gt; update statement can be used to set values for these additional columns if one knows the &lt;code&gt;G,S,P,O&lt;/code&gt;. &lt;/p&gt; &lt;p&gt;Suppose we annotated each quad with the user who inserted it and a timestamp. These would be columns in the &lt;code&gt;RDF_QUAD&lt;/code&gt; table. The next choice would be whether these were primary key parts or dependent parts. If primary key parts, these would be non-&lt;code&gt;NULL&lt;/code&gt; and would occur on every index. The same quad would exist for each distinct user and time this quad had been inserted. For loading functions to work, these columns would need a default. In practice, we think that having such metadata as a dependent part is more likely, so that &lt;code&gt;G,S,P,O&lt;/code&gt; are the unique identifier of the quad. Whether one would then include these columns on indices other than the primary key would depend on how frequently they were accessed.&lt;/p&gt; &lt;p&gt;In &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x472afb0&quot;&gt;SPARQL&lt;/a&gt;, one could use an extension syntax like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { ?person foaf:knows ?connection OPTION ( time ?ts ) . ?connection foaf:name &amp;quot;Alice&amp;quot; . FILTER ( ?ts &amp;gt; &amp;quot;2009-08-08&amp;quot;^^xsd:datetime ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return everybody who knows Alice since a date more recent than 2009-08-08. This presupposes that the quad table has been extended with a datetime column.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;OPTION (time ?ts)&lt;/code&gt; syntax is not presently supported but we can easily add something of the sort if there is user demand for it. In practice, this would be an extension mechanism enabling one to access extension columns of &lt;code&gt;RDF_QUAD&lt;/code&gt; via a column &lt;code&gt;?variable&lt;/code&gt; syntax in the &lt;code&gt;OPTION&lt;/code&gt; clause.&lt;/p&gt; &lt;p&gt;If quad metadata were not for every quad but still relatively frequent, another possibility would be making a separate table with a key of &lt;code&gt;GSPO&lt;/code&gt; and a dependent part of &lt;code&gt;R&lt;/code&gt;, where &lt;code&gt;R&lt;/code&gt; would be the reification &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x365b190&quot;&gt;URI&lt;/a&gt; of the quad. Reification statements would then be made with &lt;code&gt;R&lt;/code&gt; as a subject. This would be more compact than the reification vocabulary and would not modify the &lt;code&gt;RDF_QUAD&lt;/code&gt; table. The syntax for referring to this could be something like —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;SELECT * WHERE { ?person foaf:knows ?contact OPTION ( reify ?r ) . ?r xx:assertion_time ?ts . ?contact foaf:name &amp;quot;Alice&amp;quot; . FILTER ( ?ts &amp;gt; &amp;quot;2008-8-8&amp;quot;^^xsd:datetime ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We could even recognize the reification vocabulary and convert it into the reify option if this were really necessary. But since it is so unwieldy I don&amp;#39;t think there would be huge demand. Who knows? You tell us.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:26:18.015613-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>More On Parallel RDF/Text Query Evaluation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-08-19#1571</atom:id>
  <atom:published>2009-08-19T17:28:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received some more questions about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x266cd288&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s parallel query evaluation model.&lt;/p&gt; &lt;p&gt;In answer, we will here explain how we do search engine style processing by writing &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x23c628b8&quot;&gt;SPARQL&lt;/a&gt;. There is no need for custom procedural code because the query optimizer does all the partitioning and the equivalent of map reduce.&lt;/p&gt; &lt;p&gt;The point is that what used to require programming can often be done in a generic query language. The technical detail is that the implementation must be smart enough with respect to parallelizing queries for this to be of practical benefit. But by combining these two things, we are a step closer to the web being the database.&lt;/p&gt; &lt;p&gt;I will here show how we do some joins combining full text, &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x22ff08b0&quot;&gt;RDF&lt;/a&gt; conditions, and aggregates and &lt;code&gt;ORDER BY&lt;/code&gt;. The sample task is finding the top 20 entities with New York in some attribute value. Then we specify the search further by only taking actors associated with New York. The results are returned in the order of a composite of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x22da5258&quot;&gt;entity&lt;/a&gt; rank and text match score.&lt;/p&gt; &lt;p&gt;The basic query is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ( &amp;lt;sql:s_sum_page&amp;gt; ( &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_VECTOR_AGG.html&quot; id=&quot;link-id0x2aab6151b368&quot;&gt;sql:vector_agg&lt;/a&gt;&amp;gt; ( &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_vector.html&quot; id=&quot;link-id0x2aab607a70e8&quot;&gt;bif:vector&lt;/a&gt;&amp;gt; ( ?c1 , ?sm , ?g1 ) ), &amp;lt;bif:vector&amp;gt; ( &amp;#39;NEW&amp;#39;, &amp;#39;YORK&amp;#39; ) ) ) AS ?res WHERE { { SELECT ( &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1 ) ) AS ?c1 , ( &amp;lt;sql:S_SUM&amp;gt; ( &amp;lt;SHORT_OR_LONG::IRI_RANK&amp;gt; ( ?s1 ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1textp ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?o1 ) , ?sc ) ) AS ?sm , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?g ) AS ?g1 WHERE { QUAD MAP virtrdf:DefaultQuadMap { graph ?g { ?s1 ?s1textp ?o1 . ?o1 &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_contains.html&quot; id=&quot;link-id0x2aab61f60d78&quot;&gt;bif:contains&lt;/a&gt;&amp;gt; &amp;#39;( NEW AND YORK )&amp;#39; OPTION ( SCORE ?sc ) } } } ORDER BY DESC ( &amp;lt;sql:sum_rank&amp;gt; (( &amp;lt;sql:S_SUM&amp;gt; ( &amp;lt;SHORT_OR_LONG::IRI_RANK&amp;gt; ( ?s1 ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1textp ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?o1 ) , ?sc ) )) ) LIMIT 20 OFFSET 0 } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This takes some explaining. The basic part is&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ ?s1 ?s1textp ?o1 . ?o1 &amp;lt;bif:contains&amp;gt; &amp;#39;( NEW AND YORK )&amp;#39; OPTION ( SCORE ?sc ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This just makes tuples where &lt;code&gt;?s1&lt;/code&gt; is the object (entity), &lt;code&gt;?s1textp&lt;/code&gt; the property (attribute), and &lt;code&gt;?o1&lt;/code&gt; the literal (value) which contains the strings &lt;code&gt;NEW&lt;/code&gt; and &lt;code&gt;YORK&lt;/code&gt;. For a single &lt;code&gt;?s1&lt;/code&gt;, there can of course be many properties which all contain &lt;code&gt;NEW&lt;/code&gt; and &lt;code&gt;YORK&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The rest of the query gathers all the &amp;quot;New York&amp;quot; containing properties of an entity into a single aggregate, and then gets the entity ranks of all such entities.&lt;/p&gt; &lt;p&gt;After this, the aggregates are sorted by a sum of the entity rank and a combined text score calculated based on the individual text match scores between &amp;quot;New York&amp;quot; and the strings containing &amp;quot;New York&amp;quot;. The text hit score is higher if the words repeat often and in close proximity.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;S_SUM&lt;/code&gt; function is a user-defined aggregate (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61e70b58&quot;&gt;borrowed from the FCT application; subject to change over time&lt;/a&gt;) which takes 4 arguments: The rank of the subject of the triple; the predicate of the triple containing the text; the object of the triple containing the text; and the text match score.&lt;/p&gt; &lt;p&gt;These are grouped by the subject of the triple. After this, these are sorted by &lt;code&gt;sum_rank&lt;/code&gt; of the aggregate constructed with &lt;code&gt;S_SUM&lt;/code&gt;. The &lt;code&gt;sum_rank&lt;/code&gt; (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61563e28&quot;&gt;also borrowed from the FCT application; subject to change over time&lt;/a&gt;) is a &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab62ee4618&quot;&gt;SQL&lt;/a&gt; function combining the entity rank with the text scores of the different literals.&lt;/p&gt; &lt;p&gt;This executes as one would expect: All partitions make a text index lookup, retrieving the object of the triple. The text index entries of an object are stored in the same partition as the object. But the entity rank is a property of the subject and is partitioned by the subject. Also the &lt;code&gt;GROUP BY&lt;/code&gt; is by the subject. Thus the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x24381030&quot;&gt;data&lt;/a&gt; is produced from all partitions, then streamed into the receiving partitions, determined by the subject. This partition can then get the score and group the matches by the subject. Since all these partial aggregates are partitioned by the subject, there is no need to merge them; thus, the top &lt;code&gt;k&lt;/code&gt; sort can be done for each partition separately. Finally, the top 20 of each partition are merged into the global top 20. This is then passed to a final function &lt;code&gt;s_sum_page&lt;/code&gt; (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61d3da28&quot;&gt;also borrowed from the FCT application; subject to change over time&lt;/a&gt;) that turns this all into an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2363d6c0&quot;&gt;XML&lt;/a&gt; fragment that can be processed with XSLT for inclusion on a web page.&lt;/p&gt; &lt;p&gt;This differs from the text search engine in that the query pipeline can contain arbitrary cross-partition joins. Also, the string &amp;quot;New York&amp;quot; is a common label that occurs in many distinct entities. Thus one text match, to one document, in the case the containing only the string &amp;quot;New York&amp;quot; will get many entities, likely all from different partitions.&lt;/p&gt; &lt;p&gt;So, if we only want actors with a mention of &amp;quot;New York&amp;quot;, we need to get the inner part of the query as:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ ?s1 ?s1textp ?o1 . ?o1 &amp;lt;bif:contains&amp;gt; &amp;#39; ( NEW AND YORK ) &amp;#39; OPTION ( SCORE ?sc ) . ?s1 a &amp;lt;http://umbel.org/umbel/sc/Actor&amp;gt; }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Whether an entity is an actor can be checked in the same partition as the rank of the entity. Thus the query plan gets this check right before getting the rank. This is natural since there is no point in getting the rank of something that is not an actor.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;&amp;lt;SHORT_OR_LONG::sql:func&amp;gt;&lt;/code&gt; notation means that we call &lt;code&gt;func&lt;/code&gt;, which is a SQL stored procedure with the arguments in their internal form. Thus, if a variable bound to an IRI is passed, the &lt;code&gt;SHORT_OR_LONG&lt;/code&gt; specifies that it is passed as its internal ID and is not converted into its text form. This is essential, since there is no point getting the text of half a million IRIs when only 20 at most will be shown in the end.&lt;/p&gt; &lt;p&gt;Now, when we run this on a collection of 4.5 billion triples of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x24381160&quot;&gt;linked data&lt;/a&gt;, once we have the working set, we can get the top 20 &amp;quot;New York&amp;quot; occurrences, with text summaries and all, in just 1.1s, with 12 of 16 cores busy. (The hardware is two boxes with two quad-core Xeon 5345 each.)&lt;/p&gt; &lt;p&gt;If we run this query in two parallel sessions, we get both results in 1.9s, with 14 of 16 cores busy. This gets about 200K &amp;quot;New York&amp;quot; strings, which becomes about 400K entities with New York somewhere, for which a rank then has to be retrieved. After this, all the possibly-many occurrences of New York in the title, text, and other properties of the entity are aggregated together, resolving into some 220K groups. These are then sorted. This is internally over 1.5 million random lookups and some 40MB of traffic between processes. Restricting the type of the entity to actor drops the execution time of one query to 0.8s because there are then fewer ranks to retrieve and less data to aggregate and sort.&lt;/p&gt; &lt;p&gt;By adding partitions and cores, we scale horizontally, as evaluating the query involves almost no central control, even though data are swapped between partitions. There is some flow control to avoid constructing overly-large intermediate results but generally partitions run independently and asynchronously. In the above case, there is just one fence at the point where all aggregates are complete, so that they can be sorted; otherwise, all is asynchronous.&lt;/p&gt; &lt;p&gt;Doing &lt;code&gt;JOINs&lt;/code&gt; between partitions and partitioned &lt;code&gt;GROUP BY&lt;/code&gt;/&lt;code&gt;ORDER BY&lt;/code&gt; is pretty regular database stuff. Applying this to RDF is a most natural thing.&lt;/p&gt; &lt;p&gt;If we do not parallelize the user-defined aggregate for grouping all the &amp;quot;New York&amp;quot; occurrences, the query takes 8s instead of 1.1s. If we could not put SQL procedures as user-defined aggregates to be parallelized with the query, we&amp;#39;d have to either bring all the data to a central point before the top k, which would destroy performance, or we would have to do procedures with explicit parallel procedure calls which is hard to write, surely too hard for &lt;i&gt;ad hoc&lt;/i&gt; queries.&lt;/p&gt; &lt;a href=&quot;http://bit.ly/1QpHoRj&quot; id=&quot;link-id0x2aabc203ec28&quot;&gt;Results of live execution&lt;/a&gt; of &lt;a href=&quot;http://bit.ly/1Ihmm8o&quot; id=&quot;link-id0x2aabc2396c28&quot;&gt;this query&lt;/a&gt; may not be complete on initial load, as this link includes a &amp;quot;Virtuoso Anytime&amp;quot; timeout of 10 seconds. Running against a cold cache, these results may take much longer to return; a warm cache will deliver response times along the lines of those discussed above. &lt;p&gt;Engineering matters. If we wish to commoditize queries on a lot of data, such intelligence in the DBMS is necessary; it is very unscalable to require people to do procedural code or give query parallelization hints. If you need to optimize a workload of 10 different transactions, this is of course possible and even desirable, but for the infinity of all search or analysis, this will not happen.&lt;/p&gt;</atom:content>
  <atom:updated>2015-06-03T12:03:52.939352-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>More On Parallel RDF/Text Query Evaluation</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-08-19#1570</atom:id>
  <atom:published>2009-08-19T17:28:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received some more questions about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x266cd288&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s parallel query evaluation model.&lt;/p&gt; &lt;p&gt;In answer, we will here explain how we do search engine style processing by writing &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x23c628b8&quot;&gt;SPARQL&lt;/a&gt;. There is no need for custom procedural code because the query optimizer does all the partitioning and the equivalent of map reduce.&lt;/p&gt; &lt;p&gt;The point is that what used to require programming can often be done in a generic query language. The technical detail is that the implementation must be smart enough with respect to parallelizing queries for this to be of practical benefit. But by combining these two things, we are a step closer to the web being the database.&lt;/p&gt; &lt;p&gt;I will here show how we do some joins combining full text, &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x22ff08b0&quot;&gt;RDF&lt;/a&gt; conditions, and aggregates and &lt;code&gt;ORDER BY&lt;/code&gt;. The sample task is finding the top 20 entities with New York in some attribute value. Then we specify the search further by only taking actors associated with New York. The results are returned in the order of a composite of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x22da5258&quot;&gt;entity&lt;/a&gt; rank and text match score.&lt;/p&gt; &lt;p&gt;The basic query is:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; SELECT ( &amp;lt;sql:s_sum_page&amp;gt; ( &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_VECTOR_AGG.html&quot; id=&quot;link-id0x2aab61593558&quot;&gt;sql:vector_agg&lt;/a&gt;&amp;gt; ( &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_vector.html&quot; id=&quot;link-id0x2aab61593688&quot;&gt;bif:vector&lt;/a&gt;&amp;gt; ( ?c1 , ?sm , ?g1 ) ), &amp;lt;bif:vector&amp;gt; ( &amp;#39;NEW&amp;#39;, &amp;#39;YORK&amp;#39; ) ) ) AS ?res WHERE { { SELECT ( &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1 ) ) AS ?c1 , ( &amp;lt;sql:S_SUM&amp;gt; ( &amp;lt;SHORT_OR_LONG::IRI_RANK&amp;gt; ( ?s1 ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1textp ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?o1 ) , ?sc ) ) AS ?sm , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?g ) AS ?g1 WHERE { QUAD MAP virtrdf:DefaultQuadMap { graph ?g { ?s1 ?s1textp ?o1 . ?o1 &amp;lt;&lt;a href=&quot;http://docs.openlinksw.com/virtuoso/fn_contains.html&quot; id=&quot;link-id0x2aab61593788&quot;&gt;bif:contains&lt;/a&gt;&amp;gt; &amp;#39;( NEW AND YORK )&amp;#39; OPTION ( SCORE ?sc ) } } } ORDER BY DESC ( &amp;lt;sql:sum_rank&amp;gt; (( &amp;lt;sql:S_SUM&amp;gt; ( &amp;lt;SHORT_OR_LONG::IRI_RANK&amp;gt; ( ?s1 ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?s1textp ) , &amp;lt;SHORT_OR_LONG::&amp;gt; ( ?o1 ) , ?sc ) )) ) LIMIT 20 OFFSET 0 } } &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This takes some explaining. The basic part is&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ ?s1 ?s1textp ?o1 . ?o1 &amp;lt;bif:contains&amp;gt; &amp;#39;( NEW AND YORK )&amp;#39; OPTION ( SCORE ?sc ) }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This just makes tuples where &lt;code&gt;?s1&lt;/code&gt; is the object (entity), &lt;code&gt;?s1textp&lt;/code&gt; the property (attribute), and &lt;code&gt;?o1&lt;/code&gt; the literal (value) which contains the strings &lt;code&gt;NEW&lt;/code&gt; and &lt;code&gt;YORK&lt;/code&gt;. For a single &lt;code&gt;?s1&lt;/code&gt;, there can of course be many properties which all contain &lt;code&gt;NEW&lt;/code&gt; and &lt;code&gt;YORK&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;The rest of the query gathers all the &amp;quot;New York&amp;quot; containing properties of an entity into a single aggregate, and then gets the entity ranks of all such entities.&lt;/p&gt; &lt;p&gt;After this, the aggregates are sorted by a sum of the entity rank and a combined text score calculated based on the individual text match scores between &amp;quot;New York&amp;quot; and the strings containing &amp;quot;New York&amp;quot;. The text hit score is higher if the words repeat often and in close proximity.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;S_SUM&lt;/code&gt; function is a user-defined aggregate (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61e65028&quot;&gt;borrowed from the FCT application; subject to change over time&lt;/a&gt;) which takes 4 arguments: The rank of the subject of the triple; the predicate of the triple containing the text; the object of the triple containing the text; and the text match score.&lt;/p&gt; &lt;p&gt;These are grouped by the subject of the triple. After this, these are sorted by &lt;code&gt;sum_rank&lt;/code&gt; of the aggregate constructed with &lt;code&gt;S_SUM&lt;/code&gt;. The &lt;code&gt;sum_rank&lt;/code&gt; (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61e654d8&quot;&gt;also borrowed from the FCT application; subject to change over time&lt;/a&gt;) is a &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2aab61e65608&quot;&gt;SQL&lt;/a&gt; function combining the entity rank with the text scores of the different literals.&lt;/p&gt; &lt;p&gt;This executes as one would expect: All partitions make a text index lookup, retrieving the object of the triple. The text index entries of an object are stored in the same partition as the object. But the entity rank is a property of the subject and is partitioned by the subject. Also the &lt;code&gt;GROUP BY&lt;/code&gt; is by the subject. Thus the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x24381030&quot;&gt;data&lt;/a&gt; is produced from all partitions, then streamed into the receiving partitions, determined by the subject. This partition can then get the score and group the matches by the subject. Since all these partial aggregates are partitioned by the subject, there is no need to merge them; thus, the top &lt;code&gt;k&lt;/code&gt; sort can be done for each partition separately. Finally, the top 20 of each partition are merged into the global top 20. This is then passed to a final function &lt;code&gt;s_sum_page&lt;/code&gt; (&lt;a href=&quot;http://demo.openlinksw.com/DAV/VAD/fct/sum.sql&quot; id=&quot;link-id0x2aab61533cf8&quot;&gt;also borrowed from the FCT application; subject to change over time&lt;/a&gt;) that turns this all into an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2363d6c0&quot;&gt;XML&lt;/a&gt; fragment that can be processed with XSLT for inclusion on a web page.&lt;/p&gt; &lt;p&gt;This differs from the text search engine in that the query pipeline can contain arbitrary cross-partition joins. Also, the string &amp;quot;New York&amp;quot; is a common label that occurs in many distinct entities. Thus one text match, to one document, in the case the containing only the string &amp;quot;New York&amp;quot; will get many entities, likely all from different partitions.&lt;/p&gt; &lt;p&gt;So, if we only want actors with a mention of &amp;quot;New York&amp;quot;, we need to get the inner part of the query as:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt;{ ?s1 ?s1textp ?o1 . ?o1 &amp;lt;bif:contains&amp;gt; &amp;#39; ( NEW AND YORK ) &amp;#39; OPTION ( SCORE ?sc ) . ?s1 a &amp;lt;http://umbel.org/umbel/sc/Actor&amp;gt; }&lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;Whether an entity is an actor can be checked in the same partition as the rank of the entity. Thus the query plan gets this check right before getting the rank. This is natural since there is no point in getting the rank of something that is not an actor.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;&amp;lt;SHORT_OR_LONG::sql:func&amp;gt;&lt;/code&gt; notation means that we call &lt;code&gt;func&lt;/code&gt;, which is a SQL stored procedure with the arguments in their internal form. Thus, if a variable bound to an IRI is passed, the &lt;code&gt;SHORT_OR_LONG&lt;/code&gt; specifies that it is passed as its internal ID and is not converted into its text form. This is essential, since there is no point getting the text of half a million IRIs when only 20 at most will be shown in the end.&lt;/p&gt; &lt;p&gt;Now, when we run this on a collection of 4.5 billion triples of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x24381160&quot;&gt;linked data&lt;/a&gt;, once we have the working set, we can get the top 20 &amp;quot;New York&amp;quot; occurrences, with text summaries and all, in just 1.1s, with 12 of 16 cores busy. (The hardware is two boxes with two quad-core Xeon 5345 each.)&lt;/p&gt; &lt;p&gt;If we run this query in two parallel sessions, we get both results in 1.9s, with 14 of 16 cores busy. This gets about 200K &amp;quot;New York&amp;quot; strings, which becomes about 400K entities with New York somewhere, for which a rank then has to be retrieved. After this, all the possibly-many occurrences of New York in the title, text, and other properties of the entity are aggregated together, resolving into some 220K groups. These are then sorted. This is internally over 1.5 million random lookups and some 40MB of traffic between processes. Restricting the type of the entity to actor drops the execution time of one query to 0.8s because there are then fewer ranks to retrieve and less data to aggregate and sort.&lt;/p&gt; &lt;p&gt;By adding partitions and cores, we scale horizontally, as evaluating the query involves almost no central control, even though data are swapped between partitions. There is some flow control to avoid constructing overly-large intermediate results but generally partitions run independently and asynchronously. In the above case, there is just one fence at the point where all aggregates are complete, so that they can be sorted; otherwise, all is asynchronous.&lt;/p&gt; &lt;p&gt;Doing &lt;code&gt;JOINs&lt;/code&gt; between partitions and partitioned &lt;code&gt;GROUP BY&lt;/code&gt;/&lt;code&gt;ORDER BY&lt;/code&gt; is pretty regular database stuff. Applying this to RDF is a most natural thing.&lt;/p&gt; &lt;p&gt;If we do not parallelize the user-defined aggregate for grouping all the &amp;quot;New York&amp;quot; occurrences, the query takes 8s instead of 1.1s. If we could not put SQL procedures as user-defined aggregates to be parallelized with the query, we&amp;#39;d have to either bring all the data to a central point before the top k, which would destroy performance, or we would have to do procedures with explicit parallel procedure calls which is hard to write, surely too hard for &lt;i&gt;ad hoc&lt;/i&gt; queries.&lt;/p&gt; &lt;a href=&quot;http://bit.ly/1QpHoRj&quot; id=&quot;link-id0x2aab552f1cd8&quot;&gt;Results of live execution&lt;/a&gt; of &lt;a href=&quot;http://bit.ly/1Ihmm8o&quot; id=&quot;link-id0x2aab55297ca8&quot;&gt;this query&lt;/a&gt; may not be complete on initial load, as this link includes a &amp;quot;Virtuoso Anytime&amp;quot; timeout of 10 seconds. Running against a cold cache, these results may take much longer to return; a warm cache will deliver response times along the lines of those discussed above. &lt;p&gt;Engineering matters. If we wish to commoditize queries on a lot of data, such intelligence in the DBMS is necessary; it is very unscalable to require people to do procedural code or give query parallelization hints. If you need to optimize a workload of 10 different transactions, this is of course possible and even desirable, but for the infinity of all search or analysis, this will not happen.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:28:38.277168-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Updated hardware improves LUBM 8000 load rate in Virtuoso 6</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-08-14#1569</atom:id>
  <atom:published>2009-08-14T19:01:30Z</atom:published>
  <atom:content type="html">&lt;p&gt;We repeated the &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1562&quot; id=&quot;link-id173d3068&quot;&gt;earlier LUBM 8000 experiment&lt;/a&gt; on a newer machine, with 2 x Xeon 5520 and 72G 1333MHz memory, and once again with the 2 machines as a networked cluster. Otherwise the settings were the same.&lt;/p&gt; &lt;p&gt;The load rate is now 160,739 triples-per-second.&lt;/p&gt; &lt;table&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x240daf38&quot;&gt;Virtuoso&lt;/a&gt; 6 &lt;br /&gt; (previous run)&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso 6 &lt;br /&gt; (new run)&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso 6 &lt;br /&gt; (newest run)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;blades&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;processors&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2 x Xeon 5410&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2 x Xeon 5520&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2 x Xeon 5520 &lt;br /&gt;+ &lt;br /&gt;2 x Xeon 5410 &lt;br /&gt;with 1x1GigE &lt;br /&gt;interconnect &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;memory&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16G 667 MHz&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72G 1333 MHz&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72G 1333 MHz &lt;br /&gt;+ &lt;br /&gt; 16G 667 MHz &lt;br /&gt; respectively&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;reported load rate&lt;br /&gt;triples-per-second&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 110,532 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 160,739 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 214,188 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Again, if others talk about loading LUBM, so must we. Otherwise, this metric is rather uninteresting.&lt;/p&gt;</atom:content>
  <atom:updated>2009-08-15T15:27:29-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Updated hardware improves LUBM 8000 load rate in Virtuoso 6</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-08-14#1568</atom:id>
  <atom:published>2009-08-14T19:01:30Z</atom:published>
  <atom:content type="html">&lt;p&gt;We repeated the &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1562&quot; id=&quot;link-id173d3068&quot;&gt;earlier LUBM 8000 experiment&lt;/a&gt; on a newer machine, with 2 x Xeon 5520 and 72G 1333MHz memory, and once again with the 2 machines as a networked cluster. Otherwise the settings were the same.&lt;/p&gt; &lt;p&gt;The load rate is now 160,739 triples-per-second.&lt;/p&gt; &lt;table&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;&lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x199b9740&quot;&gt;Virtuoso&lt;/a&gt; 6 &lt;br /&gt; (previous run)&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso 6 &lt;br /&gt; (new run)&lt;/th&gt; &lt;td&gt;   &lt;/td&gt; &lt;th align=&quot;center&quot;&gt;Virtuoso 6 &lt;br /&gt; (newest run)&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;blades&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;processors&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2 x Xeon 5410&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2 x Xeon 5520&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 2 x Xeon 5520 &lt;br /&gt;+ &lt;br /&gt;2 x Xeon 5410 &lt;br /&gt;with 1x1GigE &lt;br /&gt;interconnect &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;memory&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 16G 667 MHz&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72G 1333 MHz&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;72G 1333 MHz &lt;br /&gt;+ &lt;br /&gt; 16G 667 MHz &lt;br /&gt; respectively&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;left&quot;&gt;reported load rate&lt;br /&gt;triples-per-second&lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 110,532 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 160,739 &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td align=&quot;center&quot;&gt; 214,188 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Again, if others talk about loading LUBM, so must we. Otherwise, this metric is rather uninteresting.&lt;/p&gt;</atom:content>
  <atom:updated>2009-08-15T15:27:25-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The URI, URL, and Linked Data Meme&#39;s Generic HTTP URI (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-08-07#1567</atom:id>
  <atom:published>2009-08-07T18:34:50Z</atom:published>
  <atom:content type="html">&lt;h3&gt; Situation Analysis&lt;/h3&gt; &lt;p&gt; As the &amp;quot;&lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id12f96a00&quot;&gt;Linked Data&amp;quot; meme&lt;/a&gt; has gained momentum you&amp;#39;ve more than likely been on the receiving end of dialog with Linked Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; community members (myself included) that goes something like this:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;Do you have a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id139252a0&quot;&gt;URI&lt;/a&gt;&amp;quot;, &amp;quot;Get yourself a URI&amp;quot;, &amp;quot;Give &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id140eab68&quot;&gt;me&lt;/a&gt; a de-referencable URI&amp;quot; etc..&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; And each time, you respond with a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id112c1860&quot;&gt;URL&lt;/a&gt; -- which to the best of your &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id140b51c0&quot;&gt;knowledge&lt;/a&gt; is a bona fide URI. But to your utter confusion you are told: Nah! You gave me a Document URI instead of the URI of a real-world thing or object etc..&lt;/p&gt; &lt;h3&gt; What&amp;#39;s up with that?&lt;/h3&gt; &lt;p&gt; Well our everyday use of the Web is an unfortunate conflation of two distinct things, which have Identity: Real World Objects (RWOs) &amp;amp; Address/Location of Documents (&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id144838b0&quot;&gt;Information&lt;/a&gt; bearing Resources).&lt;/p&gt; &lt;p&gt; The &amp;quot;Linked Data&amp;quot; meme is about enhancing the Web by unobtrusively reintroducing its core essence: the generic HTTP URI, a vital piece of Web Architecture DNA. Basically, its about so realizing the full capabilities of the Web as a platform for Open Data Identification, Definition, Access, Storage, Representation, Presentation, and Integration.&lt;/p&gt; &lt;h3&gt; What is a Real World Object?&lt;/h3&gt; &lt;p&gt; People, Places, Music, Books, Cars, Ideas, Emotions etc..&lt;/p&gt; &lt;h3&gt; What is a URI?&lt;/h3&gt; &lt;p&gt; A Uniform Resource Identifier. A global identifier mechanism for network addressable data items. Its sole function is Name oriented Identification.&lt;/p&gt; &lt;h4&gt; URI Generic Syntax&lt;/h4&gt; &lt;p&gt; The constituent parts of a URI (from &lt;a href=&quot;http://www.ietf.org/rfc/rfc2396.txt&quot; id=&quot;link-id1180c700&quot;&gt;URI Generic Syntax RFC&lt;/a&gt;) are depicted below: &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/images/generic_uri_syntax_image.png&quot; /&gt; &lt;/p&gt; &lt;h3&gt; What is a URL?&lt;/h3&gt; &lt;p&gt; A location oriented HTTP scheme based URI. The HTTP scheme introduces a powerful and inherent duality that delivers:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Resource Address/Location Identifier&lt;/li&gt; &lt;li&gt; Data Access mechanism for an Information bearing Resource (Document, File etc..)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; So far so good!&lt;/p&gt; &lt;h3&gt; What is an HTTP based URI?&lt;/h3&gt; &lt;p&gt; The kind of URI &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11100a28&quot;&gt;Linked Data&lt;/a&gt; aficionados mean when they use the term: URI.&lt;/p&gt; &lt;p&gt; An HTTP URI is an HTTP scheme based URI. Unlike a URL, this kind of HTTP scheme URI is devoid of any Web Location orientation or specificity. Thus, Its inherent duality provides a more powerful level of abstraction. Hence, you can use this form of URI to assign Names/Identifiers to Real World Objects (RWO). Even better, courtesy of the Identity/Address duality of the HTTP scheme, a single URI can deliver the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; RWO Identfier/Name&lt;/li&gt; &lt;li&gt; RWO Metadata document Locator (courtesy of URL aspect)&lt;/li&gt; &lt;li&gt; Negotiable Representation of the Located Document (courtesy of HTTP&amp;#39;s content negotiation feature).&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; What is Metadata?&lt;/h3&gt; &lt;p&gt; Data about Data. Put differently, data that describes other data in a structured manner.&lt;/p&gt; &lt;h3&gt; How Do we Model Metadata?&lt;/h3&gt; &lt;p&gt; The predominant model for metadata is the &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id11193d30&quot;&gt;Entity&lt;/a&gt;-Attribute-Value + Classes &amp;amp; Relationships model (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id11725710&quot;&gt;EAV&lt;/a&gt;/CR). A model that&amp;#39;s been with us since the inception of modern computing (long before the Web).&lt;/p&gt; &lt;h3&gt; What about RDF?&lt;/h3&gt; &lt;p&gt; The Resource Description Framework (RDF) is a framework for describing Web addressable resources. In a nutshell, its a framework for adding Metadata bearing Information Resources to the current Web. Its comprised of:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Entity-Attribute-Value (aka. Subject-Predictate-Object) plus Classes &amp;amp; Relationships (&lt;a href=&quot;http://dbpedia.org/resource/Data_dictionary&quot; id=&quot;link-id138df0f8&quot;&gt;Data Dictionaries&lt;/a&gt; e.g., &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id116bf590&quot;&gt;OWL&lt;/a&gt;) metadata model&lt;/li&gt; &lt;li&gt; A plethora of instance data representation formats that include: &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id13360b90&quot;&gt;RDFa&lt;/a&gt; (when doing so within (X)HTML docs), Turtle, N3, TriX, RDF/XML etc.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; What&amp;#39;s the Problem Today?&lt;/h3&gt; &lt;p&gt; The ubiquitous use of the Web is primarily focused on a Linked Mesh of Information bearing Documents. URLs rather than generic HTTP URIs are the prime mechanism for Web tapestry; basically, we use URLs to conduct Information -- which is inherently subjective -- instead of using HTTP URIs to conduct &amp;quot;Raw Data&amp;quot; -- which is inherently objective.&lt;/p&gt; &lt;blockquote&gt; &lt;strong&gt;Note:&lt;/strong&gt; Information is &amp;quot;data in &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1395ca50&quot;&gt;context&lt;/a&gt;&amp;quot;, it isn&amp;#39;t the same thing as &amp;quot;Raw Data&amp;quot;. Thus, if we can link to Information via the Web, why shouldn&amp;#39;t we be able to do the same for &amp;quot;Raw Data&amp;quot;?&lt;/blockquote&gt; &lt;h3&gt; How Does the Link Data &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id1160ab70&quot;&gt;meme&lt;/a&gt; solve the problem?&lt;/h3&gt; &lt;p&gt; The meme simply provides a set of guidelines (best practices) for producing Web architecture friendly metadata. Meaning: when producing EAV/CR model based metadata, endow Subjects, their Attributes, and Attribute Values (optionally) with HTTP URIs. By doing so, a new level of Link Abstraction on the Web is possible i.e., &amp;quot;Data Item to Data Item&amp;quot; level links (aka &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id137a78a0&quot;&gt;hyperdata&lt;/a&gt; links). Even better, when you de-reference a RWO hyperdata link you end up with a negotiated representations of its metadata.&lt;/p&gt; &lt;h3&gt; Conclusion&lt;/h3&gt; &lt;p&gt; Linked Data is ultimately about an HTTP URI for each item in the &lt;a href=&quot;http://dbpedia.org/resource/Data_hierarchy&quot; id=&quot;link-id1393c3e0&quot;&gt;Data Organization Hierarchy&lt;/a&gt; :-)&lt;/p&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://lists.w3.org/Archives/Public/www-tag/2009Aug/0000.html&quot; id=&quot;link-id140c1e78&quot;&gt;History of how &amp;quot;Resource&amp;quot; became part of URI&lt;/a&gt; - historic account by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1172b128&quot;&gt;TimBL&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id1338cbd0&quot;&gt;Linked Data Design Issues Document&lt;/a&gt; - &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id13536ad8&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s initial Linked Data Guide&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1561&quot; id=&quot;link-id116c1af8&quot;&gt;Linked Data Rules Simplified&lt;/a&gt; - My attempt at simplifying the Linked Data Meme without &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id116c3b40&quot;&gt;SPARQL&lt;/a&gt; &amp;amp; RDF distraction&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1547&quot; id=&quot;link-id135dd1b8&quot;&gt;Linked Data &amp;amp; Identity&lt;/a&gt; - another related post&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1565&quot; id=&quot;link-id134afc50&quot;&gt;The Linked Data Meme&amp;#39;s Value Proposition&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1323&quot; id=&quot;link-id1251e9248&quot;&gt;So What Does &amp;quot;HREF&amp;quot; stand for anyway?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://delicious.com/kidehen/identifier_scheme&quot; id=&quot;link-id14cc7e18&quot;&gt;My Del.icio.us hosted Bookmark Data Space for Identity Schemes&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.ted.com/talks/tim_berners_lee_on_the_next_web.html&quot; id=&quot;link-id115a3748&quot;&gt;TimBL&amp;#39;s Ted Talk re. &amp;quot;Raw Linked Data&amp;quot;&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.infoq.com/articles/roa-rest-of-rest&quot; id=&quot;link-id11b25558&quot;&gt;Resource Oriented Architecture&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.blipfoto.com/view.php?id=465380&amp;amp;month=2&amp;amp;year=2010&quot; id=&quot;link-id139824c8&quot;&gt;More Famous Than Simon Cowell&lt;/a&gt; .&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2010-03-28T12:19:00-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Why Do We Put Stuff On The Web, Really?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-07-24#1566</atom:id>
  <atom:published>2009-07-24T15:54:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;As espoused by the Ubuntu philosophy, no Human is an Island. Thus, although the objects of our sociality are vast and varied; that said, the basic foundation still centers on the pursuit and/or delivery of products and services.&lt;/p&gt; &lt;p&gt;Today, the we put stuff on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; because we want it do be discovered as part of a &amp;quot;sharing act&amp;quot;. Likewise, we make regular use of Search Engine Services because we want to &amp;quot;Find&amp;quot; stuff in a productive manner.&lt;/p&gt; &lt;p&gt;Putting, the above in &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1340d970&quot;&gt;context&lt;/a&gt;, you don&amp;#39;t need to be Einstein to figure out that to date the Web hasn&amp;#39;t enabled vendors to describe their products and services clearly. Likewise, it hasn&amp;#39;t enabled us to describe what we want, when we want it, and how much we are willing to pay etc. Basically, the SDQ of Web Content is excruciatingly low!&lt;/p&gt; &lt;p&gt; The &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id1357e068&quot;&gt;Linked Data meme&lt;/a&gt; is about using the essence of the Web -- HTTP URIs -- as the mechanism for conducting &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; across the Web that unambiguously unveils basic things like:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Using a personal profile to describe exactly who I am, my interests, favorite things, what I want (wishlist), what I have to offer (offerlist) etc.&lt;/li&gt; &lt;li&gt; Using an company profile to describe my entire product catalog, inventory levels, store locations, distributor and reseller networks, feature specs, price specs, deal terms and duration, and even opening and closing hours.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Conclusions&lt;/h3&gt; &lt;p&gt;A Web of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id124f7778&quot;&gt;Linked Data&lt;/a&gt; enables a complete redefinition of eCommerce, and that&amp;#39;s just for starters :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1442&quot; id=&quot;link-id112b62c0&quot;&gt;Post Introducing SDQ&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.seangolliher.com/2009/linked-data/serendipitous-discovery-quotient-sdq-the-future-of-seo-or-an-abstract-concept/&quot; id=&quot;link-id110cf500&quot;&gt;Serendipitous Discovery Quotient (SDQ): The Future of SEO? Or an Abstract Concept?&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-07-24T21:00:21-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Exploring the Value Proposition of Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-07-23#1565</atom:id>
  <atom:published>2009-07-24T00:17:19Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id138c9aa8&quot;&gt;Linked Data&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt; The primary topic of a &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id12f86100&quot;&gt;meme&lt;/a&gt; penned by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id115b4c98&quot;&gt;TimBL&lt;/a&gt; in the form of a &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id1333f300&quot;&gt;Design Issues Doc&lt;/a&gt; (note: this is how TimBL has shared his thoughts since the &lt;a href=&quot;http://www.w3.org/DesignIssues/&quot; id=&quot;link-id1128a1d0&quot;&gt;Beginning of the Web&lt;/a&gt;). &lt;/p&gt; &lt;p&gt; There are a number of dimensions to the meme, but its primary purpose is the reintroduction of the HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id13c43cb8&quot;&gt;URI&lt;/a&gt; -- a vital component of the Web&amp;#39;s core architecture. &lt;/p&gt; &lt;h3&gt; What&amp;#39;s Special about HTTP URIs?&lt;/h3&gt; &lt;p&gt; They possess an intrinsic duality that combines persistent and unambiguous &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Identity with platform &amp;amp; representation format independent Data Access. Thus, you can use a string of characters that look like a contemporary Web &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id119cd8a0&quot;&gt;URL&lt;/a&gt; to unambiguously achieve the following: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Identity or Name Anything of Interest&lt;/li&gt; &lt;li&gt;Describe Anything of Interest by associating the Description Subject&amp;#39;s Identity with a constellation of Attribute and Value pairs (technically: an &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id1133e8a8&quot;&gt;Entity&lt;/a&gt;-Attribute-Value or Subject-Predicate-Object graph)&lt;/li&gt; &lt;li&gt;Make the Description of Named Things of Interest discoverable on the Web by implicitly binding the aforementioned to Documents that hold their descriptions (technically: metadata documents or &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1391da40&quot;&gt;information&lt;/a&gt; resources)&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;What&amp;#39;s the basic value proposition of the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id113bb690&quot;&gt;Linked Data meme&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;Enabling more productive use of the Web by users and developers alike. All of which is achieved by tweaking the Web&amp;#39;s Hyperlinking feature such that it now includes Hypertext and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1337a3f0&quot;&gt;Hyperdata&lt;/a&gt; as link types.&lt;/p&gt; &lt;p&gt;Note: Hyperdata Linking is simply what an HTTP URI facilitates.&lt;/p&gt; &lt;p&gt;Examples problems solved by injecting Linked Data into the Web:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Federated Identity by enabling Individuals to unambiguously Identify themselves (Profiles++) courtesy of existing &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id13926e28&quot;&gt;Internet&lt;/a&gt; and Web protocols (e.g., &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id13646ec8&quot;&gt;FOAF&lt;/a&gt;+SSL&amp;#39;s WebIDs which combine Personal Identity with X.509 certificates and HTTPs based client side certification)&lt;/li&gt; &lt;li&gt;Security and Privacy challenge alleviation by delivering a mechanism for policy based data access that feeds off federated individual identity and social network (graph) traversal&lt;/li&gt; &lt;li&gt;Spam Busting via the above&lt;/li&gt;. &lt;li&gt; Increasing the Serendipitous Discovery Quotient (SDQ) of Web accessible resources by embedding Rich Metadata into (X)HTML Documents e.g., structured descriptions of your &amp;quot;WishLists&amp;quot; and &amp;quot;OfferLists&amp;quot; via a common set of terms offered by vocabularies such as &lt;a href=&quot;http://www.heppnetz.de/projects/goodrelations/&quot; id=&quot;link-id1199b4d0&quot;&gt;GoodRelations&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SIOC&quot; id=&quot;link-id1334cfb0&quot;&gt;SIOC&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Coherent integration of disparate data across the Web and/or within the Enterprise via &amp;quot;Data Meshing&amp;quot; rather than &amp;quot;Data Mashing&amp;quot;&lt;/li&gt; &lt;li&gt;Moving beyond imprecise statistically driven &amp;quot;Keyword Search&amp;quot; (e.g. Page Rank) to &amp;quot;Precision Find&amp;quot; driven by typed link based &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id135f6fe8&quot;&gt;Entity&lt;/a&gt; Rank plus Entity Type and Entity Property filters.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;If all of the above still falls into the technical mumbo-jumbo realm, then simply consider Linked Data as delivering Open Data Access in granular form to Web accessible data -- that goes beyond data containers (documents or files).&lt;/p&gt; &lt;p&gt;The value proposition of Linked Data is inextricably linked to the value proposition of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id1356f5c0&quot;&gt;World Wide Web&lt;/a&gt;. This is true, because the Linked Data meme is ultimately about an enhancement of the current Web; achieved by reintroducing its architectural essence -- in new &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id11300828&quot;&gt;context&lt;/a&gt; -- via a new level of link abstraction, courtesy of the Identity and Access duality of HTTP URIs.&lt;/p&gt; &lt;p&gt;As a result of Linked Data, you can now have Links on the Web for a Person, Document, Music, Consumer Electronics, Products &amp;amp; Services, Business Opening &amp;amp; Closing Hours, Personal &amp;quot;WishLists&amp;quot; and &amp;quot;OfferList&amp;quot;, an Idea, etc.. in addition to links for Properties (Attributes &amp;amp; Values) of the aforementioned. Ultimately, all of these links will be indexed in a myriad of ways providing the substrate for the next major period of Internet &amp;amp; Web driven innovation, within our larger human-ingenuity driven innovation continuum.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.ebusiness-unibw.org/wiki/GoodRelations#Recipes_and_Examples&quot; id=&quot;link-id11386648&quot;&gt;Recipes for Describing Your Business and its Offerings using the GoodRelations Vocabulary / Schema&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://slidesix.com/view/SolvingRealProblemsUsingLinkedData&quot; id=&quot;link-id13658ee0&quot;&gt;Solving Real Problems with RDF based Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=linked%20data&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1175a650&quot;&gt;Other Linked Data Posts from this Blog oriented Linked Data Space&lt;/a&gt; (goes back a few years!)&lt;/li&gt; &lt;li&gt;Various practical &lt;a href=&quot;http://delicious.com/kidehen/linked_data_demo&quot; id=&quot;link-id13390cf8&quot;&gt;Linked Data demo links from my Del.icio.us Bookmark oriented Data Space&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id132cda80&quot;&gt;My personal WebID&lt;/a&gt; which is conduit to a Linked Data mesh covering vast variety of things I&amp;#39;ve opted to share with others via the Web (best viewed using a Linked Data aware User Agent like ODE).&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-07-24T08:20:01-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Important Things to Note about the World Wide Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-07-23#1564</atom:id>
  <atom:published>2009-07-23T13:27:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;Based on the prevalence of confusion re. the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id135eee50&quot;&gt;Linked Data meme&lt;/a&gt;, here are a few important points to remember about the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id1118b210&quot;&gt;World Wide Web&lt;/a&gt;.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Its an HTTP based Network Cluster within the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id1332a6e8&quot;&gt;Internet&lt;/a&gt; (remember: Networks are about meshes of Nodes connected by Links)&lt;/li&gt; &lt;li&gt;Its underlying &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; model is that of a Network (we&amp;#39;ve had Network Data models for eons. &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id13350310&quot;&gt;EAV&lt;/a&gt;/CR is an example)&lt;/li&gt; &lt;li&gt;Links are facilitated via URIs&lt;/li&gt; &lt;li&gt;Until recently the granularity of Networking on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; was scoped to Data Containers (documents) (due to prevalence of &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id12f7c078&quot;&gt;URL&lt;/a&gt; style links&lt;/li&gt; &lt;li&gt;The Linked Data meme adds Data Item (Datum) level granularity to World Wide Web networking via HTTP URIs&lt;/li&gt; &lt;li&gt;Data Items become Web Reference-able when you Identify/Name them using HTTP based URIs&lt;/li&gt; &lt;li&gt;An HTTP &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id135ffdb8&quot;&gt;URI&lt;/a&gt; implicitly binds a Web Reference-able Data Item (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id113afb60&quot;&gt;Entity&lt;/a&gt;, Datum, Data Object, Resource) to its Web Accessible Metadata&lt;/li&gt; &lt;li&gt;Web Accessible Metadata resides within Data Containers (documents or &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11402318&quot;&gt;information&lt;/a&gt; resources)&lt;/li&gt; &lt;li&gt;The representation of a Web Accessible Metadata container is negotiable&lt;/li&gt; &lt;li&gt;I am able to write and dispatch this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x770cbd0&quot;&gt;blog&lt;/a&gt; post courtesy of the Web features listed above&lt;/li&gt; &lt;li&gt;You are able to explore the many dimensions to data exposed by this blog should you decide to explore the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x7acd540&quot;&gt;Linked Data&lt;/a&gt; mesh exposed by this post&amp;#39;s HTTP URI (via its permalink permalink)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The HTTP URI is the secret sauce of the Web that is powerfully and unobtrusively reintroduced via the Linked Data meme (classic back to the future act). This powerful sauce possess a unique power courtesy of its inherent duality i.e., how it uniquely combines Data Item Identity (think keys in traditional DBMS parlance) with Data Access (e.g. access to negotiable representations of associated metadata).&lt;/p&gt; &lt;p&gt;As you can see, I&amp;#39;ve made no mention of RDF or &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1183bd48&quot;&gt;SPARQL&lt;/a&gt;, and I can still articulate the inherent value of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id132e7058&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; dimension that the &amp;quot;Linked Data&amp;quot; meme adds to the World Wide Web.&lt;/p&gt; &lt;p&gt;As per usual this post is a live demonstration of Linked Data (dog-food style) :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.semanticsincorporated.com/2009/07/if-linked-data-is-a-brand-it-has-big-problems-to-address.html&quot; id=&quot;link-id1171d4e8&quot;&gt;Greg Boutin&amp;#39;s post about Linked Data Brand Management&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://iandavis.com/blog/2009/07/the-linked-data-brand&quot; id=&quot;link-id12db0880&quot;&gt;Ian Davis&amp;#39; &amp;quot;Linked Data Brand&amp;quot; post&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://cloudofdata.com/2009/07/does-linked-data-need-rdf/&quot; id=&quot;link-id13537230&quot;&gt;Paul Miller&amp;#39;s &amp;quot;Does Linked Data need RDF&amp;quot; post&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-07-23T10:33:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Single Virtuoso host loads 110,500 triples-per-second on LUBM 8000</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-06-29#1563</atom:id>
  <atom:published>2009-06-29T16:12:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;LUBM load speed still seems to be a metric that is quoted in comparisons of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id142df6e8&quot;&gt;RDF&lt;/a&gt; stores. Consequently, we too measured the load time of LUBM 8000, 1,068-million triples, on the newest &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1389dfa0&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The real time for the load was 161m 3s. The rate was 110,532 triples-per-second. The hardware was one machine with 2 x Xeon 5410 (quad core, 2.33 GHz) and 16G 667 MHz RAM. The software was Virtuoso 6 Cluster, configured into 8 partitions (processes) — one partition per CPU core. Each partition had its database striped over 6 disks total; the 6 disks on the system were shared between the 8 database processes.&lt;/p&gt; &lt;p&gt;The load was done on 8 streams, one per server process. At the beginning of the load, the CPU usage was 740% with no disk; at the end, it was around 700% with 25% disk wait. 100% counts here for one CPU core or one disk being constantly busy.&lt;/p&gt; &lt;p&gt;The RDF store was configured with the default two indices over quads, these being GSPO and OGPS. Text indexing of literals was not enabled. No materialization of entailed triples was made.&lt;/p&gt; &lt;p&gt;We think that LUBM loading is not a realistic benchmark for the world but since other people publish such numbers, so do we.&lt;/p&gt;</atom:content>
  <atom:updated>2009-08-15T16:06:45.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Single Virtuoso host loads 110,500 triples-per-second on LUBM 8000</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-06-29#1562</atom:id>
  <atom:published>2009-06-29T16:12:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;LUBM load speed still seems to be a metric that is quoted in comparisons of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id142df6e8&quot;&gt;RDF&lt;/a&gt; stores. Consequently, we too measured the load time of LUBM 8000, 1,068-million triples, on the newest &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1389dfa0&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The real time for the load was 161m 3s. The rate was 110,532 triples-per-second. The hardware was one machine with 2 x Xeon 5410 (quad core, 2.33 GHz) and 16G 667 MHz RAM. The software was Virtuoso 6 Cluster, configured into 8 partitions (processes) — one partition per CPU core. Each partition had its database striped over 6 disks total; the 6 disks on the system were shared between the 8 database processes.&lt;/p&gt; &lt;p&gt;The load was done on 8 streams, one per server process. At the beginning of the load, the CPU usage was 740% with no disk; at the end, it was around 700% with 25% disk wait. 100% counts here for one CPU core or one disk being constantly busy.&lt;/p&gt; &lt;p&gt;The RDF store was configured with the default two indices over quads, these being GSPO and OGPS. Text indexing of literals was not enabled. No materialization of entailed triples was made.&lt;/p&gt; &lt;p&gt;We think that LUBM loading is not a realistic benchmark for the world but since other people publish such numbers, so do we.&lt;/p&gt;</atom:content>
  <atom:updated>2009-08-15T16:06:42.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Rules Simplified</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-06-26#1561</atom:id>
  <atom:published>2009-06-26T14:49:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;As a compliment to the most recent &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id11a6a9b8&quot;&gt;Linked Data Design Issues&lt;/a&gt; note by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id114c1ae8&quot;&gt;TimBL&lt;/a&gt;, I would like to add this subtle tweak to the enumerated rules:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Identify or Name things using HTTP URIs &lt;/li&gt; &lt;li&gt; Describe things using the RDF metadata model &lt;/li&gt; &lt;li&gt; Increase link &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; mesh density on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; by linking (referring) to things in other data spaces using their HTTP URIs. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt; If you perform the steps above, on any HTTP network (e.g. &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-iddbef1f0&quot;&gt;World Wide Web&lt;/a&gt;), you implicitly bind the Names/Identifiers of things to negotiable representations of their metadata (description) bearing documents. &lt;/p&gt; &lt;p&gt; Also note, you can create and deploy the resulting RDF metadata using any of the following approaches:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id14442c00&quot;&gt;RDFa&lt;/a&gt; within (X)HTML documents&lt;/li&gt; &lt;li&gt; N3, Turtle, TriX, RDF/XML etc. based documents &lt;/li&gt; &lt;li&gt;Programmatically generated variants of 1&amp;amp;2.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1546&quot; id=&quot;link-id1181ebf0&quot;&gt;What is the Linked Data meme about?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id13039a98&quot;&gt;Simple Explanation of RDF and Linked Data Dynamics&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-06-26T23:18:24.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>BBC Linked Data Meshup In 3 Steps</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-06-12#1560</atom:id>
  <atom:published>2009-06-12T18:09:08Z</atom:published>
  <atom:content type="html">&lt;h3&gt;Situation Analysis:&lt;/h3&gt; &lt;p&gt;Dr. Dre is one of the artists in the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1117a230&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10ff0fc0&quot;&gt;Space&lt;/a&gt; we host for the &lt;a href=&quot;http://dbpedia.org/resource/BBC&quot; id=&quot;link-id13cdba70&quot;&gt;BBC&lt;/a&gt;. He is also referenced in music oriented &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; spaces such as &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id119688a0&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://musicbrainz.org/&quot; id=&quot;link-id146f7d00&quot;&gt;MusicBrainz&lt;/a&gt; and &lt;a href=&quot;http://last.FM&quot; id=&quot;link-id15f50698&quot;&gt;Last.FM&lt;/a&gt; (to name a few). &lt;/p&gt; &lt;h3&gt;Challenge:&lt;/h3&gt; &lt;p&gt;How do I obtain a holistic view of the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id147a1490&quot;&gt;entity&lt;/a&gt; &amp;quot;Dr. Dre&amp;quot; across the BBC, MusicBrainz, and Last.FM data spaces? We know the BBC published Linked Data, but what about Last.FM and MusicBrainz? Both of these data spaces only expose XML or JSON data via REST APIs?&lt;/p&gt; &lt;h3&gt;Solution:&lt;/h3&gt; Simple 3 step Linked Data Meshup courtesy of &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; id=&quot;link-id147faf78&quot;&gt;Virtuoso&amp;#39;s in-built RDFizer Middleware&lt;/a&gt; &amp;quot;the Sponger&amp;quot; (think &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id115ecea0&quot;&gt;ODBC&lt;/a&gt; Driver Manager for the Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id11806418&quot;&gt;Web&lt;/a&gt;) and its numerous Cartridges (think ODBC Drivers for the Linked Data Web). &lt;h3&gt;Steps:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; Go to Last.FM and search using pattern: Dr. Dre (you will end up with this &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id11778f10&quot;&gt;URL&lt;/a&gt;: http://www.last.fm/music/Dr.+Dre)&lt;/li&gt; &lt;li&gt; Go to the Virtuoso powered &lt;a href=&quot;http://bbc.openlinksw.com&quot; id=&quot;link-id14f40338&quot;&gt;BBC Linked Data Space home page&lt;/a&gt; and enter: http://bbc.openlinksw.com/about/html/http://www.last.fm/music/Dr.+Dre&lt;/li&gt; &lt;li&gt; Go to the BBC Linked Data Space home page and type full text pattern (using default tab): Dr. Dre, then view &lt;a href=&quot;http://bbc.openlinksw.com/fct/rdfdesc/usage.vsp?g=http%3A%2F%2Fwww.bbc.co.uk%2Fmusic%2Fartists%2F5f6ab597-f57a-40da-be9e-adad48708203%23artist&amp;amp;tp=4&amp;amp;sid=519&amp;amp;urilookup=&amp;amp;orig_refr=http://bbc.openlinksw.com/describe/?url=http://www.bbc.co.uk/music/artists/5f6ab597-f57a-40da-be9e-adad48708203&quot; id=&quot;link-id119ac658&quot;&gt;Dr. Dre&amp;#39;s metadata via the Statistics Link&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;What Happened?&lt;/h3&gt; &lt;p&gt;The following took place:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id11a46fd8&quot;&gt;Sponger&lt;/a&gt; sent an HTTP GET to Last.FM&lt;/li&gt; &lt;li&gt; Distilled the &amp;quot;Artist&amp;quot; entity &amp;quot;Dr. Dre&amp;quot; from the page, and made a &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id1297cc68&quot;&gt;Linked Data graph&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Inverse Functional Property and sameAs reasoning handled the Meshup (augmented graph from a conjunctive query processing pipeline)&lt;/li&gt; &lt;li&gt;Links for &amp;quot;Dr. Dre&amp;quot; across &lt;a href=&quot;http://bbc.openlinksw.com/describe/?url=http%3A%2F%2Fdbpedia.org%2Fresource%2FDr._Dre&quot; id=&quot;link-id119e63e8&quot;&gt;BBC (sameAs), Last.FM (seeAlso), via DBpedia URI&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The &lt;a href=&quot;http://bbc.openlinksw.com/about/rdf/http/www.last.fm/music/Dr.+Dre#this&quot; id=&quot;link-id111f6130&quot;&gt;new enhanced URI for Dr. Dre&lt;/a&gt; now provides a rich holistic view of the aforementioned &amp;quot;Artist&amp;quot; entity. This URI is usable anywhere on the Web for Linked Data Conduction :-)&lt;/p&gt; &lt;h3&gt;Related (as in NearBy)&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.talis.com/n2/archives/617&quot; id=&quot;link-idf3e0898&quot;&gt;Augmenting Last.fm Data with BBC data on the Talis Platform&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-06-12T16:38:34.000046-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Understanding the BBC&#39;s Virtuoso Powered Linked Data Space</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-06-11#1559</atom:id>
  <atom:published>2009-06-11T21:59:31Z</atom:published>
  <atom:content type="html">&lt;p&gt; The &lt;a href=&quot;http://welcomebackstage.com/2009/06/bbc-backstage-sparql-endpoint/&quot; id=&quot;link-id12969860&quot;&gt;BBC&amp;#39;s recently announced Linked Data space for Programmes and Music data&lt;/a&gt;, joins a growing list of immediately useful &amp;quot;&lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id110918f8&quot;&gt;Virtuoso&lt;/a&gt; Powered&amp;quot; linked data spaces, driving the burgeoning Web of Linked Data. Others include: &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id12c0e720&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id14ee63a8&quot;&gt;Bio2RDF&lt;/a&gt;, NeuroCommons etc (the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2009-03-27.html&quot; id=&quot;link-id129a8588&quot;&gt;click friendly version of the LOD-Cloud&lt;/a&gt; diagram reveals a snapshot of other Virtuoso driven linked data spaces).&lt;/p&gt; &lt;h3&gt;Why is it important?&lt;/h3&gt; &lt;p&gt; As a leading media organization, the BBC&amp;#39;s use of Linked Data provides a clear beacon to other media players re. the imminence of a serious Linked Data induced sector inflection. In a nutshell, every Web Site has to evolve into a Linked Data Space: a location on the Web that provides granular access to discrete data items in line with the core principles of the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id11a14710&quot;&gt;Linked Data meme&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; Remember, the essence of the Linked Data meme is simply this: you reference data items and access their metadata, in variety of formats via a single HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1136b1c8&quot;&gt;URI&lt;/a&gt;. This approach to Web data publishing is compatible with any HTTP aware user agent (e.g., your Web Browser or tools &amp;amp; applications that provide abstracted access to HTTP).&lt;/p&gt; &lt;h3&gt;How Do I use it?&lt;/h3&gt; &lt;p&gt;There a number of very powerful things available to end-users and developers alike.&lt;/p&gt; &lt;h4&gt;End-Users:&lt;/h4&gt; &lt;p&gt; The most powerful feature of our variant of the BBC&amp;#39;s Linked Data Space is the exposure of Faceted Find (think Search++ and beyond). Thus, you can go the the &lt;a href=&quot;http://bbc.openlinksw.com&quot; id=&quot;link-id12a32770&quot;&gt;home page of the service&lt;/a&gt; and commence data discovery and exploration via any of the following interfaces:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id1179d618&quot;&gt;Full Text Search&lt;/a&gt; Tab -- type in a full text pattern and then experience &lt;a href=&quot;http://bbc.openlinksw.com/facet_doc.html&quot; id=&quot;link-id12c6dab0&quot;&gt;Linked Data Entity Ranking as opposed to Page Ranking&lt;/a&gt; &lt;/li&gt; &lt;li&gt;URI Lookup (By Label) Tab -- type in part of a URI and let the system auto-complete by looking up Entity Labels&lt;/li&gt; &lt;li&gt;URI Lookup (Raw String Pattern) Tab -- type in part of a URI and let the system auto-complete by looking up the raw URI&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bbc.openlinksw.com/ode/&quot; id=&quot;link-id114b53c8&quot;&gt;OpenLink Data Explorer Service&lt;/a&gt; -- &amp;quot;deceptively simple&amp;quot; Linked Data explorer and Data Mesher (simply type in a URI or Text pattern, then view the data via a myriad of entity type specific viewer tabs).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Once you are comfortable with at least one of the items above, you can exploit the system further by performing any of the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://bbc.openlinksw.com/page/void/Dataset&quot; id=&quot;link-id117616c0&quot;&gt;Explore the Linked Data Space via Data Dictionary&lt;/a&gt; -- click on a Named Data Set URI and then &lt;a href=&quot;http://bbc.openlinksw.com/describe/?url=http%3A%2F%2Fpurl.org%2Fontology%2Fpo%2FEpisode&quot; id=&quot;link-id11664778&quot;&gt;explore Class instances&lt;/a&gt; (rdf:type property values) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bbc.openlinksw.com/fct/rdfdesc/usage.vsp?g=http%3A%2F%2Fwww.bbc.co.uk%2Fmusic%2Fartists%2F5f6ab597-f57a-40da-be9e-adad48708203%23artist&amp;amp;tp=4&amp;amp;sid=519&amp;amp;urilookup=&amp;amp;orig_refr=http://bbc.openlinksw.com/describe/?url=http://www.bbc.co.uk/music/artists/5f6ab597-f57a-40da-be9e-adad48708203&quot; id=&quot;link-id128a1aa8&quot;&gt;Explore Entity Metadata&lt;/a&gt; -- currently labeled &amp;quot;Statistics&amp;quot; but really is &amp;quot;Metadata&amp;quot; that describes data about an Entity (how you discern identifier co-reference, indirect identifiers, references from other data sets, and provenance/source graphs).&lt;/li&gt; &lt;/ul&gt; &lt;h4&gt; &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1136cc60&quot;&gt;Information&lt;/a&gt; Architects &amp;amp; Developers&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Bare bones &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id13c15448&quot;&gt;SPARQL&lt;/a&gt; Endpoint -- usable by SPARQL aware user agents &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bbc.openlinksw.com/sparql_demo/&quot; id=&quot;link-id114ed7f0&quot;&gt;SPARQL Query Tool&lt;/a&gt; -- type in SPARQL and interact with result pages that enable URI navigation (de-referencing)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bbc.openlinksw.com/isparql&quot; id=&quot;link-id12a25b38&quot;&gt;iSPARQL Query By Example&lt;/a&gt; -- paint your SPARQL Query and Learn &lt;a href=&quot;http://wikis.openlinksw.com/dataspace/owiki/wiki/OATWikiWeb/InteractiveSparqlQueryBuilder&quot; id=&quot;link-id13c0c578&quot;&gt;SPARQL by Example&lt;/a&gt; (just take defaults and then click &amp;quot;OK&amp;quot; to get in)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtFacetBrowserInstallConfig&quot; id=&quot;link-id15001fe0&quot;&gt;Virtuoso Facets API&lt;/a&gt; - REST API for Faceted Browsing &amp;amp; Navigation across Linked Data Set Dimensions.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Disambiguated Search (aka. Search++ or Find)&lt;/h3&gt; &lt;p&gt; In line with the time-tested &amp;quot;embrace and extend&amp;quot; pattern, we provide Full Text search capability, but unlike Google, Yahoo!, Bing and other search engines, we don&amp;#39;t use use &amp;quot;Page Rank&amp;quot; algorithm to sort results; instead, we use an &amp;quot;Entity Rank&amp;quot; algorithm since we are dealing with an RDF based Graph model DBMS where links exist between entities across instance data and data dictionary (vocabularies, schemas, ontologies) boundaries. In addition, when you get results (by clicking &amp;quot;show values&amp;quot; or &amp;quot;show values with distinct counts&amp;quot;) that list entities associated with a full text search pattern, we take a quantum leap beyond search engines by allowing you to use &amp;quot;Entity Type&amp;quot; and/or &amp;quot;Entity Properties&amp;quot; (all of these have HTTP URIs too) to set your own &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id13c15c30&quot;&gt;context&lt;/a&gt; for what you seek.&lt;/p&gt; &lt;p&gt;Much more to come in the form of &lt;a href=&quot;http://bbc.openlinksw.com/fct/facet.vsp?cmd=featured&amp;amp;sid=423&amp;amp;no_qry=1&quot; id=&quot;link-id128a0fd0&quot;&gt;BBC specific demo queries&lt;/a&gt; and tutorials :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; Live &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id14eb3010&quot;&gt;LOD Cloud Cache&lt;/a&gt; instance that combines BBC data with other data sets from the LOD Cloud (in a single Virtuoso RDF DBMS hosting 5 Billion+ triples &amp;amp; counting) &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-06-26T23:15:13.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Comparing Virtuoso Performance on Different Processors</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-05-28#1558</atom:id>
  <atom:published>2009-05-28T14:54:59Z</atom:published>
  <atom:content type="html">&lt;p&gt;Over the years we have run &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x16735e20&quot;&gt;Virtuoso&lt;/a&gt; on different hardware. We will here give a few figures that help identify the best price point for machines running Virtuoso.&lt;/p&gt; &lt;p&gt;Our test is very simple: &lt;i&gt;Load 20 warehouses of &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x16e0dba8&quot;&gt;TPC-C&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x14ff4f80&quot;&gt;data&lt;/a&gt;, and then run one client per warehouse for 10,000 new orders&lt;/i&gt;. The way this is set up, disk I/O does not play a role and lock contention between the clients is minimal.&lt;/p&gt; &lt;p&gt;The test essentially has 20 server and 20 client threads running the same workload in parallel. The load time gives the single thread number; the 20 clients run gives the multi-threaded number. The test uses about 2-3 GB of data, so all is in RAM but is large enough not to be all in processor cache.&lt;/p&gt; &lt;p&gt;All times reported are real times, starting from the start of the first client and ending with the completion of the last client.&lt;/p&gt; &lt;p&gt;Do not confuse these results with official TPC-C. The measurement protocols are entirely incomparable.&lt;/p&gt; &lt;style type=&quot;text/css&quot;&gt; TABLE { background: none; border: none } TH { text-align: center; font-weight: bold } TR.top { background: } TD { text-align: center; border: none } &lt;/style&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;Test&lt;/th&gt; &lt;th&gt;Platform&lt;/th&gt; &lt;th&gt;Load&lt;br /&gt;(seconds)&lt;/th&gt; &lt;th&gt;Run&lt;br /&gt;(seconds)&lt;/th&gt; &lt;th&gt;GHz / cores / threads&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Amazon &lt;a href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0x15d68e20&quot;&gt;EC2&lt;/a&gt; Extra Large&lt;br /&gt;(4 virtual cores)&lt;/td&gt; &lt;td&gt;340&lt;/td&gt; &lt;td&gt;42&lt;/td&gt; &lt;td&gt;1.2 GHz? / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Amazon EC2 Extra Large&lt;br /&gt;(4 virtual cores)&lt;/td&gt; &lt;td&gt;305&lt;/td&gt; &lt;td&gt;43.3&lt;/td&gt; &lt;td&gt;1.2 GHz? / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2&lt;/td&gt; &lt;td&gt;1 x dual-core AMD 5900&lt;/td&gt; &lt;td&gt;263&lt;/td&gt; &lt;td&gt;58.2&lt;/td&gt; &lt;td&gt;2.9 GHz / 2 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;2 x dual-core Xeon 5130 (&amp;quot;Woodcrest&amp;quot;)&lt;/td&gt; &lt;td&gt;245&lt;/td&gt; &lt;td&gt;35.7&lt;/td&gt; &lt;td&gt;2.0 GHz / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt;2 x quad-core Xeon 5410 (&amp;quot;Harpertown&amp;quot;)&lt;/td&gt; &lt;td&gt;237&lt;/td&gt; &lt;td&gt;18.0&lt;/td&gt; &lt;td&gt;2.33 GHz / 8 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;5&lt;/td&gt; &lt;td&gt;2 x quad-core Xeon 5520 (&amp;quot;Nehalem&amp;quot;)&lt;/td&gt; &lt;td&gt;162&lt;/td&gt; &lt;td&gt;18.3&lt;/td&gt; &lt;td&gt;2.26 GHz / 8 / 2&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We tried two different EC2 instances to see if there would be variation. The variation was quite small. The tested EC2 instances costs 20 US cents per hour. The AMD dual-core costs 550 US dollars with 8G. The 3 Xeon configurations are Supermicro boards with 667MHz memory for the Xeon 5130 (&amp;quot;Woodcrest&amp;quot;) and Xeon 5410 (&amp;quot;Harpertown&amp;quot;), and 800MHz memory for the Nehalem. The Xeon systems cost between 4000 and 7000 US dollars, with 5000 for a configuration with 2 x Xeon 5520 (&amp;quot;Nehalem&amp;quot;), 72 GB RAM, and 8 x 500 GB SATA disks.&lt;/p&gt; &lt;p&gt; &lt;i&gt;Caveat: Due to slow memory (we could not get faster within available time), the results for the Nehalem do not take full advantage of its principal edge over the previous generation, i.e., memory subsystem. We&amp;#39;ll see another time with faster memories.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The operating systems were various 64 bit Linux distributions.&lt;/p&gt; &lt;p&gt;We did some further measurements comparing Harpertown and Nehalem processors. The Nehalem chip was a bit faster for a slightly lower clock but we did not see any of the twofold and greater differences advertised by Intel.&lt;/p&gt; &lt;p&gt;We tried some &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1460b688&quot;&gt;RDF&lt;/a&gt; operations on the two last systems:&lt;/p&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;operation&lt;/th&gt; &lt;th&gt; Harpertown&lt;/th&gt; &lt;th&gt;Nehalem&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Build text index for &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x16a94590&quot;&gt;DBpedia&lt;/a&gt;&lt;/th&gt; &lt;td&gt;1080s&lt;/td&gt; &lt;td&gt;770s&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0xc37f380&quot;&gt;Entity&lt;/a&gt; Rank iteration&lt;/th&gt; &lt;td&gt;263s&lt;/td&gt; &lt;td&gt;251s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Then we tried to see if the core multithreading of Nehalem could be seen anywhere. To this effect, we ran the Fibonacci function in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x15842a20&quot;&gt;SQL&lt;/a&gt; to serve as an example of an all in-cache integer operation. 16 concurrent operations took exactly twice as long as 8 concurrent ones, as expected.&lt;/p&gt; &lt;p&gt;For something that used memory, we took a count of RDF quads on two different indices, getting the same count. The database was a cluster setup with one process per core, so a count involved one thread per core. The counts in series took 5.02s and in parallel they took 4.27s.&lt;/p&gt; &lt;p&gt;Then we took a more memory intensive piece that read the RDF quads table in the order of one index and for each row checked that there is the equal row on another, differently-partitioned index. This is a cross-partition join. One of the indices is read sequentially and the other at random. The throughput can be reported as random-lookups-per-second. The data was English DBpedia, about 140M triples. One such query takes a couple of minutes with a 650% CPU utilization. Running multiple such queries should show effects of core multithreading since we expect frequent cache misses.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;On the host OS of the Nehalem system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt;503&lt;/td&gt; &lt;td&gt;906,413&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt;1263&lt;/td&gt; &lt;td&gt;1,578,585&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;3 queries&lt;/th&gt; &lt;td&gt;1204&lt;/td&gt; &lt;td&gt;1,566,849&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;li&gt;In a VM under Xen, on the Nehalem system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt;652&lt;/td&gt; &lt;td&gt;799,293&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt;1266&lt;/td&gt; &lt;td&gt;1,486,710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;3 queries&lt;/th&gt; &lt;td&gt;1222&lt;/td&gt; &lt;td&gt;1,484,093&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;li&gt; On the host OS of the Harpertown system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt; 648 &lt;/td&gt; &lt;td&gt; 1,041,448 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt; 708 &lt;/td&gt; &lt;td&gt; 1,124,866 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The CPU percentages are as reported by the OS: user + system CPU divided by real time.&lt;/p&gt; &lt;p&gt;So, Nehalem is in general somewhat faster, around 20-30%, than Harpertown. The effect of core multithreading can be noticed but is not huge, another 20% or so for situations with more threads than cores. The join where Harpertown did better could be attributed to its larger cache — 12 MB vs 8 MB.&lt;/p&gt; &lt;p&gt;We see that Xen has a measurable but not prohibitive overhead; count a little under 10% for everything, also tasks with no I/O. The VM was set up to have all CPU for the test and the queries did not do disk I/O.&lt;/p&gt; &lt;p&gt;The executables were compiled with &lt;code&gt;gcc&lt;/code&gt; with default settings. Specifying &lt;code&gt;-march=nocona&lt;/code&gt; (Core 2 target) dropped the cross-partition join time mentioned above from 128s to 122s on Harpertown. We did not try this on Nehalem but presume the effect would be the same, since the out-of-order unit is not much different. We did not do anything about process-to-memory affinity on Nehalem, which is a non-uniform architecture. We would expect this to increase performance since we have many equal size processes with even load.&lt;/p&gt; &lt;p&gt;The mainstay of the Nehalem value proposition is a better memory subsystem. Since the unit we got was at 800 MHz memory, we did not see any great improvement. So if you buy Nehalem, you should make sure it is with 1333 MHz memory, else the best case will not be over 50% over a 667 MHz Core 2-based Xeon.&lt;/p&gt; &lt;p&gt;Nehalem remains a better deal for us because of more memory per board. One Nehalem box with 72 GB costs less than two Harpertown boxes with 32 GB and offers almost the same performance. Having a lot of memory in a small space is key. With faster memory, it might even outperform two Harpertown boxes, but this remains to be seen.&lt;/p&gt; &lt;p&gt;If space were not a constraint, we could make a cluster of 12 small workstations for the price of our largest system and get still more memory and more processor power per unit of memory. The Nehalem box was almost 4x faster than the AMD box but then it has 9x the memory, so the CPU to memory ratio might be better with the smaller boxes.&lt;/p&gt;</atom:content>
  <atom:updated>2009-05-28T11:15:41.000006-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Comparing Virtuoso Performance on Different Processors</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-05-28#1557</atom:id>
  <atom:published>2009-05-28T14:54:59Z</atom:published>
  <atom:content type="html">&lt;p&gt;Over the years we have run &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xd420b90&quot;&gt;Virtuoso&lt;/a&gt; on different hardware. We will here give a few figures that help identify the best price point for machines running Virtuoso.&lt;/p&gt; &lt;p&gt;Our test is very simple: &lt;i&gt;Load 20 warehouses of &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0xdaaec90&quot;&gt;TPC-C&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xca1b7e0&quot;&gt;data&lt;/a&gt;, and then run one client per warehouse for 10,000 new orders&lt;/i&gt;. The way this is set up, disk I/O does not play a role and lock contention between the clients is minimal.&lt;/p&gt; &lt;p&gt;The test essentially has 20 server and 20 client threads running the same workload in parallel. The load time gives the single thread number; the 20 clients run gives the multi-threaded number. The test uses about 2-3 GB of data, so all is in RAM but is large enough not to be all in processor cache.&lt;/p&gt; &lt;p&gt;All times reported are real times, starting from the start of the first client and ending with the completion of the last client.&lt;/p&gt; &lt;p&gt;Do not confuse these results with official TPC-C. The measurement protocols are entirely incomparable.&lt;/p&gt; &lt;style type=&quot;text/css&quot;&gt; TABLE { background: none; border: none } TH { text-align: center; font-weight: bold } TR.top { background: } TD { text-align: center; border: none } &lt;/style&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;Test&lt;/th&gt; &lt;th&gt;Platform&lt;/th&gt; &lt;th&gt;Load&lt;br /&gt;(seconds)&lt;/th&gt; &lt;th&gt;Run&lt;br /&gt;(seconds)&lt;/th&gt; &lt;th&gt;GHz / cores / threads&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Amazon &lt;a href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0xdaab030&quot;&gt;EC2&lt;/a&gt; Extra Large&lt;br /&gt;(4 virtual cores)&lt;/td&gt; &lt;td&gt;340&lt;/td&gt; &lt;td&gt;42&lt;/td&gt; &lt;td&gt;1.2 GHz? / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Amazon EC2 Extra Large&lt;br /&gt;(4 virtual cores)&lt;/td&gt; &lt;td&gt;305&lt;/td&gt; &lt;td&gt;43.3&lt;/td&gt; &lt;td&gt;1.2 GHz? / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2&lt;/td&gt; &lt;td&gt;1 x dual-core AMD 5900&lt;/td&gt; &lt;td&gt;263&lt;/td&gt; &lt;td&gt;58.2&lt;/td&gt; &lt;td&gt;2.9 GHz / 2 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;2 x dual-core Xeon 5130 (&amp;quot;Woodcrest&amp;quot;)&lt;/td&gt; &lt;td&gt;245&lt;/td&gt; &lt;td&gt;35.7&lt;/td&gt; &lt;td&gt;2.0 GHz / 4 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt;2 x quad-core Xeon 5410 (&amp;quot;Harpertown&amp;quot;)&lt;/td&gt; &lt;td&gt;237&lt;/td&gt; &lt;td&gt;18.0&lt;/td&gt; &lt;td&gt;2.33 GHz / 8 / 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;5&lt;/td&gt; &lt;td&gt;2 x quad-core Xeon 5520 (&amp;quot;Nehalem&amp;quot;)&lt;/td&gt; &lt;td&gt;162&lt;/td&gt; &lt;td&gt;18.3&lt;/td&gt; &lt;td&gt;2.26 GHz / 8 / 2&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;We tried two different EC2 instances to see if there would be variation. The variation was quite small. The tested EC2 instances costs 20 US cents per hour. The AMD dual-core costs 550 US dollars with 8G. The 3 Xeon configurations are Supermicro boards with 667MHz memory for the Xeon 5130 (&amp;quot;Woodcrest&amp;quot;) and Xeon 5410 (&amp;quot;Harpertown&amp;quot;), and 800MHz memory for the Nehalem. The Xeon systems cost between 4000 and 7000 US dollars, with 5000 for a configuration with 2 x Xeon 5520 (&amp;quot;Nehalem&amp;quot;), 72 GB RAM, and 8 x 500 GB SATA disks.&lt;/p&gt; &lt;p&gt; &lt;i&gt;Caveat: Due to slow memory (we could not get faster within available time), the results for the Nehalem do not take full advantage of its principal edge over the previous generation, i.e., memory subsystem. We&amp;#39;ll see another time with faster memories.&lt;/i&gt; &lt;/p&gt; &lt;p&gt;The operating systems were various 64 bit Linux distributions.&lt;/p&gt; &lt;p&gt;We did some further measurements comparing Harpertown and Nehalem processors. The Nehalem chip was a bit faster for a slightly lower clock but we did not see any of the twofold and greater differences advertised by Intel.&lt;/p&gt; &lt;p&gt;We tried some &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xce85438&quot;&gt;RDF&lt;/a&gt; operations on the two last systems:&lt;/p&gt; &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;operation&lt;/th&gt; &lt;th&gt; Harpertown&lt;/th&gt; &lt;th&gt;Nehalem&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;Build text index for &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xab826a8&quot;&gt;DBpedia&lt;/a&gt;&lt;/th&gt; &lt;td&gt;1080s&lt;/td&gt; &lt;td&gt;770s&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0xcbb9938&quot;&gt;Entity&lt;/a&gt; Rank iteration&lt;/th&gt; &lt;td&gt;263s&lt;/td&gt; &lt;td&gt;251s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;Then we tried to see if the core multithreading of Nehalem could be seen anywhere. To this effect, we ran the Fibonacci function in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xcd62218&quot;&gt;SQL&lt;/a&gt; to serve as an example of an all in-cache integer operation. 16 concurrent operations took exactly twice as long as 8 concurrent ones, as expected.&lt;/p&gt; &lt;p&gt;For something that used memory, we took a count of RDF quads on two different indices, getting the same count. The database was a cluster setup with one process per core, so a count involved one thread per core. The counts in series took 5.02s and in parallel they took 4.27s.&lt;/p&gt; &lt;p&gt;Then we took a more memory intensive piece that read the RDF quads table in the order of one index and for each row checked that there is the equal row on another, differently-partitioned index. This is a cross-partition join. One of the indices is read sequentially and the other at random. The throughput can be reported as random-lookups-per-second. The data was English DBpedia, about 140M triples. One such query takes a couple of minutes with a 650% CPU utilization. Running multiple such queries should show effects of core multithreading since we expect frequent cache misses.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;On the host OS of the Nehalem system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt;503&lt;/td&gt; &lt;td&gt;906,413&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt;1263&lt;/td&gt; &lt;td&gt;1,578,585&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;3 queries&lt;/th&gt; &lt;td&gt;1204&lt;/td&gt; &lt;td&gt;1,566,849&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;li&gt;In a VM under Xen, on the Nehalem system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt;652&lt;/td&gt; &lt;td&gt;799,293&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt;1266&lt;/td&gt; &lt;td&gt;1,486,710&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;3 queries&lt;/th&gt; &lt;td&gt;1222&lt;/td&gt; &lt;td&gt;1,484,093&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;li&gt; On the host OS of the Harpertown system — &lt;table align=&quot;center&quot; cellspacing=&quot;10&quot;&gt; &lt;tr&gt; &lt;th&gt;n&lt;/th&gt; &lt;th&gt;cpu%&lt;/th&gt; &lt;th&gt;rows per second&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;1 query&lt;/th&gt; &lt;td&gt; 648 &lt;/td&gt; &lt;td&gt; 1,041,448 &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th&gt;2 queries&lt;/th&gt; &lt;td&gt; 708 &lt;/td&gt; &lt;td&gt; 1,124,866 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The CPU percentages are as reported by the OS: user + system CPU divided by real time.&lt;/p&gt; &lt;p&gt;So, Nehalem is in general somewhat faster, around 20-30%, than Harpertown. The effect of core multithreading can be noticed but is not huge, another 20% or so for situations with more threads than cores. The join where Harpertown did better could be attributed to its larger cache — 12 MB vs 8 MB.&lt;/p&gt; &lt;p&gt;We see that Xen has a measurable but not prohibitive overhead; count a little under 10% for everything, also tasks with no I/O. The VM was set up to have all CPU for the test and the queries did not do disk I/O.&lt;/p&gt; &lt;p&gt;The executables were compiled with &lt;code&gt;gcc&lt;/code&gt; with default settings. Specifying &lt;code&gt;-march=nocona&lt;/code&gt; (Core 2 target) dropped the cross-partition join time mentioned above from 128s to 122s on Harpertown. We did not try this on Nehalem but presume the effect would be the same, since the out-of-order unit is not much different. We did not do anything about process-to-memory affinity on Nehalem, which is a non-uniform architecture. We would expect this to increase performance since we have many equal size processes with even load.&lt;/p&gt; &lt;p&gt;The mainstay of the Nehalem value proposition is a better memory subsystem. Since the unit we got was at 800 MHz memory, we did not see any great improvement. So if you buy Nehalem, you should make sure it is with 1333 MHz memory, else the best case will not be over 50% over a 667 MHz Core 2-based Xeon.&lt;/p&gt; &lt;p&gt;Nehalem remains a better deal for us because of more memory per board. One Nehalem box with 72 GB costs less than two Harpertown boxes with 32 GB and offers almost the same performance. Having a lot of memory in a small space is key. With faster memory, it might even outperform two Harpertown boxes, but this remains to be seen.&lt;/p&gt; &lt;p&gt;If space were not a constraint, we could make a cluster of 12 small workstations for the price of our largest system and get still more memory and more processor power per unit of memory. The Nehalem box was almost 4x faster than the AMD box but then it has 9x the memory, so the CPU to memory ratio might be better with the smaller boxes.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:28:06.354659-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Library of Congress &amp; Reasonable Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-05-05#1556</atom:id>
  <atom:published>2009-05-05T17:53:24Z</atom:published>
  <atom:content type="html">&lt;p&gt; While exploring the &lt;a href=&quot;http://id.loc.gov/authorities/&quot; id=&quot;link-id1488cca8&quot;&gt;Subject Headings Linked Data Space&lt;/a&gt; (LCSH) recently unveiled by the &lt;a href=&quot;http://id.loc.gov/&quot; id=&quot;link-id1672ad10&quot;&gt;Library of Congress&lt;/a&gt;, I noticed that the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id158fef78&quot;&gt;URI&lt;/a&gt; for the subject heading: &lt;a href=&quot;http://id.loc.gov/authorities/sh95000541#concept&quot; id=&quot;link-id14c8d3e8&quot;&gt;World Wide Web&lt;/a&gt;, exposes an &amp;quot;owl:sameAs&amp;quot; link to resource URI: &amp;quot;info:lc/authorities/sh95000541&amp;quot; -- in fact, a URI.URN that isn&amp;#39;t HTTP protocol scheme based.&lt;/p&gt; &lt;p&gt; The observations above triggered a &lt;a href=&quot;http://search.twitter.com/search?q=&amp;amp;ands=&amp;amp;phrase=&amp;amp;ors=&amp;amp;nots=&amp;amp;tag=linkeddata&amp;amp;lang=all&amp;amp;from=kidehen&amp;amp;to=edsu&amp;amp;ref=&amp;amp;near=&amp;amp;within=15&amp;amp;units=mi&amp;amp;since=2009-05-01&amp;amp;until=2009-05-05&amp;amp;rpp=10&quot; id=&quot;link-id14e21ba0&quot;&gt;discussion thread on Twitter&lt;/a&gt; that involved: &lt;a href=&quot;http://twitter.com/edsu&quot; id=&quot;link-ide411808&quot;&gt;@edsu&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/iand&quot; id=&quot;link-id11915ed0&quot;&gt;@iand&lt;/a&gt;, and &lt;a href=&quot;http://twitter.com/kidehen&quot; id=&quot;link-id1519c028&quot;&gt;moi&lt;/a&gt;. Naturally, it morphed into a live demonstration of: human vs machine, interpretation of claims expressed in the RDF graph.&lt;/p&gt; &lt;h3&gt;What makes this whole thing interesting?&lt;/h3&gt; &lt;p&gt;It showcases (in Man vs Machine style) the issue of unambiguously discerning the meaning of the owl:sameAs claim expressed in the LCSH &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id17004728&quot;&gt;Linked Data Space&lt;/a&gt;.&lt;/p&gt; &lt;h4&gt;Perspectives &amp;amp; Potential Confusion&lt;/h4&gt; &lt;p&gt; From the Linked Data perspective, it may spook a few people to see owl:sameAs values such as: &amp;quot;info:lc/authorities/sh95000541&amp;quot;, that cannot be de-referenced using HTTP. &lt;/p&gt; &lt;p&gt; It may confuse a few people or user agents that see URI de-referencing as not necessarily HTTP specific, thereby attempting to de-reference the URI.URN on the assumption that it&amp;#39;s associated with a &amp;quot;&lt;a href=&quot;http://www.handle.net/overviews/overview.html&quot; id=&quot;link-id155517a8&quot;&gt;handle system&lt;/a&gt;&amp;quot;, for instance.&lt;/p&gt; &lt;p&gt; It may even confuse RDFizer / RDFization middleware that use owl:sameAs as a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; provider attribution mechanism via hint/nudge URI values derived from original content / data URI.URLs that de-reference to nothing e.g., an original resource URI.&lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id119e0d80&quot;&gt;URL&lt;/a&gt; plus &amp;quot;#this&amp;quot; which produces URI.URN-URL -- think of this pattern as &amp;quot;owl:shameAs&amp;quot; in a sense :-)&lt;/p&gt; &lt;h3&gt; Unambiguously Discerning Meaning&lt;/h3&gt; &lt;p&gt; Simply bring OWL reasoning (inference rules and reasoners) into the mix, thereby negating human dialogue about interpretation which ultimately unveils a mesh of orthogonal view points. Remember, OWL is all about infrastructure that ultimately enables you to express yourself clearly i.e., say what you mean, and mean what you say. &lt;/p&gt; &lt;h3&gt;Path to Clarity (using &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1537aa68&quot;&gt;Virtuoso&lt;/a&gt;, its in-built Sponger Middleware, and Inference Engine):&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;GET the data into the Virtuoso Quad store -- what the sponger does via its &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://id.loc.gov/authorities/sh95000541#concept&quot; id=&quot;link-id1669fa40&quot;&gt;URIBurner Service&lt;/a&gt; (while following designated predicates such as owl:sameAs in case they point to other mesh-able data sources)&lt;/li&gt; &lt;li&gt;Query the data in Quad Store with &amp;quot;owl:sameAs&amp;quot; inference rules enabled&lt;/li&gt; &lt;li&gt;Repeat the last step with the inference rules excluded.&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Actual &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id17374110&quot;&gt;SPARQL&lt;/a&gt; Queries:&lt;/h4&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/DAV/home/demo/Public/Queries/DataWeb/lcsh_www_subject_heading.isparql&quot; id=&quot;link-id16c986d0&quot;&gt;SPARQL Query against the HTTP based Subject Heading URI for WWW&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/DAV/home/demo/Public/Queries/DataWeb/lcsh_www_subject_heading_sameAs_inference_on.isparql&quot; id=&quot;link-id16d4fea0&quot;&gt;SPARQL Query (with reasoning via inference rule for owl:sameAs)&lt;/a&gt; against the URN based Subject Heading URI for WWW&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/DAV/home/demo/Public/Queries/DataWeb/lcsh_www_subject_heading_no_sameAs_inference_on.isparql&quot; id=&quot;link-id11bad768&quot;&gt;SPARQL Query (*without* reasoning via inference rule for owl:sameAs)&lt;/a&gt; against the URN based Subject Heading URI for WWW&lt;/li&gt; &lt;/ul&gt; &lt;h4&gt;Observations:&lt;/h4&gt; &lt;p&gt; The &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-ide6acf68&quot;&gt;SPARQL&lt;/a&gt; queries against the Graph generated and automatically populated by the Sponger reveal -- without human intervention-- that: &amp;quot;info:lc/authorities/sh95000541&amp;quot;, is just an alternative name for &amp;lt; xmlns=&amp;quot;http&amp;quot; id.loc.gov=&amp;quot;id.loc.gov&amp;quot; authorities=&amp;quot;authorities&amp;quot; sh95000541=&amp;quot;sh95000541&amp;quot; concept=&amp;quot;concept&amp;quot;&amp;gt;, and that the graph produced by LCSH is self-describing enough for an OWL reasoner to figure this all out courtesy of the &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://www.w3.org/2002/07/owl%23sameAs&quot; id=&quot;link-id13e364b0&quot;&gt;owl:sameAs&lt;/a&gt; property :-).&lt;/p&gt; &lt;p&gt;Hopefully, this post also provides a simple example of how &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id158a3fe8&quot;&gt;OWL&lt;/a&gt; facilitates &amp;quot;Reasonable Linked Data&amp;quot;. &lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1455&quot; id=&quot;link-id164e19f8&quot;&gt;State of the Linked Data Web&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.mkbergman.com/?p=474&quot; id=&quot;link-id11973d10&quot;&gt;Making Linked Data Reasonable Using Description Logics Series&lt;/a&gt; - post by &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mkbergman#this&quot; id=&quot;link-id1184bfb8&quot;&gt;Mike Bergman&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-05-06T14:26:15.000034-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Social Web Camp (#5 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-30#1555</atom:id>
  <atom:published>2009-04-30T16:14:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Last of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x112efd58&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;The social networks camp was interesting, with a special meeting around Twitter. Half jokingly, we (that is, the OpenLink folks attending) concluded that societies would never be completely classless, although mobility between, as well as criteria for membership in, given classes would vary with time and circumstance. Now, there would be a new class division between people for whom micro-blogging is obligatory and those for whom it is an option.&lt;/p&gt; &lt;p&gt;By my experience, a great deal is possible in a short time, but this possibility depends on focus and concentration. These are increasingly rare. I am a great believer in core competence and focus. This is not only for geeks — one can have a lot of breadth-of-scope but this too depends on not getting sidetracked by constant &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x14e380b8&quot;&gt;information&lt;/a&gt; overload.&lt;/p&gt; &lt;p&gt;Insofar as personal success depends on constant reaction to online social media, this comes at a cost in time and focus and this cost will have to be managed somehow, for example by automation or outsourcing. But if the social media is only automated fronts twitting and re-twitting among themselves, a bit like electronic trading systems do with securities, with or without human operators, the value of the medium decreases.&lt;/p&gt; &lt;p&gt;There are contradictory requirements. On one hand, what is said in electronic media is essentially permanent, so one had best only say things that are well considered. On the other hand, one must say these things without adequate time for reflection or analysis. To cope with this, one must have a well-rehearsed position that is compacted so that it fits in a short format and is easy to remember and unambiguous to express. A culture of pre-cooked fast-food advertising cuts down on depth. Real-world things are complex and multifaceted. Besides, prevalent patterns of communication train the brain for a certain mode of functioning. If we train for rapid-fire 140-character messaging, we optimize one side but probably at the expense of another. In the meantime, the world continues developing increased complexity by all kinds of emergent effects. Connectivity is good but don&amp;#39;t get lost in it.&lt;/p&gt; &lt;p&gt;There is &lt;a href=&quot;https://www.cia.gov/library/center-for-the-study-of-intelligence/csi-publications/books-and-monographs/psychology-of-intelligence-analysis/index.html&quot; id=&quot;link-id170cb010&quot;&gt;a CIA memorandum about how analysts misinterpret data and see what they want to see&lt;/a&gt;. This is a relevant resource for understanding some psychology of perception and memory. With the information overload, largely driven by user generated content, interpreting fragmented and variously-biased real-time information is not only for the analyst but for everyone who needs to intelligently function in cyber-social space.&lt;/p&gt; &lt;p&gt;I participated in discussions on security and privacy and on mobile social networks and context.&lt;/p&gt; &lt;p&gt;For privacy, the main thing turned out to be whether people should be protected from themselves. Should information expire? Will it get buried by itself under huge volumes of new content? Well, for purposes of visibility, it will certainly get buried and will require constant management to stay visible. But for purposes of future finding of dirt, it will stay findable for those who are looking.&lt;/p&gt; &lt;p&gt;There is also the corollary of setting security for resources, like documents, versus setting security for statements, i.e., structured data like social networks. As I have blogged before, policies &lt;a id=&quot;link-id14aaff90&quot;&gt;à la&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x13d77830&quot;&gt;SQL&lt;/a&gt; do not work well when schema is fluid and end-users can&amp;#39;t be expected to formulate or understand these. Remember &lt;a href=&quot;http://dbpedia.org/resource/Ted_Nelson&quot; id=&quot;link-id0x156ceae0&quot;&gt;Ted Nelson&lt;/a&gt;? A user interface should be such that a beginner understands it in 10 seconds in an emergency. The user interaction question is how to present things so that the user understands who will have access to what content. Also, users should themselves be able to check what potentially sensitive information can be found out about them. A service along the lines of Garlic&amp;#39;s Data Patrol should be a part of the social web infrastructure of the future.&lt;/p&gt; &lt;p&gt;People at MIT have developed AIR (Accountability In &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x14e2abc0&quot;&gt;RDF&lt;/a&gt;) for expressing policies about what can be done with data and for explaining why access is denied if it is denied. However, if we at all look at the history of secrets, it is rather seldom that one hears that access to information about X is restricted to compartment so-and-so; it is much more common to hear that there is no X. I would say that a policy system that just leaves out information that is not supposed to be available will please the users more. This is not only so for organizations; it is fully plausible that an individual might not wish to expose even the existence of some selected inner circle of friends, their parties together, or whatever.&lt;/p&gt; &lt;p&gt;In conclusion, there is no self-evident solution for careless use of social media. A site that requires people to confirm multiple times that they know what they are doing when publishing a photo will not get much use. We will see.&lt;/p&gt; &lt;p&gt;For mobility, there was some talk about the context of usage. Again, this is difficult. For different contexts, one would for example disclose one&amp;#39;s location at the granularity of the city; for some other purposes, one would say which conference room one is in.&lt;/p&gt; &lt;p&gt;Embarrassing social situations may arise if mobile devices are too clever: If information about travel is pushed into the social network, one would feel like having to explain why one does not call on such-and-such a person and so on. Too much initiative in the mobile phone seems like a recipe for problems.&lt;/p&gt; &lt;p&gt;There is a thin line between convenience and having IT infrastructure rule one&amp;#39;s life. The complexities and subtleties of social situations ought not to be reduced to the level of if-then rules. People and their interactions are more complex than they themselves often realize. A system is not its own metasystem, as Gödel put it. Similarly, human self-&lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x70d82ff8&quot;&gt;knowledge&lt;/a&gt;, let alone knowledge about another, is by this very principle only approximate. Not to forget what psychology tells us about state-dependent recall and of how circumstance can evoke patterns of behavior before one even notices. The history of expert systems did show that people do not do very well at putting their skills in the form of if-then rules. Thus automating sociality past a certain point seems a problematic proposition.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:51:54-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Social Web Camp (#5 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-30#1554</atom:id>
  <atom:published>2009-04-30T16:14:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Last of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0xd28c860&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;The social networks camp was interesting, with a special meeting around Twitter. Half jokingly, we (that is, the OpenLink folks attending) concluded that societies would never be completely classless, although mobility between, as well as criteria for membership in, given classes would vary with time and circumstance. Now, there would be a new class division between people for whom micro-blogging is obligatory and those for whom it is an option.&lt;/p&gt; &lt;p&gt;By my experience, a great deal is possible in a short time, but this possibility depends on focus and concentration. These are increasingly rare. I am a great believer in core competence and focus. This is not only for geeks — one can have a lot of breadth-of-scope but this too depends on not getting sidetracked by constant &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x10019a70&quot;&gt;information&lt;/a&gt; overload.&lt;/p&gt; &lt;p&gt;Insofar as personal success depends on constant reaction to online social media, this comes at a cost in time and focus and this cost will have to be managed somehow, for example by automation or outsourcing. But if the social media is only automated fronts twitting and re-twitting among themselves, a bit like electronic trading systems do with securities, with or without human operators, the value of the medium decreases.&lt;/p&gt; &lt;p&gt;There are contradictory requirements. On one hand, what is said in electronic media is essentially permanent, so one had best only say things that are well considered. On the other hand, one must say these things without adequate time for reflection or analysis. To cope with this, one must have a well-rehearsed position that is compacted so that it fits in a short format and is easy to remember and unambiguous to express. A culture of pre-cooked fast-food advertising cuts down on depth. Real-world things are complex and multifaceted. Besides, prevalent patterns of communication train the brain for a certain mode of functioning. If we train for rapid-fire 140-character messaging, we optimize one side but probably at the expense of another. In the meantime, the world continues developing increased complexity by all kinds of emergent effects. Connectivity is good but don&amp;#39;t get lost in it.&lt;/p&gt; &lt;p&gt;There is &lt;a href=&quot;https://www.cia.gov/library/center-for-the-study-of-intelligence/csi-publications/books-and-monographs/psychology-of-intelligence-analysis/index.html&quot; id=&quot;link-id170cb010&quot;&gt;a CIA memorandum about how analysts misinterpret data and see what they want to see&lt;/a&gt;. This is a relevant resource for understanding some psychology of perception and memory. With the information overload, largely driven by user generated content, interpreting fragmented and variously-biased real-time information is not only for the analyst but for everyone who needs to intelligently function in cyber-social space.&lt;/p&gt; &lt;p&gt;I participated in discussions on security and privacy and on mobile social networks and context.&lt;/p&gt; &lt;p&gt;For privacy, the main thing turned out to be whether people should be protected from themselves. Should information expire? Will it get buried by itself under huge volumes of new content? Well, for purposes of visibility, it will certainly get buried and will require constant management to stay visible. But for purposes of future finding of dirt, it will stay findable for those who are looking.&lt;/p&gt; &lt;p&gt;There is also the corollary of setting security for resources, like documents, versus setting security for statements, i.e., structured data like social networks. As I have blogged before, policies &lt;a id=&quot;link-id14aaff90&quot;&gt;à la&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x10b058d0&quot;&gt;SQL&lt;/a&gt; do not work well when schema is fluid and end-users can&amp;#39;t be expected to formulate or understand these. Remember &lt;a href=&quot;http://dbpedia.org/resource/Ted_Nelson&quot; id=&quot;link-id0x145b3070&quot;&gt;Ted Nelson&lt;/a&gt;? A user interface should be such that a beginner understands it in 10 seconds in an emergency. The user interaction question is how to present things so that the user understands who will have access to what content. Also, users should themselves be able to check what potentially sensitive information can be found out about them. A service along the lines of Garlic&amp;#39;s Data Patrol should be a part of the social web infrastructure of the future.&lt;/p&gt; &lt;p&gt;People at MIT have developed AIR (Accountability In &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x10dec8f8&quot;&gt;RDF&lt;/a&gt;) for expressing policies about what can be done with data and for explaining why access is denied if it is denied. However, if we at all look at the history of secrets, it is rather seldom that one hears that access to information about X is restricted to compartment so-and-so; it is much more common to hear that there is no X. I would say that a policy system that just leaves out information that is not supposed to be available will please the users more. This is not only so for organizations; it is fully plausible that an individual might not wish to expose even the existence of some selected inner circle of friends, their parties together, or whatever.&lt;/p&gt; &lt;p&gt;In conclusion, there is no self-evident solution for careless use of social media. A site that requires people to confirm multiple times that they know what they are doing when publishing a photo will not get much use. We will see.&lt;/p&gt; &lt;p&gt;For mobility, there was some talk about the context of usage. Again, this is difficult. For different contexts, one would for example disclose one&amp;#39;s location at the granularity of the city; for some other purposes, one would say which conference room one is in.&lt;/p&gt; &lt;p&gt;Embarrassing social situations may arise if mobile devices are too clever: If information about travel is pushed into the social network, one would feel like having to explain why one does not call on such-and-such a person and so on. Too much initiative in the mobile phone seems like a recipe for problems.&lt;/p&gt; &lt;p&gt;There is a thin line between convenience and having IT infrastructure rule one&amp;#39;s life. The complexities and subtleties of social situations ought not to be reduced to the level of if-then rules. People and their interactions are more complex than they themselves often realize. A system is not its own metasystem, as Gödel put it. Similarly, human self-&lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0xd7b1808&quot;&gt;knowledge&lt;/a&gt;, let alone knowledge about another, is by this very principle only approximate. Not to forget what psychology tells us about state-dependent recall and of how circumstance can evoke patterns of behavior before one even notices. The history of expert systems did show that people do not do very well at putting their skills in the form of if-then rules. Thus automating sociality past a certain point seems a problematic proposition.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:51:49-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web Science and Keynotes at WWW 2009 (#4 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-30#1553</atom:id>
  <atom:published>2009-04-30T16:00:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Fourth of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0xdcaa1c0&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There was quite a bit of talk about what web science could or ought to be. I will here comment a bit on the &lt;a href=&quot;http://www2009.org/panels.html&quot; id=&quot;link-id1514ec30&quot;&gt;panels&lt;/a&gt; and &lt;a href=&quot;http://www2009.org/keynote_abs.html&quot; id=&quot;link-id11a5d620&quot;&gt;keynotes&lt;/a&gt;, in no special order. &lt;/p&gt; &lt;p&gt;In the web science panel, Tim Berners-Lee said that the deliverable of the web science initiative could be a way of making sense of all the world&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x121145b0&quot;&gt;data&lt;/a&gt; once the web had transformed into a database capable of answering arbitrary queries.&lt;/p&gt; &lt;p&gt;Michael Brodie of Verizon said that one deliverable would be a well considered understanding of the issue of counter-terrorism and civil liberties: Everything, including terrorism, operates on the platform of the web. How do we understand an issue that is not one of privacy, intelligence, jurisprudence, or sociology, but of all these and more?&lt;/p&gt; &lt;p&gt;I would add to this that it is not only a matter of governments keeping and analyzing vast amounts of private data, but of basically anybody who wants to do this being able to do so, even if at a smaller scale. In a way, the data web brings formerly government-only capabilities to the public, and is thus a democratization of intelligence and analytics. The citizen blogger increased the accountability of the press; the citizen analyst may have a similar effect. This is trickier though. We remember Jefferson&amp;#39;s words about vigilance and the price of freedom. But vigilance is harder today, not because &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x10402da0&quot;&gt;information&lt;/a&gt; is not there but because there is so much of it, with diverse spins put on it.&lt;/p&gt; &lt;p&gt;Tim B-L said at another panel that it seemed as if the new capabilities, especially the web as a database, were coming just in time to help us cope with the problems confronting the planet. With this, plus having everybody online, we would have more information, more creativity, more of everything at our disposal.&lt;/p&gt; &lt;p&gt;I&amp;#39;d have to say that the web is dual use: The bulk of traffic may contribute to distraction more than to awareness, but then the same infrastructure and the social behaviors it supports may also create unprecedented value and in the best of cases also transparency. I have to think of &amp;quot;For whosoever hath, to him shall be given.&amp;quot; [Matthew 13:12] This can mean many things; here I am talking about whoever hath a drive for &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1201dff0&quot;&gt;knowledge&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The web is both equalizing and polarizing: The equality is in the access; the polarity in the use made thereof. For a huge amount of noise there will be some crystallization of value that could not have arisen otherwise. Developments have unexpected effects. I would not have anticipated that gaming should advance supercomputing, for example.&lt;/p&gt; &lt;p&gt;Wendy Hall gave a dinner speech about communities and conferences; how the original hypertext conferences, with lots of representation of the humanities, became the techie WWW conference series; and how now we have the pendulum swinging back to more diversity with the web science conferences. So it is with life. Aside from the facts that there are trends and pendulum effects, and that paths that cross usually cross again, it is very hard to say exactly how these things play out.&lt;/p&gt; &lt;p&gt;At the &amp;quot;20 years of web&amp;quot; panel, there was a round of questions on how different people had been surprised by the web. Surprises ranged from the web&amp;#39;s actual scalability to its rapid adoption and the culture of &amp;quot;if I do my part, others will do theirs.&amp;quot; On the minus side, the emergence of spam and phishing were mentioned as unexpected developments.&lt;/p&gt; &lt;p&gt;Questions of simplicity and complexity got a lot of attention, along with network effects. When things hit the right simplicity at the right place (e.g., HTML and &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x16e16d38&quot;&gt;HTTP&lt;/a&gt;, which hypertext-wise were nothing special), there is a tipping point.&lt;/p&gt; &lt;p&gt;No barrier of entry, not too much modeling, was repeated quite a bit, also in relation to &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1033c750&quot;&gt;semantic web&lt;/a&gt; and ontology design. There is a magic of emergent effects when the pieces are simple enough: Organic chemistry out of a couple of dozen elements; all the world&amp;#39;s information online with a few tags of markup and a couple of protocol verbs. But then this is where the real complexity starts — one half of it in the transport, the other in the applications, yet a narrow interface between the two.&lt;/p&gt; &lt;p&gt;This then begs the question of content- and application-aware networks. The preponderance of opinion was for separation of powers — keep carriers and content apart.&lt;/p&gt; &lt;p&gt;Michael Brodie commented in the questions to the first panel that simplicity was greatly overrated, that the world was in fact very complex. It seems to me that that any field of human endeavor develops enough complexity to fully occupy the cleverest minds who undertake said activity. The life-cycle between simplicity and complexity seems to be a universal feature. It is a bit like the Zen idea that &amp;quot;for the beginner, rivers are rivers and mountains are mountains, for the student these are imponderable mysteries of bewildering complexity and transcendent dimension but for the master these are again rivers and mountains.&amp;quot; One way of seeing this is that the master, in spite of the actual complexity and interrelatedness of all things, sees where these complexities are significant and where not and knows to communicate concerning these as fits the situation.&lt;/p&gt; &lt;p&gt;There is no fixed formula for saying where complexities and simplicities fit, relevance of detail is forever contextual. For technological systems, we find that there emerge relatively simple interfaces on either side of which there is huge complexity: The x86 instruction set, TCP/IP, &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x107869d0&quot;&gt;SQL&lt;/a&gt;, to name a few. These are lucky breaks, it is very hard to say beforehand where these will emerge. Object oriented people would like to see such everywhere, which just leads to problems of modeling.&lt;/p&gt; &lt;p&gt;There was a keynote from Telefonica about infrastructure. We heard that the power and cooling cost more than the equipment, that data centers ought to be scaled down from the football stadium and 20 megawatt scale, that systems must be designed for partitioning, to name a few topics. This is all well accepted. The new question is whether storage should go into the network infrastructure. We have blogged that the network will be the database, and it is no surprise that a telco should have the same idea, just with slightly different emphasis and wording. For Telefonica, this is about efficiency of bulk delivery, for us this is more about virtualized query-able dataspaces. Both will be distributed but issues of separation of powers may keep the two roles of network with storage separate.&lt;/p&gt; &lt;p&gt;In conclusion, the network being the database was much more visible and accepted this year than last. The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x12064438&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x102cf670&quot;&gt;web&lt;/a&gt; was in Tim B-L&amp;#39;s keynote as it was in the opening speech by the Prince of Asturias.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:11:45.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web Science and Keynotes at WWW 2009 (#4 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-30#1551</atom:id>
  <atom:published>2009-04-30T16:00:22Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Fourth of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x1232b550&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There was quite a bit of talk about what web science could or ought to be. I will here comment a bit on the &lt;a href=&quot;http://www2009.org/panels.html&quot; id=&quot;link-id1514ec30&quot;&gt;panels&lt;/a&gt; and &lt;a href=&quot;http://www2009.org/keynote_abs.html&quot; id=&quot;link-id11a5d620&quot;&gt;keynotes&lt;/a&gt;, in no special order. &lt;/p&gt; &lt;p&gt;In the web science panel, Tim Berners-Lee said that the deliverable of the web science initiative could be a way of making sense of all the world&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xe01cd68&quot;&gt;data&lt;/a&gt; once the web had transformed into a database capable of answering arbitrary queries.&lt;/p&gt; &lt;p&gt;Michael Brodie of Verizon said that one deliverable would be a well considered understanding of the issue of counter-terrorism and civil liberties: Everything, including terrorism, operates on the platform of the web. How do we understand an issue that is not one of privacy, intelligence, jurisprudence, or sociology, but of all these and more?&lt;/p&gt; &lt;p&gt;I would add to this that it is not only a matter of governments keeping and analyzing vast amounts of private data, but of basically anybody who wants to do this being able to do so, even if at a smaller scale. In a way, the data web brings formerly government-only capabilities to the public, and is thus a democratization of intelligence and analytics. The citizen blogger increased the accountability of the press; the citizen analyst may have a similar effect. This is trickier though. We remember Jefferson&amp;#39;s words about vigilance and the price of freedom. But vigilance is harder today, not because &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x130558b8&quot;&gt;information&lt;/a&gt; is not there but because there is so much of it, with diverse spins put on it.&lt;/p&gt; &lt;p&gt;Tim B-L said at another panel that it seemed as if the new capabilities, especially the web as a database, were coming just in time to help us cope with the problems confronting the planet. With this, plus having everybody online, we would have more information, more creativity, more of everything at our disposal.&lt;/p&gt; &lt;p&gt;I&amp;#39;d have to say that the web is dual use: The bulk of traffic may contribute to distraction more than to awareness, but then the same infrastructure and the social behaviors it supports may also create unprecedented value and in the best of cases also transparency. I have to think of &amp;quot;For whosoever hath, to him shall be given.&amp;quot; [Matthew 13:12] This can mean many things; here I am talking about whoever hath a drive for &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x16032470&quot;&gt;knowledge&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The web is both equalizing and polarizing: The equality is in the access; the polarity in the use made thereof. For a huge amount of noise there will be some crystallization of value that could not have arisen otherwise. Developments have unexpected effects. I would not have anticipated that gaming should advance supercomputing, for example.&lt;/p&gt; &lt;p&gt;Wendy Hall gave a dinner speech about communities and conferences; how the original hypertext conferences, with lots of representation of the humanities, became the techie WWW conference series; and how now we have the pendulum swinging back to more diversity with the web science conferences. So it is with life. Aside from the facts that there are trends and pendulum effects, and that paths that cross usually cross again, it is very hard to say exactly how these things play out.&lt;/p&gt; &lt;p&gt;At the &amp;quot;20 years of web&amp;quot; panel, there was a round of questions on how different people had been surprised by the web. Surprises ranged from the web&amp;#39;s actual scalability to its rapid adoption and the culture of &amp;quot;if I do my part, others will do theirs.&amp;quot; On the minus side, the emergence of spam and phishing were mentioned as unexpected developments.&lt;/p&gt; &lt;p&gt;Questions of simplicity and complexity got a lot of attention, along with network effects. When things hit the right simplicity at the right place (e.g., HTML and &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1069cc18&quot;&gt;HTTP&lt;/a&gt;, which hypertext-wise were nothing special), there is a tipping point.&lt;/p&gt; &lt;p&gt;No barrier of entry, not too much modeling, was repeated quite a bit, also in relation to &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x15d2c200&quot;&gt;semantic web&lt;/a&gt; and ontology design. There is a magic of emergent effects when the pieces are simple enough: Organic chemistry out of a couple of dozen elements; all the world&amp;#39;s information online with a few tags of markup and a couple of protocol verbs. But then this is where the real complexity starts — one half of it in the transport, the other in the applications, yet a narrow interface between the two.&lt;/p&gt; &lt;p&gt;This then begs the question of content- and application-aware networks. The preponderance of opinion was for separation of powers — keep carriers and content apart.&lt;/p&gt; &lt;p&gt;Michael Brodie commented in the questions to the first panel that simplicity was greatly overrated, that the world was in fact very complex. It seems to me that that any field of human endeavor develops enough complexity to fully occupy the cleverest minds who undertake said activity. The life-cycle between simplicity and complexity seems to be a universal feature. It is a bit like the Zen idea that &amp;quot;for the beginner, rivers are rivers and mountains are mountains, for the student these are imponderable mysteries of bewildering complexity and transcendent dimension but for the master these are again rivers and mountains.&amp;quot; One way of seeing this is that the master, in spite of the actual complexity and interrelatedness of all things, sees where these complexities are significant and where not and knows to communicate concerning these as fits the situation.&lt;/p&gt; &lt;p&gt;There is no fixed formula for saying where complexities and simplicities fit, relevance of detail is forever contextual. For technological systems, we find that there emerge relatively simple interfaces on either side of which there is huge complexity: The x86 instruction set, TCP/IP, &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x10363000&quot;&gt;SQL&lt;/a&gt;, to name a few. These are lucky breaks, it is very hard to say beforehand where these will emerge. Object oriented people would like to see such everywhere, which just leads to problems of modeling.&lt;/p&gt; &lt;p&gt;There was a keynote from Telefonica about infrastructure. We heard that the power and cooling cost more than the equipment, that data centers ought to be scaled down from the football stadium and 20 megawatt scale, that systems must be designed for partitioning, to name a few topics. This is all well accepted. The new question is whether storage should go into the network infrastructure. We have blogged that the network will be the database, and it is no surprise that a telco should have the same idea, just with slightly different emphasis and wording. For Telefonica, this is about efficiency of bulk delivery, for us this is more about virtualized query-able dataspaces. Both will be distributed but issues of separation of powers may keep the two roles of network with storage separate.&lt;/p&gt; &lt;p&gt;In conclusion, the network being the database was much more visible and accepted this year than last. The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x100f4cf0&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x15a55db8&quot;&gt;web&lt;/a&gt; was in Tim B-L&amp;#39;s keynote as it was in the opening speech by the Prince of Asturias.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:11:44-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Short Recap of Virtuoso Basics (#3 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-30#1552</atom:id>
  <atom:published>2009-04-30T15:49:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Third of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x14b582b8&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There are some points that came up in conversation at WWW 2009 that I will reiterate here. We find there is still some lack of clarity in the product image, so I will here condense it.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x14bf48b8&quot;&gt;Virtuoso&lt;/a&gt; is a DBMS. We pitch it primarily to the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x16bc4490&quot;&gt;data&lt;/a&gt; web space because this is where we see the emerging frontier. Virtuoso does both &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1223dc30&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x170eec88&quot;&gt;SPARQL&lt;/a&gt; and can do both at large scale and high performance. The popular perception of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x15a05fc0&quot;&gt;RDF&lt;/a&gt; and Relational models as mutually exclusive and antagonistic poles is based on the poor scalability of early RDF implementations. What we do is to have all the RDF specifics, like IRIs and typed literals as native SQL types, and to have a cost based optimizer that knows about this all.&lt;/p&gt; &lt;p&gt;If you want application-specific data structures as opposed to a schema-agnostic quad-store model (triple + graph-name), then Virtuoso can give you this too. &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparqlintegrationmiddleware.html#rdfviews&quot; id=&quot;link-id14ddc7c8&quot;&gt;Rendering application specific data structures as RDF&lt;/a&gt; applies equally to relational data in non-Virtuoso databases because Virtuoso SQL can &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/qsvdbsrv.html&quot; id=&quot;link-id14aaea70&quot;&gt;federate tables from heterogenous DBMS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;On top of this, there is a &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/qswebserver.html&quot; id=&quot;link-id16fcde60&quot;&gt;web server built in&lt;/a&gt;, so that no extra server is needed for web services, web pages, and the like.&lt;/p&gt; &lt;p&gt;Installation is simple, just one exe and one config file. There is a huge amount of code in &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/installation.html&quot; id=&quot;link-id16767b40&quot;&gt;installers&lt;/a&gt; — application code and test suites and such — but none of this is needed when you deploy. Scale goes from a 25MB memory footprint on the desktop to hundreds of gigabytes of RAM and endless terabytes of disk on shared-nothing clusters.&lt;/p&gt; &lt;p&gt;Clusters (coming in Release 6) and SQL federation are &lt;a href=&quot;http://download.openlinksw.com/download/product_matrix.vsp?p=l_os&amp;amp;c=39&amp;amp;df=16&quot; id=&quot;link-id16722550&quot;&gt;commercial only&lt;/a&gt;; the rest can be had &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=161622&quot; id=&quot;link-id131080a8&quot;&gt;under GPL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To condense further:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Scalable Delivery of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1060ad98&quot;&gt;Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt;SPARQL and SQL &lt;ul&gt; &lt;li&gt;Arbitrary RDF Data + Relational&lt;/li&gt; &lt;li&gt;Also From 3rd Party &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x16bbce60&quot;&gt;RDBMS&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Easy Deployment &lt;/li&gt; &lt;li&gt;Standard Interfaces &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x12e284d8&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xb5e1400&quot;&gt;JDBC&lt;/a&gt;, OLE DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id0x15a55db8&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x16beb070&quot;&gt;NET&lt;/a&gt;, XMLA&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x122b5008&quot;&gt;Jena&lt;/a&gt;, &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x148d4078&quot;&gt;Sesame&lt;/a&gt;, etc.&lt;/li&gt; &lt;li&gt;All Web Protocols &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-04-30T12:11:45-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Short Recap of Virtuoso Basics (#3 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-30#1550</atom:id>
  <atom:published>2009-04-30T15:49:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Third of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x1081fe40&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There are some points that came up in conversation at WWW 2009 that I will reiterate here. We find there is still some lack of clarity in the product image, so I will here condense it.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xd0e85f0&quot;&gt;Virtuoso&lt;/a&gt; is a DBMS. We pitch it primarily to the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x14a294d8&quot;&gt;data&lt;/a&gt; web space because this is where we see the emerging frontier. Virtuoso does both &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x108042f8&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x10889878&quot;&gt;SPARQL&lt;/a&gt; and can do both at large scale and high performance. The popular perception of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x107d3b40&quot;&gt;RDF&lt;/a&gt; and Relational models as mutually exclusive and antagonistic poles is based on the poor scalability of early RDF implementations. What we do is to have all the RDF specifics, like IRIs and typed literals as native SQL types, and to have a cost based optimizer that knows about this all.&lt;/p&gt; &lt;p&gt;If you want application-specific data structures as opposed to a schema-agnostic quad-store model (triple + graph-name), then Virtuoso can give you this too. &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfsparqlintegrationmiddleware.html#rdfviews&quot; id=&quot;link-id14ddc7c8&quot;&gt;Rendering application specific data structures as RDF&lt;/a&gt; applies equally to relational data in non-Virtuoso databases because Virtuoso SQL can &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/qsvdbsrv.html&quot; id=&quot;link-id14aaea70&quot;&gt;federate tables from heterogenous DBMS&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;On top of this, there is a &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/qswebserver.html&quot; id=&quot;link-id16fcde60&quot;&gt;web server built in&lt;/a&gt;, so that no extra server is needed for web services, web pages, and the like.&lt;/p&gt; &lt;p&gt;Installation is simple, just one exe and one config file. There is a huge amount of code in &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/installation.html&quot; id=&quot;link-id16767b40&quot;&gt;installers&lt;/a&gt; — application code and test suites and such — but none of this is needed when you deploy. Scale goes from a 25MB memory footprint on the desktop to hundreds of gigabytes of RAM and endless terabytes of disk on shared-nothing clusters.&lt;/p&gt; &lt;p&gt;Clusters (coming in Release 6) and SQL federation are &lt;a href=&quot;http://download.openlinksw.com/download/product_matrix.vsp?p=l_os&amp;amp;c=39&amp;amp;df=16&quot; id=&quot;link-id16722550&quot;&gt;commercial only&lt;/a&gt;; the rest can be had &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=161622&quot; id=&quot;link-id131080a8&quot;&gt;under GPL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To condense further:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Scalable Delivery of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x12211da8&quot;&gt;Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt;SPARQL and SQL &lt;ul&gt; &lt;li&gt;Arbitrary RDF Data + Relational&lt;/li&gt; &lt;li&gt;Also From 3rd Party &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x168db0e0&quot;&gt;RDBMS&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Easy Deployment &lt;/li&gt; &lt;li&gt;Standard Interfaces &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x10473bf0&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x12187f58&quot;&gt;JDBC&lt;/a&gt;, OLE DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id0x10354e48&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x16eeadd0&quot;&gt;NET&lt;/a&gt;, XMLA&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x12e3fe08&quot;&gt;Jena&lt;/a&gt;, &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x15e62470&quot;&gt;Sesame&lt;/a&gt;, etc.&lt;/li&gt; &lt;li&gt;All Web Protocols &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-04-30T12:11:43.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Search at WWW 2009 (#2 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-30#1549</atom:id>
  <atom:published>2009-04-30T15:18:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Second of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id124024c8&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There was a &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/109/html&quot; id=&quot;link-id1207a3b0&quot;&gt;workshop on semantic search&lt;/a&gt; plus &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/html&quot; id=&quot;link-id1704ff48&quot;&gt;a number of papers&lt;/a&gt; and of course &lt;a href=&quot;http://www2009.org/keynote.html&quot; id=&quot;link-id11ec08d8&quot;&gt;keynotes from Google and Yahoo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A general topic was the use of and access to query logs. Are these the monopoly of GYM (Google, Yahoo, Microsoft) or should they be made more generally available? This is a privacy question. Use of query logs and click through of search results for improved ranking was mentioned many times throughout the conference.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/109/html&quot; id=&quot;link-id120b7d38&quot;&gt;semantic search workshop&lt;/a&gt; was largely about benchmarks for keyword search in &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id171e2950&quot;&gt;information&lt;/a&gt; retrieval. For &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11e1a9b0&quot;&gt;linked data&lt;/a&gt;, which is a database proposition, these benchmarks are not really applicable. For document search aided by semantics derived by NLP, these are of course applicable. But there is a divide in approach.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://g1o.net/foaf.rdf#me&quot; id=&quot;link-id11d1c7b0&quot;&gt;Giovanni Tummarello&lt;/a&gt; &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/59/html&quot; id=&quot;link-id169add28&quot;&gt;presented&lt;/a&gt; &lt;a href=&quot;http://sig.ma/&quot; id=&quot;link-id11af0128&quot;&gt;Sig.ma&lt;/a&gt;, a service using &lt;a href=&quot;http://sindice.com/&quot; id=&quot;link-id11a69fa0&quot;&gt;Sindice&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id11f3a088&quot;&gt;RDF&lt;/a&gt; index for collecting all RDF statements about entities matching some set of keywords. One could then choose which sources and which entities were the right ones. One could further store such a query and embed it on a page. The point was that the filtering done manually could be persisted and republished, so as to create dynamic content aggregated from selected live sources. Further speculating, one could use such user feedback for adjusting ranking, even though Sig.ma did not. We may adopt the idea of manually excluding sources into our browser too. Fresnel lenses are another thing to look at.&lt;/p&gt; &lt;p&gt;There was &lt;a href=&quot;http://www2009.eprints.org/242/&quot; id=&quot;link-id11dc7c68&quot;&gt;a paper by Josep M. Pujol and Pablo Rodriguez, of Telefonica Research&lt;/a&gt;, about returning search to the people by means of Porqpine, a peer-to-peer search implementation based on sharing search results from search engines among peers and indexing them locally as they were retrieved. For users with similar interests, this can give a community based ranking model but has issues of privacy. Another point was that with local processing and personal scale &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id171a8948&quot;&gt;data&lt;/a&gt; volumes various kinds of brute force processing were feasible that would cost a lot for the web scale. Much can be done web scale but it must be done cleverly, not with a shell script and not so ad hoc.&lt;/p&gt; &lt;p&gt;As a counterpoint to this, there was &lt;a href=&quot;http://www2009.eprints.org/220/&quot; id=&quot;link-id120bf9e0&quot;&gt;a talk about Hadoop and Hive&lt;/a&gt;, a map-reduce-based &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-idee5d700&quot;&gt;SQL&lt;/a&gt;-like framework. One could do an SQL &lt;code&gt;GROUP BY&lt;/code&gt; on text files with record parsing at run time, all spread over a Hadoop cluster. The issue is, if you have a petabyte of data, you may wish to run more than one ad hoc query on it. This means that joining between partitions and complex processing becomes important. This cannot be done without indices and complex query optimization, and needs a DBMS. Stonebraker and company are fully justified in their &lt;a href=&quot;http://database.cs.brown.edu/sigmod09/&quot; id=&quot;link-id11be1088&quot;&gt;critique of map reduce&lt;/a&gt;. It looks like each generation must get dazzled by the oversimplified and then retrace the same discoveries of complexity as the previous one.&lt;/p&gt; &lt;p&gt;Some of our future plans were confirmed by what we saw, for example as concerns:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Interactively selecting sources for search, showing the graphs, then interactively refining&lt;/li&gt; &lt;li&gt;More social networks, more network analysis, and more work on social recommendation&lt;/li&gt; &lt;li&gt;Real time indexing of new pings, filling the store by forwarding queries to search engines, and harvesting micro-formats from results&lt;/li&gt; &lt;li&gt;Using &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id16440770&quot;&gt;entity&lt;/a&gt; extraction&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These are all items in the pipeline, easy to do on top of the existing platform. For the machine learning and NLP parts, we will partner with others, details will be worked out while we work on the items we implement by ourselves.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:51:53.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Search at WWW 2009 (#2 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-30#1548</atom:id>
  <atom:published>2009-04-30T15:18:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;(Second of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id124024c8&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.) &lt;/p&gt; &lt;p&gt;There was a &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/109/html&quot; id=&quot;link-id1207a3b0&quot;&gt;workshop on semantic search&lt;/a&gt; plus &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/html&quot; id=&quot;link-id1704ff48&quot;&gt;a number of papers&lt;/a&gt; and of course &lt;a href=&quot;http://www2009.org/keynote.html&quot; id=&quot;link-id11ec08d8&quot;&gt;keynotes from Google and Yahoo&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A general topic was the use of and access to query logs. Are these the monopoly of GYM (Google, Yahoo, Microsoft) or should they be made more generally available? This is a privacy question. Use of query logs and click through of search results for improved ranking was mentioned many times throughout the conference.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/109/html&quot; id=&quot;link-id120b7d38&quot;&gt;semantic search workshop&lt;/a&gt; was largely about benchmarks for keyword search in &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id171e2950&quot;&gt;information&lt;/a&gt; retrieval. For &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11e1a9b0&quot;&gt;linked data&lt;/a&gt;, which is a database proposition, these benchmarks are not really applicable. For document search aided by semantics derived by NLP, these are of course applicable. But there is a divide in approach.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://g1o.net/foaf.rdf#me&quot; id=&quot;link-id11d1c7b0&quot;&gt;Giovanni Tummarello&lt;/a&gt; &lt;a href=&quot;http://data.semanticweb.org/conference/www/2009/paper/59/html&quot; id=&quot;link-id169add28&quot;&gt;presented&lt;/a&gt; &lt;a href=&quot;http://sig.ma/&quot; id=&quot;link-id11af0128&quot;&gt;Sig.ma&lt;/a&gt;, a service using &lt;a href=&quot;http://sindice.com/&quot; id=&quot;link-id11a69fa0&quot;&gt;Sindice&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id11f3a088&quot;&gt;RDF&lt;/a&gt; index for collecting all RDF statements about entities matching some set of keywords. One could then choose which sources and which entities were the right ones. One could further store such a query and embed it on a page. The point was that the filtering done manually could be persisted and republished, so as to create dynamic content aggregated from selected live sources. Further speculating, one could use such user feedback for adjusting ranking, even though Sig.ma did not. We may adopt the idea of manually excluding sources into our browser too. Fresnel lenses are another thing to look at.&lt;/p&gt; &lt;p&gt;There was &lt;a href=&quot;http://www2009.eprints.org/242/&quot; id=&quot;link-id11dc7c68&quot;&gt;a paper by Josep M. Pujol and Pablo Rodriguez, of Telefonica Research&lt;/a&gt;, about returning search to the people by means of Porqpine, a peer-to-peer search implementation based on sharing search results from search engines among peers and indexing them locally as they were retrieved. For users with similar interests, this can give a community based ranking model but has issues of privacy. Another point was that with local processing and personal scale &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id171a8948&quot;&gt;data&lt;/a&gt; volumes various kinds of brute force processing were feasible that would cost a lot for the web scale. Much can be done web scale but it must be done cleverly, not with a shell script and not so ad hoc.&lt;/p&gt; &lt;p&gt;As a counterpoint to this, there was &lt;a href=&quot;http://www2009.eprints.org/220/&quot; id=&quot;link-id120bf9e0&quot;&gt;a talk about Hadoop and Hive&lt;/a&gt;, a map-reduce-based &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-idee5d700&quot;&gt;SQL&lt;/a&gt;-like framework. One could do an SQL &lt;code&gt;GROUP BY&lt;/code&gt; on text files with record parsing at run time, all spread over a Hadoop cluster. The issue is, if you have a petabyte of data, you may wish to run more than one ad hoc query on it. This means that joining between partitions and complex processing becomes important. This cannot be done without indices and complex query optimization, and needs a DBMS. Stonebraker and company are fully justified in their &lt;a href=&quot;http://database.cs.brown.edu/sigmod09/&quot; id=&quot;link-id11be1088&quot;&gt;critique of map reduce&lt;/a&gt;. It looks like each generation must get dazzled by the oversimplified and then retrace the same discoveries of complexity as the previous one.&lt;/p&gt; &lt;p&gt;Some of our future plans were confirmed by what we saw, for example as concerns:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Interactively selecting sources for search, showing the graphs, then interactively refining&lt;/li&gt; &lt;li&gt;More social networks, more network analysis, and more work on social recommendation&lt;/li&gt; &lt;li&gt;Real time indexing of new pings, filling the store by forwarding queries to search engines, and harvesting micro-formats from results&lt;/li&gt; &lt;li&gt;Using &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id16440770&quot;&gt;entity&lt;/a&gt; extraction&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These are all items in the pipeline, easy to do on top of the existing platform. For the machine learning and NLP parts, we will partner with others, details will be worked out while we work on the items we implement by ourselves.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-30T12:51:48-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data &amp; Identity</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-04-29#1547</atom:id>
  <atom:published>2009-04-29T20:05:58Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;cite&gt;A person, organization, place, idea, subject matter topic/heading, and other real world things possess &amp;quot;identity&amp;quot; -- that is, a constellation of characteristics that distinguish them from any other identity. Associated with this abstraction can be a label used as a reference, or &amp;quot;identifier&amp;quot;. This is the distinction between a thing and the name of the thing.&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;section from &lt;a href=&quot;http://www.ietf.org/internet-drafts/draft-ietf-dkim-overview-11.txt&quot; id=&quot;link-id15a13d40&quot;&gt;IETF&amp;#39;s Domain Keys spec&lt;/a&gt;. (paraphrased by &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id13d88ed8&quot;&gt;me&lt;/a&gt;) &lt;/p&gt;.&lt;/blockquote&gt; &lt;p&gt;The &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id11d5b9a8&quot;&gt;Linked Data meme&lt;/a&gt; is based on the use of HTTP based URIs as reference / identifier labels associated with the &amp;quot;identity abstraction&amp;quot; referred to above. Thus, when you de-reference (request &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id14706fb8&quot;&gt;information&lt;/a&gt; about) an HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id12b4ea50&quot;&gt;URI&lt;/a&gt; you ultimately end up with a resource &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id12127e20&quot;&gt;URL&lt;/a&gt; that exposes the &amp;quot;constellation of characteristics&amp;quot; mentioned above, in a representation negotiated at request time -- between an HTTP client and server e.g., (X)HTML, JSON, XML, RDF/XML, N3, Turtle, Trix, others :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1546&quot; id=&quot;link-id11b67288&quot;&gt;What is the Linked Data meme About?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1543&quot; id=&quot;link-id151fa890&quot;&gt;Simple Explanation of RDF &amp;amp; Linked Data Dynamics&lt;/a&gt;.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.handle.net/&quot; id=&quot;link-id11d9cd30&quot;&gt;Handle&lt;/a&gt; -- &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x131986f0&quot;&gt;Internet&lt;/a&gt; wide Identity Scheme and Resolution System&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-05-01T12:25:49-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is the Linked Data Meme about?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-04-29#1546</atom:id>
  <atom:published>2009-04-29T15:32:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;The act of using URIs to &amp;quot;refer to&amp;quot; (reference) &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; addressable &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; objects. It&amp;#39;s also the act of using the same &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id12b41fc0&quot;&gt;URI&lt;/a&gt; to de-reference the description of a referenced data object; in this case, the representation of the description is negotiated by a Web client and/or Web server. Thus, you can access the description of a data object via data representation formats such as: JSON, XML, (X)HTML, RDF/XML, N3, Turtle, TriX etc. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note:&lt;/strong&gt; In proper Web parlance, a data object is referred to as a resource.&lt;/p&gt; &lt;h3&gt;Simple example (using &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x131005a0&quot;&gt;DBpedia&lt;/a&gt;)&lt;/h3&gt; &lt;p&gt;In the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x13299d20&quot;&gt;Linked Data&lt;/a&gt; realm, If you want to make a reference to the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id0x188210a8&quot;&gt;Linked Data meme&lt;/a&gt; in a &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x158a3fc0&quot;&gt;blog&lt;/a&gt; post, you are better off using the resource &lt;strong&gt;URI&lt;/strong&gt;: http://dbpedia.org/resource/Linked_Data, instead of the Web page &lt;strong&gt;&lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x142865b0&quot;&gt;URL&lt;/a&gt;&lt;/strong&gt;: http://dbpedia.org/page/Linked_Data, which is the address of a physical document (an &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x15884030&quot;&gt;information&lt;/a&gt; conveying artifact) that at best visually presents the negotiated representation of a resource description.&lt;/p&gt; &lt;h3&gt;Why is this valuable?&lt;/h3&gt; &lt;p&gt;In the simplest sense, you only have one focal point for referencing (referring to) and de-referencing (retrieving data about) a given Web resource. It protects you from the impact of Web document location changes (amongst many other things).&lt;/p&gt; &lt;p&gt;Remember, a single URI is a conduit into a realm where the identity, access, representation, presentation, and storage of a resource (data object) are completely distinct. It&amp;#39;s the mechanism for conducting data across network, machine, operating system, dbms engine, application, and service (API) boundaries. Thus, without &amp;quot;linked data meme&amp;quot; prescribed URI referencing and de-referencing, we are simply back to &amp;quot;business as usual&amp;quot; re. the industry at large, where networks, operating systems, dbms engines, applications, and services (APIs) become the basis for &amp;quot;data lock-in&amp;quot; and silo construction.&lt;/p&gt; &lt;h3&gt;Going forward&lt;/h3&gt; &lt;p&gt;Take a second to think about the profound virtues of the ubiquitous Web of Linked Document URLs that we have today, and then apply that thinking to the burgeoning Web of Linked Data URIs, that has just turned corner and heading in everyone&amp;#39;s direction at full blast.&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note to &amp;quot;Social Media&amp;quot; players:&lt;/strong&gt; Who you know isn&amp;#39;t the canonical object of sociality. What you are i.e., your description and the data objects it exposes, are real objects of your sociality :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=%22Linked%20Data%22&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id14d44430&quot;&gt;Other post in this Blog Data Space associated with &amp;quot;Linked Data&amp;quot;&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-04-29T16:31:10-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data at WWW 2009 (#1 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-27#1545</atom:id>
  <atom:published>2009-04-27T21:28:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;(First of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x12d8ed90&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.)&lt;/p&gt; &lt;p&gt;We gave a talk at the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x152bf430&quot;&gt;Linked Open Data&lt;/a&gt; workshop, &lt;a href=&quot;http://events.linkeddata.org/ldow2009/&quot; id=&quot;link-id0x191721c8&quot;&gt;LDOW 2009&lt;/a&gt;, at WWW 2009. I did not go very far into the technical points in the talk, as there was almost no time and the points are rather complex. Instead, I emphasized what new things had become possible with recent developments.&lt;/p&gt; &lt;p&gt;The problem we do not cease hearing about is scale. We have solved most of it. There is scale in the schema: Put together, ontologies go over a million classes/properties. Which ones are relevant depends, and the user should have the choice. The instance &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x17c8f998&quot;&gt;data&lt;/a&gt; is in the tens of billions of triples, much derived from Web 2.0 sources but also much published as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xd562090&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To make sense of this all, we need quick summaries and search. Without navigation via joins, the value will be limited. Fast joining, counting, grouping, and ranking are key.&lt;/p&gt; &lt;p&gt;People will use different terms for the same thing. The issue of identity is philosophical. In order to do reasoning one needs strong identity; a statement like &lt;i&gt;x is a bit like y&lt;/i&gt; is not very useful in a database context. Whether any x and y can be considered the same depends on the context. So leave this for query time. The conditions under which two people are considered the same will depend on whether you are doing marketing analysis or law enforcement. A general purpose data store cannot anticipate all the possibilities, so smush on demand, as you go, as has been said many times.&lt;/p&gt; &lt;p&gt;Against this backdrop, we offer a solution with which anybody who so chooses can play with big data, whether a search or analytics player.&lt;/p&gt; &lt;p&gt;We are going in the direction of more and more ad hoc processing at larger and larger scale. With good query parallelization, we can do big joins without complex programming. No explicit Map Reduce jobs or the like. What was done with special code with special parallel programming models, can now be done in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x60bd0c48&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x13db1ff0&quot;&gt;SPARQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To showcase this, we do &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x10a5dde8&quot;&gt;linked data&lt;/a&gt; search, browsing, and so on, but are essentially a platform provider.&lt;/p&gt; &lt;p&gt;Entry costs into relatively high end databases have dropped significantly. A cluster with 1 TB of RAM sells for $75K or so at today&amp;#39;s retail prices and fits under a desk. For intermittent use, the rent for 1TB RAM is $1228 per day on &lt;a href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0xa59039d8&quot;&gt;EC2&lt;/a&gt;. With this on one side and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x19f86c10&quot;&gt;Virtuoso&lt;/a&gt; on the other, a lot that was impractical in the past is now within reach. Like &lt;a href=&quot;http://g1o.net/foaf.rdf#me&quot; id=&quot;link-id0xa1853af8&quot;&gt;Giovanni Tummarello&lt;/a&gt; put it for airplanes, the physics are as they were for &lt;a href=&quot;http://dbpedia.org/resource/Leonardo_da_Vinci&quot; id=&quot;link-id0x12df02e0&quot;&gt;da Vinci&lt;/a&gt; but materials and engines had to develop a bit before there was commercial potential. So it is also with analytics for everyone.&lt;/p&gt; &lt;p&gt;A remark from the audience was that all the stuff being shown, not limited to Virtuoso, was non-standard, having to do with text search, with ranking, with extensions, and was in fact not SPARQL and pure linked data principles. Further, by throwing this all together, one got something overcomplicated, too heavy.&lt;/p&gt; &lt;p&gt;I answered as follows, which apparently cannot be repeated too much:&lt;/p&gt; &lt;p&gt;First, everybody expects a text search box, and is conditioned to having one. No text search and no ranking is a non-starter. &lt;i&gt;Ceterum censeo&lt;/i&gt;, for database, the next generation cannot be less expressive than the previous. All of SQL and then some is where SPARQL must be. The barest minimum is being able to say anything one can say in SQL, and then justify SPARQL by saying that it is better for heterogenous data, schema last, and so on. On top of this, transitivity and rules will not hurt. For now, the current SPARQL working group will at least reach basic SQL parity; the edge will still remain implementation dependent.&lt;/p&gt; &lt;p&gt;Another remark was that joining is slow. Depends. Anything involving more complex disk access than linear reading of a blob is generally not good for interactive use. But with adequate memory, and with all hot spots in memory, we do some 3.2 million random-accesses-per-second on 12 cores, with easily 80% platform utilization for a single large query. The high utilization means that times drop as processing gets divided over more partitions.&lt;/p&gt; &lt;p&gt;There was a talk about &lt;a href=&quot;http://semanticweb.org/wiki/MashQL&quot; id=&quot;link-id0x1642a780&quot;&gt;MashQL&lt;/a&gt; by &lt;a href=&quot;http://data.semanticweb.org/person/mustafa-jarrar&quot; id=&quot;link-id0x116e5af8&quot;&gt;Mustafa Jarrar&lt;/a&gt;, concerning an abstraction on top of SPARQL for easy composition of tree-structured queries. The idea was that such queries can be evaluated &amp;quot;on the fly&amp;quot; as they are being composed. As it happens, we already have an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x11442520&quot;&gt;XML&lt;/a&gt;-based query abstraction layer incorporated into Virtuoso 6.0&amp;#39;s built-in &lt;a href=&quot;http://lod.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-id0x6a9ebfe0&quot;&gt;Faceted Data Browser Service&lt;/a&gt;, and the effects are probably quite similar. The most important point here is that by using XML, both of these approaches are interoperable against a Virtuoso back-end. Along similar lines, we did not get to talk to the G Facets people but our message to them is the same: &lt;i&gt;Use the &lt;a href=&quot;http://lod.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-id0x1676e158&quot;&gt;faceted browser service&lt;/a&gt; to get vastly higher performance when querying against Linked Data, be it &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x12653418&quot;&gt;DBpedia&lt;/a&gt; or the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x10a61e78&quot;&gt;entity&lt;/a&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x164150d8&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lod.openlinksw.com/&quot; id=&quot;link-id0xc5ec918&quot;&gt;Cloud&lt;/a&gt;. Virtuoso 6.0 (Open Source Edition) &amp;quot;&lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=161622&amp;amp;package_id=319652&amp;amp;release_id=677866&quot; id=&quot;link-id12159728&quot;&gt;TP1&lt;/a&gt;&amp;quot; is now publicly available as a Technology Preview (beta).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;We heard that there is an effort for porting Freebase&amp;#39;s Parallax to SPARQL. The same thing applies to this. With a number of different data viewers on top of SPARQL, we come closer to broad-audience linked-data applications. These viewers are still too generic for the end user, though. We fully believe that for both search and transactions, application-domain-specific workflows will stay relevant. But these can be made to a fair degree by specializing generic linked-data-bound controls and gluing them together with some scripting.&lt;/p&gt; &lt;p&gt;As said before, the application will interface the user to the vocabulary. The vocabulary development takes the modeling burden from the application and makes for interchangeable experience on the same data. The data in turn is &amp;quot;virtualized&amp;quot; into the database cloud or the local secure server, as the use case may require. &lt;/p&gt; &lt;p&gt;For ease of adoption, open competition, and safety from lock-in, the community needs a SPARQL whose usability is not totally dependent on vendor extensions. But we might &lt;i&gt;de facto&lt;/i&gt; have that in just a bit, whenever there is a working draft from the SPARQL WG.&lt;/p&gt; &lt;p&gt;Another topic that we encounter often is the question of integration (or lack thereof) between communities. For example, database conferences reject &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x12563ea0&quot;&gt;semantic web&lt;/a&gt; papers and vice versa. Such politics would seem to emerge naturally but are nonetheless detrimental. We really should partner with people who write papers as their principal occupation. We ourselves do software products and use very little time for papers, so some of the bad reviews we have received do make a legitimate point. By rights, we should go for database venues but we cannot have this take too much time. So we are open to partnering for splitting the opportunity cost of multiple submissions.&lt;/p&gt; &lt;p&gt;For future work, there is nothing radically new. We continue testing and productization of cluster databases. Just deliver what is in the pipeline. The essential nature of this is adding more and more cases of better and better parallelization in different query situations. The present usage patterns work well for finding bugs and performance bottlenecks. For presentation, our goal is to have third party viewers operate with our platform. We cannot completely leave data browsing and UI to third parties since we must from time to time introduce various unique functionality. Most interaction should however go via third party applications.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-28T11:27:57-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data at WWW 2009 (#1 of 5)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-27#1544</atom:id>
  <atom:published>2009-04-27T21:28:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;(First of five posts related to the &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id0x114c2450&quot;&gt;WWW 2009&lt;/a&gt; conference, held the week of April 20, 2009.)&lt;/p&gt; &lt;p&gt;We gave a talk at the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x166e10f0&quot;&gt;Linked Open Data&lt;/a&gt; workshop, &lt;a href=&quot;http://events.linkeddata.org/ldow2009/&quot; id=&quot;link-id0x19c2b1f0&quot;&gt;LDOW 2009&lt;/a&gt;, at WWW 2009. I did not go very far into the technical points in the talk, as there was almost no time and the points are rather complex. Instead, I emphasized what new things had become possible with recent developments.&lt;/p&gt; &lt;p&gt;The problem we do not cease hearing about is scale. We have solved most of it. There is scale in the schema: Put together, ontologies go over a million classes/properties. Which ones are relevant depends, and the user should have the choice. The instance &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x12c65250&quot;&gt;data&lt;/a&gt; is in the tens of billions of triples, much derived from Web 2.0 sources but also much published as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x441128e0&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To make sense of this all, we need quick summaries and search. Without navigation via joins, the value will be limited. Fast joining, counting, grouping, and ranking are key.&lt;/p&gt; &lt;p&gt;People will use different terms for the same thing. The issue of identity is philosophical. In order to do reasoning one needs strong identity; a statement like &lt;i&gt;x is a bit like y&lt;/i&gt; is not very useful in a database context. Whether any x and y can be considered the same depends on the context. So leave this for query time. The conditions under which two people are considered the same will depend on whether you are doing marketing analysis or law enforcement. A general purpose data store cannot anticipate all the possibilities, so smush on demand, as you go, as has been said many times.&lt;/p&gt; &lt;p&gt;Against this backdrop, we offer a solution with which anybody who so chooses can play with big data, whether a search or analytics player.&lt;/p&gt; &lt;p&gt;We are going in the direction of more and more ad hoc processing at larger and larger scale. With good query parallelization, we can do big joins without complex programming. No explicit Map Reduce jobs or the like. What was done with special code with special parallel programming models, can now be done in &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x16766eb0&quot;&gt;SQL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1645ddc8&quot;&gt;SPARQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To showcase this, we do &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xa167e698&quot;&gt;linked data&lt;/a&gt; search, browsing, and so on, but are essentially a platform provider.&lt;/p&gt; &lt;p&gt;Entry costs into relatively high end databases have dropped significantly. A cluster with 1 TB of RAM sells for $75K or so at today&amp;#39;s retail prices and fits under a desk. For intermittent use, the rent for 1TB RAM is $1228 per day on &lt;a href=&quot;http://aws.amazon.com/ec2/&quot; id=&quot;link-id0xa1a67b70&quot;&gt;EC2&lt;/a&gt;. With this on one side and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1622d4e0&quot;&gt;Virtuoso&lt;/a&gt; on the other, a lot that was impractical in the past is now within reach. Like &lt;a href=&quot;http://g1o.net/foaf.rdf#me&quot; id=&quot;link-id0x3d5c8b50&quot;&gt;Giovanni Tummarello&lt;/a&gt; put it for airplanes, the physics are as they were for &lt;a href=&quot;http://dbpedia.org/resource/Leonardo_da_Vinci&quot; id=&quot;link-id0x198e7cc0&quot;&gt;da Vinci&lt;/a&gt; but materials and engines had to develop a bit before there was commercial potential. So it is also with analytics for everyone.&lt;/p&gt; &lt;p&gt;A remark from the audience was that all the stuff being shown, not limited to Virtuoso, was non-standard, having to do with text search, with ranking, with extensions, and was in fact not SPARQL and pure linked data principles. Further, by throwing this all together, one got something overcomplicated, too heavy.&lt;/p&gt; &lt;p&gt;I answered as follows, which apparently cannot be repeated too much:&lt;/p&gt; &lt;p&gt;First, everybody expects a text search box, and is conditioned to having one. No text search and no ranking is a non-starter. &lt;i&gt;Ceterum censeo&lt;/i&gt;, for database, the next generation cannot be less expressive than the previous. All of SQL and then some is where SPARQL must be. The barest minimum is being able to say anything one can say in SQL, and then justify SPARQL by saying that it is better for heterogenous data, schema last, and so on. On top of this, transitivity and rules will not hurt. For now, the current SPARQL working group will at least reach basic SQL parity; the edge will still remain implementation dependent.&lt;/p&gt; &lt;p&gt;Another remark was that joining is slow. Depends. Anything involving more complex disk access than linear reading of a blob is generally not good for interactive use. But with adequate memory, and with all hot spots in memory, we do some 3.2 million random-accesses-per-second on 12 cores, with easily 80% platform utilization for a single large query. The high utilization means that times drop as processing gets divided over more partitions.&lt;/p&gt; &lt;p&gt;There was a talk about &lt;a href=&quot;http://semanticweb.org/wiki/MashQL&quot; id=&quot;link-id0x60bd57b0&quot;&gt;MashQL&lt;/a&gt; by &lt;a href=&quot;http://data.semanticweb.org/person/mustafa-jarrar&quot; id=&quot;link-id0xa1fb98d8&quot;&gt;Mustafa Jarrar&lt;/a&gt;, concerning an abstraction on top of SPARQL for easy composition of tree-structured queries. The idea was that such queries can be evaluated &amp;quot;on the fly&amp;quot; as they are being composed. As it happens, we already have an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1923a380&quot;&gt;XML&lt;/a&gt;-based query abstraction layer incorporated into Virtuoso 6.0&amp;#39;s built-in &lt;a href=&quot;http://lod.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-id0x67712740&quot;&gt;Faceted Data Browser Service&lt;/a&gt;, and the effects are probably quite similar. The most important point here is that by using XML, both of these approaches are interoperable against a Virtuoso back-end. Along similar lines, we did not get to talk to the G Facets people but our message to them is the same: &lt;i&gt;Use the &lt;a href=&quot;http://lod.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-id0x70df2798&quot;&gt;faceted browser service&lt;/a&gt; to get vastly higher performance when querying against Linked Data, be it &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1b3fd608&quot;&gt;DBpedia&lt;/a&gt; or the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x13ecd708&quot;&gt;entity&lt;/a&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x17f16970&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://lod.openlinksw.com/&quot; id=&quot;link-id0x54334250&quot;&gt;Cloud&lt;/a&gt;. Virtuoso 6.0 (Open Source Edition) &amp;quot;&lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=161622&amp;amp;package_id=319652&amp;amp;release_id=677866&quot; id=&quot;link-id12159728&quot;&gt;TP1&lt;/a&gt;&amp;quot; is now publicly available as a Technology Preview (beta).&lt;/i&gt; &lt;/p&gt; &lt;p&gt;We heard that there is an effort for porting Freebase&amp;#39;s Parallax to SPARQL. The same thing applies to this. With a number of different data viewers on top of SPARQL, we come closer to broad-audience linked-data applications. These viewers are still too generic for the end user, though. We fully believe that for both search and transactions, application-domain-specific workflows will stay relevant. But these can be made to a fair degree by specializing generic linked-data-bound controls and gluing them together with some scripting.&lt;/p&gt; &lt;p&gt;As said before, the application will interface the user to the vocabulary. The vocabulary development takes the modeling burden from the application and makes for interchangeable experience on the same data. The data in turn is &amp;quot;virtualized&amp;quot; into the database cloud or the local secure server, as the use case may require. &lt;/p&gt; &lt;p&gt;For ease of adoption, open competition, and safety from lock-in, the community needs a SPARQL whose usability is not totally dependent on vendor extensions. But we might &lt;i&gt;de facto&lt;/i&gt; have that in just a bit, whenever there is a working draft from the SPARQL WG.&lt;/p&gt; &lt;p&gt;Another topic that we encounter often is the question of integration (or lack thereof) between communities. For example, database conferences reject &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x185d6bf8&quot;&gt;semantic web&lt;/a&gt; papers and vice versa. Such politics would seem to emerge naturally but are nonetheless detrimental. We really should partner with people who write papers as their principal occupation. We ourselves do software products and use very little time for papers, so some of the bad reviews we have received do make a legitimate point. By rights, we should go for database venues but we cannot have this take too much time. So we are open to partnering for splitting the opportunity cost of multiple submissions.&lt;/p&gt; &lt;p&gt;For future work, there is nothing radically new. We continue testing and productization of cluster databases. Just deliver what is in the pipeline. The essential nature of this is adding more and more cases of better and better parallelization in different query situations. The present usage patterns work well for finding bugs and performance bottlenecks. For presentation, our goal is to have third party viewers operate with our platform. We cannot completely leave data browsing and UI to third parties since we must from time to time introduce various unique functionality. Most interaction should however go via third party applications.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:24:34.169932-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Simple Explanation of RDF and Linked Data Dynamics</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-04-24#1543</atom:id>
  <atom:published>2009-04-24T20:59:08Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is RDF?&lt;/h3&gt; &lt;p&gt;The acronym stands for: Resource Description Framework. And that&amp;#39;s just what it is.&lt;/p&gt; &lt;p&gt;RDF is comprised of a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Model (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id11bb5cd8&quot;&gt;EAV&lt;/a&gt;/CR Graph) and Data Representation Formats such as: N3, Turtle, RDF/XML etc.&lt;/p&gt; &lt;p&gt;RDF&amp;#39;s essence is about: &amp;quot;Entities&amp;quot; and &amp;quot;Attributes&amp;quot; being &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id14362100&quot;&gt;URI&lt;/a&gt; based, while &amp;quot;Values&amp;quot; may be URI or Literals (typed or untyped) based. &lt;/p&gt; &lt;p&gt;URIs are &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id139066e8&quot;&gt;Entity&lt;/a&gt; Identifiers.&lt;/p&gt; &lt;h3&gt;What is &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11ed5340&quot;&gt;Linked Data&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;Short for &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of Linked Data&amp;quot; or &amp;quot;Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id13f4b878&quot;&gt;Web&lt;/a&gt;&amp;quot;.&lt;/p&gt; &lt;p&gt;A term coined by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id117b4310&quot;&gt;TimBL&lt;/a&gt; that describes an HTTP based &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id138fed30&quot;&gt;data access by reference&lt;/a&gt; pattern&amp;quot; that uses a single pointer or handle for &amp;quot;referring to&amp;quot; and &amp;quot;obtaining actual data about&amp;quot; an entity.&lt;/p&gt; &lt;p&gt;Linked Data uses the deceptively simple messaging scheme of HTTP to deliver a granular entity reference and access mechanism that transcends traditional computing boundaries such as: operating system, application, database engines, and networks.&lt;/p&gt; &lt;h3&gt;How are Linked Data &amp;amp; RDF Related?&lt;/h3&gt; &lt;p&gt;Linked Data simply mandates the following re. RDF:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;URIs should be HTTP based so that you can &amp;quot;refer to&amp;quot; (Reference) an Entity, its Attributes, or URI based Attribute values via the Web (infact any HTTP based network e.g., Intranets and Extranets)&lt;/li&gt; &lt;li&gt; URIs should also be HTTP based so that you can use them to de-reference resource descriptions via the Web (or Intranets and Extranets).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;strong&gt;Note:&lt;/strong&gt; by Entity I am also referring to: a resource (Web parlance), data item, data object, real-world object, or datum. &lt;/p&gt; &lt;p&gt;Linked Data is also about, using URIs and HTTP&amp;#39;s content negotiation feature to separate: presentation, representation, access, and identity of data items. Even better, content negotiation can be driven by user agent and/or data server based quality of service algorithms (representation preference order schemes).&lt;/p&gt; &lt;p&gt;To conclude, Linked Data is ultimately about the realization that: Data is the new Electricity, and it&amp;#39;s conductors are URIs :-)&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Tip to governments of the world&lt;/strong&gt;: we are in exponential times, the current downturn is but one side of the &amp;quot;exponential times ledger&amp;quot;, the other side of the &amp;quot;exponential times ledger&amp;quot; is simply about unleashing &amp;quot;raw data&amp;quot; -- in structured form -- into the Web, so that &amp;quot;citizen analysts&amp;quot; can blossom and ultimately deliver the transparency desperately sought at every level of the economic value chain. Think: &amp;quot;raw data ready&amp;quot; whenever you ponder about &amp;quot;shovel ready&amp;quot; infrastructure projects!&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-24T17:14:41-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Take N: Yet Another OpenLink Data Spaces Introduction</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-04-22#1542</atom:id>
  <atom:published>2009-04-22T18:46:18Z</atom:published>
  <atom:content type="html">&lt;h3&gt;Problem:&lt;/h3&gt; &lt;p&gt;Your Life, Profession, &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x1c6687f8&quot;&gt;Internet&lt;/a&gt; do not need to become mutually exclusive due to &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1c6696e8&quot;&gt;information&lt;/a&gt; overload&amp;quot;.&lt;/p&gt; &lt;h3&gt;Solution:&lt;/h3&gt; &lt;p&gt; A platform or service that delivers a point of online presence that embodies the fundamental separation of: Identity, &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Access, Data Representation, Data Presentation, by adhering to Web and Internet protocols.&lt;/p&gt; &lt;h3&gt;How:&lt;/h3&gt; &lt;p&gt; Typical post installation (Local or Cloud) task sequence:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Identify myself (happens automatically by way of registration)&lt;/li&gt; &lt;li&gt;If in an LDAP environment, import accounts or associate system with LDAP for account lookup and authentication&lt;/li&gt; &lt;li&gt; Identify Online Accounts (by fleshing out profile) which also connects system to online accounts and their data&lt;/li&gt; &lt;li&gt;Use Profile for granular description (Biography, Interests, WishList, OfferList, etc.)&lt;/li&gt; &lt;li&gt;Optionally upstream or downstream data to and from my online accounts&lt;/li&gt; &lt;li&gt;Create content Tagging Rules&lt;/li&gt; &lt;li&gt;Create rules for associating Tags with formal URIs&lt;/li&gt; &lt;li&gt;Create automatic Hyperlinking Rules for reuse when new content is created (e.g. &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id11a7c660&quot;&gt;Blog&lt;/a&gt; posts)&lt;/li&gt; &lt;li&gt;Exploit Data Portability virtues of RSS, Atom, OPML, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id13f54d50&quot;&gt;RDFa&lt;/a&gt;, RDF/XML, and other formats for imports and exports&lt;/li&gt; &lt;li&gt;Automatically &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id121ddff0&quot;&gt;tag&lt;/a&gt; imported content&lt;/li&gt; &lt;li&gt;Use function-specific helper application UIs for domain specific data generation e.g. AddressBook (optionally use vCard import), Calendar (optionally use iCalendar import), Email, File Storage (use WebDAV mount with copy and paste or HTTP GET), Feed Subscriptions (optionally import RSS/Atom/OPML feeds), Bookmarking (optionally import bookmark.html or XBEL) etc..&lt;/li&gt; &lt;li&gt;Optionally enable &amp;quot;Conversation&amp;quot; feature (today: Social Media feature) across the relevant application domains (manage conversations under covers using NNTP, the standard for this functionality realm) &lt;/li&gt; &lt;li&gt;Generate HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id13d5d378&quot;&gt;Entity&lt;/a&gt; IDs (URIs) for every piece of data in this burgeoning &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id11a69670&quot;&gt;data space&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Use REST based APIs to perform CRUD tasks against my data (local and remote) (&lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id11a76e10&quot;&gt;SPARQL&lt;/a&gt;, GData, Ubiquity Commands, Atom Publishing)&lt;/li&gt; &lt;li&gt;Use OpenID, OAuth, &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id11c9b3e0&quot;&gt;FOAF&lt;/a&gt;+SSL, FOAF+SSL+OpenID for accessing data elsewhere&lt;/li&gt; &lt;li&gt;Use OpenID, OAuth, FOAF+SSL, FOAF+SSL+OpenID for Controlling access to my data (Self Signed Certificate Generation, Browser Import of said Certificate &amp;amp; associated Private Key, plus persistence of Certificate to FOAF based profile data space in &amp;quot;one click&amp;quot;)&lt;/li&gt; &lt;li&gt;Have a simple UI for &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id14015bd0&quot;&gt;Entity&lt;/a&gt;-Attribute-Value or Subject-Predicate-Object arbitrary data annotations and creation since you can&amp;#39;t pre model an &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id11cd8548&quot;&gt;Open World&lt;/a&gt;&amp;quot; where the only constant is data flow&lt;/li&gt; &lt;li&gt;Have my Personal &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id142beee8&quot;&gt;URI&lt;/a&gt; (Web ID) as the single entry point for controlled access to my HTTP accessible data space&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; I&amp;#39;ve just outlined a snippet of the capabilities of the &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id13d64740&quot;&gt;OpenLink Data Spaces&lt;/a&gt; platform. A platform built using OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13d74170&quot;&gt;Virtuoso&lt;/a&gt;, architected to deliver: open, platform independent, multi-model, data access and data management across heterogeneous data sources. &lt;/p&gt; &lt;p&gt; All you need to remember is your URI when seeking to interact with your data space.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/GetAPersonalURIIn5MinutesOrLess&quot; id=&quot;link-id13c97948&quot;&gt;Get Yourself a URI (Web ID) in 5 Minutes or Less!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=%22data%20spaces%22&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1431e088&quot;&gt;Various posts over the years about Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1415&quot; id=&quot;link-id11f837f0&quot;&gt;Future of Desktop Post&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bnode.org/blog/2009/04/22/semantic-web-apps-to-simplify-my-life&quot; id=&quot;link-id1393f8a8&quot;&gt;Simplify My Life Post&lt;/a&gt; by &lt;a href=&quot;http://bnode.org/about&quot; id=&quot;link-id11da0cc8&quot;&gt;Bengee Nowack&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2009-04-22T15:32:06.000020-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web Scale and Fault Tolerance</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-04-01#1541</atom:id>
  <atom:published>2009-04-01T15:18:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;One concern about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x719d2f8&quot;&gt;Virtuoso&lt;/a&gt; Cluster is fault tolerance. This post talks about the basics of fault tolerance and what we can do with this, from improving resilience and optimizing performance to accommodating bulk loads without impacting interactive response. We will see that this is yet another step towards a 24/7 web-scale &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xa9a1d8d8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x25201030&quot;&gt;Web&lt;/a&gt;. We will see how large scale, continuous operation, and redundancy are related.&lt;/p&gt; &lt;p&gt;It has been said many times — when things are large enough, failures become frequent. In view of this, basic storage of partitions in multiple copies is built into the Virtuoso cluster from the start. Until now, this feature has not been tested or used very extensively, aside from the trivial case of keeping all schema &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x4548898&quot;&gt;information&lt;/a&gt; in synchronous replicas on all servers.&lt;/p&gt; &lt;h2&gt;Approaches to Fault Tolerance&lt;/h2&gt; &lt;p&gt;Fault tolerance has many aspects but it starts with keeping &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x18757400&quot;&gt;data&lt;/a&gt; in at least two copies. There are shared-disk cluster databases like &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x711c900&quot;&gt;Oracle&lt;/a&gt; RAC that do not depend on partitioning. With these, as long as the disk image is intact, servers can come and go. The fault tolerance of the disk in turn comes from mirroring done by the disk controller. Raids other than mirrored disk are not really good for databases because of write speed.&lt;/p&gt; &lt;p&gt;With shared-nothing setups like Virtuoso, fault tolerance is based on multiple servers keeping the same logical data. The copies are synchronized transaction-by-transaction but are not bit-for-bit identical nor write-by-write synchronous as is the case with mirrored disks.&lt;/p&gt; &lt;p&gt;There are asynchronous replication schemes generally based on log shipping, where the replica replays the transaction log of the master copy. The master copy gets the updates, the replica replays them. Both can take queries. These do not guarantee an entirely ACID fail-over but for many applications they come close enough.&lt;/p&gt; &lt;p&gt;In a tightly coupled cluster, it is possible to do synchronous, transactional updates on multiple copies without great added cost. Sending the message to two places instead of one does not make much difference since it is the latency that counts. But once we go to wide area networks, this becomes as good as unworkable for any sort of update volume. Thus, wide area replication must in practice be asynchronous.&lt;/p&gt; &lt;p&gt;This is a subject for another discussion. For now, the short answer is that wide area log shipping must be adapted to the application&amp;#39;s requirements for synchronicity and consistency. Also, exactly what content is shipped and to where depends on the application. Some application-specific logic will likely be involved; more than this one cannot say without a specific context.&lt;/p&gt; &lt;h2&gt;Basics of Partition Fail-Over&lt;/h2&gt; &lt;p&gt;For now, we will be concerned with redundancy protecting against broken hardware, software slowdown, or crashes inside a single site.&lt;/p&gt; &lt;p&gt;The basic idea is simple: Writes go to all copies; reads that must be repeatable or serializable (i.e., locking) go to the first copy; reads that refer to committed state without guarantee of repeatability can be balanced among all copies. When a copy goes offline, nobody needs to know, as long as there is at least one copy online for each partition. The exception in practice is when there are open cursors or such stateful things as aggregations pending on a copy that goes down. Then the query or transaction will abort and the application can retry. This looks like a deadlock to the application.&lt;/p&gt; &lt;p&gt;Coming back online is more complicated. This requires establishing that the recovering copy is actually in sync. In practice this requires a short window during which no transactions have uncommitted updates. Sometimes, forcing this can require aborting some transactions, which again looks like a deadlock to the application.&lt;/p&gt; &lt;p&gt;When an error is seen, such as a process no longer accepting connections and dropping existing cluster connections, we in practice go via two stages. First, the operations that directly depended on this process are aborted, as well as any computation being done on behalf of the disconnected server. At this stage, attempting to read data from the partition of the failed server will go to another copy but writes will still try to update all copies and will fail if the failed copy continues to be offline. After it is established that the failed copy will stay off for some time, writes may be re-enabled — but now having the failed copy rejoin the cluster will be more complicated, requiring an atomic window to ensure sync, as mentioned earlier.&lt;/p&gt; &lt;p&gt;For the DBA, there can be intermittent software crashes where a failed server automatically restarts itself, and there can be prolonged failures where this does not happen. Both are alerts but the first kind can wait. Since a system must essentially run itself, it will wait for some time for the failed server to restart itself. During this window, all reads of the failed partition go to the spare copy and writes give an error. If the spare does not come back up in time, the system will automatically re-enable writes on the spare but now the failed server may no longer rejoin the cluster without a complex sync cycle. This all can happen in well under a minute, faster than a human operator can react. The diagnostics can be done later.&lt;/p&gt; &lt;p&gt;If the situation was a hardware failure, recovery consists of taking a spare server and copying the database from the surviving online copy. This done, the spare server can come on line. Copying the database can be done while online and accepting updates but this may take some time, maybe an hour for every 200G of data copied over a network. In principle this could be automated by scripting, but we would normally expect a human DBA to be involved.&lt;/p&gt; &lt;p&gt;As a general rule, reacting to the failure goes automatically without disruption of service but bringing the failed copy online will usually require some operator action.&lt;/p&gt; &lt;h2&gt;Levels of Tolerance and Performance&lt;/h2&gt; &lt;p&gt;The only way to make failures totally invisible is to have all in duplicate and provisioned so that the system never runs at more than half the total capacity. This is often not economical or necessary. This is why we can do better, using the spare capacity for more than standby.&lt;/p&gt; &lt;p&gt;Imagine keeping a repository of linked data. Most of the content will come in through periodic bulk replacement of data sets. Some data will come in through pings from applications publishing FOAF and similar. Some data will come through on-demand RDFization of resources.&lt;/p&gt; &lt;p&gt;The performance of such a repository essentially depends on having enough memory. Having this memory in duplicate is just added cost. What we can do instead is have all copies store the whole partition but when routing queries, apply range partitioning on top of the basic hash partitioning. If one partition stores IDs 64K - 128K, the next partition 128K - 192K, and so forth, and all partitions are stored in two full copies, we can route reads to the first 32K IDs to the first copy and reads to the second 32K IDs to the second copy. In this way, the copies will keep different working sets. The RAM is used to full advantage.&lt;/p&gt; &lt;p&gt;Of course, if there is a failure, then the working set will degrade, but if this is not often and not for long, this can be quite tolerable. The alternate expense is buying twice as much RAM, likely meaning twice as many servers. This workload is memory intensive, thus servers should have the maximum memory they can have without going to parts that are so expensive one gets a new server for the price of doubling memory.&lt;/p&gt; &lt;h2&gt;Background Bulk Processing&lt;/h2&gt; &lt;p&gt;When loading data, the system is online in principle, but query response can be quite bad. A large &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x19fd9c18&quot;&gt;RDF&lt;/a&gt; load will involve most memory and queries will miss the cache. The load will further keep most disks busy, so response is not good. This is the case as soon as a server&amp;#39;s partition of the database is four times the size of RAM or greater. Whether the work is bulk-load or bulk-delete makes little difference.&lt;/p&gt; &lt;p&gt;But if partitions are replicated, we can temporarily split the database so that the first copies serve queries and the second copies do the load. If the copies serving on line activities do some updates also, these updates will be committed on both copies. But the load will be committed on the second copy only. This is fully appropriate as long as the data are different. When the bulk load is done, the second copy of each partition will have the full up to date state, including changes that came in during the bulk load. The online activity can be now redirected to the second copies and the first copies can be overwritten in the background by the second copies, so as to again have all data in duplicate.&lt;/p&gt; &lt;p&gt;Failures during such operations are not dangerous. If the copies doing the bulk load fail, the bulk load will have to be restarted. If the front end copies fail, the front end load goes to the copies doing the bulk load. Response times will be bad until the bulk load is stopped, but no data is lost.&lt;/p&gt; &lt;p&gt;This technique applies to all data intensive background tasks — calculation of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x20b7a568&quot;&gt;entity&lt;/a&gt; search ranks, data cleansing, consistency checking, and so on. If two copies are needed to keep up with the online load, then data can be kept just as well in three copies instead of two. This method applies to any data-warehouse-style workload which must coexist with online access and occasional low volume updating.&lt;/p&gt; &lt;h2&gt;Configurations of Redundancy&lt;/h2&gt; &lt;p&gt;Right now, we can declare that two or more server processes in a cluster form a group. All data managed by one member of the group is stored by all others. The members of the group are interchangeable. Thus, if there is four-servers-worth of data, then there will be a minimum of eight servers. Each of these servers will have one server process per core. The first hardware failure will not affect operations. For the second failure, there is a 1/7 chance that it stops the whole system, if it falls on the server whose pair is down. If groups consist of three servers, for a total of 12, the two first failures are guaranteed not to interrupt operations; for the third, there is a 1/10 chance that it will.&lt;/p&gt; &lt;p&gt;We note that for big databases, as said before, the RAM cache capacity is the sum of all the servers&amp;#39; RAM when in normal operation.&lt;/p&gt; &lt;p&gt;There are other, more dynamic ways of splitting data among servers, so that partitions migrate between servers and spawn extra copies of themselves if not enough copies are online. The Google File System (GFS) does something of this sort at the file system level; Amazon&amp;#39;s Dynamo does something similar at the database level. The analogies are not exact, though.&lt;/p&gt; &lt;p&gt;If data is partitioned in this manner, for example into 1K slices, each in duplicate, with the rule that the two duplicates will not be on the same physical server, the first failure will not break operations but the second probably will. Without extra logic, there is a probability that the partitions formerly hosted by the failed server have their second copies randomly spread over the remaining servers. This scheme equalizes load better but is less resilient.&lt;/p&gt; &lt;h2&gt;Maintenance and Continuity&lt;/h2&gt; &lt;p&gt;Databases may benefit from defragmentation, rebalancing of indices, and so on. While these are possible online, by definition they affect the working set and make response times quite bad as soon as the database is significantly larger than RAM. With duplicate copies, the problem is largely solved. Also, software version changes need not involve downtime.&lt;/p&gt; &lt;h2&gt;Present Status&lt;/h2&gt; &lt;p&gt;The basics of replicated partitions are operational. The items to finalize are about system administration procedures and automatic synchronization of recovering copies. This must be automatic because if it is not, the operator will find a way to forget something or do some steps in the wrong order. This also requires a management view that shows what the different processes are doing and whether something is hung or failing repeatedly. All this is for the recovery part; taking failed partitions offline is easy.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-01T11:18:54.000012-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web Scale and Fault Tolerance</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-04-01#1540</atom:id>
  <atom:published>2009-04-01T15:18:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;One concern about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x3b82c38&quot;&gt;Virtuoso&lt;/a&gt; Cluster is fault tolerance. This post talks about the basics of fault tolerance and what we can do with this, from improving resilience and optimizing performance to accommodating bulk loads without impacting interactive response. We will see that this is yet another step towards a 24/7 web-scale &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x22c42e10&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x1e4f0b58&quot;&gt;Web&lt;/a&gt;. We will see how large scale, continuous operation, and redundancy are related.&lt;/p&gt; &lt;p&gt;It has been said many times — when things are large enough, failures become frequent. In view of this, basic storage of partitions in multiple copies is built into the Virtuoso cluster from the start. Until now, this feature has not been tested or used very extensively, aside from the trivial case of keeping all schema &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x224401c0&quot;&gt;information&lt;/a&gt; in synchronous replicas on all servers.&lt;/p&gt; &lt;h2&gt;Approaches to Fault Tolerance&lt;/h2&gt; &lt;p&gt;Fault tolerance has many aspects but it starts with keeping &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x230b7500&quot;&gt;data&lt;/a&gt; in at least two copies. There are shared-disk cluster databases like &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0xa9a1d8d8&quot;&gt;Oracle&lt;/a&gt; RAC that do not depend on partitioning. With these, as long as the disk image is intact, servers can come and go. The fault tolerance of the disk in turn comes from mirroring done by the disk controller. Raids other than mirrored disk are not really good for databases because of write speed.&lt;/p&gt; &lt;p&gt;With shared-nothing setups like Virtuoso, fault tolerance is based on multiple servers keeping the same logical data. The copies are synchronized transaction-by-transaction but are not bit-for-bit identical nor write-by-write synchronous as is the case with mirrored disks.&lt;/p&gt; &lt;p&gt;There are asynchronous replication schemes generally based on log shipping, where the replica replays the transaction log of the master copy. The master copy gets the updates, the replica replays them. Both can take queries. These do not guarantee an entirely ACID fail-over but for many applications they come close enough.&lt;/p&gt; &lt;p&gt;In a tightly coupled cluster, it is possible to do synchronous, transactional updates on multiple copies without great added cost. Sending the message to two places instead of one does not make much difference since it is the latency that counts. But once we go to wide area networks, this becomes as good as unworkable for any sort of update volume. Thus, wide area replication must in practice be asynchronous.&lt;/p&gt; &lt;p&gt;This is a subject for another discussion. For now, the short answer is that wide area log shipping must be adapted to the application&amp;#39;s requirements for synchronicity and consistency. Also, exactly what content is shipped and to where depends on the application. Some application-specific logic will likely be involved; more than this one cannot say without a specific context.&lt;/p&gt; &lt;h2&gt;Basics of Partition Fail-Over&lt;/h2&gt; &lt;p&gt;For now, we will be concerned with redundancy protecting against broken hardware, software slowdown, or crashes inside a single site.&lt;/p&gt; &lt;p&gt;The basic idea is simple: Writes go to all copies; reads that must be repeatable or serializable (i.e., locking) go to the first copy; reads that refer to committed state without guarantee of repeatability can be balanced among all copies. When a copy goes offline, nobody needs to know, as long as there is at least one copy online for each partition. The exception in practice is when there are open cursors or such stateful things as aggregations pending on a copy that goes down. Then the query or transaction will abort and the application can retry. This looks like a deadlock to the application.&lt;/p&gt; &lt;p&gt;Coming back online is more complicated. This requires establishing that the recovering copy is actually in sync. In practice this requires a short window during which no transactions have uncommitted updates. Sometimes, forcing this can require aborting some transactions, which again looks like a deadlock to the application.&lt;/p&gt; &lt;p&gt;When an error is seen, such as a process no longer accepting connections and dropping existing cluster connections, we in practice go via two stages. First, the operations that directly depended on this process are aborted, as well as any computation being done on behalf of the disconnected server. At this stage, attempting to read data from the partition of the failed server will go to another copy but writes will still try to update all copies and will fail if the failed copy continues to be offline. After it is established that the failed copy will stay off for some time, writes may be re-enabled — but now having the failed copy rejoin the cluster will be more complicated, requiring an atomic window to ensure sync, as mentioned earlier.&lt;/p&gt; &lt;p&gt;For the DBA, there can be intermittent software crashes where a failed server automatically restarts itself, and there can be prolonged failures where this does not happen. Both are alerts but the first kind can wait. Since a system must essentially run itself, it will wait for some time for the failed server to restart itself. During this window, all reads of the failed partition go to the spare copy and writes give an error. If the spare does not come back up in time, the system will automatically re-enable writes on the spare but now the failed server may no longer rejoin the cluster without a complex sync cycle. This all can happen in well under a minute, faster than a human operator can react. The diagnostics can be done later.&lt;/p&gt; &lt;p&gt;If the situation was a hardware failure, recovery consists of taking a spare server and copying the database from the surviving online copy. This done, the spare server can come on line. Copying the database can be done while online and accepting updates but this may take some time, maybe an hour for every 200G of data copied over a network. In principle this could be automated by scripting, but we would normally expect a human DBA to be involved.&lt;/p&gt; &lt;p&gt;As a general rule, reacting to the failure goes automatically without disruption of service but bringing the failed copy online will usually require some operator action.&lt;/p&gt; &lt;h2&gt;Levels of Tolerance and Performance&lt;/h2&gt; &lt;p&gt;The only way to make failures totally invisible is to have all in duplicate and provisioned so that the system never runs at more than half the total capacity. This is often not economical or necessary. This is why we can do better, using the spare capacity for more than standby.&lt;/p&gt; &lt;p&gt;Imagine keeping a repository of linked data. Most of the content will come in through periodic bulk replacement of data sets. Some data will come in through pings from applications publishing FOAF and similar. Some data will come through on-demand RDFization of resources.&lt;/p&gt; &lt;p&gt;The performance of such a repository essentially depends on having enough memory. Having this memory in duplicate is just added cost. What we can do instead is have all copies store the whole partition but when routing queries, apply range partitioning on top of the basic hash partitioning. If one partition stores IDs 64K - 128K, the next partition 128K - 192K, and so forth, and all partitions are stored in two full copies, we can route reads to the first 32K IDs to the first copy and reads to the second 32K IDs to the second copy. In this way, the copies will keep different working sets. The RAM is used to full advantage.&lt;/p&gt; &lt;p&gt;Of course, if there is a failure, then the working set will degrade, but if this is not often and not for long, this can be quite tolerable. The alternate expense is buying twice as much RAM, likely meaning twice as many servers. This workload is memory intensive, thus servers should have the maximum memory they can have without going to parts that are so expensive one gets a new server for the price of doubling memory.&lt;/p&gt; &lt;h2&gt;Background Bulk Processing&lt;/h2&gt; &lt;p&gt;When loading data, the system is online in principle, but query response can be quite bad. A large &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x3c0cfb8&quot;&gt;RDF&lt;/a&gt; load will involve most memory and queries will miss the cache. The load will further keep most disks busy, so response is not good. This is the case as soon as a server&amp;#39;s partition of the database is four times the size of RAM or greater. Whether the work is bulk-load or bulk-delete makes little difference.&lt;/p&gt; &lt;p&gt;But if partitions are replicated, we can temporarily split the database so that the first copies serve queries and the second copies do the load. If the copies serving on line activities do some updates also, these updates will be committed on both copies. But the load will be committed on the second copy only. This is fully appropriate as long as the data are different. When the bulk load is done, the second copy of each partition will have the full up to date state, including changes that came in during the bulk load. The online activity can be now redirected to the second copies and the first copies can be overwritten in the background by the second copies, so as to again have all data in duplicate.&lt;/p&gt; &lt;p&gt;Failures during such operations are not dangerous. If the copies doing the bulk load fail, the bulk load will have to be restarted. If the front end copies fail, the front end load goes to the copies doing the bulk load. Response times will be bad until the bulk load is stopped, but no data is lost.&lt;/p&gt; &lt;p&gt;This technique applies to all data intensive background tasks — calculation of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x3b38ac0&quot;&gt;entity&lt;/a&gt; search ranks, data cleansing, consistency checking, and so on. If two copies are needed to keep up with the online load, then data can be kept just as well in three copies instead of two. This method applies to any data-warehouse-style workload which must coexist with online access and occasional low volume updating.&lt;/p&gt; &lt;h2&gt;Configurations of Redundancy&lt;/h2&gt; &lt;p&gt;Right now, we can declare that two or more server processes in a cluster form a group. All data managed by one member of the group is stored by all others. The members of the group are interchangeable. Thus, if there is four-servers-worth of data, then there will be a minimum of eight servers. Each of these servers will have one server process per core. The first hardware failure will not affect operations. For the second failure, there is a 1/7 chance that it stops the whole system, if it falls on the server whose pair is down. If groups consist of three servers, for a total of 12, the two first failures are guaranteed not to interrupt operations; for the third, there is a 1/10 chance that it will.&lt;/p&gt; &lt;p&gt;We note that for big databases, as said before, the RAM cache capacity is the sum of all the servers&amp;#39; RAM when in normal operation.&lt;/p&gt; &lt;p&gt;There are other, more dynamic ways of splitting data among servers, so that partitions migrate between servers and spawn extra copies of themselves if not enough copies are online. The Google File System (GFS) does something of this sort at the file system level; Amazon&amp;#39;s Dynamo does something similar at the database level. The analogies are not exact, though.&lt;/p&gt; &lt;p&gt;If data is partitioned in this manner, for example into 1K slices, each in duplicate, with the rule that the two duplicates will not be on the same physical server, the first failure will not break operations but the second probably will. Without extra logic, there is a probability that the partitions formerly hosted by the failed server have their second copies randomly spread over the remaining servers. This scheme equalizes load better but is less resilient.&lt;/p&gt; &lt;h2&gt;Maintenance and Continuity&lt;/h2&gt; &lt;p&gt;Databases may benefit from defragmentation, rebalancing of indices, and so on. While these are possible online, by definition they affect the working set and make response times quite bad as soon as the database is significantly larger than RAM. With duplicate copies, the problem is largely solved. Also, software version changes need not involve downtime.&lt;/p&gt; &lt;h2&gt;Present Status&lt;/h2&gt; &lt;p&gt;The basics of replicated partitions are operational. The items to finalize are about system administration procedures and automatic synchronization of recovering copies. This must be automatic because if it is not, the operator will find a way to forget something or do some steps in the wrong order. This also requires a management view that shows what the different processes are doing and whether something is hung or failing repeatedly. All this is for the recovery part; taking failed partitions offline is easy.&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-01T11:18:51.000014-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Live Virtuoso instance hosting Linked Open Data (LOD) Cloud</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-03-30#1539</atom:id>
  <atom:published>2009-03-30T16:27:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have reached a beachead re. the &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id11a035e0&quot;&gt;Virtuoso instance hosting the Linked Open Data (LOD) Cloud&lt;/a&gt;; meaning, we are not going to be performing any major updates and deletions short-term, bar incorporation of fresh data sets from the Freebase and &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id121d7278&quot;&gt;Bio2RDF&lt;/a&gt; projects (both communities a prepping new RDF data sets).&lt;/p&gt; &lt;p&gt;At the current time we have loaded 100% of all the very large data sets from the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2009-03-05.html&quot; id=&quot;link-id1441f7e0&quot;&gt;LOD Cloud&lt;/a&gt;. As result, we can start the process of exposing &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id16c53de8&quot;&gt;Linked Data&lt;/a&gt; virtues in a manner that&amp;#39;s palatable to users, developers, and database professionals across the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x20165290&quot;&gt;Web&lt;/a&gt; 1.0, 2.0, and 3.0 spectrums.&lt;/p&gt; &lt;h3&gt;What does this mean?&lt;/h3&gt; &lt;p&gt;You can use the &amp;quot;Search &amp;amp; Find&amp;quot; or&amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id119c6878&quot;&gt;URI&lt;/a&gt; Lookup&amp;quot; or &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id157acde8&quot;&gt;SPARQL&lt;/a&gt; endpoint associated with the LOD cloud hosting instance to perform the following tasks:&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Find entities associated with &lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id11a82f28&quot;&gt;full text search&lt;/a&gt; patterns -- Google Style, but with &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id131b6380&quot;&gt;Entity&lt;/a&gt; &amp;amp; Text proximity Rank instead of Page Rank, since we are dealing with Entities rather than documents about entities&lt;/li&gt; &lt;li&gt;Find and Lookup entities by Identifier (URI) -- which is helpful when locating URIs to use for identify entities in your own linked data spaces on the Web&lt;/li&gt; &lt;li&gt;View entity descriptions via a variety of representation formats (HTML, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id11e323b0&quot;&gt;RDFa&lt;/a&gt;, RDF/XML, N3, Turtle etc.)&lt;/li&gt; &lt;li&gt;Determine uses of entity identifiers across the LOD cloud -- which helps you select preferred URIs based on usage statistics.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;What does it offer Web 1.0 and 2.0 developers?&lt;/h3&gt; &lt;p&gt; If you don&amp;#39;t want to use the &lt;a href=&quot;http://lod.openlinksw.com/sparql&quot; id=&quot;link-id15c1ec30&quot;&gt;SPARQL based Web Service&lt;/a&gt;, or other Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id15ebd3b0&quot;&gt;Web&lt;/a&gt; oriented APIs for interacting with the LOD cloud programmatically, you can simply use the powerful &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtuosoFacetsWebService&quot; id=&quot;link-id12e556a8&quot;&gt;REST style Web Service&lt;/a&gt; that provides &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id12138090&quot;&gt;URL&lt;/a&gt; parameters for performing full text oriented &amp;quot;Search&amp;quot;, entity oriented &amp;quot;Find&amp;quot; queries, and faceted navigation over the huge data corpus with results data returned in JSON and XML formats.&lt;/p&gt; &lt;h3&gt;Next Steps:&lt;/h3&gt; &lt;p&gt; Amazon have agreed to add all the LOD Cloud data sets to their existing &lt;a href=&quot;http://aws.amazon.com/publicdatasets&quot; id=&quot;link-id11989aa8&quot;&gt;public data sets collective&lt;/a&gt;. Thus, the data sets we are loading will be available in &amp;quot;raw data&amp;quot; (RDF) format on the public data sets page via Named Elastic Block Storage (EBS) Snapshots); meaning, you can make an EC2 AMI (e.g. a Linux, Windows, Solaris) and install an RDF quad or triple store of choice into your AMI, then simply load data from the LOD cloud based on your needs.&lt;/p&gt; &lt;p&gt; In addition to the above, we are also going to offer a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtInstallationEC2&quot; id=&quot;link-id13982a88&quot;&gt;Virtuoso 6.0 Cluster Edition based LOD Cloud AMI&lt;/a&gt; (as we&amp;#39;ve already done with &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIDBpediaInstall&quot; id=&quot;link-id12cba108&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIMusicBrainzInstall&quot; id=&quot;link-id1390d338&quot;&gt;MusicBrainz&lt;/a&gt;, &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMINeuroCommonsInstall&quot; id=&quot;link-id15801668&quot;&gt;NeuroCommons&lt;/a&gt;, and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIBio2rdfInstall&quot; id=&quot;link-id133e0840&quot;&gt;Bio2Rdf&lt;/a&gt;) that will enable you to simply instantiate a personal and service specific edition of Virtuoso with all the LOD data in place and fully tuned for performance and scalability; basically, you will simply press &amp;quot;Instantiate AMI&amp;quot; and a LOD cloud &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id15ccbf80&quot;&gt;data space&lt;/a&gt;, in true Linked Data from, will be at your disposal within minutes (i.e. the time it takes the DB to start).&lt;/p&gt; &lt;p&gt;Work on the migration of the LOD data to EC2 starts this week. Thus, if you are interested in contributing an RDF based data set to the LOD cloud now is the time to get your archive links in place on the (see: &lt;a href=&quot;http://esw.w3.org/topic/DataSetRDFDumps&quot; id=&quot;link-id154d6f88&quot;&gt;ESW Wiki page for LOD Data Sets&lt;/a&gt;).&lt;/p&gt;</atom:content>
  <atom:updated>2009-04-01T14:26:22.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Beyond Applications - Introducing the Planetary Datasphere (Part 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-03-25#1538</atom:id>
  <atom:published>2009-03-25T15:50:56Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1535&quot; id=&quot;link-id155e3bd0&quot;&gt;We have looked at the general implications of the DataSphere&lt;/a&gt;, a universal, ubiquitous database infrastructure, on end-user experience and application development and content. Now we will look at what this means at the back end, from hosting to security to server software and hardware.&lt;/p&gt; &lt;h2&gt;Application Hosting&lt;/h2&gt; &lt;p&gt;For the infrastructure provider, hosting the DataSphere is no different from hosting large Web 2.0 sites. This may be paid for by users, as in the cloud computing model where users rent capacity for their own purposes, or by advertisers, as in most of Web 2.0.&lt;/p&gt; &lt;p&gt;Clouds play a role in this as places with high local connectivity. The DataSphere is the atmosphere; the Cloud is an atmospheric phenomenon.&lt;/p&gt; &lt;h2&gt;What of Proprietary &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x10fd3e18&quot;&gt;Data&lt;/a&gt; and its Security?&lt;/h2&gt; &lt;p&gt;Having proprietary data does not imply using a proprietary language. I would say that for any domain of discourse, no matter how private or specialized, at least some structural concepts can be borrowed from public, more generic sources. This lowers training thresholds and facilitates integration. Being able to integrate does not imply opening one&amp;#39;s own data. To take an analogy, if you have a bunker with closed circuit air recycling, you still breathe air, even if that air is cut off from the atmosphere at large. For places with complex existing &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x13cae0b0&quot;&gt;RDBMS&lt;/a&gt; security, the best is to map the RDBMS to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x13deb7d8&quot;&gt;RDF&lt;/a&gt; on the fly, always running all requests through the RDBMS. This implicitly preserves any policy or label based security schemes.&lt;/p&gt; &lt;h2&gt;What of Individual Privacy on the Open Web?&lt;/h2&gt; &lt;p&gt;The more complex situations will be found in environments with mixed security needs, as in social networking with partly-open and partly-closed profiles. The FOAF+SSL solution with &lt;code&gt;https://&lt;/code&gt; URIs is one approach. For query processing, we have a question of enforcing instance-level policies. In the DataSphere, granting privileges on tables and views no longer makes sense. In &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1211a490&quot;&gt;SQL&lt;/a&gt;, a policy means that behind the scenes the DBMS will add extra criteria to queries and updates depending on who is issuing them. The query processor adds conditions like getting the user&amp;#39;s department ID and comparing it to the department ID on the payroll record. Labeled security is a scheme where data rows themselves contain security tags and the DBMS enforces these, row by row.&lt;/p&gt; &lt;p&gt;I would say that these techniques are suited for highly-structured situations where the roles, compartments, and needs are clear, and where the organization has the database know-how to write, test, and deploy such rules by the table, row, and column. This does not sit well with schema-last. I would not bet much on an average developer&amp;#39;s capacity for making airtight policies on RDF data where not even 100% schema-adherence is guaranteed.&lt;/p&gt; &lt;p&gt;Doing security at the RDF graph level seems more appropriate. In many use cases, the graph is analogous to a photo album or a file system directory. A Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x13beff18&quot;&gt;Space&lt;/a&gt; can be divided into graphs to provide more granularity for expressing topic, provenance, or security. If policy conditions apply mostly to the graph, then things are not as likely to slip by, for example, policy rules missing some infrequent misuse of the schema. In these cases, the burden on the query processor is also not excessive: Just as with documents, the container (table, graph) is the object of access grants, not the individual sentences (DBMS records, RDF triples) in the document.&lt;/p&gt; &lt;p&gt;It is left to the application to present a choice of graph level policies to the user. Exactly what these will be depends on the domain of discourse. A policy might restrict access to a meeting in a calendar to people whose OpenIDs figure in the attendee list, or limit access to a photo album to people mentioned in the owner&amp;#39;s social network. Defining such policies is typically a task for the application developer.&lt;/p&gt; &lt;p&gt;The difference between the Document Web and the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x13106cd0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x13ca1050&quot;&gt;Web&lt;/a&gt; is that while the Document Web enforces security when a thing is returned to the user, Linked Data Web enforcement must occur whenever a query references something, even if this is an intermediate result not directly shown to the user.&lt;/p&gt; &lt;p&gt;The DataSphere will offer a generic policy scheme, filtering what graphs are accessed in a given query situation. Other applications may then verify the safety of one&amp;#39;s disclosed &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x13a02d60&quot;&gt;information&lt;/a&gt; using the same DataSphere infrastructure. Of course, the user must rely on the infrastructure provider to correctly enforce these rules. Then again, some users will operate and audit their own infrastructure anyway.&lt;/p&gt; &lt;h2&gt;Federation vs. Centralization&lt;/h2&gt; &lt;p&gt;On the open web, there is the question of federation vs. centralization. If an application is seen to be an interface to a vocabulary, it becomes more agnostic with respect to this. In practice, if we are talking about hosted services, what is hosted together joins much faster. Data Spaces with lots of interlinking, such as closely connected social networks, will tend to cluster together on the same cloud to facilitate joint operation. Data is ubiquitous and not location-conscious, but what one can efficiently do with it depends on location. Joint access patterns favor joint location. Due to technicalities of the matter, single database clusters will run complex queries within the cluster 100 to 1000 times faster than between clusters. The size of such data clouds may be in the hundreds-of-billions of triples. It seems to make sense to have data belonging to same-type or jointly-used applications close together. In practice, there will arise partitioning by type of usage, user profile, etc., but this is no longer airtight and applications more-or-less float on top of all of this.&lt;/p&gt; &lt;p&gt;A search engine can host a copy of the Document Web and allow text lookups on it. But a text lookup is a single well-defined query that happens to parallelize and partition very well. A search engine can also have all the structured public data copied, but the problem there is that queries are a lot less predictable and may take orders of magnitude more resources than a single text lookup. As a partial answer, even now, we can set up a database so that the first million single-row joins cost the user nothing, but doing more requires a special subscription.&lt;/p&gt; &lt;p&gt;The cost for hosting a trillion triples will vary radically in function of what throughput is promised. This may result in pricing per service level, a bit like ISP pricing varies in function of promised connectivity. Queries can be run for free if no throughput guarantee applies, and might cost more if the host promises at least five-million joins-per-second including infrequently-accessed data.&lt;/p&gt; &lt;p&gt;Performance and cost dynamics will probably lead to the emergence of domain-specific clusters of colocated Data Spaces. The landscape will be hybrid, where usage drives data colocation. A single Google is not a practical solution to the world&amp;#39;s spectrum of query needs.&lt;/p&gt; &lt;h2&gt;What is the Cost of Schema-Last?&lt;/h2&gt; &lt;p&gt;The DataSphere proposition is predicated on a worldwide database fabric that can store anything, just like a network can transport anything. It cannot enforce a fixed schema, just like TCP/IP cannot say that it will transport only email. This is continuous schema evolution. Well, TCP/IP can transport anything but it does transport a lot of HTML and email. Similarly, the DataSphere can optimize for some common vocabularies.&lt;/p&gt; &lt;p&gt;We have seen that an application-specific relational schema is often 10 times more efficient than an equivalent completely generic RDF representation of the same thing. The gap may narrow, but task specific representations will keep an edge. We ought to know, as we do both.&lt;/p&gt; &lt;p&gt;While anything can be represented, the masses are not that creative. For any data-hosting provider, making a specialized representation for the top 100 entities may cut data size in half or better. This is a behind-the-scenes optimization that will in time be a matter of course.&lt;/p&gt; &lt;p&gt;Historically, our industry has been driven by two phenomena:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;b&gt;New PCs every 2 years.&lt;/b&gt; To make this necessary, Windows has been getting bigger and bigger, and not upgrading is not an option if one must exchange documents with new data formats and keep up with security.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Agility, or &lt;i&gt;ad hoc&lt;/i&gt; over planned.&lt;/b&gt; The reason the RDBMS won over &lt;a href=&quot;http://dbpedia.org/resource/CODASYL&quot; id=&quot;link-id0x24ee5098&quot;&gt;CODASYL&lt;/a&gt; network databases was that one did not have to define what queries could be made when creating the database. With the Linked Data Web, we have one more step in this direction when we say that one does not have to decide what can be represented when creating the database.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To summarize, there is some cost to schema-last, but then our industry needs more complexity to keep justifying constant investment. The cost is in this sense not all bad.&lt;/p&gt; &lt;p&gt;Building the DataSphere may be the next great driver of server demand. As a case in point, Cisco, whose fortune was made when the network became ubiquitous, just entered the server game. It&amp;#39;s in the air.&lt;/p&gt; &lt;h2&gt;DataSphere Precursors&lt;/h2&gt; &lt;p&gt;Right now, we have the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x13ea7938&quot;&gt;Linked Open Data&lt;/a&gt; movement with lots of new data being added. We have the drive for data- and reputation-portability. We have Freebase as a demonstrator of end-users actually producing structured data. We have convergence of terminology around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x13ae45e8&quot;&gt;DBpedia&lt;/a&gt;, FOAF, SIOC, and more. We have demonstrators of useful data integration on the RDF stack in diverse fields, especially life sciences.&lt;/p&gt; &lt;p&gt;We have a totally ubiquitous network for the distribution of this, plus database technology to make this work.&lt;/p&gt; &lt;p&gt;We have a practical need for semantics, as search is getting saturated, email is getting killed by spam, and information overload is a constant. Social networks can be leveraged for solving a lot of this, if they can only be opened.&lt;/p&gt; &lt;p&gt;Of course, there is a call for transparency in society at large. Well, the battle of transparency vs. spin is a permanent feature of human existence but even there, we cannot ignore the possibilities of open data.&lt;/p&gt; &lt;h2&gt;Databases and Servers&lt;/h2&gt; &lt;p&gt;Technically, what does this take? Mostly, this takes a lot of memory. The software is there and we are productizing it as we speak. As with other data intensive things, the key is scalable querying over clusters of commodity servers. Nothing we have not heard before. Of course, the DBMS must know about RDF specifics to get the right query plans and so on but this we have explained elsewhere.&lt;/p&gt; &lt;p&gt;This all comes down to the cost of memory. No amount of CPU or network speed will make any difference if data is not in memory. Right now, a board with 8G and a dual core AMD X86-64 and 4 disks may cost about $700. 2 x 4 core Xeon and 16G and 8 disks may be $4000, counting just the components. In our experience, about 32G per billion triples is a minimum. This must be backed by a few independent disks so as to fill the cache in parallel. A cluster with 1 TB of RAM would be under $100K if built from low end boards.&lt;/p&gt; &lt;p&gt;The workload is all about large joins across partitions. The queries parallelize well, thus using the largest and most expensive machines for building blocks is not cost efficient. Having absolutely everything in RAM is also not cost efficient, but it is necessary to have many disks to absorb the random access load. Disk access is predominantly random, unlike some analytics workloads that can read serially. If SSD&amp;#39;s get a bit cheaper, one could have SSD for the database and disk for backup.&lt;/p&gt; &lt;p&gt;With large data centers, redundancy becomes an issue. The most cost effective redundancy is simply storing partitions in duplicate or triplicate on different commodity servers. The DBMS software should handle the replication and fail-over.&lt;/p&gt; &lt;p&gt;For operating such systems, scaling-on-demand is necessary. Data must move between servers, and adding or replacing servers should be an on-the-fly operation. Also, since access is essentially never uniform, the most commonly accessed partitions may benefit from being kept in more copies than less frequently accessed ones. The DBMS must be essentially self administrating since these things are quite complex and easily intractable if one does not have in depth understanding of this rather complex field.&lt;/p&gt; &lt;p&gt;The best price point for hardware varies with time. Right now, the optimum is to have many basic motherboards with maximum memory in a rack unit, then another unit with local disks for each motherboard. Much cheaper than SAN&amp;#39;s and Infiniband fabrics.&lt;/p&gt; &lt;h2&gt;Conclusions and Next Steps&lt;/h2&gt; &lt;p&gt;The ingredients and use cases are there. If server clusters with 1TB RAM begin under $100K, the cost of deployment is small compared to personnel costs.&lt;/p&gt; &lt;p&gt;Bootstrapping the DataSphere from current Linked Open Data, such as DBpedia, &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id0x13c36da8&quot;&gt;OpenCYC&lt;/a&gt;, Freebase, and every sort of social network, is feasible. Aside from private data integration and analytics efforts and E-science, the use cases are liberating social networks and C2C and some aspects of search from silos, overcoming spam, and mass use of semantics extracted from text. Emergent effects will then carry the ball to places we have not yet been.&lt;/p&gt; &lt;p&gt;The Linked Data Web has its origins in &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1405f0a8&quot;&gt;Semantic Web&lt;/a&gt; research, and many of the present participants come from these circles. Things may have been slowed down by a disconnect, only too typical of human activity, between Semantic Web research on one hand and database engineering on the other. Right now, the challenge is one of engineering. As documented on this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x2329f1a8&quot;&gt;blog&lt;/a&gt;, we have worked quite a bit on cluster databases, mostly but not exclusively with RDF use cases. The actual challenges of this are however not at all what is discussed in Semantic Web conferences. These have to do with complexities of parallelism, timing, message bottlenecks, transactions, and the like, i.e., hardcore engineering. These are difficult beyond what the casual onlooker might guess but not impossible. The details that remain to be worked out are nothing semantic, they are hardcore database, concerning automatic provisioning and such matters.&lt;/p&gt; &lt;p&gt;It is as if the Semantic Web people look with envy at the Web 2.0 side where there are big deployments in production, yet they do not seem quite ready to take the step themselves. Well, I will write some other time about research and engineering. For now, the message is &amp;amp;mdash &lt;i&gt;&lt;b&gt;go for it&lt;/b&gt;&lt;/i&gt;. Stay tuned for more announcements, as we near production with our next generation of software.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1535&quot; id=&quot;link-id14e02bb0&quot;&gt;Beyond Applications - Introducing the Planetary Datasphere (Part 1)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id117dc518&quot;&gt;Serendipitous Discovery Quotient (SDQ)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1534&quot; id=&quot;link-id15c52410&quot;&gt;How Linked Data will change Advertising&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id11e93658&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?tag=DataSpace&quot; id=&quot;link-id1491a588&quot;&gt;Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-25T12:31:58.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Beyond Applications - Introducing the Planetary Datasphere (Part 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-03-25#1537</atom:id>
  <atom:published>2009-03-25T15:50:56Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1535&quot; id=&quot;link-id155e3bd0&quot;&gt;We have looked at the general implications of the DataSphere&lt;/a&gt;, a universal, ubiquitous database infrastructure, on end-user experience and application development and content. Now we will look at what this means at the back end, from hosting to security to server software and hardware.&lt;/p&gt; &lt;h2&gt;Application Hosting&lt;/h2&gt; &lt;p&gt;For the infrastructure provider, hosting the DataSphere is no different from hosting large Web 2.0 sites. This may be paid for by users, as in the cloud computing model where users rent capacity for their own purposes, or by advertisers, as in most of Web 2.0.&lt;/p&gt; &lt;p&gt;Clouds play a role in this as places with high local connectivity. The DataSphere is the atmosphere; the Cloud is an atmospheric phenomenon.&lt;/p&gt; &lt;h2&gt;What of Proprietary &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x13b5b4a0&quot;&gt;Data&lt;/a&gt; and its Security?&lt;/h2&gt; &lt;p&gt;Having proprietary data does not imply using a proprietary language. I would say that for any domain of discourse, no matter how private or specialized, at least some structural concepts can be borrowed from public, more generic sources. This lowers training thresholds and facilitates integration. Being able to integrate does not imply opening one&amp;#39;s own data. To take an analogy, if you have a bunker with closed circuit air recycling, you still breathe air, even if that air is cut off from the atmosphere at large. For places with complex existing &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x24db80e0&quot;&gt;RDBMS&lt;/a&gt; security, the best is to map the RDBMS to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x24ea7c40&quot;&gt;RDF&lt;/a&gt; on the fly, always running all requests through the RDBMS. This implicitly preserves any policy or label based security schemes.&lt;/p&gt; &lt;h2&gt;What of Individual Privacy on the Open Web?&lt;/h2&gt; &lt;p&gt;The more complex situations will be found in environments with mixed security needs, as in social networking with partly-open and partly-closed profiles. The FOAF+SSL solution with &lt;code&gt;https://&lt;/code&gt; URIs is one approach. For query processing, we have a question of enforcing instance-level policies. In the DataSphere, granting privileges on tables and views no longer makes sense. In &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x24aaccc0&quot;&gt;SQL&lt;/a&gt;, a policy means that behind the scenes the DBMS will add extra criteria to queries and updates depending on who is issuing them. The query processor adds conditions like getting the user&amp;#39;s department ID and comparing it to the department ID on the payroll record. Labeled security is a scheme where data rows themselves contain security tags and the DBMS enforces these, row by row.&lt;/p&gt; &lt;p&gt;I would say that these techniques are suited for highly-structured situations where the roles, compartments, and needs are clear, and where the organization has the database know-how to write, test, and deploy such rules by the table, row, and column. This does not sit well with schema-last. I would not bet much on an average developer&amp;#39;s capacity for making airtight policies on RDF data where not even 100% schema-adherence is guaranteed.&lt;/p&gt; &lt;p&gt;Doing security at the RDF graph level seems more appropriate. In many use cases, the graph is analogous to a photo album or a file system directory. A Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x2396c058&quot;&gt;Space&lt;/a&gt; can be divided into graphs to provide more granularity for expressing topic, provenance, or security. If policy conditions apply mostly to the graph, then things are not as likely to slip by, for example, policy rules missing some infrequent misuse of the schema. In these cases, the burden on the query processor is also not excessive: Just as with documents, the container (table, graph) is the object of access grants, not the individual sentences (DBMS records, RDF triples) in the document.&lt;/p&gt; &lt;p&gt;It is left to the application to present a choice of graph level policies to the user. Exactly what these will be depends on the domain of discourse. A policy might restrict access to a meeting in a calendar to people whose OpenIDs figure in the attendee list, or limit access to a photo album to people mentioned in the owner&amp;#39;s social network. Defining such policies is typically a task for the application developer.&lt;/p&gt; &lt;p&gt;The difference between the Document Web and the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x238a0098&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x23882280&quot;&gt;Web&lt;/a&gt; is that while the Document Web enforces security when a thing is returned to the user, Linked Data Web enforcement must occur whenever a query references something, even if this is an intermediate result not directly shown to the user.&lt;/p&gt; &lt;p&gt;The DataSphere will offer a generic policy scheme, filtering what graphs are accessed in a given query situation. Other applications may then verify the safety of one&amp;#39;s disclosed &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x2388e458&quot;&gt;information&lt;/a&gt; using the same DataSphere infrastructure. Of course, the user must rely on the infrastructure provider to correctly enforce these rules. Then again, some users will operate and audit their own infrastructure anyway.&lt;/p&gt; &lt;h2&gt;Federation vs. Centralization&lt;/h2&gt; &lt;p&gt;On the open web, there is the question of federation vs. centralization. If an application is seen to be an interface to a vocabulary, it becomes more agnostic with respect to this. In practice, if we are talking about hosted services, what is hosted together joins much faster. Data Spaces with lots of interlinking, such as closely connected social networks, will tend to cluster together on the same cloud to facilitate joint operation. Data is ubiquitous and not location-conscious, but what one can efficiently do with it depends on location. Joint access patterns favor joint location. Due to technicalities of the matter, single database clusters will run complex queries within the cluster 100 to 1000 times faster than between clusters. The size of such data clouds may be in the hundreds-of-billions of triples. It seems to make sense to have data belonging to same-type or jointly-used applications close together. In practice, there will arise partitioning by type of usage, user profile, etc., but this is no longer airtight and applications more-or-less float on top of all of this.&lt;/p&gt; &lt;p&gt;A search engine can host a copy of the Document Web and allow text lookups on it. But a text lookup is a single well-defined query that happens to parallelize and partition very well. A search engine can also have all the structured public data copied, but the problem there is that queries are a lot less predictable and may take orders of magnitude more resources than a single text lookup. As a partial answer, even now, we can set up a database so that the first million single-row joins cost the user nothing, but doing more requires a special subscription.&lt;/p&gt; &lt;p&gt;The cost for hosting a trillion triples will vary radically in function of what throughput is promised. This may result in pricing per service level, a bit like ISP pricing varies in function of promised connectivity. Queries can be run for free if no throughput guarantee applies, and might cost more if the host promises at least five-million joins-per-second including infrequently-accessed data.&lt;/p&gt; &lt;p&gt;Performance and cost dynamics will probably lead to the emergence of domain-specific clusters of colocated Data Spaces. The landscape will be hybrid, where usage drives data colocation. A single Google is not a practical solution to the world&amp;#39;s spectrum of query needs.&lt;/p&gt; &lt;h2&gt;What is the Cost of Schema-Last?&lt;/h2&gt; &lt;p&gt;The DataSphere proposition is predicated on a worldwide database fabric that can store anything, just like a network can transport anything. It cannot enforce a fixed schema, just like TCP/IP cannot say that it will transport only email. This is continuous schema evolution. Well, TCP/IP can transport anything but it does transport a lot of HTML and email. Similarly, the DataSphere can optimize for some common vocabularies.&lt;/p&gt; &lt;p&gt;We have seen that an application-specific relational schema is often 10 times more efficient than an equivalent completely generic RDF representation of the same thing. The gap may narrow, but task specific representations will keep an edge. We ought to know, as we do both.&lt;/p&gt; &lt;p&gt;While anything can be represented, the masses are not that creative. For any data-hosting provider, making a specialized representation for the top 100 entities may cut data size in half or better. This is a behind-the-scenes optimization that will in time be a matter of course.&lt;/p&gt; &lt;p&gt;Historically, our industry has been driven by two phenomena:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;b&gt;New PCs every 2 years.&lt;/b&gt; To make this necessary, Windows has been getting bigger and bigger, and not upgrading is not an option if one must exchange documents with new data formats and keep up with security.&lt;/li&gt; &lt;li&gt; &lt;b&gt;Agility, or &lt;i&gt;ad hoc&lt;/i&gt; over planned.&lt;/b&gt; The reason the RDBMS won over &lt;a href=&quot;http://dbpedia.org/resource/CODASYL&quot; id=&quot;link-id0x13b23460&quot;&gt;CODASYL&lt;/a&gt; network databases was that one did not have to define what queries could be made when creating the database. With the Linked Data Web, we have one more step in this direction when we say that one does not have to decide what can be represented when creating the database.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;To summarize, there is some cost to schema-last, but then our industry needs more complexity to keep justifying constant investment. The cost is in this sense not all bad.&lt;/p&gt; &lt;p&gt;Building the DataSphere may be the next great driver of server demand. As a case in point, Cisco, whose fortune was made when the network became ubiquitous, just entered the server game. It&amp;#39;s in the air.&lt;/p&gt; &lt;h2&gt;DataSphere Precursors&lt;/h2&gt; &lt;p&gt;Right now, we have the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x236a9be8&quot;&gt;Linked Open Data&lt;/a&gt; movement with lots of new data being added. We have the drive for data- and reputation-portability. We have Freebase as a demonstrator of end-users actually producing structured data. We have convergence of terminology around &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x24db8350&quot;&gt;DBpedia&lt;/a&gt;, FOAF, SIOC, and more. We have demonstrators of useful data integration on the RDF stack in diverse fields, especially life sciences.&lt;/p&gt; &lt;p&gt;We have a totally ubiquitous network for the distribution of this, plus database technology to make this work.&lt;/p&gt; &lt;p&gt;We have a practical need for semantics, as search is getting saturated, email is getting killed by spam, and information overload is a constant. Social networks can be leveraged for solving a lot of this, if they can only be opened.&lt;/p&gt; &lt;p&gt;Of course, there is a call for transparency in society at large. Well, the battle of transparency vs. spin is a permanent feature of human existence but even there, we cannot ignore the possibilities of open data.&lt;/p&gt; &lt;h2&gt;Databases and Servers&lt;/h2&gt; &lt;p&gt;Technically, what does this take? Mostly, this takes a lot of memory. The software is there and we are productizing it as we speak. As with other data intensive things, the key is scalable querying over clusters of commodity servers. Nothing we have not heard before. Of course, the DBMS must know about RDF specifics to get the right query plans and so on but this we have explained elsewhere.&lt;/p&gt; &lt;p&gt;This all comes down to the cost of memory. No amount of CPU or network speed will make any difference if data is not in memory. Right now, a board with 8G and a dual core AMD X86-64 and 4 disks may cost about $700. 2 x 4 core Xeon and 16G and 8 disks may be $4000, counting just the components. In our experience, about 32G per billion triples is a minimum. This must be backed by a few independent disks so as to fill the cache in parallel. A cluster with 1 TB of RAM would be under $100K if built from low end boards.&lt;/p&gt; &lt;p&gt;The workload is all about large joins across partitions. The queries parallelize well, thus using the largest and most expensive machines for building blocks is not cost efficient. Having absolutely everything in RAM is also not cost efficient, but it is necessary to have many disks to absorb the random access load. Disk access is predominantly random, unlike some analytics workloads that can read serially. If SSD&amp;#39;s get a bit cheaper, one could have SSD for the database and disk for backup.&lt;/p&gt; &lt;p&gt;With large data centers, redundancy becomes an issue. The most cost effective redundancy is simply storing partitions in duplicate or triplicate on different commodity servers. The DBMS software should handle the replication and fail-over.&lt;/p&gt; &lt;p&gt;For operating such systems, scaling-on-demand is necessary. Data must move between servers, and adding or replacing servers should be an on-the-fly operation. Also, since access is essentially never uniform, the most commonly accessed partitions may benefit from being kept in more copies than less frequently accessed ones. The DBMS must be essentially self administrating since these things are quite complex and easily intractable if one does not have in depth understanding of this rather complex field.&lt;/p&gt; &lt;p&gt;The best price point for hardware varies with time. Right now, the optimum is to have many basic motherboards with maximum memory in a rack unit, then another unit with local disks for each motherboard. Much cheaper than SAN&amp;#39;s and Infiniband fabrics.&lt;/p&gt; &lt;h2&gt;Conclusions and Next Steps&lt;/h2&gt; &lt;p&gt;The ingredients and use cases are there. If server clusters with 1TB RAM begin under $100K, the cost of deployment is small compared to personnel costs.&lt;/p&gt; &lt;p&gt;Bootstrapping the DataSphere from current Linked Open Data, such as DBpedia, &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id0x2396a038&quot;&gt;OpenCYC&lt;/a&gt;, Freebase, and every sort of social network, is feasible. Aside from private data integration and analytics efforts and E-science, the use cases are liberating social networks and C2C and some aspects of search from silos, overcoming spam, and mass use of semantics extracted from text. Emergent effects will then carry the ball to places we have not yet been.&lt;/p&gt; &lt;p&gt;The Linked Data Web has its origins in &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x13ea7110&quot;&gt;Semantic Web&lt;/a&gt; research, and many of the present participants come from these circles. Things may have been slowed down by a disconnect, only too typical of human activity, between Semantic Web research on one hand and database engineering on the other. Right now, the challenge is one of engineering. As documented on this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x2388e368&quot;&gt;blog&lt;/a&gt;, we have worked quite a bit on cluster databases, mostly but not exclusively with RDF use cases. The actual challenges of this are however not at all what is discussed in Semantic Web conferences. These have to do with complexities of parallelism, timing, message bottlenecks, transactions, and the like, i.e., hardcore engineering. These are difficult beyond what the casual onlooker might guess but not impossible. The details that remain to be worked out are nothing semantic, they are hardcore database, concerning automatic provisioning and such matters.&lt;/p&gt; &lt;p&gt;It is as if the Semantic Web people look with envy at the Web 2.0 side where there are big deployments in production, yet they do not seem quite ready to take the step themselves. Well, I will write some other time about research and engineering. For now, the message is &amp;amp;mdash &lt;i&gt;&lt;b&gt;go for it&lt;/b&gt;&lt;/i&gt;. Stay tuned for more announcements, as we near production with our next generation of software.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1535&quot; id=&quot;link-id14e02bb0&quot;&gt;Beyond Applications - Introducing the Planetary Datasphere (Part 1)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id117dc518&quot;&gt;Serendipitous Discovery Quotient (SDQ)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1534&quot; id=&quot;link-id15c52410&quot;&gt;How Linked Data will change Advertising&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id11e93658&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?tag=DataSpace&quot; id=&quot;link-id1491a588&quot;&gt;Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-25T12:31:55-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Beyond Applications - Introducing the Planetary Datasphere (Part 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-03-24#1536</atom:id>
  <atom:published>2009-03-24T14:38:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is the first in a short series of &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x12685210&quot;&gt;blog&lt;/a&gt; posts about what becomes possible when essentially unlimited &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x13112bc0&quot;&gt;linked data&lt;/a&gt; can be deployed on the open web and private intranets.&lt;/p&gt; &lt;p&gt;The term &lt;i&gt;DataSphere&lt;/i&gt; comes from Dan Simmons&amp;#39; &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Hyperion_Cantos&quot; id=&quot;link-id12ad4718&quot;&gt;Hyperion&lt;/a&gt;&lt;/i&gt; science fiction series, where it is a sort of pervasive computing capability that plays host to all sorts of processes, including what people do on the &lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x13398e38&quot;&gt;net&lt;/a&gt; today, and then some. I use this term here in order to emphasize the blurring of silo and application boundaries. The network is not only the computer but also the database. I will look at what effects the birth of a sort of linked data stratum can have on end-user experience, application development, application deployment and hosting, business models and advertising, and security; how cloud computing fits in; and how back-end software such as databases must evolve to support all of these.&lt;/p&gt; &lt;p&gt;This is a mid-term vision. The components are coming into production as we speak, but the end result is not here quite yet.&lt;/p&gt; &lt;p&gt;I use the word &lt;i&gt;DataSphere&lt;/i&gt; to refer to a worldwide database fabric, a global Distributed DBMS collective, within which there are many &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x13209728&quot;&gt;Data&lt;/a&gt; Spaces, or Named Data Spaces. A &lt;i&gt;Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x137a0dc0&quot;&gt;Space&lt;/a&gt;&lt;/i&gt; is essentially a person&amp;#39;s or organization&amp;#39;s contribution to the DataSphere. I use &lt;i&gt;Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x23df2450&quot;&gt;Web&lt;/a&gt;&lt;/i&gt; to refer to component technologies and practices such as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1286f7a0&quot;&gt;RDF&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x132e70d0&quot;&gt;SPARQL&lt;/a&gt;, Linked Data practices, etc. The DataSphere does not have to be built on this technology stack &lt;i&gt;per se&lt;/i&gt;, but this stack is still the best bet for it.&lt;/p&gt; &lt;h2&gt;General&lt;/h2&gt; &lt;p&gt;There exist applications for performing specialized functions such as social networking, shopping, document search, and C2C commerce at planetary scale. All these applications run on their own databases, each with a task specific schema. They communicate by web pages and by predefined messages for diverse application-specific transactions and reports.&lt;/p&gt; &lt;p&gt;These silos are scalable because in general their data has some natural partitioning, and because the set of transactions is predetermined and the data structure is set up for this.&lt;/p&gt; &lt;p&gt;The Linked Data Web proposes to create a data infrastructure that can hold anything, just like a network can transport anything. This is not a network with a memory of messages, but a whole that can answer arbitrary questions about what has been said. The prerequisite is that the questions are phrased in a vocabulary that is compatible with the vocabulary in which the statements themselves were made.&lt;/p&gt; &lt;p&gt;In this setting, the vocabulary takes the place of the application. Of course, there continues to be a procedural element to applications; this has the function of translating statements between the domain vocabulary and a user interface. Examples are data import from existing applications, running predefined reports, composing new reports, and translating between natural language and the domain vocabulary.&lt;/p&gt; &lt;p&gt;The big difference is that the database moves outside of the silo, at least in logical terms. The database will be like the network — horizontal and ubiquitous. The equivalent of TCP/IP will be the RDF/SPARQL combination. The equivalent of routing protocols between ISPs will be gateways between the specific DBMS engines supporting the services.&lt;/p&gt; &lt;h2&gt;The place of the DBMS in the stack changes&lt;/h2&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1320b9b0&quot;&gt;RDBMS&lt;/a&gt; in itself is eternal, or at least as eternal as a culture with heavy reliance on written records is. Any such culture will invent the RDBMS and use it where it best fits. We are not replacing this; we are building an abstracted worldwide data layer. This is to the RDBMS supporting line-of-business applications what the www was to enterprise content management systems.&lt;/p&gt; &lt;p&gt;For transactions, the Web 2.0-style application-specific messages are fine. Also, any transactional system that must be audited must physically reside somewhere, have physical security, etc. It can&amp;#39;t just be somewhere in the DataSphere, managed by some system with which one has no contract, just like Google&amp;#39;s web page cache can&amp;#39;t be relied on as a permanent repository of web content.&lt;/p&gt; &lt;p&gt;Providing space on the Linked Data Web is like providing hosting on the Document Web. This may have varying service levels, pricing models, etc. The value of a queriable DataSphere is that a new application does not have to begin by building its own schema, database infrastructure, service hosting, etc. The application becomes more like a language &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id0x13032ec8&quot;&gt;meme&lt;/a&gt;, a cultural form of interaction mediated by a relatively lightweight user-facing component, laterally open for unforeseen interaction with other applications from other domains of discourse.&lt;/p&gt; &lt;h2&gt;End User Benefits&lt;/h2&gt; &lt;p&gt;For the end user, the web will still look like a place where one can shop, discuss, date, whatever. These activities will be mediated by user interfaces as they are now. Right now, the end user&amp;#39;s web presence is his/her blog or web site, and their contributions to diverse wikis, social web sites, and so forth. These are scattered. The user&amp;#39;s Data Space is the collection of all these things, now presented in a queriable form. The user&amp;#39;s Data Space is the user&amp;#39;s statement of presence, referencing the diverse contributions of the user on diverse sites.&lt;/p&gt; &lt;p&gt;The personal Data Space being a queriable, structured whole facilitates finding and being found, which is what brings individuals to the web in the first place. The best applications and sites are those which make this the easiest. The Linked Data Web allows saying what one wishes in a structured, queriable manner, across all application domains, independently of domain specific silos. The end user&amp;#39;s interaction with the personal data space is through applications, like now. But these applications are just wrappers on top of self describing data, represented in domain specific vocabularies; one vocabulary is used for social networking, another for C2C commerce, and so on. The user is the master of their personal Data Space, free to take it where he or she wishes.&lt;/p&gt; &lt;p&gt;Further benefits will include more ready referencing between these spaces, more uniform identity management, cross-application operations, and the emergence of &amp;quot;meta-applications,&amp;quot; i.e., unified interfaces for managing many related applications/tasks.&lt;/p&gt; &lt;p&gt;Of course, there is the increase in semantic richness, such as better contextuality derived from &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x12b84120&quot;&gt;entity&lt;/a&gt; extraction from text. But this is also possible in a silo. The Linked Data Web angle is the sharing of identifiers for real world entities, which makes extracts of different sources by different parties potentially joinable. The user interaction will hardly ever be with the raw data. But the raw data being still at hand makes for better targeting of advertisements, better offering of related services, easier discovery of related content, and less noise overall.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id0x136040d8&quot;&gt;Kingsley Idehen&lt;/a&gt; has coined the term &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id0x12eadd10&quot;&gt;SDQ&lt;/a&gt;, for &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id0x137014f8&quot;&gt;Serendipitous Discovery Quotient&lt;/a&gt;, to denote this. When applications expose explicit semantics, constructing a user experience that combines relevant data from many sources, including applications as well as highly targeted advertising, becomes natural. It is no longer a matter of &amp;quot;mashing up&amp;quot; web service interfaces with procedural code, but of &amp;quot;meshing&amp;quot; data through declarative queries across application spaces.&lt;/p&gt; &lt;h2&gt;Applications in the DataSphere&lt;/h2&gt; &lt;p&gt;The workflows supported by the DataSphere are essentially those taking place on the web now. The DataSphere dimension is expressed by bookmarklets, browser plugins, and the like, with ready access to related data and actions that are relevant for this data. Actions triggered by data can be anything from posting a comment to making an e-commerce purchase. Web 2.0 models fit right in.&lt;/p&gt; &lt;p&gt;Web application development now consists of designing an application-specific database schema and writing web pages to interact with this schema. In the DataSphere, the database is abstracted away, as is a large part of the schema. The application floats on a sea of data instead of being tied to its own specific store and schema. Some local transaction data should still be handled in the old way, though.&lt;/p&gt; &lt;p&gt;For the application developer, the question becomes one of vocabulary choice. How will the application synthesize URIs from the user interaction? Which URIs will be used, since pretty much anything will in practice have many names (e.g., &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1337e5f0&quot;&gt;DBpedia&lt;/a&gt; Vs. Freebase identifiers). The end user will generally have no idea of this choice, nor of the various degrees of normalization, etc., in the vocabularies. Still, usage of such applications will produce data using some identifiers and vocabularies. Benefits of ready joining without translation will drive adoption. A vocabulary with instance data will get more instance data.&lt;/p&gt; &lt;p&gt;The Linked Data Web infrastructure itself must support vocabulary and identifier choice by answering questions about who uses a particular identifier and where. Even now, we offer entity ranks and resolution of synonyms, queries on what graphs mention a certain identifier and so on. This is a means of finding the most commonly used term for each situation. Convergence of terminology cuts down on translation and makes for easier and more efficient querying.&lt;/p&gt; &lt;h2&gt;Advertising&lt;/h2&gt; &lt;p&gt;The application developer is, for purposes of advertising, in the position of the inventory owner, just like a traditional publisher, whether web or other. But with smarter data, it is not a matter of static keywords but of the semantically explicit data behind each individual user impression driving the ads. Data itself carries no ads but the user impression will still go through a display layer that can show ads. If the application relies on reuse of licensed content, such as media, then the content provider may get a cut of the ad revenue even if it is not the direct owner of the inventory. The specifics of implementing and enforcing this are to be worked out.&lt;/p&gt; &lt;h2&gt;Content Providers, License, and Attribution&lt;/h2&gt; &lt;p&gt;For the content provider, the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x116b9ae8&quot;&gt;URI&lt;/a&gt; is the brand carrier. If the data is well linked and queriable, this will drive usage and traffic to the services of the content provider. This is true of any provider, whether a media publisher, e-commerce business, government agency, or anything else.&lt;/p&gt; &lt;p&gt;Intellectual property considerations will make the URI a first class citizen. Just like the URI is a part of the document web experience, it is a part of the Linked Data Web experience. Just like Creative Commons licenses allow the licensor to define what type of attribution is required, a data publisher can mandate that a user experience mediated by whatever application should expose the source as a dereferenceable URI. &lt;/p&gt; &lt;p&gt;One element of data dereferencing must be linking to applications that facilitate human interaction with the data. A generic data browser is a developer tool; the end user experience must still be mediated by interfaces tailored to the domain. This layer can take care of making the brand visible and can show advertising or be monetized on a usage basis.&lt;/p&gt; &lt;p&gt;Next we will look at the service provider and infrastructure side of this.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id148ea4e0&quot;&gt;Serendipitous Discovery Quotient (SDQ)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1534&quot; id=&quot;link-id14b07f88&quot;&gt;How Linked Data will change Advertising&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id117c6608&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?tag=DataSpace&quot; id=&quot;link-id154e1d58&quot;&gt;Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-24T10:50:16-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Beyond Applications - Introducing the Planetary Datasphere (Part 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-03-24#1535</atom:id>
  <atom:published>2009-03-24T14:38:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;This is the first in a short series of &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x12c91d60&quot;&gt;blog&lt;/a&gt; posts about what becomes possible when essentially unlimited &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2375f488&quot;&gt;linked data&lt;/a&gt; can be deployed on the open web and private intranets.&lt;/p&gt; &lt;p&gt;The term &lt;i&gt;DataSphere&lt;/i&gt; comes from Dan Simmons&amp;#39; &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/Hyperion_Cantos&quot; id=&quot;link-id12ad4718&quot;&gt;Hyperion&lt;/a&gt;&lt;/i&gt; science fiction series, where it is a sort of pervasive computing capability that plays host to all sorts of processes, including what people do on the &lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x13084f08&quot;&gt;net&lt;/a&gt; today, and then some. I use this term here in order to emphasize the blurring of silo and application boundaries. The network is not only the computer but also the database. I will look at what effects the birth of a sort of linked data stratum can have on end-user experience, application development, application deployment and hosting, business models and advertising, and security; how cloud computing fits in; and how back-end software such as databases must evolve to support all of these.&lt;/p&gt; &lt;p&gt;This is a mid-term vision. The components are coming into production as we speak, but the end result is not here quite yet.&lt;/p&gt; &lt;p&gt;I use the word &lt;i&gt;DataSphere&lt;/i&gt; to refer to a worldwide database fabric, a global Distributed DBMS collective, within which there are many &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x2504fff8&quot;&gt;Data&lt;/a&gt; Spaces, or Named Data Spaces. A &lt;i&gt;Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x81175fa0&quot;&gt;Space&lt;/a&gt;&lt;/i&gt; is essentially a person&amp;#39;s or organization&amp;#39;s contribution to the DataSphere. I use &lt;i&gt;Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x70f4e190&quot;&gt;Web&lt;/a&gt;&lt;/i&gt; to refer to component technologies and practices such as &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x3a5ddcd8&quot;&gt;RDF&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x23b049e0&quot;&gt;SPARQL&lt;/a&gt;, Linked Data practices, etc. The DataSphere does not have to be built on this technology stack &lt;i&gt;per se&lt;/i&gt;, but this stack is still the best bet for it.&lt;/p&gt; &lt;h2&gt;General&lt;/h2&gt; &lt;p&gt;There exist applications for performing specialized functions such as social networking, shopping, document search, and C2C commerce at planetary scale. All these applications run on their own databases, each with a task specific schema. They communicate by web pages and by predefined messages for diverse application-specific transactions and reports.&lt;/p&gt; &lt;p&gt;These silos are scalable because in general their data has some natural partitioning, and because the set of transactions is predetermined and the data structure is set up for this.&lt;/p&gt; &lt;p&gt;The Linked Data Web proposes to create a data infrastructure that can hold anything, just like a network can transport anything. This is not a network with a memory of messages, but a whole that can answer arbitrary questions about what has been said. The prerequisite is that the questions are phrased in a vocabulary that is compatible with the vocabulary in which the statements themselves were made.&lt;/p&gt; &lt;p&gt;In this setting, the vocabulary takes the place of the application. Of course, there continues to be a procedural element to applications; this has the function of translating statements between the domain vocabulary and a user interface. Examples are data import from existing applications, running predefined reports, composing new reports, and translating between natural language and the domain vocabulary.&lt;/p&gt; &lt;p&gt;The big difference is that the database moves outside of the silo, at least in logical terms. The database will be like the network — horizontal and ubiquitous. The equivalent of TCP/IP will be the RDF/SPARQL combination. The equivalent of routing protocols between ISPs will be gateways between the specific DBMS engines supporting the services.&lt;/p&gt; &lt;h2&gt;The place of the DBMS in the stack changes&lt;/h2&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x10082590&quot;&gt;RDBMS&lt;/a&gt; in itself is eternal, or at least as eternal as a culture with heavy reliance on written records is. Any such culture will invent the RDBMS and use it where it best fits. We are not replacing this; we are building an abstracted worldwide data layer. This is to the RDBMS supporting line-of-business applications what the www was to enterprise content management systems.&lt;/p&gt; &lt;p&gt;For transactions, the Web 2.0-style application-specific messages are fine. Also, any transactional system that must be audited must physically reside somewhere, have physical security, etc. It can&amp;#39;t just be somewhere in the DataSphere, managed by some system with which one has no contract, just like Google&amp;#39;s web page cache can&amp;#39;t be relied on as a permanent repository of web content.&lt;/p&gt; &lt;p&gt;Providing space on the Linked Data Web is like providing hosting on the Document Web. This may have varying service levels, pricing models, etc. The value of a queriable DataSphere is that a new application does not have to begin by building its own schema, database infrastructure, service hosting, etc. The application becomes more like a language &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id0x23c85e68&quot;&gt;meme&lt;/a&gt;, a cultural form of interaction mediated by a relatively lightweight user-facing component, laterally open for unforeseen interaction with other applications from other domains of discourse.&lt;/p&gt; &lt;h2&gt;End User Benefits&lt;/h2&gt; &lt;p&gt;For the end user, the web will still look like a place where one can shop, discuss, date, whatever. These activities will be mediated by user interfaces as they are now. Right now, the end user&amp;#39;s web presence is his/her blog or web site, and their contributions to diverse wikis, social web sites, and so forth. These are scattered. The user&amp;#39;s Data Space is the collection of all these things, now presented in a queriable form. The user&amp;#39;s Data Space is the user&amp;#39;s statement of presence, referencing the diverse contributions of the user on diverse sites.&lt;/p&gt; &lt;p&gt;The personal Data Space being a queriable, structured whole facilitates finding and being found, which is what brings individuals to the web in the first place. The best applications and sites are those which make this the easiest. The Linked Data Web allows saying what one wishes in a structured, queriable manner, across all application domains, independently of domain specific silos. The end user&amp;#39;s interaction with the personal data space is through applications, like now. But these applications are just wrappers on top of self describing data, represented in domain specific vocabularies; one vocabulary is used for social networking, another for C2C commerce, and so on. The user is the master of their personal Data Space, free to take it where he or she wishes.&lt;/p&gt; &lt;p&gt;Further benefits will include more ready referencing between these spaces, more uniform identity management, cross-application operations, and the emergence of &amp;quot;meta-applications,&amp;quot; i.e., unified interfaces for managing many related applications/tasks.&lt;/p&gt; &lt;p&gt;Of course, there is the increase in semantic richness, such as better contextuality derived from &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x23904698&quot;&gt;entity&lt;/a&gt; extraction from text. But this is also possible in a silo. The Linked Data Web angle is the sharing of identifiers for real world entities, which makes extracts of different sources by different parties potentially joinable. The user interaction will hardly ever be with the raw data. But the raw data being still at hand makes for better targeting of advertisements, better offering of related services, easier discovery of related content, and less noise overall.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id0x37342a60&quot;&gt;Kingsley Idehen&lt;/a&gt; has coined the term &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id0x3a56e4e8&quot;&gt;SDQ&lt;/a&gt;, for &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id0x23649b70&quot;&gt;Serendipitous Discovery Quotient&lt;/a&gt;, to denote this. When applications expose explicit semantics, constructing a user experience that combines relevant data from many sources, including applications as well as highly targeted advertising, becomes natural. It is no longer a matter of &amp;quot;mashing up&amp;quot; web service interfaces with procedural code, but of &amp;quot;meshing&amp;quot; data through declarative queries across application spaces.&lt;/p&gt; &lt;h2&gt;Applications in the DataSphere&lt;/h2&gt; &lt;p&gt;The workflows supported by the DataSphere are essentially those taking place on the web now. The DataSphere dimension is expressed by bookmarklets, browser plugins, and the like, with ready access to related data and actions that are relevant for this data. Actions triggered by data can be anything from posting a comment to making an e-commerce purchase. Web 2.0 models fit right in.&lt;/p&gt; &lt;p&gt;Web application development now consists of designing an application-specific database schema and writing web pages to interact with this schema. In the DataSphere, the database is abstracted away, as is a large part of the schema. The application floats on a sea of data instead of being tied to its own specific store and schema. Some local transaction data should still be handled in the old way, though.&lt;/p&gt; &lt;p&gt;For the application developer, the question becomes one of vocabulary choice. How will the application synthesize URIs from the user interaction? Which URIs will be used, since pretty much anything will in practice have many names (e.g., &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x2364eae8&quot;&gt;DBpedia&lt;/a&gt; Vs. Freebase identifiers). The end user will generally have no idea of this choice, nor of the various degrees of normalization, etc., in the vocabularies. Still, usage of such applications will produce data using some identifiers and vocabularies. Benefits of ready joining without translation will drive adoption. A vocabulary with instance data will get more instance data.&lt;/p&gt; &lt;p&gt;The Linked Data Web infrastructure itself must support vocabulary and identifier choice by answering questions about who uses a particular identifier and where. Even now, we offer entity ranks and resolution of synonyms, queries on what graphs mention a certain identifier and so on. This is a means of finding the most commonly used term for each situation. Convergence of terminology cuts down on translation and makes for easier and more efficient querying.&lt;/p&gt; &lt;h2&gt;Advertising&lt;/h2&gt; &lt;p&gt;The application developer is, for purposes of advertising, in the position of the inventory owner, just like a traditional publisher, whether web or other. But with smarter data, it is not a matter of static keywords but of the semantically explicit data behind each individual user impression driving the ads. Data itself carries no ads but the user impression will still go through a display layer that can show ads. If the application relies on reuse of licensed content, such as media, then the content provider may get a cut of the ad revenue even if it is not the direct owner of the inventory. The specifics of implementing and enforcing this are to be worked out.&lt;/p&gt; &lt;h2&gt;Content Providers, License, and Attribution&lt;/h2&gt; &lt;p&gt;For the content provider, the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xa9abc2f8&quot;&gt;URI&lt;/a&gt; is the brand carrier. If the data is well linked and queriable, this will drive usage and traffic to the services of the content provider. This is true of any provider, whether a media publisher, e-commerce business, government agency, or anything else.&lt;/p&gt; &lt;p&gt;Intellectual property considerations will make the URI a first class citizen. Just like the URI is a part of the document web experience, it is a part of the Linked Data Web experience. Just like Creative Commons licenses allow the licensor to define what type of attribution is required, a data publisher can mandate that a user experience mediated by whatever application should expose the source as a dereferenceable URI. &lt;/p&gt; &lt;p&gt;One element of data dereferencing must be linking to applications that facilitate human interaction with the data. A generic data browser is a developer tool; the end user experience must still be mediated by interfaces tailored to the domain. This layer can take care of making the brand visible and can show advertising or be monetized on a usage basis.&lt;/p&gt; &lt;p&gt;Next we will look at the service provider and infrastructure side of this.&lt;/p&gt; &lt;h2&gt;Related&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1442&quot; id=&quot;link-id148ea4e0&quot;&gt;Serendipitous Discovery Quotient (SDQ)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1534&quot; id=&quot;link-id14b07f88&quot;&gt;How Linked Data will change Advertising&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1519&quot; id=&quot;link-id117c6608&quot;&gt;The Time for RDBMS Primacy Downgrade is Nigh!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?tag=DataSpace&quot; id=&quot;link-id154e1d58&quot;&gt;Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-24T10:50:13-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>How Linked Data will change Advertising</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-03-22#1534</atom:id>
  <atom:published>2009-03-23T04:39:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post is a reply to &lt;a href=&quot;http://www.jasonkolb.com/&quot; id=&quot;link-id11f11e90&quot;&gt;Jason Kolb&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://www.jasonkolb.com/weblog/2009/03/using-advertising-to-take-over-the-world.html&quot; id=&quot;link-id15528ae8&quot;&gt;Using Advertising to Take Over the World&lt;/a&gt;. Jason&amp;#39;s post is a response to &lt;a href=&quot;http://scobleizer.com/&quot; id=&quot;link-id11a41fd0&quot;&gt;Robert Scoble&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://scobleizer.com/2009/03/21/why-facebook-has-never-listened-and-why-it-definitely-wont-start-now/&quot; id=&quot;link-id143e2d88&quot;&gt;Why Facebook has never listened and why it definitely won’t start now.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Jason:&lt;/p&gt; &lt;p&gt;Scoble is sensing what comes next, but in my opinion, describes it using an old obtrusive advertising model anecdote.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve penned a post or two about the &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1458&quot; id=&quot;link-id15247e90&quot;&gt;Magic of You&lt;/a&gt;&amp;quot; which is all about the new &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x20b2da18&quot;&gt;Web&lt;/a&gt; power broker (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id15552ba0&quot;&gt;Entity&lt;/a&gt;: &amp;quot;You&amp;quot;).&lt;/p&gt; &lt;p&gt;Personally, I&amp;#39;ve long envisaged a complete overhaul of advertising where obtrusive advertising simply withers away; ultimately replaced by an unobtrusive model that is driven by individualized relevance and high doses of serendipity. Basically, this is ultimately about &amp;quot;taking the Ad out of item placement in Web pages&amp;quot;.&lt;/p&gt; &lt;p&gt;The fundamental ingredients of an unobtrusive advertising landscape would include the following Human facts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;We are social beings and need stuff from time to time &lt;/li&gt; &lt;li&gt;We know what we need and would like to &amp;quot;Find stuff&amp;quot; when we are in &amp;quot;I Need Stuff&amp;quot; mode.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Ideally, we would like to be able to simply state the following, via a Web accessible profile:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Here are my &amp;quot;Wants&amp;quot; or &amp;quot;Needs&amp;quot; (my Wish-List) &lt;/li&gt; &lt;li&gt; Here are the products and services that I &amp;quot;Offer&amp;quot; (my Offer-List).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Now put the above into the &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id157388c8&quot;&gt;context&lt;/a&gt; of an evolving Web where &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x226b34d0&quot;&gt;data&lt;/a&gt; items are becoming more visible by the second, courtesy of the &amp;quot;&lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id11ab8f80&quot;&gt;Linked Data&amp;quot; meme&lt;/a&gt;. Thus, things that weren&amp;#39;t discernable via the Web: &amp;quot;People&amp;quot;, &amp;quot;Places&amp;quot;, &amp;quot;Music&amp;quot;, &amp;quot;Books&amp;quot;, &amp;quot;Products&amp;quot;, etc., become much easier to identify and describe.&lt;/p&gt; &lt;p&gt;Assuming the comments above hold true re. the Web&amp;#39;s evolution into a collection of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11bf4830&quot;&gt;Linked Data&lt;/a&gt; Spaces, and the following occur:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Structured profile pages become the basic units of Web presence&lt;/li&gt; &lt;li&gt; Wish-Lists and Offer-Lists are exposed by profile pages&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Wish-Lists and Offer-Lists will gradually start bonding with increasing degrees of serendipity courtesy of exponential growth in Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id154a92f8&quot;&gt;Web&lt;/a&gt; density. &lt;/p&gt; &lt;p&gt;So based on what I&amp;#39;ve stated so far, Scoble would simply browse the Web or visit his profile page, and in either scenario enjoy a &amp;quot;&lt;a href=&quot;http://www.youtube.com/watch?v=nQbVD5hlddk&quot; id=&quot;link-id118d3878&quot;&gt;minority report&lt;/a&gt;&amp;quot; style of experience albeit all under his control (since he is the one driving his Web user agent).&lt;/p&gt; &lt;p&gt;What I describe above simply comes down to &amp;quot;Wish-lists&amp;quot; and associated recommendations becoming the norm outside the confines of Amazon&amp;#39;s &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id11a6c710&quot;&gt;data space&lt;/a&gt; on the Web. Serendipitous discovery, intelligent lookups, and linkages are going to be the fundamental essence of Linked Data Web oriented applications, services, agents.&lt;/p&gt; &lt;p&gt;Beyond Scoble, it&amp;#39;s also important to note that access to data will be controlled by entity &amp;quot;You&amp;quot;. Your data space on the Web will be something you will controll access to in a myriad of ways, and it will include the option to provide licensed access to commercial entities on your terms. Naturally, you will also determine the currency that facilitates the value exchange :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1458&quot; id=&quot;link-id11799a58&quot;&gt;The Numerati &amp;amp; The Magic of You!&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1442&quot; id=&quot;link-id15246d50&quot;&gt;Serendipitous Discovery Quotient (SDQ) Explained&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=nQbVD5hlddk&quot; id=&quot;link-id1360f6d0&quot;&gt;Minority Report Clip&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-25T08:30:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Workshop &quot;Faceted Views&quot; Paper Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-03-16#1533</atom:id>
  <atom:published>2009-03-16T13:16:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here is an update of &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw2.pdf&quot; id=&quot;link-id105bef28&quot;&gt;Faceted Views over Large-Scale Linked Data&lt;/a&gt;. This will be presented at the &lt;a href=&quot;http://events.linkeddata.org/ldow2009/&quot; id=&quot;link-id16290958&quot;&gt;Linked Data workshop&lt;/a&gt; of &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id119d8be0&quot;&gt;WWW 2009&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Madrid&quot; id=&quot;link-id119b2120&quot;&gt;Madrid&lt;/a&gt; next month. &lt;/p&gt; &lt;p&gt;This update adds more explanation and some comments on how we rank entities.&lt;/p&gt;</atom:content>
  <atom:updated>2009-03-17T11:29:36.000006-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Workshop &quot;Faceted Views&quot; Paper Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-03-16#1532</atom:id>
  <atom:published>2009-03-16T13:16:57Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here is an update of &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw2.pdf&quot; id=&quot;link-id105bef28&quot;&gt;Faceted Views over Large-Scale Linked Data&lt;/a&gt;. This will be presented at the &lt;a href=&quot;http://events.linkeddata.org/ldow2009/&quot; id=&quot;link-id16290958&quot;&gt;Linked Data workshop&lt;/a&gt; of &lt;a href=&quot;http://www2009.org/&quot; id=&quot;link-id119d8be0&quot;&gt;WWW 2009&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Madrid&quot; id=&quot;link-id119b2120&quot;&gt;Madrid&lt;/a&gt; next month. &lt;/p&gt; &lt;p&gt;This update adds more explanation and some comments on how we rank entities.&lt;/p&gt;</atom:content>
  <atom:updated>2009-03-17T11:29:27.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Simple Compare &amp; Contrast of Web 1.0, 2.0, and 3.0 (Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-03-14#1531</atom:id>
  <atom:published>2009-03-14T18:20:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here is a tabulated &amp;quot;compare and contrast&amp;quot; of &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; usage patterns 1.0, 2.0, and 3.0.&lt;/p&gt; &lt;table border=&quot;1&quot; width=&quot;715&quot; height=&quot;286&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt;&lt;strong&gt;Web 1.0&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Web 2.0&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Web 3.0&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Simple Definition&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Interactive / Visual Web&lt;/td&gt; &lt;td&gt;Programmable Web&lt;/td&gt; &lt;td&gt;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id117a9a98&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id146bcdb0&quot;&gt;Web&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Unit of Presence&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Web Page&lt;/td&gt; &lt;td&gt;Web Service Endpoint&lt;/td&gt; &lt;td&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id11a66c60&quot;&gt;Data Space&lt;/a&gt; (named structured data enclave)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Unit of Value Exchange&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Page &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id146083f8&quot;&gt;URL&lt;/a&gt;&lt;/td&gt; &lt;td&gt;Endpoint URL for API&lt;/td&gt; &lt;td&gt;Resource / &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id121b2148&quot;&gt;Entity&lt;/a&gt; / Object &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1467ed00&quot;&gt;URI&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Data Granularity&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low (HTML)&lt;/td&gt; &lt;td&gt;Medium (XML)&lt;/td&gt; &lt;td&gt;High (RDF)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Defining Services&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Search &lt;/td&gt; &lt;td&gt;Community (Blogs to Social Networks) &lt;/td&gt; &lt;td&gt;Find&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Participation Quotient&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Serendipitous Discovery Quotient &lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Data Referencability Quotient &lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low (Documents)&lt;/td&gt; &lt;td&gt;Medium (Documents)&lt;/td&gt; &lt;td&gt;High (Documents and their constituent Data)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Subjectivity Quotient&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;High&lt;/td&gt; &lt;td&gt;Medium (from A-list bloggers to select source and partner lists)&lt;/td&gt; &lt;td&gt;Low (everything is discovered via URIs)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;&lt;a href=&quot;http://dbpedia.org/resource/Transclusion&quot; id=&quot;link-id155308d8&quot;&gt;Transclusence&lt;/a&gt; &lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium (Code driven Mashups)&lt;/td&gt; &lt;td&gt;HIgh (Data driven Meshups)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;What You See Is What You Prefer (WYSIWYP)&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium &lt;/td&gt; &lt;td&gt;High (negotiated representation of resource descriptions)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Open Data Access (Data Accessibility)&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium (Silos)&lt;/td&gt; &lt;td&gt;High (no Silos)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Identity Issues Handling&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Low&lt;/td&gt; &lt;td&gt;Medium (&lt;a href=&quot;http://dbpedia.org/resource/OpenID&quot; id=&quot;link-id119d77f8&quot;&gt;OpenID&lt;/a&gt;)&lt;/td&gt; &lt;td&gt;&lt;p&gt;High (&lt;a href=&quot;http://esw.w3.org/topic/foaf+ssl&quot; id=&quot;link-id135cc348&quot;&gt;FOAF+SSL&lt;/a&gt;)&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Solution Deployment Model&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Centralized&lt;/td&gt; &lt;td&gt;Centralized with sprinklings of Federation&lt;/td&gt; &lt;td&gt;Federated with function specific Centralization (e.g. Lookup hubs like &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1496d1d0&quot;&gt;LOD&lt;/a&gt; Cloud or &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1571f690&quot;&gt;DBpedia&lt;/a&gt;)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Data Model Orientation&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Logical (Tree based DOM)&lt;/td&gt; &lt;td&gt;Logical (Tree based XML)&lt;/td&gt; &lt;td&gt;Conceptual (Graph based RDF)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;User Interface Issues&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Dynamically generated static interfaces&lt;/td&gt; &lt;td&gt;Dyanically generated interafaces with semi-dynamic interfaces (courtesy of XSLT or &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id118399e8&quot;&gt;XQuery&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id14b00ba0&quot;&gt;XPath&lt;/a&gt;)&lt;/td&gt; &lt;td&gt;Dynamic Interfaces (pre- and post-generation) courtesy of self-describing nature of RDF&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Data Querying&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id14fdd948&quot;&gt;Full Text Search&lt;/a&gt;&lt;/td&gt; &lt;td&gt;Full Text Search&lt;/td&gt; &lt;td&gt;Full Text Search + Structured Graph Pattern Query Language (&lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id154a9368&quot;&gt;SPARQL&lt;/a&gt;)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;What Each Delivers&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Democratized Publishing&lt;/td&gt; &lt;td&gt;Democratized Journalism &amp;amp; Commentary (Citizen Journalists &amp;amp; Commentators)&lt;/td&gt; &lt;td&gt;Democratized Analysis (Citizen Data Analysts)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;strong&gt;&lt;a href=&quot;http://dbpedia.org/resource/Star_Wars&quot; id=&quot;link-id155ce920&quot;&gt;Star Wars Edition Analogy&lt;/a&gt; &lt;/strong&gt;&lt;/td&gt; &lt;td&gt;Star Wars (original fight for decentralization via rebellion)&lt;/td&gt; &lt;td&gt;Empire Strikes Back (centralization and data silos make comeback)&lt;/td&gt; &lt;td&gt;Return of the JEDI (&lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1474&quot; id=&quot;link-id11706640&quot;&gt;FORCE&lt;/a&gt; emerges and facilitates decentralization from &amp;quot;Identity&amp;quot; all the way to &amp;quot;Open Data Access&amp;quot; and &amp;quot;Negotiable Descriptive Data Representation&amp;quot;)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Naturally, I am not expecting everyone to agree with &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id15be20c0&quot;&gt;me&lt;/a&gt;. I am simply making my contribution to what will remain facinating discourse for a long time to come :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://novaspivack.typepad.com/nova_spivacks_weblog/2007/10/web-30----the-a.html&quot; id=&quot;link-id14a9d738&quot;&gt;Web 3.0 The Best Official Definition Imaginable&lt;/a&gt; -- Nova Spivack&amp;#39;s &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-04-29T13:21:25.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Important Movie and Ultimate Linked Data Documentary (Update 3)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-03-06#1530</atom:id>
  <atom:published>2009-03-06T20:04:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;If you are still grappling with the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id15cfb138&quot;&gt;Semantic Web&lt;/a&gt; Project&amp;quot; and one of its more distinguished deliverables: &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id15340548&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id141f88b8&quot;&gt;Web&lt;/a&gt;, then please make time to watch and digest the imminence of this &lt;a href=&quot;http://video.google.com/videoplay?docid=7190175107515525470&quot; id=&quot;link-id15394f88&quot;&gt;1990 documentary&lt;/a&gt; about &lt;a href=&quot;http://dbpedia.org/resource/Hyperland&quot; id=&quot;link-id153951e0&quot;&gt;Hypermedia&lt;/a&gt; titled: &lt;a href=&quot;http://dbpedia.org/resource/Hyperland&quot; id=&quot;link-id153f7998&quot;&gt;Hyperland&lt;/a&gt;, by the late &lt;a href=&quot;http://dbpedia.org/resource/Douglas_Adams&quot; id=&quot;link-id15d2ac88&quot;&gt;Douglas Adams&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=rOsPKjbMvxY&quot; id=&quot;link-id117ab018&quot;&gt;Hyperland Documentary&lt;/a&gt; -- Youtube &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://hyperworlds.org/&quot; id=&quot;link-id152dd5d0&quot;&gt;Hyperworlds&lt;/a&gt; - Ted Nelson Presentation&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=1IQFjTnDozo&quot; id=&quot;link-id1533dba0&quot;&gt;The Invention of the World Wide Web&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=zAvNlh2Z0GI&quot; id=&quot;link-id117a0238&quot;&gt;The Web&amp;#39;s Secret Stories&lt;/a&gt; - TED Presentation (basically about using the Web reveal [connections] commonality via [dots] individuality pre. Twitter&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html&quot; id=&quot;link-id154b32f0&quot;&gt;Pattie Mae demonstrates 6th sense&lt;/a&gt; - an example of what will be done with Linked Data re. user interaction.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://conferences.ted.com/TED2009/&quot; id=&quot;link-id11ea40c8&quot;&gt;TimBL&amp;#39;s TED 2009 Linked Data Presentation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-15T10:35:49.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>An Update on Virtuoso Development</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-03-05#1529</atom:id>
  <atom:published>2009-03-05T10:23:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is time for an update on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x151e89e8&quot;&gt;Virtuoso&lt;/a&gt; developments.&lt;/p&gt; &lt;p&gt;We continue enhancing our hosting of the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1464e168&quot;&gt;Linked Open Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x151e7f38&quot;&gt;LOD&lt;/a&gt;) cloud at &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id11ac2448&quot;&gt;http://lod.openlinksw.com&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We have now added result ranking for both text and URIs. Text hit scores are based on word frequency and proximity; &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x14f9fae0&quot;&gt;URI&lt;/a&gt; scores are based on link density.&lt;/p&gt; &lt;p&gt;We calculate each URI&amp;#39;s rank by adding up references and weighing these by the score of the referrer. This is like in web search. Each iteration of the ranking will join every referred to each of its referrers. We do about 1.2 million such joins per second, across partitions, over 2.2 billion triples and 400M distinct subjects without any great optimization, just using &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xaa36a458&quot;&gt;SQL&lt;/a&gt; stored procedures and partitioned function calls. This is a sort of SQL map-reduce. We would do over twice as fast if it were all in &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x1571e270&quot;&gt;C&lt;/a&gt; but this is adequate for now. The more interesting bit will be tuning the scoring based on what type of link we have. This is what the web search engines cannot do as well, since document links are untyped.&lt;/p&gt; &lt;p&gt;We are moving toward a decent user interface for the LOD hosting, including offering ready-made domain-specific queries, e.g., biomedical.&lt;/p&gt; &lt;p&gt;Things like &amp;quot;URI finding with autocomplete&amp;quot; are done and just have to be put online.&lt;/p&gt; &lt;p&gt;With &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x14325e08&quot;&gt;linked data&lt;/a&gt;, there is the whole question of identifier choice. We will have a special page just for this. There we show reference statistics, synonyms declared by &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x638b3900&quot;&gt;owl&lt;/a&gt;:sameAs&lt;/code&gt;, synonyms determined by shared property values, etc. In this way we become a terminology lookup service.&lt;/p&gt; &lt;p&gt;Copies of the LOD cluster system are available for evaluators, on a case by case basis. We will make this publicly available on EC2 also in not too long.&lt;/p&gt; &lt;p&gt;Otherwise, we continue working on productization, primarily things like reliability and recovery. One exercise is running &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x144d00f0&quot;&gt;TPC-C&lt;/a&gt; with intentionally stupid partitioning, so that almost all joins and deadlocks are distributed. Then we simulate a cluster interconnect that drops messages now and then, sometimes kill server processes, and still keep full ACID properties. Cloud capable, also in bad weather.&lt;/p&gt; &lt;p&gt;The open source release of Virtuoso 6 (no cluster) is basically ready to go, mostly this is a question of logistics.&lt;/p&gt; &lt;p&gt;I will talk about these things in greater individual detail next week.&lt;/p&gt;</atom:content>
  <atom:updated>2009-03-05T09:58:16-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>An Update on Virtuoso Development</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-03-05#1528</atom:id>
  <atom:published>2009-03-05T10:23:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is time for an update on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x14b05090&quot;&gt;Virtuoso&lt;/a&gt; developments.&lt;/p&gt; &lt;p&gt;We continue enhancing our hosting of the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x14395f00&quot;&gt;Linked Open Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x13e0cf98&quot;&gt;LOD&lt;/a&gt;) cloud at &lt;a href=&quot;http://lod.openlinksw.com&quot; id=&quot;link-id11ac2448&quot;&gt;http://lod.openlinksw.com&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We have now added result ranking for both text and URIs. Text hit scores are based on word frequency and proximity; &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xa9f5ff20&quot;&gt;URI&lt;/a&gt; scores are based on link density.&lt;/p&gt; &lt;p&gt;We calculate each URI&amp;#39;s rank by adding up references and weighing these by the score of the referrer. This is like in web search. Each iteration of the ranking will join every referred to each of its referrers. We do about 1.2 million such joins per second, across partitions, over 2.2 billion triples and 400M distinct subjects without any great optimization, just using &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x79e77aa0&quot;&gt;SQL&lt;/a&gt; stored procedures and partitioned function calls. This is a sort of SQL map-reduce. We would do over twice as fast if it were all in &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0x11a3f3e8&quot;&gt;C&lt;/a&gt; but this is adequate for now. The more interesting bit will be tuning the scoring based on what type of link we have. This is what the web search engines cannot do as well, since document links are untyped.&lt;/p&gt; &lt;p&gt;We are moving toward a decent user interface for the LOD hosting, including offering ready-made domain-specific queries, e.g., biomedical.&lt;/p&gt; &lt;p&gt;Things like &amp;quot;URI finding with autocomplete&amp;quot; are done and just have to be put online.&lt;/p&gt; &lt;p&gt;With &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x14334a48&quot;&gt;linked data&lt;/a&gt;, there is the whole question of identifier choice. We will have a special page just for this. There we show reference statistics, synonyms declared by &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x59a757b0&quot;&gt;owl&lt;/a&gt;:sameAs&lt;/code&gt;, synonyms determined by shared property values, etc. In this way we become a terminology lookup service.&lt;/p&gt; &lt;p&gt;Copies of the LOD cluster system are available for evaluators, on a case by case basis. We will make this publicly available on EC2 also in not too long.&lt;/p&gt; &lt;p&gt;Otherwise, we continue working on productization, primarily things like reliability and recovery. One exercise is running &lt;a href=&quot;http://dbpedia.org/resource/TPC-C&quot; id=&quot;link-id0x1f6797c0&quot;&gt;TPC-C&lt;/a&gt; with intentionally stupid partitioning, so that almost all joins and deadlocks are distributed. Then we simulate a cluster interconnect that drops messages now and then, sometimes kill server processes, and still keep full ACID properties. Cloud capable, also in bad weather.&lt;/p&gt; &lt;p&gt;The open source release of Virtuoso 6 (no cluster) is basically ready to go, mostly this is a question of logistics.&lt;/p&gt; &lt;p&gt;I will talk about these things in greater individual detail next week.&lt;/p&gt;</atom:content>
  <atom:updated>2009-03-05T09:58:07-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Facets and Large Ontologies of the LOD Cloud</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-02-16#1527</atom:id>
  <atom:published>2009-02-16T11:21:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have just submitted &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw.pdf&quot; id=&quot;link-id13d9bc68&quot;&gt;this paper&lt;/a&gt; to the WWW09 &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x51c2fd00&quot;&gt;Linked Open Data&lt;/a&gt; Workshop.&lt;/p&gt; &lt;p&gt;The thing is intermittently live with both &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xa16f87a0&quot;&gt;Dbpedia&lt;/a&gt; on one instance and a &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1a8212d8&quot;&gt;LOD&lt;/a&gt; Cloud &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xc1097a8&quot;&gt;data&lt;/a&gt; collection of about 2 billion triples on another. We will give out the links once we have tested a bit more.&lt;/p&gt; &lt;p&gt;The present activity is all about testing &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x17d64f90&quot;&gt;Virtuoso&lt;/a&gt; 6 for release, cluster and otherwise.&lt;/p&gt;</atom:content>
  <atom:updated>2009-02-17T16:24:34.000004-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Facets and Large Ontologies of the LOD Cloud</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-02-16#1526</atom:id>
  <atom:published>2009-02-16T11:21:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have just submitted &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/lodw.pdf&quot; id=&quot;link-id13d9bc68&quot;&gt;this paper&lt;/a&gt; to the WWW09 &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1a2b37a0&quot;&gt;Linked Open Data&lt;/a&gt; Workshop.&lt;/p&gt; &lt;p&gt;The thing is intermittently live with both &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xc0dd578&quot;&gt;Dbpedia&lt;/a&gt; on one instance and a &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1d721b60&quot;&gt;LOD&lt;/a&gt; Cloud &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa141b238&quot;&gt;data&lt;/a&gt; collection of about 2 billion triples on another. We will give out the links once we have tested a bit more.&lt;/p&gt; &lt;p&gt;The present activity is all about testing &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xd69ff70&quot;&gt;Virtuoso&lt;/a&gt; 6 for release, cluster and otherwise.&lt;/p&gt;</atom:content>
  <atom:updated>2009-02-17T16:24:27.000009-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Response to: What is Web 3.0 and Why Should I Care?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-29#1524</atom:id>
  <atom:published>2009-01-29T18:16:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;Another post done in response to lost comments. This time, the comments relate to Robin Bloor&amp;#39;s article titled: &lt;a href=&quot;http://havemacwillblog.com/2008/12/16/what-is-web-30-and-why-should-i-care/&quot; id=&quot;link-id12e79d70&quot;&gt;What is Web 3.0 and Why Should I Care?&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Robin:&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Web_3.0&quot; id=&quot;link-id12db8fb0&quot;&gt;Web 3.0 &lt;/a&gt;is fundamentally about the World Wid Web becoming a structured database equipped with a formal &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; model (RDF which is a moniker for &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id11490990&quot;&gt;Entity-Attribute-Value&lt;/a&gt; with Classes &amp;amp; Relationships based Graph Model), query language, and a protocol for handling divrerse data representational requirements via negotiation&lt;/p&gt;. &lt;p&gt;Web 3.0 is about a Web that facilitates serendipitous discovery of relevant things; thereby making serendipitous discovery quotient (SDQ), rather than search engine optimization (SEO), the critical success factor that drives how resources get published on the Web.&lt;/p&gt; &lt;p&gt;Personally, I believe we are on the cusp of a major industry inflection re. how we interact with data hosted in computing spaces. In a nutshell, the conceptual model interaction based on real-world entities such as people, places, and other things (including abstract subject matter) will usurp traditional logical model interaction based on rows and columns of typed and/or untyped literal values exemplified by relational data access and management systems.&lt;/p&gt; &lt;p&gt;Labels such as &amp;quot;Web 3.0&amp;quot;, &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13664538&quot;&gt;Linked Data&lt;/a&gt;&amp;quot;, and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id157ff968&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot;, are simply about the aforementioned model transition playing out on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id114bd0e8&quot;&gt;World Wide Web&lt;/a&gt; and across private Linked Data Webs such as Intranets &amp;amp; Extranets, as exemplified emergence of the &amp;quot;Master Data Management&amp;quot; label/buzzword.&lt;/p&gt; &lt;h3&gt;What&amp;#39;s the critical infrastructure supporting Web 3.0?&lt;/h3&gt; &lt;p&gt;As was the case with Web Services re. Web 2.0, there is a critical piece of infrastructure driving the evolution in question, and in this case it comes down to the evolution of Hyperlinking.&lt;/p&gt; &lt;p&gt;We now have a new and complimentary variant of Hyperlinking commonly referred to as &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id152ed150&quot;&gt;Hyperdata&lt;/a&gt;&amp;quot; that now sits alongside &amp;quot;Hypertext&amp;quot;. Hyperdata when used in conjunction with HTTP based URIs as Data Source Names (or Identifiers), delivers a potent and granular data access mechanism scoped down to the datum (object or record) level; which is much different from the document (record or &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1141e830&quot;&gt;entity&lt;/a&gt; container) level linkage that Hypertext accords.&lt;/p&gt; &lt;p&gt;In addition, the incorporation of HTTP into this new and enhanced granular Data Source Naming mechanism also addresses past challenges relating to separation of data, data representation, and data transmission protocols -- remember XDR woes familiar to all sockets level programmers -- courtesy of in-built content negotiation. Hence, via a simple HTTP GET --against a Data Source Name exposed by a Hyperdata link -- I can negotiate (from client or server sides) the exact representation of the description (entity-attribute-value graph) of an Entity / Data Object / Resource, dispatched by a data server.&lt;/p&gt; &lt;blockquote&gt;For example, this is how a description of entity &amp;quot;&lt;strong&gt;&lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id141ce520&quot;&gt;Me&lt;/a&gt;&lt;/strong&gt;&amp;quot; ends up being available in (X)HTML or RDF document representations (as you will observe when you click on that link to my Personal &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id15f9fed0&quot;&gt;URI&lt;/a&gt;).&lt;/blockquote&gt; &lt;p&gt; The foundation of what I describe above comes from:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Entity-Attribute-Value &amp;amp; Class Relationship Data Model (originating from LISP era with detours via the &lt;a href=&quot;http://dbpedia.org/resource/Object_database&quot; id=&quot;link-id12db8fb0&quot;&gt;Object Database&lt;/a&gt; era. into the Triples approach in RDF) &lt;/li&gt; &lt;li&gt;Use of HTTP based Identifiers in the Entity &lt;a href=&quot;http://dbpedia.org/resource/Identity_%28object-oriented_programming%29&quot; id=&quot;link-id1193af48&quot;&gt;ID&lt;/a&gt; construction process&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1348f188&quot;&gt;SPARQL&lt;/a&gt; query language for the Data Model.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Some live examples from &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id12e62a50&quot;&gt;DBpedia&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; http://dbpedia.org/resource/Linked_Data&lt;/li&gt; &lt;li&gt;http://dbpedia.org/resource/Hyperdata&lt;/li&gt; &lt;li&gt;http://dbpedia.org/resource/Entity-attribute-value_model&lt;/li&gt; &lt;li&gt;http://dbpedia.org/resource/Benjamin_Franklin&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1519?sid=5097848d70f69738bd366e2b6374672c&amp;amp;realm=wa&quot; id=&quot;link-id13c31500&quot;&gt;The End of RDBMS Primacy is Nigh&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id1356e6a0&quot;&gt;Linking Open Data Community&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-29T13:45:11-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ebiz RDF &amp; Data Integration Article Retort</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-29#1522</atom:id>
  <atom:published>2009-01-29T15:12:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;Yesterday, I stumbled across an &lt;a href=&quot;http://www.ebizq.net&quot; id=&quot;link-id13e41be8&quot;&gt;ebiz&lt;/a&gt; article by &lt;a href=&quot;http://www.ebizq.net/MT4/mt-cp.cgi?__mode=view&amp;amp;blog_id=43&amp;amp;id=16&quot; id=&quot;link-id11c080a0&quot;&gt;David Linthicum&lt;/a&gt; titled:&lt;a href=&quot;http://www.ebizq.net/blogs/linthicum/2009/01/rdf_and_data_integration.php&quot; id=&quot;link-id13620940&quot;&gt; RDF &amp;amp; Data Integration&lt;/a&gt;. Naturally, I read it, and while reading encountered a number of inaccuracies that compelled &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id152f4828&quot;&gt;me&lt;/a&gt; to comment on the post. &lt;/p&gt; &lt;p&gt;Today, I revisited the same article -- and to my shock and horror -- my comments do not exist (note: the site did accept my comments yesterday!). Even more frustrating for me, I now have to expend time I don&amp;#39;t have re-writing my comments due to the depth and danger of the inaccuracies in this post re. RDF in general.&lt;/p&gt; &lt;h3&gt;Important Note to ebiz and David: &lt;/h3&gt; &lt;p&gt;Please look into what happened to my comments. It&amp;#39;s too early for me to conclude that subjective censorship is a play on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; -- which isn&amp;#39;t a hard copy journalistic format style of platform where editors get away with such shenanigans. The Web is a sticky database, and outer joining is well and truly functional (meaning: exclusion and omission ultimately come back to bite via full outer join query results against the Web DB).&lt;/p&gt; &lt;p&gt;By the way, if you publish the comments I made to the post (yesterday), I will add a note to this post, accordingly.&lt;/p&gt; &lt;p&gt;Yes! David just confirmed to me via &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://dbpedia.org/resource/Category:Data_modeling&quot; id=&quot;link-id15293c20&quot;&gt;Twitter&lt;/a&gt; that this is yet another comment system related issue and absolutely no intent to censor etc. His words &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://linkeddata.uriburner.com/about/rdf/http://twitter.com/DavidLinthicum/status/1159201301%23this&quot; id=&quot;link-id14e5ac98&quot;&gt;Twervatim&lt;/a&gt; :-) &lt;/p&gt; &lt;p&gt;For sake of clarity, I&amp;#39;ve itemized the inaccuracies and applied my correction comments (inline) accordingly:&lt;/p&gt; &lt;blockquote&gt; &lt;h3&gt;Inaccuracy #1:&lt;/h3&gt; &lt;p&gt;Resource Description Framework (RDF), a part of the XML story, provides interoperability between applications that exchange &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id15f48080&quot;&gt;information&lt;/a&gt;. &lt;/p&gt; &lt;h3&gt;Correction #1: &lt;/h3&gt; &lt;p&gt;RDF and XML are not inextricably linked in any way. RDF is part Data Model (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id119a7300&quot;&gt;EAV&lt;/a&gt;/CR style Graph) with associated markup and data serialization formats that include: N3, Turtle, TriX, RDF/XML etc.&lt;/p&gt; &lt;h3&gt;Inaccuracy #2:&lt;/h3&gt; &lt;p&gt;RDF uses XML to define a foundation for processing metadata and to provide a standard metadata infrastructure for both the Web and the enterprise. &lt;/p&gt; &lt;h3&gt;Correction #2: &lt;/h3&gt; &lt;p&gt;RDF/XML is an XML based markup and data serialization format. As a markup language it can be used for creating RDF model records/statements (using Subject, Predicate, Object or &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id15120c28&quot;&gt;Entity&lt;/a&gt;, Attribute, Value). As a serialization format, it provides a mechanism for marshaling RDF data across data managers and data consumers.&lt;/p&gt; &lt;h3&gt;Inaccuracy #3:&lt;/h3&gt; &lt;p&gt;The difference between the two is that XML is used to transport data using a common format, while RDF is layered on top of XML defining a broad category of data. &lt;/p&gt; &lt;h3&gt;Correction #3:&lt;/h3&gt; &lt;p&gt;See earlier corrections above.&lt;/p&gt; &lt;h3&gt;Inaccuracy #4:&lt;/h3&gt; &lt;p&gt;When the XML data is declared to be of the RDF format, applications are then able to understand the data without understanding who sent it. &lt;/p&gt; &lt;h3&gt;Correction #4:&lt;/h3&gt; &lt;p&gt;You do not declare data to be of RDF format. RDF isn&amp;#39;t a format it is a data model (as stated above). You can &amp;quot;up lift&amp;quot; or map data from XML to RDF (hierarchical to graph model mapping). Likewise you can &amp;quot;down shift&amp;quot; or map data from RDF to XML (example: &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id146966c0&quot;&gt;SPARQL&lt;/a&gt; SELECT query patterns &amp;quot;down shift&amp;quot; to SPARQL Results XML, which isn&amp;#39;t RDF/XML, while keeping access to graphs via URIs or &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id14282528&quot;&gt;Entity&lt;/a&gt; Identifiers that reside within the serialization).&lt;/p&gt; &lt;h3&gt;Inaccuracy #5:&lt;/h3&gt; &lt;p&gt;RDF extends the XML model and syntax to be specified for describing either resources or a collection of information. (XML points to a resource in order to scope and uniquely identify a set of properties known as the schema.).&lt;/p&gt; &lt;h3&gt;Correction #5:&lt;/h3&gt; &lt;p&gt;See earlier comments. &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;The single accurate paragraph in this ebiz article lies right at the end and it states the following:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;I&amp;#39;ve always thought RDF has been underutilized for data integration, and it&amp;#39;s really an old standard. Now that we&amp;#39;re focused on both understanding and integrating data, perhaps RDF should make a comeback.&amp;quot;&lt;/cite&gt; &lt;/blockquote&gt; &lt;h3&gt;Related:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.w3.org/2001/sw/SW-FAQ#whrdfxml&quot; id=&quot;link-id1534cdc8&quot;&gt;Semantic Web FAQ fragment re. RDF and XML&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=rdf%20data%20integration&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id15a7dbc0&quot;&gt;Various posts re. RDF and Data Integration&lt;/a&gt; from this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id15da4618&quot;&gt;Blog&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1120d810&quot;&gt;Data Space&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-29T16:25:58-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Time for RDBMS Primacy Downgrade is Nigh! (No Embedded Images Edition - Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-27#1520</atom:id>
  <atom:published>2009-01-27T19:19:44Z</atom:published>
  <atom:content type="html">&lt;p&gt; As the world works it way through a &amp;quot;once in a generation&amp;quot; economic crisis, the long overdue downgrade of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id15750540&quot;&gt;RDBMS&lt;/a&gt;, from its pivotal position at the apex of the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x24ea3650&quot;&gt;data&lt;/a&gt; access and data management pyramid is nigh.&lt;/p&gt; &lt;h3&gt;What is the Data Access, and Data Management Value Pyramid?&lt;/h3&gt; &lt;p&gt; As depicted below, a top-down view of the data access and data management value chain. The term: apex, simply indicates value primacy, which takes the form of a data access API based entry point into a DBMS realm -- aligned to an underlying data model. Examples of data access APIs include: Native Call Level Interfaces (CLIs), &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id11c254c0&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id149b16a8&quot;&gt;JDBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id11451eb0&quot;&gt;ADO&lt;/a&gt;.NET, &lt;a href=&quot;http://dbpedia.org/resource/OLE_DB&quot; id=&quot;link-id15b02478&quot;&gt;OLE-DB&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML_for_Analysis&quot; id=&quot;link-id1181fa10&quot;&gt;XMLA&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1f8394a8&quot;&gt;Web&lt;/a&gt; Services.&lt;/p&gt; See: &lt;a href=&quot;http://virtuoso.openlinksw.com/images/Agility_Value_Factors_Pyramid.png&quot; id=&quot;link-id146cadd8&quot;&gt; AVF Pyramid Diagram.&lt;/a&gt; &lt;p&gt; The degree to which ad-hoc views of data managed by a DBMS can be produced and dispatched to relevant data consumers (e.g. people), without compromising concurrency, data durability, and security, collectively determine the &amp;quot;Agility Value Factor&amp;quot; (AVF) of a given DBMS. Remember, agility as the cornerstone of environmental adaptation is as old as the concept of evolution, and intrinsic to all pursuits of primacy. &lt;/p&gt; &lt;p&gt;In simpler business oriented terms, look at AVF as the degree to which DBMS technology affects the ability to effectively implement &amp;quot;Market Leadership Discipline&amp;quot; along the following pathways: innovation, operation excellence, or customer intimacy. &lt;/p&gt; &lt;h3&gt;Why has RDBMS Primacy has Endured?&lt;/h3&gt; &lt;p&gt; Historically, at least since the late &amp;#39;80s, the RDBMS genre of DBMS has consistently offered the highest AVF relative to other DBMS genres en route to primacy within the value pyramid. The desire to improve on paper reports and spreadsheets is basically what DBMS technology has fundamentally addressed to date, even though conceptual level interaction with data has never been its forte.&lt;/p&gt; See: &lt;a href=&quot;http://virtuoso.openlinksw.com/images/Old_RDBMS_Primacy_Pyramid.png&quot; id=&quot;link-id134dab90&quot;&gt; RDBMS Primacy Diagram.&lt;/a&gt; &lt;p&gt; For more then 10 years -- at the very least -- limitations of the traditional RDBMS in the realm of conceptual level interaction with data across diverse data sources and schemas (enterprise, Web, and &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id116001c0&quot;&gt;Internet&lt;/a&gt;) has been crystal clear to many RDBMS technology practitioners, as indicated by some of the quotes excerpted below:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt; &lt;p&gt; &amp;quot;Future of Database Research is excellent, but what is the future of data?&amp;quot; &lt;/p&gt; &amp;quot;..it is hard for &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14932398&quot;&gt;me&lt;/a&gt; to disagree with the conclusions in this report. It captures exactly the right thoughts, and should be a must read for everyone involved in the area of databases and database research in particular.&amp;quot; &lt;p&gt;-- &lt;a href=&quot;http://jhingran.typepad.com/anant_jhingrans_musings/&quot; id=&quot;link-id11334c50&quot;&gt;Dr. Anant Jingran&lt;/a&gt;, CTO, IBM &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id150c7970&quot;&gt;Information&lt;/a&gt; Management Systems, commenting on the &lt;a href=&quot;http://db.cs.berkeley.edu/claremont/&quot; id=&quot;link-id11c3b408&quot;&gt;2007 RDBMS technology retreat&lt;/a&gt; attended by a number of key DBMS technology pioneers and researchers.&lt;/p&gt; &lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;cite&gt; &lt;p&gt; &amp;quot;&lt;a href=&quot;http://www.databasecolumn.com/2007/09/one-size-fits-all.html&quot; id=&quot;link-id15c14f08&quot;&gt;One size fits all: A concept whose time has come and gone&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt; &lt;li&gt; They are direct descendants of System R and &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id146da780&quot;&gt;Ingres&lt;/a&gt; and were architected more than 25 years ago&lt;/li&gt; &lt;li&gt; They are advocating &amp;quot;one size fits all&amp;quot;; i.e. a single engine that solves all DBMS needs. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;-- Prof. &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Stonebraker&quot; id=&quot;link-id145c4e28&quot;&gt;Michael Stonebreaker&lt;/a&gt;, one of the founding fathers of the RDBMS industry.&lt;/p&gt; &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Until this point in time, the requisite confluence of &amp;quot;circumstantial pain&amp;quot; and &amp;quot;open standards&amp;quot; based technology required to enable an objective &amp;quot;compare and contrast&amp;quot; of RDBMS engine virtues and viable alternatives hasn&amp;#39;t occurred. Thus, the RDBMS has endured it position of primacy albeit on a &amp;quot;one size fits all basis&amp;quot;. &lt;/p&gt; &lt;h4&gt;Circumstantial Pain&lt;/h4&gt; &lt;p&gt; As mentioned earlier, we are in the midst of an economic crisis that is ultimately about a consistent inability to connect dots across a substrate of interlinked data sources that transcend traditional data access boundaries with high doses of schematic heterogeneity. Ironically, in a era of the dot-com, we haven&amp;#39;t been able to make meaningful connections between relevant &amp;quot;real-world things&amp;quot; that extend beyond primitive data hosted database tables and content management style document containers; we&amp;#39;ve struggled to achieve this in the most basic sense, let alone evolve our ability to connect inline with the &lt;a href=&quot;http://www.vldb2007.org/program/slides/s1161-brodie.pdf&quot; id=&quot;link-id11a0dcf0&quot;&gt;exponential rate at which the Internet &amp;amp; Web are spawning &amp;quot;universes of discourse&amp;quot; (data spaces) that emanate from user activity&lt;/a&gt; (within the enterprise and across the Internet &amp;amp; Web). In a nutshell, we haven&amp;#39;t been able to upgrade our interaction with data such that &amp;quot;conceptual models&amp;quot; and resulting &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id12da4b00&quot;&gt;context&lt;/a&gt; lenses&amp;quot; (or facets) become concrete; by this I mean: real-world &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id146a48a8&quot;&gt;entity&lt;/a&gt; interaction making its way into the computer realm as opposed to the impedance we all suffer today when we transition from conceptual model interaction (real-world) to logical model interaction (when dealing with RDBMS based data access and data management). &lt;/p&gt; &lt;p&gt;Here are some simple examples of what I can only best describe as: &amp;quot;critical dots unconnected&amp;quot;, resulting from an inability to interact with data conceptually:&lt;/p&gt; &lt;strong&gt;Government (Globally) -&lt;/strong&gt; &lt;p&gt; Financial regulatory bodies couldn&amp;#39;t effectively discern that a &lt;a href=&quot;http://dbpedia.org/resource/Credit_default_swap&quot; id=&quot;link-id115ba0e0&quot;&gt;Credit Default Swap&lt;/a&gt; is an Insurance policy in all but literal name. And in not doing so the cost of an unregulated &lt;a href=&quot;http://dbpedia.org/resource/Insurance&quot; id=&quot;link-id158d4960&quot;&gt;insurance policy&lt;/a&gt; laid the foundation for exacerbating the toxicity of fatally flawed mortgage backed securities. Put simply: a flawed insurance policy was the fallback on a toxic security that financiers found exotic based on superficial packaging.&lt;/p&gt; &lt;strong&gt;Enterprises - &lt;/strong&gt; &lt;p&gt; Banks still don&amp;#39;t understand that capital really does exists in tangible and intangible forms; with the intangible being the variant that is inherently dynamic. For example, a tech companies intellectual capital far exceeds the value of fixture, fittings, and buildings, but you be amazed to find that in most cases this vital asset has not significant value when banks get down to the nitty gritty of debt collateral; instead, a buffer of flawed securitization has occurred atop a borderline static asset class covering the aforementioned buildings, fixtures, and fittings. &lt;/p&gt; &lt;p&gt; In the general enterprise arena, IT executives continued to &amp;quot;rip and replace&amp;quot; existing technology without ever effectively addressing the timeless inability to connect data across disparate data silos generated by internal enterprise applications, let alone the broader need to mesh data from the inside with external data sources. No correlations made between the growth of buzzwords and the compounding nature of data integration challenges. It&amp;#39;s 2009 and only a miniscule number of executives dare fantasize about being anywhere within distance of the: relevant information at your fingertips vision. &lt;/p&gt; &lt;p&gt; Looking more holistically at data interaction in general, whether you interact with data in the enterprise space (i.e., at work) or on the Internet or Web, you ultimately are delving into a mishmash of disparate computer systems, applications, service (Web or SOA), and databases (of the RDBMS variety in a majority of cases) associated with a plethora of disparate schemas. Yes, but even today &amp;quot;rip and replace&amp;quot; is still the norm pushed by most vendors; pitting one mono culture against another as exemplified by irrelevances such as: FOSS/LAMP vs Commercial or Web vs. Enterprise, when none of this matters if the data access and integration issues are recognized let alone addressed (see: &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1497?sid=0df0294caee8b37925c6a888bbbca136&amp;amp;realm=wa&quot; id=&quot;link-id15c27300&quot;&gt;Applications are Like Fish and Data Like Wine&lt;/a&gt;). &lt;/p&gt; &lt;p&gt; Like the current credit-crunch, exponential growth of data originating from disparate application databases and associated schemas, within shrinking processing time frames, has triggered a rethinking of what defines data access and data management value today en route to an inevitable RDBMS downgrade within the value pyramid.&lt;/p&gt; &lt;h3&gt;Technology&lt;/h3&gt; &lt;p&gt;There have been many attempts to address real-world modeling requirements across the broader DBMS community from Object Databases to Object-Relational Databases, and more recently the emergence of simple &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id1128dad0&quot;&gt;Entity&lt;/a&gt;-Attribute-Value model DBMS engines. In all cases failure has come down to the existence of one or more of the following deficiencies, across each potential alternative:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Query language standardization - nothing close to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id16002d60&quot;&gt;SQL&lt;/a&gt; standardization&lt;/li&gt; &lt;li&gt;Data Access API standardization - nothing close to ODBC, JDBC, OLE-DB, or ADO.NET&lt;/li&gt; &lt;li&gt;Wire protocol standardization - nothing close to HTTP&lt;/li&gt; &lt;li&gt;Distributed Identity infrastructure - nothing close to the non-repudiatable digital Identity that &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id14926b18&quot;&gt;foaf&lt;/a&gt;+ssl accords&lt;/li&gt; &lt;li&gt;Use of Identifiers as network based pointers to data sources - nothing close to RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id16180a28&quot;&gt;Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Negotiable data representation - nothing close to Mime and HTTP based Content Negotiation&lt;/li&gt; &lt;li&gt;Scalability especially in the era of Internet &amp;amp; Web scale.&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Entity-Attribute-Value with Classes &amp;amp; Relationships (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id13e741b8&quot;&gt;EAV&lt;/a&gt;/CR) data models&lt;/h4&gt; &lt;p&gt;A common characteristic shared by all post-relational DBMS management systems (from Object Relational to pure Object) is an orientation towards variations of EAV/CR based data models. Unfortunately, all efforts in the EAV/CR realm have typically suffered from at least one of the deficiencies listed above. In addition, the same &amp;quot;one DBMS model fits all&amp;quot; approach that lies at the heart of the RDBMS downgrade also exists in the EAV/CR realm.&lt;/p&gt; &lt;h3&gt;What Comes Next?&lt;/h3&gt; &lt;p&gt;The RDBMS is not going away (ever), but its era of primacy -- by virtue of its placement at the apex of the data access and data management value pyramid -- is over! I make this bold claim for the following reasons: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; The Internet aided &amp;quot;Global Village&amp;quot; has brought &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Open_World_Assumption&quot; id=&quot;link-id1148e560&quot;&gt;Open World&lt;/a&gt;&amp;quot; vs &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Closed_World_Assumption&quot; id=&quot;link-id11967cd0&quot;&gt;Closed World&lt;/a&gt;&amp;quot; assumption issues to the fore e.g., the current global economic crisis remains centered on the inability to connect dots across &amp;quot;Open World&amp;quot; and &amp;quot;Closed World&amp;quot; data frontiers &lt;/li&gt; &lt;li&gt; Entity-Attribute-Value with Classes &amp;amp; Relationships (EAV/CR) based DBMS models are more effective when dealing with disparate data associated with disparate schemas, across disparate DBMS engines, host operating systems, and networks. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Based on the above, it is crystal clear that a different kind of DBMS -- one with higher AVF relative to the RDBMS -- needs to sit atop today&amp;#39;s data access and data management value pyramid. The characteristics of this DBMS must include the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Every item of data (Datum/Entity/Object/Resource) has Identity&lt;/li&gt; &lt;li&gt; Identity is achieved via Identifiers that aren&amp;#39;t locked at the DBMS, OS, Network, or Application levels&lt;/li&gt; &lt;li&gt; Object Identifiers and Object values are independent (extricably linked by association)&lt;/li&gt; &lt;li&gt; Object values should be de-referencable via Object Identifier&lt;/li&gt; &lt;li&gt; Representation of de-referenced value graph (entity, attributes, and values mesh) must be negotiable (i.e. content negotiation)&lt;/li&gt; &lt;li&gt;Structured query language must provide mechanism for Creation, Deletion, Updates, and Querying of data objects&lt;/li&gt; &lt;li&gt; Performance &amp;amp; Scalability across &amp;quot;Closed World&amp;quot; (enterprise) and &amp;quot;Open World&amp;quot; (Internet &amp;amp; Web) realms.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Quick recap, I am not saying that RDBMS engine technology is dead or obsolete. I am simply stating that the era of RDBMS primacy within the data access and data management value pyramid is over. &lt;/p&gt; &lt;p&gt;The problem domain (conceptual model views over heterogeneous data sources) at the apex of the aforementioned pyramid has simply evolved beyond the natural capabilities of the RDBMS which is rooted in &amp;quot;Closed World&amp;quot; assumptions re., data definition, access, and management. The need to maintain domain based conceptual interaction with data is now palpable at every echelon within our &amp;quot;Global Village&amp;quot; - Internet, Web, Enterprise, Government etc.&lt;/p&gt; &lt;p&gt;It is my personal view that an EAV/CR model based DBMS, with support for the seven items enumerated above, can trigger the long anticipated RDBMS downgrade. Such a DBMS would be inherently multi-model because you would need to the best of RDBMS and EAV/CR model engines in a single product, with in-built support for HTTP and other Internet protocols in order to effectively address data representation and serialization issues.&lt;/p&gt; &lt;h4&gt;EAV/CR Oriented Data Access &amp;amp; Management Technology&lt;/h4&gt; &lt;p&gt;Examples of contemporary EAV/CR frameworks that provide concrete conceptual layers for data access and data management currently include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id115d1cb0&quot;&gt; Resource Description Framework&lt;/a&gt; (RDF) - an EAV/CR based framework&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id116cf810&quot;&gt;RDF Linked Data &lt;/a&gt;- EAV/CR based framework that mandates de-referencable HTTP based Identifiers&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id13daa160&quot;&gt;ADO.NET Entity Frameworks&lt;/a&gt; - Microsoft .NET based EAV/CR framework&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/page/Core_Data&quot; id=&quot;link-id11111838&quot;&gt;Core Data Services &lt;/a&gt;- Mac OS X based EAV/CR framework that evolved from NeXT&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Enterprise_Objects_Framework&quot; id=&quot;link-id15c27df0&quot;&gt;Enterprise Object Frameworks&lt;/a&gt; (EOF).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The frameworks above provide the basis for a revised AVF pyramid, as depicted below, that reflects today&amp;#39;s data access and management realities i.e., an Internet &amp;amp; Web driven global village comprised of interlinked distributed data objects, compatible with &amp;quot;Open World&amp;quot; assumptions.&lt;/p&gt; See: &lt;a href=&quot;http://virtuoso.openlinksw.com/images/New_EAV_RDBMS_Pyramid.png&quot; id=&quot;link-id158e0760&quot;&gt;New EAV/CR Primacy Diagram.&lt;/a&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dynamicorange.com/2009/01/22/blueblog-how-and-why-glue-is-using-amazon-simpledb-instead-of-a-relational-database/&quot; id=&quot;link-id15e07c10&quot;&gt;How &amp;amp; Why Glue is Using Amazon SimpleDB&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.cs.cmu.edu/afs/cs.cmu.edu/user/clamen/OODBMS/Manifesto/htManifesto/node4.html#SECTION00022000000000000000&quot; id=&quot;link-id116cf450&quot;&gt;Object Database Manifesto (Identity excerpt)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.unixspace.com/context/databases.html&quot; id=&quot;link-id150b2c20&quot;&gt;Database Models Overview&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=WEj9vqVvHPc&amp;amp;feature=related&quot; id=&quot;link-id0x1135d978&quot;&gt;Ted Nelson Explaining Irregularity and Idiosyncrasy of Data Structures&lt;/a&gt; - ZigZag Demo &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-03-17T11:50:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Time for RDBMS Primacy Downgrade is Nigh!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-24#1519</atom:id>
  <atom:published>2009-01-25T00:04:00Z</atom:published>
  <atom:content type="html">&lt;p&gt; As the world works it way through a &amp;quot;once in a generation&amp;quot; economic crisis, the long overdue downgrade of the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id15750540&quot;&gt;RDBMS&lt;/a&gt;, from its pivotal position at the apex of the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x66a74b8&quot;&gt;data&lt;/a&gt; access and data management pyramid is nigh.&lt;/p&gt; &lt;h3&gt;What is the Data Access, and Data Management Value Pyramid?&lt;/h3&gt; &lt;p&gt; As depicted below, a top-down view of the data access and data management value chain. The term: apex, simply indicates value primacy, which takes the form of a data access API based entry point into a DBMS realm -- aligned to an underlying data model. Examples of data access APIs include: Native Call Level Interfaces (CLIs), &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id11c254c0&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id149b16a8&quot;&gt;JDBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id11451eb0&quot;&gt;ADO&lt;/a&gt;.NET, &lt;a href=&quot;http://dbpedia.org/resource/OLE_DB&quot; id=&quot;link-id15b02478&quot;&gt;OLE-DB&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML_for_Analysis&quot; id=&quot;link-id1181fa10&quot;&gt;XMLA&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x2fef498&quot;&gt;Web&lt;/a&gt; Services.&lt;/p&gt; &lt;div&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/images/Agility_Value_Factors_Pyramid.png&quot; /&gt; &lt;/div&gt; &lt;p&gt; The degree to which ad-hoc views of data managed by a DBMS can be produced and dispatched to relevant data consumers (e.g. people), without compromising concurrency, data durability, and security, collectively determine the &amp;quot;Agility Value Factor&amp;quot; (AVF) of a given DBMS. Remember, agility as the cornerstone of environmental adaptation is as old as the concept of evolution, and intrinsic to all pursuits of primacy. &lt;/p&gt; &lt;p&gt;In simpler business oriented terms, look at AVF as the degree to which DBMS technology affects the ability to effectively implement &amp;quot;Market Leadership Discipline&amp;quot; along the following pathways: innovation, operation excellence, or customer intimacy. &lt;/p&gt; &lt;h3&gt;Why has RDBMS Primacy has Endured?&lt;/h3&gt; &lt;p&gt; Historically, at least since the late &amp;#39;80s, the RDBMS genre of DBMS has consistently offered the highest AVF relative to other DBMS genres en route to primacy within the value pyramid. The desire to improve on paper reports and spreadsheets is basically what DBMS technology has fundamentally addressed to date, even though conceptual level interaction with data has never been its forte.&lt;/p&gt; &lt;div&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/images/Old_RDBMS_Primacy_Pyramid.png&quot; /&gt; &lt;/div&gt; &lt;p&gt; For more then 10 years -- at the very least -- limitations of the traditional RDBMS in the realm of conceptual level interaction with data across diverse data sources and schemas (enterprise, Web, and &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id116001c0&quot;&gt;Internet&lt;/a&gt;) has been crystal clear to many RDBMS technology practitioners, as indicated by some of the quotes excerpted below:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt; &lt;p&gt; &amp;quot;Future of Database Research is excellent, but what is the future of data?&amp;quot; &lt;/p&gt; &amp;quot;..it is hard for &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14932398&quot;&gt;me&lt;/a&gt; to disagree with the conclusions in this report. It captures exactly the right thoughts, and should be a must read for everyone involved in the area of databases and database research in particular.&amp;quot; &lt;p&gt;-- &lt;a href=&quot;http://jhingran.typepad.com/anant_jhingrans_musings/&quot; id=&quot;link-id11334c50&quot;&gt;Dr. Anant Jingran&lt;/a&gt;, CTO, IBM &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id150c7970&quot;&gt;Information&lt;/a&gt; Management Systems, commenting on the &lt;a href=&quot;http://db.cs.berkeley.edu/claremont/&quot; id=&quot;link-id11c3b408&quot;&gt;2007 RDBMS technology retreat&lt;/a&gt; attended by a number of key DBMS technology pioneers and researchers.&lt;/p&gt; &lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;cite&gt; &lt;p&gt; &amp;quot;&lt;a href=&quot;http://www.databasecolumn.com/2007/09/one-size-fits-all.html&quot; id=&quot;link-id15c14f08&quot;&gt;One size fits all: A concept whose time has come and gone&lt;/a&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;ol&gt; &lt;li&gt; They are direct descendants of System R and &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id146da780&quot;&gt;Ingres&lt;/a&gt; and were architected more than 25 years ago&lt;/li&gt; &lt;li&gt; They are advocating &amp;quot;one size fits all&amp;quot;; i.e. a single engine that solves all DBMS needs. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;-- Prof. &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Stonebraker&quot; id=&quot;link-id145c4e28&quot;&gt;Michael Stonebreaker&lt;/a&gt;, one of the founding fathers of the RDBMS industry.&lt;/p&gt; &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Until this point in time, the requisite confluence of &amp;quot;circumstantial pain&amp;quot; and &amp;quot;open standards&amp;quot; based technology required to enable an objective &amp;quot;compare and contrast&amp;quot; of RDBMS engine virtues and viable alternatives hasn&amp;#39;t occurred. Thus, the RDBMS has endured it position of primacy albeit on a &amp;quot;one size fits all basis&amp;quot;. &lt;/p&gt; &lt;h4&gt;Circumstantial Pain&lt;/h4&gt; &lt;p&gt; As mentioned earlier, we are in the midst of an economic crisis that is ultimately about a consistent inability to connect dots across a substrate of interlinked data sources that transcend traditional data access boundaries with high doses of schematic heterogeneity. Ironically, in a era of the dot-com, we haven&amp;#39;t been able to make meaningful connections between relevant &amp;quot;real-world things&amp;quot; that extend beyond primitive data hosted database tables and content management style document containers; we&amp;#39;ve struggled to achieve this in the most basic sense, let alone evolve our ability to connect inline with the &lt;a href=&quot;http://www.vldb2007.org/program/slides/s1161-brodie.pdf&quot; id=&quot;link-id11a0dcf0&quot;&gt;exponential rate at which the Internet &amp;amp; Web are spawning &amp;quot;universes of discourse&amp;quot; (data spaces) that emanate from user activity&lt;/a&gt; (within the enterprise and across the Internet &amp;amp; Web). In a nutshell, we haven&amp;#39;t been able to upgrade our interaction with data such that &amp;quot;conceptual models&amp;quot; and resulting &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id12da4b00&quot;&gt;context&lt;/a&gt; lenses&amp;quot; (or facets) become concrete; by this I mean: real-world &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id146a48a8&quot;&gt;entity&lt;/a&gt; interaction making its way into the computer realm as opposed to the impedance we all suffer today when we transition from conceptual model interaction (real-world) to logical model interaction (when dealing with RDBMS based data access and data management). &lt;/p&gt; &lt;p&gt;Here are some simple examples of what I can only best describe as: &amp;quot;critical dots unconnected&amp;quot;, resulting from an inability to interact with data conceptually:&lt;/p&gt; &lt;strong&gt;Government (Globally) -&lt;/strong&gt; &lt;p&gt; Financial regulatory bodies couldn&amp;#39;t effectively discern that a &lt;a href=&quot;http://dbpedia.org/resource/Credit_default_swap&quot; id=&quot;link-id115ba0e0&quot;&gt;Credit Default Swap&lt;/a&gt; is an Insurance policy in all but literal name. And in not doing so the cost of an unregulated &lt;a href=&quot;http://dbpedia.org/resource/Insurance&quot; id=&quot;link-id158d4960&quot;&gt;insurance policy&lt;/a&gt; laid the foundation for exacerbating the toxicity of fatally flawed mortgage backed securities. Put simply: a flawed insurance policy was the fallback on a toxic security that financiers found exotic based on superficial packaging.&lt;/p&gt; &lt;strong&gt;Enterprises - &lt;/strong&gt; &lt;p&gt; Banks still don&amp;#39;t understand that capital really does exists in tangible and intangible forms; with the intangible being the variant that is inherently dynamic. For example, a tech companies intellectual capital far exceeds the value of fixture, fittings, and buildings, but you be amazed to find that in most cases this vital asset has not significant value when banks get down to the nitty gritty of debt collateral; instead, a buffer of flawed securitization has occurred atop a borderline static asset class covering the aforementioned buildings, fixtures, and fittings. &lt;/p&gt; &lt;p&gt; In the general enterprise arena, IT executives continued to &amp;quot;rip and replace&amp;quot; existing technology without ever effectively addressing the timeless inability to connect data across disparate data silos generated by internal enterprise applications, let alone the broader need to mesh data from the inside with external data sources. No correlations made between the growth of buzzwords and the compounding nature of data integration challenges. It&amp;#39;s 2009 and only a miniscule number of executives dare fantasize about being anywhere within distance of the: relevant information at your fingertips vision. &lt;/p&gt; &lt;p&gt; Looking more holistically at data interaction in general, whether you interact with data in the enterprise space (i.e., at work) or on the Internet or Web, you ultimately are delving into a mishmash of disparate computer systems, applications, service (Web or SOA), and databases (of the RDBMS variety in a majority of cases) associated with a plethora of disparate schemas. Yes, but even today &amp;quot;rip and replace&amp;quot; is still the norm pushed by most vendors; pitting one mono culture against another as exemplified by irrelevances such as: FOSS/LAMP vs Commercial or Web vs. Enterprise, when none of this matters if the data access and integration issues are recognized let alone addressed (see: &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1497?sid=0df0294caee8b37925c6a888bbbca136&amp;amp;realm=wa&quot; id=&quot;link-id15c27300&quot;&gt;Applications are Like Fish and Data Like Wine&lt;/a&gt;). &lt;/p&gt; &lt;p&gt; Like the current credit-crunch, exponential growth of data originating from disparate application databases and associated schemas, within shrinking processing time frames, has triggered a rethinking of what defines data access and data management value today en route to an inevitable RDBMS downgrade within the value pyramid.&lt;/p&gt; &lt;h3&gt;Technology&lt;/h3&gt; &lt;p&gt;There have been many attempts to address real-world modeling requirements across the broader DBMS community from Object Databases to Object-Relational Databases, and more recently the emergence of simple &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id1128dad0&quot;&gt;Entity&lt;/a&gt;-Attribute-Value model DBMS engines. In all cases failure has come down to the existence of one or more of the following deficiencies, across each potential alternative:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Query language standardization - nothing close to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id16002d60&quot;&gt;SQL&lt;/a&gt; standardization&lt;/li&gt; &lt;li&gt;Data Access API standardization - nothing close to ODBC, JDBC, OLE-DB, or ADO.NET&lt;/li&gt; &lt;li&gt;Wire protocol standardization - nothing close to HTTP&lt;/li&gt; &lt;li&gt;Distributed Identity infrastructure - nothing close to the non-repudiatable digital Identity that &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id14926b18&quot;&gt;foaf&lt;/a&gt;+ssl accords&lt;/li&gt; &lt;li&gt;Use of Identifiers as network based pointers to data sources - nothing close to RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id16180a28&quot;&gt;Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Negotiable data representation - nothing close to Mime and HTTP based Content Negotiation&lt;/li&gt; &lt;li&gt;Scalability especially in the era of Internet &amp;amp; Web scale.&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt;Entity-Attribute-Value with Classes &amp;amp; Relationships (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id13e741b8&quot;&gt;EAV&lt;/a&gt;/CR) data models&lt;/h4&gt; &lt;p&gt;A common characteristic shared by all post-relational DBMS management systems (from Object Relational to pure Object) is an orientation towards variations of EAV/CR based data models. Unfortunately, all efforts in the EAV/CR realm have typically suffered from at least one of the deficiencies listed above. In addition, the same &amp;quot;one DBMS model fits all&amp;quot; approach that lies at the heart of the RDBMS downgrade also exists in the EAV/CR realm.&lt;/p&gt; &lt;h3&gt;What Comes Next?&lt;/h3&gt; &lt;p&gt;The RDBMS is not going away (ever), but its era of primacy -- by virtue of its placement at the apex of the data access and data management value pyramid -- is over! I make this bold claim for the following reasons: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; The Internet aided &amp;quot;Global Village&amp;quot; has brought &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Open_World_Assumption&quot; id=&quot;link-id1148e560&quot;&gt;Open World&lt;/a&gt;&amp;quot; vs &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Closed_World_Assumption&quot; id=&quot;link-id11967cd0&quot;&gt;Closed World&lt;/a&gt;&amp;quot; assumption issues to the fore e.g., the current global economic crisis remains centered on the inability to connect dots across &amp;quot;Open World&amp;quot; and &amp;quot;Closed World&amp;quot; data frontiers &lt;/li&gt; &lt;li&gt; Entity-Attribute-Value with Classes &amp;amp; Relationships (EAV/CR) based DBMS models are more effective when dealing with disparate data associated with disparate schemas, across disparate DBMS engines, host operating systems, and networks. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Based on the above, it is crystal clear that a different kind of DBMS -- one with higher AVF relative to the RDBMS -- needs to sit atop today&amp;#39;s data access and data management value pyramid. The characteristics of this DBMS must include the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Every item of data (Datum/Entity/Object/Resource) has Identity&lt;/li&gt; &lt;li&gt; Identity is achieved via Identifiers that aren&amp;#39;t locked at the DBMS, OS, Network, or Application levels&lt;/li&gt; &lt;li&gt; Object Identifiers and Object values are independent (extricably linked by association)&lt;/li&gt; &lt;li&gt; Object values should be de-referencable via Object Identifier&lt;/li&gt; &lt;li&gt; Representation of de-referenced value graph (entity, attributes, and values mesh) must be negotiable (i.e. content negotiation)&lt;/li&gt; &lt;li&gt;Structured query language must provide mechanism for Creation, Deletion, Updates, and Querying of data objects&lt;/li&gt; &lt;li&gt; Performance &amp;amp; Scalability across &amp;quot;Closed World&amp;quot; (enterprise) and &amp;quot;Open World&amp;quot; (Internet &amp;amp; Web) realms.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Quick recap, I am not saying that RDBMS engine technology is dead or obsolete. I am simply stating that the era of RDBMS primacy within the data access and data management value pyramid is over. &lt;/p&gt; &lt;p&gt;The problem domain (conceptual model views over heterogeneous data sources) at the apex of the aforementioned pyramid has simply evolved beyond the natural capabilities of the RDBMS which is rooted in &amp;quot;Closed World&amp;quot; assumptions re., data definition, access, and management. The need to maintain domain based conceptual interaction with data is now palpable at every echelon within our &amp;quot;Global Village&amp;quot; - Internet, Web, Enterprise, Government etc.&lt;/p&gt; &lt;p&gt;It is my personal view that an EAV/CR model based DBMS, with support for the seven items enumerated above, can trigger the long anticipated RDBMS downgrade. Such a DBMS would be inherently multi-model because you would need to the best of RDBMS and EAV/CR model engines in a single product, with in-built support for HTTP and other Internet protocols in order to effectively address data representation and serialization issues.&lt;/p&gt; &lt;h4&gt;EAV/CR Oriented Data Access &amp;amp; Management Technology&lt;/h4&gt; &lt;p&gt;Examples of contemporary EAV/CR frameworks that provide concrete conceptual layers for data access and data management currently include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id115d1cb0&quot;&gt; Resource Description Framework&lt;/a&gt; (RDF) - an EAV/CR based framework&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id116cf810&quot;&gt;RDF Linked Data &lt;/a&gt;- EAV/CR based framework that mandates de-referencable HTTP based Identifiers&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id13daa160&quot;&gt;ADO.NET Entity Frameworks&lt;/a&gt; - Microsoft .NET based EAV/CR framework&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/page/Core_Data&quot; id=&quot;link-id11111838&quot;&gt;Core Data Services &lt;/a&gt;- Mac OS X based EAV/CR framework that evolved from NeXT&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Enterprise_Objects_Framework&quot; id=&quot;link-id15c27df0&quot;&gt;Enterprise Object Frameworks&lt;/a&gt; (EOF).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The frameworks above provide the basis for a revised AVF pyramid, as depicted below, that reflects today&amp;#39;s data access and management realities i.e., an Internet &amp;amp; Web driven global village comprised of interlinked distributed data objects, compatible with &amp;quot;Open World&amp;quot; assumptions.&lt;/p&gt; &lt;div&gt; &lt;image src=&quot;http://virtuoso.openlinksw.com/images/New_EAV_RDBMS_Pyramid.png&quot;&gt;&lt;/image&gt; &lt;/div&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://allanslibrary.blogspot.com/2009/06/semantic-way.html&quot; id=&quot;link-id0xb8c5e498&quot;&gt;The Semantic Way&lt;/a&gt; - Alan Cho&amp;#39;s Summary of &lt;a href=&quot;http://www.pwc.com/extweb/home.nsf/docid/1308AF8EA7929CCA852575BA00720F26&quot; id=&quot;link-id0xb80f5e10&quot;&gt;PwC 2009 tech forecast report on the Semantic Web&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php&quot; id=&quot;link-id0xb8c20658&quot;&gt;Is the RDBMS Doomed&lt;/a&gt; - &lt;a href=&quot;http://www.readwriteweb.com&quot;&gt;ReadWriteWeb&lt;/a&gt; Article&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/&quot; id=&quot;link-id0x1ab4778&quot;&gt;Anti-RDBMS: a list of Distributed Key-Value Stores&lt;/a&gt; - by &lt;a href=&quot;http://www.last.fm/user/RJ&quot; id=&quot;link-id0x5a968060&quot;&gt;Richard Jones&lt;/a&gt; (CTO Last.FM)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dynamicorange.com/2009/01/22/blueblog-how-and-why-glue-is-using-amazon-simpledb-instead-of-a-relational-database/&quot; id=&quot;link-id15e07c10&quot;&gt;How &amp;amp; Why Glue is Using Amazon SimpleDB&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.cs.cmu.edu/afs/cs.cmu.edu/user/clamen/OODBMS/Manifesto/htManifesto/node4.html#SECTION00022000000000000000&quot; id=&quot;link-id116cf450&quot;&gt;Object Database Manifesto (Identity excerpt)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.unixspace.com/context/databases.html&quot; id=&quot;link-id150b2c20&quot;&gt;Database Models Overview&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=WEj9vqVvHPc&amp;amp;feature=related&quot; id=&quot;link-id0x66b0850&quot;&gt;Ted Nelson Explaining Irregularity and Idiosyncrasy of Data Structures&lt;/a&gt; - ZigZag Demo &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-06-03T18:09:58.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Response to: This is Not the Future (Update #3)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-13#1518</atom:id>
  <atom:published>2009-01-13T04:18:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;As I cannot post directly to Glenn&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id149ad010&quot;&gt;blog&lt;/a&gt; titled: &lt;a href=&quot;http://www.furia.com/page.cgi?type=log&amp;amp;id=319&quot; id=&quot;link-id113ed070&quot;&gt;This is Not the Near Future (Either)&lt;/a&gt;, I have to basically respond to him here, in blog post form :-(&lt;/p&gt; &lt;p&gt;What is our &lt;a href=&quot;http://b3s.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-id10fbeec0&quot;&gt;&amp;quot;Search&amp;quot; and &amp;quot;Find&amp;quot; demonstration&lt;/a&gt; about? It is about how you use the &amp;quot;Description&amp;quot; of &amp;quot;Things&amp;quot; to unambiguously locate things in a database at &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Scale.&lt;/p&gt; &lt;p&gt;To our perpetual chagrin, we are trying to demonstrate an engine -- not UI prowess -- but the immediate response is to jump to the UI aesthetics.&lt;/p&gt; &lt;p&gt;Google, Yahoo etc.. offer a simple input form for &lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id14296fb8&quot;&gt;full text search&lt;/a&gt; patterns, they have a processing window for completing full text searches across Web Content indexed on their servers. Once the search patterns are processed, you get a page ranked result set (collection of Web pages basically that claim/state: we found N pages out of a document corpus of about M indexed pages). &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note:&lt;/strong&gt; the estimate aspect of traditional search results in like &amp;quot;advertising small print&amp;quot; the user lives with the illusion that all possible documents on the Web (or even &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id13436b50&quot;&gt;Internet&lt;/a&gt;) have been searched whereas in reality: 25% of the possible total is a major stretch; since the Web and Internet are &lt;a href=&quot;http://en.wikipedia.org/wiki/Fractal_dimension_on_networks&quot; id=&quot;link-id1105ec48&quot;&gt;fractal networks&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Scale-free_network&quot; id=&quot;link-id111ad558&quot;&gt;scale-free&lt;/a&gt;, inherently growing at exponential rates &amp;quot;ad infinitum&amp;quot; across boundless dimensions of human comprehension.&lt;/p&gt; &lt;p&gt; The power of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id111dc7c8&quot;&gt;Linked Data&lt;/a&gt; ultimately comes down to the fact that the user constructs the path to what they seek via the properties of the &amp;quot;Things&amp;quot; in question. The routes are not hardwired since &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id15cbc6f8&quot;&gt;URI&lt;/a&gt; de-referencing (follow your nose pattern) is available to Linked Data aware query engines and crawlers. &lt;/p&gt; &lt;p&gt;We are simply trying to demonstrate how you can combine the best of full text search with the best of structured querying while reusing familiar interaction patterns from Google/Yahoo. Thus, you start with full text search, find get all the entities associated with the pattern, then use the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1512c8a8&quot;&gt;entity&lt;/a&gt; types or entity properties to find what you seek.&lt;/p&gt; &lt;p&gt;You state in your post:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;To state the obvious caveat, the claim OpenLink is making about this demo is not that it delivers better search-term relevance, therefore the ranking of searching results is not the main criteria on which it is intended to be assessed.&amp;quot; &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; Correct. &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt; &amp;quot;On the other hand, one of the things they are bragging about is that their server will automatically cut off long-running queries. So how do you like your first page of results?&amp;quot;. &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; Not exactly correct. We are performing aggregates using a configurable interactive time factor. Example: tell &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id12fb67c0&quot;&gt;me&lt;/a&gt; how many entities of type: Person, with interest: &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id159bffc8&quot;&gt;Semantic Web&lt;/a&gt;, exist in this database within 2 seconds. Also understand that you could retry the same query and get different numbers within the same interactive time factor. It isn&amp;#39;t your basic &amp;quot;query cut-off&amp;quot;. &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt; &amp;quot;And on the other other hand, the big claim OpenLink is making about this demo is that the aggregate experience of using it is better than the aggregate experience of using &amp;quot;traditional&amp;quot; search. So go ahead, use it. If you can.&amp;quot;&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Yes, &amp;quot;Microsoft&amp;quot; was a poor example for sure, the example could have been pattern: &amp;quot;glenn mcdonald&amp;quot;, which should demonstrate the fundamental utility of what we are trying to demonstrate i.e., entity disambiguation courtesy of entity properties and/or entity type filtering.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.google.com/search?q=glenn+mcdonald&quot; id=&quot;link-id15e4dbc8&quot;&gt;Compare Googles results for: Glenn McDonald&lt;/a&gt; with those from our demo (which dissambiguate &amp;quot;Glenn McDonald&amp;quot; via associated properties and/or types), assuming we both agree that your Web Site or Blog Home isn&amp;#39;t the center of your entity graph or personal &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id15754528&quot;&gt;data space&lt;/a&gt; (i.e., data about you); so getting your home page at the top of the Google page rank offers limited value, in reality.&lt;/p&gt; &lt;p&gt;What are we bragging about? A little more than what you attempt to explain. Yes, we are showing that we can find stuff within a processing window, but understand the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Processing Time Window (or interactive time) is configurable &lt;/li&gt; &lt;li&gt; Data Corpus is a Billion+ Triples (from &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id149a25e0&quot;&gt;Billion Triples Challenge Data Set&lt;/a&gt;) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id15e13180&quot;&gt;SPARQL&lt;/a&gt; doesn&amp;#39;t have Aggregation capabilities by default (we have implemented &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSArticleBISPARQL2&quot; id=&quot;link-id1593a550&quot;&gt;SPARQL-BI&lt;/a&gt; to deliver aggregates for analytics against large data sets, we even handle the TPC-H industry standard benchmark with SPARQL-BI)&lt;/li&gt; &lt;li&gt; Paging isn&amp;#39;t possible without aggregates, and doing aggregates on a Billion+ triples as part of a query processing cycle isn&amp;#39;t trivial stuff (otherwise it would be everywhere due to inherent and obvious necessity).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I hope I&amp;#39;ve clarified what&amp;#39;s going on with our demo? If not, pose your challenge via examples and I will respond with solutions or simply cry out loud: &amp;quot;no mas!&amp;quot;.&lt;/p&gt; &lt;p&gt;As for your &amp;quot;Mac OX X Leopard&amp;quot; comments, I can only say this: I emphasized that this is a demo, the data is pretty old, and the input data has issues (i.e. some of the input data is bad as your example shows). The purpose of this demo is not about the text per se., it&amp;#39;s about the size of the data corpus and faceted querying. We are going to have the entire &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id15dfec08&quot;&gt;LOD&lt;/a&gt; Cloud loaded into the real thing, and in addition to that our Sponger Middleware will be enabled, and then you can take issue with data quality as per your reference to &amp;quot;Cyndi Lauper&amp;quot; (btw - it takes one property filter to find &lt;a href=&quot;http://b3s.openlinksw.com/fct/facet.vsp?cmd=set_view&amp;amp;sid=552&amp;amp;type=text-properties&amp;amp;limit=20&amp;amp;offset=0&quot; id=&quot;link-id1496d2a0&quot;&gt;information about her quickly&lt;/a&gt; using &amp;quot;&lt;strong&gt;dbpprop:name&lt;/strong&gt;&amp;quot; after filtering for properties with text values).&lt;/p&gt; &lt;p&gt;Of all things, this demo had nothing to do with UI and &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11009090&quot;&gt;Information&lt;/a&gt; presentation aesthetics. It was all about combining full text search and structured queries (sparql behind the scenes) against a huge data corpus en route to solving challenges associated with faceted browsing over large data sets. We have built a service that resides inside &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id118b36a8&quot;&gt;Virtuoso&lt;/a&gt;. The Service is naturally of the &amp;quot;Web Service&amp;quot; variety and can be used from any consumer / client environment that speaks HTTP (directly or indirectly).&lt;/p&gt; &lt;p&gt;To be continued ...&lt;/p&gt;</atom:content>
  <atom:updated>2009-01-21T19:02:47-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>A Linked Data Web Approach To Semantic &quot;Search&quot; &amp; &quot;Find&quot; (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-09#1517</atom:id>
  <atom:published>2009-01-09T23:34:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;The first salvo of what we&amp;#39;ve been hinting about re. server side faceted browsing over Unlimited &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; within configurable Interactive Time-frames is now available for experimentation at: &lt;a href=&quot;http://b3s.openlinksw.com/fct/facet.vsp&quot; id=&quot;link-ide41d210&quot;&gt;http://b3s.openlinksw.com/fct/facet.vsp&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Simple example / demo:&lt;/h3&gt; &lt;p&gt;Enter search pattern: Microsoft&lt;/p&gt; &lt;p&gt;You will get the usual result from a full text pattern search i.e., hits and text excerpts with matching patterns in boldface. This first step is akin to throwing your net out to sea while fishing.&lt;/p&gt; &lt;p&gt; Now you have your catch, what next? Basically, this is where traditional text search value ends since &lt;a href=&quot;http://dbpedia.org/resource/regular_expression&quot; id=&quot;link-id113b6840&quot;&gt;regex&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id1151c140&quot;&gt;xpath&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id14565db8&quot;&gt;xquery&lt;/a&gt; offer little when the structure of literal text is the key to filtering or categorization based analysis of real-world entities. Naturally, this is where the value of structured querying of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11bc8208&quot;&gt;linked data&lt;/a&gt; starts, as you seek to use &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id150e7298&quot;&gt;entity&lt;/a&gt; descriptions (combination of attribute and relationship properties) to &amp;quot;Find relevant things&amp;quot;.&lt;/p&gt; &lt;p&gt;Continuing with the demo.&lt;/p&gt; &lt;p&gt;Click on &amp;quot;Properties&amp;quot; link within the Navigation section of the browser page which results in a distillation and aggregation of the properties of the entities associated with the search results. Then use the &amp;quot;Next&amp;quot; link to page through the properties until to find the properties that best match what you seek. Note, this particular step is akin to using the properties of the catch (using fishing analogy) for query filtering, with each subsequent property link click narrowing your selection further.&lt;/p&gt; &lt;p&gt;Using property based filtering is just one perspective on the data corpus associated with the text search pattern; thus, you can alter perspectives by clicking on the &amp;quot;Class&amp;quot; link so that you can filter you search results by entity type. Of course, in a number of scenarios you would use a combination of entity types and entity properties filters to locate the entities of interest to you. &lt;/p&gt; &lt;h3&gt;A Few Notes about this demo instance of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14453088&quot;&gt;Virtuoso&lt;/a&gt;:&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; Lookup Data Size (Local Linked Data Corpus): 2 Billion+ Triples (&lt;a href=&quot;http://dbpedia.org/page/Entity-attribute-value_model&quot; id=&quot;link-id13447558&quot;&gt;entity-attribute-value&lt;/a&gt; tuples)&lt;/li&gt; &lt;li&gt; This is a *temporary* teaser / precursor to the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id14e3bfc8&quot;&gt;LOD&lt;/a&gt; (Linking Open Data Cloud) variant of our Linked Data driven &amp;quot;Search&amp;quot; &amp;amp; &amp;quot;Find&amp;quot; service; we decided to implement this functionality prior to commissioning a larger and more up to date instance based on the entire LOD Cloud&lt;/li&gt; &lt;li&gt; The browser is simply using a &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id138b5688&quot;&gt;Virtuoso&lt;/a&gt; PL function that also exists in &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Service form for loose binding by 3rd parties that have a UI orientation and focus (our UI is deliberately bare boned).&lt;/li&gt; &lt;li&gt;The properties and entity types (classes) links expose formal definitions and dictionary provenance &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id10ecc8e0&quot;&gt;information&lt;/a&gt; materialized in an HTML page (of course your browser or any other HTTP user agent can negotiation alternative representations of this descriptive information)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id117b95e0&quot;&gt;UMBEL&lt;/a&gt; based inference rules are enabled, giving you a live and simple demonstration of the virtues of Linked Data Dictionaries for example: click on the description link of any property or class from the &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id1595dd88&quot;&gt;foaf&lt;/a&gt; (friend-of-a-friend vocabulary), &lt;a href=&quot;http://dbpedia.org/resource/SIOC&quot; id=&quot;link-id151315e8&quot;&gt;sioc&lt;/a&gt; (semantically-interlinked-online-communities ontology), &lt;a href=&quot;http://musicontology.com/&quot; id=&quot;link-id15b9d6e8&quot;&gt;mo&lt;/a&gt; (music ontology), &lt;a href=&quot;http://bibliontology.com/&quot; id=&quot;link-id114257e8&quot;&gt;bibo&lt;/a&gt; (bibliographic data ontology) namespaces to see how the data between these lower level vocabularies or ontologies are meshed with &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id15b9be80&quot;&gt;OpenCyc&lt;/a&gt;&amp;#39;s upper level ontology. &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1515&quot; id=&quot;link-id14694eb8&quot;&gt;Faceted Search: Unlimited Data in Interactive Time&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/Virtuoso Anytime: No Query Is Too Complex (updated)&quot; id=&quot;link-id1356c630&quot;&gt;Virtuoso Anytime: No Query Is Too Complex&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-10T13:55:56.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Faceted Search: Unlimited Data in Interactive Time</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-01-09#1516</atom:id>
  <atom:published>2009-01-09T22:03:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;Why not see the whole world of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xc3f6b38&quot;&gt;data&lt;/a&gt; as facets? Well, we&amp;#39;d like to, but there is the feeling that this is not practical.&lt;/p&gt; &lt;p&gt;The old problem has been that it is not really practical to pre-compute counts of everything for all possible combinations of search conditions and counting/grouping/sorting. The actual matches take time.&lt;/p&gt; &lt;p&gt;Well, neither is in fact necessary. When there are large numbers of items matching the conditions, counting them can take time but then this is the beginning of the search, and the user is not even likely to look very closely at the counts. It is enough to see that there are many of one and few of another. If the user already knows the precise predicate or class to look for, then the top-level faceted view is not even needed. The faceted view for guiding search and precise analytics are two different problems.&lt;/p&gt; &lt;p&gt;There are client-side faceted views like Exhibit or our own &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1bc1cfe0&quot;&gt;ODE&lt;/a&gt;. The problem with these is that there are a few orders of magnitude difference between the actual database size and what fits on the user agent. This is compounded by the fact that one does not know what to cache on the user agent because of the open nature of the data web. If this were about a fixed workflow, then a good guess would be possible — but we are talking about the data web, the very soul of serendipity and unexpected discovery.&lt;/p&gt; &lt;p&gt;So we made a web service that will do faceted search on arbitrary &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xbb62170&quot;&gt;RDF&lt;/a&gt;. If it does not get complete results within a timeout, it will return what it has counted so far, using &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xb122b00&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1494&quot; id=&quot;link-id117b0df0&quot;&gt;&lt;b&gt;Anytime&lt;/b&gt;&lt;/a&gt; feature. Looking for subjects with some specific combination of properties is however a bit limited, so this will also do &lt;code&gt;JOINs&lt;/code&gt;. Many features are one or two &lt;code&gt;JOINs&lt;/code&gt; away; take geographical locations or social networks, for example.&lt;/p&gt; &lt;p&gt;Yet a faceted search should be point-and-click, and should not involve a full query construction. We put the compromise at starting with full text or property or class, then navigating down properties or classes, to arbitrary depth, tree-wise. At each step, one can see the matching instances or their classes or properties, all with counts, faceted-style.&lt;/p&gt; &lt;p&gt;This is good enough for queries like &amp;#39;what do Harry Potter fans also like&amp;#39; or &amp;#39;who are the authors of articles tagged &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xbee32d8&quot;&gt;semantic web&lt;/a&gt; and machine learning and published in 2008&amp;#39;. For complex grouping, sub-queries, arithmetic or such, one must write the actual query.&lt;/p&gt; &lt;p&gt;But one can begin with facets, and then continue refining the query by hand since the service also returns &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xbcc9f38&quot;&gt;SPARQL&lt;/a&gt; text. We made a small web interface on top of the service with all logic server side. This proves that the web service is usable and that an interface with no AJAX, and no problems with browser interoperability or such, is possible and easy. Also, the problem of syncing between a user-agent-based store and a database is entirely gone.&lt;/p&gt; &lt;p&gt;If we are working with a known data structure, the user interface should choose the display by the data type and offer links to related reports. This is all easy to build as web pages or AJAX. We show how the generic interface is done in Virtuoso PL, and you can adapt that or rewrite it in &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0xcdbe268&quot;&gt;PHP&lt;/a&gt;, Java, JavaScript, or anything else, to accommodate use-case specific navigation needs such as data format.&lt;/p&gt; &lt;p&gt;The web service takes an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0xc019c08&quot;&gt;XML&lt;/a&gt; representation of the search, which is more restricted and easier to process by machine than the SPARQL syntax. The web service returns the results, the SPARQL query it generated, whether the results are complete or not, and some resource use statistics.&lt;/p&gt; &lt;p&gt;The source of the PL functions, Web Service and Virtuoso Server Page (HTML UI) will be available as part of Virtuoso 6.0 and higher. A Programmer&amp;#39;s Guide will be available as part of the standard Virtuoso Documentation collection, including the Virtuoso Open Source Edition Website.&lt;/p&gt;</atom:content>
  <atom:updated>2009-01-09T17:15:39-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Faceted Search: Unlimited Data in Interactive Time</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-01-09#1515</atom:id>
  <atom:published>2009-01-09T22:03:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;Why not see the whole world of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1a0319c0&quot;&gt;data&lt;/a&gt; as facets? Well, we&amp;#39;d like to, but there is the feeling that this is not practical.&lt;/p&gt; &lt;p&gt;The old problem has been that it is not really practical to pre-compute counts of everything for all possible combinations of search conditions and counting/grouping/sorting. The actual matches take time.&lt;/p&gt; &lt;p&gt;Well, neither is in fact necessary. When there are large numbers of items matching the conditions, counting them can take time but then this is the beginning of the search, and the user is not even likely to look very closely at the counts. It is enough to see that there are many of one and few of another. If the user already knows the precise predicate or class to look for, then the top-level faceted view is not even needed. The faceted view for guiding search and precise analytics are two different problems.&lt;/p&gt; &lt;p&gt;There are client-side faceted views like Exhibit or our own &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0xc3db130&quot;&gt;ODE&lt;/a&gt;. The problem with these is that there are a few orders of magnitude difference between the actual database size and what fits on the user agent. This is compounded by the fact that one does not know what to cache on the user agent because of the open nature of the data web. If this were about a fixed workflow, then a good guess would be possible — but we are talking about the data web, the very soul of serendipity and unexpected discovery.&lt;/p&gt; &lt;p&gt;So we made a web service that will do faceted search on arbitrary &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xbdbf198&quot;&gt;RDF&lt;/a&gt;. If it does not get complete results within a timeout, it will return what it has counted so far, using &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x17691878&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1494&quot; id=&quot;link-id117b0df0&quot;&gt;&lt;b&gt;Anytime&lt;/b&gt;&lt;/a&gt; feature. Looking for subjects with some specific combination of properties is however a bit limited, so this will also do &lt;code&gt;JOINs&lt;/code&gt;. Many features are one or two &lt;code&gt;JOINs&lt;/code&gt; away; take geographical locations or social networks, for example.&lt;/p&gt; &lt;p&gt;Yet a faceted search should be point-and-click, and should not involve a full query construction. We put the compromise at starting with full text or property or class, then navigating down properties or classes, to arbitrary depth, tree-wise. At each step, one can see the matching instances or their classes or properties, all with counts, faceted-style.&lt;/p&gt; &lt;p&gt;This is good enough for queries like &amp;#39;what do Harry Potter fans also like&amp;#39; or &amp;#39;who are the authors of articles tagged &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x160eb950&quot;&gt;semantic web&lt;/a&gt; and machine learning and published in 2008&amp;#39;. For complex grouping, sub-queries, arithmetic or such, one must write the actual query.&lt;/p&gt; &lt;p&gt;But one can begin with facets, and then continue refining the query by hand since the service also returns &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x17e82228&quot;&gt;SPARQL&lt;/a&gt; text. We made a small web interface on top of the service with all logic server side. This proves that the web service is usable and that an interface with no AJAX, and no problems with browser interoperability or such, is possible and easy. Also, the problem of syncing between a user-agent-based store and a database is entirely gone.&lt;/p&gt; &lt;p&gt;If we are working with a known data structure, the user interface should choose the display by the data type and offer links to related reports. This is all easy to build as web pages or AJAX. We show how the generic interface is done in Virtuoso PL, and you can adapt that or rewrite it in &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0xbe41d60&quot;&gt;PHP&lt;/a&gt;, Java, JavaScript, or anything else, to accommodate use-case specific navigation needs such as data format.&lt;/p&gt; &lt;p&gt;The web service takes an &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0xc2fc358&quot;&gt;XML&lt;/a&gt; representation of the search, which is more restricted and easier to process by machine than the SPARQL syntax. The web service returns the results, the SPARQL query it generated, whether the results are complete or not, and some resource use statistics.&lt;/p&gt; &lt;p&gt;The source of the PL functions, Web Service and Virtuoso Server Page (HTML UI) will be available as part of Virtuoso 6.0 and higher. A Programmer&amp;#39;s Guide will be available as part of the standard Virtuoso Documentation collection, including the Virtuoso Open Source Edition Website.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:24:08.122703-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>New ADO.NET 3.x Provider for Virtuoso Released (Update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-08#1514</atom:id>
  <atom:published>2009-01-08T04:36:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;I am pleased to announce the immediate availability of the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtAdoNet35Provider&quot; id=&quot;link-id142e7390&quot;&gt;Virtuoso ADO.NET 3.5 data provider&lt;/a&gt; for Microsoft&amp;#39;s .NET platform.&lt;/p&gt; &lt;h3&gt;What is it?&lt;/h3&gt; &lt;p&gt;A data access driver/provider that provides conceptual &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id11c36c00&quot;&gt;entity&lt;/a&gt; oriented access to &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id12fb8618&quot;&gt;RDBMS&lt;/a&gt; data managed by Virtuoso. Naturally, it also uses Virtuoso&amp;#39;s in-built virtual / &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id115bedc8&quot;&gt;federated database&lt;/a&gt; layer to provide access to &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id15153c08&quot;&gt;ODBC&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id13418908&quot;&gt;JDBC&lt;/a&gt; accessible RDBMS engines such as: &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id134d72f0&quot;&gt;Oracle&lt;/a&gt; (7.x to latest), &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id15757b88&quot;&gt;SQL&lt;/a&gt; Server (4.2 to latest), &lt;a href=&quot;http://dbpedia.org/resource/Sybase&quot; id=&quot;link-id15ef8d48&quot;&gt;Sybase&lt;/a&gt;, IBM &lt;a href=&quot;http://dbpedia.org/resource/IBM_Informix&quot; id=&quot;link-id12f56aa0&quot;&gt;Informix&lt;/a&gt; (5.x to latest), IBM &lt;a href=&quot;http://dbpedia.org/resource/IBM_DB2&quot; id=&quot;link-id119feb38&quot;&gt;DB2&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id14e3d6c8&quot;&gt;Ingres&lt;/a&gt; (6.x to latest), Progress (7.x to OpenEdge), &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id11295630&quot;&gt;MySQL&lt;/a&gt;, PostgreSQL, &lt;a href=&quot;http://dbpedia.org/resource/Firebird_database_server&quot; id=&quot;link-id12f40448&quot;&gt;Firebird&lt;/a&gt;, and others using our ODBC or JDBC bridge drivers.&lt;/p&gt; &lt;h3&gt;Benefits?&lt;/h3&gt; &lt;h4&gt;Technical:&lt;/h4&gt; &lt;p&gt;It delivers an &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id14012040&quot;&gt;Entity-Attribute-Value + Classes &amp;amp; Relationships model&lt;/a&gt; over disparate data sources that are materialized as .NET Entity Framework Objects, which are then consumable via ADO.NET Data Object Services, LINQ for Entities, and other ADO.NET data consumers.&lt;/p&gt; &lt;p&gt;The provider is fully integrated into Visual Studio 2008 and delivers the same &amp;quot;ease of use&amp;quot; offered by Microsoft&amp;#39;s own SQL Server provider, but across Virtuoso, Oracle, Sybase, DB2, Informix, Ingres, &lt;a href=&quot;http://dbpedia.org/resource/Progress_4GL&quot; id=&quot;link-id158d1fe8&quot;&gt;Progress (OpenEdge&lt;/a&gt;), MySQL, PostgreSQL, Firebird, and others. The same benefits also apply uniformly to Entity Frameworks compatibility.&lt;/p&gt; &lt;p&gt; Bearing in mind that Virtuoso is a multi-model (hybrid) data manager, this also implies that you can use .NET Entity Frameworks against all data managed by Virtuoso. Remember, Virtuoso&amp;#39;s SQL channel is a conduit to Virtuoso&amp;#39;s core; thus, RDF (courtesy of &lt;a href=&quot;http://esw.w3.org/topic/SPASQL&quot; id=&quot;link-id133c9b70&quot;&gt;SPASQL&lt;/a&gt; as already implemented re. &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtJenaProvider&quot; id=&quot;link-id11380b80&quot;&gt;Jena&lt;/a&gt;/&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSesame2Provider&quot; id=&quot;link-id10fc0c88&quot;&gt;Sesame&lt;/a&gt;/&lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtRDFDriverRedland&quot; id=&quot;link-id1390f730&quot;&gt;Redland&lt;/a&gt; providers), XML, and other data forms stored in Virtuoso also become accessible via .NET&amp;#39;s Entity Frameworks.&lt;/p&gt; &lt;br /&gt; &lt;h4&gt;Strategic:&lt;/h4&gt; &lt;p&gt;You can choose which entity oriented data access model works best for you: RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id151354f0&quot;&gt;Linked Data&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id15dc5eb0&quot;&gt;SPARQL&lt;/a&gt; or .NET Entity Frameworks &amp;amp; &lt;a href=&quot;http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework#Entity_SQL&quot; id=&quot;link-id14404e80&quot;&gt;Entity SQL&lt;/a&gt;. Either way, Virtuoso delivers a commercial grade, high-performance, secure, and scalable solution.&lt;/p&gt; &lt;br /&gt; &lt;h3&gt;How do I use it?&lt;/h3&gt; Simply follow one of guides below: &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEntityFrameworkSchoolDbWinFormApp&quot; id=&quot;link-id15e5c580&quot;&gt;Using Visual Studio 2008 &amp;amp; Virtuoso to build an Entity Frameworks based Windows forms application&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtUsingMsAdoNetDataServicesWithVirtuoso&quot; id=&quot;link-id157912b0&quot;&gt;Using Visual Studio 2008 &amp;amp; Virtuoso to build an ADO.NET Data Services based application&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;b&gt;Note:&lt;/b&gt; When working with external or 3rd party databases, simply use the Virtuoso Conductor to link the external data source into Virtuoso. Once linked, the remote tables will simply be treated as though they are native Virtuoso tables leaving the &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id15b04b18&quot;&gt;virtual database&lt;/a&gt; engine to handle the rest. This is similar to the role the Microsoft JET engine played in the early days of ODBC, so if you&amp;#39;ve ever linked an ODBC data source into Microsoft Access, you are ready to do the same using Virtuoso.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1420&quot; id=&quot;link-id160afdd0&quot;&gt;Entity Oriented Data Access&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1474&quot; id=&quot;link-id113eeb50&quot;&gt;Yoda &amp;amp; the Data FORCE.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-08T09:12:50.000006-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Web Collaborators: Introducing Structured Dynamics</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-03#1513</atom:id>
  <atom:published>2009-01-03T04:03:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;As indicated in posts from Fred Giasson and &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mkbergman#this&quot; id=&quot;link-id152486c0&quot;&gt;Mike Bergman&lt;/a&gt;, the &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id1163fb28&quot;&gt;Zitgist&lt;/a&gt; incubation effort that contributed to the delivery of vital &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1163ff68&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id112a1338&quot;&gt;Web&lt;/a&gt; infrastructure components such as &lt;a href=&quot;http://www.talkdigger.com/&quot; id=&quot;link-id11938fe8&quot;&gt;TalkDigger&lt;/a&gt; (discourse discovery and participation), &lt;a href=&quot;http://www.pingthesemanticweb.com/about/&quot; id=&quot;link-id15da46f0&quot;&gt;PingTheSemanticWeb&lt;/a&gt; (ground-zero &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; source for most &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id15ff68f0&quot;&gt;Semantic Web&lt;/a&gt; search engines), &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id112fddb0&quot;&gt;UMBEL&lt;/a&gt; (binding layer for Upper and Lower Ontologies amongst other things), &lt;a href=&quot;http://musicontology.com&quot; id=&quot;link-id157ff9e0&quot;&gt;Music Ontology&lt;/a&gt; (enabling meaningful description of Music), and &lt;a href=&quot;http://bibliontology.com/&quot; id=&quot;link-id11459180&quot;&gt;Bibliographic Ontology&lt;/a&gt; (enabling meaningful description of Bibliographic content), is now ready to continue its business development and technology growth as a going concern known as &lt;a href=&quot;http://www.structureddynamics.com/&quot; id=&quot;link-id110c3b50&quot;&gt;Structured Dynamics&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;With great joy and pride, I wish Structured Dynamics all the success they deserve. Naturally, the collaborations and close relationship between &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id11849528&quot;&gt;OpenLink Software&lt;/a&gt; and its latest technology partner will continue -- especially as we collectively work towards a more comprehendible and pragmatic Web of Linked Data for developers (across Web 1.0, 2.0, 3.0, and beyond), end-users (&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id15246af8&quot;&gt;information&lt;/a&gt;- and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id15d27888&quot;&gt;knowledge&lt;/a&gt;-workers), and entrepreneurs (driven by quality and tangible value contribution).&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://fgiasson.com/blog/index.php/2009/01/02/structured-dynamics-for-the-new-year/&quot; id=&quot;link-id13bf7fd0&quot;&gt;Structured Dynamics for the New Year&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.mkbergman.com/?p=468&quot; id=&quot;link-id111e9e88&quot;&gt;A New Year, a New Beginning and a New Venture&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-02T23:27:26-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>My Hopes for Linked Data in 2009 (Update #2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2009-01-02#1512</atom:id>
  <atom:published>2009-01-02T18:39:23Z</atom:published>
  <atom:content type="html">&lt;p&gt;Happy New Year!&lt;/p&gt; &lt;p&gt;In 2009 I hope the following happens re. &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id15acc7d0&quot;&gt;Linked Data&lt;/a&gt;&amp;quot;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;We realize it&amp;#39;s a &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id1101eb90&quot;&gt;Meme&lt;/a&gt; &lt;/li&gt; &lt;li&gt;We collectively connect the Meme to the concept of granular hyperlinks between &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; entities/objects (datum to datum linkage aka. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id113d96a0&quot;&gt;Hyperdata&lt;/a&gt; Linking)&lt;/li&gt; &lt;li&gt;We generally connect the Meme to technology ancestry such as the &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id1136d980&quot;&gt;Entity-Attribute-Value with Classes &amp;amp; Relationships&lt;/a&gt; (EAV/CR) data model (then broader commonality with erstwhile unrelated realms will be unveiled e.g., &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id1122ab80&quot;&gt;Entity Frameworks from Microsoft&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Core_Data&quot; id=&quot;link-id138b5b28&quot;&gt;Core Data from Apple&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Simpledb&quot; id=&quot;link-id118576d0&quot;&gt;SimpleDB&lt;/a&gt; from Amazon, and the &lt;a href=&quot;http://en.wikipedia.org/wiki/Freebase_(database)&quot; id=&quot;link-id19107a90&quot;&gt;Freebase Graph Model DB&lt;/a&gt; amongst others)&lt;/li&gt; &lt;li&gt;We instinctively connect the Meme to the concept of Entity Oriented Data Access and Management (RDF based Linked Data is basically EAV/CR scheme that uses HTTP based Pointers for Entity, Attribute, and Relationship Identifiers)&lt;/li&gt; &lt;li&gt;We naturally connect the Meme with the notion that an identifier for a unit of data (aka. Datum) should be the conduit to a negotiable representation of said Datum&amp;#39;s description (i.e., it&amp;#39;s attribute and relationship properties in HTML, XHTML, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id151cc688&quot;&gt;RDFa&lt;/a&gt;, Turtle, N3, RDF/XML etc., for example)&lt;/li&gt; &lt;li&gt;We ultimately connect the Meme with a conceptual-level approach to data integration across disparate data sources (also known as &lt;a href=&quot;http://dbpedia.org/resource/Master_Data_Management&quot; id=&quot;link-id1596b8d8&quot;&gt;Master Data Management&lt;/a&gt; (MDM) ).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; 2009 is about a reboot on a monumental scale. We need new thinking, new technology, new approaches, and new solutions. No matter what route we take, we can&amp;#39;t negate the importance of &amp;quot;Data&amp;quot;. When dealing with organic or inorganic computers systems -- Data is simply everything!&lt;/p&gt; &lt;p&gt; The ability of individuals and enterprises to access, mesh, and disseminate data to relevant nodes across public and private networks will ultimately determine the winners and losers in the new frontier, ushered in by 2009.&lt;/p&gt; &lt;p&gt; Do not take data access and data management technology for granted. User interfaces come and ago, application logic comes and goes, but your data stays with you forever. If you are mystified by data access technology then make 2009 the year of data access technology demystification :-) &lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1510&quot; id=&quot;link-id11246da8&quot;&gt;Linked Data &amp;amp; The Year 2009&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=data%20access&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id11848a20&quot;&gt;Various posts from my blog space&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-06T21:35:19.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data &amp; The Year 2009 (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2009-01-02#1511</atom:id>
  <atom:published>2009-01-02T16:17:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;As is fitting for the season, I will editorialize a bit about what has gone before and what is to come.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1119f250&quot;&gt;Sir Tim&lt;/a&gt; said it at WWW08 in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x1dcb93a0&quot;&gt;Beijing&lt;/a&gt; — &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x13a3efb8&quot;&gt;linked data&lt;/a&gt; and the linked data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x13a44cd0&quot;&gt;web&lt;/a&gt; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x10d25788&quot;&gt;semantic web&lt;/a&gt; and the Web done right.&lt;/p&gt; &lt;p&gt;The grail of &lt;i&gt;ad hoc&lt;/i&gt; analytics on infinite &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa201d518&quot;&gt;data&lt;/a&gt; has lost none of its appeal. We have seen fresh evidence of this in the realm of data warehousing products, as well as storage in general.&lt;/p&gt; &lt;p&gt;The benefits of a data model more abstract than the relational are being increasingly appreciated also outside the data web circles. Microsoft&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x12fa4e40&quot;&gt;Entity&lt;/a&gt; Frameworks technology is an example. Agility has been a buzzword for a long time. Everything should be offered in a service based business model and should interoperate and integrate with everything else — business needs first; schema last.&lt;/p&gt; &lt;p&gt;Not to forget that when money is tight, reuse of existing assets and paying on a usage basis are naturally emphasized. &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x175b32e8&quot;&gt;Information&lt;/a&gt;, as the asset it is, is none the less important, on the contrary. But even with information, value should be realized economically, which, among other things, entails not reinventing the wheel.&lt;/p&gt; &lt;p&gt;It is against this backdrop that this year will play out.&lt;/p&gt; &lt;p&gt;As concerns research, I will &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1374&quot; id=&quot;link-id1151b128&quot;&gt;again quote&lt;/a&gt; &lt;a href=&quot;http://www.ibiblio.org/hhalpin/#&quot; id=&quot;link-id141cb740&quot;&gt;Harry Halpin&lt;/a&gt; at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x18a8a858&quot;&gt;ESWC 2008&lt;/a&gt;: &amp;quot;Men will fight in a war, and even lose a war, for what they believe just. And it may come to pass that later, even though the war were lost, the things then fought for will emerge under another name and establish themselves as the prevailing reality&amp;quot; [or words to this effect].&lt;/p&gt; &lt;p&gt;Something like the data web, and even the semantic web, will happen. Harry&amp;#39;s question was whether this would be the descendant of what is today called semantic web research.&lt;/p&gt; &lt;p&gt;I heard in conversation about a project for making a very large metadata store. I also heard that the makers did not particularly insist on this being &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x3c39ed80&quot;&gt;RDF&lt;/a&gt;-based, though.&lt;/p&gt; &lt;p&gt;Why should such a thing be RDF-based? If it is already accepted that there will be &lt;i&gt;ad hoc&lt;/i&gt; schema and that queries ought to be able to view the data from all angles, not be limited by having indices one way and not another way, then why not RDF?&lt;/p&gt; &lt;p&gt;The justification of RDF is in reusing and linking-to data and terminology out there. Another justification is that by using an RDF store, one is spared a lot of work and tons of compromises which attend making an &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x14a77880&quot;&gt;entity&lt;/a&gt;-attribute-value (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x5f978e88&quot;&gt;EAV&lt;/a&gt;, i.e., triple) store on a generic &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x391bdcd8&quot;&gt;RDBMS&lt;/a&gt;. The sem-web world has been there, trust me. We came out well because we put all inside the RDBMS, lowest level, which you can&amp;#39;t do unless you own the RDBMS. Source access is not enough; you also need the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x138a3a00&quot;&gt;knowledge&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Technicalities aside, the question is one of proprietary vs. standards-based. This is not only so with software components, where standards have consistently demonstrated benefits, but now also with the data. &lt;a href=&quot;http://www.zemanta.com/&quot; id=&quot;link-id0x5f92cb38&quot;&gt;Zemanta&lt;/a&gt; and &lt;a href=&quot;http://www.opencalais.com/&quot; id=&quot;link-id0x139c3200&quot;&gt;OpenCalais&lt;/a&gt; serving &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1731dc78&quot;&gt;DBpedia&lt;/a&gt; URIs are examples. Even in entirely closed applications, there is benefit in reusing open vocabularies and identifiers: One does not need to create a secret language for writing a secret memo.&lt;/p&gt; &lt;p&gt;Where data is a carrier of value, its value is enhanced by it being easy to repurpose (i.e., standard vocabularies) and to discover (i.e., data set metadata). As on the web, so on the enterprise &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id0x1324ada8&quot;&gt;intranet&lt;/a&gt;. In this lies the strength of RDF as opposed to proprietary flexible database schemes. This is a qualitative distinction.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id117178a8&quot;&gt;&lt;img src=&quot;http://www.openlinksw.com/images/logos/LoDLogo.gif&quot; alt=&quot;Linking Open Data project logo&quot; /&gt; &lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;http://dbpedia.org/resource/In_hoc_signo_vinces&quot; id=&quot;link-id115f47e8&quot;&gt;&lt;i&gt;In hoc signo vinces.&lt;/i&gt; &lt;/a&gt; &lt;/p&gt; &lt;p&gt;In this light, we welcome the &lt;a href=&quot;http://semanticweb.org/wiki/VoiD&quot; id=&quot;link-id0x67cf560&quot;&gt;voiD&lt;/a&gt; (&lt;a href=&quot;http://semanticweb.org/wiki/VoiD&quot; id=&quot;link-id0x1898c908&quot;&gt;VOcabulary of Interlinked Data&lt;/a&gt;), which is the first promise of making federatable data discoverable. Now that there is a point of focus for these efforts, the needed expressivity will no doubt accrete around the voiD core.&lt;/p&gt; &lt;p&gt;For data as a service, we clearly see the value of open terminologies as prerequisites for service interchangeability, i.e., creating a marketplace. &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1588d6a8&quot;&gt;XML&lt;/a&gt; is for the transaction; RDF is for the discovery, query, and analytics. As with databases in general, first there was the transaction; then there was the query. Same here. For monetizing the query, there are models ranging from renting data sets and server capacity in the clouds to hosted services where one pays for processing past a certain quota. For the hosted case, we just removed a major barrier to offering unlimited query against unlimited data when we completed the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1374&quot; id=&quot;link-id110b8668&quot;&gt;Virtuoso Anytime&lt;/a&gt; feature. With this, the user gets what is found within a set time, which is already something, and in case of needing more, one can pay for the usage. Of course, we do not forget advertising. When data has explicit semantics, contextuality is better than with keywords.&lt;/p&gt; &lt;p&gt;For these visions to materialize on top of the linked data platform, linked data must join the world of data. This means messaging that is geared towards the database public. They know the problem, but the RDF proposition is still not well enough understood for it to connect.&lt;/p&gt; &lt;p&gt;For the relational IT world, we offer passage to the data web and its promise of integration through RDF mapping. We are also bringing out new Microsoft Entity &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id0x13a50fd8&quot;&gt;Framework&lt;/a&gt; components. This goes in the direction of defining a unified database frontier with RDF and non-RDF entity models side by side.&lt;/p&gt; &lt;p&gt;For &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x1d2ea7f0&quot;&gt;OpenLink Software&lt;/a&gt;, 2008 was about developing technology for scale, RDF as well as generic relational. We did show a tiny preview with the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x658fbc8&quot;&gt;Billion Triples Challenge&lt;/a&gt; demo. Now we are set to come out with the real thing, featuring, among other things, faceted search at the billion triple scale. We &lt;a href=&quot;http://www.openlinksw.com/blog/kidehen@openlinksw.com/blog/?id=1489&quot; id=&quot;link-id150c6090&quot;&gt;started offering ready-to-go Virtuoso-hosted linked open data sets&lt;/a&gt; on Amazon EC2 in December. Now we continue doing this based on our next-generation server, as well as make Virtuoso 6 Cluster commercially available. Technical specifics are amply discussed on this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1424ec20&quot;&gt;blog&lt;/a&gt;. There are still some new technology things to be developed this year; first among these are strong &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x14b8ca88&quot;&gt;SPARQL&lt;/a&gt; federation, and on-the-fly resizing of server clusters. On the research partnerships side, we have an EU grant for working with the OntoWiki project from the University of Leipzig, and we are partners in DERI&amp;#39;s &lt;a href=&quot;https://lion.deri.ie/&quot; id=&quot;link-id115c02f8&quot;&gt;Líon project&lt;/a&gt;. These will provide platforms for further demonstrating the &amp;quot;web&amp;quot; in data web, as in web-scale smart databasing.&lt;/p&gt; &lt;p&gt;2009 will see change through scale. The things that exist will start interconnecting and there will be emergent value. Deployments will be larger and scale will be readily available through a services model or by installation at one&amp;#39;s own facilities. We may see the start of Search becoming Find, like &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14e43050&quot;&gt;Kingsley&lt;/a&gt; says, meaning semantics of data guiding search. Entity extraction will multiply data volumes and bring parts of the data web to real time.&lt;/p&gt; &lt;p&gt;Exciting 2009 to all.&lt;/p&gt;</atom:content>
  <atom:updated>2009-01-02T13:26:42.000003-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data &amp; The Year 2009 (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2009-01-02#1510</atom:id>
  <atom:published>2009-01-02T16:17:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;As is fitting for the season, I will editorialize a bit about what has gone before and what is to come.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1119f250&quot;&gt;Sir Tim&lt;/a&gt; said it at WWW08 in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x14ab66b0&quot;&gt;Beijing&lt;/a&gt; — &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x115a4588&quot;&gt;linked data&lt;/a&gt; and the linked data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0xa5c678&quot;&gt;web&lt;/a&gt; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x7cbe5540&quot;&gt;semantic web&lt;/a&gt; and the Web done right.&lt;/p&gt; &lt;p&gt;The grail of &lt;i&gt;ad hoc&lt;/i&gt; analytics on infinite &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa4b25428&quot;&gt;data&lt;/a&gt; has lost none of its appeal. We have seen fresh evidence of this in the realm of data warehousing products, as well as storage in general.&lt;/p&gt; &lt;p&gt;The benefits of a data model more abstract than the relational are being increasingly appreciated also outside the data web circles. Microsoft&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1c3c72b0&quot;&gt;Entity&lt;/a&gt; Frameworks technology is an example. Agility has been a buzzword for a long time. Everything should be offered in a service based business model and should interoperate and integrate with everything else — business needs first; schema last.&lt;/p&gt; &lt;p&gt;Not to forget that when money is tight, reuse of existing assets and paying on a usage basis are naturally emphasized. &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xa0743bd8&quot;&gt;Information&lt;/a&gt;, as the asset it is, is none the less important, on the contrary. But even with information, value should be realized economically, which, among other things, entails not reinventing the wheel.&lt;/p&gt; &lt;p&gt;It is against this backdrop that this year will play out.&lt;/p&gt; &lt;p&gt;As concerns research, I will &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1374&quot; id=&quot;link-id1151b128&quot;&gt;again quote&lt;/a&gt; &lt;a href=&quot;http://www.ibiblio.org/hhalpin/#&quot; id=&quot;link-id141cb740&quot;&gt;Harry Halpin&lt;/a&gt; at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x28f68040&quot;&gt;ESWC 2008&lt;/a&gt;: &amp;quot;Men will fight in a war, and even lose a war, for what they believe just. And it may come to pass that later, even though the war were lost, the things then fought for will emerge under another name and establish themselves as the prevailing reality&amp;quot; [or words to this effect].&lt;/p&gt; &lt;p&gt;Something like the data web, and even the semantic web, will happen. Harry&amp;#39;s question was whether this would be the descendant of what is today called semantic web research.&lt;/p&gt; &lt;p&gt;I heard in conversation about a project for making a very large metadata store. I also heard that the makers did not particularly insist on this being &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x13c8af68&quot;&gt;RDF&lt;/a&gt;-based, though.&lt;/p&gt; &lt;p&gt;Why should such a thing be RDF-based? If it is already accepted that there will be &lt;i&gt;ad hoc&lt;/i&gt; schema and that queries ought to be able to view the data from all angles, not be limited by having indices one way and not another way, then why not RDF?&lt;/p&gt; &lt;p&gt;The justification of RDF is in reusing and linking-to data and terminology out there. Another justification is that by using an RDF store, one is spared a lot of work and tons of compromises which attend making an &lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x1ca17b20&quot;&gt;entity&lt;/a&gt;-attribute-value (&lt;a href=&quot;http://dbpedia.org/resource/Entity-attribute-value_model&quot; id=&quot;link-id0x1c9d6050&quot;&gt;EAV&lt;/a&gt;, i.e., triple) store on a generic &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x557dff0&quot;&gt;RDBMS&lt;/a&gt;. The sem-web world has been there, trust me. We came out well because we put all inside the RDBMS, lowest level, which you can&amp;#39;t do unless you own the RDBMS. Source access is not enough; you also need the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1470c748&quot;&gt;knowledge&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Technicalities aside, the question is one of proprietary vs. standards-based. This is not only so with software components, where standards have consistently demonstrated benefits, but now also with the data. &lt;a href=&quot;http://www.zemanta.com/&quot; id=&quot;link-id0x524bea0&quot;&gt;Zemanta&lt;/a&gt; and &lt;a href=&quot;http://www.opencalais.com/&quot; id=&quot;link-id0x46132d38&quot;&gt;OpenCalais&lt;/a&gt; serving &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x13624fb8&quot;&gt;DBpedia&lt;/a&gt; URIs are examples. Even in entirely closed applications, there is benefit in reusing open vocabularies and identifiers: One does not need to create a secret language for writing a secret memo.&lt;/p&gt; &lt;p&gt;Where data is a carrier of value, its value is enhanced by it being easy to repurpose (i.e., standard vocabularies) and to discover (i.e., data set metadata). As on the web, so on the enterprise &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id0xa1392eb8&quot;&gt;intranet&lt;/a&gt;. In this lies the strength of RDF as opposed to proprietary flexible database schemes. This is a qualitative distinction.&lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id117178a8&quot;&gt;&lt;img src=&quot;http://www.openlinksw.com/images/logos/LoDLogo.gif&quot; alt=&quot;Linking Open Data project logo&quot; /&gt; &lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;http://dbpedia.org/resource/In_hoc_signo_vinces&quot; id=&quot;link-id115f47e8&quot;&gt;&lt;i&gt;In hoc signo vinces.&lt;/i&gt; &lt;/a&gt; &lt;/p&gt; &lt;p&gt;In this light, we welcome the &lt;a href=&quot;http://semanticweb.org/wiki/VoiD&quot; id=&quot;link-id0x12352cc0&quot;&gt;voiD&lt;/a&gt; (&lt;a href=&quot;http://semanticweb.org/wiki/VoiD&quot; id=&quot;link-id0x722c18&quot;&gt;VOcabulary of Interlinked Data&lt;/a&gt;), which is the first promise of making federatable data discoverable. Now that there is a point of focus for these efforts, the needed expressivity will no doubt accrete around the voiD core.&lt;/p&gt; &lt;p&gt;For data as a service, we clearly see the value of open terminologies as prerequisites for service interchangeability, i.e., creating a marketplace. &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x2c21c00&quot;&gt;XML&lt;/a&gt; is for the transaction; RDF is for the discovery, query, and analytics. As with databases in general, first there was the transaction; then there was the query. Same here. For monetizing the query, there are models ranging from renting data sets and server capacity in the clouds to hosted services where one pays for processing past a certain quota. For the hosted case, we just removed a major barrier to offering unlimited query against unlimited data when we completed the &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1374&quot; id=&quot;link-id110b8668&quot;&gt;Virtuoso Anytime&lt;/a&gt; feature. With this, the user gets what is found within a set time, which is already something, and in case of needing more, one can pay for the usage. Of course, we do not forget advertising. When data has explicit semantics, contextuality is better than with keywords.&lt;/p&gt; &lt;p&gt;For these visions to materialize on top of the linked data platform, linked data must join the world of data. This means messaging that is geared towards the database public. They know the problem, but the RDF proposition is still not well enough understood for it to connect.&lt;/p&gt; &lt;p&gt;For the relational IT world, we offer passage to the data web and its promise of integration through RDF mapping. We are also bringing out new Microsoft Entity &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET_Entity_Framework&quot; id=&quot;link-id0x723080&quot;&gt;Framework&lt;/a&gt; components. This goes in the direction of defining a unified database frontier with RDF and non-RDF entity models side by side.&lt;/p&gt; &lt;p&gt;For &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id0x11e1dfc0&quot;&gt;OpenLink Software&lt;/a&gt;, 2008 was about developing technology for scale, RDF as well as generic relational. We did show a tiny preview with the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x722d08&quot;&gt;Billion Triples Challenge&lt;/a&gt; demo. Now we are set to come out with the real thing, featuring, among other things, faceted search at the billion triple scale. We &lt;a href=&quot;http://www.openlinksw.com/blog/kidehen@openlinksw.com/blog/?id=1489&quot; id=&quot;link-id150c6090&quot;&gt;started offering ready-to-go Virtuoso-hosted linked open data sets&lt;/a&gt; on Amazon EC2 in December. Now we continue doing this based on our next-generation server, as well as make Virtuoso 6 Cluster commercially available. Technical specifics are amply discussed on this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x10fc1930&quot;&gt;blog&lt;/a&gt;. There are still some new technology things to be developed this year; first among these are strong &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x7fd25590&quot;&gt;SPARQL&lt;/a&gt; federation, and on-the-fly resizing of server clusters. On the research partnerships side, we have an EU grant for working with the OntoWiki project from the University of Leipzig, and we are partners in DERI&amp;#39;s &lt;a href=&quot;https://lion.deri.ie/&quot; id=&quot;link-id115c02f8&quot;&gt;Líon project&lt;/a&gt;. These will provide platforms for further demonstrating the &amp;quot;web&amp;quot; in data web, as in web-scale smart databasing.&lt;/p&gt; &lt;p&gt;2009 will see change through scale. The things that exist will start interconnecting and there will be emergent value. Deployments will be larger and scale will be readily available through a services model or by installation at one&amp;#39;s own facilities. We may see the start of Search becoming Find, like &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14e43050&quot;&gt;Kingsley&lt;/a&gt; says, meaning semantics of data guiding search. Entity extraction will multiply data volumes and bring parts of the data web to real time.&lt;/p&gt; &lt;p&gt;Exciting 2009 to all.&lt;/p&gt;</atom:content>
  <atom:updated>2009-01-02T13:26:35-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Is Linked Data Always Relevant?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-12-29#1509</atom:id>
  <atom:published>2008-12-29T22:32:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;I pose the question above because I stumbled across an interesting claim about &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id1193b2b0&quot;&gt;OpenLink Software&lt;/a&gt; and its representatives expressed in the &lt;a href=&quot;http://www.readwriteweb.com&quot; id=&quot;link-id14e4e730&quot;&gt;ReadWriteWeb&lt;/a&gt; post titled: &lt;a href=&quot;http://www.readwriteweb.com/archives/xbrl_mashing_up_financial_statements.php&quot; id=&quot;link-id1119ecd8&quot;&gt;XBRL: Mashing Up Financial Statements&lt;/a&gt;, where the following claim is made:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;..There is evidence that they promote &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11933ec0&quot;&gt;LINKED DATA&lt;/a&gt; at any expense without understanding the rationale behind other approaches...&amp;quot;.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; To answer the question above, Linked Data is always relevant as long as we are actually talking about &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x199ba780&quot;&gt;Data&lt;/a&gt;&amp;quot; which is simply the case all of the time, irrespective of interaction medium.&lt;/p&gt; &lt;p&gt;If XBRL can be disconnected in anyway from Linked Data, I desperately would like to be enlightened (as per my comments to the post). Why wouldn&amp;#39;t anyone desire the ability to navigate the linked data inherent in any financial report? Every &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1145b868&quot;&gt;entity&lt;/a&gt; in an XBRL instance document is an entity, directly or indirectly related to other entities. Why &amp;quot;Mash&amp;quot; the data when you can harmonize XBRL data via a Generic Financial Dictionary (schema or ontology) such that descriptions of Balance Sheet, P&amp;amp;L, and other entities are navigable via their attributes and relationships? In short, why &amp;quot;Mash&amp;quot; (code based brute force joining across disparately shaped data) when you can &amp;quot;Mesh&amp;quot; (natural joining of structured data entities)?&lt;/p&gt; &lt;p&gt;&amp;quot;Linked Data&amp;quot; is about the ability to connect all our observations (data)? , perceptions (&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11b79e98&quot;&gt;information&lt;/a&gt;), and inferences / conclusions (&lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id143e0aa8&quot;&gt;knowledge&lt;/a&gt;) across a spectrum of interaction media. And it just so happens that the RDF data model (&lt;a href=&quot;http://en.wikipedia.org/wiki/Entity-Attribute-Value_model&quot; id=&quot;link-id114e68b0&quot;&gt;Entity-Attribute-Vaue&lt;/a&gt; + Class Relationships + HTTP based Object Identifiers), a range of RDF data model serialization formats, and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id115bca28&quot;&gt;SPARQL&lt;/a&gt; (Query Language and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1c1ef2c8&quot;&gt;Web&lt;/a&gt; Service combo) actually make this possible, in a manner consistent with the essence of the global space we know as the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id13dc10d8&quot;&gt;World Wide Web&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.bbc.co.uk/britainfromabove/stories/visualisations/communication.shtml&quot; id=&quot;link-id115f3858&quot;&gt;BBC&amp;#39;s Britain from Above&lt;/a&gt; (core message: Data is Everything).&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-12-31T12:57:41-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Bio2Rdf EC2 AMI is now Ready! (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-12-23#1508</atom:id>
  <atom:published>2008-12-23T15:37:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;Adding to the collection of Amazon EC2 AMI based knowledgebases already unveiled for &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIDBpediaInstall&quot; id=&quot;link-id117a3710&quot;&gt;DBpedia&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMINeuroCommonsInstall&quot; id=&quot;link-id11293c10&quot;&gt;NeuroCommons&lt;/a&gt;, we now have a &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id14ba6338&quot;&gt;Bio2Rdf&lt;/a&gt; knowledgebase AMI.&lt;/p&gt; &lt;h3&gt;What is Bio2Rdf?&lt;/h3&gt; &lt;p&gt;A community developed knowledgebase comprised of Bio Informatics &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; from across &lt;a href=&quot;http://www.freebase.com/view/user/bio2rdf/public/sparql&quot; id=&quot;link-id1468fb90&quot;&gt;30 or so public data sources&lt;/a&gt;. The standard deployment of Bio2Rdf includes a a federation of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id111962a8&quot;&gt;SPARQL&lt;/a&gt; endpoints provided by project members and collaborators.&lt;/p&gt; &lt;h3&gt;What is the Bio2Rdf EC2 AMI?&lt;/h3&gt; &lt;p&gt; An Amazon EC2 hosted variant of the Bio2Rdf knowledgebase. In addition to providing a SPARQL endpoint, the data exposed by the Amazon AMI is published in compliance with &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1560ac50&quot;&gt;Linked Data&lt;/a&gt; publishing best practices espoused by the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id153aff30&quot;&gt;Linking Open Data community&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1390d968&quot;&gt;LOD&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;Benefits?&lt;/h3&gt; &lt;p&gt;The ability to instantiate a personal or service-specific variant of this powerful knowledgebase via the Amazon EC2 Cloud. Instead of a 22+ hour error prone odyssey - you simply get down to the task of data analysis and integration within 1.5 hrs (when setting up you AMI for the first time).&lt;/p&gt; &lt;h3&gt;How do I get going?&lt;/h3&gt; Just follow the instructions in the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIBio2rdfInstall&quot; id=&quot;link-id114fc4a8&quot;&gt;Bio2Rdf EC2 AMI installation guide&lt;/a&gt;. &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://bio2rdf.wiki.sourceforge.net/&quot; id=&quot;link-id19109ed8&quot;&gt;Bio2Rdf Wiki&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://bio2rdf.wiki.sourceforge.net/Demo+queries&quot; id=&quot;link-id1134c988&quot;&gt;Sample Bio2Rdf Queries Collection&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtuosoEC2AMI&quot; id=&quot;link-id11c28e08&quot;&gt;Virtuoso&amp;#39;s Amazon Machine Image (AMI) for EC2 Home Page&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=XdBd14rjcs0&quot; id=&quot;link-id14b4a390&quot;&gt;Cloud Computing Explanation Video&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-12-24T11:05:13-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 6 FAQ directory</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-18#1507</atom:id>
  <atom:published>2008-12-18T15:46:18Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received various inquiries on high-end metadata stores. I will here go through some salient questions. The requested features include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Scaling to trillions of triples&lt;/li&gt; &lt;li&gt;Running on clusters of commodity servers&lt;/li&gt; &lt;li&gt;Running in federated environments, possibly over wide area networks&lt;/li&gt; &lt;li&gt;Built-in inference&lt;/li&gt; &lt;li&gt;Transactions&lt;/li&gt; &lt;li&gt;Security&lt;/li&gt; &lt;li&gt;Support for extra triple level metadata, such as security attributes&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Q: What is the storage cost per triple? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#StorageCostPerTriple&quot; id=&quot;link-id147f61e8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to insert a triple? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleInsertionCost&quot; id=&quot;link-id112e2488&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to delete a triple? (For the insertion itself, as well as for updating any indices) &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleDeletionCost&quot; id=&quot;link-id11728528&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to search on a given property? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PropertySearchCost&quot; id=&quot;link-id1586e360&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id14688e38&quot;&gt;data&lt;/a&gt; types are supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedDataTypes&quot; id=&quot;link-id1593dbf0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What inferencing is supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedInferencing&quot; id=&quot;link-id112f3248&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Is the inferencing dynamic or is an extra step required before inferencing can be used? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#InferencingDynamism&quot; id=&quot;link-id1477e2e0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you support &lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id1177b198&quot;&gt;full text search&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#FullTextSearchSupport&quot; id=&quot;link-id1543b170&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What programming interfaces are supported? Do you support standard &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id14bb69c0&quot;&gt;SPARQL protocol&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedProgrammingInterfaces&quot; id=&quot;link-id14d4eb18&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How can data be partitioned across multiple servers? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#MultipleServerDataPartitioning&quot; id=&quot;link-id13722e00&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many triples can a single server handle? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SingleServerTripleLimits&quot; id=&quot;link-id14046e58&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the performance impact of going from the billion to the trillion triples? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PerformanceImpactBillionToTrillion&quot; id=&quot;link-id113cfc10&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you support additional metadata for triples, such as timestamps, security tags etc? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleMetadataSupport&quot; id=&quot;link-id14c75fa8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Should we use &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id11342010&quot;&gt;RDF&lt;/a&gt; for our large metadata store? What are the alternatives? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#LargeMetadataStoreFormat&quot; id=&quot;link-id1478db38&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How multithreaded is &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1651d028&quot;&gt;Virtuoso&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#VirtuosoMultiThreading&quot; id=&quot;link-id152ad310&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can multiple servers run off a single shared disk database? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#MultipleServersOneDiskDatabase&quot; id=&quot;link-id14d9d528&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can Virtuoso run on a SAN? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#VirtuosoOnSAN&quot; id=&quot;link-id111b55d0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How does Virtuoso join across partitions? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#CrossPartitionJoins&quot; id=&quot;link-id11094db8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Does Virtuoso support federated triple stores? If there are multiple &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id19156b48&quot;&gt;SPARQL&lt;/a&gt; end points, can Virtuoso be used to do queries joining between these? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#FederatedTripleStoresAndQueries&quot; id=&quot;link-id15447ef8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many servers can a cluster contain? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ClusterServerLimit&quot; id=&quot;link-id125fe0d0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How do I reconfigure a cluster, adding and removing machines, etc? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ClusterReconfiguration&quot; id=&quot;link-id1150c448&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How will Virtuoso handle regional clusters? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#RegionalClustering&quot; id=&quot;link-id1596ca48&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Is there a mechanism for terminating long running queries? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TerminatingLongRunningQueries&quot; id=&quot;link-id116bbd60&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can the user be asynchronously notified when a long running query terminates? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AsynchNotificationOfQueryTermination&quot; id=&quot;link-id15a59a50&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many concurrent queries can Virtuoso handle? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ConcurrentQueryLimits&quot; id=&quot;link-id110a8c00&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the relative performance of SPARQL queries vs. native relational queries &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#RelativePerformanceSparqlVsSql&quot; id=&quot;link-id110914f8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Does Virtuoso support property tables? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PropertyTableSupport&quot; id=&quot;link-id1581f8c8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What performance metrics does Virtuoso offer? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PerformanceMetricSupport&quot; id=&quot;link-id14e92300&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What support do you provide for concurrency/multithreading operation? Is your interface thread-safe? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ConcurrencyAndThreadSafety&quot; id=&quot;link-id15964b80&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What level of ACID properties are supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AcidComplianceLevel&quot; id=&quot;link-id11035ac0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you provide the ability to atomically add a set of triples, where either all are added or none are added? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AtomicTripleInsertion&quot; id=&quot;link-id15290e68&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you provide the ability to add a set of triples, respecting the isolation property (so concurrent accessors either see none of the triple values, or all of them)? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#IsolationDuringInsertion&quot; id=&quot;link-id15855df0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the time to start a database, create/open a graph? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#StartupTimes&quot; id=&quot;link-id14227f40&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What sort of security features are built into Virtuoso? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#BuiltInSecurity&quot; id=&quot;link-id11927810&quot;&gt;answer&lt;/a&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-12-22T14:30:07.000004-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 6 FAQ directory</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-18#1506</atom:id>
  <atom:published>2008-12-18T15:46:18Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received various inquiries on high-end metadata stores. I will here go through some salient questions. The requested features include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Scaling to trillions of triples&lt;/li&gt; &lt;li&gt;Running on clusters of commodity servers&lt;/li&gt; &lt;li&gt;Running in federated environments, possibly over wide area networks&lt;/li&gt; &lt;li&gt;Built-in inference&lt;/li&gt; &lt;li&gt;Transactions&lt;/li&gt; &lt;li&gt;Security&lt;/li&gt; &lt;li&gt;Support for extra triple level metadata, such as security attributes&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Q: What is the storage cost per triple? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#StorageCostPerTriple&quot; id=&quot;link-id147f61e8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to insert a triple? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleInsertionCost&quot; id=&quot;link-id112e2488&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to delete a triple? (For the insertion itself, as well as for updating any indices) &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleDeletionCost&quot; id=&quot;link-id11728528&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the cost to search on a given property? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PropertySearchCost&quot; id=&quot;link-id1586e360&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id14688e38&quot;&gt;data&lt;/a&gt; types are supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedDataTypes&quot; id=&quot;link-id1593dbf0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What inferencing is supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedInferencing&quot; id=&quot;link-id112f3248&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Is the inferencing dynamic or is an extra step required before inferencing can be used? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#InferencingDynamism&quot; id=&quot;link-id1477e2e0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you support &lt;a href=&quot;http://dbpedia.org/resource/Full_text_search&quot; id=&quot;link-id1177b198&quot;&gt;full text search&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#FullTextSearchSupport&quot; id=&quot;link-id1543b170&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What programming interfaces are supported? Do you support standard &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id14bb69c0&quot;&gt;SPARQL protocol&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SupportedProgrammingInterfaces&quot; id=&quot;link-id14d4eb18&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How can data be partitioned across multiple servers? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#MultipleServerDataPartitioning&quot; id=&quot;link-id13722e00&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many triples can a single server handle? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#SingleServerTripleLimits&quot; id=&quot;link-id14046e58&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the performance impact of going from the billion to the trillion triples? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PerformanceImpactBillionToTrillion&quot; id=&quot;link-id113cfc10&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you support additional metadata for triples, such as timestamps, security tags etc? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TripleMetadataSupport&quot; id=&quot;link-id14c75fa8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Should we use &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id11342010&quot;&gt;RDF&lt;/a&gt; for our large metadata store? What are the alternatives? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#LargeMetadataStoreFormat&quot; id=&quot;link-id1478db38&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How multithreaded is &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1651d028&quot;&gt;Virtuoso&lt;/a&gt;? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#VirtuosoMultiThreading&quot; id=&quot;link-id152ad310&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can multiple servers run off a single shared disk database? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#MultipleServersOneDiskDatabase&quot; id=&quot;link-id14d9d528&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can Virtuoso run on a SAN? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#VirtuosoOnSAN&quot; id=&quot;link-id111b55d0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How does Virtuoso join across partitions? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#CrossPartitionJoins&quot; id=&quot;link-id11094db8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Does Virtuoso support federated triple stores? If there are multiple &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id19156b48&quot;&gt;SPARQL&lt;/a&gt; end points, can Virtuoso be used to do queries joining between these? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#FederatedTripleStoresAndQueries&quot; id=&quot;link-id15447ef8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many servers can a cluster contain? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ClusterServerLimit&quot; id=&quot;link-id125fe0d0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How do I reconfigure a cluster, adding and removing machines, etc? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ClusterReconfiguration&quot; id=&quot;link-id1150c448&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How will Virtuoso handle regional clusters? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#RegionalClustering&quot; id=&quot;link-id1596ca48&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Is there a mechanism for terminating long running queries? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#TerminatingLongRunningQueries&quot; id=&quot;link-id116bbd60&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Can the user be asynchronously notified when a long running query terminates? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AsynchNotificationOfQueryTermination&quot; id=&quot;link-id15a59a50&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: How many concurrent queries can Virtuoso handle? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ConcurrentQueryLimits&quot; id=&quot;link-id110a8c00&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the relative performance of SPARQL queries vs. native relational queries &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#RelativePerformanceSparqlVsSql&quot; id=&quot;link-id110914f8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Does Virtuoso support property tables? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PropertyTableSupport&quot; id=&quot;link-id1581f8c8&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What performance metrics does Virtuoso offer? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#PerformanceMetricSupport&quot; id=&quot;link-id14e92300&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What support do you provide for concurrency/multithreading operation? Is your interface thread-safe? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#ConcurrencyAndThreadSafety&quot; id=&quot;link-id15964b80&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What level of ACID properties are supported? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AcidComplianceLevel&quot; id=&quot;link-id11035ac0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you provide the ability to atomically add a set of triples, where either all are added or none are added? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#AtomicTripleInsertion&quot; id=&quot;link-id15290e68&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: Do you provide the ability to add a set of triples, respecting the isolation property (so concurrent accessors either see none of the triple values, or all of them)? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#IsolationDuringInsertion&quot; id=&quot;link-id15855df0&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What is the time to start a database, create/open a graph? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#StartupTimes&quot; id=&quot;link-id14227f40&quot;&gt;answer&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Q: What sort of security features are built into Virtuoso? &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/Virt6FAQ.html#BuiltInSecurity&quot; id=&quot;link-id11927810&quot;&gt;answer&lt;/a&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-12-22T14:30:00-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso RDF: A Getting Started Guide for the Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-17#1505</atom:id>
  <atom:published>2008-12-17T12:31:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is a long standing promise of mine to dispel the false impression that using &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id113506d0&quot;&gt;Virtuoso&lt;/a&gt; to work with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id115d9528&quot;&gt;RDF&lt;/a&gt; is complicated.&lt;/p&gt; &lt;p&gt;The purpose of this presentation is to show a programmer how to put RDF into Virtuoso and how to query it. This is done programmatically, with no confusing user interfaces.&lt;/p&gt; &lt;p&gt;You should have a Virtuoso Open Source tree built and installed. We will look at the LUBM benchmark demo that comes with the package. All you need is a Unix shell. Running the shell under emacs (&lt;code&gt;m-x shell&lt;/code&gt;) is the best. But the open source &lt;code&gt;isql&lt;/code&gt; utility should have command line editing also. The emacs shell is however convenient for cutting and pasting things between shell and files.&lt;/p&gt; &lt;p&gt;To get started, cd into &lt;code&gt;binsrc/tests/lubm&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;To verify that this works, you can do &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;./test_server.sh virtuoso-t&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This will test the server with the LUBM queries. This should report 45 tests passed. After this we will do the tests step-by-step.&lt;/p&gt; &lt;h2&gt;Loading the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10f7bd90&quot;&gt;Data&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;The file &lt;code&gt;lubm-load.sql&lt;/code&gt; contains the commands for loading the LUBM single university qualification database.&lt;/p&gt; &lt;p&gt;The data files themselves are in &lt;code&gt;lubm_8000&lt;/code&gt;, 15 files in RDFXML.&lt;/p&gt; &lt;p&gt;There is also a little ontology called &lt;code&gt;inf.nt&lt;/code&gt;. This declares the subclass and subproperty relations used in the benchmark.&lt;/p&gt; &lt;p&gt;So now let&amp;#39;s go through this procedure.&lt;/p&gt; &lt;p&gt;Start the server:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;$ virtuoso-t -f &amp;amp; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This starts the server in foreground mode, and puts it in the background of the shell.&lt;/p&gt; &lt;p&gt;Now we connect to it with the isql utility.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;$ isql 1111 dba dba &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This gives a &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt. The default username and password are both &lt;code&gt;dba&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;When a command is &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1176ce70&quot;&gt;SQL&lt;/a&gt;, it is entered directly. If it is &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id156df468&quot;&gt;SPARQL&lt;/a&gt;, it is prefixed with the keyword &lt;code&gt;sparql&lt;/code&gt;. This is how all the SQL clients work. Any SQL client, such as any &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id152d0a00&quot;&gt;ODBC&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id157ad6a0&quot;&gt;JDBC&lt;/a&gt; application, can use SPARQL if the SQL string starts with this keyword.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;lubm-load.sql&lt;/code&gt; file is quite self-explanatory. It begins with defining an SQL procedure that calls the RDF/XML load function, &lt;code&gt;DB..RDF_LOAD_RDFXML&lt;/code&gt;, for each file in a directory.&lt;/p&gt; &lt;p&gt;Next it calls this function for the &lt;code&gt;lubm_8000&lt;/code&gt; directory under the server&amp;#39;s working directory.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql CLEAR GRAPH &amp;lt;lubm&amp;gt;; sparql CLEAR GRAPH &amp;lt;inf&amp;gt;; load_lubm ( server_root() || &amp;#39;/lubm_8000/&amp;#39; ); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then it verifies that the right number of triples is found in the &amp;lt;lubm&amp;gt; graph.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT(*) FROM &amp;lt;lubm&amp;gt; WHERE { ?x ?y ?z } ; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The echo commands below this are interpreted by the isql utility, and produce output to show whether the test was passed. They can be ignored for now.&lt;/p&gt; &lt;p&gt;Then it adds some implied &lt;code&gt;subOrganizationOf&lt;/code&gt; triples. This is part of setting up the LUBM test database.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql PREFIX ub: &amp;lt;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#&amp;gt; INSERT INTO GRAPH &amp;lt;lubm&amp;gt; { ?x ub:subOrganizationOf ?z } FROM &amp;lt;lubm&amp;gt; WHERE { ?x ub:subOrganizationOf ?y . ?y ub:subOrganizationOf ?z . }; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then it loads the ontology file, &lt;code&gt;inf.nt&lt;/code&gt;, using the Turtle load function, &lt;code&gt;DB.DBA.TTLP&lt;/code&gt;. The arguments of the function are the text to load, the default namespace prefix, and the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id15835550&quot;&gt;URI&lt;/a&gt; of the target graph.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;DB.DBA.TTLP ( file_to_string ( &amp;#39;inf.nt&amp;#39; ), &amp;#39;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl&amp;#39;, &amp;#39;inf&amp;#39; ) ; sparql SELECT COUNT(*) FROM &amp;lt;inf&amp;gt; WHERE { ?x ?y ?z } ; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then we declare that the triples in the &lt;code&gt;&amp;lt;inf&amp;gt;&lt;/code&gt; graph can be used for inference at run time. To enable this, a SPARQL query will declare that it uses the &lt;code&gt;&amp;#39;inft&amp;#39;&lt;/code&gt; rule set. Otherwise this has no effect.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;rdfs_rule_set (&amp;#39;inft&amp;#39;, &amp;#39;inf&amp;#39;); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This is just a log checkpoint to finalize the work and truncate the transaction log. The server would also eventually do this in its own time.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;checkpoint; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Now we are ready for querying.&lt;/p&gt; &lt;h2&gt;Querying the Data&lt;/h2&gt; &lt;p&gt;The queries are given in 3 different versions: The first file, &lt;code&gt;lubm.sql&lt;/code&gt;, has the queries with most inference open coded as &lt;code&gt;UNIONs&lt;/code&gt;. The second file, &lt;code&gt;lubm-inf.sql&lt;/code&gt;, has the inference performed at run time using the ontology &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1109faf0&quot;&gt;information&lt;/a&gt; in the &lt;code&gt;&amp;lt;inf&amp;gt;&lt;/code&gt; graph we just loaded. The last, &lt;code&gt;lubm-phys.sql&lt;/code&gt;, relies on having the entailed triples physically present in the &lt;code&gt;&amp;lt;lubm&amp;gt;&lt;/code&gt; graph. These entailed triples are inserted by the SPARUL commands in the &lt;code&gt;lubm-cp.sql&lt;/code&gt; file.&lt;/p&gt; &lt;p&gt;If you wish to run all the commands in a SQL file, you can type &lt;code&gt;load &amp;lt;filename&amp;gt;;&lt;/code&gt; (e.g., &lt;code&gt;load lubm-cp.sql;&lt;/code&gt;) at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt. If you wish to try individual statements, you can paste them to the command line.&lt;/p&gt; &lt;p&gt;For example: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;SQL&amp;gt; sparql PREFIX ub: &amp;lt;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#&amp;gt; SELECT * FROM &amp;lt;lubm&amp;gt; WHERE { ?x a ub:Publication . ?x ub:publicationAuthor &amp;lt;http://www.Department0.University0.edu/AssistantProfessor0&amp;gt; }; VARCHAR _______________________________________________________________________ http://www.Department0.University0.edu/AssistantProfessor0/Publication0 http://www.Department0.University0.edu/AssistantProfessor0/Publication1 http://www.Department0.University0.edu/AssistantProfessor0/Publication2 http://www.Department0.University0.edu/AssistantProfessor0/Publication3 http://www.Department0.University0.edu/AssistantProfessor0/Publication4 http://www.Department0.University0.edu/AssistantProfessor0/Publication5 6 Rows. -- 4 msec. &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;To stop the server, simply type &lt;code&gt;shutdown;&lt;/code&gt; at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt.&lt;/p&gt; &lt;p&gt;If you wish to use a &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id11384668&quot;&gt;SPARQL protocol&lt;/a&gt; end point, just enable the HTTP listener. This is done by adding a stanza like —&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;[HTTPServer] ServerPort = 8421 ServerRoot = . ServerThreads = 2 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;— to the end of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file in the &lt;code&gt;lubm&lt;/code&gt; directory. Then shutdown and restart (type &lt;code&gt;shutdown;&lt;/code&gt; at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt and then &lt;code&gt;virtuoso-t -f &amp;amp;&lt;/code&gt; at the shell prompt).&lt;/p&gt; &lt;p&gt;Now you can connect to the end point with a web browser. The &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id113d02d8&quot;&gt;URL&lt;/a&gt; is &lt;code&gt;http://localhost:8421/sparql&lt;/code&gt;. Without parameters, this will show a human readable form. With parameters, this will execute SPARQL.&lt;/p&gt; &lt;p&gt;We have shown how to load and query RDF with Virtuoso using the most basic SQL tools. Next you can access RDF from, for example, &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id142d0ba0&quot;&gt;PHP&lt;/a&gt;, using the PHP ODBC interface.&lt;/p&gt; &lt;p&gt;To see how to use &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id117074f0&quot;&gt;Jena&lt;/a&gt; or &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id1103c9b0&quot;&gt;Sesame&lt;/a&gt; with Virtuoso, look at &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfnativestorageproviders.html&quot; id=&quot;link-id15488ce8&quot;&gt;Native RDF Storage Providers&lt;/a&gt;. To see how RDF data types are supported, see &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/VirtuosoDriverJDBC.html#jdbcrdf&quot; id=&quot;link-id15784a40&quot;&gt;Extension datatype for RDF&lt;/a&gt; &lt;/p&gt; &lt;p&gt;To work with large volumes of data, you must add memory to the configuration file and use the row-autocommit mode, i.e., do &lt;code&gt;log_enable (2);&lt;/code&gt; before the load command. Otherwise Virtuoso will do the entire load as a single transaction, and will run out of rollback space. See &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/&quot; id=&quot;link-id111410f0&quot;&gt;documentation&lt;/a&gt; for more.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-17T12:41:27.000006-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso RDF: A Getting Started Guide for the Developer</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-17#1504</atom:id>
  <atom:published>2008-12-17T12:31:34Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is a long standing promise of mine to dispel the false impression that using &lt;a href=&quot;http://virtuoso.openlinksw.com/&quot; id=&quot;link-id113506d0&quot;&gt;Virtuoso&lt;/a&gt; to work with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id115d9528&quot;&gt;RDF&lt;/a&gt; is complicated.&lt;/p&gt; &lt;p&gt;The purpose of this presentation is to show a programmer how to put RDF into Virtuoso and how to query it. This is done programmatically, with no confusing user interfaces.&lt;/p&gt; &lt;p&gt;You should have a Virtuoso Open Source tree built and installed. We will look at the LUBM benchmark demo that comes with the package. All you need is a Unix shell. Running the shell under emacs (&lt;code&gt;m-x shell&lt;/code&gt;) is the best. But the open source &lt;code&gt;isql&lt;/code&gt; utility should have command line editing also. The emacs shell is however convenient for cutting and pasting things between shell and files.&lt;/p&gt; &lt;p&gt;To get started, cd into &lt;code&gt;binsrc/tests/lubm&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;To verify that this works, you can do &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;./test_server.sh virtuoso-t&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This will test the server with the LUBM queries. This should report 45 tests passed. After this we will do the tests step-by-step.&lt;/p&gt; &lt;h2&gt;Loading the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10f7bd90&quot;&gt;Data&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;The file &lt;code&gt;lubm-load.sql&lt;/code&gt; contains the commands for loading the LUBM single university qualification database.&lt;/p&gt; &lt;p&gt;The data files themselves are in &lt;code&gt;lubm_8000&lt;/code&gt;, 15 files in RDFXML.&lt;/p&gt; &lt;p&gt;There is also a little ontology called &lt;code&gt;inf.nt&lt;/code&gt;. This declares the subclass and subproperty relations used in the benchmark.&lt;/p&gt; &lt;p&gt;So now let&amp;#39;s go through this procedure.&lt;/p&gt; &lt;p&gt;Start the server:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;$ virtuoso-t -f &amp;amp; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This starts the server in foreground mode, and puts it in the background of the shell.&lt;/p&gt; &lt;p&gt;Now we connect to it with the isql utility.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;$ isql 1111 dba dba &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This gives a &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt. The default username and password are both &lt;code&gt;dba&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;When a command is &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1176ce70&quot;&gt;SQL&lt;/a&gt;, it is entered directly. If it is &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id156df468&quot;&gt;SPARQL&lt;/a&gt;, it is prefixed with the keyword &lt;code&gt;sparql&lt;/code&gt;. This is how all the SQL clients work. Any SQL client, such as any &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id152d0a00&quot;&gt;ODBC&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id157ad6a0&quot;&gt;JDBC&lt;/a&gt; application, can use SPARQL if the SQL string starts with this keyword.&lt;/p&gt; &lt;p&gt;The &lt;code&gt;lubm-load.sql&lt;/code&gt; file is quite self-explanatory. It begins with defining an SQL procedure that calls the RDF/XML load function, &lt;code&gt;DB..RDF_LOAD_RDFXML&lt;/code&gt;, for each file in a directory.&lt;/p&gt; &lt;p&gt;Next it calls this function for the &lt;code&gt;lubm_8000&lt;/code&gt; directory under the server&amp;#39;s working directory.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql CLEAR GRAPH &amp;lt;lubm&amp;gt;; sparql CLEAR GRAPH &amp;lt;inf&amp;gt;; load_lubm ( server_root() || &amp;#39;/lubm_8000/&amp;#39; ); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then it verifies that the right number of triples is found in the &amp;lt;lubm&amp;gt; graph.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT(*) FROM &amp;lt;lubm&amp;gt; WHERE { ?x ?y ?z } ; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The echo commands below this are interpreted by the isql utility, and produce output to show whether the test was passed. They can be ignored for now.&lt;/p&gt; &lt;p&gt;Then it adds some implied &lt;code&gt;subOrganizationOf&lt;/code&gt; triples. This is part of setting up the LUBM test database.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql PREFIX ub: &amp;lt;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#&amp;gt; INSERT INTO GRAPH &amp;lt;lubm&amp;gt; { ?x ub:subOrganizationOf ?z } FROM &amp;lt;lubm&amp;gt; WHERE { ?x ub:subOrganizationOf ?y . ?y ub:subOrganizationOf ?z . }; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then it loads the ontology file, &lt;code&gt;inf.nt&lt;/code&gt;, using the Turtle load function, &lt;code&gt;DB.DBA.TTLP&lt;/code&gt;. The arguments of the function are the text to load, the default namespace prefix, and the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id15835550&quot;&gt;URI&lt;/a&gt; of the target graph.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;DB.DBA.TTLP ( file_to_string ( &amp;#39;inf.nt&amp;#39; ), &amp;#39;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl&amp;#39;, &amp;#39;inf&amp;#39; ) ; sparql SELECT COUNT(*) FROM &amp;lt;inf&amp;gt; WHERE { ?x ?y ?z } ; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then we declare that the triples in the &lt;code&gt;&amp;lt;inf&amp;gt;&lt;/code&gt; graph can be used for inference at run time. To enable this, a SPARQL query will declare that it uses the &lt;code&gt;&amp;#39;inft&amp;#39;&lt;/code&gt; rule set. Otherwise this has no effect.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;rdfs_rule_set (&amp;#39;inft&amp;#39;, &amp;#39;inf&amp;#39;); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;This is just a log checkpoint to finalize the work and truncate the transaction log. The server would also eventually do this in its own time.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;checkpoint; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Now we are ready for querying.&lt;/p&gt; &lt;h2&gt;Querying the Data&lt;/h2&gt; &lt;p&gt;The queries are given in 3 different versions: The first file, &lt;code&gt;lubm.sql&lt;/code&gt;, has the queries with most inference open coded as &lt;code&gt;UNIONs&lt;/code&gt;. The second file, &lt;code&gt;lubm-inf.sql&lt;/code&gt;, has the inference performed at run time using the ontology &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1109faf0&quot;&gt;information&lt;/a&gt; in the &lt;code&gt;&amp;lt;inf&amp;gt;&lt;/code&gt; graph we just loaded. The last, &lt;code&gt;lubm-phys.sql&lt;/code&gt;, relies on having the entailed triples physically present in the &lt;code&gt;&amp;lt;lubm&amp;gt;&lt;/code&gt; graph. These entailed triples are inserted by the SPARUL commands in the &lt;code&gt;lubm-cp.sql&lt;/code&gt; file.&lt;/p&gt; &lt;p&gt;If you wish to run all the commands in a SQL file, you can type &lt;code&gt;load &amp;lt;filename&amp;gt;;&lt;/code&gt; (e.g., &lt;code&gt;load lubm-cp.sql;&lt;/code&gt;) at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt. If you wish to try individual statements, you can paste them to the command line.&lt;/p&gt; &lt;p&gt;For example: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;SQL&amp;gt; sparql PREFIX ub: &amp;lt;http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#&amp;gt; SELECT * FROM &amp;lt;lubm&amp;gt; WHERE { ?x a ub:Publication . ?x ub:publicationAuthor &amp;lt;http://www.Department0.University0.edu/AssistantProfessor0&amp;gt; }; VARCHAR _______________________________________________________________________ http://www.Department0.University0.edu/AssistantProfessor0/Publication0 http://www.Department0.University0.edu/AssistantProfessor0/Publication1 http://www.Department0.University0.edu/AssistantProfessor0/Publication2 http://www.Department0.University0.edu/AssistantProfessor0/Publication3 http://www.Department0.University0.edu/AssistantProfessor0/Publication4 http://www.Department0.University0.edu/AssistantProfessor0/Publication5 6 Rows. -- 4 msec. &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;To stop the server, simply type &lt;code&gt;shutdown;&lt;/code&gt; at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt.&lt;/p&gt; &lt;p&gt;If you wish to use a &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id11384668&quot;&gt;SPARQL protocol&lt;/a&gt; end point, just enable the HTTP listener. This is done by adding a stanza like —&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;[HTTPServer] ServerPort = 8421 ServerRoot = . ServerThreads = 2 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;— to the end of the &lt;code&gt;virtuoso.ini&lt;/code&gt; file in the &lt;code&gt;lubm&lt;/code&gt; directory. Then shutdown and restart (type &lt;code&gt;shutdown;&lt;/code&gt; at the &lt;code&gt;SQL&amp;gt;&lt;/code&gt; prompt and then &lt;code&gt;virtuoso-t -f &amp;amp;&lt;/code&gt; at the shell prompt).&lt;/p&gt; &lt;p&gt;Now you can connect to the end point with a web browser. The &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id113d02d8&quot;&gt;URL&lt;/a&gt; is &lt;code&gt;http://localhost:8421/sparql&lt;/code&gt;. Without parameters, this will show a human readable form. With parameters, this will execute SPARQL.&lt;/p&gt; &lt;p&gt;We have shown how to load and query RDF with Virtuoso using the most basic SQL tools. Next you can access RDF from, for example, &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id142d0ba0&quot;&gt;PHP&lt;/a&gt;, using the PHP ODBC interface.&lt;/p&gt; &lt;p&gt;To see how to use &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id117074f0&quot;&gt;Jena&lt;/a&gt; or &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id1103c9b0&quot;&gt;Sesame&lt;/a&gt; with Virtuoso, look at &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/rdfnativestorageproviders.html&quot; id=&quot;link-id15488ce8&quot;&gt;Native RDF Storage Providers&lt;/a&gt;. To see how RDF data types are supported, see &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/VirtuosoDriverJDBC.html#jdbcrdf&quot; id=&quot;link-id15784a40&quot;&gt;Extension datatype for RDF&lt;/a&gt; &lt;/p&gt; &lt;p&gt;To work with large volumes of data, you must add memory to the configuration file and use the row-autocommit mode, i.e., do &lt;code&gt;log_enable (2);&lt;/code&gt; before the load command. Otherwise Virtuoso will do the entire load as a single transaction, and will run out of rollback space. See &lt;a href=&quot;http://docs.openlinksw.com/virtuoso/&quot; id=&quot;link-id111410f0&quot;&gt;documentation&lt;/a&gt; for more.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-17T12:41:21.000001-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>See the Lite: Embeddable/Background Virtuoso starts at 25MB</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-17#1503</atom:id>
  <atom:published>2008-12-17T09:34:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received many requests for an embeddable-scale &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1cd69650&quot;&gt;Virtuoso&lt;/a&gt;. In response to this, we have added a Lite mode, where the initial size of a server process is a tiny fraction of what the initial size would be with default settings. With 2MB of disk cache buffers (ini file setting, &lt;code&gt;NumberOfBuffers = 256&lt;/code&gt;), the process size stays under 30MB on 32-bit Linux.&lt;/p&gt; &lt;p&gt;The value of this is that one can now have &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ce89340&quot;&gt;RDF&lt;/a&gt; and full text indexing on the desktop without running a Java VM or any other memory-intensive software. And of course, all of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1cfc9288&quot;&gt;SQL&lt;/a&gt; (transactions, stored procedures, etc.) is in the same embeddably-sized container.&lt;/p&gt; &lt;p&gt;The Lite executable is a full Virtuoso executable; the Lite mode is controlled by a switch in the configuration file. The executable size is about 10MB for 32-bit Linux. A database created in the Lite mode will be converted into a fully-featured database (tables and indexes are added, among other things) if the server is started with the Lite setting &amp;quot;off&amp;quot;; functionality can be reverted to Lite mode, though it will now consume somewhat more memory, etc.&lt;/p&gt; &lt;p&gt;Lite mode offers full SQL and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1c511da8&quot;&gt;SPARQL&lt;/a&gt;/SPARUL (via SPASQL), but disables all &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1dac1950&quot;&gt;HTTP&lt;/a&gt;-based services (WebDAV, application hosting, etc.). Clients can still use all typical database access mechanisms (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0xb19a488&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1d93ee40&quot;&gt;JDBC&lt;/a&gt;, OLE-DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id0x1ce391c0&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0xacf1168&quot;&gt;NET&lt;/a&gt;, and XMLA) to connect, including the &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0xaaf5b58&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x1b1e4328&quot;&gt;Sesame&lt;/a&gt; frameworks for RDF. ODBC now offers full support of RDF &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1cfc9f78&quot;&gt;data&lt;/a&gt; types for &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0xa6059d8&quot;&gt;C&lt;/a&gt;-based clients. A Redland-compatible API also exists, for use with Redland v1.0.8 and later. &lt;/p&gt; &lt;p&gt;Especially for embedded use, we now allow restricting the listener to be a Unix socket, which allows client connections only from the localhost.&lt;/p&gt; &lt;p&gt;Shipping an embedded Virtuoso is easy. It just takes one executable and one configuration file. Performance is generally comparable to &amp;quot;normal&amp;quot; mode, except that Lite will be somewhat less scalable on multicore systems.&lt;/p&gt; &lt;p&gt;The Lite mode will be included in the next Virtuoso 5 Open Source release.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-17T12:03:49-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>See the Lite: Embeddable/Background Virtuoso starts at 25MB</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-17#1502</atom:id>
  <atom:published>2008-12-17T09:34:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have received many requests for an embeddable-scale &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa5aa1b38&quot;&gt;Virtuoso&lt;/a&gt;. In response to this, we have added a Lite mode, where the initial size of a server process is a tiny fraction of what the initial size would be with default settings. With 2MB of disk cache buffers (ini file setting, &lt;code&gt;NumberOfBuffers = 256&lt;/code&gt;), the process size stays under 30MB on 32-bit Linux.&lt;/p&gt; &lt;p&gt;The value of this is that one can now have &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1db79ac8&quot;&gt;RDF&lt;/a&gt; and full text indexing on the desktop without running a Java VM or any other memory-intensive software. And of course, all of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xa923298&quot;&gt;SQL&lt;/a&gt; (transactions, stored procedures, etc.) is in the same embeddably-sized container.&lt;/p&gt; &lt;p&gt;The Lite executable is a full Virtuoso executable; the Lite mode is controlled by a switch in the configuration file. The executable size is about 10MB for 32-bit Linux. A database created in the Lite mode will be converted into a fully-featured database (tables and indexes are added, among other things) if the server is started with the Lite setting &amp;quot;off&amp;quot;; functionality can be reverted to Lite mode, though it will now consume somewhat more memory, etc.&lt;/p&gt; &lt;p&gt;Lite mode offers full SQL and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1b388830&quot;&gt;SPARQL&lt;/a&gt;/SPARUL (via SPASQL), but disables all &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1d56b618&quot;&gt;HTTP&lt;/a&gt;-based services (WebDAV, application hosting, etc.). Clients can still use all typical database access mechanisms (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x1c5abc38&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1dade1f8&quot;&gt;JDBC&lt;/a&gt;, OLE-DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id0x25d8e0f0&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x1d7a1a28&quot;&gt;NET&lt;/a&gt;, and XMLA) to connect, including the &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x1d929b98&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x1b7a9088&quot;&gt;Sesame&lt;/a&gt; frameworks for RDF. ODBC now offers full support of RDF &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xaf62aa0&quot;&gt;data&lt;/a&gt; types for &lt;a href=&quot;http://dbpedia.org/resource/C%2B%2B&quot; id=&quot;link-id0xa8784b0&quot;&gt;C&lt;/a&gt;-based clients. A Redland-compatible API also exists, for use with Redland v1.0.8 and later. &lt;/p&gt; &lt;p&gt;Especially for embedded use, we now allow restricting the listener to be a Unix socket, which allows client connections only from the localhost.&lt;/p&gt; &lt;p&gt;Shipping an embedded Virtuoso is easy. It just takes one executable and one configuration file. Performance is generally comparable to &amp;quot;normal&amp;quot; mode, except that Lite will be somewhat less scalable on multicore systems.&lt;/p&gt; &lt;p&gt;The Lite mode will be included in the next Virtuoso 5 Open Source release.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-17T12:03:43-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL and Scalable Inference on Demand paper</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-16#1501</atom:id>
  <atom:published>2008-12-16T19:00:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently submitted a paper, &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/scalable_inference.pdf&quot; id=&quot;link-id115e1618&quot;&gt;SPARQL and Scalable Inference on Demand&lt;/a&gt;&lt;/i&gt;, for next year&amp;#39;s European &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id14c7cf60&quot;&gt;Semantic Web&lt;/a&gt; Conference, &lt;a href=&quot;http://www.eswc2009.org/&quot; id=&quot;link-id115004c8&quot;&gt;ESWC 2009&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-16T16:11:48.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL and Scalable Inference on Demand paper</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-16#1500</atom:id>
  <atom:published>2008-12-16T19:00:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;We recently submitted a paper, &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/scalable_inference.pdf&quot; id=&quot;link-id115e1618&quot;&gt;SPARQL and Scalable Inference on Demand&lt;/a&gt;&lt;/i&gt;, for next year&amp;#39;s European &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id14c7cf60&quot;&gt;Semantic Web&lt;/a&gt; Conference, &lt;a href=&quot;http://www.eswc2009.org/&quot; id=&quot;link-id115004c8&quot;&gt;ESWC 2009&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-16T16:11:42.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>&quot;E Pluribus Unum&quot;, or &quot;Inversely Functional Identity&quot;, or &quot;Smooshing Without the Stickiness&quot; (re-updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-16#1499</atom:id>
  <atom:published>2008-12-16T14:14:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;What a terrible word, smooshing... I have understood it to mean that when you have two names for one thing, you give each all the attributes of the other. This smooshes them together, makes them interchangeable.&lt;/p&gt; &lt;p&gt;This is complex, so I will begin with the point and the interested may read on for the details and implications. Starting with soon to be released version 6, &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id15718cb8&quot;&gt;Virtuoso&lt;/a&gt; allows you to say that two things, if they share a uniquely identifying property, are the same. Examples of uniquely identifying properties would be a book&amp;#39;s ISBN number, or a person&amp;#39;s social security plus full name. In relational language this is a &lt;i&gt;unique key&lt;/i&gt;, and in &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id145ed998&quot;&gt;RDF&lt;/a&gt; parlance, an &lt;i&gt;inverse functional property&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;In most systems, such problems are dealt with as a preprocessing step before querying. For example, all the items that are considered the same will get the same properties or at load time all identifiers will be normalized according to some application rules. This is good if the rules are clear and understood. This is so in closed situations, where things tend to have standard identifiers to begin with. But on the open web this is not so clear cut.&lt;/p&gt; &lt;p&gt;In this post, we show how to do these things &lt;i&gt;ad hoc&lt;/i&gt;, without materializing anything. At the end, we also show how to materialize identity and what the consequences of this are with open web &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id11726358&quot;&gt;data&lt;/a&gt;. We use real live web crawls from the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id14f40448&quot;&gt;Billion Triples Challenge&lt;/a&gt; data set.&lt;/p&gt; &lt;p&gt;On the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id156e2b10&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1106ce08&quot;&gt;web&lt;/a&gt;, there are independently arising descriptions of the same thing and thus arises the need to smoosh, if these are to be somehow integrated. But this is only the beginning of the problems.&lt;/p&gt; &lt;p&gt;To address these, we have added the option of specifying that some property will be considered inversely functional in a query. This is done at run time and the property does not really have to be inversely functional in the pure sense. &lt;code&gt;foaf:name&lt;/code&gt; will do for an example. This simply means that for purposes of the query concerned, two subjects which have at least one &lt;code&gt;foaf:name&lt;/code&gt; in common are considered the same. In this way, we can join between FOAF files. With the same database, a query about music preferences might consider having the same name as &amp;quot;same enough,&amp;quot; but a query about criminal prosecution would obviously need to be more precise about sameness.&lt;/p&gt; &lt;p&gt;Our ontology is defined like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- Populate a named graph with the triples you want to use in query time inferencing&lt;br /&gt; ttlp ( &amp;#39; @prefix foaf: &amp;lt;xmlns=&amp;quot;http&amp;quot; xmlns.com=&amp;quot;xmlns.com&amp;quot; foaf=&amp;quot;foaf&amp;quot;&amp;gt; &amp;lt;/&amp;gt; @prefix owl: &amp;lt;xmlns=&amp;quot;http&amp;quot; www.w3.org=&amp;quot;www.w3.org&amp;quot; owl=&amp;quot;owl&amp;quot;&amp;gt; &amp;lt;/&amp;gt; foaf:mbox_sha1sum a owl:InverseFunctionalProperty . foaf:name a owl:InverseFunctionalProperty . &amp;#39;, &amp;#39;xx&amp;#39;, &amp;#39;b3sifp&amp;#39; );&lt;br /&gt; -- Declare that the graph contains an ontology for use in query time inferencing &lt;br /&gt; rdfs_rule_set ( &amp;#39;http://example.com/rules/b3sifp#&amp;#39;, &amp;#39;b3sifp&amp;#39; ); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then use it:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql DEFINE input:inference &amp;quot;http://example.com/rules/b3sifp#&amp;quot; SELECT DISTINCT ?k ?f1 ?f2 WHERE { ?k foaf:name ?n . ?n bif:contains &amp;quot;&amp;#39;Kjetil Kjernsmo&amp;#39;&amp;quot; . ?k foaf:knows ?f1 . ?f1 foaf:knows ?f2 };&lt;br /&gt; VARCHAR VARCHAR VARCHAR ______________________________________ _______________________________________________ ______________________________&lt;br /&gt; http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/dajobe http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/net_twitter http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/amyvdh http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/pom http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/mattb http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/davorg http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/distobj http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/perigrin .... &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Without the inference, we get no matches. This is because the data in question has one graph per FOAF file, and blank nodes for persons. No graph references any person outside the ones in the graph. So if somebody is mentioned as known, then without the inference there is no way to get to what that person&amp;#39;s FOAF file says, since the same individual will be a different blank node there. The declaration in the context named &lt;code&gt;b3sifp&lt;/code&gt; just means that all things with a matching &lt;code&gt;foaf:name&lt;/code&gt; or &lt;code&gt;foaf:mbox_sha1sum&lt;/code&gt; are the same.&lt;/p&gt; &lt;p&gt;Sameness means that two are the same for purposes of &lt;code&gt;DISTINCT&lt;/code&gt; or &lt;code&gt;GROUP BY&lt;/code&gt;, and if two are the same, then both have the &lt;code&gt;UNION&lt;/code&gt; of all of the properties of both.&lt;/p&gt; &lt;p&gt;If this were a naive smoosh, then the individuals would have all the same properties but would not be the same for &lt;code&gt;DISTINCT&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;If we have complex application rules for determining whether individuals are the same, then one can materialize &lt;code&gt;owl:sameAs&lt;/code&gt; triples and keep them in a separate graph. In this way, the original data is not contaminated and the materialized volume stays reasonable — nothing like the blow-up of duplicating properties across instances.&lt;/p&gt; &lt;p&gt;The pro-smoosh argument is that if every duplicate makes exactly the same statements, then there is no great blow-up. Best and worst cases will always depend on the data. In rough terms, the more &lt;i&gt;ad hoc&lt;/i&gt; the use, the less desirable the materialization. If the usage pattern is really set, then a relational-style application-specific representation with identity resolved at load time will perform best. We can do that too, but so can others.&lt;/p&gt; &lt;p&gt;The principal point is about agility as concerns the inference. Run time is more agile than materialization, and if the rules change or if different users have different needs, then materialization runs into trouble. When talking web scale, having multiple users is a given; it is very uneconomical to give everybody their own copy, and the likelihood of a user accessing any significant part of the corpus is minimal. Even if the queries were not limited, the user would typically not wait for the answer of a query doing a scan or aggregation over 1 billion &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id1156a550&quot;&gt;blog&lt;/a&gt; posts or something of the sort. So queries will typically be selective. Selective means that they do not access all of the data, hence do not benefit from ready-made materialization for things they do not even look at. &lt;/p&gt; &lt;p&gt;The exception is corpus-wide statistics queries. But these will not be done in interactive time anyway, and will not be done very often. Plus, since these do not typically run all in memory, these are disk bound. And when things are disk bound, size matters. Reading extra entailment on the way is just a performance penalty.&lt;/p&gt; &lt;p&gt;Enough talk. Time for an experiment. We take the Yahoo and Falcon web crawls from the Billion Triples Challenge set, and do two things with the FOAF data in them:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Resolve identity at insert time. We remove duplicate person URIs, and give the single &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id11317008&quot;&gt;URI&lt;/a&gt; all the properties of all the duplicate URIs. We expect these to be most often repeats. If a person references another person, we normalize this reference to go to the single URI of the referenced person.&lt;/li&gt; &lt;li&gt;Give every duplicate URI of a person all the properties of all the duplicates. If these are the same value, the data should not get much bigger, or so we think.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;For the experiment, we will consider two people the same if they have the same &lt;code&gt;foaf:name&lt;/code&gt; and are both instances of &lt;code&gt;foaf:Person&lt;/code&gt;. This gets some extra hits but should not be statistically significant.&lt;/p&gt; &lt;p&gt;The following is a commented &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id110945b0&quot;&gt;SQL&lt;/a&gt; script performing the smoosh. We play with internal IDs of things, thus some of these operations cannot be done in SPARQL alone. We use SPARQL where possible for readability. As the documentation states, &lt;code&gt;iri_to_id&lt;/code&gt; converts from the qualified name of an IRI to its ID and &lt;code&gt;id_to_iri&lt;/code&gt; does the reverse.&lt;/p&gt; &lt;p&gt;We count the triples that enter into the smoosh:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- the name is an existence because else we&amp;#39;d get several times more due to -- the names occurring in many graphs &lt;br /&gt; sparql SELECT COUNT(*) WHERE { { SELECT DISTINCT ?person WHERE { ?person a foaf:Person } } . FILTER ( bif:exists ( SELECT (1) WHERE { ?person foaf:name ?nn } ) ) . ?person ?p ?o };&lt;br /&gt; -- We get 3284674 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We make a few tables for intermediate results.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- For each distinct name, gather the properties and objects from -- all subjects with this name &lt;br /&gt; CREATE TABLE name_prop ( np_name ANY, np_p IRI_ID_8, np_o ANY, PRIMARY KEY ( np_name, np_p, np_o ) ); ALTER INDEX name_prop ON name_prop PARTITION ( np_name VARCHAR (-1, 0hexffff) );&lt;br /&gt; -- Map from name to canonical IRI used for the name &lt;br /&gt; CREATE TABLE name_iri ( ni_name ANY PRIMARY KEY, ni_s IRI_ID_8 ); ALTER INDEX name_iri ON name_iri PARTITION ( ni_name VARCHAR (-1, 0hexffff) );&lt;br /&gt; -- Map from person IRI to canonical person IRI&lt;br /&gt; CREATE TABLE pref_iri ( i IRI_ID_8, pref IRI_ID_8, PRIMARY KEY ( i ) ); ALTER INDEX pref_iri ON pref_iri PARTITION ( i INT (0hexffff00) );&lt;br /&gt; -- a table for the materialization where all aliases get all properties of every other &lt;br /&gt; CREATE TABLE smoosh_ct ( s IRI_ID_8, p IRI_ID_8, o ANY, PRIMARY KEY ( s, p, o ) ); ALTER INDEX smoosh_ct ON smoosh_ct PARTITION ( s INT (0hexffff00) );&lt;br /&gt; -- disable transaction log and enable row auto-commit. This is necessary, otherwise -- bulk operations are done transactionally and they will run out of rollback space.&lt;br /&gt; LOG_ENABLE (2);&lt;br /&gt; -- Gather all the properties of all persons with a name under that name. -- INSERT SOFT means that duplicates are ignored &lt;br /&gt; INSERT SOFT name_prop SELECT &amp;quot;n&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;o&amp;quot; FROM ( sparql DEFINE output:valmode &amp;quot;LONG&amp;quot; SELECT ?n ?p ?o WHERE { ?x a foaf:Person . ?x foaf:name ?n . ?x ?p ?o } ) xx ;&lt;br /&gt; -- Now choose for each name the canonical IRI &lt;br /&gt; INSERT INTO name_iri SELECT np_name, ( SELECT MIN (s) FROM rdf_quad WHERE o = np_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ) AS mini FROM name_prop WHERE np_p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- For each person IRI, map to the canonical IRI of that person &lt;br /&gt; INSERT SOFT pref_iri (i, pref) SELECT s, ni_s FROM name_iri, rdf_quad WHERE o = ni_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- Make a graph where all persons have one iri with all the properties of all aliases -- and where person-to-person refs are canonicalized&lt;br /&gt; INSERT SOFT rdf_quad (g,s,p,o) SELECT IRI_TO_ID (&amp;#39;psmoosh&amp;#39;), ni_s, np_p, COALESCE ( ( SELECT pref FROM pref_iri WHERE i = np_o ), np_o ) FROM name_prop, name_iri WHERE ni_name = np_name OPTION ( loop, quietcast ) ;&lt;br /&gt; -- A little explanation: The properties of names are copied into rdf_quad with the name -- replaced with its canonical IRI. If the object has a canonical IRI, this is used as -- the object, else the object is unmodified. This is the COALESCE with the sub-query.&lt;br /&gt; -- This takes a little time. To check on the progress, take another connection to the -- server and do &lt;br /&gt; STATUS (&amp;#39;cluster&amp;#39;);&lt;br /&gt; -- It will return something like -- Cluster 4 nodes, 35 s. 108 m/s 1001 KB/s 75% cpu 186% read 12% clw threads 5r 0w 0i -- buffers 549481 253929 d 8 w 0 pfs&lt;br /&gt; -- Now finalize the state; this makes it permanent. Else the work will be lost on server -- failure, since there was no transaction log &lt;br /&gt; CL_EXEC (&amp;#39;checkpoint&amp;#39;);&lt;br /&gt; -- See what we got&lt;br /&gt; sparql SELECT COUNT (*) FROM &amp;lt;psmoosh&amp;gt; WHERE {?s ?p ?o};&lt;br /&gt; -- This is 2253102&lt;br /&gt; -- Now make the copy where all have the properties of all synonyms. This takes so much -- space we do not insert it as RDF quads, but make a special table for it so that we can -- run some statistics. This saves time.&lt;br /&gt; INSERT SOFT smoosh_ct (s, p, o) SELECT s, np_p, np_o FROM name_prop, rdf_quad WHERE o = np_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- as above, INSERT SOFT so as to ignore duplicates &lt;br /&gt; SELECT COUNT (*) FROM smoosh_ct;&lt;br /&gt; -- This is 167360324&lt;br /&gt; -- Find out where the bloat comes from &lt;br /&gt; SELECT TOP 20 COUNT (*), ID_TO_IRI (p) FROM smoosh_ct GROUP BY p ORDER BY 1 DESC; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The results are:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;54728777 http://www.w3.org/2002/07/owl#sameAs 48543153 http://xmlns.com/foaf/0.1/knows 13930234 http://www.w3.org/2000/01/rdf-schema#seeAlso 12268512 http://xmlns.com/foaf/0.1/interest 11415867 http://xmlns.com/foaf/0.1/nick 6683963 http://xmlns.com/foaf/0.1/weblog 6650093 http://xmlns.com/foaf/0.1/depiction 4231946 http://xmlns.com/foaf/0.1/mbox_sha1sum 4129629 http://xmlns.com/foaf/0.1/homepage 1776555 http://xmlns.com/foaf/0.1/holdsAccount 1219525 http://xmlns.com/foaf/0.1/based_near 305522 http://www.w3.org/1999/02/22-rdf-syntax-ns#type 274965 http://xmlns.com/foaf/0.1/name 155131 http://xmlns.com/foaf/0.1/dateOfBirth 153001 http://xmlns.com/foaf/0.1/img 111130 http://www.w3.org/2001/vcard-rdf/3.0#ADR 52930 http://xmlns.com/foaf/0.1/gender 48517 http://www.w3.org/2004/02/skos/core#subject 45697 http://www.w3.org/2000/01/rdf-schema#label 44860 http://purl.org/vocab/bio/0.1/olb &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Now compare with the predicate distribution of the smoosh with identities canonicalized &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT (*) ?p FROM &amp;lt;psmoosh&amp;gt; WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY 1 DESC LIMIT 20;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Results are:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;748311 http://xmlns.com/foaf/0.1/knows 548391 http://xmlns.com/foaf/0.1/interest 140531 http://www.w3.org/2000/01/rdf-schema#seeAlso 105273 http://www.w3.org/1999/02/22-rdf-syntax-ns#type 78497 http://xmlns.com/foaf/0.1/name 48099 http://www.w3.org/2004/02/skos/core#subject 45179 http://xmlns.com/foaf/0.1/depiction 40229 http://www.w3.org/2000/01/rdf-schema#comment 38272 http://www.w3.org/2000/01/rdf-schema#label 37378 http://xmlns.com/foaf/0.1/nick 37186 http://dbpedia.org/property/abstract 34003 http://xmlns.com/foaf/0.1/img 26182 http://xmlns.com/foaf/0.1/homepage 23795 http://www.w3.org/2002/07/owl#sameAs 17651 http://xmlns.com/foaf/0.1/mbox_sha1sum 17430 http://xmlns.com/foaf/0.1/dateOfBirth 15586 http://xmlns.com/foaf/0.1/page 12869 http://dbpedia.org/property/reference 12497 http://xmlns.com/foaf/0.1/weblog 12329 http://blogs.yandex.ru/schema/foaf/school &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We can drop the &lt;code&gt;owl:sameAs&lt;/code&gt; triples from the count, so the bloat is a bit less by that but it still is tens of times larger than the canonicalized copy or the initial state.&lt;/p&gt; &lt;p&gt;Now, when we try using the psmoosh graph, we still get different results from the results with the original data. This is because &lt;code&gt;foaf:knows&lt;/code&gt; relations to things with no &lt;code&gt;foaf:name&lt;/code&gt; are not represented in the smoosh. The exist:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT (*) WHERE { ?s foaf:knows ?thing . FILTER ( !bif:exists ( SELECT (1) WHERE { ?thing foaf:name ?nn } ) ) };&lt;br /&gt; -- 1393940 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;So the smoosh graph is not an accurate rendition of the social network. It would have to be smooshed further to be that, since the data in the sample is quite irregular. But we do not go that far here.&lt;/p&gt; &lt;p&gt;Finally, we calculate the smoosh blow up factors. We do not include &lt;code&gt;owl:sameAs&lt;/code&gt; triples in the counts.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;select (167360324 - 54728777) / 3284674.0; 34.290022997716059&lt;br /&gt; select 2229307 / 3284674.0; = 0.678699621332284 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;So, to get a smoosh that is not really the equivalent of the original, either multiply the original triple count by 34 or 0.68, depending on whether synonyms are collapsed or not.&lt;/p&gt; &lt;p&gt;Making the smooshes does not take very long, some minutes for the small one. Inserting the big one would be longer, a couple of hours maybe. It was 33 minutes for filling the &lt;code&gt;smoosh_ct&lt;/code&gt; table. The metrics were not with optimal tuning so the performance numbers just serve to show that smooshing takes time. Probably more time than allowable in an interactive situation, no matter how the process is optimized.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-16T15:01:36.000003-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>&quot;E Pluribus Unum&quot;, or &quot;Inversely Functional Identity&quot;, or &quot;Smooshing Without the Stickiness&quot; (re-updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-16#1498</atom:id>
  <atom:published>2008-12-16T14:14:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;What a terrible word, smooshing... I have understood it to mean that when you have two names for one thing, you give each all the attributes of the other. This smooshes them together, makes them interchangeable.&lt;/p&gt; &lt;p&gt;This is complex, so I will begin with the point and the interested may read on for the details and implications. Starting with soon to be released version 6, &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id15718cb8&quot;&gt;Virtuoso&lt;/a&gt; allows you to say that two things, if they share a uniquely identifying property, are the same. Examples of uniquely identifying properties would be a book&amp;#39;s ISBN number, or a person&amp;#39;s social security plus full name. In relational language this is a &lt;i&gt;unique key&lt;/i&gt;, and in &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id145ed998&quot;&gt;RDF&lt;/a&gt; parlance, an &lt;i&gt;inverse functional property&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;In most systems, such problems are dealt with as a preprocessing step before querying. For example, all the items that are considered the same will get the same properties or at load time all identifiers will be normalized according to some application rules. This is good if the rules are clear and understood. This is so in closed situations, where things tend to have standard identifiers to begin with. But on the open web this is not so clear cut.&lt;/p&gt; &lt;p&gt;In this post, we show how to do these things &lt;i&gt;ad hoc&lt;/i&gt;, without materializing anything. At the end, we also show how to materialize identity and what the consequences of this are with open web &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id11726358&quot;&gt;data&lt;/a&gt;. We use real live web crawls from the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id14f40448&quot;&gt;Billion Triples Challenge&lt;/a&gt; data set.&lt;/p&gt; &lt;p&gt;On the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id156e2b10&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1106ce08&quot;&gt;web&lt;/a&gt;, there are independently arising descriptions of the same thing and thus arises the need to smoosh, if these are to be somehow integrated. But this is only the beginning of the problems.&lt;/p&gt; &lt;p&gt;To address these, we have added the option of specifying that some property will be considered inversely functional in a query. This is done at run time and the property does not really have to be inversely functional in the pure sense. &lt;code&gt;foaf:name&lt;/code&gt; will do for an example. This simply means that for purposes of the query concerned, two subjects which have at least one &lt;code&gt;foaf:name&lt;/code&gt; in common are considered the same. In this way, we can join between FOAF files. With the same database, a query about music preferences might consider having the same name as &amp;quot;same enough,&amp;quot; but a query about criminal prosecution would obviously need to be more precise about sameness.&lt;/p&gt; &lt;p&gt;Our ontology is defined like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- Populate a named graph with the triples you want to use in query time inferencing&lt;br /&gt; ttlp ( &amp;#39; @prefix foaf: &amp;lt;xmlns=&amp;quot;http&amp;quot; xmlns.com=&amp;quot;xmlns.com&amp;quot; foaf=&amp;quot;foaf&amp;quot;&amp;gt; &amp;lt;/&amp;gt; @prefix owl: &amp;lt;xmlns=&amp;quot;http&amp;quot; www.w3.org=&amp;quot;www.w3.org&amp;quot; owl=&amp;quot;owl&amp;quot;&amp;gt; &amp;lt;/&amp;gt; foaf:mbox_sha1sum a owl:InverseFunctionalProperty . foaf:name a owl:InverseFunctionalProperty . &amp;#39;, &amp;#39;xx&amp;#39;, &amp;#39;b3sifp&amp;#39; );&lt;br /&gt; -- Declare that the graph contains an ontology for use in query time inferencing &lt;br /&gt; rdfs_rule_set ( &amp;#39;http://example.com/rules/b3sifp#&amp;#39;, &amp;#39;b3sifp&amp;#39; ); &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Then use it:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql DEFINE input:inference &amp;quot;http://example.com/rules/b3sifp#&amp;quot; SELECT DISTINCT ?k ?f1 ?f2 WHERE { ?k foaf:name ?n . ?n bif:contains &amp;quot;&amp;#39;Kjetil Kjernsmo&amp;#39;&amp;quot; . ?k foaf:knows ?f1 . ?f1 foaf:knows ?f2 };&lt;br /&gt; VARCHAR VARCHAR VARCHAR ______________________________________ _______________________________________________ ______________________________&lt;br /&gt; http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/dajobe http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/net_twitter http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/amyvdh http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/pom http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/mattb http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/davorg http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/distobj http://www.kjetil.kjernsmo.net/foaf#me http://norman.walsh.name/knows/who/robin-berjon http://twitter.com/perigrin .... &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Without the inference, we get no matches. This is because the data in question has one graph per FOAF file, and blank nodes for persons. No graph references any person outside the ones in the graph. So if somebody is mentioned as known, then without the inference there is no way to get to what that person&amp;#39;s FOAF file says, since the same individual will be a different blank node there. The declaration in the context named &lt;code&gt;b3sifp&lt;/code&gt; just means that all things with a matching &lt;code&gt;foaf:name&lt;/code&gt; or &lt;code&gt;foaf:mbox_sha1sum&lt;/code&gt; are the same.&lt;/p&gt; &lt;p&gt;Sameness means that two are the same for purposes of &lt;code&gt;DISTINCT&lt;/code&gt; or &lt;code&gt;GROUP BY&lt;/code&gt;, and if two are the same, then both have the &lt;code&gt;UNION&lt;/code&gt; of all of the properties of both.&lt;/p&gt; &lt;p&gt;If this were a naive smoosh, then the individuals would have all the same properties but would not be the same for &lt;code&gt;DISTINCT&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;If we have complex application rules for determining whether individuals are the same, then one can materialize &lt;code&gt;owl:sameAs&lt;/code&gt; triples and keep them in a separate graph. In this way, the original data is not contaminated and the materialized volume stays reasonable — nothing like the blow-up of duplicating properties across instances.&lt;/p&gt; &lt;p&gt;The pro-smoosh argument is that if every duplicate makes exactly the same statements, then there is no great blow-up. Best and worst cases will always depend on the data. In rough terms, the more &lt;i&gt;ad hoc&lt;/i&gt; the use, the less desirable the materialization. If the usage pattern is really set, then a relational-style application-specific representation with identity resolved at load time will perform best. We can do that too, but so can others.&lt;/p&gt; &lt;p&gt;The principal point is about agility as concerns the inference. Run time is more agile than materialization, and if the rules change or if different users have different needs, then materialization runs into trouble. When talking web scale, having multiple users is a given; it is very uneconomical to give everybody their own copy, and the likelihood of a user accessing any significant part of the corpus is minimal. Even if the queries were not limited, the user would typically not wait for the answer of a query doing a scan or aggregation over 1 billion &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id1156a550&quot;&gt;blog&lt;/a&gt; posts or something of the sort. So queries will typically be selective. Selective means that they do not access all of the data, hence do not benefit from ready-made materialization for things they do not even look at. &lt;/p&gt; &lt;p&gt;The exception is corpus-wide statistics queries. But these will not be done in interactive time anyway, and will not be done very often. Plus, since these do not typically run all in memory, these are disk bound. And when things are disk bound, size matters. Reading extra entailment on the way is just a performance penalty.&lt;/p&gt; &lt;p&gt;Enough talk. Time for an experiment. We take the Yahoo and Falcon web crawls from the Billion Triples Challenge set, and do two things with the FOAF data in them:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Resolve identity at insert time. We remove duplicate person URIs, and give the single &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id11317008&quot;&gt;URI&lt;/a&gt; all the properties of all the duplicate URIs. We expect these to be most often repeats. If a person references another person, we normalize this reference to go to the single URI of the referenced person.&lt;/li&gt; &lt;li&gt;Give every duplicate URI of a person all the properties of all the duplicates. If these are the same value, the data should not get much bigger, or so we think.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;For the experiment, we will consider two people the same if they have the same &lt;code&gt;foaf:name&lt;/code&gt; and are both instances of &lt;code&gt;foaf:Person&lt;/code&gt;. This gets some extra hits but should not be statistically significant.&lt;/p&gt; &lt;p&gt;The following is a commented &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id110945b0&quot;&gt;SQL&lt;/a&gt; script performing the smoosh. We play with internal IDs of things, thus some of these operations cannot be done in SPARQL alone. We use SPARQL where possible for readability. As the documentation states, &lt;code&gt;iri_to_id&lt;/code&gt; converts from the qualified name of an IRI to its ID and &lt;code&gt;id_to_iri&lt;/code&gt; does the reverse.&lt;/p&gt; &lt;p&gt;We count the triples that enter into the smoosh:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- the name is an existence because else we&amp;#39;d get several times more due to -- the names occurring in many graphs &lt;br /&gt; sparql SELECT COUNT(*) WHERE { { SELECT DISTINCT ?person WHERE { ?person a foaf:Person } } . FILTER ( bif:exists ( SELECT (1) WHERE { ?person foaf:name ?nn } ) ) . ?person ?p ?o };&lt;br /&gt; -- We get 3284674 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We make a few tables for intermediate results.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;-- For each distinct name, gather the properties and objects from -- all subjects with this name &lt;br /&gt; CREATE TABLE name_prop ( np_name ANY, np_p IRI_ID_8, np_o ANY, PRIMARY KEY ( np_name, np_p, np_o ) ); ALTER INDEX name_prop ON name_prop PARTITION ( np_name VARCHAR (-1, 0hexffff) );&lt;br /&gt; -- Map from name to canonical IRI used for the name &lt;br /&gt; CREATE TABLE name_iri ( ni_name ANY PRIMARY KEY, ni_s IRI_ID_8 ); ALTER INDEX name_iri ON name_iri PARTITION ( ni_name VARCHAR (-1, 0hexffff) );&lt;br /&gt; -- Map from person IRI to canonical person IRI&lt;br /&gt; CREATE TABLE pref_iri ( i IRI_ID_8, pref IRI_ID_8, PRIMARY KEY ( i ) ); ALTER INDEX pref_iri ON pref_iri PARTITION ( i INT (0hexffff00) );&lt;br /&gt; -- a table for the materialization where all aliases get all properties of every other &lt;br /&gt; CREATE TABLE smoosh_ct ( s IRI_ID_8, p IRI_ID_8, o ANY, PRIMARY KEY ( s, p, o ) ); ALTER INDEX smoosh_ct ON smoosh_ct PARTITION ( s INT (0hexffff00) );&lt;br /&gt; -- disable transaction log and enable row auto-commit. This is necessary, otherwise -- bulk operations are done transactionally and they will run out of rollback space.&lt;br /&gt; LOG_ENABLE (2);&lt;br /&gt; -- Gather all the properties of all persons with a name under that name. -- INSERT SOFT means that duplicates are ignored &lt;br /&gt; INSERT SOFT name_prop SELECT &amp;quot;n&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;o&amp;quot; FROM ( sparql DEFINE output:valmode &amp;quot;LONG&amp;quot; SELECT ?n ?p ?o WHERE { ?x a foaf:Person . ?x foaf:name ?n . ?x ?p ?o } ) xx ;&lt;br /&gt; -- Now choose for each name the canonical IRI &lt;br /&gt; INSERT INTO name_iri SELECT np_name, ( SELECT MIN (s) FROM rdf_quad WHERE o = np_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ) AS mini FROM name_prop WHERE np_p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- For each person IRI, map to the canonical IRI of that person &lt;br /&gt; INSERT SOFT pref_iri (i, pref) SELECT s, ni_s FROM name_iri, rdf_quad WHERE o = ni_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- Make a graph where all persons have one iri with all the properties of all aliases -- and where person-to-person refs are canonicalized&lt;br /&gt; INSERT SOFT rdf_quad (g,s,p,o) SELECT IRI_TO_ID (&amp;#39;psmoosh&amp;#39;), ni_s, np_p, COALESCE ( ( SELECT pref FROM pref_iri WHERE i = np_o ), np_o ) FROM name_prop, name_iri WHERE ni_name = np_name OPTION ( loop, quietcast ) ;&lt;br /&gt; -- A little explanation: The properties of names are copied into rdf_quad with the name -- replaced with its canonical IRI. If the object has a canonical IRI, this is used as -- the object, else the object is unmodified. This is the COALESCE with the sub-query.&lt;br /&gt; -- This takes a little time. To check on the progress, take another connection to the -- server and do &lt;br /&gt; STATUS (&amp;#39;cluster&amp;#39;);&lt;br /&gt; -- It will return something like -- Cluster 4 nodes, 35 s. 108 m/s 1001 KB/s 75% cpu 186% read 12% clw threads 5r 0w 0i -- buffers 549481 253929 d 8 w 0 pfs&lt;br /&gt; -- Now finalize the state; this makes it permanent. Else the work will be lost on server -- failure, since there was no transaction log &lt;br /&gt; CL_EXEC (&amp;#39;checkpoint&amp;#39;);&lt;br /&gt; -- See what we got&lt;br /&gt; sparql SELECT COUNT (*) FROM &amp;lt;psmoosh&amp;gt; WHERE {?s ?p ?o};&lt;br /&gt; -- This is 2253102&lt;br /&gt; -- Now make the copy where all have the properties of all synonyms. This takes so much -- space we do not insert it as RDF quads, but make a special table for it so that we can -- run some statistics. This saves time.&lt;br /&gt; INSERT SOFT smoosh_ct (s, p, o) SELECT s, np_p, np_o FROM name_prop, rdf_quad WHERE o = np_name AND p = IRI_TO_ID (&amp;#39;http://xmlns.com/foaf/0.1/name&amp;#39;) ;&lt;br /&gt; -- as above, INSERT SOFT so as to ignore duplicates &lt;br /&gt; SELECT COUNT (*) FROM smoosh_ct;&lt;br /&gt; -- This is 167360324&lt;br /&gt; -- Find out where the bloat comes from &lt;br /&gt; SELECT TOP 20 COUNT (*), ID_TO_IRI (p) FROM smoosh_ct GROUP BY p ORDER BY 1 DESC; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The results are:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;54728777 http://www.w3.org/2002/07/owl#sameAs 48543153 http://xmlns.com/foaf/0.1/knows 13930234 http://www.w3.org/2000/01/rdf-schema#seeAlso 12268512 http://xmlns.com/foaf/0.1/interest 11415867 http://xmlns.com/foaf/0.1/nick 6683963 http://xmlns.com/foaf/0.1/weblog 6650093 http://xmlns.com/foaf/0.1/depiction 4231946 http://xmlns.com/foaf/0.1/mbox_sha1sum 4129629 http://xmlns.com/foaf/0.1/homepage 1776555 http://xmlns.com/foaf/0.1/holdsAccount 1219525 http://xmlns.com/foaf/0.1/based_near 305522 http://www.w3.org/1999/02/22-rdf-syntax-ns#type 274965 http://xmlns.com/foaf/0.1/name 155131 http://xmlns.com/foaf/0.1/dateOfBirth 153001 http://xmlns.com/foaf/0.1/img 111130 http://www.w3.org/2001/vcard-rdf/3.0#ADR 52930 http://xmlns.com/foaf/0.1/gender 48517 http://www.w3.org/2004/02/skos/core#subject 45697 http://www.w3.org/2000/01/rdf-schema#label 44860 http://purl.org/vocab/bio/0.1/olb &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Now compare with the predicate distribution of the smoosh with identities canonicalized &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT (*) ?p FROM &amp;lt;psmoosh&amp;gt; WHERE { ?s ?p ?o } GROUP BY ?p ORDER BY 1 DESC LIMIT 20;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Results are:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;748311 http://xmlns.com/foaf/0.1/knows 548391 http://xmlns.com/foaf/0.1/interest 140531 http://www.w3.org/2000/01/rdf-schema#seeAlso 105273 http://www.w3.org/1999/02/22-rdf-syntax-ns#type 78497 http://xmlns.com/foaf/0.1/name 48099 http://www.w3.org/2004/02/skos/core#subject 45179 http://xmlns.com/foaf/0.1/depiction 40229 http://www.w3.org/2000/01/rdf-schema#comment 38272 http://www.w3.org/2000/01/rdf-schema#label 37378 http://xmlns.com/foaf/0.1/nick 37186 http://dbpedia.org/property/abstract 34003 http://xmlns.com/foaf/0.1/img 26182 http://xmlns.com/foaf/0.1/homepage 23795 http://www.w3.org/2002/07/owl#sameAs 17651 http://xmlns.com/foaf/0.1/mbox_sha1sum 17430 http://xmlns.com/foaf/0.1/dateOfBirth 15586 http://xmlns.com/foaf/0.1/page 12869 http://dbpedia.org/property/reference 12497 http://xmlns.com/foaf/0.1/weblog 12329 http://blogs.yandex.ru/schema/foaf/school &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We can drop the &lt;code&gt;owl:sameAs&lt;/code&gt; triples from the count, so the bloat is a bit less by that but it still is tens of times larger than the canonicalized copy or the initial state.&lt;/p&gt; &lt;p&gt;Now, when we try using the psmoosh graph, we still get different results from the results with the original data. This is because &lt;code&gt;foaf:knows&lt;/code&gt; relations to things with no &lt;code&gt;foaf:name&lt;/code&gt; are not represented in the smoosh. The exist:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;sparql SELECT COUNT (*) WHERE { ?s foaf:knows ?thing . FILTER ( !bif:exists ( SELECT (1) WHERE { ?thing foaf:name ?nn } ) ) };&lt;br /&gt; -- 1393940 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;So the smoosh graph is not an accurate rendition of the social network. It would have to be smooshed further to be that, since the data in the sample is quite irregular. But we do not go that far here.&lt;/p&gt; &lt;p&gt;Finally, we calculate the smoosh blow up factors. We do not include &lt;code&gt;owl:sameAs&lt;/code&gt; triples in the counts.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;select (167360324 - 54728777) / 3284674.0; 34.290022997716059&lt;br /&gt; select 2229307 / 3284674.0; = 0.678699621332284 &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;So, to get a smoosh that is not really the equivalent of the original, either multiply the original triple count by 34 or 0.68, depending on whether synonyms are collapsed or not.&lt;/p&gt; &lt;p&gt;Making the smooshes does not take very long, some minutes for the small one. Inserting the big one would be longer, a couple of hours maybe. It was 33 minutes for filling the &lt;code&gt;smoosh_ct&lt;/code&gt; table. The metrics were not with optimal tuning so the performance numbers just serve to show that smooshing takes time. Probably more time than allowable in an interactive situation, no matter how the process is optimized.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-16T15:01:30-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Cool URIs, Fish, and Wine</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-12-12#1497</atom:id>
  <atom:published>2008-12-12T21:41:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve just read &lt;a href=&quot;http://www.redmonk.com/jgovernor/about/&quot; id=&quot;link-id152d07f0&quot;&gt;James Governor&lt;/a&gt;&amp;#39;s insightful post titled: &lt;a href=&quot;http://www.redmonk.com/jgovernor/2007/04/05/why-applications-are-like-fish-and-data-is-like-wine/&quot; id=&quot;link-id14e9a200&quot;&gt;Why Applications Are Like Fish and Data is Like Wine&lt;/a&gt;, where he sums up the comparative value of applications (code containers) and data as follows:&lt;/p&gt; &lt;blockquote&gt;&amp;quot;&lt;cite&gt;Only one improves with age. With apologies to the originator of the phrase - “Hardware is like fish, operating systems are like wine.&lt;/cite&gt;”&lt;/blockquote&gt; &lt;p&gt;Yes! Applications are like Fish and Data like Wine, which is basically what &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id115defd0&quot;&gt;Linked Data&lt;/a&gt; is fundamentally about, especially when you inject memes such as &amp;quot;&lt;a href=&quot;http://www.w3.org/TR/cooluris/&quot; id=&quot;link-id1438f878&quot;&gt;Cool URIs&lt;/a&gt;&amp;quot; into the mix. Remember, the essence of Linked Data is all about a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of Linked Data Objects endowed with &lt;a href=&quot;http://dbpedia.org/resource/Identity_(object-oriented_programming)&quot; id=&quot;link-id114df410&quot;&gt;Identifiers&lt;/a&gt; that don&amp;#39;t change i.e., they occupy one place in public (e.g. &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id1195e010&quot;&gt;World Wide Web&lt;/a&gt;) or private (your corporate &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id1149f1b0&quot;&gt;Intranet&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id11927c80&quot;&gt;Extranet&lt;/a&gt;) networks, keeping the data that they expose relevant (as in fresh), accessible, and usable in many forms courtesy of the data access &amp;amp; representation dexterity that HTTP facilitates, when incorporated into object identifiers.&lt;/p&gt; &lt;p&gt; Here is another excerpt from his post that rings true (amongst many others): &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;What am I talking about? Processes change, and need to change. Baking data into the application is a bad idea because the data can’t then be extended in useful, and “unexpected ways”. But not expecting corporate data to be used in new ways is kind of like not expecting the Spanish Inquisition. But… “NOBODY expects the Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, surprise, ruthless efficiency, an almost fanatical devotion to the Pope.” (sounds like Enterprise Architecture ...).&lt;/cite&gt; &lt;/blockquote&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1482&quot; id=&quot;link-id111b6618&quot;&gt;Master Data Management &amp;amp; RDF based Linked Data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2009-01-23T17:22:00.000005-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The future of the Semantic Web? It?s already here | Cision Blog</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-11#1496</atom:id>
  <atom:published>2008-12-11T20:46:14Z</atom:published>
  <atom:content type="html">&lt;blockquote&gt; &lt;p&gt;December 11, 2008&lt;/p&gt; &lt;h2 id=&quot;title&quot;&gt; &lt;a href=&quot;http://blog.us.cision.com/2008/12/the-future-of-the-semantic-web-its-already-here/&quot; title=&quot;The future of the Semantic Web? It’s already here&quot; id=&quot;link-id0xb4a00c8&quot;&gt;The future of the Semantic Web? It’s already here&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;Author: Jay Krall&lt;/p&gt; &lt;h3&gt;An expert weighs in on how Web 3.0 is about to make media monitoring easier&lt;/h3&gt; &lt;p&gt;For public relations professionals, finding mentions about a particular brand or product is getting more challenging as the vast clutter of the Web continues to grow. While paid &lt;a href=&quot;http://us.cision.com/products_services/cisionpoint/monitor/enews/enews_overview.asp&quot; target=&quot;_blank&quot; id=&quot;link-id0x1d682460&quot;&gt;monitoring services like those offered by Cision&lt;/a&gt; and others can help, for those using free-text search engines like Google for media monitoring, combing through pages of irrelevant search results has become routine. For example, acronyms pose a problem: how many instances of the term “HP” referring to “horsepower” do you have to sift through to find articles about &lt;a href=&quot;http://hp.com&quot; target=&quot;_blank&quot; id=&quot;link-id0xaf5bd40&quot;&gt;Hewlett-Packard&lt;/a&gt; products? Plenty.&lt;/p&gt; &lt;p&gt; &lt;span id=&quot;more-348&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;Worse yet, the longer your queries get, the harder it is for search engines to find what you really want. It’s almost 2009. With all this technological innovation happening so fast, why does it seem like computers still can’t read very well? If they were more literate, the monitoring of media and social media for brand mentions would be a lot easier for everyone.&lt;/p&gt; &lt;p&gt;That’s just one practical argument for the importance of the Semantic Web. First described in 1999 by &lt;a href=&quot;http://www.w3.org/&quot; target=&quot;_blank&quot; id=&quot;link-id0x1d1499c0&quot;&gt;World Wide Web Consortium&lt;/a&gt; director &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/&quot; target=&quot;_blank&quot; id=&quot;link-id0x1c755008&quot;&gt;Tim Berners-Lee&lt;/a&gt;, the Semantic Web, also referred to as Web 3.0, is often described as a vision for the next generation of the Web: pages that can search each other and pull from each other’s data intelligently, melding Web sites and news feeds into precisely honed, individual Web experiences.  But actually, the technologies of the Semantic Web are already hard at work, thanks to a group of computer scientists from around the world who are making Berners-Lee’s vision a reality.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/blog/%7Ekidehen/&quot; target=&quot;_blank&quot; id=&quot;link-id0x1e2c25d0&quot;&gt;Kingsley Idehen&lt;/a&gt;, CEO of &lt;a href=&quot;http://www.openlinksw.com/&quot; target=&quot;_blank&quot; id=&quot;link-id0xa650340&quot;&gt;OpenLink Software&lt;/a&gt;, is one of those pioneers. He is one of the creators of &lt;a href=&quot;http://dbpedia.org&quot; target=&quot;_blank&quot; id=&quot;link-id0xae0add0&quot;&gt;DBpedia&lt;/a&gt;, a Semantic Web tool that culls data from &lt;a href=&quot;http://wikipedia.org&quot; target=&quot;_blank&quot; id=&quot;link-id0x1b20c1a8&quot;&gt;Wikipedia&lt;/a&gt; in amazingly precise ways. The project is a collaboration of OpenLink Software, the &lt;a href=&quot;http://www.informatik.uni-leipzig.de/%7Eauer/&quot; target=&quot;_blank&quot; id=&quot;link-id0x19b8a758&quot;&gt;University of Leipzig&lt;/a&gt; and &lt;a href=&quot;http://www.wiwiss.fu-berlin.de/en/institute/pwo/bizer/index.html&quot; target=&quot;_blank&quot; id=&quot;link-id0x1d289c70&quot;&gt;Freie University Berlin&lt;/a&gt;. Simply put, it divides up the site’s information into tags, and uses those tags to develop searches in which the subject is clearly defined, using a computer language that could soon be applied all across the Web. Beginning in late 2006, a program assigned 274 million tags describing nearly 1 billion facts to catalog Wikipedia in this way using the Resource Description Framework (RDF), a commonly accepted format for Semantic Web applications.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;( &lt;a href=&quot;http://blog.us.cision.com/2008/12/the-future-of-the-semantic-web-its-already-here/&quot; id=&quot;link-id0xa610bf8&quot;&gt;Full story ...&lt;/a&gt; )&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-11T15:46:14.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Anytime: No Query Is Too Complex (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-11#1495</atom:id>
  <atom:published>2008-12-11T16:13:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;A persistent argument against the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1199d5f8&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id116f2730&quot;&gt;web&lt;/a&gt; has been the cost, scalability, and vulnerability of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id14e423c0&quot;&gt;SPARQL&lt;/a&gt; end points, should the linked data web gain serious mass and traffic.&lt;/p&gt; &lt;p&gt;As we are on the brink of hosting the whole &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1376a8b0&quot;&gt;DBpedia&lt;/a&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id113c8d20&quot;&gt;Linked Open Data&lt;/a&gt; cloud in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11425a78&quot;&gt;Virtuoso&lt;/a&gt; Cluster, we have had to think of what we&amp;#39;ll do if, for example, somebody decides to count all the triples in the set.&lt;/p&gt; &lt;p&gt;How can we encourage clever use of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id116f1210&quot;&gt;data&lt;/a&gt;, yet not die if somebody, whether through malice, lack of understanding, or simple bad luck, submits impossible queries?&lt;/p&gt; &lt;p&gt;Restricting the language is not the way; any language beyond text search can express queries that will take forever to execute. Also, just returning a timeout after the first second (or whatever arbitrary time period) leaves people in the dark and does not produce an impression of responsiveness. So we decided to allow arbitrary queries, and if a quota of time or resources is exceeded, we return partial results and indicate how much processing was done.&lt;/p&gt; &lt;p&gt;Here we are looking for the top 10 people whom people claim to know without being known in return, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;SQL&amp;gt; sparql SELECT ?celeb, COUNT (*) WHERE { ?claimant foaf:knows ?celeb . FILTER (!bif:exists ( SELECT (1) WHERE { ?celeb foaf:knows ?claimant } ) ) } GROUP BY ?celeb ORDER BY DESC 2 LIMIT 10;&lt;br /&gt; celeb callret-1 VARCHAR VARCHAR ________________________________________ _________&lt;br /&gt; http://twitter.com/BarackObama 252 http://twitter.com/brianshaler 183 http://twitter.com/newmediajim 101 http://twitter.com/HenryRollins 95 http://twitter.com/wilw 81 http://twitter.com/stevegarfield 78 http://twitter.com/cote 66 mailto:adam.westerski@deri.org 66 mailto:michal.zaremba@deri.org 66 http://twitter.com/dsifry 65&lt;br /&gt; *** Error S1TAT: [Virtuoso Driver][Virtuoso Server]RC...: Returning incomplete results, query interrupted by result timeout. Activity: 1R rnd 0R seq 0P disk 1.346KB / 3 messages&lt;br /&gt; SQL&amp;gt; sparql SELECT ?celeb, COUNT (*) WHERE { ?claimant foaf:knows ?celeb . FILTER (!bif:exists ( SELECT (1) WHERE { ?celeb foaf:knows ?claimant } ) ) } GROUP BY ?celeb ORDER BY DESC 2 LIMIT 10;&lt;br /&gt; celeb callret-1 VARCHAR VARCHAR ________________________________________ _________&lt;br /&gt; http://twitter.com/JasonCalacanis 496 http://twitter.com/Twitterrific 466 http://twitter.com/ev 442 http://twitter.com/BarackObama 356 http://twitter.com/laughingsquid 317 http://twitter.com/gruber 294 http://twitter.com/chrispirillo 259 http://twitter.com/ambermacarthur 224 http://twitter.com/t 219 http://twitter.com/johnedwards 188&lt;br /&gt; *** Error S1TAT: [Virtuoso Driver][Virtuoso Server]RC...: Returning incomplete results, query interrupted by result timeout. Activity: 329R rnd 44.6KR seq 342P disk 638.4KB / 46 messages&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The first query read all data from disk; the second run had the working set from the first and could read some more before time ran out, hence the results were better. But the response time was the same.&lt;/p&gt; &lt;p&gt;If one has a query that just loops over consecutive joins, like in basic SPARQL, interrupting the processing after a set time period is simple. But such queries are not very interesting. To give meaningful partial answers with nested aggregation and sub-queries requires some more tricks. The basic idea is to terminate the innermost active sub-query/aggregation at the first timeout, and extend the timeout a bit so that accumulated results get fed to the next aggregation, like from the &lt;code&gt;GROUP BY&lt;/code&gt; to the &lt;code&gt;ORDER BY&lt;/code&gt;. If this again times out, we continue with the next outer layer. This guarantees that results are delivered if there were any results found for which the query pattern is true. False results are not produced, except in cases where there is comparison with a count and the count is smaller than it would be with the full evaluation.&lt;/p&gt; &lt;p&gt;One can also use this as a basis for paid services. The cutoff does not have to be time; it can also be in other units, making it insensitive to concurrent usage and variations of working set.&lt;/p&gt; &lt;p&gt;This system will be deployed on our &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id11500a58&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://b3s.openlinksw.com/&quot; id=&quot;link-id11683120&quot;&gt;demo instance&lt;/a&gt; in a few days, after some more testing. When Virtuoso 6 ships, all &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1157a500&quot;&gt;LOD&lt;/a&gt; Cloud AMIs and OpenLink-hosted LOD Cloud SPARQL endpoints will have this enabled by default. (AMI users will be able to disable the feature, if desired.) The feature works with Virtuoso 6 in both single server and cluster deployment.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-12T10:29:23-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Anytime: No Query Is Too Complex (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-12-11#1494</atom:id>
  <atom:published>2008-12-11T16:13:10Z</atom:published>
  <atom:content type="html">&lt;p&gt;A persistent argument against the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1199d5f8&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id116f2730&quot;&gt;web&lt;/a&gt; has been the cost, scalability, and vulnerability of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id14e423c0&quot;&gt;SPARQL&lt;/a&gt; end points, should the linked data web gain serious mass and traffic.&lt;/p&gt; &lt;p&gt;As we are on the brink of hosting the whole &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1376a8b0&quot;&gt;DBpedia&lt;/a&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id113c8d20&quot;&gt;Linked Open Data&lt;/a&gt; cloud in &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11425a78&quot;&gt;Virtuoso&lt;/a&gt; Cluster, we have had to think of what we&amp;#39;ll do if, for example, somebody decides to count all the triples in the set.&lt;/p&gt; &lt;p&gt;How can we encourage clever use of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id116f1210&quot;&gt;data&lt;/a&gt;, yet not die if somebody, whether through malice, lack of understanding, or simple bad luck, submits impossible queries?&lt;/p&gt; &lt;p&gt;Restricting the language is not the way; any language beyond text search can express queries that will take forever to execute. Also, just returning a timeout after the first second (or whatever arbitrary time period) leaves people in the dark and does not produce an impression of responsiveness. So we decided to allow arbitrary queries, and if a quota of time or resources is exceeded, we return partial results and indicate how much processing was done.&lt;/p&gt; &lt;p&gt;Here we are looking for the top 10 people whom people claim to know without being known in return, like this:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;SQL&amp;gt; sparql SELECT ?celeb, COUNT (*) WHERE { ?claimant foaf:knows ?celeb . FILTER (!bif:exists ( SELECT (1) WHERE { ?celeb foaf:knows ?claimant } ) ) } GROUP BY ?celeb ORDER BY DESC 2 LIMIT 10;&lt;br /&gt; celeb callret-1 VARCHAR VARCHAR ________________________________________ _________&lt;br /&gt; http://twitter.com/BarackObama 252 http://twitter.com/brianshaler 183 http://twitter.com/newmediajim 101 http://twitter.com/HenryRollins 95 http://twitter.com/wilw 81 http://twitter.com/stevegarfield 78 http://twitter.com/cote 66 mailto:adam.westerski@deri.org 66 mailto:michal.zaremba@deri.org 66 http://twitter.com/dsifry 65&lt;br /&gt; *** Error S1TAT: [Virtuoso Driver][Virtuoso Server]RC...: Returning incomplete results, query interrupted by result timeout. Activity: 1R rnd 0R seq 0P disk 1.346KB / 3 messages&lt;br /&gt; SQL&amp;gt; sparql SELECT ?celeb, COUNT (*) WHERE { ?claimant foaf:knows ?celeb . FILTER (!bif:exists ( SELECT (1) WHERE { ?celeb foaf:knows ?claimant } ) ) } GROUP BY ?celeb ORDER BY DESC 2 LIMIT 10;&lt;br /&gt; celeb callret-1 VARCHAR VARCHAR ________________________________________ _________&lt;br /&gt; http://twitter.com/JasonCalacanis 496 http://twitter.com/Twitterrific 466 http://twitter.com/ev 442 http://twitter.com/BarackObama 356 http://twitter.com/laughingsquid 317 http://twitter.com/gruber 294 http://twitter.com/chrispirillo 259 http://twitter.com/ambermacarthur 224 http://twitter.com/t 219 http://twitter.com/johnedwards 188&lt;br /&gt; *** Error S1TAT: [Virtuoso Driver][Virtuoso Server]RC...: Returning incomplete results, query interrupted by result timeout. Activity: 329R rnd 44.6KR seq 342P disk 638.4KB / 46 messages&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;The first query read all data from disk; the second run had the working set from the first and could read some more before time ran out, hence the results were better. But the response time was the same.&lt;/p&gt; &lt;p&gt;If one has a query that just loops over consecutive joins, like in basic SPARQL, interrupting the processing after a set time period is simple. But such queries are not very interesting. To give meaningful partial answers with nested aggregation and sub-queries requires some more tricks. The basic idea is to terminate the innermost active sub-query/aggregation at the first timeout, and extend the timeout a bit so that accumulated results get fed to the next aggregation, like from the &lt;code&gt;GROUP BY&lt;/code&gt; to the &lt;code&gt;ORDER BY&lt;/code&gt;. If this again times out, we continue with the next outer layer. This guarantees that results are delivered if there were any results found for which the query pattern is true. False results are not produced, except in cases where there is comparison with a count and the count is smaller than it would be with the full evaluation.&lt;/p&gt; &lt;p&gt;One can also use this as a basis for paid services. The cutoff does not have to be time; it can also be in other units, making it insensitive to concurrent usage and variations of working set.&lt;/p&gt; &lt;p&gt;This system will be deployed on our &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id11500a58&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://b3s.openlinksw.com/&quot; id=&quot;link-id11683120&quot;&gt;demo instance&lt;/a&gt; in a few days, after some more testing. When Virtuoso 6 ships, all &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1157a500&quot;&gt;LOD&lt;/a&gt; Cloud AMIs and OpenLink-hosted LOD Cloud SPARQL endpoints will have this enabled by default. (AMI users will be able to disable the feature, if desired.) The feature works with Virtuoso 6 in both single server and cluster deployment.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-12T10:29:18-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DataSpaces Bulletin: December issue now online!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-12-09#1493</atom:id>
  <atom:published>2008-12-09T18:21:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;The highly anticipated &lt;a href=&quot;http://support.openlinksw.com/supportweb/DataSpacesBulletin-2008-12&quot; id=&quot;link-id0x1ec42588&quot;&gt;December 2008 issue of the DataSpaces Bulletin is now available&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;This month&amp;#39;s DataSpaces contains material of interest to the Virtuoso developer and UDA user community alike —&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Introduction to Virtuoso Universal Server (Cloud Edition).&lt;/li&gt; &lt;li&gt;Links to Virtuoso and Linked Data mailing lists.&lt;/li&gt; &lt;li&gt;UDA license management tips and tricks.&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-12-09T15:06:51-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DataSpaces Bulletin: December issue now online!</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/uda/135/?date=2008-12-09#1492</atom:id>
  <atom:published>2008-12-09T18:09:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;The highly anticipated &lt;a href=&quot;http://support.openlinksw.com/supportweb/DataSpacesBulletin-2008-12&quot; id=&quot;link-id0x2108a398&quot;&gt;December 2008 issue of the DataSpaces Bulletin is now available&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;This month&amp;#39;s DataSpaces contains material of interest to the Virtuoso developer and UDA user community alike —&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Introduction to Virtuoso Universal Server (Cloud Edition).&lt;/li&gt; &lt;li&gt;Links to Virtuoso and Linked Data mailing lists.&lt;/li&gt; &lt;li&gt;UDA license management tips and tricks.&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-12-09T15:06:53-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso+Neurocommons EC2 AMI released! (Update - 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-12-08#1491</atom:id>
  <atom:published>2008-12-08T21:13:04Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is Neurocommons?&lt;/h3&gt; &lt;p&gt;Excerpted from the &lt;a href=&quot;http://neurocommons.org/&quot; id=&quot;link-id142131b8&quot;&gt;project home page&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;The NeuroCommons project seeks to make all scientific research materials - research articles, annotations, &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;, physical materials - as available and as useable as they can be. We do this by both fostering practices that render &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id112f8418&quot;&gt;information&lt;/a&gt; in a form that promotes uniform access by computational agents - sometimes called &amp;quot;interoperability&amp;quot;. We want &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id1195f9b0&quot;&gt;knowledge&lt;/a&gt; sources to combine meaningfully, enabling semantically precise queries that span multiple information sources.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;In a nutshell, a great project that makes practical use of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e945010&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id115de818&quot;&gt;Web&lt;/a&gt; technology in the areas of computational biology and neuroscience.&lt;/p&gt; &lt;h3&gt;What is &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa1eda880&quot;&gt;Virtuoso&lt;/a&gt; and Neurocommons AMI for EC2?&lt;/h3&gt; &lt;p&gt;A pre-installed and fully tuned edition of Virtuoso that includes a fully configured Neurocommons Knowledgebase (in RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id114d8c88&quot;&gt;Linked Data&lt;/a&gt; form) on Amazon&amp;#39;s EC2 Cloud platform.&lt;/p&gt; &lt;h3&gt;Benefits?&lt;/h3&gt; &lt;p&gt;Generally, it provides a no-hassles mechanism for instantiating personal-, organization-, or service-specific instances of a very powerful research knowledgebase within approximately 1.15 hours compared to a lengthy rebuild from RDF source data alternative that takes 14 hours or more, depending on machine hardware configuration and host operating system resources.&lt;/p&gt; &lt;h3&gt;Features:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://blogs.usnet.private:8893/sparql.neurocommons.org&quot; id=&quot;link-id154c5710&quot;&gt;Neurocommons public instance&lt;/a&gt; functionality replica (re. RDF and (X)HTML resource description representations &amp;amp; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1188e5f0&quot;&gt;SPARQL&lt;/a&gt; endpoint)&lt;/li&gt; &lt;li&gt; Local &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id117092a8&quot;&gt;URI&lt;/a&gt; de-referencing (so no contention with public endpoint) as part of the RDF Linked Data Deployment&lt;/li&gt; &lt;li&gt; Fully tuned Virtuoso instance for neurocommons knowledgebase. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Installation Guide&lt;/h3&gt; Simply read the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMINeuroCommonsInstall&quot; id=&quot;link-id15267570&quot;&gt;Virtuoso+NeuroCommons EC2 AMI installation guide&lt;/a&gt;. &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://sciencecommons.org/about/science-commons-dylan-video/&quot; id=&quot;link-id14cb22f0&quot;&gt;Science Commons Video&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-12-10T22:48:49-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso+DBpedia AMI for EC2 now Live!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-12-01#1490</atom:id>
  <atom:published>2008-12-01T16:04:28Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11015c60&quot;&gt;Virtuoso&lt;/a&gt;+&lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1140b6f0&quot;&gt;DBpedia&lt;/a&gt; AMI for EC2?&lt;/h3&gt; &lt;p&gt;A pre-installed and fully tuned edition of Virtuoso that includes a fully configured DBpedia instance on Amazon&amp;#39;s EC2 Cloud platform.&lt;/p&gt; &lt;h3&gt;Benefits?&lt;/h3&gt; &lt;p&gt;Generally, it provides a no hassles mechanism for instantiating personal, organization, or service specific instances of DBpedia within approximately 1.5 hours as opposed to a lengthy rebuild from RDF source &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; that takes between 8 - 22 hours depending on machine hardware configuration and host operating system resources.&lt;/p&gt; &lt;p&gt;From a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Entrepreneur perspective it offers all of the generic benefits of a &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/ODSInstallationEC2&quot; id=&quot;link-id1148ac90&quot;&gt;Virtuoso EC2 AMI&lt;/a&gt; plus the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Instant bootstrap of a dense Lookup Hub for &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14c94590&quot;&gt;Linked Data Web&lt;/a&gt; oriented solutions&lt;/li&gt; &lt;li&gt; No exposure to any of the complexities and nuances associated with deployment of dereferencable URIs (you have a DBpedia replica)&lt;/li&gt; &lt;li&gt; Predictable performance and scalability due localization of query processing (you aren&amp;#39;t sharing the public DBpedia server with the rest of the world). &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Features:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; DBpedia public instance functionality replica (re. RDF and (X)HTML resource description representations &amp;amp; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1188e5f0&quot;&gt;SPARQL&lt;/a&gt; endpoint)&lt;/li&gt; &lt;li&gt; Local &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id117092a8&quot;&gt;URI&lt;/a&gt; de-referencing (so no contention with public endpoint) as part of the Linked Data Deployment&lt;/li&gt; &lt;li&gt; Fully tuned Virtuoso instance for DBpedia data set hosting. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;How Do I Get Started?&lt;/h3&gt; Simply read the &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIDBpediaInstall&quot; id=&quot;link-id15836e90&quot;&gt;Virtuoso-DBpedia EC2 AMI installation guide&lt;/a&gt;. &lt;p&gt;Here are a few live examples of DBpedia resource URIs deployed and de-referencable via one of my EC2 based &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id14930ab0&quot;&gt;personal data spaces&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://kingsley.idehen.name/resource/Linked_Data&quot; id=&quot;link-id1104a740&quot;&gt;Linked Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kingsley.idehen.name/resource/Entity-attribute-value_model&quot; id=&quot;link-id11200f48&quot;&gt;Entity-Attribute-Value&lt;/a&gt; (aka. Triples) Model&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kingsley.idehen.name/resource/Hyperdata&quot; id=&quot;link-id11235ef0&quot;&gt;Hyperdata&lt;/a&gt; Linking (aka. &lt;a href=&quot;http://kingsley.idehen.name/resource/Object_hyperlinking&quot; id=&quot;link-id15493b90&quot;&gt;Object Hyperlinking&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://kingsley.idehen.name/resource/Barack_Obama&quot; id=&quot;link-id15497580&quot;&gt;Barack Obama&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-12-12T11:22:27-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Introducing Virtuoso Universal Server (Cloud Edition) for Amazon EC2</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-28#1489</atom:id>
  <atom:published>2008-11-28T19:27:12Z</atom:published>
  <atom:content type="html">&lt;h3&gt;What is it?&lt;/h3&gt; &lt;p&gt;A pre-installed edition of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14bea838&quot;&gt;Virtuoso&lt;/a&gt; for Amazon&amp;#39;s EC2 Cloud platform.&lt;/p&gt; &lt;h3&gt;What does it offer?&lt;/h3&gt; From a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Entrepreneur perspective it offers: &lt;ol&gt; &lt;li&gt; Low cost entry point to a game-changing Web 3.0+ (and beyond) platform that combines &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id11309b38&quot;&gt;SQL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id135f7988&quot;&gt;RDF&lt;/a&gt;, XML, and Web Services functionality&lt;/li&gt; &lt;li&gt; Flexible variable cost model (courtesy of &lt;a href=&quot;http://aws.amazon.com/devpay/&quot; id=&quot;link-id17941018&quot;&gt;EC2 DevPay&lt;/a&gt;) tightly bound to revenue generated by your services&lt;/li&gt; &lt;li&gt; Delivers federated and/or centralized model flexibility for you SaaS based solutions&lt;/li&gt; &lt;li&gt; Simple entry point for developing and deploying sophisticated database driven applications (SQL or RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14ea6b10&quot;&gt;Linked Data Web&lt;/a&gt; oriented)&lt;/li&gt; &lt;li&gt; Complete framework for exploiting OpenID, OAuth (including Role enhancements) that simplifies exploitation of these vital Identity and &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Access technologies&lt;/li&gt; &lt;li&gt;Easily implement RDF Linked Data based Mail, Blogging, Wikis, Bookmarks, Calendaring, Discussion Forums, Tagging, Social-Networking as &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id11519928&quot;&gt;Data Space&lt;/a&gt; (data containers) features of your application or service offering&lt;/li&gt; &lt;li&gt;Instant alleviation of challenges (e.g. service costs and agility) associated with &lt;a href=&quot;http://dbpedia.org/resource/DataPortability&quot; id=&quot;link-id111cb610&quot;&gt;Data Portability&lt;/a&gt; and Open Data Access across Web 2.0 data silos&lt;/li&gt; &lt;li&gt; LDAP integration for &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id114a8270&quot;&gt;Intranet&lt;/a&gt; / &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id10fe4f08&quot;&gt;Extranet&lt;/a&gt; style applications.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;From the DBMS engine perspective it provides you with one or more pre-configured instances of Virtuoso that enable immediate exploitation of the following services:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; RDF Database (a Quad Store with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id11911bf8&quot;&gt;SPARQL&lt;/a&gt; &amp;amp; SPARUL Language &amp;amp; Protocol support)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id110544c8&quot;&gt;SQL&lt;/a&gt; Database (with &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id1524c7d0&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id14cfb658&quot;&gt;JDBC&lt;/a&gt;, OLE-DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id110ec6c8&quot;&gt;ADO&lt;/a&gt;.NET, and XMLA driver access)&lt;/li&gt; &lt;li&gt;XML Database (XML Schema, &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id10ebf218&quot;&gt;XQuery&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id142a7898&quot;&gt;Xpath&lt;/a&gt;, XSLT, Full Text Indexing)&lt;/li&gt; &lt;li&gt;Full Text Indexing.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;From a Middleware perspective it provides:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; RDF Views (Wrappers / Semantic Covers) over SQL, XML, and other data sources accessible via SOAP or REST style Web Services&lt;/li&gt; &lt;li&gt; Sponger Service for converting non RDF &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11931c60&quot;&gt;information&lt;/a&gt; resources into RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id118f7168&quot;&gt;Linked Data&lt;/a&gt; &amp;quot;on the fly&amp;quot; via a large collection of pre-installed RDFizer Cartridges.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;From the Web Server Platform perspective it provides an alternative to LAMP stack components such as &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id10f7b780&quot;&gt;MySQL&lt;/a&gt; and Apace by offering&lt;/p&gt; &lt;ol&gt; &lt;li&gt; HTTP Web Server&lt;/li&gt; &lt;li&gt; WebDAV Server&lt;/li&gt; &lt;li&gt; Web &lt;a href=&quot;http://dbpedia.org/resource/Application_server&quot; id=&quot;link-id1268daa8&quot;&gt;Application Server&lt;/a&gt; (includes &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id1585d238&quot;&gt;PHP&lt;/a&gt; runtime hosting)&lt;/li&gt; &lt;li&gt; SOAP or REST style Web Services Deployment&lt;/li&gt; &lt;li&gt; RDF Linked Data Deployment&lt;/li&gt; &lt;li&gt; SPARQL (SPARQL Query Language) and SPARUL (SPARQL Update Language) endpoints&lt;/li&gt; &lt;li&gt;Virtuoso Hosted PHP packages for &lt;a href=&quot;http://dbpedia.org/resource/MediaWiki&quot; id=&quot;link-id15568818&quot;&gt;MediaWiki&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Drupal&quot; id=&quot;link-id110bd7a8&quot;&gt;Drupal&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/WordPress&quot; id=&quot;link-id10f66918&quot;&gt;Wordpress&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/PhpBB&quot; id=&quot;link-id13fda4d0&quot;&gt;phpBB3&lt;/a&gt; (just install the relevant Virtuoso Distro. Package). &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;From the general System Administrator&amp;#39;s perspective it provides:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Online Backups (Backup Set dispatched to S3 buckets, FTP, or HTTP/WebDAV server locations)&lt;/li&gt; &lt;li&gt;Synchronized Incremental Backups to Backup Set locations&lt;/li&gt; &lt;li&gt;Backup Restore from Backup Set location (without exiting to EC2 shell).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Higher level user oriented offerings include:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;OpenLink Data Explorer front-end for exploring the burgeoning Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id11646dc8&quot;&gt;Web&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Ajax based SPARQL Query Builder (iSPARQL) that enables SPARQL Query construction by Example&lt;/li&gt; &lt;li&gt;Ajax based SQL Query Builder (QBE) that enables SQL Query construction by Example.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;For Web 2.0 / 3.0 users, developers, and entrepreneurs it offers it includes Distributed Collaboration Tools &amp;amp; Social Media realm functionality courtesy of &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id11009930&quot;&gt;ODS&lt;/a&gt; that includes:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Point of presence on the Linked Data Web that meshes your Identity and your Data via URIs&lt;/li&gt; &lt;li&gt; System generated Social Network Profile &amp;amp; Contact Data via &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id1185a1c0&quot;&gt;FOAF&lt;/a&gt;?&lt;/li&gt; &lt;li&gt; System generated &lt;a href=&quot;http://dbpedia.org/resource/SIOC&quot; id=&quot;link-id14791890&quot;&gt;SIOC&lt;/a&gt; (Semantically Interconnected Online Community) &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1577cad8&quot;&gt;Data Space&lt;/a&gt; (that includes a Social Graph) exposing all your Web data in RDF Linked Data form&lt;/li&gt; &lt;li&gt; System generated OpenID and automatic integration with FOAF&lt;/li&gt; &lt;li&gt; Transparent Data Integration across Facebook, Digg, LinkedIn, FriendFeed, Twitter, and any other Web 2.0 data space equipped with RSS / Atom support and/or REST style Web Services&lt;/li&gt; &lt;li&gt; In-built support for SyncML which enables data synchronization with Mobile Phones.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;How Do I Get Going with It?&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/ODSInstallationEC2&quot; id=&quot;link-id114e1600&quot;&gt;Standard Installation Guide&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtEC2AMIDBpediaInstall&quot; id=&quot;link-id110a98e8&quot;&gt;Personal or Service Specific DBpedia Installation Guide&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-11-28T16:06:02.000006-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>An Example of RDF Scalability</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-27#1488</atom:id>
  <atom:published>2008-11-27T11:23:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We hear it to exhaustion, where is &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x14e828d8&quot;&gt;RDF&lt;/a&gt; scalability? We have been suggesting for a while that this is a solved question. I will here give some concrete numbers to back this.&lt;/p&gt; &lt;p&gt;The scalability dream is to add hardware and get increased performance in proportion to the power the added component has when measured by itself. A corollary dream is to take scalability effects that are measured in a simple task and see them in a complex task.&lt;/p&gt; &lt;p&gt;Below we show how we do 3.3 million random triple lookups per second on two 8 core commodity servers producing complete results, joining across partitions. On a single 4 core server, the figure is about 1 million lookups per second. With a single thread, it is about 250K lookups per second. This is the good case. But even our worse case is quite decent.&lt;/p&gt; &lt;p&gt;We took a simple &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x14fef850&quot;&gt;SPARQL&lt;/a&gt; query, counting how many people say they reciprocally know each other. In the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1bca04d0&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1be84e88&quot;&gt;data&lt;/a&gt; set, there are 25M &lt;code&gt;foaf:knows&lt;/code&gt; quads of which 92K are reciprocal. &lt;i&gt;Reciprocal&lt;/i&gt; here means that when x knows y in some graph, y knows x in the same or any other graph.&lt;/p&gt; &lt;pre&gt;SELECT COUNT (*) WHERE { ?p1 foaf:knows ?p2 . ?p2 foaf:knows ?p1 }&lt;/pre&gt; &lt;p&gt;There is no guarantee that the triple of &lt;code&gt;x knows y&lt;/code&gt; is in the same partition as the triple y knows x. Thus the join is randomly distributed, n partitions to n partitions.&lt;/p&gt; &lt;p&gt;We left this out of the Billion Triples Challenge demo because this did not run fast enough for our liking. Since then, we have corrected this.&lt;/p&gt; &lt;p&gt;If run on a single thread, this query would be a loop over all the quads with a predicate of &lt;code&gt;foaf:knows&lt;/code&gt;, and an inner loop looking for a quad with 3 of 4 fields given (&lt;code&gt;SPO&lt;/code&gt;). If we have a partitioned situation, we have a loop over all the &lt;code&gt;foaf:knows&lt;/code&gt; quads in each partition, and an inner lookup looking for the reciprocal &lt;code&gt;foaf:knows&lt;/code&gt; quad in whatever partition it may be found.&lt;/p&gt; &lt;p&gt;We have implemented this with two different message patterns: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Centralized:&lt;/b&gt; One process reads all the &lt;code&gt;foaf:knows&lt;/code&gt; quads from all processes. Every 50K quads, it sends a batch of reciprocal quad checks to each partition that could contain a reciprocal quad. Each partition keeps the count of found reciprocal quads, and these are gathered and added up at the end.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Symmetrical:&lt;/b&gt; Each process reads the &lt;code&gt;foaf:knows&lt;/code&gt; quads in its partition, and sends a batch of checks to each process that could have the reciprocal &lt;code&gt;foaf:knows&lt;/code&gt; quad every 50K quads. At the end, the counts are gathered from all partitions. There is some additional control traffic but we do not go into its details here.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Below is the result measured on 2 machines each with 2 x Xeon 5345 (quad core; total 8 cores), 16G RAM, and each machine running 6 &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x16642a90&quot;&gt;Virtuoso&lt;/a&gt; instances. The interconnect is dual 1-Gbit ethernet. Numbers are with warm cache.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Centralized: 35,543 msec, 728,634 sequential + random lookups per second &lt;br /&gt; Cluster 12 nodes, 35 s. 1072 m/s 39,085 KB/s 316% cpu ... &lt;br /&gt; &lt;br /&gt; Symmetrical: 7706 msec, 3,360,740 sequential + random lookups per second &lt;br /&gt; Cluster 12 nodes, 7 s. 572 m/s 16,983 KB/s 1137% cpu ...&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The second line is the summary from the cluster status report for the duration of the query. The interesting numbers are the KB/s and the %CPU. The former is the cross-sectional data transfer rate for intra-cluster communication; the latter is the consolidated CPU utilization, where a constantly-busy core counts for 100%. The point to note is that the symmetrical approach takes 4x less real time with under half the data transfer rate. Further, when using multiple machines, the speed of a single interface does not limit the overall throughput as it does in the centralized situation.&lt;/p&gt; &lt;p&gt;These figures represent the best and worst cases of distributed &lt;code&gt;JOIN&lt;/code&gt;ing. If we have a straight sequence of &lt;code&gt;JOIN&lt;/code&gt;s, with single pattern optionals and existences and the order in which results are produced is not significant (i.e., there is aggregation, existence test, or &lt;code&gt;ORDER BY&lt;/code&gt;), the symmetrical pattern is applicable. On the other hand, if there are multiple triple pattern optionals, complex sub-queries, &lt;code&gt;DISTINCT&lt;/code&gt;s in the middle of the query, or results have to be produced in the order of an index, then the centralized approach must be used at least part of the time.&lt;/p&gt; &lt;p&gt;Also, if we must make transitive closures, which can be thought of as an extension of a &lt;code&gt;DISTINCT&lt;/code&gt; in a subquery, we must pass the data through a single point before moving the bindings to the next &lt;code&gt;JOIN&lt;/code&gt; in the sequence. This happens for example in resolving &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x14e1a160&quot;&gt;owl&lt;/a&gt;:sameAs&lt;/code&gt; at run time. However, the good news is that performance does not fall much below the centralized figure even when there are complex nested structures with intermediate transitive closures, &lt;code&gt;DISTINCT&lt;/code&gt;s, complex existence tests, etc., that require passing all intermediate results through a central point. No matter the complexity, it is always possible to vector some tens-of-thousands of variable bindings into a single message exchange. And if there are not that many intermediate results, then single query execution time is not a problem anyhow.&lt;/p&gt; &lt;p&gt;For our sample query, we would get still more speed by using a partitioned hash join, filling the hash from the &lt;code&gt;foaf:knows&lt;/code&gt; relations and then running the &lt;code&gt;foaf:knows&lt;/code&gt; relations through the hash. If the hash size is right, a hash lookup is somewhat better than an index lookup. The problem is that when the hash join is not the right solution, it is an expensive mistake: the best case is good; the worst case is very bad. But if there is no index then hash join is better than nothing. One problem of hash joins is that they make temporary data structures which, if large, will skew the working set. One must be quite sure of the cardinality before it is safe to try a hash join. So we do not do hash joins with RDF, but we do use them sometimes with relational data. &lt;/p&gt; &lt;p&gt;These same methods apply to relational data just as well. This does not make generic RDF storage outperform an application-specific relational representation on the same platform, as the latter benefits from all the same optimizations, but in terms of sheer numbers, this makes RDF representation an option where it was not an option before. RDF is all about not needing to design the schema around the queries, and not needing to limit what joins with what else.&lt;/p&gt;</atom:content>
  <atom:updated>2008-12-01T12:09:55.000008-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>An Example of RDF Scalability</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-27#1487</atom:id>
  <atom:published>2008-11-27T11:23:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We hear it to exhaustion, where is &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1eab4128&quot;&gt;RDF&lt;/a&gt; scalability? We have been suggesting for a while that this is a solved question. I will here give some concrete numbers to back this.&lt;/p&gt; &lt;p&gt;The scalability dream is to add hardware and get increased performance in proportion to the power the added component has when measured by itself. A corollary dream is to take scalability effects that are measured in a simple task and see them in a complex task.&lt;/p&gt; &lt;p&gt;Below we show how we do 3.3 million random triple lookups per second on two 8 core commodity servers producing complete results, joining across partitions. On a single 4 core server, the figure is about 1 million lookups per second. With a single thread, it is about 250K lookups per second. This is the good case. But even our worse case is quite decent.&lt;/p&gt; &lt;p&gt;We took a simple &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x15cb3da8&quot;&gt;SPARQL&lt;/a&gt; query, counting how many people say they reciprocally know each other. In the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1bfb7a00&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa57187d8&quot;&gt;data&lt;/a&gt; set, there are 25M &lt;code&gt;foaf:knows&lt;/code&gt; quads of which 92K are reciprocal. &lt;i&gt;Reciprocal&lt;/i&gt; here means that when x knows y in some graph, y knows x in the same or any other graph.&lt;/p&gt; &lt;pre&gt;SELECT COUNT (*) WHERE { ?p1 foaf:knows ?p2 . ?p2 foaf:knows ?p1 }&lt;/pre&gt; &lt;p&gt;There is no guarantee that the triple of &lt;code&gt;x knows y&lt;/code&gt; is in the same partition as the triple y knows x. Thus the join is randomly distributed, n partitions to n partitions.&lt;/p&gt; &lt;p&gt;We left this out of the Billion Triples Challenge demo because this did not run fast enough for our liking. Since then, we have corrected this.&lt;/p&gt; &lt;p&gt;If run on a single thread, this query would be a loop over all the quads with a predicate of &lt;code&gt;foaf:knows&lt;/code&gt;, and an inner loop looking for a quad with 3 of 4 fields given (&lt;code&gt;SPO&lt;/code&gt;). If we have a partitioned situation, we have a loop over all the &lt;code&gt;foaf:knows&lt;/code&gt; quads in each partition, and an inner lookup looking for the reciprocal &lt;code&gt;foaf:knows&lt;/code&gt; quad in whatever partition it may be found.&lt;/p&gt; &lt;p&gt;We have implemented this with two different message patterns: &lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Centralized:&lt;/b&gt; One process reads all the &lt;code&gt;foaf:knows&lt;/code&gt; quads from all processes. Every 50K quads, it sends a batch of reciprocal quad checks to each partition that could contain a reciprocal quad. Each partition keeps the count of found reciprocal quads, and these are gathered and added up at the end.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Symmetrical:&lt;/b&gt; Each process reads the &lt;code&gt;foaf:knows&lt;/code&gt; quads in its partition, and sends a batch of checks to each process that could have the reciprocal &lt;code&gt;foaf:knows&lt;/code&gt; quad every 50K quads. At the end, the counts are gathered from all partitions. There is some additional control traffic but we do not go into its details here.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Below is the result measured on 2 machines each with 2 x Xeon 5345 (quad core; total 8 cores), 16G RAM, and each machine running 6 &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1c0c94a8&quot;&gt;Virtuoso&lt;/a&gt; instances. The interconnect is dual 1-Gbit ethernet. Numbers are with warm cache.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;Centralized: 35,543 msec, 728,634 sequential + random lookups per second &lt;br /&gt; Cluster 12 nodes, 35 s. 1072 m/s 39,085 KB/s 316% cpu ... &lt;br /&gt; &lt;br /&gt; Symmetrical: 7706 msec, 3,360,740 sequential + random lookups per second &lt;br /&gt; Cluster 12 nodes, 7 s. 572 m/s 16,983 KB/s 1137% cpu ...&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The second line is the summary from the cluster status report for the duration of the query. The interesting numbers are the KB/s and the %CPU. The former is the cross-sectional data transfer rate for intra-cluster communication; the latter is the consolidated CPU utilization, where a constantly-busy core counts for 100%. The point to note is that the symmetrical approach takes 4x less real time with under half the data transfer rate. Further, when using multiple machines, the speed of a single interface does not limit the overall throughput as it does in the centralized situation.&lt;/p&gt; &lt;p&gt;These figures represent the best and worst cases of distributed &lt;code&gt;JOIN&lt;/code&gt;ing. If we have a straight sequence of &lt;code&gt;JOIN&lt;/code&gt;s, with single pattern optionals and existences and the order in which results are produced is not significant (i.e., there is aggregation, existence test, or &lt;code&gt;ORDER BY&lt;/code&gt;), the symmetrical pattern is applicable. On the other hand, if there are multiple triple pattern optionals, complex sub-queries, &lt;code&gt;DISTINCT&lt;/code&gt;s in the middle of the query, or results have to be produced in the order of an index, then the centralized approach must be used at least part of the time.&lt;/p&gt; &lt;p&gt;Also, if we must make transitive closures, which can be thought of as an extension of a &lt;code&gt;DISTINCT&lt;/code&gt; in a subquery, we must pass the data through a single point before moving the bindings to the next &lt;code&gt;JOIN&lt;/code&gt; in the sequence. This happens for example in resolving &lt;code&gt;&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x28005280&quot;&gt;owl&lt;/a&gt;:sameAs&lt;/code&gt; at run time. However, the good news is that performance does not fall much below the centralized figure even when there are complex nested structures with intermediate transitive closures, &lt;code&gt;DISTINCT&lt;/code&gt;s, complex existence tests, etc., that require passing all intermediate results through a central point. No matter the complexity, it is always possible to vector some tens-of-thousands of variable bindings into a single message exchange. And if there are not that many intermediate results, then single query execution time is not a problem anyhow.&lt;/p&gt; &lt;p&gt;For our sample query, we would get still more speed by using a partitioned hash join, filling the hash from the &lt;code&gt;foaf:knows&lt;/code&gt; relations and then running the &lt;code&gt;foaf:knows&lt;/code&gt; relations through the hash. If the hash size is right, a hash lookup is somewhat better than an index lookup. The problem is that when the hash join is not the right solution, it is an expensive mistake: the best case is good; the worst case is very bad. But if there is no index then hash join is better than nothing. One problem of hash joins is that they make temporary data structures which, if large, will skew the working set. One must be quite sure of the cardinality before it is safe to try a hash join. So we do not do hash joins with RDF, but we do use them sometimes with relational data. &lt;/p&gt; &lt;p&gt;These same methods apply to relational data just as well. This does not make generic RDF storage outperform an application-specific relational representation on the same platform, as the latter benefits from all the same optimizations, but in terms of sheer numbers, this makes RDF representation an option where it was not an option before. RDF is all about not needing to design the schema around the queries, and not needing to limit what joins with what else.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:27:01.932709-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Your Personal Edition of DBpedia in the Clouds</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-25#1486</atom:id>
  <atom:published>2008-11-25T23:23:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;We are just about done with an end-to-end workflow pattern that enables reconstitution of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id112a4aa0&quot;&gt;DBpedia&lt;/a&gt; 3.2 instances in the Clouds courtesy of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11969f70&quot;&gt;Virtuoso&lt;/a&gt; and EC2.&lt;/p&gt; &lt;p&gt;Basically this is how it works.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Instantiate a Virtuoso EC2 AMI (paid variety)&lt;/li&gt; &lt;li&gt;Install the special EC2 extensions (ec2ext_dav.vad) VAD via the Conductor UI or iSQL&lt;/li&gt; &lt;li&gt;Restore the Virtuoso+DBpedia backup from our S3 bucket&lt;/li&gt; &lt;li&gt;After approx. 1 hr, you will have a complete DBpedia replica in your own &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id1169c358&quot;&gt;data space&lt;/a&gt; on the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10fd39a8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id141d0c80&quot;&gt;Web&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;DBpedia replica implies:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id116dfd78&quot;&gt;SPARQL&lt;/a&gt; Endpoint&lt;/li&gt; &lt;li&gt;Linked Data Viewer Pages (as you see in the public DBpedia instance)&lt;/li&gt; &lt;li&gt;All requisite re-write rules for &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id114ab148&quot;&gt;URI&lt;/a&gt; de-referencing and attribution (i.e., low cost triples that links back to main DBpedia using terms from our little Attribution Ontology) &lt;/li&gt; &lt;li&gt;All the inference rules for &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id112d4860&quot;&gt;UMBEL&lt;/a&gt;, YAGO, &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id14612e80&quot;&gt;OpenCYC&lt;/a&gt;, and DBpedia-OWL data dictionaries &lt;/li&gt; &lt;li&gt;All Full Text Indexes&lt;/li&gt; &lt;li&gt;All Bitmap Indexes.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Tomorrow is the official go live day (due to last minute price changes), but you can instantiate a paid &lt;a href=&quot;https://aws-portal.amazon.com/gp/aws/user/subscription/index.html?ie=UTF8&amp;amp;offeringCode=6CB89F71&quot; id=&quot;link-id115da1a8&quot;&gt;Virtuoso AMI&lt;/a&gt; starting now :-)&lt;/p&gt; &lt;p&gt;To be continued...&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-25T18:55:55-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Vs. MySQL: Setting the Berlin Record Straight (update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-20#1485</atom:id>
  <atom:published>2008-11-20T11:06:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the context of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xa322b58&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;, I have repeatedly written about measurement procedures and steady state. The point is that the numbers at larger scales are unreliable due to cache behavior if one is not careful about measurement and does not have adequate warmup. Thus it came to pass that one cut of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x9524730&quot;&gt;BSBM&lt;/a&gt; paper had 3 seconds for &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0x2ba8db0&quot;&gt;MySQL&lt;/a&gt; and 100 for &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa9137d0&quot;&gt;Virtuoso&lt;/a&gt;, basically through ignoring cache effects.&lt;/p&gt; &lt;p&gt;So we decided to do it ourselves.&lt;/p&gt; &lt;p&gt;The score is (updated with revised &lt;code&gt;innodb_buffer_pool_size&lt;/code&gt; setting, based on advice noted down below):&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;5&quot;&gt; &lt;tr&gt; &lt;th&gt;n-clients&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;MySQL &lt;br /&gt; (with increased buffer pool size)&lt;/th&gt; &lt;th&gt;MySQL &lt;br /&gt; (with default buffer poll size)&lt;/th&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt; 41,161.33&lt;/td&gt; &lt;td&gt; 27,023.11 &lt;/td&gt; &lt;td&gt; 12,171.41&lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt; 127,918.30&lt;/td&gt; &lt;td&gt; (pending) &lt;/td&gt; &lt;td&gt; 37,566.82&lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;8&lt;/td&gt; &lt;td&gt; 218,162.29 &lt;/td&gt; &lt;td&gt; 105,524.23 &lt;/td&gt; &lt;td&gt; 51,104.39 &lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;16&lt;/td&gt; &lt;td&gt; 214,763.58 &lt;/td&gt; &lt;td&gt; 98,852.42 &lt;/td&gt; &lt;td&gt; 47,589.18 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The metric is the query mixes per hour from the BSBM test driver output. For the interested, the complete output is &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/bsbmres.txt&quot; id=&quot;link-id1119f770&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The benchmark is pure &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x2b61c88&quot;&gt;SQL&lt;/a&gt;, nothing to do with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x17a6d408&quot;&gt;SPARQL&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x9a0a968&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The hardware is 2 x Xeon 5345 (2 x quad core, 2.33 GHz), 16 G RAM. The OS is 64-bit Debian Linux.&lt;/p&gt; &lt;p&gt;The benchmark was run at a scale of 200,000. Each run had 2000 warm-up query mixes and 500 measured query mixes, which gives steady state, eliminating any effects of OS disk cache and the like. Both databases were configured to use 8G for disk cache. The test effectively runs from memory. We ran an analyze table on each MySQL table but noticed that this had no effect. Virtuoso does the stats sampling on the go; possibly MySQL also since the explicit stats did not make any difference. The MySQL tables were served by the InnoDB engine. MySQL appears to cache results of queries in some cases. This was not apparent in the tests.&lt;/p&gt; &lt;p&gt;The versions are 5.09 for Virtuoso and 5.1.29 for MySQL. You can download and examine --&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/virtuoso.ini&quot; id=&quot;link-id14fe17f0&quot;&gt;Virtuoso configuration file&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/my.cnf&quot; id=&quot;link-id116fe490&quot;&gt;MySQL configuration file&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/create_tables_and_rdf_view.sql&quot; id=&quot;link-id14ce9268&quot;&gt;Table definitions &amp;amp; RDF views&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/mysqlinx.sql&quot; id=&quot;link-id1535e298&quot;&gt;Indexes on MySQL tables&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;strike&gt;MySQL ought to do better. We suspect that here, just as in the TPC-D experiment we made way back, the query plans are not quite right. Also we rarely saw over 300% CPU utilization for MySQL. It is possible there is a config parameter that affects this. The public is invited to tell us about such.&lt;/strike&gt; &lt;/p&gt; &lt;p&gt; &lt;b&gt;Update:&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Andreas Schultz of the BSBM team advised us to increase the &lt;code&gt;innodb_buffer_pool_size&lt;/code&gt; setting in the MySQL config. We did and it produced some improvement. Indeed, this is more like it, as we now see CPU utilization around 700% instead of the 300% in the previously published run, which rendered it suspect. Also, our experiments with TPC-D led us to expect better. We ran these things a few times so as to have warm cache.&lt;/p&gt; &lt;p&gt;On the first run, we noticed that the Innodb warm up time was somewhere well in excess of 2000 query mixes. Another time, we should make a graph of throughput as a function of time for both MySQL and Virtuoso. We recently made a greedy prefetch hack that should give us some mileage there. For the next BSBM, all we can advise is to run larger scale system for half an hour first and then measure and then measure again. If the second measurement is the same as the first then it is good.&lt;/p&gt; &lt;p&gt;As always, since MySQL is not our specialty, we confidently invite the public to tell us how to make it run faster. So, unless something more turns up, our next trial is a revisit of &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x17a20498&quot;&gt;TPC-H&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-24T10:15:11.000021-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Vs. MySQL: Setting the Berlin Record Straight (update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-20#1484</atom:id>
  <atom:published>2008-11-20T11:06:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the context of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xa5314d8&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;, I have repeatedly written about measurement procedures and steady state. The point is that the numbers at larger scales are unreliable due to cache behavior if one is not careful about measurement and does not have adequate warmup. Thus it came to pass that one cut of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x18482c20&quot;&gt;BSBM&lt;/a&gt; paper had 3 seconds for &lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-id0xb8c54de8&quot;&gt;MySQL&lt;/a&gt; and 100 for &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x189b2210&quot;&gt;Virtuoso&lt;/a&gt;, basically through ignoring cache effects.&lt;/p&gt; &lt;p&gt;So we decided to do it ourselves.&lt;/p&gt; &lt;p&gt;The score is (updated with revised &lt;code&gt;innodb_buffer_pool_size&lt;/code&gt; setting, based on advice noted down below):&lt;/p&gt; &lt;table border=&quot;1&quot; cellspacing=&quot;2&quot; cellpadding=&quot;5&quot;&gt; &lt;tr&gt; &lt;th&gt;n-clients&lt;/th&gt; &lt;th&gt;Virtuoso&lt;/th&gt; &lt;th&gt;MySQL &lt;br /&gt; (with increased buffer pool size)&lt;/th&gt; &lt;th&gt;MySQL &lt;br /&gt; (with default buffer poll size)&lt;/th&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt; 41,161.33&lt;/td&gt; &lt;td&gt; 27,023.11 &lt;/td&gt; &lt;td&gt; 12,171.41&lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt; 127,918.30&lt;/td&gt; &lt;td&gt; (pending) &lt;/td&gt; &lt;td&gt; 37,566.82&lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;8&lt;/td&gt; &lt;td&gt; 218,162.29 &lt;/td&gt; &lt;td&gt; 105,524.23 &lt;/td&gt; &lt;td&gt; 51,104.39 &lt;/td&gt; &lt;/tr&gt; &lt;tr align=&quot;right&quot;&gt; &lt;td&gt;16&lt;/td&gt; &lt;td&gt; 214,763.58 &lt;/td&gt; &lt;td&gt; 98,852.42 &lt;/td&gt; &lt;td&gt; 47,589.18 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The metric is the query mixes per hour from the BSBM test driver output. For the interested, the complete output is &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/bsbmres.txt&quot; id=&quot;link-id1119f770&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The benchmark is pure &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x5257718&quot;&gt;SQL&lt;/a&gt;, nothing to do with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xb8c463e0&quot;&gt;SPARQL&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x16e68d50&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The hardware is 2 x Xeon 5345 (2 x quad core, 2.33 GHz), 16 G RAM. The OS is 64-bit Debian Linux.&lt;/p&gt; &lt;p&gt;The benchmark was run at a scale of 200,000. Each run had 2000 warm-up query mixes and 500 measured query mixes, which gives steady state, eliminating any effects of OS disk cache and the like. Both databases were configured to use 8G for disk cache. The test effectively runs from memory. We ran an analyze table on each MySQL table but noticed that this had no effect. Virtuoso does the stats sampling on the go; possibly MySQL also since the explicit stats did not make any difference. The MySQL tables were served by the InnoDB engine. MySQL appears to cache results of queries in some cases. This was not apparent in the tests.&lt;/p&gt; &lt;p&gt;The versions are 5.09 for Virtuoso and 5.1.29 for MySQL. You can download and examine --&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/virtuoso.ini&quot; id=&quot;link-id14fe17f0&quot;&gt;Virtuoso configuration file&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/my.cnf&quot; id=&quot;link-id116fe490&quot;&gt;MySQL configuration file&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/create_tables_and_rdf_view.sql&quot; id=&quot;link-id14ce9268&quot;&gt;Table definitions &amp;amp; RDF views&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/texts/mysqlinx.sql&quot; id=&quot;link-id1535e298&quot;&gt;Indexes on MySQL tables&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;strike&gt;MySQL ought to do better. We suspect that here, just as in the TPC-D experiment we made way back, the query plans are not quite right. Also we rarely saw over 300% CPU utilization for MySQL. It is possible there is a config parameter that affects this. The public is invited to tell us about such.&lt;/strike&gt; &lt;/p&gt; &lt;p&gt; &lt;b&gt;Update:&lt;/b&gt; &lt;/p&gt; &lt;p&gt;Andreas Schultz of the BSBM team advised us to increase the &lt;code&gt;innodb_buffer_pool_size&lt;/code&gt; setting in the MySQL config. We did and it produced some improvement. Indeed, this is more like it, as we now see CPU utilization around 700% instead of the 300% in the previously published run, which rendered it suspect. Also, our experiments with TPC-D led us to expect better. We ran these things a few times so as to have warm cache.&lt;/p&gt; &lt;p&gt;On the first run, we noticed that the Innodb warm up time was somewhere well in excess of 2000 query mixes. Another time, we should make a graph of throughput as a function of time for both MySQL and Virtuoso. We recently made a greedy prefetch hack that should give us some mileage there. For the next BSBM, all we can advise is to run larger scale system for half an hour first and then measure and then measure again. If the second measurement is the same as the first then it is good.&lt;/p&gt; &lt;p&gt;As always, since MySQL is not our specialty, we confidently invite the public to tell us how to make it run faster. So, unless something more turns up, our next trial is a revisit of &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x122eaa00&quot;&gt;TPC-H&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-24T10:15:05-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Cool Fractal Animations</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-08#1483</atom:id>
  <atom:published>2008-11-08T16:20:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; is essentially &lt;a href=&quot;http://en.wikipedia.org/wiki/Fractal&quot; id=&quot;link-id16c7e290&quot;&gt;Fractal&lt;/a&gt; in form, so when thinking about the Web it sometimes helps to have cool &lt;a href=&quot;http://fractalanimation.com/&quot; id=&quot;link-id1b189108&quot;&gt;fractal animations&lt;/a&gt; at one&amp;#39;s disposal. &lt;/p&gt; &lt;p&gt;Also, when you watch these fractal animations, you should ultimately understand why a centralized approach to &amp;quot;Web Presence&amp;quot; is inherently flawed :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-08T16:07:33.000006-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Master Data Management (MDM) &amp; RDF based Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-05#1482</atom:id>
  <atom:published>2008-11-05T22:53:13Z</atom:published>
  <atom:content type="html">&lt;p&gt;It is getting clearer by the second that &lt;a href=&quot;http://dbpedia.org/resource/Master_Data_Management&quot; id=&quot;link-id167265a8&quot;&gt;Master Data Management&lt;/a&gt; and RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id17940750&quot;&gt;Linked data&lt;/a&gt; are two realms separated by a common desire to provide &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1be08e68&quot;&gt;Entity&lt;/a&gt; Oriented Data Access&amp;quot; to heterogeneous data sources (within the enterprise and/or across the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id19b8bdd8&quot;&gt;World Wide Web&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Here is how I see Linked Data providing tangible value to MDM tools vendors and users:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Open access to Entities across MDM instances served up by different MDM solutions acting as Linked Data publishers (i.e., expose MDM Entities as RDF resources endowed with de-referencable URIs thereby enabling &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11137b48&quot;&gt;Hyperdata&lt;/a&gt;-style linking) &lt;/li&gt; &lt;li&gt; Use of RDF-ization middleware to hook disparate data sources (&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id13154ae0&quot;&gt;SQL&lt;/a&gt;, XML, and other data sources) into existing MDM packages (i.e., the MDM solutions become consumers of RDF Linked Data).&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; Of course &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13b70e20&quot;&gt;Virtuoso&lt;/a&gt; was designed and developed to deliver the above from day one (circa. 1998 re. the core and 2005 re. the use of RDF for the final mile) as depicted below: &lt;/p&gt; &lt;div&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/images/vconc650.jpg&quot; /&gt; &lt;/div&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=mdm&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id15f8abd8&quot;&gt;Other MDM related posts&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-11-05T18:19:02-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: Some Questions</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-04#1481</atom:id>
  <atom:published>2008-11-04T15:54:42Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Inference: Is it always forward chaining?&lt;/h2&gt; &lt;p&gt;We got a number of questions about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x13c64b60&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s inference support. It seems that we are the odd one out, as we do not take it for granted that inference ought to consist of materializing entailment.&lt;/p&gt; &lt;p&gt;Firstly, of course one can materialize all one wants with Virtuoso. The simplest way to do this is using SPARUL. With the recent transitivity extensions to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x14d17778&quot;&gt;SPARQL&lt;/a&gt;, it is also easy to materialize implications of transitivity with a single statement. Our point is that for trivial entailment such as subclass, sub-property, single transitive property, and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x128e55d0&quot;&gt;owl&lt;/a&gt;:sameAs, we do not require materialization, as we can resolve these at run time also, with backward-chaining built into the engine.&lt;/p&gt; &lt;p&gt;For more complex situations, one needs to materialize the entailment. At the present time, we know how to generalize our transitive feature to run arbitrary backward-chaining rules, including recursive ones. We could have a sort of Datalog backward-chaining embedded in our &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x12614770&quot;&gt;SQL&lt;/a&gt;/SPARQL and could run this with good parallelism, as the transitive feature already works with clustering and partitioning without dying of message latency. Exactly when and how we do this will be seen. Even if users want entailment to be materialized, such a rule system could be used for producing the materialization at good speed.&lt;/p&gt; &lt;p&gt;We had a word with &lt;a href=&quot;http://web.comlab.ox.ac.uk/people/Ian.Horrocks/&quot; id=&quot;link-id117c99d0&quot;&gt;Ian Horrocks&lt;/a&gt; on the question. He noted that it is often naive on behalf of the community to tend to equate description of semantics with description of algorithm. The &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x145b2980&quot;&gt;data&lt;/a&gt; need not always be blown up.&lt;/p&gt; &lt;p&gt;The advantage of not always materializing is that the working set stays better. Once the working set is no longer in memory, response times jump disproportionately. Also, if the data changes or is retracted or is unreliable, one can end up doing a lot of extra work with materialization. Consider the effect of one malicious sameAs statement. This can lead to a lot of effects that are hard to retract. On the other hand, if running in memory with static data such as the LUBM benchmark, the queries run some 20% faster if entailment subclasses and sub-properties are materialized rather than done at run time.&lt;/p&gt; &lt;h2&gt;Genetic Algorithms for SPARQL?&lt;/h2&gt; &lt;p&gt;Our compliments for the wildest idea of the conference go to &lt;a href=&quot;http://www.eyaloren.org/&quot; id=&quot;link-id1a203af8&quot;&gt;Eyal Oren&lt;/a&gt;, &lt;a href=&quot;http://www.few.vu.nl/~cgueret/&quot; id=&quot;link-id16208758&quot;&gt;Christophe Guéret&lt;/a&gt;, and &lt;a href=&quot;http://www.few.vu.nl/~schlobac/&quot; id=&quot;link-id111923e0&quot;&gt;Stefan Schlobach&lt;/a&gt;, &lt;i&gt;et al&lt;/i&gt;, for their &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/conf/semweb/iswc2008.html#OrenGS08&quot; id=&quot;link-id11793540&quot;&gt;paper on using genetic algorithms for guessing how variables in a SPARQL query ought to be instantiated&lt;/a&gt;. Prisoners of our &amp;quot;conventional wisdom&amp;quot; as we are, this might never have occurred to us.&lt;/p&gt; &lt;h2&gt;Schema Last?&lt;/h2&gt; &lt;p&gt;It is interesting to see how the industry comes to the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x12b57e90&quot;&gt;semantic web&lt;/a&gt; conferences talking about schema last while at the same time the traditional semantic web people stress enforcing schema constraints and making more predictably performing and database friendlier logics. So do the extremes converge.&lt;/p&gt; &lt;p&gt;There is a point to schema last. &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x12a8ff48&quot;&gt;RDF&lt;/a&gt; is very good for getting a view of ad hoc or unknown data. One can just load and look at what there is. Also, additions of unforeseen optional properties or relations to the schema are easy and efficient. However, it seems that a really high traffic online application would always benefit from having some application specific data structures. Such could also save considerably in hardware.&lt;/p&gt; &lt;p&gt;It is not a sharp divide between RDF and relational application oriented representation. We have the capabilities in our RDB to RDF mapping. We just need to show this and have SPARUL and data loading&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-04T14:37:01-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: Some Questions</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-04#1479</atom:id>
  <atom:published>2008-11-04T15:54:42Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Inference: Is it always forward chaining?&lt;/h2&gt; &lt;p&gt;We got a number of questions about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x131604a8&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s inference support. It seems that we are the odd one out, as we do not take it for granted that inference ought to consist of materializing entailment.&lt;/p&gt; &lt;p&gt;Firstly, of course one can materialize all one wants with Virtuoso. The simplest way to do this is using SPARUL. With the recent transitivity extensions to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1422f910&quot;&gt;SPARQL&lt;/a&gt;, it is also easy to materialize implications of transitivity with a single statement. Our point is that for trivial entailment such as subclass, sub-property, single transitive property, and &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x145894a8&quot;&gt;owl&lt;/a&gt;:sameAs, we do not require materialization, as we can resolve these at run time also, with backward-chaining built into the engine.&lt;/p&gt; &lt;p&gt;For more complex situations, one needs to materialize the entailment. At the present time, we know how to generalize our transitive feature to run arbitrary backward-chaining rules, including recursive ones. We could have a sort of Datalog backward-chaining embedded in our &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1458a288&quot;&gt;SQL&lt;/a&gt;/SPARQL and could run this with good parallelism, as the transitive feature already works with clustering and partitioning without dying of message latency. Exactly when and how we do this will be seen. Even if users want entailment to be materialized, such a rule system could be used for producing the materialization at good speed.&lt;/p&gt; &lt;p&gt;We had a word with &lt;a href=&quot;http://web.comlab.ox.ac.uk/people/Ian.Horrocks/&quot; id=&quot;link-id117c99d0&quot;&gt;Ian Horrocks&lt;/a&gt; on the question. He noted that it is often naive on behalf of the community to tend to equate description of semantics with description of algorithm. The &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x14cf0b18&quot;&gt;data&lt;/a&gt; need not always be blown up.&lt;/p&gt; &lt;p&gt;The advantage of not always materializing is that the working set stays better. Once the working set is no longer in memory, response times jump disproportionately. Also, if the data changes or is retracted or is unreliable, one can end up doing a lot of extra work with materialization. Consider the effect of one malicious sameAs statement. This can lead to a lot of effects that are hard to retract. On the other hand, if running in memory with static data such as the LUBM benchmark, the queries run some 20% faster if entailment subclasses and sub-properties are materialized rather than done at run time.&lt;/p&gt; &lt;h2&gt;Genetic Algorithms for SPARQL?&lt;/h2&gt; &lt;p&gt;Our compliments for the wildest idea of the conference go to &lt;a href=&quot;http://www.eyaloren.org/&quot; id=&quot;link-id1a203af8&quot;&gt;Eyal Oren&lt;/a&gt;, &lt;a href=&quot;http://www.few.vu.nl/~cgueret/&quot; id=&quot;link-id16208758&quot;&gt;Christophe Guéret&lt;/a&gt;, and &lt;a href=&quot;http://www.few.vu.nl/~schlobac/&quot; id=&quot;link-id111923e0&quot;&gt;Stefan Schlobach&lt;/a&gt;, &lt;i&gt;et al&lt;/i&gt;, for their &lt;a href=&quot;http://www.informatik.uni-trier.de/~ley/db/conf/semweb/iswc2008.html#OrenGS08&quot; id=&quot;link-id11793540&quot;&gt;paper on using genetic algorithms for guessing how variables in a SPARQL query ought to be instantiated&lt;/a&gt;. Prisoners of our &amp;quot;conventional wisdom&amp;quot; as we are, this might never have occurred to us.&lt;/p&gt; &lt;h2&gt;Schema Last?&lt;/h2&gt; &lt;p&gt;It is interesting to see how the industry comes to the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1154c1b0&quot;&gt;semantic web&lt;/a&gt; conferences talking about schema last while at the same time the traditional semantic web people stress enforcing schema constraints and making more predictably performing and database friendlier logics. So do the extremes converge.&lt;/p&gt; &lt;p&gt;There is a point to schema last. &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x14c6a930&quot;&gt;RDF&lt;/a&gt; is very good for getting a view of ad hoc or unknown data. One can just load and look at what there is. Also, additions of unforeseen optional properties or relations to the schema are easy and efficient. However, it seems that a really high traffic online application would always benefit from having some application specific data structures. Such could also save considerably in hardware.&lt;/p&gt; &lt;p&gt;It is not a sharp divide between RDF and relational application oriented representation. We have the capabilities in our RDB to RDF mapping. We just need to show this and have SPARUL and data loading&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-04T14:36:50.000010-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: Billion Triples Challenge</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-04#1480</atom:id>
  <atom:published>2008-11-04T15:52:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;We showed our billion triples demo at the &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x14898200&quot;&gt;ISWC 2008&lt;/a&gt; poster session. Generally people liked what they saw, as we basically did what one always had wanted to do with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x12c56820&quot;&gt;SPARQL&lt;/a&gt; but never could. This means firstly full &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x13a86e38&quot;&gt;SQL&lt;/a&gt; parity, with sub-queries, aggregation, full text, etc. Beyond SQL, we have transitive sub-queries, &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x12842500&quot;&gt;owl&lt;/a&gt;:sameAs at run time, and other inference things, all on demand.&lt;/p&gt; &lt;p&gt;The live demo is at &lt;a href=&quot;http://b3s.openlinksw.com/&quot; id=&quot;link-id14ba36e0&quot;&gt;http://b3s.openlinksw.com/&lt;/a&gt;. This site is under development and may not be on all the time. We are taking it in the direction of hosting the whole &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x14329f58&quot;&gt;LOD&lt;/a&gt; cloud. This is an evolving operation where we will continue showcasing how one can ask increasingly interesting questions from a growing online database, in the spirit of the billion triples charter.&lt;/p&gt; &lt;p&gt;In the words of &lt;a href=&quot;http://www.cs.rpi.edu/~hendler/&quot; id=&quot;link-id111ad740&quot;&gt;Jim Hendler&lt;/a&gt;, we were not selected for the finale because this would have made the challenge a database shootout instead of a more research-oriented event. There is some point to this since if the event becomes like the TPC benchmarks, this will limit the entrance to full time database players. Anyway, we got a special mention in the intro of the challenge track.&lt;/p&gt; &lt;p&gt;The winner was Semaplorer, a federated SPARQL query system. There is some merit to this, as we ourselves are not convinced that centralization is always the right direction. As discussed in the &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id1831cce0&quot;&gt;DARQ Matter of Federation&lt;/a&gt;&lt;/i&gt; post, we have a notion of how to do this production-strength with our cluster engine, now also over wide area networks. We shall see.&lt;/p&gt; &lt;h2&gt;Why Not Just Join?&lt;/h2&gt; &lt;p&gt;The entries from Deri and LARKC (&lt;a href=&quot;http://www.larkc.eu/marvin/&quot; id=&quot;link-id1bb42778&quot;&gt;MaRVIN&lt;/a&gt;, &amp;quot;Massive &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id19c15d30&quot;&gt;RDF&lt;/a&gt; Versatile Inference Network&amp;quot;) were doing materialization of inference results in a cluster environment. The thing they were not doing was joining across partitions. Thus, the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x147fb970&quot;&gt;data&lt;/a&gt; was partitioned on whatever criterion and then the data in each partition was further refined according to rules known to all partitions. Deri did not address joining further.&lt;/p&gt; &lt;p&gt;&amp;quot;Nature shall be the guide of the alchemist,&amp;quot; goes the old adage. We can look at MaRVIN as an example of this dictum. Networks of people are low bandwidth, not nearly fully connected. Asking a colleague for &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x14c02be8&quot;&gt;information&lt;/a&gt; is expensive and subject to misunderstanding; asking another research group might never produce an answer.&lt;/p&gt; &lt;p&gt;Even looking at one individual, we have no reason to think that the human expert would do complete reasoning. Indeed, the brain is a sort of compute cluster, but it does not have flat latency point to point connectivity — some joins are fast; others are not even tried, for all we know.&lt;/p&gt; &lt;p&gt;A database running on a cluster is a sort of counter-example. A database with RDF workload will end up joining across partitions pretty much all of the time.&lt;/p&gt; &lt;p&gt;MaRVIN&amp;#39;s approach to joining could be likened to a country dance: Boys get to take a whirl with different girls according to a complex pattern. For match-making, some matches are produced early but one never knows if the love of a lifetime might be just around the corner. Also, if the dancers are inexperienced, they will have little ability to evaluate how good a match they have with their partner. A few times around the dance floor are needed to get the hang of things.&lt;/p&gt; &lt;p&gt;The question is, at what point will it no longer be possible to join across the database? This depends on the interconnect latency. The higher the latency, the more useful the square-dancing approach becomes.&lt;/p&gt; &lt;p&gt;Another practical consideration is the fact that RDF reasoners are not usually built for distributed memory multiprocessors. If the reasoner must be a plug-in component, then it cannot be expected to be written for grids.&lt;/p&gt; &lt;p&gt;We can think of a product safety use case: Find cosmetics that have ingredients that are considered toxic in the amounts they are present in each product. This can be done as a database query with some transitive operations, like running through a cosmetics taxonomy and a poisons database. If the business logic deciding whether the presence of an ingredient in the product is a health hazard is very complex, we can get a lot of joins.&lt;/p&gt; &lt;p&gt;The MaRVIN way would be to set up a ball where each lipstick and eyeliner dances with every poison and then see if matches are made. The matching logic could be arbitrarily complex since it would run locally. Of course here, some domain &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x14a9f8c0&quot;&gt;knowledge&lt;/a&gt; is needed in order to set up the processing so that each product and poison carry all the associated information with them. Dancing with half a partner can bias one&amp;#39;s perceptions: Again, it is like nature, sometimes not all cards are on the table.&lt;/p&gt; &lt;p&gt;It would seem that there is some setup involved before answering a question: Composition of partitions, frequency of result exchange, etc. How critical the domain knowledge implicit in the setup is for the quality of results is an interesting question.&lt;/p&gt; &lt;p&gt;The question is, at what point will a cluster using &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id0x12b31cf0&quot;&gt;distributed database&lt;/a&gt; operations for inference become impractical? Of course, it is impractical from the get-go if the reasoners and query processors are not made for this. But what if they are? We are presently evaluating different message patterns for joining between partitions. The baseline is some 250,000 random single-triple lookups per second per core. Using a cluster increases this throughput. The increase is more or less linear depending on whether all intermediate results pass via one coordinating node (worst case) or whether each node can decide which other node will do the next join step for each result (best case). For example, a &lt;code&gt;DISTINCT&lt;/code&gt; operation requires that data passes through a single place but &lt;code&gt;JOIN&lt;/code&gt;ing and aggregation in general do not.&lt;/p&gt; &lt;p&gt;We will still publish numbers during this November.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-04T14:36:56-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: Billion Triples Challenge</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-04#1478</atom:id>
  <atom:published>2008-11-04T15:52:11Z</atom:published>
  <atom:content type="html">&lt;p&gt;We showed our billion triples demo at the &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x13a0a520&quot;&gt;ISWC 2008&lt;/a&gt; poster session. Generally people liked what they saw, as we basically did what one always had wanted to do with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x138f5798&quot;&gt;SPARQL&lt;/a&gt; but never could. This means firstly full &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1264a688&quot;&gt;SQL&lt;/a&gt; parity, with sub-queries, aggregation, full text, etc. Beyond SQL, we have transitive sub-queries, &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x1e084138&quot;&gt;owl&lt;/a&gt;:sameAs at run time, and other inference things, all on demand.&lt;/p&gt; &lt;p&gt;The live demo is at &lt;a href=&quot;http://b3s.openlinksw.com/&quot; id=&quot;link-id14ba36e0&quot;&gt;http://b3s.openlinksw.com/&lt;/a&gt;. This site is under development and may not be on all the time. We are taking it in the direction of hosting the whole &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x13355f80&quot;&gt;LOD&lt;/a&gt; cloud. This is an evolving operation where we will continue showcasing how one can ask increasingly interesting questions from a growing online database, in the spirit of the billion triples charter.&lt;/p&gt; &lt;p&gt;In the words of &lt;a href=&quot;http://www.cs.rpi.edu/~hendler/&quot; id=&quot;link-id111ad740&quot;&gt;Jim Hendler&lt;/a&gt;, we were not selected for the finale because this would have made the challenge a database shootout instead of a more research-oriented event. There is some point to this since if the event becomes like the TPC benchmarks, this will limit the entrance to full time database players. Anyway, we got a special mention in the intro of the challenge track.&lt;/p&gt; &lt;p&gt;The winner was Semaplorer, a federated SPARQL query system. There is some merit to this, as we ourselves are not convinced that centralization is always the right direction. As discussed in the &lt;i&gt;&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id1831cce0&quot;&gt;DARQ Matter of Federation&lt;/a&gt;&lt;/i&gt; post, we have a notion of how to do this production-strength with our cluster engine, now also over wide area networks. We shall see.&lt;/p&gt; &lt;h2&gt;Why Not Just Join?&lt;/h2&gt; &lt;p&gt;The entries from Deri and LARKC (&lt;a href=&quot;http://www.larkc.eu/marvin/&quot; id=&quot;link-id1bb42778&quot;&gt;MaRVIN&lt;/a&gt;, &amp;quot;Massive &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id19c15d30&quot;&gt;RDF&lt;/a&gt; Versatile Inference Network&amp;quot;) were doing materialization of inference results in a cluster environment. The thing they were not doing was joining across partitions. Thus, the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d3c1a38&quot;&gt;data&lt;/a&gt; was partitioned on whatever criterion and then the data in each partition was further refined according to rules known to all partitions. Deri did not address joining further.&lt;/p&gt; &lt;p&gt;&amp;quot;Nature shall be the guide of the alchemist,&amp;quot; goes the old adage. We can look at MaRVIN as an example of this dictum. Networks of people are low bandwidth, not nearly fully connected. Asking a colleague for &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x125dd698&quot;&gt;information&lt;/a&gt; is expensive and subject to misunderstanding; asking another research group might never produce an answer.&lt;/p&gt; &lt;p&gt;Even looking at one individual, we have no reason to think that the human expert would do complete reasoning. Indeed, the brain is a sort of compute cluster, but it does not have flat latency point to point connectivity — some joins are fast; others are not even tried, for all we know.&lt;/p&gt; &lt;p&gt;A database running on a cluster is a sort of counter-example. A database with RDF workload will end up joining across partitions pretty much all of the time.&lt;/p&gt; &lt;p&gt;MaRVIN&amp;#39;s approach to joining could be likened to a country dance: Boys get to take a whirl with different girls according to a complex pattern. For match-making, some matches are produced early but one never knows if the love of a lifetime might be just around the corner. Also, if the dancers are inexperienced, they will have little ability to evaluate how good a match they have with their partner. A few times around the dance floor are needed to get the hang of things.&lt;/p&gt; &lt;p&gt;The question is, at what point will it no longer be possible to join across the database? This depends on the interconnect latency. The higher the latency, the more useful the square-dancing approach becomes.&lt;/p&gt; &lt;p&gt;Another practical consideration is the fact that RDF reasoners are not usually built for distributed memory multiprocessors. If the reasoner must be a plug-in component, then it cannot be expected to be written for grids.&lt;/p&gt; &lt;p&gt;We can think of a product safety use case: Find cosmetics that have ingredients that are considered toxic in the amounts they are present in each product. This can be done as a database query with some transitive operations, like running through a cosmetics taxonomy and a poisons database. If the business logic deciding whether the presence of an ingredient in the product is a health hazard is very complex, we can get a lot of joins.&lt;/p&gt; &lt;p&gt;The MaRVIN way would be to set up a ball where each lipstick and eyeliner dances with every poison and then see if matches are made. The matching logic could be arbitrarily complex since it would run locally. Of course here, some domain &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x133b84b8&quot;&gt;knowledge&lt;/a&gt; is needed in order to set up the processing so that each product and poison carry all the associated information with them. Dancing with half a partner can bias one&amp;#39;s perceptions: Again, it is like nature, sometimes not all cards are on the table.&lt;/p&gt; &lt;p&gt;It would seem that there is some setup involved before answering a question: Composition of partitions, frequency of result exchange, etc. How critical the domain knowledge implicit in the setup is for the quality of results is an interesting question.&lt;/p&gt; &lt;p&gt;The question is, at what point will a cluster using &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id0x1466c1c0&quot;&gt;distributed database&lt;/a&gt; operations for inference become impractical? Of course, it is impractical from the get-go if the reasoners and query processors are not made for this. But what if they are? We are presently evaluating different message patterns for joining between partitions. The baseline is some 250,000 random single-triple lookups per second per core. Using a cluster increases this throughput. The increase is more or less linear depending on whether all intermediate results pass via one coordinating node (worst case) or whether each node can decide which other node will do the next join step for each result (best case). For example, a &lt;code&gt;DISTINCT&lt;/code&gt; operation requires that data passes through a single place but &lt;code&gt;JOIN&lt;/code&gt;ing and aggregation in general do not.&lt;/p&gt; &lt;p&gt;We will still publish numbers during this November.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:23:25.633905-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: RDB2RDF Face-to-Face</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-04#1477</atom:id>
  <atom:published>2008-11-04T13:26:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;The W3C&amp;#39;s RDB-to-&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x153bdcf8&quot;&gt;RDF&lt;/a&gt; mapping incubator group (&lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x13e3e6b8&quot;&gt;RDB2RDF XG&lt;/a&gt;) met in &lt;a href=&quot;http://dbpedia.org/resource/Karlsruhe&quot; id=&quot;link-id0x15236b08&quot;&gt;Karlsruhe&lt;/a&gt; after &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x2450fba8&quot;&gt;ISWC 2008&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The meeting was about writing a charter for a working group that would define a standard for mapping relational databases to RDF, either for purposes of import into RDF stores or of query mapping from &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x14c84338&quot;&gt;SPARQL&lt;/a&gt; to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x146db368&quot;&gt;SQL&lt;/a&gt;. There was a lot of agreement and the meeting even finished ahead of the allotted time.&lt;/p&gt; &lt;h2&gt;Whose Identifiers?&lt;/h2&gt; &lt;p&gt;There was discussion concerning using the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x12c15e58&quot;&gt;Entity&lt;/a&gt; Name Service from the Okkam project for assigning URIs to entities mapped from relational databases. This makes sense when talking about long-lived, legal entities, such as people or companies or geography. Of course, there are cases where this makes no sense; for example, a purchase order or maintenance call hardly needs an identifier registered with the ENS. The problem is, in practice, a CRM could mention customers that have an ENS registered ID (or even several such IDs) and others that have none. Of course, the CRM&amp;#39;s reference cannot depend on any registration. Also, even when there is a stable &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x12b7b5c0&quot;&gt;URI&lt;/a&gt; for the entity, a CRM may need a key that specifies some administrative subdivision of the customer.&lt;/p&gt; &lt;p&gt;Also we note that an on-demand RDB-to-RDF mapping may have some trouble dealing with &amp;quot;same as&amp;quot; assertions. If names that are anything other than string forms of the keys in the system must be returned, there will have to be a lookup added to the RDB. This is an administrative issue. Certainly going over the network to ask for names of items returned by queries has a prohibitive cost. It would be good for ad hoc integration to use shared URIs when possible. The trouble of adding and maintaining lookups for these, however, makes this more expensive than just mapping to RDF and using literals for joining between independently maintained systems.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x14bf7da0&quot;&gt;XML&lt;/a&gt; or RDF?&lt;/h2&gt; &lt;p&gt;We talked about having a language for human consumption and another for discovery and machine processing of mappings. Would this latter be XML or RDF based? Describing every detail of syntax for a mapping as RDF is really tedious. Also such descriptions are very hard to query, just as &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x1493ffc0&quot;&gt;OWL&lt;/a&gt; ontologies are. One solution is to have opaque strings embedded into RDF, just like XSLT has &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x1400fe98&quot;&gt;XPath&lt;/a&gt; in string form embedded into XML. Maybe it will end up in this way here also. Having a complete XML mapping of the parse tree for mappings, XQueryX-style, could be nice for automatic generation of mappings with XSLT from an XML view of the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x14c846d8&quot;&gt;information&lt;/a&gt; schema. But then XSLT can also produce text, so an XML syntax that has every detail of a mapping language as distinct elements is not really necessary for this.&lt;/p&gt; &lt;p&gt;Another matter is then describing the RDF generated by the mapping in terms of RDFS or OWL. This would be a by-product of declaring the mapping. Most often, I would presume the target ontology to be given, though, reducing the need for this feature. But if RDF mapping is used for discovery of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x14f6f128&quot;&gt;data&lt;/a&gt;, such a description of the exposed data is essential.&lt;/p&gt; &lt;h2&gt;Interoperability&lt;/h2&gt; &lt;p&gt;We agreed with &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x1e776730&quot;&gt;Sören Auer&lt;/a&gt; that we could make &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1477ad18&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s mapping language compatible with &lt;a href=&quot;http://triplify.org/&quot; id=&quot;link-id0x15514388&quot;&gt;Triplify&lt;/a&gt;. Triplify is very simple, extraction only, no SPARQL, but does have the benefit of expressing everything in SQL. As it happens, I would be the last person to tell a web developer what language to program in. So if it is SQL, then let it stay SQL. Technically, a lot of the information the Virtuoso mapping expresses is contained in the Triplify SQL statements, but not all. Some extra declarations are needed still but can have reasonable defaults.&lt;/p&gt; &lt;p&gt;There are two ways of stating a mapping. Virtuoso starts with the triple and says which tables and columns will produce the triple. Triplify starts with the SQL statement and says what triples it produces. These are fairly equivalent. For the web developer, the latter is likely more self-evident, while the former may be more compact and have less repetition.&lt;/p&gt; &lt;p&gt;Virtuoso and Triplify alone would give us the two interoperable implementations required from a working group, supposing the language were annotations on top of SQL. This would be a guarantee of delivery, as we would be close enough to the result from the get go.&lt;/p&gt; &lt;h2&gt;Related Web resources&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSSQL2RDF&quot; id=&quot;link-id14e27040&quot;&gt;OpenLink Virtuoso: Open-Source Edition: Mapping SQL Data to RDF&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/pdf/Virtuoso_SQL_to_RDF_Mapping.pdf&quot; id=&quot;link-id1baad3a8&quot;&gt;Virtuoso RDF Views — Getting Started Guide (PDF)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-11-04T17:20:35-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: RDB2RDF Face-to-Face</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-04#1476</atom:id>
  <atom:published>2008-11-04T13:26:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;The W3C&amp;#39;s RDB-to-&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x141f0470&quot;&gt;RDF&lt;/a&gt; mapping incubator group (&lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x13b8d018&quot;&gt;RDB2RDF XG&lt;/a&gt;) met in &lt;a href=&quot;http://dbpedia.org/resource/Karlsruhe&quot; id=&quot;link-id0x1e748060&quot;&gt;Karlsruhe&lt;/a&gt; after &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x1eba8468&quot;&gt;ISWC 2008&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The meeting was about writing a charter for a working group that would define a standard for mapping relational databases to RDF, either for purposes of import into RDF stores or of query mapping from &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1e5abe10&quot;&gt;SPARQL&lt;/a&gt; to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x13930368&quot;&gt;SQL&lt;/a&gt;. There was a lot of agreement and the meeting even finished ahead of the allotted time.&lt;/p&gt; &lt;h2&gt;Whose Identifiers?&lt;/h2&gt; &lt;p&gt;There was discussion concerning using the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x15587978&quot;&gt;Entity&lt;/a&gt; Name Service from the Okkam project for assigning URIs to entities mapped from relational databases. This makes sense when talking about long-lived, legal entities, such as people or companies or geography. Of course, there are cases where this makes no sense; for example, a purchase order or maintenance call hardly needs an identifier registered with the ENS. The problem is, in practice, a CRM could mention customers that have an ENS registered ID (or even several such IDs) and others that have none. Of course, the CRM&amp;#39;s reference cannot depend on any registration. Also, even when there is a stable &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x144660f8&quot;&gt;URI&lt;/a&gt; for the entity, a CRM may need a key that specifies some administrative subdivision of the customer.&lt;/p&gt; &lt;p&gt;Also we note that an on-demand RDB-to-RDF mapping may have some trouble dealing with &amp;quot;same as&amp;quot; assertions. If names that are anything other than string forms of the keys in the system must be returned, there will have to be a lookup added to the RDB. This is an administrative issue. Certainly going over the network to ask for names of items returned by queries has a prohibitive cost. It would be good for ad hoc integration to use shared URIs when possible. The trouble of adding and maintaining lookups for these, however, makes this more expensive than just mapping to RDF and using literals for joining between independently maintained systems.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1edb8170&quot;&gt;XML&lt;/a&gt; or RDF?&lt;/h2&gt; &lt;p&gt;We talked about having a language for human consumption and another for discovery and machine processing of mappings. Would this latter be XML or RDF based? Describing every detail of syntax for a mapping as RDF is really tedious. Also such descriptions are very hard to query, just as &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x2450fba8&quot;&gt;OWL&lt;/a&gt; ontologies are. One solution is to have opaque strings embedded into RDF, just like XSLT has &lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x234e5478&quot;&gt;XPath&lt;/a&gt; in string form embedded into XML. Maybe it will end up in this way here also. Having a complete XML mapping of the parse tree for mappings, XQueryX-style, could be nice for automatic generation of mappings with XSLT from an XML view of the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x22e129f8&quot;&gt;information&lt;/a&gt; schema. But then XSLT can also produce text, so an XML syntax that has every detail of a mapping language as distinct elements is not really necessary for this.&lt;/p&gt; &lt;p&gt;Another matter is then describing the RDF generated by the mapping in terms of RDFS or OWL. This would be a by-product of declaring the mapping. Most often, I would presume the target ontology to be given, though, reducing the need for this feature. But if RDF mapping is used for discovery of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x155139c0&quot;&gt;data&lt;/a&gt;, such a description of the exposed data is essential.&lt;/p&gt; &lt;h2&gt;Interoperability&lt;/h2&gt; &lt;p&gt;We agreed with &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x132a64e0&quot;&gt;Sören Auer&lt;/a&gt; that we could make &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1272c988&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s mapping language compatible with &lt;a href=&quot;http://triplify.org/&quot; id=&quot;link-id0x12622738&quot;&gt;Triplify&lt;/a&gt;. Triplify is very simple, extraction only, no SPARQL, but does have the benefit of expressing everything in SQL. As it happens, I would be the last person to tell a web developer what language to program in. So if it is SQL, then let it stay SQL. Technically, a lot of the information the Virtuoso mapping expresses is contained in the Triplify SQL statements, but not all. Some extra declarations are needed still but can have reasonable defaults.&lt;/p&gt; &lt;p&gt;There are two ways of stating a mapping. Virtuoso starts with the triple and says which tables and columns will produce the triple. Triplify starts with the SQL statement and says what triples it produces. These are fairly equivalent. For the web developer, the latter is likely more self-evident, while the former may be more compact and have less repetition.&lt;/p&gt; &lt;p&gt;Virtuoso and Triplify alone would give us the two interoperable implementations required from a working group, supposing the language were annotations on top of SQL. This would be a guarantee of delivery, as we would be close enough to the result from the get go.&lt;/p&gt; &lt;h2&gt;Related Web resources&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSSQL2RDF&quot; id=&quot;link-id14e27040&quot;&gt;OpenLink Virtuoso: Open-Source Edition: Mapping SQL Data to RDF&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/pdf/Virtuoso_SQL_to_RDF_Mapping.pdf&quot; id=&quot;link-id1baad3a8&quot;&gt;Virtuoso RDF Views — Getting Started Guide (PDF)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-11-04T17:20:30.000002-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>YODA &amp; the Data FORCE</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-03#1474</atom:id>
  <atom:published>2008-11-03T17:32:49Z</atom:published>
  <atom:content type="html">&lt;p&gt; The original &lt;a href=&quot;http://www.w3.org/History/1989/proposal.html&quot; id=&quot;link-id13b25ba8&quot;&gt;design document&lt;/a&gt; (by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id181e4c70&quot;&gt;TimBL&lt;/a&gt;) that lead to the WWW (*an important read*) was very clear about the need to create an &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id10f23918&quot;&gt;information&lt;/a&gt; space&amp;quot; that connects heterogeneous &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; sources. Unfortunately, in trying to create a moniker to distinguish one aspect of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; (the Linked Document Web) from the part that was overlooked (the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11096818&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1b9c6b98&quot;&gt;Web&lt;/a&gt;), we ended up with a project code name that&amp;#39;s fundamentally a misnomer in the form of: &amp;quot;The &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10ffe228&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot;.&lt;/p&gt; &lt;p&gt; If we could just take &amp;quot;The Semantic Web&amp;quot; moniker for what it was -- a code name for an aspect of the Web -- and move on, things will get much clearer, fast!&lt;/p&gt; &lt;p&gt; Basically, what is/was the &amp;quot;Semantic Web&amp;quot; should really have been code named: (&amp;quot;You&amp;quot; Oriented Data Access) as a play on: Yoda&amp;#39;s appreciation of the FORCE (Fact ORiented Connected Entities) -- the power of inter galactic, interlinked, structured data, fashioned by the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id191b22e0&quot;&gt;World Wide Web&lt;/a&gt; courtesy of the HTTP protocol.&lt;/p&gt; &lt;div&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://motivationalspeaker1.files.wordpress.com/2008/03/yoda.jpg&quot; /&gt; &lt;/div&gt; &lt;p&gt; As stated in a earlier post, the next phase of the Web is all about the magic of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1a7395f0&quot;&gt;entity&lt;/a&gt; &amp;quot;You&amp;quot;. The single most important item of reference to every Web user would be the Person Entity &lt;a href=&quot;http://dbpedia.org/resource/Identity_%28object-oriented_programming%29&quot; id=&quot;link-id16ab9308&quot;&gt;ID&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1d403c88&quot;&gt;URI&lt;/a&gt;). Just by remembering your Entity ID, you will have intelligent pathways across, and into, the FORCE that the Linked Data Web delivers. The quality of the pathways and increased density of the FORCE are the keys to high &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1442&quot; id=&quot;link-id1c549b28&quot;&gt;SDQ&lt;/a&gt; (tomorrows SEO). Thus, the SDQ of URIs will ultimately be the unit determinant of value to Web Users, along the following personal lines, hence the critical platform questions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Does your platform give &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id175afe00&quot;&gt;me&lt;/a&gt; Identity (a URI) with high SDQ?&lt;/li&gt; &lt;li&gt; Do the Data Source Names (URIs) in your Data Spaces deliver high SDQ?&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; While most industry commentators continue to ponder and pontificate about what &amp;quot;The Semantic Web&amp;quot; is (unfortunately), the real thing (the &amp;quot;FORCE&amp;quot;) is already here, and self-enhancing rapidly.&lt;/p&gt; &lt;p&gt; Assuming we now accept the FORCE is simply an RDF based Linked Data moniker, and that RDF Linked Data is all about the Web as a structured database, we should start to move our attention over to practical exploitation of this burgeoning global database, and in doing so we should not discard &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id19e2c6e0&quot;&gt;knowledge&lt;/a&gt; from the past such as the many great examples available gratis from the Relational Database realm. For instance, we should start paying attention to the discovery, development, and deployment of high level tools such as query builders, report writers, and intelligence oriented analytic tools, none of which should -- at first point of interaction -- expose raw RDF or the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id117921f0&quot;&gt;SPARQL&lt;/a&gt; query language. Along similar lines of thinking, we also need development environments and frameworks that are counterparts to Visual Studio, ACCESS, File Maker, and the like.&lt;/p&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1458&quot; id=&quot;link-id1cec1a40&quot;&gt;Numerati &amp;amp; The Magic of You!&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-07-20T13:53:06-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Entity Oriented Data Access</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-03#1475</atom:id>
  <atom:published>2008-11-03T17:32:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;Recent &lt;a href=&quot;http://en.wiktionary.org/wiki/perturbation&quot; id=&quot;link-id1bdb9ec8&quot;&gt;perturbations&lt;/a&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Access and Data Management technology realms are clear signs of an imminent inflection. In a nutshell, the focus of data access is moving from the &amp;quot;Logical Level&amp;quot; (what you see if you&amp;#39;ve ever looked at a DBMS schema derived from an &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id18735f38&quot;&gt;Entity&lt;/a&gt; Data Model) to the &amp;quot;Conceptual Level&amp;quot; (i.e., the Entity Model becoming concrete).&lt;/p&gt; &lt;p&gt;In recent times I&amp;#39;ve stumbled across Master Data Management (MDM) which is all about entities that provide holistic views of enterprise data (or what I call: &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id18f07ec8&quot;&gt;Context&lt;/a&gt; Lenses). I&amp;#39;ve also stumbled across emerging tensions in the .NET realm between Linq to Entities and Linq to &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id19429e88&quot;&gt;SQL&lt;/a&gt;, where in either case the fundamental issues comes down to the optimal paths &amp;quot;Conceptual Level Access&amp;quot; over the &amp;quot;Logical Logical Level&amp;quot; when dealing with data access in the .NET realm.&lt;/p&gt; &lt;p&gt; Strangely, the emerging realm of RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id115b3780&quot;&gt;Linked Data&lt;/a&gt;, MDM, and .NET&amp;#39;s Entity Frameworks, remain strangely disconnected.&lt;/p&gt; &lt;p&gt;Another oddity is the obvious, but barely acknowledged, blurring of the lines between the &amp;quot;traditional enterprise employee&amp;quot; and the &amp;quot;individual &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Netizen&quot; id=&quot;link-id0x1ffd8640&quot;&gt;netizen&lt;/a&gt;&amp;quot;. The fusion between these entities is one of the most defining characteristics of how the Web is reshaping the data landscape.&lt;/p&gt; &lt;p&gt;At the current time, I tend to crystalize my data access world view under the moniker: &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1474&quot; id=&quot;link-id1544ee60&quot;&gt;YODA&lt;/a&gt; (&amp;quot;You&amp;quot; Oriented Data Access), based on the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Entities are the new focal point of data access, management, and integration &lt;/li&gt; &lt;li&gt; &amp;quot;You&amp;quot; are the entry point (Data Source Name) into this new realm of inter connected Entities that the Web exposes&lt;/li&gt; &lt;li&gt; &amp;quot;You&amp;quot; the &amp;quot;Person&amp;quot; Entity is associated with many other &amp;quot;Things&amp;quot; such as &amp;quot;Organizations&amp;quot;, &amp;quot;Other People&amp;quot;, &amp;quot;Books&amp;quot;, &amp;quot;Music&amp;quot;, &amp;quot;Subject Matter&amp;quot; etc. &lt;/li&gt; &lt;li&gt; &amp;quot;You&amp;quot; the &amp;quot;Person&amp;quot; needs Identity in this new global database, which is why &amp;quot;You&amp;quot; need to Identify &amp;quot;Yourself&amp;quot; using an an HTTP based Entity &lt;a href=&quot;http://dbpedia.org/resource/Identity_%28object-oriented_programming%29&quot; id=&quot;link-id145d0438&quot;&gt;ID&lt;/a&gt; (aka. &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1873ad08&quot;&gt;URI&lt;/a&gt;) &lt;/li&gt; &lt;li&gt; When &amp;quot;You&amp;quot; have an ID for &amp;quot;Yourself&amp;quot; it becomes much easier for the essence of &amp;quot;You&amp;quot; to be discovered via the Web &lt;/li&gt; &lt;li&gt; When &amp;quot;Others&amp;quot; have IDs for &amp;quot;Themselves&amp;quot; on the Web it becomes much easier for &amp;quot;You&amp;quot; to serendipitously discover or explicitly &amp;quot;Find&amp;quot; things on the Web. &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.infoq.com/news/2008/11/DLINQ-Future&quot; id=&quot;link-id17501eb0&quot;&gt;Is LINQ to SQL truly dead?&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1420&quot; id=&quot;link-id10fbf920&quot;&gt;Virtuoso, Linked Data, and Linq2Rdf&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1224&quot; id=&quot;link-id19c44b00&quot;&gt;Enterprise 0.0, Linked Data, and the Semantic Data Web&lt;/a&gt; (*an old post*)&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-11-03T22:51:48-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: The Scalable Knowledge Systems Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-03#1473</atom:id>
  <atom:published>2008-11-03T13:16:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;Mike Dean of &lt;a href=&quot;http://dbpedia.org/resource/BBN_Technologies&quot; id=&quot;link-id0x25699878&quot;&gt;BBN Technologies&lt;/a&gt; opened the Scalable &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1ed01750&quot;&gt;Knowledge&lt;/a&gt; Systems Workshop with an invited talk. He reminded us of the facts of nature as concern the cost of distributed computing and running out of space for the working set. Developers in the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x21fbb9a8&quot;&gt;semantic web&lt;/a&gt; field deplorably often ignore these facts, or alternatively recognize them and admit that they are unbeatable, that one just can&amp;#39;t join across partitions.&lt;/p&gt; &lt;p&gt;I gave a talk about the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x20b6e020&quot;&gt;Virtuoso&lt;/a&gt; Cluster edition, wherein I repeated essentially the same ground facts as Mike and outlined how we (in spite of these) profit from distributed memory multiprocessing. To those not intimate with these questions, let me affirm that deriving benefit from threading in a symmetric multiprocessor box, let alone a cluster connected by a network, totally depends on having many relatively long running things going at a time and blocking as seldom as possible.&lt;/p&gt; &lt;p&gt;Further, Mike Dean talked about &lt;a href=&quot;http://www.asio.bbn.com/&quot; id=&quot;link-id0x222252f0&quot;&gt;ASIO&lt;/a&gt;, the BBN suite of semantic web tools. His most challenging statement was about the storage engine, a network-database-inspired triple-store using memory-mapped files. &lt;/p&gt; &lt;p&gt;Will the &lt;a href=&quot;http://dbpedia.org/resource/CODASYL&quot; id=&quot;link-id0x222d8730&quot;&gt;CODASYL&lt;/a&gt; days come back, and will the linked list on disk be the way to store triples/quads? I would say that this will have, especially with a memory-mapped file, probably a better best-case as a B-tree but that this also will be less predictable with fragmentation. With Virtuoso, using a B-tree index, we see about 20-30% of CPU time spent on index lookup when running LUBM queries. With a disk-based memory-mapped linked-list storage, we would see some improvements in this while getting hit probably worse than now in the case of fragmentation. Plus compaction on the fly would not be nearly as easy and surely far less local, if there were pointers between pages. So it is my intuition that trees are a safer bet with varying workloads while linked lists can be faster in a query-dominated in-memory situation.&lt;/p&gt; &lt;p&gt;Chris Bizer presented the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x22e41c40&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1c909960&quot;&gt;BSBM&lt;/a&gt;), which has already been discussed here in some detail. He did acknowledge that the next round of the race must have a real steady-state rule. This just means that the benchmark must be run long enough for the system under test to reach a state where the cache is full and the performance remains indefinitely at the same level. Reaching steady state can take 20-30 minutes in some cases.&lt;/p&gt; &lt;p&gt;Regardless of steady state, BSBM has two generally valid conclusions: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;mapping relational to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x21d01890&quot;&gt;RDF&lt;/a&gt;, where possible, is faster than triple storage; and &lt;/li&gt; &lt;li&gt;the equivalent relational solution can be some 10x faster than the pure triples representation.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Mike Dean asked whether BSBM was a case of a setup to have triple stores fail. Not necessarily, I would say; we should understand that one motivation of BSBM is testing mapping technologies. Therefore it must have a workload where mapping makes sense. Of course there are workloads where triples are unchallenged — take the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1feb9250&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1fe12b60&quot;&gt;data&lt;/a&gt; set for one.&lt;/p&gt; &lt;p&gt;Also, with BSBM, once should note that the query optimization time plays a fairly large role since most queries touch relatively little data. Also, even if the scale is large, the working set is not nearly the size of the database. This in fact penalizes mapping technologies against native &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e275c88&quot;&gt;SQL&lt;/a&gt; since the difference there is compiling the query, especially since parameters are not used. So, Chris, since we both like to map, let&amp;#39;s make a benchmark that shows mapping closer to native SQL.&lt;/p&gt; &lt;h2&gt;Bridging the 10x Gap?&lt;/h2&gt; &lt;p&gt;When we run Virtuoso relational against Virtuoso triple store with the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x22046d88&quot;&gt;TPC-H&lt;/a&gt; workload, we see that the relational case is significantly faster. These are long queries, thus query optimization time is negligible; we are here comparing memory-based access times. Why is this? The answer is that a single index lookup gives multiple column values with almost no penalty for the extra column. Also, since the number of total joins is lower, the overhead coming from moving from join to next join is likewise lower. This is just a meter of count of executed instructions.&lt;/p&gt; &lt;p&gt;A column store joins in principle just as much as a triple store. However, since the BI workload often consists of scanning over large tables, the joins tend to be local, the needed lookup can often use the previous location as a starting point. A triple store can do the same if queries have high locality. We do this in some SQL situations and can try this with triples also. The RDF workload is typically more random in its access pattern, though. The other factor is the length of control path. A column store has a simpler control flow if it knows that the column will have exactly one value per row. With RDF, this is not a given. Also, the column store&amp;#39;s row is identified by a single number and not a multipart key. These two factors give the column store running with a fixed schema some edge over the more generic RDF quad store.&lt;/p&gt; &lt;p&gt;There was some discussion on how much closer a triple store could come to a relational one. Some gains are undoubtedly possible. We will see. For the ideal row store workload, the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x22f837c0&quot;&gt;RDBMS&lt;/a&gt; will continue to have some edge. Large online systems typically have a large part of the workload that is simple and repetitive. There is nothing to prevent one having special indices for supporting such workload, even while retaining the possibility of arbitrary triples elsewhere. Some degree of application-specific data structure does make sense. We just need to show how this is done. In this way, we have a continuum and not an either/or choice of triples vs. tables.&lt;/p&gt; &lt;h2&gt;Scale, Where Next?&lt;/h2&gt; &lt;p&gt;Concerning the future direction of the workshop, there were a few directions suggested. One of the more interesting ones was Mike Dean&amp;#39;s suggestion about dealing with a large volume of same-as assertions, specifically a volume where materializing all the entailed triples was no longer practical. Of course, there is the question of scale. This time, we were the only ones focusing on a parallel database with no restrictions on joining.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-03T12:33:54-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008: The Scalable Knowledge Systems Workshop</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-03#1471</atom:id>
  <atom:published>2008-11-03T13:16:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;Mike Dean of &lt;a href=&quot;http://dbpedia.org/resource/BBN_Technologies&quot; id=&quot;link-id0x21d04768&quot;&gt;BBN Technologies&lt;/a&gt; opened the Scalable &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x22348c58&quot;&gt;Knowledge&lt;/a&gt; Systems Workshop with an invited talk. He reminded us of the facts of nature as concern the cost of distributed computing and running out of space for the working set. Developers in the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x22570328&quot;&gt;semantic web&lt;/a&gt; field deplorably often ignore these facts, or alternatively recognize them and admit that they are unbeatable, that one just can&amp;#39;t join across partitions.&lt;/p&gt; &lt;p&gt;I gave a talk about the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x23f313f0&quot;&gt;Virtuoso&lt;/a&gt; Cluster edition, wherein I repeated essentially the same ground facts as Mike and outlined how we (in spite of these) profit from distributed memory multiprocessing. To those not intimate with these questions, let me affirm that deriving benefit from threading in a symmetric multiprocessor box, let alone a cluster connected by a network, totally depends on having many relatively long running things going at a time and blocking as seldom as possible.&lt;/p&gt; &lt;p&gt;Further, Mike Dean talked about &lt;a href=&quot;http://www.asio.bbn.com/&quot; id=&quot;link-id0x1d74c108&quot;&gt;ASIO&lt;/a&gt;, the BBN suite of semantic web tools. His most challenging statement was about the storage engine, a network-database-inspired triple-store using memory-mapped files. &lt;/p&gt; &lt;p&gt;Will the &lt;a href=&quot;http://dbpedia.org/resource/CODASYL&quot; id=&quot;link-id0x1f8ee860&quot;&gt;CODASYL&lt;/a&gt; days come back, and will the linked list on disk be the way to store triples/quads? I would say that this will have, especially with a memory-mapped file, probably a better best-case as a B-tree but that this also will be less predictable with fragmentation. With Virtuoso, using a B-tree index, we see about 20-30% of CPU time spent on index lookup when running LUBM queries. With a disk-based memory-mapped linked-list storage, we would see some improvements in this while getting hit probably worse than now in the case of fragmentation. Plus compaction on the fly would not be nearly as easy and surely far less local, if there were pointers between pages. So it is my intuition that trees are a safer bet with varying workloads while linked lists can be faster in a query-dominated in-memory situation.&lt;/p&gt; &lt;p&gt;Chris Bizer presented the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1d670da0&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x21928808&quot;&gt;BSBM&lt;/a&gt;), which has already been discussed here in some detail. He did acknowledge that the next round of the race must have a real steady-state rule. This just means that the benchmark must be run long enough for the system under test to reach a state where the cache is full and the performance remains indefinitely at the same level. Reaching steady state can take 20-30 minutes in some cases.&lt;/p&gt; &lt;p&gt;Regardless of steady state, BSBM has two generally valid conclusions: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;mapping relational to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xab811020&quot;&gt;RDF&lt;/a&gt;, where possible, is faster than triple storage; and &lt;/li&gt; &lt;li&gt;the equivalent relational solution can be some 10x faster than the pure triples representation.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Mike Dean asked whether BSBM was a case of a setup to have triple stores fail. Not necessarily, I would say; we should understand that one motivation of BSBM is testing mapping technologies. Therefore it must have a workload where mapping makes sense. Of course there are workloads where triples are unchallenged — take the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x2538c3b8&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1d673760&quot;&gt;data&lt;/a&gt; set for one.&lt;/p&gt; &lt;p&gt;Also, with BSBM, once should note that the query optimization time plays a fairly large role since most queries touch relatively little data. Also, even if the scale is large, the working set is not nearly the size of the database. This in fact penalizes mapping technologies against native &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xac16cc10&quot;&gt;SQL&lt;/a&gt; since the difference there is compiling the query, especially since parameters are not used. So, Chris, since we both like to map, let&amp;#39;s make a benchmark that shows mapping closer to native SQL.&lt;/p&gt; &lt;h2&gt;Bridging the 10x Gap?&lt;/h2&gt; &lt;p&gt;When we run Virtuoso relational against Virtuoso triple store with the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1d7dc518&quot;&gt;TPC-H&lt;/a&gt; workload, we see that the relational case is significantly faster. These are long queries, thus query optimization time is negligible; we are here comparing memory-based access times. Why is this? The answer is that a single index lookup gives multiple column values with almost no penalty for the extra column. Also, since the number of total joins is lower, the overhead coming from moving from join to next join is likewise lower. This is just a meter of count of executed instructions.&lt;/p&gt; &lt;p&gt;A column store joins in principle just as much as a triple store. However, since the BI workload often consists of scanning over large tables, the joins tend to be local, the needed lookup can often use the previous location as a starting point. A triple store can do the same if queries have high locality. We do this in some SQL situations and can try this with triples also. The RDF workload is typically more random in its access pattern, though. The other factor is the length of control path. A column store has a simpler control flow if it knows that the column will have exactly one value per row. With RDF, this is not a given. Also, the column store&amp;#39;s row is identified by a single number and not a multipart key. These two factors give the column store running with a fixed schema some edge over the more generic RDF quad store.&lt;/p&gt; &lt;p&gt;There was some discussion on how much closer a triple store could come to a relational one. Some gains are undoubtedly possible. We will see. For the ideal row store workload, the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x22e5b6f8&quot;&gt;RDBMS&lt;/a&gt; will continue to have some edge. Large online systems typically have a large part of the workload that is simple and repetitive. There is nothing to prevent one having special indices for supporting such workload, even while retaining the possibility of arbitrary triples elsewhere. Some degree of application-specific data structure does make sense. We just need to show how this is done. In this way, we have a continuum and not an either/or choice of triples vs. tables.&lt;/p&gt; &lt;h2&gt;Scale, Where Next?&lt;/h2&gt; &lt;p&gt;Concerning the future direction of the workshop, there were a few directions suggested. One of the more interesting ones was Mike Dean&amp;#39;s suggestion about dealing with a large volume of same-as assertions, specifically a volume where materializing all the entailed triples was no longer practical. Of course, there is the question of scale. This time, we were the only ones focusing on a parallel database with no restrictions on joining.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-03T12:33:49-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008 Conference reports</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-11-03#1472</atom:id>
  <atom:published>2008-11-03T13:12:18Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the next few posts, I will talk about the &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x1154d6a8&quot;&gt;ISWC 2008&lt;/a&gt; conference of last week in &lt;a href=&quot;http://dbpedia.org/resource/Karlsruhe&quot; id=&quot;link-id0x139eec40&quot;&gt;Karlsruhe&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x138b5dc8&quot;&gt;Germany&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;For us, this is divided into&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Workshop on scalable &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x23561d00&quot;&gt;knowledge&lt;/a&gt; systems&lt;/li&gt; &lt;li&gt;General Conference &lt;/li&gt; &lt;li&gt;The &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x127a0d88&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;/li&gt; &lt;li&gt;The W3C &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x212e2390&quot;&gt;RDB2RDF XG&lt;/a&gt; Face-to-Face&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I will talk about each in turn.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-03T09:33:06.000004-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ISWC 2008 Conference reports</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-11-03#1470</atom:id>
  <atom:published>2008-11-03T13:12:18Z</atom:published>
  <atom:content type="html">&lt;p&gt;In the next few posts, I will talk about the &lt;a href=&quot;http://iswc2008.semanticweb.org/&quot; id=&quot;link-id0x136691d8&quot;&gt;ISWC 2008&lt;/a&gt; conference of last week in &lt;a href=&quot;http://dbpedia.org/resource/Karlsruhe&quot; id=&quot;link-id0x1d375a98&quot;&gt;Karlsruhe&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Germany&quot; id=&quot;link-id0x13496660&quot;&gt;Germany&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;For us, this is divided into&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Workshop on scalable &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1d99cd18&quot;&gt;knowledge&lt;/a&gt; systems&lt;/li&gt; &lt;li&gt;General Conference &lt;/li&gt; &lt;li&gt;The &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1d310ab8&quot;&gt;Billion Triples Challenge&lt;/a&gt; &lt;/li&gt; &lt;li&gt;The W3C &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x201271a8&quot;&gt;RDB2RDF XG&lt;/a&gt; Face-to-Face&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I will talk about each in turn.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-03T09:33:06-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Installation Screencasts</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-11-02#1469</atom:id>
  <atom:published>2008-11-02T01:44:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;As promised in an earlier post titled: &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1461&quot; id=&quot;link-id1c412298&quot;&gt;Virtuoso, PHP 3.5 Runtime Hosting, phpBB3, and Linked Data&lt;/a&gt;, here are direct links to the &amp;quot;silent movies&amp;quot; mentioned in the past:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_Vista_Linked_Data_Demo.mov&quot; id=&quot;link-id13ea5790&quot;&gt;Installing Virtuoso on Vista with PHP Hosting&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_MacOSX_Linked_Data_Demo.mov&quot; id=&quot;link-id135299d8&quot;&gt;Installing Virtuoso on Mac OS X (Leopard) with PHP Hosting&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_MacOSX_Linked_Data_Demo.mov&quot; id=&quot;link-id1275fd88&quot;&gt;EC2 Installation Part 1&lt;/a&gt; (*AMIs take about 5 minutes to get assembled*)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_MacOSX_Linked_Data_Demo.mov&quot; id=&quot;link-id10f78ae8&quot;&gt;EC2 Installation Part 2&lt;/a&gt; (*post AMI creation part*)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Virtuoso is an extremely compact product that is very easy to install. The ease of installation carries over to the PHP runtime when bound to Virtuoso.&lt;/p&gt;</atom:content>
  <atom:updated>2008-11-02T16:20:21-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Welcoming Freebase to the Linked Data Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-31#1468</atom:id>
  <atom:published>2008-10-31T15:02:00Z</atom:published>
  <atom:content type="html">Finally! That&amp;#39;s all I can say re. Freebase :-) They&amp;#39;ve now plugged their database and their community driven &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; curation efforts into the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id111fe3b0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1cd46860&quot;&gt;Web&lt;/a&gt;. &lt;p&gt;Here are some examples of how we distill Entities (People, Places, Music, and other things) from Freebase (X)HTML pages (meaning: we don&amp;#39;t have to start from RDF &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1115cfe8&quot;&gt;information&lt;/a&gt; resources as data sources for the eventual RDF Linked Data we generate):&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://www.freebase.com/view/en/barack_obama&quot; id=&quot;link-id1957da00&quot;&gt;Barack Obama&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://www.freebase.com/view/en/hillary_rodham_clinton&quot; id=&quot;link-id175786d8&quot;&gt;Hillary Rodham Clinton&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://www.freebase.com/view/en/john_mccain&quot; id=&quot;link-id1c7ada58&quot;&gt;Johan McCain&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Tip: Install our &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id17a69a20&quot;&gt;OpenLink Data Explorer&lt;/a&gt; extension for Firefox. Once installed, simply browse through Freebase, and whenever you encounter a page about something of interest, simply use the following sequences to distill (via the Page Description feature) the entities from the page you are reading:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; CTRL-Click (Mac OS X) &lt;/li&gt; &lt;li&gt; Right+Click (Windows &amp;amp; Linux) &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1455&quot; id=&quot;link-id17758840&quot;&gt;State of the Linked Data Web&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1454&quot; id=&quot;link-idea627e8&quot;&gt;Dynamic Linked Data Web Constellation&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-10-31T11:23:35.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso - Are We Too Clever for Our Own Good? (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-10-26#1467</atom:id>
  <atom:published>2008-10-26T12:15:35Z</atom:published>
  <atom:content type="html">&lt;p&gt;&amp;quot;Physician, heal thyself,&amp;quot; it is said. We profess to say what the messaging of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1b4a25f0&quot;&gt;semantic web&lt;/a&gt; ought to be, but is our own perfect?&lt;/p&gt; &lt;p&gt;I will here engage in some critical introspection as well as amplify on some answers given to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e4f9928&quot;&gt;Virtuoso&lt;/a&gt;-related questions in recent times.&lt;/p&gt; &lt;p&gt;I use some conversations from the &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x1e6c0ca8&quot;&gt;Vienna&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e56df88&quot;&gt;Linked Data&lt;/a&gt; Practitioners meeting as a starting point. These views are mine and are limited to the Virtuoso server. These do not apply to the &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id0x1e680440&quot;&gt;ODS&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id0x1e140068&quot;&gt;OpenLink Data Spaces&lt;/a&gt;) applications line, &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x1f4ba630&quot;&gt;OAT&lt;/a&gt; (&lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x1ba4bac8&quot;&gt;OpenLink Ajax Toolkit&lt;/a&gt;), or &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1d4159b0&quot;&gt;ODE&lt;/a&gt; (&lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1e973c80&quot;&gt;OpenLink Data Explorer&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;&amp;quot;It is not always clear what the main thrust is, we get the impression that you are spread too thin,&amp;quot; said &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x1f8bafe0&quot;&gt;Sören Auer&lt;/a&gt;.&lt;/h3&gt; &lt;p&gt;Well, personally, I am all for core competence. This is why I do not participate in all the online conversations and groups as much as I could, for example. Time and energy are critical resources and must be invested where they make a difference. In this case, the real core competence is running in the database race. This in itself, come to think of it, is a pretty broad concept.&lt;/p&gt; &lt;p&gt;This is why we put a lot of emphasis on Linked Data and the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x200bd1f0&quot;&gt;Data&lt;/a&gt; Web for now, as this is the emerging game. This is a deliberate choice, not an outside imperative or built-in limitation. More specifically, this means exposing any pre-existing relational data as linked data plus being the definitive &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1fb03528&quot;&gt;RDF&lt;/a&gt; store.&lt;/p&gt; &lt;p&gt;We can do this because we own our database and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e7dcc70&quot;&gt;SQL&lt;/a&gt; and data access middleware and have a history of connecting to any &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1e9baf18&quot;&gt;RDBMS&lt;/a&gt; out there.&lt;/p&gt; &lt;p&gt;The principal message we have been hearing from the RDF field is the call for scale of triple storage. This is even louder than the call for relational mapping. We believe that in time mapping will exceed triple storage as such, once we get some real production strength mappings deployed, enough to outperform RDF warehousing.&lt;/p&gt; &lt;p&gt;There are also RDF middleware things like RDF-ization and demand-driven web harvesting (i.e, the so-called Sponger). These are &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1f5f6b78&quot;&gt;SPARQL&lt;/a&gt; options, thus accessed via standard interfaces. We have little desire to create our own languages or APIs, or to tell people how to program. This is why we recently introduced &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x206818c8&quot;&gt;Sesame&lt;/a&gt;- and &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x202b3348&quot;&gt;Jena&lt;/a&gt;-compatible APIs to our RDF store. From what we hear, these work. On the other hand, we do not hesitate to move beyond the standards when there is obvious value or necessity. This is why we brought SPARQL up to and beyond SQL expressivity. It is not a case of E3 (Embrace, Extend, Extinguish).&lt;/p&gt; &lt;p&gt;Now, this message could be better reflected in our material on the web. This &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1c82e508&quot;&gt;blog&lt;/a&gt; is a rather informal step in this direction; more is to come. For now we concentrate on delivering.&lt;/p&gt; &lt;p&gt;The conventional communications wisdom is to split the message by target audience. For this, we should split the RDF, relational, and web services messages from each other. We believe that a challenger, like the semantic web technology stack, must have a compelling message to tell for it to be interesting. This is not a question of research prototypes. The new technology cannot lack something the installed technology takes for granted.&lt;/p&gt; &lt;p&gt;This is why we do not tend to show things like how to insert and query a few triples: No business out there will insert and query triples for the sake of triples. There must be a more compelling story — for example, turning the whole world into a database. This is why our examples start with things like turning the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x20832510&quot;&gt;TPC-H&lt;/a&gt; database into RDF, queries and all. Anything less is not interesting. Why would an enterprise that has business intelligence and integration issues way more complex than the rather stereotypical TPC-H even look at a technology that pretends to be all for integration and all for expressivity of queries, yet cannot answer the first question of the entry exam?&lt;/p&gt; &lt;p&gt;The world out there is complex. But maybe we ought to make some simple tutorials? So, as a call to the people out there, tell us what a good tutorial would be. The question is more about figuring out what is out there and adapting these and making a sort of compatibility list. Jena and Sesame stuff ought to run as is. We could offer a webinar to all the data web luminaries showing how to promote the data web message with Virtuoso. After all, why not show it on the best platform?&lt;/p&gt; &lt;h3&gt;&amp;quot;You are arrogant. When I read your papers or documentation, the impression I get is that you say you are smart and the reader is stupid.&amp;quot;&lt;/h3&gt; &lt;p&gt;We should answer in multiple parts.&lt;/p&gt; &lt;p&gt;For general collateral, like web sites and documentation:&lt;/p&gt; &lt;p&gt;The web site gives a confused product image. For the Virtuoso product, we should divide at the top into&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Data web and RDF - Host linked data, expose relational assets as linked data;&lt;/li&gt; &lt;li&gt; Relational Database - Full function, high performance, open source, Federated/Virtual Relational DBMS, expose heterogeneous RDB assets through one point of contact for integration;&lt;/li&gt; &lt;li&gt; Web Services - access all the above over standard protocols, dynamic web pages, web hosting.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;For each point, one simple statement. We all know what the above things mean?&lt;/p&gt; &lt;p&gt;Then we add a new point about scalability that impacts all the above, namely the Virtuoso version 6 Cluster, meaning that you can do all these things at 10 to 1000 times the scale. This means this much more data or in some cases this much more requests per second. This too is clear.&lt;/p&gt; &lt;p&gt;Far as I am concerned, hosting Java or .&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x20283a88&quot;&gt;NET&lt;/a&gt; does not have to be on the front page. Also, we have no great interest in going against &lt;a href=&quot;http://dbpedia.org/resource/Apache&quot; id=&quot;link-id0x2024a068&quot;&gt;Apache&lt;/a&gt; when it comes to a web server only situation. The fact that we have a web listener is important for some things but our claim to fame does not rest on this.&lt;/p&gt; &lt;p&gt;Then for documentation and training materials: The documentation should be better. Specifically it should have more of a how-to dimension since nobody reads the whole thing anyhow. About online tutorials, the order of presentation should be different. They do not really reflect what is important at the present moment either.&lt;/p&gt; &lt;p&gt;Now for conference papers: Since taking the data web as a focus area, we have submitted some papers and had some rejected because these do not have enough references and do not explain what is obvious to ourselves.&lt;/p&gt; &lt;p&gt;I think that the communications failure in this case is that we want to talk about end to end solutions and the reviewers expect research. For us, the solution is interesting and exists only if there is an adequate functionality mix for addressing a specific use case. This is why we do not make a paper about query cost model alone because the cost model, while indispensable, is a thing that is taken for granted where we come from. So we mention RDF adaptations to cost model, as these are important to the whole but do not find these to be the justification for a whole paper. If we made papers on this basis, we would have to make five times as many. Maybe we ought to.&lt;/p&gt; &lt;h3&gt;&amp;quot;Virtuoso is very big and very difficult&amp;quot;&lt;/h3&gt; &lt;p&gt;One thing that is not obvious from the Virtuoso packaging is that the minimum installation is an executable under 10MB and a config file. Two files.&lt;/p&gt; &lt;p&gt;This gives you SQL and SPARQL out of the box. Adding &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x1ee61058&quot;&gt;ODBC&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1b8c31c0&quot;&gt;JDBC&lt;/a&gt; clients is as simple as it gets. After this, there is basic database functionality. Tuning is a matter of a few parameters that are explained on this blog and elsewhere. Also, the full scale installation is available as an Amazon EC2 image, so no installation required.&lt;/p&gt; &lt;p&gt;Now for the difficult side:&lt;/p&gt; &lt;p&gt;Use SQL and SPARQL; use stored procedures whenever there is server side business logic. For some time critical web pages, use VSP. Do not use VSPX. Otherwise, use whatever you are used to — &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x20a13c00&quot;&gt;PHP&lt;/a&gt; or Java or anything else. For web services, simple is best. Stick to basics. &amp;quot;The engineer is one who can invent a simple thing.&amp;quot; Use SQL statements rather than admin UI.&lt;/p&gt; &lt;p&gt;Know that you can start a server with no database file and you get an initial database with nothing extra. The demo database, the way it is produced by installers is cluttered.&lt;/p&gt; &lt;p&gt;We should put this into a couple of use case oriented how-tos.&lt;/p&gt; &lt;p&gt;Also, we should create a network of &amp;quot;friendly local virtuoso geeks&amp;quot; for providing basic training and services so we do not have to explain these things all the time. To all you data-web-ers out there — please sign up and we will provide instructions, etc. Contact Yrjänä Rankka (ghard[at-sign]openlinksw.com), or go through the mailing lists; do not contact me directly.&lt;/p&gt; &lt;h3&gt;&amp;quot;OK, we understand that you may be good at the large end of the spectrum but how do you reconcile this with the lightweight or embedded end, like the semantic desktop?&amp;quot;&lt;/h3&gt; &lt;p&gt;Now, what is good for one end is usually good for the other. Namely, a database, no matter the scale, needs to have space efficient storage, fast index lookup, and correct query plans. Then there are things that occur only at the high-end, like clustering, but these are separate things. For embedding, the initial memory footprint needs to be small. With Virtuoso, this is accomplished by leaving out some 200 built-in tables and 100,000 lines of SQL procedures that are normally in by default, supporting things such as DAV and diverse other protocols. After all, if SPARQL is all one wants these are not needed.&lt;/p&gt; &lt;p&gt;If one really wants to do one&amp;#39;s server logic (like web listener and thread dispatching) oneself, this is not impossible but requires some advice from us. On the other hand, if one wants to have logic for security close to the data, then using stored procedures is recommended; these execute right next to the data, and support inline SPARQL and SQL. Depending on the license status of the other code, some special licensing arrangements may apply.&lt;/p&gt; &lt;p&gt;We are talking about such things with different parties at present.&lt;/p&gt; &lt;h3&gt;&amp;quot;How webby are you? What is webby?&amp;quot;&lt;/h3&gt; &lt;p&gt;&amp;quot;Webby means distributed, heterogeneous, open; not monolithic consolidation of everything.&amp;quot;&lt;/p&gt; &lt;p&gt;We are philosophically webby. We come from open standards; we are after all called OpenLink; our history consists of connecting things. We believe in choice — the user should be able to pick the best of breed for components and have them work together. We cannot and do not wish to force replacement of existing assets. Transforming data on the fly and connecting systems, leaving data where it originally resides, is the first preference. For the data web, the first preference is a federation of independent SPARQL end points. When there is harvesting, we prefer to do it on demand, as with our Sponger. With the immense amount of data out there we believe in finding what is relevant &lt;i&gt;when&lt;/i&gt; it is relevant, preferably close at hand, leveraging things like social networks. With a data web, many things which are now siloized, such as marketplaces and social networks, will return to the open.&lt;/p&gt; &lt;p&gt;Google-style crawling of everything becomes less practical if one needs to run complex &lt;i&gt;ad hoc&lt;/i&gt; queries against the mass of data. For these types of scenarios, if one needs to warehouse, the data cloud will offer solutions where one pays for database on demand. While we believe in loosely coupled federation where possible, we have serious work on the scalability side for the data center and the compute-on-demand cloud.&lt;/p&gt; &lt;h3&gt;&amp;quot;How does OpenLink see the next five years unfolding?&amp;quot;&lt;/h3&gt; &lt;p&gt;Personally, I think we have the basics for the birth of a new inflection in the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1fb9ae58&quot;&gt;knowledge&lt;/a&gt; economy. The &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1f07c648&quot;&gt;URI&lt;/a&gt; is the unit of exchange; its value and competitive edge lie in the data it links you with. A name without context is worth little, but as a name gets more use, more &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1f007d60&quot;&gt;information&lt;/a&gt; can be found through that name. This is anything from financial statistics, to legal precedents, to news reporting or government data. Right now, if the SEC just added one line of markup to the XBRL template, this would instantaneously make all SEC-mandated reporting into linked data via GRDDL.&lt;/p&gt; &lt;p&gt;The URI is a carrier of brand. An information brand gets traffic and references, and this can be monetized in diverse ways. The key word is &lt;i&gt;context&lt;/i&gt;. Information overload is here to stay, and only better context offers the needed increase in productivity to stay ahead of the flood.&lt;/p&gt; &lt;p&gt;Semantic technologies on the whole can help with this. Why these should be semantic web or data web technologies as opposed to just semantic is the linked data value proposition. Even smart islands are still islands. Agility, scale, and scope, depend on the possibility of combining things. Therefore common terminologies and dereferenceability and discoverability are important. Without these, we are at best dealing with closed systems even if they were smart. The expert systems of the 1980s are a case in point.&lt;/p&gt; &lt;p&gt;Ever since the .com era, the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x2048e670&quot;&gt;URL&lt;/a&gt; has been a brand. Now it becomes a URI. Thus, entirely hiding the URI from the user experience is not always desirable. The URI is a sort of handle on the provenance and where more can be found; besides, people are already used to these.&lt;/p&gt; &lt;p&gt;With linked data, information value-add products become easy to build and deploy. They can be basically just canned SPARQL queries combining data in a useful and insightful manner. And where there is traffic there can be monetization, whether by advertizing, subscription, or other means. Such possibilities are a natural adjunct to the blogosphere. To publish analysis, one no longer needs to be a think tank or media company. We could call this scenario the birth of a meshup economy.&lt;/p&gt; &lt;p&gt;For OpenLink itself, this is our roadmap. The immediate future is about getting our high end offerings like clustered RDF storage generally available, both on the cloud and for private data centers. Ourselves, we will offer the whole &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1c696170&quot;&gt;Linked Open Data&lt;/a&gt; cloud as a database. The single feature to come in version 2 of this is fully automatic partitioning and repartitioning for on-demand scale; now, you have to choose how many partitions you have.&lt;/p&gt; &lt;p&gt;This makes some things possible that were hard thus far.&lt;/p&gt; &lt;p&gt;On the mapping front, we go for real-scale data integration scenarios where we can show that SPARQL can unify terms and concepts across databases, yet bring no added cost for complex queries. Enterprises can use their existing warehouses and have an added level of abstraction, the possibility of cross systems interlinking, the advantages of using the same taxonomies and ontologies across systems, and so forth.&lt;/p&gt; &lt;p&gt;Then there will be developments in the direction of smarter web harvesting on demand with the Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x206ab780&quot;&gt;Sponger&lt;/a&gt;, and federation of heterogeneous SPARQL end points. The federation is not so unlike clustering, except the time scales are 2 orders of magnitude longer. The work on SPARQL end point statistics and data set description and discovery is a good development in the community.&lt;/p&gt; &lt;p&gt;Then there will be NLP integration, as exemplified by the Open Calais linked data wrapper and more.&lt;/p&gt; &lt;p&gt;Can we pull this off or is this being spread too thin? We know from experience that all this can be accomplished. Scale is already here; we show it with the billion triples set. Mapping is here; we showed it last in the Berlin Benchmark. We will also show some TPC-H results after we get a little quiet after the ISWC event. Then there is ongoing maintenance but with this we have shown a steady turnaround and quick time to fix for pretty much anything.&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-27T12:07:58-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso - Are We Too Clever for Our Own Good? (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-10-26#1465</atom:id>
  <atom:published>2008-10-26T12:15:35Z</atom:published>
  <atom:content type="html">&lt;p&gt;&amp;quot;Physician, heal thyself,&amp;quot; it is said. We profess to say what the messaging of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1fa3da18&quot;&gt;semantic web&lt;/a&gt; ought to be, but is our own perfect?&lt;/p&gt; &lt;p&gt;I will here engage in some critical introspection as well as amplify on some answers given to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1e1eecf0&quot;&gt;Virtuoso&lt;/a&gt;-related questions in recent times.&lt;/p&gt; &lt;p&gt;I use some conversations from the &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x1ec0b2e0&quot;&gt;Vienna&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x2045ac10&quot;&gt;Linked Data&lt;/a&gt; Practitioners meeting as a starting point. These views are mine and are limited to the Virtuoso server. These do not apply to the &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id0x2045ac38&quot;&gt;ODS&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id0x14f63c58&quot;&gt;OpenLink Data Spaces&lt;/a&gt;) applications line, &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x14f63c80&quot;&gt;OAT&lt;/a&gt; (&lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x1e536928&quot;&gt;OpenLink Ajax Toolkit&lt;/a&gt;), or &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1eaed7f8&quot;&gt;ODE&lt;/a&gt; (&lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1edfff88&quot;&gt;OpenLink Data Explorer&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;&amp;quot;It is not always clear what the main thrust is, we get the impression that you are spread too thin,&amp;quot; said &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x1b8a9580&quot;&gt;Sören Auer&lt;/a&gt;.&lt;/h3&gt; &lt;p&gt;Well, personally, I am all for core competence. This is why I do not participate in all the online conversations and groups as much as I could, for example. Time and energy are critical resources and must be invested where they make a difference. In this case, the real core competence is running in the database race. This in itself, come to think of it, is a pretty broad concept.&lt;/p&gt; &lt;p&gt;This is why we put a lot of emphasis on Linked Data and the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1b85fa38&quot;&gt;Data&lt;/a&gt; Web for now, as this is the emerging game. This is a deliberate choice, not an outside imperative or built-in limitation. More specifically, this means exposing any pre-existing relational data as linked data plus being the definitive &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f5b4468&quot;&gt;RDF&lt;/a&gt; store.&lt;/p&gt; &lt;p&gt;We can do this because we own our database and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x20076468&quot;&gt;SQL&lt;/a&gt; and data access middleware and have a history of connecting to any &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1ffd6f98&quot;&gt;RDBMS&lt;/a&gt; out there.&lt;/p&gt; &lt;p&gt;The principal message we have been hearing from the RDF field is the call for scale of triple storage. This is even louder than the call for relational mapping. We believe that in time mapping will exceed triple storage as such, once we get some real production strength mappings deployed, enough to outperform RDF warehousing.&lt;/p&gt; &lt;p&gt;There are also RDF middleware things like RDF-ization and demand-driven web harvesting (i.e, the so-called Sponger). These are &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1316f720&quot;&gt;SPARQL&lt;/a&gt; options, thus accessed via standard interfaces. We have little desire to create our own languages or APIs, or to tell people how to program. This is why we recently introduced &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x20756a68&quot;&gt;Sesame&lt;/a&gt;- and &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x1ec01ac0&quot;&gt;Jena&lt;/a&gt;-compatible APIs to our RDF store. From what we hear, these work. On the other hand, we do not hesitate to move beyond the standards when there is obvious value or necessity. This is why we brought SPARQL up to and beyond SQL expressivity. It is not a case of E3 (Embrace, Extend, Extinguish).&lt;/p&gt; &lt;p&gt;Now, this message could be better reflected in our material on the web. This &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x2027b410&quot;&gt;blog&lt;/a&gt; is a rather informal step in this direction; more is to come. For now we concentrate on delivering.&lt;/p&gt; &lt;p&gt;The conventional communications wisdom is to split the message by target audience. For this, we should split the RDF, relational, and web services messages from each other. We believe that a challenger, like the semantic web technology stack, must have a compelling message to tell for it to be interesting. This is not a question of research prototypes. The new technology cannot lack something the installed technology takes for granted.&lt;/p&gt; &lt;p&gt;This is why we do not tend to show things like how to insert and query a few triples: No business out there will insert and query triples for the sake of triples. There must be a more compelling story — for example, turning the whole world into a database. This is why our examples start with things like turning the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x2051ff98&quot;&gt;TPC-H&lt;/a&gt; database into RDF, queries and all. Anything less is not interesting. Why would an enterprise that has business intelligence and integration issues way more complex than the rather stereotypical TPC-H even look at a technology that pretends to be all for integration and all for expressivity of queries, yet cannot answer the first question of the entry exam?&lt;/p&gt; &lt;p&gt;The world out there is complex. But maybe we ought to make some simple tutorials? So, as a call to the people out there, tell us what a good tutorial would be. The question is more about figuring out what is out there and adapting these and making a sort of compatibility list. Jena and Sesame stuff ought to run as is. We could offer a webinar to all the data web luminaries showing how to promote the data web message with Virtuoso. After all, why not show it on the best platform?&lt;/p&gt; &lt;h3&gt;&amp;quot;You are arrogant. When I read your papers or documentation, the impression I get is that you say you are smart and the reader is stupid.&amp;quot;&lt;/h3&gt; &lt;p&gt;We should answer in multiple parts.&lt;/p&gt; &lt;p&gt;For general collateral, like web sites and documentation:&lt;/p&gt; &lt;p&gt;The web site gives a confused product image. For the Virtuoso product, we should divide at the top into&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Data web and RDF - Host linked data, expose relational assets as linked data;&lt;/li&gt; &lt;li&gt; Relational Database - Full function, high performance, open source, Federated/Virtual Relational DBMS, expose heterogeneous RDB assets through one point of contact for integration;&lt;/li&gt; &lt;li&gt; Web Services - access all the above over standard protocols, dynamic web pages, web hosting.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;For each point, one simple statement. We all know what the above things mean?&lt;/p&gt; &lt;p&gt;Then we add a new point about scalability that impacts all the above, namely the Virtuoso version 6 Cluster, meaning that you can do all these things at 10 to 1000 times the scale. This means this much more data or in some cases this much more requests per second. This too is clear.&lt;/p&gt; &lt;p&gt;Far as I am concerned, hosting Java or .&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x1f297540&quot;&gt;NET&lt;/a&gt; does not have to be on the front page. Also, we have no great interest in going against &lt;a href=&quot;http://dbpedia.org/resource/Apache&quot; id=&quot;link-id0x1ea29578&quot;&gt;Apache&lt;/a&gt; when it comes to a web server only situation. The fact that we have a web listener is important for some things but our claim to fame does not rest on this.&lt;/p&gt; &lt;p&gt;Then for documentation and training materials: The documentation should be better. Specifically it should have more of a how-to dimension since nobody reads the whole thing anyhow. About online tutorials, the order of presentation should be different. They do not really reflect what is important at the present moment either.&lt;/p&gt; &lt;p&gt;Now for conference papers: Since taking the data web as a focus area, we have submitted some papers and had some rejected because these do not have enough references and do not explain what is obvious to ourselves.&lt;/p&gt; &lt;p&gt;I think that the communications failure in this case is that we want to talk about end to end solutions and the reviewers expect research. For us, the solution is interesting and exists only if there is an adequate functionality mix for addressing a specific use case. This is why we do not make a paper about query cost model alone because the cost model, while indispensable, is a thing that is taken for granted where we come from. So we mention RDF adaptations to cost model, as these are important to the whole but do not find these to be the justification for a whole paper. If we made papers on this basis, we would have to make five times as many. Maybe we ought to.&lt;/p&gt; &lt;h3&gt;&amp;quot;Virtuoso is very big and very difficult&amp;quot;&lt;/h3&gt; &lt;p&gt;One thing that is not obvious from the Virtuoso packaging is that the minimum installation is an executable under 10MB and a config file. Two files.&lt;/p&gt; &lt;p&gt;This gives you SQL and SPARQL out of the box. Adding &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x20a2e7d0&quot;&gt;ODBC&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1e4cceb8&quot;&gt;JDBC&lt;/a&gt; clients is as simple as it gets. After this, there is basic database functionality. Tuning is a matter of a few parameters that are explained on this blog and elsewhere. Also, the full scale installation is available as an Amazon EC2 image, so no installation required.&lt;/p&gt; &lt;p&gt;Now for the difficult side:&lt;/p&gt; &lt;p&gt;Use SQL and SPARQL; use stored procedures whenever there is server side business logic. For some time critical web pages, use VSP. Do not use VSPX. Otherwise, use whatever you are used to — &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x20b03f08&quot;&gt;PHP&lt;/a&gt; or Java or anything else. For web services, simple is best. Stick to basics. &amp;quot;The engineer is one who can invent a simple thing.&amp;quot; Use SQL statements rather than admin UI.&lt;/p&gt; &lt;p&gt;Know that you can start a server with no database file and you get an initial database with nothing extra. The demo database, the way it is produced by installers is cluttered.&lt;/p&gt; &lt;p&gt;We should put this into a couple of use case oriented how-tos.&lt;/p&gt; &lt;p&gt;Also, we should create a network of &amp;quot;friendly local virtuoso geeks&amp;quot; for providing basic training and services so we do not have to explain these things all the time. To all you data-web-ers out there — please sign up and we will provide instructions, etc. Contact Yrjänä Rankka (ghard[at-sign]openlinksw.com), or go through the mailing lists; do not contact me directly.&lt;/p&gt; &lt;h3&gt;&amp;quot;OK, we understand that you may be good at the large end of the spectrum but how do you reconcile this with the lightweight or embedded end, like the semantic desktop?&amp;quot;&lt;/h3&gt; &lt;p&gt;Now, what is good for one end is usually good for the other. Namely, a database, no matter the scale, needs to have space efficient storage, fast index lookup, and correct query plans. Then there are things that occur only at the high-end, like clustering, but these are separate things. For embedding, the initial memory footprint needs to be small. With Virtuoso, this is accomplished by leaving out some 200 built-in tables and 100,000 lines of SQL procedures that are normally in by default, supporting things such as DAV and diverse other protocols. After all, if SPARQL is all one wants these are not needed.&lt;/p&gt; &lt;p&gt;If one really wants to do one&amp;#39;s server logic (like web listener and thread dispatching) oneself, this is not impossible but requires some advice from us. On the other hand, if one wants to have logic for security close to the data, then using stored procedures is recommended; these execute right next to the data, and support inline SPARQL and SQL. Depending on the license status of the other code, some special licensing arrangements may apply.&lt;/p&gt; &lt;p&gt;We are talking about such things with different parties at present.&lt;/p&gt; &lt;h3&gt;&amp;quot;How webby are you? What is webby?&amp;quot;&lt;/h3&gt; &lt;p&gt;&amp;quot;Webby means distributed, heterogeneous, open; not monolithic consolidation of everything.&amp;quot;&lt;/p&gt; &lt;p&gt;We are philosophically webby. We come from open standards; we are after all called OpenLink; our history consists of connecting things. We believe in choice — the user should be able to pick the best of breed for components and have them work together. We cannot and do not wish to force replacement of existing assets. Transforming data on the fly and connecting systems, leaving data where it originally resides, is the first preference. For the data web, the first preference is a federation of independent SPARQL end points. When there is harvesting, we prefer to do it on demand, as with our Sponger. With the immense amount of data out there we believe in finding what is relevant &lt;i&gt;when&lt;/i&gt; it is relevant, preferably close at hand, leveraging things like social networks. With a data web, many things which are now siloized, such as marketplaces and social networks, will return to the open.&lt;/p&gt; &lt;p&gt;Google-style crawling of everything becomes less practical if one needs to run complex &lt;i&gt;ad hoc&lt;/i&gt; queries against the mass of data. For these types of scenarios, if one needs to warehouse, the data cloud will offer solutions where one pays for database on demand. While we believe in loosely coupled federation where possible, we have serious work on the scalability side for the data center and the compute-on-demand cloud.&lt;/p&gt; &lt;h3&gt;&amp;quot;How does OpenLink see the next five years unfolding?&amp;quot;&lt;/h3&gt; &lt;p&gt;Personally, I think we have the basics for the birth of a new inflection in the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x2018bd98&quot;&gt;knowledge&lt;/a&gt; economy. The &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1ec110d8&quot;&gt;URI&lt;/a&gt; is the unit of exchange; its value and competitive edge lie in the data it links you with. A name without context is worth little, but as a name gets more use, more &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1ecfba08&quot;&gt;information&lt;/a&gt; can be found through that name. This is anything from financial statistics, to legal precedents, to news reporting or government data. Right now, if the SEC just added one line of markup to the XBRL template, this would instantaneously make all SEC-mandated reporting into linked data via GRDDL.&lt;/p&gt; &lt;p&gt;The URI is a carrier of brand. An information brand gets traffic and references, and this can be monetized in diverse ways. The key word is &lt;i&gt;context&lt;/i&gt;. Information overload is here to stay, and only better context offers the needed increase in productivity to stay ahead of the flood.&lt;/p&gt; &lt;p&gt;Semantic technologies on the whole can help with this. Why these should be semantic web or data web technologies as opposed to just semantic is the linked data value proposition. Even smart islands are still islands. Agility, scale, and scope, depend on the possibility of combining things. Therefore common terminologies and dereferenceability and discoverability are important. Without these, we are at best dealing with closed systems even if they were smart. The expert systems of the 1980s are a case in point.&lt;/p&gt; &lt;p&gt;Ever since the .com era, the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id0x1c4c9248&quot;&gt;URL&lt;/a&gt; has been a brand. Now it becomes a URI. Thus, entirely hiding the URI from the user experience is not always desirable. The URI is a sort of handle on the provenance and where more can be found; besides, people are already used to these.&lt;/p&gt; &lt;p&gt;With linked data, information value-add products become easy to build and deploy. They can be basically just canned SPARQL queries combining data in a useful and insightful manner. And where there is traffic there can be monetization, whether by advertizing, subscription, or other means. Such possibilities are a natural adjunct to the blogosphere. To publish analysis, one no longer needs to be a think tank or media company. We could call this scenario the birth of a meshup economy.&lt;/p&gt; &lt;p&gt;For OpenLink itself, this is our roadmap. The immediate future is about getting our high end offerings like clustered RDF storage generally available, both on the cloud and for private data centers. Ourselves, we will offer the whole &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x20791bf0&quot;&gt;Linked Open Data&lt;/a&gt; cloud as a database. The single feature to come in version 2 of this is fully automatic partitioning and repartitioning for on-demand scale; now, you have to choose how many partitions you have.&lt;/p&gt; &lt;p&gt;This makes some things possible that were hard thus far.&lt;/p&gt; &lt;p&gt;On the mapping front, we go for real-scale data integration scenarios where we can show that SPARQL can unify terms and concepts across databases, yet bring no added cost for complex queries. Enterprises can use their existing warehouses and have an added level of abstraction, the possibility of cross systems interlinking, the advantages of using the same taxonomies and ontologies across systems, and so forth.&lt;/p&gt; &lt;p&gt;Then there will be developments in the direction of smarter web harvesting on demand with the Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1f27e6d8&quot;&gt;Sponger&lt;/a&gt;, and federation of heterogeneous SPARQL end points. The federation is not so unlike clustering, except the time scales are 2 orders of magnitude longer. The work on SPARQL end point statistics and data set description and discovery is a good development in the community.&lt;/p&gt; &lt;p&gt;Then there will be NLP integration, as exemplified by the Open Calais linked data wrapper and more.&lt;/p&gt; &lt;p&gt;Can we pull this off or is this being spread too thin? We know from experience that all this can be accomplished. Scale is already here; we show it with the billion triples set. Mapping is here; we showed it last in the Berlin Benchmark. We will also show some TPC-H results after we get a little quiet after the ISWC event. Then there is ongoing maintenance but with this we have shown a steady turnaround and quick time to fix for pretty much anything.&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-27T12:07:52-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Semantic Web, Part 2 - The Technical Questions (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-10-26#1466</atom:id>
  <atom:published>2008-10-26T12:02:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here I will talk about some more technical questions that came up. This is mostly general; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x205901a0&quot;&gt;Virtuoso&lt;/a&gt; specific questions and answers are separate. &lt;/p&gt; &lt;h3&gt;&amp;quot;How to Bootstrap? Where will the triples come from?&amp;quot;&lt;/h3&gt; &lt;p&gt;There are already wrappers producing &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x13519ac8&quot;&gt;RDF&lt;/a&gt; from many applications. Since any structured or semi-structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c93b418&quot;&gt;data&lt;/a&gt; can be converted to RDF and often there is even a pre-existing terminology for the application domain, the availability of the data &lt;i&gt;per se&lt;/i&gt; is not the concern.&lt;/p&gt; &lt;p&gt;The triples may come from any application or database, but they will not come from the end user directly. There was a good talk about photograph annotation in &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x1ea9d150&quot;&gt;Vienna&lt;/a&gt;, describing many ways of deriving metadata for photos. The essential wisdom is annotating on the spot and wherever possible doing so automatically. The consumer is very unlikely to go annotate photos after the fact. Further, one can infer that photos made with the same camera around the same time are from the same location. There are other such heuristics. In this use case, the end user does not need to see triples. There is some benefit though in using commonly used geographical terminology for linking to other data sources.&lt;/p&gt; &lt;h3&gt;&amp;quot;How will one develop applications?&amp;quot;&lt;/h3&gt; &lt;p&gt;I&amp;#39;d say one will develop them much the same way as thus far. In &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x207fca00&quot;&gt;PHP&lt;/a&gt;, for example. Whether one&amp;#39;s query language is &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x20a5fde0&quot;&gt;SPARQL&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1a0bb5e0&quot;&gt;SQL&lt;/a&gt; does not make a large difference in how basic web UI is made.&lt;/p&gt; &lt;p&gt;A SPARQL end-point is no more an end-user item than a SQL command-line is.&lt;/p&gt; &lt;p&gt;A common mistake among techies is that they think the data structure and user experience can or ought to be of the same structure. The UI dialogs do not, for example, have to have a 1:1 correspondence with SQL tables.&lt;/p&gt; &lt;p&gt;The idea of generating UI from data, whether relational or data-web, is so seductive that generation upon generation of developers fall for it, repeatedly. Even I, at OpenLink, after supposedly having been around the block a couple of times made some experiments around the topic. What does make sense is putting a thin wrapper or HTML around the application, using XSLT and such for formatting. Since the model does allow for unforeseen properties of data, one can build a viewer for these alongside the regular forms. For this, Ajax technologies like &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x1e91d118&quot;&gt;OAT&lt;/a&gt; (the &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x174b7950&quot;&gt;OpenLink AJAX Toolkit&lt;/a&gt;) will be good.&lt;/p&gt; &lt;p&gt;The UI ought not to completely hide the URIs of the data from the user. It should offer a drill down to faceted views of the triples for example. Remember when Xerox talked about graphical user interfaces in 1980? &amp;quot;Don&amp;#39;t mode me in&amp;quot; was the slogan, as I recall.&lt;/p&gt; &lt;p&gt;Since then, we have vacillated between modal and non-modal interaction models. Repetitive workflows like order entry go best modally and are anyway being replaced by web services. Also workflows that are very infrequent benefit from modality; take personal network setup wizards, for example. But enabling the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1ea14610&quot;&gt;knowledge&lt;/a&gt; worker is a domain that by its nature must retain some respect for human intelligence and not kill this by denying access to the underlying data, including provenance and URIs. Face it: the world is not getting simpler. It is increasingly data dependent and when this is so, having semantics and flexibility of access for the data is important.&lt;/p&gt; &lt;p&gt;For a real-time task-oriented user interface like a fighter plane cockpit, one will not show URIs unless specifically requested. For planning fighter sorties though, there is some potential benefit in having all data such as friendly and hostile assets, geography, organizational structure, etc., as &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x207bcd20&quot;&gt;linked data&lt;/a&gt;. It makes for more flexible querying. Linked data does not &lt;i&gt;per se&lt;/i&gt; mean open, so one can be joinable with open data through using the same identifiers even while maintaining arbitrary levels of security and compartmentalization.&lt;/p&gt; &lt;p&gt;For automating tasks that every time involve the same data and queries, RDF has no intrinsic superiority. Thus the user interfaces in places where RDF will have real edge must be more capable of &lt;i&gt;ad hoc&lt;/i&gt; viewing and navigation than regular real-time or line of business user interfaces.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x2083a6f0&quot;&gt;OpenLink Data Explorer&lt;/a&gt; idea of a &amp;quot;data behind the web page&amp;quot; view goes in this direction. Read the web as before, then hit a switch to go to the data view. There are and will be separate clarifications and demos about this.&lt;/p&gt; &lt;h3&gt;&amp;quot;What of the proliferation of standards? Does this not look too tangled, no clear identity? How would one know where to begin?&amp;quot;&lt;/h3&gt; &lt;p&gt;When &lt;a href=&quot;http://www.w3.org/2001/sw/sweo/&quot; id=&quot;link-id0x1e8eac68&quot;&gt;SWEO&lt;/a&gt; was beginning, there was an endlessly protracted discussion of the so-called layer cake. This acronym jungle is not good messaging. Just say linked, flexibly repurpose-able data, and rich vocabularies and structure. Just the right amount of structure for the application, less rigid and easier to change than relational.&lt;/p&gt; &lt;p&gt;Do not even mention the different serialization formats. Just say that it fits on top of the accepted web infrastructure — &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1e3806b8&quot;&gt;HTTP&lt;/a&gt;, URIs, and &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1f547288&quot;&gt;XML&lt;/a&gt; where desired.&lt;/p&gt; &lt;p&gt;It is misleading to say inference is a box at some specific place in the diagram. Inference of different types may or may not take place at diverse points, whether presentation or storage, on demand or as a preprocessing step. Since there is structure and semantics, inference is possible if desired.&lt;/p&gt; &lt;h3&gt;&amp;quot;Can I make a social network application in RDF only, with no &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x20553ee0&quot;&gt;RDBMS&lt;/a&gt;?&amp;quot;&lt;/h3&gt; &lt;p&gt;Yes, in principle, but what do you have in mind? The answer is very context dependent. The person posing the question had an E-learning system in mind, with things such as course catalogues, course material, etc. In such a case, RDF is a great match, especially since the user count will not be in the millions. No university has that many students and anyway they do not hang online browsing the course catalogue.&lt;/p&gt; &lt;p&gt;On the other hand, if I think of making a social network site with RDF as the exclusive data model, I see things that would be very inefficient. For example, keeping a count of logins or the last time of login would be by default several times less efficient than with a RDBMS.&lt;/p&gt; &lt;p&gt;If some application is really large scale and has a knowable workload profile, like any social network does, then some task-specific data structure is simply economical. This does not mean that the application language cannot be SPARQL but this means that the storage format must be tuned to favor some operations over others, relational style. This is a matter of cost more than of feasibility. Ten servers cost less than a hundred and have failures ten times less frequently.&lt;/p&gt; &lt;p&gt;In the near term we will see the birth of an application paradigm for the data web. The data will be open, exposed, first-class citizen; yet the user experience will not have to be in a 1:1 image of the data.&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-27T11:28:14-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Semantic Web, Part 2 - The Technical Questions (updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-10-26#1464</atom:id>
  <atom:published>2008-10-26T12:02:43Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here I will talk about some more technical questions that came up. This is mostly general; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1f53d1a0&quot;&gt;Virtuoso&lt;/a&gt; specific questions and answers are separate. &lt;/p&gt; &lt;h3&gt;&amp;quot;How to Bootstrap? Where will the triples come from?&amp;quot;&lt;/h3&gt; &lt;p&gt;There are already wrappers producing &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1beda278&quot;&gt;RDF&lt;/a&gt; from many applications. Since any structured or semi-structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1e57c648&quot;&gt;data&lt;/a&gt; can be converted to RDF and often there is even a pre-existing terminology for the application domain, the availability of the data &lt;i&gt;per se&lt;/i&gt; is not the concern.&lt;/p&gt; &lt;p&gt;The triples may come from any application or database, but they will not come from the end user directly. There was a good talk about photograph annotation in &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x2028b7e8&quot;&gt;Vienna&lt;/a&gt;, describing many ways of deriving metadata for photos. The essential wisdom is annotating on the spot and wherever possible doing so automatically. The consumer is very unlikely to go annotate photos after the fact. Further, one can infer that photos made with the same camera around the same time are from the same location. There are other such heuristics. In this use case, the end user does not need to see triples. There is some benefit though in using commonly used geographical terminology for linking to other data sources.&lt;/p&gt; &lt;h3&gt;&amp;quot;How will one develop applications?&amp;quot;&lt;/h3&gt; &lt;p&gt;I&amp;#39;d say one will develop them much the same way as thus far. In &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id0x1eff1748&quot;&gt;PHP&lt;/a&gt;, for example. Whether one&amp;#39;s query language is &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1d83dff8&quot;&gt;SPARQL&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e9f4e88&quot;&gt;SQL&lt;/a&gt; does not make a large difference in how basic web UI is made.&lt;/p&gt; &lt;p&gt;A SPARQL end-point is no more an end-user item than a SQL command-line is.&lt;/p&gt; &lt;p&gt;A common mistake among techies is that they think the data structure and user experience can or ought to be of the same structure. The UI dialogs do not, for example, have to have a 1:1 correspondence with SQL tables.&lt;/p&gt; &lt;p&gt;The idea of generating UI from data, whether relational or data-web, is so seductive that generation upon generation of developers fall for it, repeatedly. Even I, at OpenLink, after supposedly having been around the block a couple of times made some experiments around the topic. What does make sense is putting a thin wrapper or HTML around the application, using XSLT and such for formatting. Since the model does allow for unforeseen properties of data, one can build a viewer for these alongside the regular forms. For this, Ajax technologies like &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x1d780520&quot;&gt;OAT&lt;/a&gt; (the &lt;a href=&quot;http://oat.openlinksw.com/&quot; id=&quot;link-id0x20943788&quot;&gt;OpenLink AJAX Toolkit&lt;/a&gt;) will be good.&lt;/p&gt; &lt;p&gt;The UI ought not to completely hide the URIs of the data from the user. It should offer a drill down to faceted views of the triples for example. Remember when Xerox talked about graphical user interfaces in 1980? &amp;quot;Don&amp;#39;t mode me in&amp;quot; was the slogan, as I recall.&lt;/p&gt; &lt;p&gt;Since then, we have vacillated between modal and non-modal interaction models. Repetitive workflows like order entry go best modally and are anyway being replaced by web services. Also workflows that are very infrequent benefit from modality; take personal network setup wizards, for example. But enabling the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1e14eb88&quot;&gt;knowledge&lt;/a&gt; worker is a domain that by its nature must retain some respect for human intelligence and not kill this by denying access to the underlying data, including provenance and URIs. Face it: the world is not getting simpler. It is increasingly data dependent and when this is so, having semantics and flexibility of access for the data is important.&lt;/p&gt; &lt;p&gt;For a real-time task-oriented user interface like a fighter plane cockpit, one will not show URIs unless specifically requested. For planning fighter sorties though, there is some potential benefit in having all data such as friendly and hostile assets, geography, organizational structure, etc., as &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1e91d118&quot;&gt;linked data&lt;/a&gt;. It makes for more flexible querying. Linked data does not &lt;i&gt;per se&lt;/i&gt; mean open, so one can be joinable with open data through using the same identifiers even while maintaining arbitrary levels of security and compartmentalization.&lt;/p&gt; &lt;p&gt;For automating tasks that every time involve the same data and queries, RDF has no intrinsic superiority. Thus the user interfaces in places where RDF will have real edge must be more capable of &lt;i&gt;ad hoc&lt;/i&gt; viewing and navigation than regular real-time or line of business user interfaces.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0x1c7f8ee0&quot;&gt;OpenLink Data Explorer&lt;/a&gt; idea of a &amp;quot;data behind the web page&amp;quot; view goes in this direction. Read the web as before, then hit a switch to go to the data view. There are and will be separate clarifications and demos about this.&lt;/p&gt; &lt;h3&gt;&amp;quot;What of the proliferation of standards? Does this not look too tangled, no clear identity? How would one know where to begin?&amp;quot;&lt;/h3&gt; &lt;p&gt;When &lt;a href=&quot;http://www.w3.org/2001/sw/sweo/&quot; id=&quot;link-id0x1d73c268&quot;&gt;SWEO&lt;/a&gt; was beginning, there was an endlessly protracted discussion of the so-called layer cake. This acronym jungle is not good messaging. Just say linked, flexibly repurpose-able data, and rich vocabularies and structure. Just the right amount of structure for the application, less rigid and easier to change than relational.&lt;/p&gt; &lt;p&gt;Do not even mention the different serialization formats. Just say that it fits on top of the accepted web infrastructure — &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1efefed0&quot;&gt;HTTP&lt;/a&gt;, URIs, and &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1af89b18&quot;&gt;XML&lt;/a&gt; where desired.&lt;/p&gt; &lt;p&gt;It is misleading to say inference is a box at some specific place in the diagram. Inference of different types may or may not take place at diverse points, whether presentation or storage, on demand or as a preprocessing step. Since there is structure and semantics, inference is possible if desired.&lt;/p&gt; &lt;h3&gt;&amp;quot;Can I make a social network application in RDF only, with no &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1cb62cd8&quot;&gt;RDBMS&lt;/a&gt;?&amp;quot;&lt;/h3&gt; &lt;p&gt;Yes, in principle, but what do you have in mind? The answer is very context dependent. The person posing the question had an E-learning system in mind, with things such as course catalogues, course material, etc. In such a case, RDF is a great match, especially since the user count will not be in the millions. No university has that many students and anyway they do not hang online browsing the course catalogue.&lt;/p&gt; &lt;p&gt;On the other hand, if I think of making a social network site with RDF as the exclusive data model, I see things that would be very inefficient. For example, keeping a count of logins or the last time of login would be by default several times less efficient than with a RDBMS.&lt;/p&gt; &lt;p&gt;If some application is really large scale and has a knowable workload profile, like any social network does, then some task-specific data structure is simply economical. This does not mean that the application language cannot be SPARQL but this means that the storage format must be tuned to favor some operations over others, relational style. This is a matter of cost more than of feasibility. Ten servers cost less than a hundred and have failures ten times less frequently.&lt;/p&gt; &lt;p&gt;In the near term we will see the birth of an application paradigm for the data web. The data will be open, exposed, first-class citizen; yet the user experience will not have to be in a 1:1 image of the data.&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-27T11:28:01-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Dog-fooding: Linked Data and OpenLink Product Portfolio</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-24#1463</atom:id>
  <atom:published>2008-10-24T22:05:42Z</atom:published>
  <atom:content type="html">&lt;p&gt;Thanks to RDF and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1cf5c700&quot;&gt;Linked Data&lt;/a&gt;, it&amp;#39;s becoming a lot easier for us to explain and reveal the depth of the OpenLink technology portfolio.&lt;/p&gt; &lt;p&gt;Here is a look at our offerings by product family:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://data.openlinksw.com/about/html/http://data.openlinksw.com/oplweb/product_family/uda&quot; id=&quot;link-id1161c6d0&quot;&gt;Universal Data Access Drivers&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://data.openlinksw.com/about/html/http://data.openlinksw.com/oplweb/product_family/virtuoso&quot; id=&quot;link-id17945fc8&quot;&gt;Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://data.openlinksw.com/about/html/http://data.openlinksw.com/oplweb/product_family/dca&quot; id=&quot;link-id10f899c0&quot;&gt;Distributed Collaborative Applications&lt;/a&gt; (DCA)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/development&quot; id=&quot;link-id1c55ac70&quot;&gt;Developer Kits &amp;amp; Frameworks&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://data.openlinksw.com/oplweb/product_family/utilities&quot; id=&quot;link-id1a735e50&quot;&gt;Benchamark &amp;amp; Diagnostic Utilities&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;As you explore the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id10fc4af8&quot;&gt;Linked Data graph&lt;/a&gt; exposed via our product portfolio, I expect you to experience, or at least spot, the virtuous potential of high SDQ (&lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1442&quot; id=&quot;link-id13847698&quot;&gt;Serendipitous Discovery Quotient&lt;/a&gt;) courtesy of Linked Data, which is &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 3.0&amp;#39;s answer to &lt;a href=&quot;http://dbpedia.org/resource/Search_engine_optimization&quot; id=&quot;link-id115ad4f0&quot;&gt;SEO&lt;/a&gt;. For instance, how &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://data.openlinksw.com/oplweb/dbms_family/Oracle&quot; id=&quot;link-id1cda63c8&quot;&gt;Database&lt;/a&gt;, &lt;a href=&quot;http://data.openlinksw.com/oplweb/opsys_family/Windows&quot; id=&quot;link-id1a803f18&quot;&gt;Operating System&lt;/a&gt;, and &lt;a href=&quot;http://data.openlinksw.com/oplweb/processor/universal_1&quot; id=&quot;link-id19cbaba0&quot;&gt;Processor&lt;/a&gt; family paths in the product portfolio graph (data network) unveil a lot more about &lt;a href=&quot;http://linkeddata.uriburner.com/about/html/http://www.openlinksw.com/dataspace/organization/openlink%23this&quot; id=&quot;link-ide9b7070&quot;&gt;OpenLink Software&lt;/a&gt; than meets the proverbial &amp;quot;eye&amp;quot; :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-24T18:13:50-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso, PHP Runtime Hosting: phpBB, Wordpress, Drupal, MediaWiki, and Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-24#1461</atom:id>
  <atom:published>2008-10-24T19:55:00Z</atom:published>
  <atom:content type="html">&lt;p&gt; Runtime hosting is functionality realm of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1189fee8&quot;&gt;Virtuoso&lt;/a&gt; that is sometimes easily overlooked. In this post I want to provide a simple no-hassles HOWTO guide for installing Virtuoso on Windows (32 or 64 Bit), Mac OS X (Universal or Native 64 Bit), and Linux (32 or 64 Bit). The installation guide also covers the instantiation of &lt;a href=&quot;http://dbpedia.org/resource/PhpBB&quot; id=&quot;link-id118af3a8&quot;&gt;phpBB3&lt;/a&gt; as verification of the Virtuoso hosted &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id12736b88&quot;&gt;PHP&lt;/a&gt; 3.5 runtime.&lt;/p&gt; &lt;h3&gt; What are the benefits of PHP Runtime Hosting?&lt;/h3&gt; &lt;p&gt; Like &lt;a href=&quot;http://dbpedia.org/resource/Apache&quot; id=&quot;link-id111ca408&quot;&gt;Apache&lt;/a&gt;, Virtuoso is a bona-fide &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Application_server&quot; id=&quot;link-id110d2aa8&quot;&gt;Application Server&lt;/a&gt; for PHP based applications. Unlike Apache, Virtuoso is also the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; a Hybrid Native DBMS Engine (Relational, RDF-Graph, and Document models) that is accessible via industry standard interfaces (solely)&lt;/li&gt; &lt;li&gt; a Virtual DBMS or Master &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Manager (MDM) that virtualizes heterogeneous data sources (&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x22b6f0c8&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x23af98c8&quot;&gt;JDBC&lt;/a&gt;, Web Services, Hypermedia Resources, Non Hypermedia Resources)&lt;/li&gt; &lt;li&gt; an &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=rdf%20middleware&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1116aad8&quot;&gt;RDF Middleware&lt;/a&gt; solution for RDF-zation of non RDF resources across the Web and enterprise Intranets and/or Extranets (in the form of Cartridges for data exposed via REST or SOA oriented SOAP interfaces)&lt;/li&gt; &lt;li&gt; an RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10fbe088&quot;&gt;Linked Data&lt;/a&gt; Server (meaning it can deploy RDF Linked Data based on its native and/or virtualized data)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; As result of the above, when you deploy a PHP application using Virtuoso, you inherit the following benefits:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Use of PHP-&lt;a href=&quot;http://www.iodbc.org&quot; id=&quot;link-id1159e070&quot;&gt;iODBC&lt;/a&gt; for in-process communication with Virtuoso&lt;/li&gt; &lt;li&gt; Easy generation of RDF Linked Data Views atop the &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x24f44c98&quot;&gt;SQL&lt;/a&gt; schemas of PHP applications&lt;/li&gt; &lt;li&gt; Easy deployment of RDF Linked Data from virtualized data sources&lt;/li&gt; &lt;li&gt; Less &lt;a href=&quot;http://dbpedia.org/resource/LAMP_stack&quot; id=&quot;link-id1179dff0&quot;&gt;LAMP&lt;/a&gt; monoculture (*there is no such thing as virtuous monoculture*) when dealing with PHP based Web applications.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt; As indicated in prior posts, producing RDF Linked Data from the existing Web, where a lot of content is deployed by PHP based content managers, should simply come down to RDF Views over the SQL Schemas and deployment / publishing of the RDF Views in RDF Linked data form. In a nutshell, this is what Virtuoso delivers via its PHP runtime hosting and pre packaged VADs (Virtuoso Application Distribution packages), for popular PHP based applications such as: &lt;a href=&quot;http://blogs.usnet.private:8893/weblog/kidehen@openlinksw.com/127/dbpedia.org/resource/PhpBB&quot; id=&quot;link-id120cc6368&quot;&gt;phpBB3&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Drupal&quot; id=&quot;link-id111ff1c0&quot;&gt;Drupal&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/WordPress&quot; id=&quot;link-id111e26f8&quot;&gt;WordPress&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/MediaWiki&quot; id=&quot;link-id10ea0258&quot;&gt;MediaWiki&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; In addition, to the RDF Linked Data deployment, we&amp;#39;ve also taken the traditional LAMP installation tedium out of the typical PHP application deployment process. For instance, you don&amp;#39;t have to rebuild PHP 3.5 (32 or 64 Bit) on Windows, Mac OS X, or Linux to get going, simply install Virtuoso, and then select a VAD package for the relevant application and you&amp;#39;re set. If the application of choice isn&amp;#39;t pre packaged by us, simply install as you would when using Apache, which comes dow to situating the PHP files in your Web structure under the Web Application&amp;#39;s root directory.&lt;/p&gt; &lt;h3&gt; Installation Guide&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; Download the Virtuoso installer for Windows (&lt;a href=&quot;http://download.openlinksw.com/downwiz/login.vsp?pfam=2&amp;amp;pform=26&amp;amp;pcat=47&amp;amp;prod=virtuoso-uim-unisvr-ent&amp;amp;os=i686-generic-win-32&amp;amp;os2=i686-generic-win-32&amp;amp;xpfam=virtuoso&amp;amp;xpform=personal&amp;amp;xpcat=unisvr&amp;amp;xos=i686-generic-win-32&amp;amp;release-dbms=6.1-virt61&quot; id=&quot;link-id11d084578&quot;&gt;32 Bit msi file&lt;/a&gt; or &lt;a href=&quot;http://download.openlinksw.com/downwiz/login.vsp?pfam=2&amp;amp;pform=26&amp;amp;pcat=47&amp;amp;prod=virtuoso-uim-unisvr-ent&amp;amp;os=x86_64-generic-win-64&amp;amp;os2=x86_64-generic-win-64&amp;amp;xpfam=virtuoso&amp;amp;xpform=personal&amp;amp;xpcat=unisvr&amp;amp;xos=x86_64-generic-win-64&amp;amp;release-dbms=6.1-virt61&quot; id=&quot;link-id11aea67a8&quot;&gt;64 Bit msi file&lt;/a&gt;), Mac OS X (&lt;a href=&quot;http://download.openlinksw.com/downwiz/login.vsp?pfam=2&amp;amp;pform=26&amp;amp;pcat=47&amp;amp;prod=virtuoso-uim-unisvr-ent&amp;amp;os=universal-apple-macosx10.6-32&amp;amp;os2=universal-apple-macosx10.6-32&amp;amp;xpfam=virtuoso&amp;amp;xpform=personal&amp;amp;xpcat=unisvr&amp;amp;xos=universal-apple-macosx10.6-32&amp;amp;release-dbms=6.1-virt61&quot; id=&quot;link-id11a93bef8&quot;&gt;Universal Binary dmg file&lt;/a&gt;), or instantiate the &lt;a href=&quot;http://www.openlinksw.com/oat/wiki/main/Main/ODSInstallationEC2&quot; id=&quot;link-id111fe248&quot;&gt;Virtuoso EC2 AMI&lt;/a&gt; (*search for pattern: &amp;quot;Virtuoso when using the Firefox extension for EC2 as the AMI ID is currently: ami-7c31d515 and name: virtuoso-test/virtuoso-cloud-beta-9-i386.manifest.xml, for latest cut*)&lt;/li&gt; &lt;li&gt; Run the installer (or download the movies using the links in the related section below)&lt;/li&gt; &lt;li&gt; Go to the Virtuoso Conductor (*which will show up at the end of the installation process* or go to http://localhost:8890/conductor)&lt;/li&gt; &lt;li&gt; Go to the &amp;quot;Admin&amp;quot; tab within the (X)HTML based UI and select the &amp;quot;Packages&amp;quot; sub-menu item (a Tab)&lt;/li&gt; &lt;li&gt; Pick phpBB3 (or any other pre-packaged PHP app) and then click on &amp;quot;Install/Upgrase&amp;quot;&lt;/li&gt; &lt;li&gt; The watch one of my silent movies or read the initial startup guides for Virtuoso hosted phpBB3, Drupal, Wordpress, MediaWiki.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;p&gt; At the current time, I&amp;#39;ve only provided links to ZIP files containing the Virtuoso installation &amp;quot;silent movies&amp;quot;. This approach is a short-term solution to some of my current movie publishing challenges re. YouTube and Vimeo -- where the compressed output hasn&amp;#39;t been of acceptable visual quality. Once resolved, I will publish much more &amp;quot;Multimedia Web&amp;quot; friendly movies :-)&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_Vista_Linked_Data_Demo.mov.zip&quot; id=&quot;link-id11642450&quot;&gt;Windows Vista (x64) Installation Movie&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_MacOSX_Linked_Data_Demo.mov.zip&quot; id=&quot;link-id11210498&quot;&gt;Mac OS X (x64 &amp;amp; Universal binary) Installation Movie&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://my-movies.s3.amazonaws.com/Virtuoso_PHPBB3_EC2_AMI_Linked_Data_Demo.zip&quot; id=&quot;link-id111ff268&quot;&gt;Virtuoso EC2 Cloud Edition Installation Movie&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtuosoPHP&quot; id=&quot;link-id12038b6c8&quot;&gt;Guide for PHP based Application Deployment using Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-25T21:19:59-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Virtuous Web of Linked Data -- Business Perspective (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-24#1462</atom:id>
  <atom:published>2008-10-24T15:56:55Z</atom:published>
  <atom:content type="html">&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling&quot; id=&quot;link-id115d8420&quot;&gt;Orri Erling&lt;/a&gt; (Program Manager: OpenLink &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id111293d8&quot;&gt;Virtuoso&lt;/a&gt;) has dropped a well explained reiteration of the essence of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id115d85a0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1161b138&quot;&gt;Web&lt;/a&gt;&amp;quot; or &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Web&amp;quot; with an emphasis on the business value. His post is titled: &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1459&quot; id=&quot;link-id1109d340&quot;&gt;State of the Semantic Web (Part 1) - Sociology, Business, and Messaging&lt;/a&gt;. &lt;p&gt;Typically, Orri&amp;#39;s post are targeted at the hard core RDF and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id115e2818&quot;&gt;SQL&lt;/a&gt; DBMS audiences, but in this particular post, he shoots straight at the business community revealing &amp;quot;Opportunity Cost&amp;quot; containment as the invisible driver behind the business aspects of any market inflection.&lt;/p&gt; &lt;p&gt;Remember, the Web isn&amp;#39;t ubiquitous because its users mastered the mechanics and virtues of HTML and/or HTTP. Web ubiquity is a function of the opportunity cost of not being on the Web, courtesy of the network effects of hyperlinked documents -- i.e., the instant gratification of traversing documents on the Web via a single click action. In similar fashion, the Linked Data Web&amp;#39;s ubiquity will simply come down to the opportunity cost of not being &amp;quot;inside the Web&amp;quot;, courtesy of the network effects of hyperlinked entities (documents, people, music, books, and other &amp;quot;Things&amp;quot;). &lt;/p&gt; &lt;p&gt;Here are some excerpts from Orri&amp;#39;s post:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;Every time there is a major shift in technology, this shift needs to be motivated by addressing a new class of problem. This means doing something that could not be done before. The last time this happened was when the relational database became the dominant IT technology. At that time, the questions involved putting the enterprise in the database and building a cluster of line of business applications around the database. The argument for the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id113779e8&quot;&gt;RDBMS&lt;/a&gt; was that you did not have to constrain the set of queries that might later be made, when designing the database. In other words, it was making things more ad hoc. This was opposed then on grounds of being less efficient than the hierarchical and network databases which the relational eventually replaced.&lt;/cite&gt; &lt;cite&gt;Today, the point of the Data Web is that you do not have to constrain what your data can join or integrate with, when you design your database. The counter-argument is that this is slow and geeky and not scalable. See the similarity?&lt;/cite&gt; &lt;cite&gt;A difference is that we are not specifically aiming at replacing the RDBMS. In fact, if you know exactly what you will query and have a well defined workload, a relational representation optimized for the workload will give you about 10x the performance of the equivalent RDF warehouse. OLTP remains a relational-only domain. &lt;/cite&gt; &lt;cite&gt;However, when we are talking about doing queries and analytics against the Web, or even against more than a handful of relational systems, the things which make RDBMS good become problematic.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;If we think about Web 1.0 as a period where the distinguishing noun was: &amp;quot;Author&amp;quot;, and Web 2.0 the noun: &amp;quot;Journalist&amp;quot;, we should be able to see that what comes next is the noun: &amp;quot;Analyst&amp;quot;. This new generation analyst would be equipped with de-referencable Web Identity courtesy of their Person &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id111ab7d0&quot;&gt;Entity&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id10f23220&quot;&gt;URI&lt;/a&gt;. The analyst&amp;#39;s URI would also be the critical component of Web based low cost attribution ecosystem; one that ultimately turns the URI into the analyst&amp;#39;s brand emblem / imprint.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;a href=&quot;http://blog.whatfettle.com/about/&quot; id=&quot;link-id1120fb88&quot;&gt;Paul Downey&lt;/a&gt; - &lt;a href=&quot;http://blog.whatfettle.com/2008/10/24/on-the-vanity-of-demanding-attribution/&quot; id=&quot;link-id111590b8&quot;&gt;Vanity of Demanding Attribution&lt;/a&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-10-24T14:49:18-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Semantic Web, Part 1 - Sociology, Business, and Messaging (update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-10-24#1460</atom:id>
  <atom:published>2008-10-24T10:19:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was in &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x1f18a540&quot;&gt;Vienna&lt;/a&gt; for the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1ec788a0&quot;&gt;Linked Data&lt;/a&gt; Practitioners gathering this week. Danny Ayers asked me if I would &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x20838238&quot;&gt;blog&lt;/a&gt; about the State of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x20694ed8&quot;&gt;Semantic Web&lt;/a&gt; or write the &lt;i&gt;This Week&amp;#39;s Semantic Web&lt;/i&gt; column. I don&amp;#39;t have the time to cover all that may have happened during the past week but I will editorialize about the questions that again were raised in Vienna. How these things relate to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x20b1cd38&quot;&gt;Virtuoso&lt;/a&gt; will be covered separately. This is about the overarching questions of the times, not the finer points of geek craft.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x1ff31b30&quot;&gt;Sören Auer&lt;/a&gt; asked me to say a few things about relational to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f8118e0&quot;&gt;RDF&lt;/a&gt; mapping. I will cite some highlights from this, as they pertain to the general scene. There was an &amp;quot;open hacking&amp;quot; session Wednesday night featuring lightning talks. I will use some of these too as a starting point.&lt;/p&gt; &lt;h3&gt;The messaging?&lt;/h3&gt; &lt;p&gt;The &lt;a href=&quot;http://www.w3.org/2001/sw/sweo/&quot; id=&quot;link-id0x1dc39210&quot;&gt;SWEO&lt;/a&gt; (Semantic Web Education and Outreach) interest group of the W3C spent some time looking for an elevator pitch for the Semantic Web. It became &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1f24dd98&quot;&gt;Data&lt;/a&gt; Unleashed.&amp;quot; Why not? Let&amp;#39;s give this some context.&lt;/p&gt; &lt;p&gt;So, if we are holding a &lt;i&gt;Semantic Web 101&lt;/i&gt; session, where should we begin? I hazard to guess that we should not begin by writing a FOAF file in Turtle by hand, as this is one thing that is not likely to happen in the real world.&lt;/p&gt; &lt;p&gt;Of course, the social aspect of the Data Web is the most immediately engaging, so a demo might be to go make an account with &lt;a href=&quot;http://myopenlink.net/&quot; id=&quot;link-id0x1f5e0198&quot;&gt;myopenlink&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x1ec49a00&quot;&gt;net&lt;/a&gt; and see that after one has entered the data one normally enters for any social network, one has become a Data Web citizen. This means that one can be found, just like this, with a query against the set of data spaces hosted on the system. Then we just need a few pages that repurpose this data and relate it to other data. We show some samples of queries like this in our &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1ee35f70&quot;&gt;Billion Triples Challenge&lt;/a&gt; demo. We will make a webcast about this to make it all clearer.&lt;/p&gt; &lt;p&gt;Behold: The Data Web is about the world becoming a database; writing &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x20644808&quot;&gt;SPARQL&lt;/a&gt; queries or triples is incidental. You will write FOAF files by hand just as little as you now write &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1fd9fbc0&quot;&gt;SQL&lt;/a&gt; insert statements for filling in your account &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1dfd3540&quot;&gt;information&lt;/a&gt; on Myspace.&lt;/p&gt; &lt;p&gt;Every time there is a major shift in technology, this shift needs to be motivated by addressing a new class of problem. This means doing something that could not be done before. The last time this happened was when the relational database became the dominant IT technology. At that time, the questions involved putting the enterprise in the database and building a cluster of Line Of Business (LOB) applications around the database. The argument for the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1e920868&quot;&gt;RDBMS&lt;/a&gt; was that you did not have to constrain the set of queries that might later be made, when designing the database. In other words, it was making things more &lt;i&gt;ad hoc&lt;/i&gt;. This was opposed then on grounds of being less efficient than the hierarchical and network databases which the relational eventually replaced.&lt;/p&gt; &lt;p&gt;Today, the point of the Data Web is that you do not have to constrain what your data can join or integrate with, when you design your database. The counter-argument is that this is slow and geeky and not scalable. See the similarity?&lt;/p&gt; &lt;p&gt;A difference is that we are not specifically aiming at replacing the RDBMS. In fact, if you know exactly what you will query and have a well defined workload, a relational representation optimized for the workload will give you about 10x the performance of the equivalent RDF warehouse. OLTP remains a relational-only domain.&lt;/p&gt; &lt;p&gt;However, when we are talking about doing queries and analytics against the Web, or even against more than a handful of relational systems, the things which make RDBMS good become problematic.&lt;/p&gt; &lt;h3&gt;What is the business value of this?&lt;/h3&gt; &lt;p&gt;The most reliable of human drives is the drive to make oneself known. This drives all, from any social scene to business communications to politics. Today, when you want to proclaim you exist, you do so first on the Web. The Web did not become the prevalent media because business loved it for its own sake, it became prevalent because business could not afford not to assert their presence there. If anything, the Web eroded the communications dominance of a lot of players, which was not welcome but still had to be dealt with, by embracing the Web.&lt;/p&gt; &lt;p&gt;Today, in a world driven by data, the Data Web will be catalyzed by similar factors: If your data is not there, you will not figure in query results. Search engines will play some role there but also many social applications will have reports that are driven by published data. Also consider any e-commerce, any marketplace, and so forth. The Data Portability movement is a case in point: Users want to own their own content; silo operators want to capitalize on holding it. Right now, we see these things in silos; the Data Web will create bridges between these, and what is now in silo data centers will be increasingly available on an ad hoc basis with Open Data.&lt;/p&gt; &lt;p&gt;Again, we see a movement from the specialized to the generic: What LinkedIn does in its data center can be done with ad hoc queries with &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1e715138&quot;&gt;linked open data&lt;/a&gt;. Of course, LinkedIn does these things somewhat more efficiently because their system is built just for this task, but the linked data approach has the built-in readiness to join with everything else at almost no cost, without making a new data warehouse for each new business question.&lt;/p&gt; &lt;p&gt;We could call this the sociological aspect of the thing. Getting to more concrete business, we see an economy that, we could say, without being alarmists, is confronted with some issues. Well, generally when times are bad, this results in consolidation of property and power. Businesses fail and get split up and sold off in pieces, government adds controls and regulations and so forth. This means ad hoc data integration, as control without data is just pretense. If times are lean, this also means that there is little readiness to do wholesale replacement of systems, which will take years before producing anything. So we must play with what there is and make it deliver, in ways and conditions that were not necessarily anticipated. The agility of the Data Web, if correctly understood, can be of great benefit there, especially on the reporting and business intelligence side. Specifically mapping line-of-business systems into RDF on the fly will help with integration, making the specialized warehouse the slower and more expensive alternative. But this too is needed at times.&lt;/p&gt; &lt;p&gt;But for the RDF community to be taken seriously there, the messaging must be geared in this direction. Writing FOAF files by hand is not where you begin the pitch. Well, what is more natural then having a global, queriable information space, when you have a global information driven economy?&lt;/p&gt; &lt;p&gt;The Data Web is about making this happen. First with doing this in published generally available data; next with the enterprises having their private data for their own use but still linking toward the outside, even though private data stays private: You can still use standard terms and taxonomies, where they apply, when talking of proprietary information.&lt;/p&gt; &lt;h3&gt;But let&amp;#39;s get back to more specific issues&lt;/h3&gt; &lt;p&gt;At the lightning talks in Vienna, one participant said, &amp;quot;Man&amp;#39;s enemy is not the lion that eats men, it&amp;#39;s his own brother. Semantic Web&amp;#39;s enemy is the &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1aeb61b8&quot;&gt;XML&lt;/a&gt; Web services stack that ate its lunch.&amp;quot; There is some truth to the first part. The second part deserves some comment. The Web services stack is about transactions. When you have a fixed, often repeating task, it is a natural thing to make this a Web service. Even though SOA is not really prevalent in enterprise IT, it has value in things like managing supply-chain logistics with partners, etc. Lots of standard messages with unambiguous meaning. To make a parallel with the database world: first there was OLTP; then there was business intelligence. Of course, you must first have the transactions, to have something to analyze.&lt;/p&gt; &lt;p&gt;SOA is for the transactions; the Data Web is for integration, analysis, and discovery. It is the &lt;i&gt;ad hoc&lt;/i&gt; component of the real time enterprise, if you will. It is not a competitor against a transaction oriented SOA. In fact, RDF has no special genius for transactions. Another mistake that often gets made is stretching things beyond their natural niche. Doing transactions in RDF is this sort of over-stretching without real benefit.&lt;/p&gt; &lt;p&gt;&amp;quot;I made an ontology and it really did solve a problem. How do I convince the enterprise people, the MBA who says it&amp;#39;s too complex, the developer who says it is not what he&amp;#39;s used to, and so on?&amp;quot;&lt;/p&gt; &lt;p&gt;This is an education question. One of the findings of SWEO&amp;#39;s enterprise survey was that there was awareness that difficult problems existed. There were and are corporate ontologies and taxonomies, diversely implemented. Some of these needs are recognized. RDF based technologies offer to make these more open standards based. open standards have proven economical in the past. What we also hear is that major enterprises do not even know what their information and human resources assets are: Experts can&amp;#39;t be found even when they are in the next department, or reports and analysis gets buried in wikis, spreadsheets, and emails.&lt;/p&gt; &lt;p&gt;Just as when SQL took off, we need vendors to do workshops on getting started with a technology. The affair in Vienna was a step in this direction. Another type of event specially focusing on vertical problems and their Data Web solutions is a next step. For example, one could do a workshop on integrating supply chain information with Data Web technologies. Or one on making enterprise &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1fbd3398&quot;&gt;knowledge&lt;/a&gt; bases from HR, CRM, office automation, wikis, etc. The good thing is that all these things are additions to, not replacements of, the existing mission-critical infrastructure. And better use of what you already have ought to be the theme of the day.&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-27T11:28:07-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Semantic Web, Part 1 - Sociology, Business, and Messaging (update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-10-24#1459</atom:id>
  <atom:published>2008-10-24T10:19:03Z</atom:published>
  <atom:content type="html">&lt;p&gt;I was in &lt;a href=&quot;http://dbpedia.org/resource/Vienna&quot; id=&quot;link-id0x28471870&quot;&gt;Vienna&lt;/a&gt; for the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x26f0ec28&quot;&gt;Linked Data&lt;/a&gt; Practitioners gathering this week. Danny Ayers asked me if I would &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x26cf7678&quot;&gt;blog&lt;/a&gt; about the State of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x273087e0&quot;&gt;Semantic Web&lt;/a&gt; or write the &lt;i&gt;This Week&amp;#39;s Semantic Web&lt;/i&gt; column. I don&amp;#39;t have the time to cover all that may have happened during the past week but I will editorialize about the questions that again were raised in Vienna. How these things relate to &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x264e11b8&quot;&gt;Virtuoso&lt;/a&gt; will be covered separately. This is about the overarching questions of the times, not the finer points of geek craft.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://www.informatik.uni-leipzig.de/~auer/foaf.rdf#me&quot; id=&quot;link-id0x2787de70&quot;&gt;Sören Auer&lt;/a&gt; asked me to say a few things about relational to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x280b12f8&quot;&gt;RDF&lt;/a&gt; mapping. I will cite some highlights from this, as they pertain to the general scene. There was an &amp;quot;open hacking&amp;quot; session Wednesday night featuring lightning talks. I will use some of these too as a starting point.&lt;/p&gt; &lt;h3&gt;The messaging?&lt;/h3&gt; &lt;p&gt;The &lt;a href=&quot;http://www.w3.org/2001/sw/sweo/&quot; id=&quot;link-id0x28078030&quot;&gt;SWEO&lt;/a&gt; (Semantic Web Education and Outreach) interest group of the W3C spent some time looking for an elevator pitch for the Semantic Web. It became &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x290a48c0&quot;&gt;Data&lt;/a&gt; Unleashed.&amp;quot; Why not? Let&amp;#39;s give this some context.&lt;/p&gt; &lt;p&gt;So, if we are holding a &lt;i&gt;Semantic Web 101&lt;/i&gt; session, where should we begin? I hazard to guess that we should not begin by writing a FOAF file in Turtle by hand, as this is one thing that is not likely to happen in the real world.&lt;/p&gt; &lt;p&gt;Of course, the social aspect of the Data Web is the most immediately engaging, so a demo might be to go make an account with &lt;a href=&quot;http://myopenlink.net/&quot; id=&quot;link-id0x272ed6d0&quot;&gt;myopenlink&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/.NET_Framework&quot; id=&quot;link-id0x277dbbd0&quot;&gt;net&lt;/a&gt; and see that after one has entered the data one normally enters for any social network, one has become a Data Web citizen. This means that one can be found, just like this, with a query against the set of data spaces hosted on the system. Then we just need a few pages that repurpose this data and relate it to other data. We show some samples of queries like this in our &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x25fda5c8&quot;&gt;Billion Triples Challenge&lt;/a&gt; demo. We will make a webcast about this to make it all clearer.&lt;/p&gt; &lt;p&gt;Behold: The Data Web is about the world becoming a database; writing &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x278c3878&quot;&gt;SPARQL&lt;/a&gt; queries or triples is incidental. You will write FOAF files by hand just as little as you now write &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x27e6be18&quot;&gt;SQL&lt;/a&gt; insert statements for filling in your account &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x2727a278&quot;&gt;information&lt;/a&gt; on Myspace.&lt;/p&gt; &lt;p&gt;Every time there is a major shift in technology, this shift needs to be motivated by addressing a new class of problem. This means doing something that could not be done before. The last time this happened was when the relational database became the dominant IT technology. At that time, the questions involved putting the enterprise in the database and building a cluster of Line Of Business (LOB) applications around the database. The argument for the &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x26020128&quot;&gt;RDBMS&lt;/a&gt; was that you did not have to constrain the set of queries that might later be made, when designing the database. In other words, it was making things more &lt;i&gt;ad hoc&lt;/i&gt;. This was opposed then on grounds of being less efficient than the hierarchical and network databases which the relational eventually replaced.&lt;/p&gt; &lt;p&gt;Today, the point of the Data Web is that you do not have to constrain what your data can join or integrate with, when you design your database. The counter-argument is that this is slow and geeky and not scalable. See the similarity?&lt;/p&gt; &lt;p&gt;A difference is that we are not specifically aiming at replacing the RDBMS. In fact, if you know exactly what you will query and have a well defined workload, a relational representation optimized for the workload will give you about 10x the performance of the equivalent RDF warehouse. OLTP remains a relational-only domain.&lt;/p&gt; &lt;p&gt;However, when we are talking about doing queries and analytics against the Web, or even against more than a handful of relational systems, the things which make RDBMS good become problematic.&lt;/p&gt; &lt;h3&gt;What is the business value of this?&lt;/h3&gt; &lt;p&gt;The most reliable of human drives is the drive to make oneself known. This drives all, from any social scene to business communications to politics. Today, when you want to proclaim you exist, you do so first on the Web. The Web did not become the prevalent media because business loved it for its own sake, it became prevalent because business could not afford not to assert their presence there. If anything, the Web eroded the communications dominance of a lot of players, which was not welcome but still had to be dealt with, by embracing the Web.&lt;/p&gt; &lt;p&gt;Today, in a world driven by data, the Data Web will be catalyzed by similar factors: If your data is not there, you will not figure in query results. Search engines will play some role there but also many social applications will have reports that are driven by published data. Also consider any e-commerce, any marketplace, and so forth. The Data Portability movement is a case in point: Users want to own their own content; silo operators want to capitalize on holding it. Right now, we see these things in silos; the Data Web will create bridges between these, and what is now in silo data centers will be increasingly available on an ad hoc basis with Open Data.&lt;/p&gt; &lt;p&gt;Again, we see a movement from the specialized to the generic: What LinkedIn does in its data center can be done with ad hoc queries with &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x261c7bc8&quot;&gt;linked open data&lt;/a&gt;. Of course, LinkedIn does these things somewhat more efficiently because their system is built just for this task, but the linked data approach has the built-in readiness to join with everything else at almost no cost, without making a new data warehouse for each new business question.&lt;/p&gt; &lt;p&gt;We could call this the sociological aspect of the thing. Getting to more concrete business, we see an economy that, we could say, without being alarmists, is confronted with some issues. Well, generally when times are bad, this results in consolidation of property and power. Businesses fail and get split up and sold off in pieces, government adds controls and regulations and so forth. This means ad hoc data integration, as control without data is just pretense. If times are lean, this also means that there is little readiness to do wholesale replacement of systems, which will take years before producing anything. So we must play with what there is and make it deliver, in ways and conditions that were not necessarily anticipated. The agility of the Data Web, if correctly understood, can be of great benefit there, especially on the reporting and business intelligence side. Specifically mapping line-of-business systems into RDF on the fly will help with integration, making the specialized warehouse the slower and more expensive alternative. But this too is needed at times.&lt;/p&gt; &lt;p&gt;But for the RDF community to be taken seriously there, the messaging must be geared in this direction. Writing FOAF files by hand is not where you begin the pitch. Well, what is more natural then having a global, queriable information space, when you have a global information driven economy?&lt;/p&gt; &lt;p&gt;The Data Web is about making this happen. First with doing this in published generally available data; next with the enterprises having their private data for their own use but still linking toward the outside, even though private data stays private: You can still use standard terms and taxonomies, where they apply, when talking of proprietary information.&lt;/p&gt; &lt;h3&gt;But let&amp;#39;s get back to more specific issues&lt;/h3&gt; &lt;p&gt;At the lightning talks in Vienna, one participant said, &amp;quot;Man&amp;#39;s enemy is not the lion that eats men, it&amp;#39;s his own brother. Semantic Web&amp;#39;s enemy is the &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x26273118&quot;&gt;XML&lt;/a&gt; Web services stack that ate its lunch.&amp;quot; There is some truth to the first part. The second part deserves some comment. The Web services stack is about transactions. When you have a fixed, often repeating task, it is a natural thing to make this a Web service. Even though SOA is not really prevalent in enterprise IT, it has value in things like managing supply-chain logistics with partners, etc. Lots of standard messages with unambiguous meaning. To make a parallel with the database world: first there was OLTP; then there was business intelligence. Of course, you must first have the transactions, to have something to analyze.&lt;/p&gt; &lt;p&gt;SOA is for the transactions; the Data Web is for integration, analysis, and discovery. It is the &lt;i&gt;ad hoc&lt;/i&gt; component of the real time enterprise, if you will. It is not a competitor against a transaction oriented SOA. In fact, RDF has no special genius for transactions. Another mistake that often gets made is stretching things beyond their natural niche. Doing transactions in RDF is this sort of over-stretching without real benefit.&lt;/p&gt; &lt;p&gt;&amp;quot;I made an ontology and it really did solve a problem. How do I convince the enterprise people, the MBA who says it&amp;#39;s too complex, the developer who says it is not what he&amp;#39;s used to, and so on?&amp;quot;&lt;/p&gt; &lt;p&gt;This is an education question. One of the findings of SWEO&amp;#39;s enterprise survey was that there was awareness that difficult problems existed. There were and are corporate ontologies and taxonomies, diversely implemented. Some of these needs are recognized. RDF based technologies offer to make these more open standards based. open standards have proven economical in the past. What we also hear is that major enterprises do not even know what their information and human resources assets are: Experts can&amp;#39;t be found even when they are in the next department, or reports and analysis gets buried in wikis, spreadsheets, and emails.&lt;/p&gt; &lt;p&gt;Just as when SQL took off, we need vendors to do workshops on getting started with a technology. The affair in Vienna was a step in this direction. Another type of event specially focusing on vertical problems and their Data Web solutions is a next step. For example, one could do a workshop on integrating supply chain information with Data Web technologies. Or one on making enterprise &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x260172a8&quot;&gt;knowledge&lt;/a&gt; bases from HR, CRM, office automation, wikis, etc. The good thing is that all these things are additions to, not replacements of, the existing mission-critical infrastructure. And better use of what you already have ought to be the theme of the day.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:21:50.348583-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Numerati &amp; The Magic of You!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-21#1458</atom:id>
  <atom:published>2008-10-21T15:42:52Z</atom:published>
  <atom:content type="html">&lt;p&gt;In response to &lt;a href=&quot;http://www.readwriteweb.com&quot; id=&quot;link-id111d6ae8&quot;&gt;ReadWriteWeb&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://www.readwriteweb.com/archives/who_will_control_your_data_web30.php&quot; id=&quot;link-id113c27e0&quot;&gt;Who will own your Data in Web 3.0 World?&lt;/a&gt;. My simple answer: You!&lt;/p&gt; &lt;p&gt;You will control your data in the Web 3.0 realm. If somehow this remains somewhat incomprehensible and nebulous (as is typical in this emerging realm) then simply think about this as: The Magic of You!&lt;/p&gt; &lt;p&gt;Remember, &amp;quot;You&amp;quot; was the &lt;a href=&quot;http://en.wikipedia.org/wiki/Time_Magazine&quot; id=&quot;link-id144c52a8&quot;&gt;Times&lt;/a&gt; person of the year as an acknowledgement of the Web 2.0 phenomenon, and maybe this time next year it would simply be the &amp;quot;Magic of Being You&amp;quot; that&amp;#39;s the person of the year :-)&lt;/p&gt; &lt;p&gt;Web 3.0 brings databasing to the Web (as a feature). The single most important action item at this stage is the act of creating a record for yourself, in this new &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id11540b50&quot;&gt;distributed database&lt;/a&gt; held together by an HTTP based Network (e.g., the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id115a02f8&quot;&gt;World Wide Web&lt;/a&gt;).&lt;/p&gt; &lt;h3&gt;Related:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/GetAPersonalURIIn5MinutesOrLess&quot; id=&quot;link-id113aead0&quot;&gt;Get yourself a Web Database ID in 5 minutes or less&lt;/a&gt; &lt;/li&gt; &lt;li&gt; 2006 Callout from &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id118acdd8&quot;&gt;TimBL&lt;/a&gt;: &lt;a href=&quot;http://dig.csail.mit.edu/breadcrumbs/node/71&quot; id=&quot;link-id11126580&quot;&gt;Get Yourself a URI&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Just watch the &lt;a href=&quot;http://www.youtube.com/watch?v=jBqByfoLGdU&quot; id=&quot;link-id13d19568&quot;&gt;Numerati Video&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2010-02-01T08:55:22.000017-05:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Trouble with Labels (Contd.): Data Integration &amp; SOA</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-12#1457</atom:id>
  <atom:published>2008-10-12T18:53:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;I just stumbled across an post from &lt;a href=&quot;http://www.itbusinessedge.com&quot; id=&quot;link-id10f82f50&quot;&gt;ITBusines Edge&lt;/a&gt; titled: &lt;a href=&quot;http://www.itbusinessedge.com/item/?ci=48119&quot; id=&quot;link-id10f37b90&quot;&gt;How Semantic Technology Can Help Companies with Integration&lt;/a&gt;. While reading the post I encountered the term: &lt;a href=&quot;http://dbpedia.org/resource/Master_Data_Management&quot; id=&quot;link-id11055eb8&quot;&gt;Master Data Manager (MDM)&lt;/a&gt;, and wondered to myself, &amp;quot;what&amp;#39;s that?&amp;quot; only to realize it&amp;#39;s the very same thing I described as a &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id13985af0&quot;&gt;Data Virtualization&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id1167c720&quot;&gt;Virtual Database technology&lt;/a&gt; (circa. 1998).&lt;/p&gt; &lt;p&gt;Now, if re-labeling can confuse &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14aaaaf0&quot;&gt;me&lt;/a&gt; when applied to a realm I&amp;#39;ve been intimately involved with for eons (&lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id112042f0&quot;&gt;internet&lt;/a&gt; time). I don&amp;#39;t want to imagine what it does for others who aren&amp;#39;t that intimately involved with the important data access and data integration realms. &lt;/p&gt; &lt;p&gt;On the more refreshing side, the article does shed some light on the potency of RDF and OWL when applied to the construction of conceptual views of heterogeneous data sources.&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;How do you know that data coming from one place calculates net revenue the same way that data coming from another place does? You’ve got people using the same term for different things and different terms for the same things. How do you reconcile all of that? That’s really what semantic integration is about.&amp;quot; &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;BTW - I discovered this article via another titled: &lt;a href=&quot;http://www.itbusinessedge.com/blogs/mia/?p=485&quot; id=&quot;link-id11134098&quot;&gt;Understanding Integration And How It Can Help with SOA&lt;/a&gt;, that covers SOA and Integration matters. Again, in this piece I feel the gradual realization of the virtues that RDF, OWL, and RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11048740&quot;&gt;Linked Data&lt;/a&gt; bring to bear in the vital realm of data integration across heterogeneous data silos.&lt;/p&gt; &lt;h3&gt;Conclusion&lt;/h3&gt; &lt;p&gt;A number of events, at the micro and macro economic levels, are forcing attention back to the issue of productive use of existing IT resources. The trouble with the aforementioned quest is that it ultimately unveils the global IT affliction known as: heterogeneous data silos, and the challenges of pain alleviation, that have been ignored forever or approached inadequately as clearly shown by the rapid build up of SOA horror stories in the data integration realm.&lt;/p&gt; &lt;p&gt;Data Integration via conceptualization of heterogenous data sources, that result in concrete conceptual layer data access and management, remains the greatest and most potent application of technologies associated with the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10fa5050&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; and/or &amp;quot;Linked Data&amp;quot; monikers.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.infoworld.com/article/03/05/23/21FEinnovidehen_1.html&quot; id=&quot;link-id118c9c00&quot;&gt;InforWorld 2003 Innovator article&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://weblog.infoworld.com/udell/2006/04/28.html&quot; id=&quot;link-id11057298&quot;&gt;2006 Podcast Interview with Jon Udell&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Enterprise_Information_Integration&quot; id=&quot;link-id13f89030&quot;&gt;Enterprise Information Integration&lt;/a&gt; &lt;/li&gt; &lt;li&gt;One of &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=data%20integration&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id11048b98&quot;&gt;several posts&lt;/a&gt; about our &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10fef0e0&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id10e5a068&quot;&gt;Universal Server&lt;/a&gt; and &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1406&quot; id=&quot;link-id111d5aa8&quot;&gt;Conceptual Model based data integration&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VOSHistory&quot; id=&quot;link-id11020108&quot;&gt;History of Virtuoso&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.mkbergman.com/me/&quot; id=&quot;link-id1101e7b0&quot;&gt;Mike Bergman&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://www.mkbergman.com/?p=459&quot; id=&quot;link-id10fdb640&quot;&gt;WOA: A New Enterprise Partner for Linked Data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-10-12T18:54:22-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Calamitous Nature of Opportunity</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-10#1456</atom:id>
  <atom:published>2008-10-10T16:30:53Z</atom:published>
  <atom:content type="html">&lt;p&gt;As articulated in timeless fashion by &lt;a href=&quot;http://dbpedia.org/resource/Albert_Einstein&quot; id=&quot;link-id160b76b8&quot;&gt;Albert Einstein&lt;/a&gt;: &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;The significant problems we face cannot be solved at the same level of thinking we were at when we created them. &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;This quote also applies to the current global financial mess because the essence of this crisis remains inextricably linked to dependency on outdated &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Closed_world_assumption&quot; id=&quot;link-id14a6b6c0&quot;&gt;closed world&lt;/a&gt;&amp;quot; systems.&lt;/p&gt; &lt;h3&gt;How we got here (5,000 ft. view)&lt;/h3&gt; &lt;p&gt;We have a global human network that depends on systems driven by, and confined to, &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; silos! Every time you hear a CEO, Government Official, work colleague, neighbor, sibling, or relative tell you they didn&amp;#39;t see it coming, just remember: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;For every action, there is an equal and opposite reaction&lt;/li&gt; &lt;li&gt;For every debit there is a credit&lt;/li&gt; &lt;li&gt;What goes around, comes around&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.quotedb.com/quotes/245&quot; id=&quot;link-id12ace758&quot;&gt;No man is an Island&lt;/a&gt; (little tweak: Human)&lt;/li&gt; &lt;li&gt;We are all Linked whether we like it or not&lt;/li&gt; &lt;li&gt;System preserving reboots are a feature of all intelligently designed systems.&lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Why there won&amp;#39;t be a Depression&lt;/h3&gt; &lt;p&gt;There won&amp;#39;t be a depression because we can&amp;#39;t afford one. Just like we couldn&amp;#39;t afford to continue with the manner in which our systems work today. Unlike the &amp;#39;30s, we all know that there are no absolute safe havens right now, we have enough &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13d0c258&quot;&gt;information&lt;/a&gt; at our disposal to eventually understand (post panic) that stuffing the mattress isn&amp;#39;t an option (even government bonds won&amp;#39;t cut it, ditto money market accounts).&lt;/p&gt; &lt;h3&gt;The Opportunity&lt;/h3&gt; &lt;p&gt;Take a deep breadth and tell traditional media to &amp;quot;shut up&amp;quot;. As per usual, the traditional mass media wants to have it both ways by stoking the panic and maxing out on the frenzy with reckless abandon (as per usual). If there is a time to appreciate the blogosphere and quality journalism etc.. It&amp;#39;s now.&lt;/p&gt; &lt;p&gt; Anyway, as the saying goes: &amp;quot;It&amp;#39;s always darkest before dawn&amp;quot;, and as bizarre as this may sound in some quarters, things will ultimately change for the better. It just so happened that a really big cane was required in order for us to change our dysfunctional ways :-(&lt;/p&gt; &lt;p&gt;I recently wrote a post about &amp;quot;&lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1440&quot; id=&quot;link-id115387f8&quot;&gt;zero based cognition&lt;/a&gt;&amp;quot; that sought to bring attention to the power of &amp;quot;Human Thought&amp;quot; in relation to value creation.&lt;/p&gt; &lt;p&gt;Innovative creation and dissemination of value is how we will eventually get out of the current mess (as we&amp;#39;ve done in the past). The predictability of the aforementioned reality is significantly increased by the sheer link density and resulting &amp;quot;network effects&amp;quot; potential of the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id14a595e8&quot;&gt;Internet&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id1112a570&quot;&gt;World Wide Web&lt;/a&gt;. Our ability to &amp;quot;connect the dots&amp;quot; as part of our value creation, dissemination, and consumption processing pipelines is what will ultimately separate the winners from the losers (individuals, enterprises, nations).&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://yihongs-research.blogspot.com&quot; id=&quot;link-id14b0fb90&quot;&gt;Yihong Ding&lt;/a&gt;&amp;#39;s insightful &lt;a href=&quot;http://yihongs-research.blogspot.com/2008/10/financial-crisis-who-will-be-winner.html&quot; id=&quot;link-id112197b0&quot;&gt;perspectives&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.jasonkolb.com/&quot; id=&quot;link-id112d4ad8&quot;&gt;Jason Kolb&lt;/a&gt;&amp;#39;s poignant piece titled: &lt;a href=&quot;http://www.jasonkolb.com/weblog/2008/10/the-year-the-innovation-died.html&quot; id=&quot;link-id10fe7008&quot;&gt;The Year Innovation Died&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.portfolio.com/views/blogs/the-tech-observer/2008/10/09/tech-start-ups-and-the-economys-best-hope?tid=true&quot; id=&quot;link-id14a80788&quot;&gt;Tech Start-ups and the Economy&amp;#39;s Best Hope&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://video.google.com/videoplay?docid=-9050474362583451279&quot; id=&quot;link-id11053b90&quot;&gt;Money as Debt&lt;/a&gt; - (a documentary spotted by &lt;a href=&quot;http://hyperdata.org/blog/&quot; id=&quot;link-id114c0e30&quot;&gt;Danja&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.alleyinsider.com/peter_kafka&quot; id=&quot;link-id10f01b10&quot;&gt;Peter Kalfka&lt;/a&gt;&amp;#39;s post: &lt;a href=&quot;http://www.alleyinsider.com/2008/12/startup-advice-how-to-make-the-collapse-work-for-you&quot; id=&quot;link-id10de8058&quot;&gt;Smart Startup Advice: Don&amp;#39;t Panic - Profit&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.huffingtonpost.com/nathan-gardels/soros-end-of-financial-cr_b_134008.html&quot; id=&quot;link-id10fef1e8&quot;&gt;George Soros Interview&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Mark Cuban (&lt;a href=&quot;http://blogmaverick.com/&quot; id=&quot;link-ide8b5298&quot;&gt;Blog Maverick&lt;/a&gt;) echoing &amp;quot;&lt;a href=&quot;http://blogmaverick.com/2008/10/23/the-cure-to-our-economic-problems/&quot; id=&quot;link-id10e630d8&quot;&gt;Entrepreneurship is the key&amp;quot;&lt;/a&gt; sentiment.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-10-23T22:20:17-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Linked Data Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-10#1455</atom:id>
  <atom:published>2008-10-10T02:27:44Z</atom:published>
  <atom:content type="html">&lt;p&gt; The evolution of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; into a &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id13d825f8&quot;&gt;federated database&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11821e18&quot;&gt;information&lt;/a&gt; space, and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id147f5d20&quot;&gt;knowledge&lt;/a&gt;-base hybrid continues at frenetic pace.&lt;/p&gt; &lt;p&gt; As more &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14a805a8&quot;&gt;Linked Data&lt;/a&gt; is injected into the Web from the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id114ebeb8&quot;&gt;Linking Open Data community&lt;/a&gt; and other initiatives, it&amp;#39;s important to note that &amp;quot;Linked Data&amp;quot; is available in a variety of forms such as:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Model Definition oriented Linked Data (aka. Data Dictionary)&lt;/li&gt; &lt;li&gt; Data Model Instance Data (aka. Instance Data)&lt;/li&gt; &lt;li&gt; Linked Data oriented solutions that leverage the smart data substrate that Models and Instance Data meshes deliver.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Note: The common glue across the different types of Linked Data remains the commitment to data object (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1103afe8&quot;&gt;entity&lt;/a&gt;) identification and access via de-referencable URIs (aka. record / entity level data source names).&lt;/p&gt; &lt;p&gt; As stated in my recent post titled: &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id11743278&quot;&gt;Semantic Web&lt;/a&gt;: &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1444&quot; id=&quot;link-id10f44ce0&quot;&gt;Travails to Harmony Illustrated&lt;/a&gt;. Harmonious intersections of instance data, data dictionaries (schemas, ontologies, rules etc.) provide a powerful substrate (smart data) for the development and deployment of &amp;quot;People&amp;quot; and/or &amp;quot;Machine&amp;quot; oriented solutions. Of course, others have commented on these matters and expressed similar views (see related section below).&lt;/p&gt; &lt;p&gt; The clickable venn diagram below, provides a simple exploration path that exposes the linkage that already exists, across the different Linked Data types, within the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1132fe60&quot;&gt;Linked Data Web&lt;/a&gt;.&lt;/p&gt; &lt;div&gt; &lt;map name=&quot;LiveCloud&quot;&gt; &lt;area coords=&quot;356,136,120&quot; href=&quot;http://umbel.org/images/lod_constellation.html&quot; shape=&quot;circle&quot; /&gt; &lt;area coords=&quot;140,136,120&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2008-09-18.html&quot; shape=&quot;circle&quot; /&gt; &lt;area coords=&quot;248,280,120&quot; href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/ClickableVirtSpongerCloud&quot; shape=&quot;circle&quot; /&gt; &lt;/map&gt; &lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_people_schems_venn.png&quot; usemap=&quot;#LiveCloud&quot; /&gt; &lt;/div&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://jhingran.typepad.com/&quot; id=&quot;link-id14aeb438&quot;&gt;Anant Jingran&lt;/a&gt;&amp;#39;s insightful &lt;a href=&quot;http://intranet.usnet.private:8893/anant_jhingrans_musings/2008/08/future-of-database-research-is-excellent-but-what-is-the-future-of-data.html&quot; id=&quot;link-id1158ca98&quot;&gt;LDP Conference Trip report&lt;/a&gt; &lt;/li&gt; &lt;li&gt; Anant&amp;#39;s recent post about the &lt;a href=&quot;http://jhingran.typepad.com/anant_jhingrans_musings/2008/08/future-of-database-research-is-excellent-but-what-is-the-future-of-data.html&quot; id=&quot;link-id1128fd78&quot;&gt;future of Data&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.mkbergman.com/me/&quot; id=&quot;link-id1114d330&quot;&gt;Mike Bergman&lt;/a&gt; - &lt;a href=&quot;http://www.mkbergman.com/457/a-new-constellation-in-the-linking-open-data-lod-sky/&quot; id=&quot;link-id114780f8&quot;&gt;A New Constellation in the Linking Open Data (LOD) Sky&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://fgiasson.com/me/&quot; id=&quot;link-id14aedaf0&quot;&gt;Frederick Giasson&lt;/a&gt; - &lt;a href=&quot;http://fgiasson.com/blog/index.php/2008/09/04/exploding-dbpedias-domain-using-umbel&quot; id=&quot;link-id12daa6d0&quot;&gt;Exploding DBpedia Domain using UMBEL&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-03-28T18:25:19-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Dynamic Linked Data Constellation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-09#1454</atom:id>
  <atom:published>2008-10-09T21:23:25Z</atom:published>
  <atom:content type="html">&lt;p&gt;Now that the virtues of dynamic generation of RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14c429a0&quot;&gt;Linked Data&lt;/a&gt; are becoming clearer, I guess it&amp;#39;s time to unveil the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13d7c7e0&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id115d0c20&quot;&gt;Sponger&lt;/a&gt; driven Dynamic Linked Data constellation diagram.&lt;/p&gt; &lt;p&gt;Our diagram depicts the myriad of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; sources from which RDF Linked Data is generated &amp;quot;on the fly&amp;quot; via our data source specific RDF-zation cartridges/drivers. It also unveils how the sponger leverages the Linked Data constellations of &lt;a href=&quot;http://umbel.org/&quot; id=&quot;link-id14bd5700&quot;&gt;UMBEL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id110f5a48&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id11494bc0&quot;&gt;Bio2Rdf&lt;/a&gt;, and others for lookups.&lt;/p&gt; &lt;map name=&quot;GraffleExport&quot;&gt; &lt;area shape=&quot;circle&quot; coords=&quot;723,292,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://xbel.sourceforge.net/bookmarks/xbel.xbel&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;423,309,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.w3.org/2001/sw/grddl-wg/doc29/hotel-data.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;592,285,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://farm4.static.flickr.com/3067/2590298570_304a594899_t.jpg&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;685,220,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://microformats.org/feed/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;817,182,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://en.wikipedia.org/wiki/London&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;745,447,36&quot; href=&quot;http://linkeddata.uriburner.com/about/http://www.sec.gov/Archives/edgar/data/51143/000110465908059468/ibm-20080429.xml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;597,387,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.twine.com/twine/1p2dqhdx-1jg/nova-spivack-my-public-twine&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;659,459,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.theyworkforyou.com/mp/diane_abbott/hackney_north_and_stoke_newington&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;585,494,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.discogs.com/release/634302&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;817,503,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://getsatisfaction.com/mozilla/topics/ubiquity_mostly_fails_on_mac_ppc&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;753,563,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.sec.gov/Archives/edgar/data/789019/000119312507259490/msft-20070930.xml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;676,559,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://twitter.com/statuses/user_timeline/633273.rss&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;845,592,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://ns.hr-xml.org/2_5/HR-XML-2_5/SEP/ResumeExample.xml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;845,431,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.w3.org/2003/12/rdf-in-xhtml-xslts/complete-example.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;701,375,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.molly.com/people.php&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;829,342,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://upload.wikimedia.org/wikipedia/commons/b/b0/Hydroxide_lone_pairs-2D.svg&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;341,259,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://friendfeed.com/search?q=linked+data&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;294,170,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://local.yahooapis.com/MapsService/V1/trafficData?appid=Jz0wAU7V34Ff7gCzblxD.86qjGTEn._H3KA3PEajNE3xBMIbQtEZqIqHRh0G&amp;amp;street=701+First+Street&amp;amp;city=Sunnyvale&amp;amp;state=CA&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;829,262,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://blog.disqus.net/2008/08/25/reblog-comments-can-be-blog-posts/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;407,526,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://finance.yahoo.com/q?s=AAPL&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;503,292,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://isbndb.com/d/person/berners_lee_tim.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;310,501,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://musicbrainz.org/release/37e955d4-a53c-45aa-a812-1b23b88dbc13.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;413,221,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.freebase.com/view/en/abraham_lincoln&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;553,213,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://slideshow.rubyforge.org/microformats.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;445,93,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://farm1.static.flickr.com/212/496684670_7122c831ed.jpg&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;680,663,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://cgi.ebay.com/Eclipse-by-Stephenie-Meyer-2007_W0QQitemZ250283828939QQcmdZViewItem?hash=item250283828939&amp;amp;_trkparms=240%3A1318&amp;amp;_trksid=p4295&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;553,663,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://digg.com/general_sciences/at_last-stem_cells_without_side_effects_&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;248,651,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://delicious.com/popular/blog&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;158,554,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.crunchbase.com/person/sergey-brin&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;214,477,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;209,339,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/https://bugzilla.mozilla.org/show_bug.cgi?id=251714&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;264,405,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://ma.gnolia.com/rss/full/tags/microformats&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;417,663,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.lawyer-directory.net/lawyer/Grand-Rapids-Bar-Association-Grand-Rapids-law434032.htm&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;497,733,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.concertbuzz.net/genres/classic-rock/jethro-tull.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;373,437,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://openmediaweb.org/index.php/2008/01/13/publishing-my-workout-music-in-haudio/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;373,121,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/https://apml.engagd.com/apml/danielabarbosa.myopenid.com.apml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;245,559,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.w3.org/2001/sw/grddl-wg/doc29/hotel-data.html&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;170,650,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.amazon.co.uk/Owl-Representing-Information-Ontology-Language/dp/1412034485/ref=sr_1_1/203-3289794-0348766?ie=UTF8&amp;amp;s=books&amp;amp;qid=1177155160&amp;amp;sr=1-1&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;327,703,36&quot; href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;481,170,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.w3.org/2004/08/TalkFiles/iCal/TalksAll.ics&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;487,615,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://openlibrary.org/b/OL7983950M&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;158,417,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://xml.weather.yahoo.com/forecastrss?p=USCA1116&amp;amp;u=f&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;608,729,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.youtube.com&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;726,148,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.lespetitescases.net/semantique-et-xhtml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;773,663,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://upcoming.org/event/130719/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;553,118,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://tech.yahoo.com/pr/apple-ipod-video-30gb-black-mp3-player/1992981873&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;608,609,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://socialgraph.apis.google.com/otherme?pretty=1&amp;amp;q=www.openlinksw.com/blog/~kidehen/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;487,516,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/oai:dcmi.ischool.washington.edu:article/8&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;635,158,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://news.bbc.co.uk/rss/feeds.opml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;256,261,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.google.com/base/feeds/snippets?bq=%20%5bemployer:%20Hewlett-Packard%5d%20%20%5bjob%20type:full-time%5d&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;120,248,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.apple.com/&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;120,339,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.fileinfo.net/extension/atom&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;337,343,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/urn:lsid:ubio.org:namebank:12292&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;340,598,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.maine.gov/portal/government/calendar.shtml&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;337,343,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/urn:lsid:ubio.org:namebank:12292&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;585,494,36&quot; href=&quot;http://linkeddata.uriburner.com/about/html/http://www.discogs.com/release/634302&quot; /&gt; &lt;area shape=&quot;circle&quot; coords=&quot;491,409,36&quot; href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtSponger&quot; /&gt; &lt;area shape=&quot;poly&quot; coords=&quot;992,603,1015,557,1061,557,1100,592,1076,638,1030,638,992,603&quot; href=&quot;http://bio2rdf.org/wiki/attach/Main/bio2rdfmap_blanc.png&quot; /&gt; &lt;area shape=&quot;poly&quot; coords=&quot;995,454,1018,408,1064,408,1103,443,1079,489,1033,489,995,454&quot; href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/lod-datasets_2008-09-18.html&quot; /&gt; &lt;area shape=&quot;poly&quot; coords=&quot;919,117,943,71,989,71,1027,106,1004,152,958,152,919,117&quot; href=&quot;http://umbel.org/images/081005_lod_constellation.png&quot; /&gt; &lt;/map&gt; &lt;img alt=&quot;Image&quot; border=&quot;0&quot; src=&quot;http://virtuoso.openlinksw.com/images/sponger-cloud.png&quot; usemap=&quot;#GraffleExport&quot; /&gt;</atom:content>
  <atom:updated>2008-10-17T10:45:53.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What is Linked Data oriented RDF-ization?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-06#1453</atom:id>
  <atom:published>2008-10-06T20:14:26Z</atom:published>
  <atom:content type="html">&lt;p&gt;RDF-ization is a term used by the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id14b4ebd0&quot;&gt;Semantic Web&lt;/a&gt; community to describe the process of generating RDF from non RDF &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Sources such as (X)HTML, Weblogs, Shared Bookmark Collections, Photo Galleries, Calendars, Contact Managers, Feed Subscriptions, Wikis, and other &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13f2a2e0&quot;&gt;information&lt;/a&gt; resource collections. &lt;/p&gt; &lt;p&gt;If the RDF generated, results in an &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id11281278&quot;&gt;entity&lt;/a&gt;-to-entity level network (graph) in which each entity is endowed with a de-referencable HTTP based ID (a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id148200f0&quot;&gt;URI&lt;/a&gt;), we end up with an enhancement to the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; that adds &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id112a5980&quot;&gt;Hyperdata&lt;/a&gt; linking across extracted entities, to the existing Hypertext based Web of linked documents (pages, images, and other information resource types). Thus, I can use the same &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id10ebc630&quot;&gt;URL&lt;/a&gt; linking mechanism to reference a broader range of &amp;quot;Things&amp;quot; i.e., documents, things that documents are about, or things loosely associated with documents.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id144304a8&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id14a96400&quot;&gt;Sponger&lt;/a&gt; is an example of an &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=rdf%20middleware&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id14d36938&quot;&gt;RDF Middleware&lt;/a&gt; solution from &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id117e5c50&quot;&gt;OpenLink Software&lt;/a&gt;. It&amp;#39;s an in-built component of the Virtuoso &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id14b4d0e0&quot;&gt;Universal Server&lt;/a&gt;, and deployable in many forms e.g., Software as Service (SaaS) or traditional software installation. It delivers RDF-ization services via a collection of Web information resource specific Cartridges/Providers/Drivers covering Wikipedia, Freebase, CrunchBase, WikiCompany, OpenLibrary, Digg, eBay, Amazon, RSS/Atom/OPML feed sources, XBRL, and many more.&lt;/p&gt; &lt;p&gt;RDF-ization alone doesn&amp;#39;t ensure valuable RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14a75b48&quot;&gt;Linked Data&lt;/a&gt; on the Web. The process of producing RDF Linked Data is ultimately about the art of effectively describing resources with an eye for &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1442fea0&quot;&gt;context&lt;/a&gt;. &lt;/p&gt; &lt;h3&gt;RDF-ization Processing Steps&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; Entity Extraction&lt;/li&gt; &lt;li&gt; Vocabulary/Schema/Ontology (Data Dictionary) mapping&lt;/li&gt; &lt;li&gt; HTTP based Proxy URI generation&lt;/li&gt; &lt;li&gt;Linked Data Cloud Lookups (e.g., perform &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id14432f00&quot;&gt;UMBEL&lt;/a&gt; lookup to add &amp;quot;isAbout&amp;quot; fidelity to graph and then lookup &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id14485f40&quot;&gt;DBpedia&lt;/a&gt; and other &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id115ea410&quot;&gt;LOD&lt;/a&gt; instance data enclaves for Identical individuals and connect via &amp;quot;owl:sameAs&amp;quot;)&lt;/li&gt; &lt;li&gt; RDF &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id14ae31c0&quot;&gt;Linked Data Graph&lt;/a&gt; projection that uses the description of the container information resource to expose the URIs of the distilled entities.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The animation that follows illustrates the process (5,000 feet view), from grabbing resources via HTTP GET, to injecting RDF Linked Data back into the Web cloud:&lt;/p&gt; &lt;div&gt; &lt;embed src=&quot;http://virtuoso.openlinksw.com/screencasts/virtuoso-rdf-middleware.swf&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;&lt;/embed&gt; &lt;/div&gt; &lt;p&gt;Note: the Shredder is a Generic Cartridge, so you would have one of these per data source type (information resource type).&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-07T17:35:24-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Cluster Paper Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-10-02#1451</atom:id>
  <atom:published>2008-10-02T10:02:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;An updated version of the paper about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xc0abc50&quot;&gt;Virtuoso&lt;/a&gt; Cluster is available at &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008webscale_rdf.pdf&quot; id=&quot;link-id16459248&quot;&gt;2008webscale_rdf.pdf&lt;/a&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-10-03T04:38:06-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Update, Billion Triples and Outlook</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-10-02#1450</atom:id>
  <atom:published>2008-10-02T10:02:32Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Virtuoso Update, Billion Triples and Outlook&lt;/div&gt; &lt;p&gt;I will say a few things about what we have been doing and where we can go.&lt;/p&gt; &lt;p&gt;Firstly, we have a fairly scalable platform with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1aa82dc0&quot;&gt;Virtuoso&lt;/a&gt; 6 Cluster. It was most recently tested with the workload discussed in the previous &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1445&quot; id=&quot;link-id1638a5b8&quot;&gt;Billion Triples post&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There is an updated version of &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008webscale_rdf.pdf&quot; id=&quot;link-id16280a68&quot;&gt;the paper about this&lt;/a&gt;. This will be presented at the web scale workshop of ISWC 2008 in Karlsruhe.&lt;/p&gt; &lt;p&gt;Right now, we are polishing some things in Virtuoso 6 -- some optimizations for smarter balancing of interconnect traffic over multiple network interfaces, and some more &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1abd3f38&quot;&gt;SQL&lt;/a&gt; optimizations specific to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1adbe410&quot;&gt;RDF&lt;/a&gt;. The must-have basics, like parallel running of sub-queries and aggregates, and all-around unrolling of loops of every kind into large partitioned batches, is all there and proven to work.&lt;/p&gt; &lt;p&gt;We spent a lot of time around the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1aaa0e78&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; story, so we got to the more advanced stuff like the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1a860a50&quot;&gt;Billion Triples Challenge&lt;/a&gt; rather late. We did along the way also run &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1a27f2a8&quot;&gt;BSBM&lt;/a&gt; with an &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1ad5c918&quot;&gt;Oracle&lt;/a&gt; back-end, with Virtuoso mapping &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1cf0e4a0&quot;&gt;SPARQL&lt;/a&gt; to SQL. This merits its own analysis in the near future. This will be the basic how-to of mapping OLTP systems to RDF. Depending on the case, one can use this for lookups in real-time or ETL.&lt;/p&gt; &lt;p&gt;RDF will deliver value in complex situations. An example of a complex relational mapping use case came from Ordnance Survey, presented at the &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x1ab96bb0&quot;&gt;RDB2RDF XG&lt;/a&gt;. Examples of complex warehouses include the &lt;a href=&quot;http://neurocommons.org/page/Main_Page&quot; id=&quot;link-id0x1adb2db0&quot;&gt;Neurocommons&lt;/a&gt; database, the Billion Triples Challenge, and the &lt;a href=&quot;http://www.garlik.com/&quot; id=&quot;link-id0x1925c7b0&quot;&gt;Garlik DataPatrol&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In comparison, the Berlin workload is really simple and one where RDF is not at its best, as amply discussed on the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c6d1480&quot;&gt;Linked Data&lt;/a&gt; forum. BSBM&amp;#39;s primary value is as a demonstrator for the basic mapping tasks that will be repeated over and over for pretty much any online system when presence on the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1a937400&quot;&gt;data&lt;/a&gt; web becomes as indispensable as presence on the HTML web.&lt;/p&gt; &lt;p&gt;I will now talk about the complex warehouse/web-harvesting side. I will come to the mapping in another post.&lt;/p&gt; &lt;p&gt;Now, all the things shown in the &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1445&quot; id=&quot;link-id14de1d18&quot;&gt;Billion Triples post&lt;/a&gt; can be done with a relational system specially built for each purpose. Since we are a general purpose &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x1a457c70&quot;&gt;RDBMS&lt;/a&gt;, we use this capability where it makes sense. For example, storing statistics about which tags or interests occur with which other tags or interests as RDF blank nodes makes no sense. We do not even make the experiment; we know ahead of time that the result is at least an order of magnitude in favor of the relational row-oriented solution in both space and time.&lt;/p&gt; &lt;p&gt;Whenever there is a data structure specially made for answering one specific question, like joint occurrence of tags, RDB and mapping is the way to go. With Virtuoso, this can fully-well coexist with physical triples, and can still be accessed in SPARQL and mixed with triples. This is territory that we have not extensively covered yet, but we will be giving some examples about this later.&lt;/p&gt; &lt;p&gt;The real value of RDF is in agility. When there is no time to design and load a new warehouse for every new question, RDF is unparalleled. Also SPARQL, once it has the necessary extensions of aggregating and sub-queries, is nicer than SQL, especially when we have sub-classes and sub-properties, transitivity, and &amp;quot;same as&amp;quot; enabled. These things have some run time cost and if there is a report one is hitting absolutely all the time, then chances are that resolving terms and identity at load-time and using materialized views in SQL is the reasonable thing. If one is inventing a new report every time, then RDF has a lot more convenience and flexibility.&lt;/p&gt; &lt;p&gt;We are just beginning to explore what we can do with data sets such as the online conversation space, linked data, and the open ontologies of &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x1aa5ea18&quot;&gt;UMBEL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id0x1a631a20&quot;&gt;OpenCyc&lt;/a&gt;. It is safe to say that we can run with real world scale without loss of query expressivity. There is an incremental cost for performance but this is not prohibitive. Serving the whole billion triples set from memory would cost about $32K in hardware. $8K will do if one can wait for disk part of the time. One can use these numbers as a basis for costing larger systems. For online search applications, one will note that running the indexes pretty much from memory is necessary for flat response time. For back office analytics this is not necessarily as critical. It all depends on the use case.&lt;/p&gt; &lt;p&gt;We expect to be able to combine geography, social proximity, subject matter, and &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0x1aebdcc8&quot;&gt;named entities&lt;/a&gt;, with hierarchical taxonomies and traditional full text, and to present this through a simple user interface.&lt;/p&gt; &lt;p&gt;We expect to do this with online response times if we have a limited set of starting points and do not navigate more than 2 or 3 steps from each starting point. An example would be to have a full text pattern and news group, and get the cloud of interests from the authors of matching posts. Another would be to make a faceted view of the properties of the 1000 people most closely connected to one person.&lt;/p&gt; &lt;p&gt;Queries like finding the fastest online responders to questions about romance across the global board-scape, or finding the person who initiates the most long running conversations about crime, take a bit longer but are entirely possible.&lt;/p&gt; &lt;p&gt;The genius of RDF is to be able to do these things within a general purpose database, ad hoc, in a single query language, mostly without materializing intermediate results. Any of these things could be done with arbitrary efficiency in a custom built system. But what is special now is that the cost of access to this type of &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1ab88490&quot;&gt;information&lt;/a&gt; and far beyond drops dramatically as we can do these things in a far less labor intensive way, with a general purpose system, with no redesigning and reloading of warehouses at every turn. The query becomes a commodity.&lt;/p&gt; &lt;p&gt;Still, one must know what to ask. In this respect, the self-describing nature of RDF is unmatched. A query like &lt;i&gt;list the top 10 attributes with the most distinct values for all persons&lt;/i&gt; cannot be done in SQL. SQL simply does not allow the columns to be variable.&lt;/p&gt; &lt;p&gt;Further, we can accept queries as text, the way people are used to supplying them, and use structure for drill-down or result-relevance, and also recognize named entities and subject matter concepts in query text. Very simple NLP will go a long way towards keeping SPARQL out of the user experience.&lt;/p&gt; &lt;p&gt;The other way of keeping query complexity hidden is to publish hand-written SPARQL as parameter-fed canned reports.&lt;/p&gt; &lt;p&gt;Between now and ISWC 2008, the last week of October, we will put out demos showing some of these things. Stay tuned.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-10-02T12:47:07.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Cluster Paper Update</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-10-02#1449</atom:id>
  <atom:published>2008-10-02T09:38:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;An updated version of the paper about &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x17b3d2c8&quot;&gt;Virtuoso&lt;/a&gt; Cluster is available at &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008webscale_rdf.pdf&quot; id=&quot;link-id16459248&quot;&gt;2008webscale_rdf.pdf&lt;/a&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-10-03T04:38:01-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Update, Billion Triples and Outlook</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-10-02#1448</atom:id>
  <atom:published>2008-10-02T09:31:17Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will say a few things about what we have been doing and where we can go.&lt;/p&gt; &lt;p&gt;Firstly, we have a fairly scalable platform with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa412e450&quot;&gt;Virtuoso&lt;/a&gt; 6 Cluster. It was most recently tested with the workload discussed in the previous &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1445&quot; id=&quot;link-id1638a5b8&quot;&gt;Billion Triples post&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;There is an updated version of &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008webscale_rdf.pdf&quot; id=&quot;link-id16280a68&quot;&gt;the paper about this&lt;/a&gt;. This will be presented at the web scale workshop of ISWC 2008 in Karlsruhe.&lt;/p&gt; &lt;p&gt;Right now, we are polishing some things in Virtuoso 6 -- some optimizations for smarter balancing of interconnect traffic over multiple network interfaces, and some more &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1c1c5f48&quot;&gt;SQL&lt;/a&gt; optimizations specific to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1bcb6108&quot;&gt;RDF&lt;/a&gt;. The must-have basics, like parallel running of sub-queries and aggregates, and all-around unrolling of loops of every kind into large partitioned batches, is all there and proven to work.&lt;/p&gt; &lt;p&gt;We spent a lot of time around the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x3a4e17c8&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; story, so we got to the more advanced stuff like the &lt;a href=&quot;http://challenge.semanticweb.org/&quot; id=&quot;link-id0x1a66c568&quot;&gt;Billion Triples Challenge&lt;/a&gt; rather late. We did along the way also run &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x188c2608&quot;&gt;BSBM&lt;/a&gt; with an &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1aa97f98&quot;&gt;Oracle&lt;/a&gt; back-end, with Virtuoso mapping &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1abd87a0&quot;&gt;SPARQL&lt;/a&gt; to SQL. This merits its own analysis in the near future. This will be the basic how-to of mapping OLTP systems to RDF. Depending on the case, one can use this for lookups in real-time or ETL.&lt;/p&gt; &lt;p&gt;RDF will deliver value in complex situations. An example of a complex relational mapping use case came from Ordnance Survey, presented at the &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x1a941678&quot;&gt;RDB2RDF XG&lt;/a&gt;. Examples of complex warehouses include the &lt;a href=&quot;http://neurocommons.org/page/Main_Page&quot; id=&quot;link-id0x1aa5a9f8&quot;&gt;Neurocommons&lt;/a&gt; database, the Billion Triples Challenge, and the &lt;a href=&quot;http://www.garlik.com/&quot; id=&quot;link-id0x372df7b0&quot;&gt;Garlik DataPatrol&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In comparison, the Berlin workload is really simple and one where RDF is not at its best, as amply discussed on the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1a671cf0&quot;&gt;Linked Data&lt;/a&gt; forum. BSBM&amp;#39;s primary value is as a demonstrator for the basic mapping tasks that will be repeated over and over for pretty much any online system when presence on the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ab83dd0&quot;&gt;data&lt;/a&gt; web becomes as indispensable as presence on the HTML web.&lt;/p&gt; &lt;p&gt;I will now talk about the complex warehouse/web-harvesting side. I will come to the mapping in another post.&lt;/p&gt; &lt;p&gt;Now, all the things shown in the &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1445&quot; id=&quot;link-id14de1d18&quot;&gt;Billion Triples post&lt;/a&gt; can be done with a relational system specially built for each purpose. Since we are a general purpose &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x340d3470&quot;&gt;RDBMS&lt;/a&gt;, we use this capability where it makes sense. For example, storing statistics about which tags or interests occur with which other tags or interests as RDF blank nodes makes no sense. We do not even make the experiment; we know ahead of time that the result is at least an order of magnitude in favor of the relational row-oriented solution in both space and time.&lt;/p&gt; &lt;p&gt;Whenever there is a data structure specially made for answering one specific question, like joint occurrence of tags, RDB and mapping is the way to go. With Virtuoso, this can fully-well coexist with physical triples, and can still be accessed in SPARQL and mixed with triples. This is territory that we have not extensively covered yet, but we will be giving some examples about this later.&lt;/p&gt; &lt;p&gt;The real value of RDF is in agility. When there is no time to design and load a new warehouse for every new question, RDF is unparalleled. Also SPARQL, once it has the necessary extensions of aggregating and sub-queries, is nicer than SQL, especially when we have sub-classes and sub-properties, transitivity, and &amp;quot;same as&amp;quot; enabled. These things have some run time cost and if there is a report one is hitting absolutely all the time, then chances are that resolving terms and identity at load-time and using materialized views in SQL is the reasonable thing. If one is inventing a new report every time, then RDF has a lot more convenience and flexibility.&lt;/p&gt; &lt;p&gt;We are just beginning to explore what we can do with data sets such as the online conversation space, linked data, and the open ontologies of &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x19cabf38&quot;&gt;UMBEL&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id0x19cecd10&quot;&gt;OpenCyc&lt;/a&gt;. It is safe to say that we can run with real world scale without loss of query expressivity. There is an incremental cost for performance but this is not prohibitive. Serving the whole billion triples set from memory would cost about $32K in hardware. $8K will do if one can wait for disk part of the time. One can use these numbers as a basis for costing larger systems. For online search applications, one will note that running the indexes pretty much from memory is necessary for flat response time. For back office analytics this is not necessarily as critical. It all depends on the use case.&lt;/p&gt; &lt;p&gt;We expect to be able to combine geography, social proximity, subject matter, and &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0x1a8202e8&quot;&gt;named entities&lt;/a&gt;, with hierarchical taxonomies and traditional full text, and to present this through a simple user interface.&lt;/p&gt; &lt;p&gt;We expect to do this with online response times if we have a limited set of starting points and do not navigate more than 2 or 3 steps from each starting point. An example would be to have a full text pattern and news group, and get the cloud of interests from the authors of matching posts. Another would be to make a faceted view of the properties of the 1000 people most closely connected to one person.&lt;/p&gt; &lt;p&gt;Queries like finding the fastest online responders to questions about romance across the global board-scape, or finding the person who initiates the most long running conversations about crime, take a bit longer but are entirely possible.&lt;/p&gt; &lt;p&gt;The genius of RDF is to be able to do these things within a general purpose database, ad hoc, in a single query language, mostly without materializing intermediate results. Any of these things could be done with arbitrary efficiency in a custom built system. But what is special now is that the cost of access to this type of &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1ab0a918&quot;&gt;information&lt;/a&gt; and far beyond drops dramatically as we can do these things in a far less labor intensive way, with a general purpose system, with no redesigning and reloading of warehouses at every turn. The query becomes a commodity.&lt;/p&gt; &lt;p&gt;Still, one must know what to ask. In this respect, the self-describing nature of RDF is unmatched. A query like &lt;i&gt;list the top 10 attributes with the most distinct values for all persons&lt;/i&gt; cannot be done in SQL. SQL simply does not allow the columns to be variable.&lt;/p&gt; &lt;p&gt;Further, we can accept queries as text, the way people are used to supplying them, and use structure for drill-down or result-relevance, and also recognize named entities and subject matter concepts in query text. Very simple NLP will go a long way towards keeping SPARQL out of the user experience.&lt;/p&gt; &lt;p&gt;The other way of keeping query complexity hidden is to publish hand-written SPARQL as parameter-fed canned reports.&lt;/p&gt; &lt;p&gt;Between now and ISWC 2008, the last week of October, we will put out demos showing some of these things. Stay tuned.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:32:28.645488-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Where Are All the RDF-based Semantic Web Applications?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-10-01#1447</atom:id>
  <atom:published>2008-10-01T23:09:00Z</atom:published>
  <atom:content type="html">&lt;p&gt; In response to the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id15971040&quot;&gt;Semantic Web&lt;/a&gt; Technology&amp;quot; application classification scheme espoused by &lt;a href=&quot;http://www.readwriteweb.com&quot; id=&quot;link-id16391540&quot;&gt;ReadWriteWeb&lt;/a&gt; (RWW), emphasized in the post titled: &lt;a href=&quot;http://www.readwriteweb.com/archives/rdf_semantic_web_apps.php&quot; id=&quot;link-id1157eaa0&quot;&gt;Where are all the RDF-based Semantic Web Apps?&lt;/a&gt;, here is my attempt to clarify and reintroduce what &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id15a43758&quot;&gt;OpenLink Software&lt;/a&gt; offers (today) in relation to Semantic Web technology. &lt;/p&gt; &lt;p&gt; From the RWW Top-Down category, which I interpret as: technologies that produce RDF from non RDF &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; sources. Our product portfolio is comprised of the following; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14f05818&quot;&gt;Virtuoso Universal Server&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id162c8630&quot;&gt;OpenLink Data Spaces&lt;/a&gt;, &lt;a href=&quot;http://oat.openlinksw.com&quot; id=&quot;link-id134e1a00&quot;&gt;OpenLink Ajax Toolkit&lt;/a&gt;, and &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id160b3bf8&quot;&gt;OpenLink Data Explorer&lt;/a&gt; (which includes ubiquity commands).&lt;/p&gt; &lt;h3&gt;Virtuoso Universal Server functionality summary:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Generation of RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id161d5f50&quot;&gt;Linked Data&lt;/a&gt; Views of &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id161d5978&quot;&gt;SQL&lt;/a&gt;, XML, and &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Services in general &lt;/li&gt; &lt;li&gt;Deployment of RDF Linked Data &lt;/li&gt; &lt;li&gt;&amp;quot;On the Fly&amp;quot; generation of RDF Linked Data from Document Web &lt;a href=&quot;http://www.w3.org/TR/webarch/&quot; id=&quot;link-id178bbc08&quot;&gt;information resources&lt;/a&gt; (i.e. distillation of entities from their containers e.g. Web pages) via Cartridges / Drivers&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id162c2118&quot;&gt;SPARQL&lt;/a&gt; query language support &lt;/li&gt; &lt;li&gt;SPARQL extensions that bring SPARQL closer to SQL e.g Aggregates, Update, Insert, Delete Named Graph support (i.e. use of logical names to partition RDF data within Virtuoso&amp;#39;s multi-model dbms engine) &lt;/li&gt; &lt;li&gt;Inference Engine (currently in use re. &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id14f563c0&quot;&gt;DBpedia&lt;/a&gt; via Yago and &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id113273b8&quot;&gt;UMBEL&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Host and exposes data from &lt;a href=&quot;http://dbpedia.org/resource/Drupal&quot; id=&quot;link-id123d3bd8&quot;&gt;Drupal&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/WordPress&quot; id=&quot;link-id141adf40&quot;&gt;Wordpress&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/MediaWiki&quot; id=&quot;link-id1604b450&quot;&gt;MediaWiki&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/PhpBB&quot; id=&quot;link-id141013a8&quot;&gt;phpBB3&lt;/a&gt; as RDF Linked Data via in-built support for &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id14661e58&quot;&gt;PHP&lt;/a&gt; runtime&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/ODSInstallationEC2&quot; id=&quot;link-id146c84d0&quot;&gt;Available as an EC2 AMI&lt;/a&gt; &lt;/li&gt; &lt;li&gt;etc..&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;OpenLink Data Spaces functionality summary:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Simple mechanism for Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id15473770&quot;&gt;Web&lt;/a&gt; enabling yourself by giving you an &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/GetAPersonalURIIn5MinutesOrLess&quot; id=&quot;link-id15f6d278&quot;&gt;HTTP based User ID&lt;/a&gt; (a de-referencable &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id15aaeb68&quot;&gt;URI&lt;/a&gt;) that is linked to a &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen&quot; id=&quot;link-id15a7a840&quot;&gt;FOAF based Profile page&lt;/a&gt; and OpenID&lt;/li&gt; &lt;li&gt;Binds all your data sources (blogs, wikis, bookmarks, photos, calendar items etc. ) to your URI so can &amp;quot;Find&amp;quot; things by only remembering your URI&lt;/li&gt; &lt;li&gt;Makes your profile page and personal URI the focal point of Linked Data Web presence&lt;/li&gt; &lt;li&gt;Delivers Data Portability (using data access by value or &lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id16212838&quot;&gt;data access by reference&lt;/a&gt;) across data silos (e.g. Web 2.0 style social networks)&lt;/li&gt; &lt;li&gt;Allows you make annotations about anything in your own &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id14668010&quot;&gt;Data Space&lt;/a&gt;(s) on the Web without exposure to RDF markup&lt;/li&gt; &lt;li&gt;A Briefcase feature that provides a WebDAV driven RDF Linked Data variant of functionality seen in Mac OS X Spotlight and WinFS with the addition of SPARQL compliance&lt;/li&gt; &lt;li&gt;Automatically generates &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id14691440&quot;&gt;RDFa&lt;/a&gt; in its (X)HTML pages&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id14fae7b8&quot;&gt;Blog&lt;/a&gt;, Wiki, WebDAV File Server, Shared Bookmarks, Calendar, and other applications that look and feel like Web 2.0 counterparts but emitt RDF Linked Data amongst a plethora of data exchange formats&lt;/li&gt; &lt;li&gt;Available as an EC2 AMI&lt;/li&gt; &lt;li&gt;etc..&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;OpenLink Ajax Toolkit functionality summary:&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Provides binding to SQL, RDF, XML, and Web Services via Ajax Database Connectivity Layer (you only need an &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id11550548&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id13ae5f68&quot;&gt;JDBC&lt;/a&gt;, OLE-DB, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id162803e8&quot;&gt;ADO&lt;/a&gt;.NET, XMLA Driver, or Web Service on the backend for dynamic data access from Javascript)&lt;/li&gt; &lt;li&gt;All controls are Ajax Database Connectivity bound (widgets get their data from Ajax Database Connectivity data sources)&lt;/li&gt; &lt;li&gt;Bundled with Virtuoso and &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id161dfe90&quot;&gt;ODS&lt;/a&gt; installations.&lt;/li&gt; &lt;li&gt;etc.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;OpenLink Data Explorer functionality summary&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Distills entities associated with information resource style containers (e.g. Web Pages or files) as RDF Linked Data&lt;/li&gt; &lt;li&gt;Exposes the RDF based &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id12a42ed8&quot;&gt;Linked Data graph&lt;/a&gt; associated with information resources (see the Linked Data behind Web pages)&lt;/li&gt; &lt;li&gt;Ubiquity commands for invoking the above&lt;/li&gt; &lt;li&gt;Available as a &lt;a href=&quot;http://linkeddata.uriburner.com/ode&quot; id=&quot;link-id15a0d2b0&quot;&gt;Hosted Service&lt;/a&gt; or &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id138b9fa8&quot;&gt;Firefox Extension&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Bundled with Virtuoso and ODS installations&lt;/li&gt; &lt;li&gt;etc.&lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;Note:&lt;/h3&gt; &lt;p&gt;Of course you could have simply looked up &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink&quot; id=&quot;link-id14ef2c10&quot;&gt;OpenLink Software&amp;#39;s FOAF based Profile page&lt;/a&gt; (*note the Linked Data Explorer tab*), or simply passed the &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id14cbf5c8&quot;&gt;FOAF&lt;/a&gt; profile page &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id16453e28&quot;&gt;URL&lt;/a&gt; to a Linked Data aware client application such as: &lt;a href=&quot;http://linkeddata.uriburner.com/ode&quot; id=&quot;link-id15a80500&quot;&gt;OpenLink Data Explorer&lt;/a&gt;, &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id1586a360&quot;&gt;Zitgist&lt;/a&gt; &lt;a href=&quot;http://dataviewer.zitgist.com&quot; id=&quot;link-id16249f60&quot;&gt;Data Viewer&lt;/a&gt;, &lt;a href=&quot;http://beckr.org/marbles&quot; id=&quot;link-id15993fb0&quot;&gt;Marbles&lt;/a&gt;, and &lt;a href=&quot;http://dig.csail.mit.edu/2005/ajar/release/tabulator/0.8/tab.html&quot; id=&quot;link-id14d63048&quot;&gt;Tabulator&lt;/a&gt;, and obtained information. Remember, &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id138ba838&quot;&gt;OpenLink Software&lt;/a&gt; is an &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1173e120&quot;&gt;Entity&lt;/a&gt; of Type: &lt;a href=&quot;http://xmlns.com/foaf/0.1/Organization&quot; id=&quot;link-id138b87b8&quot;&gt;foaf:Organization&lt;/a&gt;, on the burgeoning Linked Data Web :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html&quot; id=&quot;link-id163a0c88&quot;&gt;Linked Data Planet Keynote&lt;/a&gt; (RDFa based remix edition)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://semanticbusiness.blogspot.com/2008/09/report-on-cusp-global-review-of.html&quot; id=&quot;link-id11471a40&quot;&gt;On The Cusp: A Global Review of the Semantic Web Industry.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-10-02T15:27:41-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>OpenLink Software&#39;s Virtuoso Submission to the Billion Triples Challenge</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-09-30#1446</atom:id>
  <atom:published>2008-09-30T16:24:34Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;h2&gt;Introduction&lt;/h2&gt; &lt;p&gt;We use &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xb03e418&quot;&gt;Virtuoso&lt;/a&gt; 6 Cluster Edition to demonstrate the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Text and structured &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xbd9dae8&quot;&gt;information&lt;/a&gt; based lookups&lt;/li&gt; &lt;li&gt;Analytics queries&lt;/li&gt; &lt;li&gt;Analysis of co-occurrence of features like interests and tags.&lt;/li&gt; &lt;li&gt;Dealing with identity of multiple IRI&amp;#39;s (&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0xb383dd8&quot;&gt;owl&lt;/a&gt;:sameAs)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The demo is based on a set of canned &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xbda6298&quot;&gt;SPARQL&lt;/a&gt; queries that can be invoked using the &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0xbb292f0&quot;&gt;OpenLink Data Explorer&lt;/a&gt; (&lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0xc263528&quot;&gt;ODE&lt;/a&gt;) Firefox extension.&lt;/p&gt; &lt;p&gt;The demo queries can also be run directly against the SPARQL end point.&lt;/p&gt; &lt;p&gt;The demo is being worked on at the time of submission and may be shown online by appointment.&lt;/p&gt; &lt;p&gt;Automatic annotation of the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa173378&quot;&gt;data&lt;/a&gt; based on &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0xbdda558&quot;&gt;named entity extraction&lt;/a&gt; is being worked on at the time of this submission. By the time of ISWC 2008 the set of sample queries will be enhanced with queries based on extracted &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0xa66fbe0&quot;&gt;named entities&lt;/a&gt; and their relationships in the &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0xa06e2c8&quot;&gt;UMBEL&lt;/a&gt; and Open CYC ontologies. &lt;/p&gt; &lt;p&gt;Also examples involving owl:sameAs are being added, likewise with similarity metrics and search hit scores.&lt;/p&gt; &lt;h2&gt;The Data&lt;/h2&gt; &lt;p&gt;The database consists of the billion triples data sets and some additions like Umbel. Also the Freebase extract is newer than the challenge original.&lt;/p&gt; &lt;p&gt;The triple count is 1115 million.&lt;/p&gt; &lt;p&gt;In the case of web harvested resources, the data is loaded in one graph per resource.&lt;/p&gt; &lt;p&gt;In the case of larger data sets like &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xc2bf770&quot;&gt;Dbpedia&lt;/a&gt; or the US census, all triples of the provenance share a data set specific graph.&lt;/p&gt; &lt;p&gt;All string literals are additionally indexed in a full text index. No stop words are used.&lt;/p&gt; &lt;p&gt;Most queries do not specify a graph. Thus they are evaluated against the union of all the graphs in the database. The indexing scheme is SPOG, GPOS, POGS, OPGS. All indices ending in S are bitmap indices. &lt;/p&gt; &lt;h2&gt;The Queries &lt;/h2&gt; &lt;p&gt;The demo uses Virtuoso SPARQL extensions in most queries. These extensions consist on one hand of well known &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xaf8cb40&quot;&gt;SQL&lt;/a&gt; features like aggregation with grouping and existence and value subqueries and on the other of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xafdceb8&quot;&gt;RDF&lt;/a&gt; specific features. The latter include run time RDFS and OWL inferencing support and backward chaining subclasses and transitivity. &lt;/p&gt; &lt;h3&gt;Simple Lookups&lt;/h3&gt; &lt;pre&gt;sparql select ?s ?p (bif:search_excerpt (bif:vector (&amp;#39;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xbb64dd0&quot;&gt;semantic&amp;#39;, &amp;#39;web&lt;/a&gt;&amp;#39;), ?o)) where { ?s ?p ?o . filter (bif:contains (?o, &amp;quot;&amp;#39;semantic web&amp;#39;&amp;quot;)) } limit 10 ; &lt;/pre&gt; &lt;p&gt;This looks up triples with semantic web in the object and makes a search hit summary of the literal, highlighting the search terms. &lt;/p&gt; &lt;pre&gt;sparql select ?tp count(*) where { ?s ?p2 ?o2 . ?o2 a ?tp . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?tp order by desc 2 limit 40 ; &lt;/pre&gt; &lt;p&gt;This looks at what sorts of things are referenced by the properties of the foaf handle plaid_skirt.&lt;/p&gt; &lt;p&gt;What are these things called?&lt;/p&gt; &lt;pre&gt;sparql select ?lbl count(*) where { ?s ?p2 ?o2 . ?o2 rdfs:label ?lbl . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?lbl order by desc 2 ; &lt;/pre&gt; &lt;p&gt;Many of these things do not have a rdfs:label. Let us use a more general concept of lable which groups dc:title, foaf:name and other name-like properties together. The subproperties are resolved at run time, there is no materialization. &lt;/p&gt; &lt;pre&gt;sparql define input:inference &amp;#39;b3s&amp;#39; select ?lbl count(*) where { ?s ?p2 ?o2 . ?o2 b3s:label ?lbl . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?lbl order by desc 2 ; &lt;/pre&gt; &lt;p&gt;We can list sources by the topics they contain. Below we look for graphs that mention terrorist bombing. &lt;/p&gt; &lt;pre&gt;sparql select ?g count(*) where { graph ?g { ?s ?p ?o . filter (bif:contains (?o, &amp;quot;&amp;#39;terrorist bombing&amp;#39;&amp;quot;)) } } group by ?g order by desc 2 ; &lt;/pre&gt; &lt;p&gt;Now some web 2.0 tagging of search results. The &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0xa8b89f8&quot;&gt;tag&lt;/a&gt; cloud of &amp;quot;computer&amp;quot;&lt;/p&gt; &lt;pre&gt;sparql select ?lbl count (*) where { ?s ?p ?o . ?o bif:contains &amp;quot;computer&amp;quot; . ?s sioc:topic ?tg . optional { ?tg rdfs:label ?lbl } } group by ?lbl order by desc 2 limit 40 ; &lt;/pre&gt; &lt;p&gt;This query will find the posters who talk the most about sex.&lt;/p&gt; &lt;pre&gt;sparql select ?auth count (*) where { ?d dc:creator ?auth . ?d ?p ?o filter (bif:contains (?o, &amp;quot;sex&amp;quot;)) } group by ?auth order by desc 2 ; &lt;/pre&gt; &lt;h3&gt;Analytics &lt;/h3&gt; &lt;p&gt;We look for people who are joined by having relatively uncommon interests but do not know each other.&lt;/p&gt; &lt;pre&gt;sparql select ?i ?cnt ?n1 ?n2 ?p1 ?p2 where { { select ?i count (*) as ?cnt where { ?p foaf:interest ?i } group by ?i } filter ( ?cnt &amp;gt; 1 &amp;amp;&amp;amp; ?cnt &amp;lt; 10) . ?p1 foaf:interest ?i . ?p2 foaf:interest ?i . filter (?p1 != ?p2 &amp;amp;&amp;amp; !bif:exists ((select (1) where {?p1 foaf:knows ?p2 })) &amp;amp;&amp;amp; !bif:exists ((select (1) where {?p2 foaf:knows ?p1 }))) . ?p1 foaf:nick ?n1 . ?p2 foaf:nick ?n2 . } order by ?cnt limit 50 ; &lt;/pre&gt; &lt;p&gt;The query takes a fairly long time, mostly spent counting the interested in 25M interest triples. It then takes people that share the interest and checks that neither claims to know the other. It then sorts the results rarest interest first. The query can be written more efficently but is here just to show that database-wide scans of the population are possible ad hoc. &lt;/p&gt; &lt;p&gt;Now we go to SQL to make a tag co-occurrence matrix. This can be used for showing a Technorati-style related tags line at the bottom of a search result page. This showcases the use of SQL together with SPARQL. The half-matrix of tags t1, t2 with the co-occurrence count at the intersection is much more efficiently done in SQL, specially since it gets updated as the data changes. This is an example of materialized intermediate results based on warehoused RDF. &lt;/p&gt; &lt;pre&gt;create table tag_count (tcn_tag iri_id_8, tcn_count int, primary key (tcn_tag)); alter index tag_count on tag_count partition (tcn_tag int (0hexffff00)); create table tag_coincidence (tc_t1 iri_id_8, tc_t2 iri_id_8, tc_count int, tc_t1_count int, tc_t2_count int, primary key (tc_t1, tc_t2)) alter index tag_coincidence on tag_coincidence partition (tc_t1 int (0hexffff00)); create index tc2 on tag_coincidence (tc_t2, tc_t1) partition (tc_t2 int (0hexffff00)); &lt;/pre&gt; &lt;p&gt;How many times each topic is mentioned?&lt;/p&gt; &lt;pre&gt; insert into tag_count select * from (sparql define output:valmode &amp;quot;LONG&amp;quot; select ?t count (*) as ?cnt where { ?s sioc:topic ?t } group by ?t) xx option (quietcast); &lt;/pre&gt; &lt;p&gt;Take all t1, t2 where t1 and t2 are tags of the same subject, store only the permutation where the internal id of t1 &amp;lt; that of t2.&lt;/p&gt; &lt;pre&gt;insert into tag_coincidence (tc_t1, tc_t2, tc_count) select &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;, cnt from (select &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;, count (*) as cnt from (sparql define output:valmode &amp;quot;LONG&amp;quot; select ?t1 ?t2 where { ?s sioc:topic ?t1 . ?s sioc:topic ?t2 }) tags where &amp;quot;t1&amp;quot; &amp;lt; &amp;quot;t2&amp;quot; group by &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;) xx where isiri_id (&amp;quot;t1&amp;quot;) and isiri_id (&amp;quot;t2&amp;quot;) option (quietcast); &lt;/pre&gt; &lt;p&gt;Now put the individual occurrence counts into the same table with the co-occurrence. This denormalization makes the related tags lookup faster. &lt;/p&gt; &lt;pre&gt;update tag_coincidence set tc_t1_count = (select tcn_count from tag_count where tcn_tag = tc_t1), tc_t2_count = (select tcn_count from tag_count where tcn_tag = tc_t2); &lt;/pre&gt; &lt;p&gt;Now each tag_coincidence row has the joint occurrence count and individual occurrence counts. A single select will return a Technorati-style related tags listing. &lt;/p&gt; &lt;p&gt;To show the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x9d4bc60&quot;&gt;URI&lt;/a&gt;&amp;#39;s of the tags: &lt;/p&gt; &lt;pre&gt;select top 10 id_to_iri (tc_T1), id_to_iri (tc_t2), tc_count from tag_coincidence order by tc_count desc; &lt;/pre&gt; &lt;h3&gt;Social Networks &lt;/h3&gt; &lt;p&gt;We look at what interests people have &lt;/p&gt; &lt;pre&gt;sparql select ?o ?cnt where { { select ?o count (*) as ?cnt where { ?s foaf:interest ?o } group by ?o } filter (?cnt &amp;gt; 100) } order by desc 2 limit 100 ; &lt;/pre&gt; &lt;p&gt;Now the same for the Harry Potter fans &lt;/p&gt; &lt;pre&gt;sparql select ?i2 count (*) where { ?p foaf:interest &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0xba0b390&quot;&gt;http&lt;/a&gt;://www.livejournal.com/interests.bml?int=harry+potter&amp;gt; . ?p foaf:interest ?i2 } group by ?i2 order by desc 2 limit 20 ; &lt;/pre&gt; &lt;p&gt;We see whether knows relations are symmmetrical. We return the top n people that others claim to know without being reciprocally known.&lt;/p&gt; &lt;pre&gt;sparql select ?celeb, count (*) where { ?claimant foaf:knows ?celeb . filter (!bif:exists ((select (1) where { ?celeb foaf:knows ?claimant }))) } group by ?celeb order by desc 2 limit 10 ; &lt;/pre&gt; &lt;p&gt;We look for a well connected person to start from.&lt;/p&gt; &lt;pre&gt;sparql select ?p count (*) where { ?p foaf:knows ?k } group by ?p order by desc 2 limit 50 ; &lt;/pre&gt; &lt;p&gt;We look for the most connected of the many online identities of Stefan Decker.&lt;/p&gt; &lt;pre&gt;sparql select ?sd count (distinct ?xx) where { ?sd a foaf:Person . ?sd ?name ?ns . filter (bif:contains (?ns, &amp;quot;&amp;#39;Stefan Decker&amp;#39;&amp;quot;)) . ?sd foaf:knows ?xx } group by ?sd order by desc 2 ; &lt;/pre&gt; &lt;p&gt;We count the transitive closure of Stefan Decker&amp;#39;s connections &lt;/p&gt; &lt;pre&gt;sparql select count (*) where { { select * where { ?s foaf:knows ?o } } option (transitive, t_distinct, t_in(?s), t_out(?o)) . filter (?s = &amp;lt;mailto:stefan.decker@deri.org&amp;gt;) } ; &lt;/pre&gt; &lt;p&gt;Now we do the same while following owl:sameAs links.&lt;/p&gt; &lt;pre&gt;sparql define input:same-as &amp;quot;yes&amp;quot; select count (*) where { { select * where { ?s foaf:knows ?o } } option (transitive, t_distinct, t_in(?s), t_out(?o)) . filter (?s = &amp;lt;mailto:stefan.decker@deri.org&amp;gt;) } ; &lt;/pre&gt; &lt;h2&gt;Demo System&lt;/h2&gt; &lt;p&gt;The system runs on Virtuoso 6 Cluster Edition. The database is partitioned into 12 partitions, each served by a distinct server process. The system demonstrated hosts these 12 servers on 2 machines, each with 2 xXeon 5345 and 16GB memory and 4 SATA disks. For scaling, the processes and corresponding partitions can be spread over a larger number of machines. If each ran on its own server with 16GB RAM, the whole data set could be served from memory. This is desirable for search engine or fast analytics applications. Most of the demonstrated queries run in memory on second invocation. The timing difference between first and second run is easily an order of magnitude. &lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-10-03T06:20:48.000094-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>OpenLink Software&#39;s Virtuoso Submission to the Billion Triples Challenge</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-09-30#1445</atom:id>
  <atom:published>2008-09-30T15:39:26Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;h2&gt;Introduction&lt;/h2&gt; &lt;p&gt;We use &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa278560&quot;&gt;Virtuoso&lt;/a&gt; 6 Cluster Edition to demonstrate the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Text and structured &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xb3a4490&quot;&gt;information&lt;/a&gt; based lookups&lt;/li&gt; &lt;li&gt;Analytics queries&lt;/li&gt; &lt;li&gt;Analysis of co-occurrence of features like interests and tags.&lt;/li&gt; &lt;li&gt;Dealing with identity of multiple IRI&amp;#39;s (&lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0xa904bd8&quot;&gt;owl&lt;/a&gt;:sameAs)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The demo is based on a set of canned &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xac185d0&quot;&gt;SPARQL&lt;/a&gt; queries that can be invoked using the &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0xb8efe28&quot;&gt;OpenLink Data Explorer&lt;/a&gt; (&lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id0xb341808&quot;&gt;ODE&lt;/a&gt;) Firefox extension.&lt;/p&gt; &lt;p&gt;The demo queries can also be run directly against the SPARQL end point.&lt;/p&gt; &lt;p&gt;The demo is being worked on at the time of submission and may be shown online by appointment.&lt;/p&gt; &lt;p&gt;Automatic annotation of the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa2fcc88&quot;&gt;data&lt;/a&gt; based on &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0xc085440&quot;&gt;named entity extraction&lt;/a&gt; is being worked on at the time of this submission. By the time of ISWC 2008 the set of sample queries will be enhanced with queries based on extracted &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id0xa92b3e0&quot;&gt;named entities&lt;/a&gt; and their relationships in the &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0xa1c7c38&quot;&gt;UMBEL&lt;/a&gt; and Open CYC ontologies. &lt;/p&gt; &lt;p&gt;Also examples involving owl:sameAs are being added, likewise with similarity metrics and search hit scores.&lt;/p&gt; &lt;h2&gt;The Data&lt;/h2&gt; &lt;p&gt;The database consists of the billion triples data sets and some additions like Umbel. Also the Freebase extract is newer than the challenge original.&lt;/p&gt; &lt;p&gt;The triple count is 1115 million.&lt;/p&gt; &lt;p&gt;In the case of web harvested resources, the data is loaded in one graph per resource.&lt;/p&gt; &lt;p&gt;In the case of larger data sets like &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0xa949850&quot;&gt;Dbpedia&lt;/a&gt; or the US census, all triples of the provenance share a data set specific graph.&lt;/p&gt; &lt;p&gt;All string literals are additionally indexed in a full text index. No stop words are used.&lt;/p&gt; &lt;p&gt;Most queries do not specify a graph. Thus they are evaluated against the union of all the graphs in the database. The indexing scheme is SPOG, GPOS, POGS, OPGS. All indices ending in S are bitmap indices. &lt;/p&gt; &lt;h2&gt;The Queries &lt;/h2&gt; &lt;p&gt;The demo uses Virtuoso SPARQL extensions in most queries. These extensions consist on one hand of well known &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xc116190&quot;&gt;SQL&lt;/a&gt; features like aggregation with grouping and existence and value subqueries and on the other of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xa9047f0&quot;&gt;RDF&lt;/a&gt; specific features. The latter include run time RDFS and OWL inferencing support and backward chaining subclasses and transitivity. &lt;/p&gt; &lt;h3&gt;Simple Lookups&lt;/h3&gt; &lt;pre&gt;sparql select ?s ?p (bif:search_excerpt (bif:vector (&amp;#39;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xbe38070&quot;&gt;semantic&amp;#39;, &amp;#39;web&lt;/a&gt;&amp;#39;), ?o)) where { ?s ?p ?o . filter (bif:contains (?o, &amp;quot;&amp;#39;semantic web&amp;#39;&amp;quot;)) } limit 10 ; &lt;/pre&gt; &lt;p&gt;This looks up triples with semantic web in the object and makes a search hit summary of the literal, highlighting the search terms. &lt;/p&gt; &lt;pre&gt;sparql select ?tp count(*) where { ?s ?p2 ?o2 . ?o2 a ?tp . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?tp order by desc 2 limit 40 ; &lt;/pre&gt; &lt;p&gt;This looks at what sorts of things are referenced by the properties of the foaf handle plaid_skirt.&lt;/p&gt; &lt;p&gt;What are these things called?&lt;/p&gt; &lt;pre&gt;sparql select ?lbl count(*) where { ?s ?p2 ?o2 . ?o2 rdfs:label ?lbl . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?lbl order by desc 2 ; &lt;/pre&gt; &lt;p&gt;Many of these things do not have a rdfs:label. Let us use a more general concept of lable which groups dc:title, foaf:name and other name-like properties together. The subproperties are resolved at run time, there is no materialization. &lt;/p&gt; &lt;pre&gt;sparql define input:inference &amp;#39;b3s&amp;#39; select ?lbl count(*) where { ?s ?p2 ?o2 . ?o2 b3s:label ?lbl . ?s foaf:nick ?o . filter (bif:contains (?o, &amp;quot;plaid_skirt&amp;quot;)) } group by ?lbl order by desc 2 ; &lt;/pre&gt; &lt;p&gt;We can list sources by the topics they contain. Below we look for graphs that mention terrorist bombing. &lt;/p&gt; &lt;pre&gt;sparql select ?g count(*) where { graph ?g { ?s ?p ?o . filter (bif:contains (?o, &amp;quot;&amp;#39;terrorist bombing&amp;#39;&amp;quot;)) } } group by ?g order by desc 2 ; &lt;/pre&gt; &lt;p&gt;Now some web 2.0 tagging of search results. The &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0xa366510&quot;&gt;tag&lt;/a&gt; cloud of &amp;quot;computer&amp;quot;&lt;/p&gt; &lt;pre&gt;sparql select ?lbl count (*) where { ?s ?p ?o . ?o bif:contains &amp;quot;computer&amp;quot; . ?s sioc:topic ?tg . optional { ?tg rdfs:label ?lbl } } group by ?lbl order by desc 2 limit 40 ; &lt;/pre&gt; &lt;p&gt;This query will find the posters who talk the most about sex.&lt;/p&gt; &lt;pre&gt;sparql select ?auth count (*) where { ?d dc:creator ?auth . ?d ?p ?o filter (bif:contains (?o, &amp;quot;sex&amp;quot;)) } group by ?auth order by desc 2 ; &lt;/pre&gt; &lt;h3&gt;Analytics &lt;/h3&gt; &lt;p&gt;We look for people who are joined by having relatively uncommon interests but do not know each other.&lt;/p&gt; &lt;pre&gt;sparql select ?i ?cnt ?n1 ?n2 ?p1 ?p2 where { { select ?i count (*) as ?cnt where { ?p foaf:interest ?i } group by ?i } filter ( ?cnt &amp;gt; 1 &amp;amp;&amp;amp; ?cnt &amp;lt; 10) . ?p1 foaf:interest ?i . ?p2 foaf:interest ?i . filter (?p1 != ?p2 &amp;amp;&amp;amp; !bif:exists ((select (1) where {?p1 foaf:knows ?p2 })) &amp;amp;&amp;amp; !bif:exists ((select (1) where {?p2 foaf:knows ?p1 }))) . ?p1 foaf:nick ?n1 . ?p2 foaf:nick ?n2 . } order by ?cnt limit 50 ; &lt;/pre&gt; &lt;p&gt;The query takes a fairly long time, mostly spent counting the interested in 25M interest triples. It then takes people that share the interest and checks that neither claims to know the other. It then sorts the results rarest interest first. The query can be written more efficently but is here just to show that database-wide scans of the population are possible ad hoc. &lt;/p&gt; &lt;p&gt;Now we go to SQL to make a tag co-occurrence matrix. This can be used for showing a Technorati-style related tags line at the bottom of a search result page. This showcases the use of SQL together with SPARQL. The half-matrix of tags t1, t2 with the co-occurrence count at the intersection is much more efficiently done in SQL, specially since it gets updated as the data changes. This is an example of materialized intermediate results based on warehoused RDF. &lt;/p&gt; &lt;pre&gt;create table tag_count (tcn_tag iri_id_8, tcn_count int, primary key (tcn_tag)); alter index tag_count on tag_count partition (tcn_tag int (0hexffff00)); create table tag_coincidence (tc_t1 iri_id_8, tc_t2 iri_id_8, tc_count int, tc_t1_count int, tc_t2_count int, primary key (tc_t1, tc_t2)) alter index tag_coincidence on tag_coincidence partition (tc_t1 int (0hexffff00)); create index tc2 on tag_coincidence (tc_t2, tc_t1) partition (tc_t2 int (0hexffff00)); &lt;/pre&gt; &lt;p&gt;How many times each topic is mentioned?&lt;/p&gt; &lt;pre&gt; insert into tag_count select * from (sparql define output:valmode &amp;quot;LONG&amp;quot; select ?t count (*) as ?cnt where { ?s sioc:topic ?t } group by ?t) xx option (quietcast); &lt;/pre&gt; &lt;p&gt;Take all t1, t2 where t1 and t2 are tags of the same subject, store only the permutation where the internal id of t1 &amp;lt; that of t2.&lt;/p&gt; &lt;pre&gt;insert into tag_coincidence (tc_t1, tc_t2, tc_count) select &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;, cnt from (select &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;, count (*) as cnt from (sparql define output:valmode &amp;quot;LONG&amp;quot; select ?t1 ?t2 where { ?s sioc:topic ?t1 . ?s sioc:topic ?t2 }) tags where &amp;quot;t1&amp;quot; &amp;lt; &amp;quot;t2&amp;quot; group by &amp;quot;t1&amp;quot;, &amp;quot;t2&amp;quot;) xx where isiri_id (&amp;quot;t1&amp;quot;) and isiri_id (&amp;quot;t2&amp;quot;) option (quietcast); &lt;/pre&gt; &lt;p&gt;Now put the individual occurrence counts into the same table with the co-occurrence. This denormalization makes the related tags lookup faster. &lt;/p&gt; &lt;pre&gt;update tag_coincidence set tc_t1_count = (select tcn_count from tag_count where tcn_tag = tc_t1), tc_t2_count = (select tcn_count from tag_count where tcn_tag = tc_t2); &lt;/pre&gt; &lt;p&gt;Now each tag_coincidence row has the joint occurrence count and individual occurrence counts. A single select will return a Technorati-style related tags listing. &lt;/p&gt; &lt;p&gt;To show the &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0xaf355c8&quot;&gt;URI&lt;/a&gt;&amp;#39;s of the tags: &lt;/p&gt; &lt;pre&gt;select top 10 id_to_iri (tc_T1), id_to_iri (tc_t2), tc_count from tag_coincidence order by tc_count desc; &lt;/pre&gt; &lt;h3&gt;Social Networks &lt;/h3&gt; &lt;p&gt;We look at what interests people have &lt;/p&gt; &lt;pre&gt;sparql select ?o ?cnt where { { select ?o count (*) as ?cnt where { ?s foaf:interest ?o } group by ?o } filter (?cnt &amp;gt; 100) } order by desc 2 limit 100 ; &lt;/pre&gt; &lt;p&gt;Now the same for the Harry Potter fans &lt;/p&gt; &lt;pre&gt;sparql select ?i2 count (*) where { ?p foaf:interest &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0xa274410&quot;&gt;http&lt;/a&gt;://www.livejournal.com/interests.bml?int=harry+potter&amp;gt; . ?p foaf:interest ?i2 } group by ?i2 order by desc 2 limit 20 ; &lt;/pre&gt; &lt;p&gt;We see whether knows relations are symmmetrical. We return the top n people that others claim to know without being reciprocally known.&lt;/p&gt; &lt;pre&gt;sparql select ?celeb, count (*) where { ?claimant foaf:knows ?celeb . filter (!bif:exists ((select (1) where { ?celeb foaf:knows ?claimant }))) } group by ?celeb order by desc 2 limit 10 ; &lt;/pre&gt; &lt;p&gt;We look for a well connected person to start from.&lt;/p&gt; &lt;pre&gt;sparql select ?p count (*) where { ?p foaf:knows ?k } group by ?p order by desc 2 limit 50 ; &lt;/pre&gt; &lt;p&gt;We look for the most connected of the many online identities of Stefan Decker.&lt;/p&gt; &lt;pre&gt;sparql select ?sd count (distinct ?xx) where { ?sd a foaf:Person . ?sd ?name ?ns . filter (bif:contains (?ns, &amp;quot;&amp;#39;Stefan Decker&amp;#39;&amp;quot;)) . ?sd foaf:knows ?xx } group by ?sd order by desc 2 ; &lt;/pre&gt; &lt;p&gt;We count the transitive closure of Stefan Decker&amp;#39;s connections &lt;/p&gt; &lt;pre&gt;sparql select count (*) where { { select * where { ?s foaf:knows ?o } } option (transitive, t_distinct, t_in(?s), t_out(?o)) . filter (?s = &amp;lt;mailto:stefan.decker@deri.org&amp;gt;) } ; &lt;/pre&gt; &lt;p&gt;Now we do the same while following owl:sameAs links.&lt;/p&gt; &lt;pre&gt;sparql define input:same-as &amp;quot;yes&amp;quot; select count (*) where { { select * where { ?s foaf:knows ?o } } option (transitive, t_distinct, t_in(?s), t_out(?o)) . filter (?s = &amp;lt;mailto:stefan.decker@deri.org&amp;gt;) } ; &lt;/pre&gt; &lt;h2&gt;Demo System&lt;/h2&gt; &lt;p&gt;The system runs on Virtuoso 6 Cluster Edition. The database is partitioned into 12 partitions, each served by a distinct server process. The system demonstrated hosts these 12 servers on 2 machines, each with 2 xXeon 5345 and 16GB memory and 4 SATA disks. For scaling, the processes and corresponding partitions can be spread over a larger number of machines. If each ran on its own server with 16GB RAM, the whole data set could be served from memory. This is desirable for search engine or fast analytics applications. Most of the demonstrated queries run in memory on second invocation. The timing difference between first and second run is easily an order of magnitude. &lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-10-03T06:20:43.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Semantic Web: Travails to Harmony Illustrated (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-27#1444</atom:id>
  <atom:published>2008-09-27T19:14:48Z</atom:published>
  <atom:content type="html">&lt;h3&gt;All about &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Dictionary issues&lt;/h3&gt; &lt;p&gt;Over emphasis on &lt;a href=&quot;http://dbpedia.org/resource/Data_dictionary&quot; id=&quot;link-id10e99460&quot;&gt;&lt;a href=&quot;http://dbpedia.org/resource/Description_logic&quot; id=&quot;link-id0xa2800c0&quot;&gt;Description Logics&lt;/a&gt;&lt;/a&gt; (RDFS, OWL, Inference &amp;amp; Reasoning etc) matters without any actual real-world instance &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x9d3a838&quot;&gt;data&lt;/a&gt; (e.g., lot&amp;#39;s of reasoning over RDF in zip files or local drives).&lt;/p&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_people_schems_venn2_missing_lod.png&quot; /&gt; &lt;h3&gt;All about Linking Openly accessible RDF Data Sets&lt;/h3&gt; &lt;p&gt;Over emphasis on Instance Data without Data Dictionary appreciation and utilization (e.g., &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10ea0728&quot;&gt;Linked Data&lt;/a&gt; instance level linkage via &amp;quot;&lt;a href=&quot;http://www.w3.org/TR/owl-ref/#sameAs-def&quot; id=&quot;link-id10f2f650&quot;&gt;owl:sameAs&lt;/a&gt;&amp;quot;). &lt;/p&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_people_schems_venn2_missing_dict.png&quot; /&gt; &lt;h3&gt;All about Applications &amp;amp; Frameworks&lt;/h3&gt; &lt;p&gt;Here we are dealing with numerous applications and frameworks that inextricably bind Instance Data Management and Data Dictionaries. Basically, an all or nothing proposition, if you want to delve into the RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id110b4970&quot;&gt;Linked Data&lt;/a&gt; solutions realm.&lt;/p&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_people_schems_venn2_missing_modularity.png&quot; /&gt; &lt;p&gt;Often overlooked, is the fact that the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-ide398d40&quot;&gt;Linked Data Web&lt;/a&gt; - as an aspect of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id19653440&quot;&gt;Semantic Web&lt;/a&gt; innovation continuum - is fundamentally about designing and constructing an &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id19cac3a0&quot;&gt;Open World&lt;/a&gt;&amp;quot; compatible DBMS for the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id127fd198&quot;&gt;Internet&lt;/a&gt;. Thus, erstwhile &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Closed_world_assumption&quot; id=&quot;link-id1252b338&quot;&gt;Closed World&lt;/a&gt;&amp;quot; DBMS components such as Data Dictionaries (handlers of Data Definition, Referential Integrity etc.) and actual Instance Data, are now distributed and loosely coupled. Thus, your data could be in one &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id12bf6338&quot;&gt;Data Space&lt;/a&gt; while the data dictionary resides in another. In actual fact, you could have several loosely bound data dictionaries that serve the specific Inference and Reasoning needs of a variety of applications, services, or agents. &lt;/p&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_people_schems_venn2.png&quot; /&gt;</atom:content>
  <atom:updated>2008-09-28T15:18:53-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Linked Data Market via a BCG Matrix (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-25#1442</atom:id>
  <atom:published>2008-09-25T20:42:49Z</atom:published>
  <atom:content type="html">&lt;p&gt;The sweet spot of &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 3.0 (or any other Web.vNext moniker) is all about providing Web Users with a structured and interlinked &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; substrate that facilitates serendipitous discovery of relevant &amp;quot;Things&amp;quot; i.e., a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10db3b48&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id170db618&quot;&gt;Web&lt;/a&gt; -- a Web of Linkable Entities that goes beyond documents and other &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id110a5d30&quot;&gt;information&lt;/a&gt; resource (data containers) types.&lt;/p&gt; &lt;p&gt;Understanding potential &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id19e21c60&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id16d008d0&quot;&gt;Web&lt;/a&gt; business models, relative to other Web based market segments, is best pursued via a&lt;a href=&quot;http://dbpedia.org/resource/BCG_diagram&quot; id=&quot;link-id14734148&quot;&gt; BCG Matrix&lt;/a&gt; diagram, such as the one I&amp;#39;ve constructed below:&lt;/p&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_sdq_quadarant.png&quot; /&gt; &lt;br /&gt; &lt;h3&gt;Notes:&lt;/h3&gt; &lt;h4&gt;Link Density&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Web 1.0&amp;#39;s collection of &amp;quot;Web Sites&amp;quot; have relatively low link density relative to Web 2.0&amp;#39;s user-activity driven generation of semi-structured &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14c302d8&quot;&gt;linked data&lt;/a&gt; spaces (e.g., Blogs, Wikis, Shared Bookmarks, RSS/Atom Feeds, Photo Galleries, Discussion Forums etc..)&lt;/li&gt; &lt;li&gt;Semantic Technologies (i.e. &amp;quot;&lt;strong&gt;Semantics Inside&lt;/strong&gt; style solutions&amp;quot;) which are primarily about &amp;quot;Semantic Meaning&amp;quot; culled from Web 1.0 Pages also have limited linked density relative to Web 2.0&lt;/li&gt; &lt;li&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1286ab58&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-ide81ab20&quot;&gt;Web&lt;/a&gt;, courtesy of the open-ended linking capacity of URIs, matches and ultimately exceeds Web 2.0 link density.&lt;/li&gt; &lt;/ul&gt; &lt;h4&gt;Relevance&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Web 1.0 and 2.0 are low relevance realms driven by hyperlinks to &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id173db890&quot;&gt;information&lt;/a&gt; resources ((X)HTML, RSS, Atom, OPML, XML, Images, Audio files etc.) associated with Literal Labels and Tagging schemes devoid of explicit property based resource description thereby making the pursuit of relevance mercurial at best&lt;/li&gt; &lt;li&gt;Semantic Technologies offer more relevance than Web 1.0 and 2.0 based on the increased &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id124de510&quot;&gt;context&lt;/a&gt; that semantic analysis of Web pages accords&lt;/li&gt; &lt;li&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id111c4850&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id16e4e4c0&quot;&gt;Web&lt;/a&gt;, courtesy of URIs that expose self-describing data entities, match the relevance levels attained by Semantic Technologies.&lt;/li&gt; &lt;/ul&gt; &lt;h4&gt;Serendipity Quotient (SDQ)&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;Web 1.0 has next to no serendipity, the closest thing is &lt;a href=&quot;http://google.com&quot; id=&quot;link-id16dceec8&quot;&gt;Google&amp;#39;s &amp;quot;I&amp;#39;m Feeling Lucky&amp;quot; button&lt;/a&gt; &lt;/li&gt; &lt;li&gt;Web 2.0 possess higher potential for serendipitous discovery than Web 1.0, but such potential is neutralized by inherent subjectivity due to its human-interaction-focused literal foundation (e.g., tags, voting schemes, wiki editors etc.)&lt;/li&gt; &lt;li&gt;Semantic Technologies produce islands-of-relevance with little scope for serendipitous discovery due to &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id18078e60&quot;&gt;URI&lt;/a&gt; invisibility, since the prime focus is delivering more &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1253cc38&quot;&gt;context&lt;/a&gt; to Web search relative to traditional Web 1.0 search engines.&lt;/li&gt; &lt;li&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x201d0ae8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10c7fb70&quot;&gt;Web&lt;/a&gt;&amp;#39;s use of URIs as the naming and resolution mechanism for exposing structured and interlinked resources provides the highest potential for serendipitous discovery of relevant &amp;quot;Things&amp;quot;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;To conclude, the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x23ebbf90&quot;&gt;Web&lt;/a&gt;&amp;#39;s market opportunities are all about the evolution of the Web into a powerful substrate that offers a unique intersection of &amp;quot;Link Density&amp;quot; and &amp;quot;Relevance&amp;quot;, exploitable across horizontal and vertical market segments to solutions providers. Put differently, SDQ is how you take &amp;quot;The Ad&amp;quot; out of &amp;quot;Advertising&amp;quot; when matching Web users to relevant things :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-26T12:36:56-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>View Plurality Deficiency &amp; Programming Language Autism</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-17#1441</atom:id>
  <atom:published>2008-09-17T14:38:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve just read a really nice post by &lt;a href=&quot;http://demo.openlinksw.com/about/html/http://bblfish.net/people/henry/card%23me&quot; id=&quot;link-idea954a0&quot;&gt;Henry Story&lt;/a&gt; titled: &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/are_oo_languages_autistic&quot; id=&quot;link-id110164a8&quot;&gt;Are OO Languages Autistic?&lt;/a&gt; &lt;/p&gt; &lt;p&gt;In typical style, Henry walks you through his point of view using simple but powerful illustrations. Here is a key statement in his post that really struck &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id10f82150&quot;&gt;me&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;In order to be able to have a mental theory one needs to be able to &lt;strong&gt;understand that other people may have a different view of the world&lt;/strong&gt;. On a narrow three dimensional understanding of &amp;#39;view&amp;#39;, this reveals itself in that people at different locations in a room will see different things. One person may be able to see a cat behind a tree that will be hidden to another. In some sense though these two views can easily be merged into a coherent description.&amp;quot;&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Opaque &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; pages (e.g., generated by Semantic Technology inside offerings that will not expose or share &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id10f81420&quot;&gt;entity&lt;/a&gt; URIs), irrespective of how smart the underlying page generation and visualization technology may be, a fundamentally autistic and counter intuitive as we move toward a Web of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10cc3d80&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Preoccupation with the &amp;quot;V&amp;quot; aspect of the &lt;a href=&quot;http://dbpedia.org/resource/Model-view-controller&quot; id=&quot;link-id10fa86b0&quot;&gt;M-V-C&lt;/a&gt; trinity is inadvertently compounding and the problem of digital autism on the Web. Unbeknownst to the purveyors of data silos and proprietary service lock-in, digital autism on the Web ultimately implies Web business model autism.&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-17T10:54:48.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Zero-based Cognition (Difference between Humans &amp; Machines)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-17#1440</atom:id>
  <atom:published>2008-09-17T13:43:21Z</atom:published>
  <atom:content type="html">&lt;p&gt;Human beings, courtesy of the gift of &lt;a href=&quot;http://dbpedia.org/resource/Cognition&quot; id=&quot;link-id10f3d278&quot;&gt;cognition&lt;/a&gt;, are capable of creating reusable &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id10f76078&quot;&gt;information&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10c10518&quot;&gt;knowledge&lt;/a&gt; from simple or complex observations in an abstract realm. A machine on the other hand can only discover and infere based on a substrate of structured and interlinked data, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xdda2b88&quot;&gt;information&lt;/a&gt;, or &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0xcf58b18&quot;&gt;knowledge&lt;/a&gt; in a concrete human created realm e.g., a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10f3d640&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; As is quite common these days, &lt;a href=&quot;http://yihongs-research.blogspot.com/&quot; id=&quot;link-id10ecf268&quot;&gt;Yihong Ding&lt;/a&gt; has written another great piece titled: &lt;a href=&quot;http://www.internetevolution.com/author.asp?section_id=542&amp;amp;doc_id=163916l&quot; id=&quot;link-id10fb6558&quot;&gt;A New Take on Internet-Based AI&lt;/a&gt;, that delves into this specific matter. Yihong expresses an vital insight as excerpted below: &lt;blockquote&gt; &lt;cite&gt;&amp;quot;Artificial intelligence is supposed to let machines do things for people. The risk is that we may rely too much on them. Two months ago, for instance, writer Nicolas Carr asked whether &lt;a href=&quot;http://www.theatlantic.com/doc/200807/google&quot; id=&quot;link-id115e9bb8&quot;&gt;Google is making us stupid&lt;/a&gt;. In my recent &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id10d9ceb0&quot;&gt;blog&lt;/a&gt; series &amp;quot;&lt;a href=&quot;http://altsearchengines.com/2008/08/22/the-age-of-google-part-1-of-4/&quot; id=&quot;link-id10c8de60&quot;&gt;The Age of Google&lt;/a&gt;,&amp;quot; I extended Carr’s discussion. Due to the success of Google, we are relying more on objective search than on active thinking to answer questions. In consequence, the more Google has advanced its service, the farther Google users have drifted from active thinking&lt;/cite&gt;.&amp;quot;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;But at least one form of human thinking cannot be replaced by machines. I am not talking about inference/discovery (which machines may be capable of doing) but about creation/generation-from-nothing (which I don’t believe machines may ever do).&amp;quot;&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;I tend to describe our ability to create/generate-from-nothing as &amp;quot;Zero-based Cognition&amp;quot;, which is initially about &amp;quot;thought&amp;quot; and the eventually about &amp;quot;speed of thought dissemination&amp;quot; and &amp;quot;global thought meshing&amp;quot;. &lt;/p&gt; &lt;p&gt;In a peculiar sense, Zero-based cognition is analogous to &lt;a href=&quot;http://dbpedia.org/resource/Zero_Based_Budgeting&quot; id=&quot;link-id10ccbf78&quot;&gt;Zero-based budgeting&lt;/a&gt; from the accounting realm :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-10-17T07:23:42.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web 1.0, 2.0, and 3.0 (Yet Again)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-15#1439</atom:id>
  <atom:published>2008-09-15T17:33:44Z</atom:published>
  <atom:content type="html">&lt;p&gt;If your &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; presence doesn&amp;#39;t extend beyond (X)HTML web pages, you are only participating in Web usage Dimension 1.0.&lt;/p&gt; &lt;p&gt;If your Web presence goes beyond (X)HTML pages, via the addition of REST or SOAP based Web Services, then you re participating in Web usage dimension 2.0.&lt;/p&gt; &lt;p&gt;If you Web presence includes all of the above, with the addition of structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; interlinked with structured data across other points of presence on the Web, then you are participating in Web usage dimension 3.0 i.e., &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14d48d30&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id14d47280&quot;&gt;Web&lt;/a&gt;&amp;quot; or &amp;quot;Web of Data&amp;quot; or &amp;quot;Data Web&amp;quot;.&lt;/p&gt; &lt;p&gt;BTW - If you&amp;#39;ve already done all of the above, and you have started building intelligent agents that exploit the aforementioned structured interlinked data substrate, then you are already in Web usage dimension 4.0.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt;Prior posts about &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=web%20evolution&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id10e8b978&quot;&gt;Web usage pattern evolution&lt;/a&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-09-15T13:48:15-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Trouble with Labels</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-12#1438</atom:id>
  <atom:published>2008-09-12T01:47:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;Unfortunately our fixation with &amp;quot;Labels&amp;quot; and the artificial link that exist between &amp;quot;Labels&amp;quot; and so-called &amp;quot;first mover advantage&amp;quot; continue to impede our progress to clarity about matters such as a fully functional &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of interlinked &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; A while back I watched &lt;a href=&quot;http://www.ted.com/index.php/talks/kevin_kelly_on_the_next_5_000_days_of_the_web.html&quot; id=&quot;link-id14c2c740&quot;&gt;Kevin Kelly&amp;#39;s 5,000 days presentation at TED&lt;/a&gt;. During the presentation, I kept on scratching my head, wondering why phrases like &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xb154550&quot;&gt;Linked Data&lt;/a&gt;&amp;quot;, &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xb5927b8&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot;, &amp;quot;Web of Data&amp;quot;, &amp;quot;Data Web&amp;quot; where so unnaturally disconnected from his session narrative.&lt;/p&gt; &lt;p&gt;Yesterday I watched &lt;a href=&quot;http://www.techcrunch50.com/2008/conference/presenter.php?presenter=63#video&quot; id=&quot;link-id14f6e1a8&quot;&gt;IMINDI&amp;#39;s TechCrunch 50 presentation&lt;/a&gt;, and once again I saw the aforementioned pattern repeat itself. This time around, the poor founders of this &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0xae767f0&quot;&gt;Web&lt;/a&gt;&amp;quot; oriented company (which is what they are in reality) took a totally undeserved pasting from a bunch of panelist incapable of seeing beyond today (Web 2.0) and yesterday (initial Web bootstrap).&lt;/p&gt; &lt;p&gt;Anyway, thanks to the Web, this post will make a small contribution towards re-connecting the missing phrases to these &amp;quot;Linked Data Web&amp;quot; presentations.&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-16T10:07:49.000015-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Business Value of Linked Data (Enterprise Angle)?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-11#1437</atom:id>
  <atom:published>2008-09-11T18:59:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;All enterprises run IS/MIS/EIS systems that are supposed to enable optimized exploitation of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1408bee8&quot;&gt;information&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id14c429a8&quot;&gt;knowledge&lt;/a&gt;. Unfortunately, applications, services (SOAP or REST), database engines, middleware, operating systems, programming languages, development frameworks, network protocols, network topologies, or some other piece of infrastructure, eventually lay claim (possessively) to the data.&lt;/p&gt; &lt;p&gt;Courtesy of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10f98db8&quot;&gt;Linked Data&lt;/a&gt;, we are now able to extend the &amp;quot;document to document&amp;quot; linking mechanism of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; (Hypertext Linking) to more granular &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id14410810&quot;&gt;entity&lt;/a&gt; to &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id10dbb420&quot;&gt;entity&lt;/a&gt;&amp;quot; level linking. And in doing so, we have a layer of abstraction that in one swoop alleviates all of the infrastructure oriented data access impediments of yore. I know this sounds simplistic, but be rest assured, imbibing &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14b6af20&quot;&gt;Linked Data&lt;/a&gt;&amp;#39;s value proposition is really just that simple, once you engage solutions (e.g. &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id14ce6a20&quot;&gt;Virtuoso&lt;/a&gt;) that enable you to deploy &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1151c718&quot;&gt;Linked Data&lt;/a&gt; across your enterprise.&lt;/p&gt; &lt;h3&gt;Example: &lt;/h3&gt; &lt;p&gt;Microsoft ACCESS, &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id14ef3b08&quot;&gt;SQL&lt;/a&gt; Server, and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10d865b8&quot;&gt;Virtuoso&lt;/a&gt; all use the Northwind &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id10b04250&quot;&gt;SQL&lt;/a&gt; DB Schema as the basis of the demonstration database shipped with each DBMS product. This schema is comprised of common IS/MIS entities that include: Customers, Contacts, Orders, Products, Employees etc.&lt;/p&gt; &lt;p&gt;What we all really want to do as data, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id110dd7a0&quot;&gt;information&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id11484408&quot;&gt;knowledge&lt;/a&gt; consumers and/or dispatchers, is be no more than a single &amp;quot;mouse click&amp;quot; away from relevant data/&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id10c755c8&quot;&gt;information&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id1464ac88&quot;&gt;knowledge&lt;/a&gt; data access and/or exploration. Even better (but not always so obvious), we also want anyone in our network (company, division, department, cube-cluster) to inherit these data access efficiencies.&lt;/p&gt; &lt;p&gt;In this example, the &lt;a href=&quot;http://demo.openlinksw.com/Northwind/Customer/ALFKI&quot; id=&quot;link-id14ab8ed0&quot;&gt;Web Page about the Customer &amp;quot;ALKI&amp;quot;&lt;/a&gt; provides &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id14bdb360&quot;&gt;me&lt;/a&gt; with a myriad of exploration and data access paths e.g., when I click on the &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id10c388e0&quot;&gt;foaf&lt;/a&gt;:primarytopic property value link.&lt;/p&gt; &lt;p&gt;This simple example, via a single Web Page, should put to rest any doubts about the utility of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xb042fd8&quot;&gt;Linked Data&lt;/a&gt;. Of course this is &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=alfki&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id10ccccf0&quot;&gt;an old demo&lt;/a&gt;, but this time around the UI is minimalist as my prior attempts skipped a few steps i.e., starting from within a &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id10f8a530&quot;&gt;Linked Data explorer/browser&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Important note: I haven&amp;#39;t exported &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x16dfc2a0&quot;&gt;SQL&lt;/a&gt; into an RDF data warehouse, I am converting the SQL into RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; on the fly which has two fundamental benefits:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;No vulnerability to changes in the source DBMS&lt;/li&gt; &lt;li&gt;Superior performance over the RDF warehouse since the source schema is SQL based and I can leverage the optimization of the underlying SQL engine when translating between &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xd9a4030&quot;&gt;SPARQL&lt;/a&gt; and SQL.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Enjoy!&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1434&quot; id=&quot;link-id11338a48&quot;&gt;Requirements for Relational to RDF Mapping&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1433&quot; id=&quot;link-id10d84278&quot;&gt;Handling Graph Transitivity in a SQL/RDF Hybrid Engine&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1431&quot; id=&quot;link-id10c762e8&quot;&gt;How Virtuoso handles the Web Aspects of Linked Data Queries&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-09-11T15:52:48.000050-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Requirements for Relational-to-RDF Mapping</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-09-08#1436</atom:id>
  <atom:published>2008-09-08T09:41:25Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Requirements for Relational-to-RDF Mapping&lt;/div&gt; &lt;p&gt;Many of you will know about the W3C relational-to-&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e1be0a8&quot;&gt;RDF&lt;/a&gt; mapping incubator activity. The group is planning to suggest forming a working group for drawing up a specification for relational-to-RDF mapping.&lt;/p&gt; &lt;p&gt;To this effect, I recently summarized the group discussions and some of our own experiences around the topic at &amp;lt;&lt;a href=&quot;http://esw.w3.org/topic/Rdb2RdfXG/ReqForMappingByOErling&quot; id=&quot;link-id146030e8&quot;&gt;http://esw.w3.org/topic/Rdb2RdfXG/ReqForMappingByOErling&lt;/a&gt;&amp;gt;.&lt;/p&gt; &lt;p&gt;I will here discuss this less formally and more in the light of our own experience. A working group goal statement must be neutral vis à vis the following points, even if any working group will unavoidably encounter these issues on the way. A &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1e6b3950&quot;&gt;blog&lt;/a&gt; post on the other hand can be more specific.&lt;/p&gt; &lt;p&gt;I gave a talk to the &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0xa0932c68&quot;&gt;RDB2RDF XG&lt;/a&gt; this spring, with these &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/Relational2RDF.ppt&quot; id=&quot;link-id14572540&quot;&gt;slides&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The main point is that people would really like to map on-the-fly, if they only could. Making an RDF warehouse is not of value in itself, but it is true that in some cases this cannot be avoided.&lt;/p&gt; &lt;p&gt;At first sight, one would think that a mapping specification could be neutral as regards whether one stores the mapped triples as triples or makes them on demand. There is almost no comparison between the complexity of doing non-trivial mappings on-the-fly versus mapping as ETL. Some of this complexity spills over into the requirements for a mapping language. &lt;/p&gt; &lt;h2&gt;Eliminating JOINs&lt;/h2&gt; &lt;p&gt;We expect to have a situation where one virtual triple can have many possible sources. The mapping is a union of mapped databases. Any integration scenario will have this feature. In such a situation, if we are &lt;code&gt;JOIN&lt;/code&gt;ing using such triples, we end up with &lt;code&gt;UNION&lt;/code&gt;s of all databases that could produce the triples in question. This is generally not desired. Therefore, in the on-demand mapping case, there must be a lot of type inference logic that is not relevant in the ETL scenario.&lt;/p&gt; &lt;p&gt;To make the point clearer, suppose a query like &amp;quot;list the organizations whose representatives have published about &lt;i&gt;xx&lt;/i&gt;.&amp;quot; Suppose that there are three databases mapped, all of which have a table of organizations, a table of persons with affiliation to organizations, a table of publications by these persons, and finally a table of tags for the publications. Now, we want the laboratories that have published with articles with &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0xa0977bf0&quot;&gt;tag&lt;/a&gt; &lt;i&gt;XX&lt;/i&gt;. It is a matter of common sense in this scenario that a publication will have the author and the author&amp;#39;s affiliation in the same database. However, the RDB-to-RDF mapping does not necessarily know this, if all that it is told is that a table makes IRIs of publications by applying a certain pattern to the primary key of the publications table. To infer what needs to be inferred, the system must realize that IRIs from one mapping are disjoint from IRIs from another: A paper in database &lt;i&gt;X&lt;/i&gt; will usually not have an author in database &lt;i&gt;Y&lt;/i&gt;. The IDs in database &lt;i&gt;Y&lt;/i&gt;, even if perchance equal to the IDs in &lt;i&gt;X&lt;/i&gt;, do not mean the same thing, and there is no point joining across databases by them.&lt;/p&gt; &lt;p&gt;This entire question is a non-issue in the ETL scenario, but is absolutely vital in the real-time mapping. This is also something that must be stated, at least implicitly, in any mapping. If a mapping translates keys of one place to IRIs with one pattern, and keys from another using another pattern, it must be inferable from the patterns whether the sets of IRIs will be disjoint.&lt;/p&gt; &lt;p&gt;This is critical. Otherwise we will be joining everything to everything else, and there will be orders of magnitude of penalty compared to hand-crafted &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xa09490f8&quot;&gt;SQL&lt;/a&gt; over the same &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa095efd0&quot;&gt;data&lt;/a&gt; sources.&lt;/p&gt; &lt;h2&gt;Expectations and Limitations on Queries&lt;/h2&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1e360230&quot;&gt;SPARQL&lt;/a&gt; queries translate quite well to SQL when there is only one table that can produce a triple with a subject of a given class, when there are few columns that can map to a given predicate, and when classes and predicates are literals in the query.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1f5edb30&quot;&gt;Virtuoso&lt;/a&gt; has some SQL extensions for dealing with breaking a wide table into a row per column. This facilitates dealing with predicates that are not known at query compile time. If the table in question is not managed by Virtuoso, Virtuoso&amp;#39;s SQL virtualization/federation takes care of the matter. If a mapping system goes directly to third-party SQL, no such tricks can be used.&lt;/p&gt; &lt;p&gt;The above example suggests that for supporting on-the-fly mapping without relying on owning the SQL underneath, some subsets of SPARQL may have to be defined. For example, one will probably have to require that all predicates be literals. The alternative is prohibitive run-time cost and complexity.&lt;/p&gt; &lt;p&gt;But we must not lose the baby with the bath-water. Aside from offering global identifiers, RDF&amp;#39;s attractions include subclasses and sub-predicates. In relational terms, these translate to &lt;code&gt;UNION&lt;/code&gt;s and do involve some added cost. A mapping system just has to have means of dealing with this cost, and of recognizing cases where this cost is prohibitive. Some further work is likely to be required for defining well-behaved subsets of SPARQL and mappings.&lt;/p&gt; &lt;h2&gt;ETL Ou Ne Pas ETL?&lt;/h2&gt; &lt;p&gt;Whether to warehouse or not? If one has hundreds of sources, of which some are not even relational, some ETL would seem necessary. Kashiup Vipul gave a position paper at last year&amp;#39;s RDB-to-RDF mapping workshop in Cambridge, Massachusetts, about a system of relational mapping and on-demand RDF-izers of diverse semi-structured biomedical data, e.g., spreadsheets. The issue certainly exists, and any mapping work will likely encounter integration scenarios where one part is fairly neatly mapped from relational stores, and another part comes from a less structured repository of ETLed physical triples.&lt;/p&gt; &lt;p&gt;Our take is that if something is a large or very large relational store, then map; else, ETL. With Virtuoso, we can mix mapped and local triples, but this is not a generally available feature of triple stores and standardization will likely have to wait until there are more implementations.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;If you map on demand, watch out for an explosion of &lt;code&gt;UNION&lt;/code&gt;s when integrating sources that talk of similar things.&lt;/li&gt; &lt;li&gt;If you integrate lots of sources, some ETL is likely unavoidable. Look for ways of dealing with part ETL, part mapping. ETLing everything is not always best or even possible.&lt;/li&gt; &lt;li&gt;If you map a single fairly-clean RDB to RDF, mapping will work well, potentially much faster than triple storage. Higher storage density and more data per index lookup on the relational side.&lt;/li&gt; &lt;li&gt;If you map on demand, some restrictions to SPARQL may be practically necessary. These have to do with variables in predicate position, variables in class position, etc. Individual implementations may support these, but standardization will likely have to put limits on them.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This was a quick summary, by no means comprehensive, on what an eventual RDB2RDF working group would come across. This is a sort of addendum to the requirements I outlined on the ESW wiki.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-09-08T15:03:09-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transitivity and Graphs for SQL</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-09-08#1435</atom:id>
  <atom:published>2008-09-08T09:41:24Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Transitivity and Graphs for SQL&lt;/div&gt; &lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;I have mentioned on a couple of prior occasions that basic graph operations ought to be integrated into the &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xa1a18c58&quot;&gt;SQL&lt;/a&gt; query language.&lt;/p&gt; &lt;p&gt;The history of databases is by and large about moving from specialized applications toward a generic platform. The introduction of the DBMS itself is the archetypal example. It is all about extracting the common features of applications and making these the features of a platform instead.&lt;/p&gt; &lt;p&gt;It is now time to apply this principle to graph traversal.&lt;/p&gt; &lt;p&gt;The rationale is that graph operations are somewhat tedious to write in a parallelize-able, latency-tolerant manner. Writing them as one would for memory-based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xaf8c730&quot;&gt;data&lt;/a&gt; structures is easier but totally unscalable as soon as there is any latency involved, i.e., disk reads or messages between cluster peers.&lt;/p&gt; &lt;p&gt;The ad-hoc nature and very large volume of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xae41ef0&quot;&gt;RDF&lt;/a&gt; data makes this a timely question. Up until now, the answer to this question has been to materialize any implied facts in RDF stores. If &lt;i&gt;a&lt;/i&gt; was part of &lt;i&gt;b&lt;/i&gt;, and &lt;i&gt;b&lt;/i&gt; part of &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id0xac9d8790&quot;&gt;c&lt;/a&gt;&lt;/i&gt;, the implied fact that &lt;i&gt;a&lt;/i&gt; is part of &lt;i&gt;c&lt;/i&gt; would be inserted explicitly into the database as a pre-query step.&lt;/p&gt; &lt;p&gt;This is simple and often efficient, but tends to have the downside that one makes a specialized warehouse for each new type of query. The activity becomes less ad-hoc.&lt;/p&gt; &lt;p&gt;Also, this becomes next to impossible when the scale approaches web scale, or if some of the data is liable to be on-and-off included-into or excluded-from the set being analyzed. This is why with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xb68f9d0&quot;&gt;Virtuoso&lt;/a&gt; we have tended to favor inference on demand (&amp;quot;backward chaining&amp;quot;) and mapping of relational data into RDF without copying.&lt;/p&gt; &lt;p&gt;The SQL world has taken steps towards dealing with recursion with the &lt;code&gt;WITH - UNION&lt;/code&gt; construct which allows definition of recursive views. The idea there is to define, for example, a tree walk as a &lt;code&gt;UNION&lt;/code&gt; of the data of the starting node plus the recursive walk of the starting node&amp;#39;s immediate children.&lt;/p&gt; &lt;p&gt;The main problem with this is that I do not very well see how a SQL optimizer could effectively rearrange queries involving &lt;code&gt;JOIN&lt;/code&gt;s between such recursive views. This model of recursion seems to lose SQL&amp;#39;s non-procedural nature. One can no longer easily rearrange &lt;code&gt;JOIN&lt;/code&gt;s based on what data is given and what is to be retrieved. If the recursion is written from root to leaf, it is not obvious how to do this from leaf to root. At any rate, queries written in this way are so complex to write, let alone optimize, that I decided to take another approach.&lt;/p&gt; &lt;p&gt;Take a question like &amp;quot;list the parts of products of category &lt;i&gt;C&lt;/i&gt; which have materials that are classified as toxic.&amp;quot; Suppose that the product categories are a tree, the product parts are a tree, and the materials classification is a tree taxonomy where &amp;quot;toxic&amp;quot; has a multilevel substructure.&lt;/p&gt; &lt;p&gt;Depending on the count of products and materials, the query can be evaluated as either going from products to parts to materials and then climbing up the materials tree to see if the material is toxic. Or one could do it in reverse, starting with the different toxic materials, looking up the parts containing these, going to the part tree to the product, and up the product hierarchy to see if the product is in the right category. One should be able to evaluate the identical query either way depending on what indices exist, what the cardinalities of the relations are, and so forth — regular cost based optimization.&lt;/p&gt; &lt;p&gt;Especially with RDF, there are many problems of this type. In regular SQL, it is a long-standing cultural practice to flatten hierarchies, but this is not the case with RDF.&lt;/p&gt; &lt;p&gt;In Virtuoso, we see &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xb3bdcc0&quot;&gt;SPARQL&lt;/a&gt; as reducing to SQL. Any RDF-oriented database-engine or query-optimization feature is accessed via SQL. Thus, if we address run-time-recursion in the Virtuoso query engine, this becomes, &lt;i&gt;ipso facto&lt;/i&gt;, an SQL feature. Besides, we remember that SQL is a much more mature and expressive language than the current SPARQL recommendation.&lt;/p&gt; &lt;h2&gt; SQL and Transitivity &lt;/h2&gt; &lt;p&gt;We will here look at some simple social network queries. A later article will show how to do more general graph operations. We extend the SQL derived table construct, i.e., &lt;code&gt;SELECT&lt;/code&gt; in another &lt;code&gt;SELECT&lt;/code&gt;&amp;#39;s &lt;code&gt;FROM&lt;/code&gt; clause, with a &lt;code&gt;TRANSITIVE&lt;/code&gt; clause.&lt;/p&gt; &lt;p&gt;Consider the data:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;CREATE TABLE &amp;quot;knows&amp;quot; (&amp;quot;p1&amp;quot; INT, &amp;quot;p2&amp;quot; INT, PRIMARY KEY (&amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;) ); ALTER INDEX &amp;quot;knows&amp;quot; ON &amp;quot;knows&amp;quot; PARTITION (&amp;quot;p1&amp;quot; INT); CREATE INDEX &amp;quot;knows2&amp;quot; ON &amp;quot;knows&amp;quot; (&amp;quot;p2&amp;quot;, &amp;quot;p1&amp;quot;) PARTITION (&amp;quot;p2&amp;quot; INT); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We represent a social network with the many-to-many relation &amp;quot;knows&amp;quot;. The persons are identified by integers.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;INSERT INTO &amp;quot;knows&amp;quot; VALUES (1, 2); INSERT INTO &amp;quot;knows&amp;quot; VALUES (1, 3); INSERT INTO &amp;quot;knows&amp;quot; VALUES (2, 4);&lt;/code&gt; &lt;/pre&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p1&amp;quot; = 1;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We obtain the result:&lt;/p&gt; &lt;blockquote&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The operation is reversible:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; = 4; &lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;Since now we give &lt;i&gt;p2&lt;/i&gt;, we traverse from &lt;i&gt;p2&lt;/i&gt; towards &lt;i&gt;p1&lt;/i&gt;. The result set states that 4 is known by 2 and 2 is known by 1.&lt;/p&gt; &lt;p&gt;To see what would happen if &lt;i&gt;x&lt;/i&gt; knowing &lt;i&gt;y&lt;/i&gt; also meant &lt;i&gt;y&lt;/i&gt; knowing &lt;i&gt;x&lt;/i&gt;, one could write:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM (SELECT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; UNION ALL SELECT &amp;quot;p2&amp;quot;, &amp;quot;p1&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k2&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; = 4;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;Now, since we know that 1 and 4 are related, we can ask how they are related.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;, T_STEP (1) AS &amp;quot;via&amp;quot;, T_STEP (&amp;#39;step_no&amp;#39;) AS &amp;quot;step&amp;quot;, T_STEP (&amp;#39;path_id&amp;#39;) AS &amp;quot;path&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;p1&amp;quot; = 1 AND &amp;quot;p2&amp;quot; = 4;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;250&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;via&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;step&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;path&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The two first columns are the ends of the path. The next column is the person that is a step on the path. The next one is the number of the step, counting from 0, so that the end of the path that corresponds to the end condition on the column designated as input, i.e., &lt;i&gt;p1&lt;/i&gt;, has number 0. Since there can be multiple solutions, the last column is a sequence number allowing distinguishing multiple alternative paths from each other.&lt;/p&gt; &lt;p&gt;For LinkedIn users, the friends ordered by distance and descending friend count query, which is at the basis of most LinkedIn search result views can be written as: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT p2, dist, (SELECT COUNT (*) FROM &amp;quot;knows&amp;quot; &amp;quot;c&amp;quot; WHERE &amp;quot;c&amp;quot;.&amp;quot;p1&amp;quot; = &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; ) FROM (SELECT TRANSITIVE t_in (1) t_out (2) t_distinct &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;, t_step (&amp;#39;step_no&amp;#39;) AS &amp;quot;dist&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;p1&amp;quot; = 1 ORDER BY &amp;quot;dist&amp;quot;, 3 DESC;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;150&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;dist&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;aggregate&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;h2&gt;How?&lt;/h2&gt; &lt;p&gt;The queries shown above work on Virtuoso v6. When running in cluster mode, several thousand graph traversal steps may be proceeding at the same time, meaning that all database access is parallelized and that the algorithm is internally latency-tolerant. By default, all results are produced in a deterministic order, permitting predictable slicing of result sets.&lt;/p&gt; &lt;p&gt;Furthermore, for queries where both ends of a path are given, the optimizer may decide to attack the path from both ends simultaneously. So, supposing that every member of a social network has an average of 30 contacts, and we need to find a path between two users that are no more than 6 steps apart, we begin at both ends, expanding each up to 3 levels, and we stop when we find the first intersection. Thus, we reach 2 * 30^3 = 54,000 nodes, and not 30^6 = 729,000,000 nodes.&lt;/p&gt; &lt;p&gt;Writing a generic database driven graph traversal framework on the application side, say in Java over &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xa8a9ef8&quot;&gt;JDBC&lt;/a&gt;, would easily be over a thousand lines. This is much more work than can be justified just for a one-off, ad-hoc query. Besides, the traversal order in such a case could not be optimized by the DBMS.&lt;/p&gt; &lt;h2&gt;Next&lt;/h2&gt; &lt;p&gt;In a future &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0xb526a40&quot;&gt;blog&lt;/a&gt; post I will show how this feature can be used for common graph tasks like critical path, itinerary planning, traveling salesman, the 8 queens chess problem, etc. There are lots of switches for controlling different parameters of the traversal. This is just the beginning. I will also give examples of the use of this in SPARQL.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-09-08T15:43:07-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Requirements for Relational-to-RDF Mapping</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-09-08#1434</atom:id>
  <atom:published>2008-09-08T09:40:06Z</atom:published>
  <atom:content type="html">&lt;p&gt;Many of you will know about the W3C relational-to-&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1d61a948&quot;&gt;RDF&lt;/a&gt; mapping incubator activity. The group is planning to suggest forming a working group for drawing up a specification for relational-to-RDF mapping.&lt;/p&gt; &lt;p&gt;To this effect, I recently summarized the group discussions and some of our own experiences around the topic at &amp;lt;&lt;a href=&quot;http://esw.w3.org/topic/Rdb2RdfXG/ReqForMappingByOErling&quot; id=&quot;link-id146030e8&quot;&gt;http://esw.w3.org/topic/Rdb2RdfXG/ReqForMappingByOErling&lt;/a&gt;&amp;gt;.&lt;/p&gt; &lt;p&gt;I will here discuss this less formally and more in the light of our own experience. A working group goal statement must be neutral vis à vis the following points, even if any working group will unavoidably encounter these issues on the way. A &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x21334340&quot;&gt;blog&lt;/a&gt; post on the other hand can be more specific.&lt;/p&gt; &lt;p&gt;I gave a talk to the &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id0x1ef85f58&quot;&gt;RDB2RDF XG&lt;/a&gt; this spring, with these &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/Relational2RDF.ppt&quot; id=&quot;link-id14572540&quot;&gt;slides&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The main point is that people would really like to map on-the-fly, if they only could. Making an RDF warehouse is not of value in itself, but it is true that in some cases this cannot be avoided.&lt;/p&gt; &lt;p&gt;At first sight, one would think that a mapping specification could be neutral as regards whether one stores the mapped triples as triples or makes them on demand. There is almost no comparison between the complexity of doing non-trivial mappings on-the-fly versus mapping as ETL. Some of this complexity spills over into the requirements for a mapping language. &lt;/p&gt; &lt;h2&gt;Eliminating JOINs&lt;/h2&gt; &lt;p&gt;We expect to have a situation where one virtual triple can have many possible sources. The mapping is a union of mapped databases. Any integration scenario will have this feature. In such a situation, if we are &lt;code&gt;JOIN&lt;/code&gt;ing using such triples, we end up with &lt;code&gt;UNION&lt;/code&gt;s of all databases that could produce the triples in question. This is generally not desired. Therefore, in the on-demand mapping case, there must be a lot of type inference logic that is not relevant in the ETL scenario.&lt;/p&gt; &lt;p&gt;To make the point clearer, suppose a query like &amp;quot;list the organizations whose representatives have published about &lt;i&gt;xx&lt;/i&gt;.&amp;quot; Suppose that there are three databases mapped, all of which have a table of organizations, a table of persons with affiliation to organizations, a table of publications by these persons, and finally a table of tags for the publications. Now, we want the laboratories that have published with articles with &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id0x1d8270d0&quot;&gt;tag&lt;/a&gt; &lt;i&gt;XX&lt;/i&gt;. It is a matter of common sense in this scenario that a publication will have the author and the author&amp;#39;s affiliation in the same database. However, the RDB-to-RDF mapping does not necessarily know this, if all that it is told is that a table makes IRIs of publications by applying a certain pattern to the primary key of the publications table. To infer what needs to be inferred, the system must realize that IRIs from one mapping are disjoint from IRIs from another: A paper in database &lt;i&gt;X&lt;/i&gt; will usually not have an author in database &lt;i&gt;Y&lt;/i&gt;. The IDs in database &lt;i&gt;Y&lt;/i&gt;, even if perchance equal to the IDs in &lt;i&gt;X&lt;/i&gt;, do not mean the same thing, and there is no point joining across databases by them.&lt;/p&gt; &lt;p&gt;This entire question is a non-issue in the ETL scenario, but is absolutely vital in the real-time mapping. This is also something that must be stated, at least implicitly, in any mapping. If a mapping translates keys of one place to IRIs with one pattern, and keys from another using another pattern, it must be inferable from the patterns whether the sets of IRIs will be disjoint.&lt;/p&gt; &lt;p&gt;This is critical. Otherwise we will be joining everything to everything else, and there will be orders of magnitude of penalty compared to hand-crafted &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1d8b0b40&quot;&gt;SQL&lt;/a&gt; over the same &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ee63530&quot;&gt;data&lt;/a&gt; sources.&lt;/p&gt; &lt;h2&gt;Expectations and Limitations on Queries&lt;/h2&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1dcfd7b0&quot;&gt;SPARQL&lt;/a&gt; queries translate quite well to SQL when there is only one table that can produce a triple with a subject of a given class, when there are few columns that can map to a given predicate, and when classes and predicates are literals in the query.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x2006b798&quot;&gt;Virtuoso&lt;/a&gt; has some SQL extensions for dealing with breaking a wide table into a row per column. This facilitates dealing with predicates that are not known at query compile time. If the table in question is not managed by Virtuoso, Virtuoso&amp;#39;s SQL virtualization/federation takes care of the matter. If a mapping system goes directly to third-party SQL, no such tricks can be used.&lt;/p&gt; &lt;p&gt;The above example suggests that for supporting on-the-fly mapping without relying on owning the SQL underneath, some subsets of SPARQL may have to be defined. For example, one will probably have to require that all predicates be literals. The alternative is prohibitive run-time cost and complexity.&lt;/p&gt; &lt;p&gt;But we must not lose the baby with the bath-water. Aside from offering global identifiers, RDF&amp;#39;s attractions include subclasses and sub-predicates. In relational terms, these translate to &lt;code&gt;UNION&lt;/code&gt;s and do involve some added cost. A mapping system just has to have means of dealing with this cost, and of recognizing cases where this cost is prohibitive. Some further work is likely to be required for defining well-behaved subsets of SPARQL and mappings.&lt;/p&gt; &lt;h2&gt;ETL Ou Ne Pas ETL?&lt;/h2&gt; &lt;p&gt;Whether to warehouse or not? If one has hundreds of sources, of which some are not even relational, some ETL would seem necessary. Kashiup Vipul gave a position paper at last year&amp;#39;s RDB-to-RDF mapping workshop in Cambridge, Massachusetts, about a system of relational mapping and on-demand RDF-izers of diverse semi-structured biomedical data, e.g., spreadsheets. The issue certainly exists, and any mapping work will likely encounter integration scenarios where one part is fairly neatly mapped from relational stores, and another part comes from a less structured repository of ETLed physical triples.&lt;/p&gt; &lt;p&gt;Our take is that if something is a large or very large relational store, then map; else, ETL. With Virtuoso, we can mix mapped and local triples, but this is not a generally available feature of triple stores and standardization will likely have to wait until there are more implementations.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;If you map on demand, watch out for an explosion of &lt;code&gt;UNION&lt;/code&gt;s when integrating sources that talk of similar things.&lt;/li&gt; &lt;li&gt;If you integrate lots of sources, some ETL is likely unavoidable. Look for ways of dealing with part ETL, part mapping. ETLing everything is not always best or even possible.&lt;/li&gt; &lt;li&gt;If you map a single fairly-clean RDB to RDF, mapping will work well, potentially much faster than triple storage. Higher storage density and more data per index lookup on the relational side.&lt;/li&gt; &lt;li&gt;If you map on demand, some restrictions to SPARQL may be practically necessary. These have to do with variables in predicate position, variables in class position, etc. Individual implementations may support these, but standardization will likely have to put limits on them.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This was a quick summary, by no means comprehensive, on what an eventual RDB2RDF working group would come across. This is a sort of addendum to the requirements I outlined on the ESW wiki.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:16:40.851458-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Transitivity and Graphs for SQL</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-09-08#1433</atom:id>
  <atom:published>2008-09-08T09:20:11Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Background&lt;/h2&gt; &lt;p&gt;I have mentioned on a couple of prior occasions that basic graph operations ought to be integrated into the &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xb1fe830&quot;&gt;SQL&lt;/a&gt; query language.&lt;/p&gt; &lt;p&gt;The history of databases is by and large about moving from specialized applications toward a generic platform. The introduction of the DBMS itself is the archetypal example. It is all about extracting the common features of applications and making these the features of a platform instead.&lt;/p&gt; &lt;p&gt;It is now time to apply this principle to graph traversal.&lt;/p&gt; &lt;p&gt;The rationale is that graph operations are somewhat tedious to write in a parallelize-able, latency-tolerant manner. Writing them as one would for memory-based &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1cb37218&quot;&gt;data&lt;/a&gt; structures is easier but totally unscalable as soon as there is any latency involved, i.e., disk reads or messages between cluster peers.&lt;/p&gt; &lt;p&gt;The ad-hoc nature and very large volume of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1e1850a0&quot;&gt;RDF&lt;/a&gt; data makes this a timely question. Up until now, the answer to this question has been to materialize any implied facts in RDF stores. If &lt;i&gt;a&lt;/i&gt; was part of &lt;i&gt;b&lt;/i&gt;, and &lt;i&gt;b&lt;/i&gt; part of &lt;i&gt;&lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id0xa1a08d38&quot;&gt;c&lt;/a&gt;&lt;/i&gt;, the implied fact that &lt;i&gt;a&lt;/i&gt; is part of &lt;i&gt;c&lt;/i&gt; would be inserted explicitly into the database as a pre-query step.&lt;/p&gt; &lt;p&gt;This is simple and often efficient, but tends to have the downside that one makes a specialized warehouse for each new type of query. The activity becomes less ad-hoc.&lt;/p&gt; &lt;p&gt;Also, this becomes next to impossible when the scale approaches web scale, or if some of the data is liable to be on-and-off included-into or excluded-from the set being analyzed. This is why with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa51bd10&quot;&gt;Virtuoso&lt;/a&gt; we have tended to favor inference on demand (&amp;quot;backward chaining&amp;quot;) and mapping of relational data into RDF without copying.&lt;/p&gt; &lt;p&gt;The SQL world has taken steps towards dealing with recursion with the &lt;code&gt;WITH - UNION&lt;/code&gt; construct which allows definition of recursive views. The idea there is to define, for example, a tree walk as a &lt;code&gt;UNION&lt;/code&gt; of the data of the starting node plus the recursive walk of the starting node&amp;#39;s immediate children.&lt;/p&gt; &lt;p&gt;The main problem with this is that I do not very well see how a SQL optimizer could effectively rearrange queries involving &lt;code&gt;JOIN&lt;/code&gt;s between such recursive views. This model of recursion seems to lose SQL&amp;#39;s non-procedural nature. One can no longer easily rearrange &lt;code&gt;JOIN&lt;/code&gt;s based on what data is given and what is to be retrieved. If the recursion is written from root to leaf, it is not obvious how to do this from leaf to root. At any rate, queries written in this way are so complex to write, let alone optimize, that I decided to take another approach.&lt;/p&gt; &lt;p&gt;Take a question like &amp;quot;list the parts of products of category &lt;i&gt;C&lt;/i&gt; which have materials that are classified as toxic.&amp;quot; Suppose that the product categories are a tree, the product parts are a tree, and the materials classification is a tree taxonomy where &amp;quot;toxic&amp;quot; has a multilevel substructure.&lt;/p&gt; &lt;p&gt;Depending on the count of products and materials, the query can be evaluated as either going from products to parts to materials and then climbing up the materials tree to see if the material is toxic. Or one could do it in reverse, starting with the different toxic materials, looking up the parts containing these, going to the part tree to the product, and up the product hierarchy to see if the product is in the right category. One should be able to evaluate the identical query either way depending on what indices exist, what the cardinalities of the relations are, and so forth — regular cost based optimization.&lt;/p&gt; &lt;p&gt;Especially with RDF, there are many problems of this type. In regular SQL, it is a long-standing cultural practice to flatten hierarchies, but this is not the case with RDF.&lt;/p&gt; &lt;p&gt;In Virtuoso, we see &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xb4b3ce8&quot;&gt;SPARQL&lt;/a&gt; as reducing to SQL. Any RDF-oriented database-engine or query-optimization feature is accessed via SQL. Thus, if we address run-time-recursion in the Virtuoso query engine, this becomes, &lt;i&gt;ipso facto&lt;/i&gt;, an SQL feature. Besides, we remember that SQL is a much more mature and expressive language than the current SPARQL recommendation.&lt;/p&gt; &lt;h2&gt; SQL and Transitivity &lt;/h2&gt; &lt;p&gt;We will here look at some simple social network queries. A later article will show how to do more general graph operations. We extend the SQL derived table construct, i.e., &lt;code&gt;SELECT&lt;/code&gt; in another &lt;code&gt;SELECT&lt;/code&gt;&amp;#39;s &lt;code&gt;FROM&lt;/code&gt; clause, with a &lt;code&gt;TRANSITIVE&lt;/code&gt; clause.&lt;/p&gt; &lt;p&gt;Consider the data:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;CREATE TABLE &amp;quot;knows&amp;quot; (&amp;quot;p1&amp;quot; INT, &amp;quot;p2&amp;quot; INT, PRIMARY KEY (&amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;) ); ALTER INDEX &amp;quot;knows&amp;quot; ON &amp;quot;knows&amp;quot; PARTITION (&amp;quot;p1&amp;quot; INT); CREATE INDEX &amp;quot;knows2&amp;quot; ON &amp;quot;knows&amp;quot; (&amp;quot;p2&amp;quot;, &amp;quot;p1&amp;quot;) PARTITION (&amp;quot;p2&amp;quot; INT); &lt;/code&gt; &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We represent a social network with the many-to-many relation &amp;quot;knows&amp;quot;. The persons are identified by integers.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;INSERT INTO &amp;quot;knows&amp;quot; VALUES (1, 2); INSERT INTO &amp;quot;knows&amp;quot; VALUES (1, 3); INSERT INTO &amp;quot;knows&amp;quot; VALUES (2, 4);&lt;/code&gt; &lt;/pre&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p1&amp;quot; = 1;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;We obtain the result:&lt;/p&gt; &lt;blockquote&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The operation is reversible:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; = 4; &lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;Since now we give &lt;i&gt;p2&lt;/i&gt;, we traverse from &lt;i&gt;p2&lt;/i&gt; towards &lt;i&gt;p1&lt;/i&gt;. The result set states that 4 is known by 2 and 2 is known by 1.&lt;/p&gt; &lt;p&gt;To see what would happen if &lt;i&gt;x&lt;/i&gt; knowing &lt;i&gt;y&lt;/i&gt; also meant &lt;i&gt;y&lt;/i&gt; knowing &lt;i&gt;x&lt;/i&gt;, one could write:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM (SELECT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; FROM &amp;quot;knows&amp;quot; UNION ALL SELECT &amp;quot;p2&amp;quot;, &amp;quot;p1&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k2&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; = 4;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;100&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;Now, since we know that 1 and 4 are related, we can ask how they are related.&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT * FROM (SELECT TRANSITIVE T_IN (1) T_OUT (2) T_DISTINCT &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;, T_STEP (1) AS &amp;quot;via&amp;quot;, T_STEP (&amp;#39;step_no&amp;#39;) AS &amp;quot;step&amp;quot;, T_STEP (&amp;#39;path_id&amp;#39;) AS &amp;quot;path&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;p1&amp;quot; = 1 AND &amp;quot;p2&amp;quot; = 4;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;250&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p1&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;via&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;step&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;path&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The two first columns are the ends of the path. The next column is the person that is a step on the path. The next one is the number of the step, counting from 0, so that the end of the path that corresponds to the end condition on the column designated as input, i.e., &lt;i&gt;p1&lt;/i&gt;, has number 0. Since there can be multiple solutions, the last column is a sequence number allowing distinguishing multiple alternative paths from each other.&lt;/p&gt; &lt;p&gt;For LinkedIn users, the friends ordered by distance and descending friend count query, which is at the basis of most LinkedIn search result views can be written as: &lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt;&lt;code&gt;SELECT p2, dist, (SELECT COUNT (*) FROM &amp;quot;knows&amp;quot; &amp;quot;c&amp;quot; WHERE &amp;quot;c&amp;quot;.&amp;quot;p1&amp;quot; = &amp;quot;k&amp;quot;.&amp;quot;p2&amp;quot; ) FROM (SELECT TRANSITIVE t_in (1) t_out (2) t_distinct &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;, t_step (&amp;#39;step_no&amp;#39;) AS &amp;quot;dist&amp;quot; FROM &amp;quot;knows&amp;quot; ) &amp;quot;k&amp;quot; WHERE &amp;quot;p1&amp;quot; = 1 ORDER BY &amp;quot;dist&amp;quot;, 3 DESC;&lt;/code&gt; &lt;/pre&gt; &lt;table width=&quot;150&quot;&gt; &lt;tr&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;p2&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;dist&lt;/th&gt; &lt;th align=&quot;center&quot; width=&quot;50&quot;&gt;aggregate&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;3&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;1&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td align=&quot;center&quot;&gt;4&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;2&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;h2&gt;How?&lt;/h2&gt; &lt;p&gt;The queries shown above work on Virtuoso v6. When running in cluster mode, several thousand graph traversal steps may be proceeding at the same time, meaning that all database access is parallelized and that the algorithm is internally latency-tolerant. By default, all results are produced in a deterministic order, permitting predictable slicing of result sets.&lt;/p&gt; &lt;p&gt;Furthermore, for queries where both ends of a path are given, the optimizer may decide to attack the path from both ends simultaneously. So, supposing that every member of a social network has an average of 30 contacts, and we need to find a path between two users that are no more than 6 steps apart, we begin at both ends, expanding each up to 3 levels, and we stop when we find the first intersection. Thus, we reach 2 * 30^3 = 54,000 nodes, and not 30^6 = 729,000,000 nodes.&lt;/p&gt; &lt;p&gt;Writing a generic database driven graph traversal framework on the application side, say in Java over &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xb595050&quot;&gt;JDBC&lt;/a&gt;, would easily be over a thousand lines. This is much more work than can be justified just for a one-off, ad-hoc query. Besides, the traversal order in such a case could not be optimized by the DBMS.&lt;/p&gt; &lt;h2&gt;Next&lt;/h2&gt; &lt;p&gt;In a future &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x1e4d4f18&quot;&gt;blog&lt;/a&gt; post I will show how this feature can be used for common graph tasks like critical path, itinerary planning, traveling salesman, the 8 queens chess problem, etc. There are lots of switches for controlling different parameters of the traversal. This is just the beginning. I will also give examples of the use of this in SPARQL.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:17:48.452048-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Epistemology of the Sponger, or How Virtuoso Drives a Web Query</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-09-05#1432</atom:id>
  <atom:published>2008-09-05T09:20:56Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Epistemology of the Sponger, or How Virtuoso Drives a Web Query&lt;/div&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1ed6cf28&quot;&gt;Virtuoso&lt;/a&gt; has an extensive collection of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f8d1f78&quot;&gt;RDF&lt;/a&gt;-izers called Sponger Cartridges. These take a web resource in one of 30+ formats (so far) and extract RDF from it. The Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1edc90e8&quot;&gt;Sponger&lt;/a&gt; is a device which evaluates a query and along the way, finds dereferenceable links, dereferences them, and iteratively re-evaluates the query, until either nothing new is found or some limit is reached.&lt;/p&gt; &lt;p&gt;We could call this &lt;i&gt;query-driven crawling&lt;/i&gt;. The idea is intuitive — what one looks for, determines what one finds.&lt;/p&gt; &lt;p&gt;This does however raise certain questions pertaining to the nature and ultimate possibility of &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1f836b68&quot;&gt;knowledge&lt;/a&gt;, i.e., epistemology.&lt;/p&gt; &lt;p&gt;The process of querying could be said to go from the few to the many, just like the process of harvesting &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1edb1648&quot;&gt;data&lt;/a&gt; from the web, the way any search engine does. One follows links or makes joins and thereby increases one&amp;#39;s reach.&lt;/p&gt; &lt;p&gt;The difference is that a query has no &lt;i&gt;a priori&lt;/i&gt; direction. If I ask for the phone numbers of my friends and there are no phone numbers in the database, then it is valid to give an empty result without looking at my friends at all. &lt;a href=&quot;http://dbpedia.org/resource/Closed_world_assumption&quot; id=&quot;link-id0x1edf1f30&quot;&gt;Closed world&lt;/a&gt;, as it is said. Never mind that the friends would have had a &amp;quot;see also&amp;quot; link to a retrievable document that did have a phone number.&lt;/p&gt; &lt;p&gt;The problem is that a query execution plan determines what possible dereferenceable material the query will encounter during its execution. What is worse, a query plan tends toward the minimal, i.e., toward minimizing the chances of encountering something dereferenceable along the way. Where query and crawl appeared to have a similarity, in fact they have two opposite goals.&lt;/p&gt; &lt;p&gt;The user generally has no idea of the execution plan. In the general case, the user &lt;i&gt;cannot&lt;/i&gt; have an idea of this plan. There are valid, over 40 year old reasons for leaving the query planning to the database. In exceptional situations the user can read or direct these, but this is really quite tedious and requires understanding that is basically never present.&lt;/p&gt; &lt;p&gt;So, given a query, how do we find data that will match it, short of having a pre-loaded database of absolutely everything? This is certainly a desirable goal, and all in the &lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id0x1eb46548&quot;&gt;open world&lt;/a&gt;, distributed spirit of the web.&lt;/p&gt; &lt;p&gt;Let us limit ourselves to queries that have some literals in the object or subject positions. A &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1ed293f8&quot;&gt;SPARQL&lt;/a&gt; query is basically a graph. Its vertices are variables and literals, and its edges are triple patterns. An edge is labeled by a predicate. For now, we will consider the predicate to always be a literal. From each literal, we can draw a tree, following each edge starting at this literal and descending until we find another literal. Each tree is not always a spanning tree of the graph, but all the trees collectively span the graph.&lt;/p&gt; &lt;p&gt;Consider the query &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;{ &amp;lt;john&amp;gt; knows ?x . &amp;lt;mary&amp;gt; knows ?x . ?x label ?l }.&lt;/code&gt; &lt;/blockquote&gt; The starting points are the literals &lt;code&gt;john&lt;/code&gt; and &lt;code&gt;mary&lt;/code&gt;. The &lt;code&gt;john&lt;/code&gt; tree has one child, &lt;code&gt;?x&lt;/code&gt;, which has the children &lt;code&gt;mary&lt;/code&gt; and &lt;code&gt;?l&lt;/code&gt;. One could notate it as &lt;blockquote&gt; &lt;code&gt;{ &amp;lt;john&amp;gt; knows ?x . {{ &amp;lt;mary&amp;gt; knows ?x} UNION {?x label ?l}}}&lt;/code&gt; &lt;/blockquote&gt; That is, the head first, and if it has more than one child, a union listing them, recursively. &lt;p&gt;If one composed such queries for each literal in the original pattern and evaluated each as a breadth first walk of the tree, no query optimization tricks, and for each binding of each variable, recorded whether there was something to dereference, one would in a finite time have reached all the directly reachable data. Then one could evaluate the original query, using whatever plan was preferred.&lt;/p&gt; &lt;p&gt;The check for dereferenceable data applied to each IRI-valued binding formed in the above evaluation, would consist of looking for &amp;quot;see also&amp;quot;, &amp;quot;same as&amp;quot;, and other such properties of the IRI. It could also consult text based search engines. Since the evaluation is breadth first, it generates a large number of parallel tasks and is fairly latency tolerant, i.e., it will not die if it must retrieve a few pages from remote sources. We will leave the exact rewrite rules for unions, optionals, aggregates, subqueries, and so on, as an exercise; the general idea should be clear enough.&lt;/p&gt; &lt;p&gt;We have here shown a way of transforming SPARQL queries in such a way as to guarantee dereferencing of findable links, without requiring the end user to either explicitly specify or understand query plans.&lt;/p&gt; &lt;p&gt;The present Sponger does not work exactly in this manner but it will be developed in this direction. Fortunately, the algorithms outlined above are nothing complicated.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-09-05T16:04:28-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Epistemology of the Sponger, or How Virtuoso Drives a Web Query</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-09-05#1431</atom:id>
  <atom:published>2008-09-05T09:16:20Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1fabb368&quot;&gt;Virtuoso&lt;/a&gt; has an extensive collection of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1f8625b8&quot;&gt;RDF&lt;/a&gt;-izers called Sponger Cartridges. These take a web resource in one of 30+ formats (so far) and extract RDF from it. The Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1f841060&quot;&gt;Sponger&lt;/a&gt; is a device which evaluates a query and along the way, finds dereferenceable links, dereferences them, and iteratively re-evaluates the query, until either nothing new is found or some limit is reached.&lt;/p&gt; &lt;p&gt;We could call this &lt;i&gt;query-driven crawling&lt;/i&gt;. The idea is intuitive — what one looks for, determines what one finds.&lt;/p&gt; &lt;p&gt;This does however raise certain questions pertaining to the nature and ultimate possibility of &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1f895b08&quot;&gt;knowledge&lt;/a&gt;, i.e., epistemology.&lt;/p&gt; &lt;p&gt;The process of querying could be said to go from the few to the many, just like the process of harvesting &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1f879410&quot;&gt;data&lt;/a&gt; from the web, the way any search engine does. One follows links or makes joins and thereby increases one&amp;#39;s reach.&lt;/p&gt; &lt;p&gt;The difference is that a query has no &lt;i&gt;a priori&lt;/i&gt; direction. If I ask for the phone numbers of my friends and there are no phone numbers in the database, then it is valid to give an empty result without looking at my friends at all. &lt;a href=&quot;http://dbpedia.org/resource/Closed_world_assumption&quot; id=&quot;link-id0x1f8b0658&quot;&gt;Closed world&lt;/a&gt;, as it is said. Never mind that the friends would have had a &amp;quot;see also&amp;quot; link to a retrievable document that did have a phone number.&lt;/p&gt; &lt;p&gt;The problem is that a query execution plan determines what possible dereferenceable material the query will encounter during its execution. What is worse, a query plan tends toward the minimal, i.e., toward minimizing the chances of encountering something dereferenceable along the way. Where query and crawl appeared to have a similarity, in fact they have two opposite goals.&lt;/p&gt; &lt;p&gt;The user generally has no idea of the execution plan. In the general case, the user &lt;i&gt;cannot&lt;/i&gt; have an idea of this plan. There are valid, over 40 year old reasons for leaving the query planning to the database. In exceptional situations the user can read or direct these, but this is really quite tedious and requires understanding that is basically never present.&lt;/p&gt; &lt;p&gt;So, given a query, how do we find data that will match it, short of having a pre-loaded database of absolutely everything? This is certainly a desirable goal, and all in the &lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id0x1f845188&quot;&gt;open world&lt;/a&gt;, distributed spirit of the web.&lt;/p&gt; &lt;p&gt;Let us limit ourselves to queries that have some literals in the object or subject positions. A &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1f84f348&quot;&gt;SPARQL&lt;/a&gt; query is basically a graph. Its vertices are variables and literals, and its edges are triple patterns. An edge is labeled by a predicate. For now, we will consider the predicate to always be a literal. From each literal, we can draw a tree, following each edge starting at this literal and descending until we find another literal. Each tree is not always a spanning tree of the graph, but all the trees collectively span the graph.&lt;/p&gt; &lt;p&gt;Consider the query &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;{ &amp;lt;john&amp;gt; knows ?x . &amp;lt;mary&amp;gt; knows ?x . ?x label ?l }.&lt;/code&gt; &lt;/blockquote&gt; The starting points are the literals &lt;code&gt;john&lt;/code&gt; and &lt;code&gt;mary&lt;/code&gt;. The &lt;code&gt;john&lt;/code&gt; tree has one child, &lt;code&gt;?x&lt;/code&gt;, which has the children &lt;code&gt;mary&lt;/code&gt; and &lt;code&gt;?l&lt;/code&gt;. One could notate it as &lt;blockquote&gt; &lt;code&gt;{ &amp;lt;john&amp;gt; knows ?x . {{ &amp;lt;mary&amp;gt; knows ?x} UNION {?x label ?l}}}&lt;/code&gt; &lt;/blockquote&gt; That is, the head first, and if it has more than one child, a union listing them, recursively. &lt;p&gt;If one composed such queries for each literal in the original pattern and evaluated each as a breadth first walk of the tree, no query optimization tricks, and for each binding of each variable, recorded whether there was something to dereference, one would in a finite time have reached all the directly reachable data. Then one could evaluate the original query, using whatever plan was preferred.&lt;/p&gt; &lt;p&gt;The check for dereferenceable data applied to each IRI-valued binding formed in the above evaluation, would consist of looking for &amp;quot;see also&amp;quot;, &amp;quot;same as&amp;quot;, and other such properties of the IRI. It could also consult text based search engines. Since the evaluation is breadth first, it generates a large number of parallel tasks and is fairly latency tolerant, i.e., it will not die if it must retrieve a few pages from remote sources. We will leave the exact rewrite rules for unions, optionals, aggregates, subqueries, and so on, as an exercise; the general idea should be clear enough.&lt;/p&gt; &lt;p&gt;We have here shown a way of transforming SPARQL queries in such a way as to guarantee dereferencing of findable links, without requiring the end user to either explicitly specify or understand query plans.&lt;/p&gt; &lt;p&gt;The present Sponger does not work exactly in this manner but it will be developed in this direction. Fortunately, the algorithms outlined above are nothing complicated.&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-05T16:04:26-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data, Ubiquity Commands, and Resource Descriptions (Update 3)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-05#1430</atom:id>
  <atom:published>2008-09-05T05:43:00Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;p&gt; &lt;a href=&quot;http://labs.mozilla.com/2008/08/introducing-ubiquity/&quot; id=&quot;link-id11258ea0&quot;&gt;Ubiquity&lt;/a&gt; from &lt;a href=&quot;http://labs.mozilla.com/&quot; id=&quot;link-id112ebe28&quot;&gt;Mozilla Labs&lt;/a&gt;, provides an alternative entry point for experiencing the &amp;quot;Controller&amp;quot; aspect of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0xa0d2ccd0&quot;&gt;Web&lt;/a&gt;&amp;#39;s natural compatibility with the &lt;a href=&quot;http://dbpedia.org/resource/Model-view-controller&quot; id=&quot;link-id10ec1a08&quot;&gt;MVC&lt;/a&gt; development pattern. As I&amp;#39;ve noted (in &lt;a href=&quot;http://myopenlink.net/weblog/public/search.vspx?blogid=kidehen-blog-0&amp;amp;q=mvc&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id15390f28&quot;&gt;various posts&lt;/a&gt;) &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Services, as practiced by the REST oriented Web 2.0 community or SOAP oriented SOA community within the enterprise, is fundamentally about the (&amp;quot;Controller&amp;quot; aspect of &lt;a href=&quot;http://dbpedia.org/resource/Model-view-controller&quot; id=&quot;link-id13c0d758&quot;&gt;MVC&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Ubiquity provides a commandline interface for direct invocation of Web Services. For instance, in our case, we can expose the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10b04708&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s in-built &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=rdf%20middleware&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1113ae38&quot;&gt;RDF Middleware&lt;/a&gt; (&amp;quot;Sponger&amp;quot;) and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1457b3b8&quot;&gt;Linked Data&lt;/a&gt; deployment services via a single command of the form: describe-resource &amp;lt;url&amp;gt; &lt;/p&gt; &lt;p&gt;To experience this neat addition to Firefox you need to do the following:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;https://people.mozilla.com/%7Eavarma/ubiquity-0.1.1.xpi&quot; id=&quot;link-id13b15e88&quot;&gt;Download&lt;/a&gt; and install the Ubiquity Extension for Firefox&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/ubiq&quot; id=&quot;link-id10e85880&quot;&gt;Subscribe&lt;/a&gt; to the OpenLink Command for Resource Description&lt;/li&gt; &lt;li&gt;Click on CTRL+Space (Windows / Linux) or Option+Space (Mac OS X)&lt;/li&gt; &lt;li&gt;Type in: describe-resource &amp;lt;a-web-resource-url&amp;gt; &lt;/li&gt; &lt;/ol&gt; &lt;h3&gt;How to unsubscribe&lt;/h3&gt; At the current time, you need to do this if you&amp;#39;ve installed commands using ubiquity 0.1.0 and seek to use newer versions of the same commands after upgrading to ubiquity 0.1.1. &lt;ol&gt; &lt;li&gt;To unsubscribe use type &amp;quot;about:ubiquity&amp;quot; into browser&lt;/li&gt; &lt;li&gt;Click on unsubscribe links associated with you command subscription list&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Enjoy!&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-09-08T09:00:51-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What&#39;s Up with Chrome?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-03#1429</atom:id>
  <atom:published>2008-09-03T20:33:32Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here are a few descriptions of pages covering Google&amp;#39;s Chrome browser:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://vanirsystems.com/danielsblog/2008/09/03/google-chrome-my-verdict/&quot; id=&quot;link-id14b2ad20&quot;&gt;Daniel Lewis&lt;/a&gt; - Comparative Analysis&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://demo.openlinksw.com/proxy/rdf/http://www.crunchbase.com/product/chrome%23this&quot; id=&quot;link-id120f35d0&quot;&gt;CrunchBase&lt;/a&gt; - Product Page&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://feeds.feedburner.com/~r/OmMalik/~3/381659273/&quot; id=&quot;link-id13e28090&quot;&gt;GigaOM&lt;/a&gt; - Industry Analysis&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://en.wikipedia.org/wiki/Google_Chrome&quot; id=&quot;link-id10db3e48&quot;&gt;Wikipedia&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://news.cnet.com/8301-13860_3-10031661-56.html?part=rss&amp;amp;subj=news&amp;amp;tag=2547-1_3-0-20&quot; id=&quot;link-id14a17f78&quot;&gt;CNET&lt;/a&gt; - Privacy Issues Analysis&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://feedproxy.google.com/~r/readwriteweb/~3/vF9P80B90XI/security_flaw_in_google_chrome.php&quot; id=&quot;link-id14bdf6a8&quot;&gt;ReadWriteWeb&lt;/a&gt; - Security Issues Analysis&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://oakleafblog.blogspot.com/2008/09/chromes-evil-terms-of-service.html&quot; id=&quot;link-id140af0a8&quot;&gt;OakLeaf&lt;/a&gt; - SaaS Terms Analysis&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;As per usual, this is part post and part &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id140af0a8&quot;&gt;Linked Data&lt;/a&gt; demo. This time around, I am showcasing Proxy/Wrapper based dereferencable URIs and a new &amp;quot;Page Description&amp;quot; feature that showcases the capabilities of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id11291898&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s in-built RDFization Middleware. Also note, the resource descriptions (RDF) are presented using an HTML page.&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-04T08:39:02.000014-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Programming the Universe</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-09-02#1428</atom:id>
  <atom:published>2008-09-02T17:03:59Z</atom:published>
  <atom:content type="html">&lt;p&gt;I continue to be intrigued by &lt;a href=&quot;http://feeds.feedburner.com/~r/ThinkingSpace&quot; id=&quot;link-id14aa0000&quot;&gt;Yihong Ding&amp;#39;s&lt;/a&gt; shared insights as expressed in part 2 of his &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id17b07d90&quot;&gt;blog&lt;/a&gt; series titled: &lt;a href=&quot;http://feeds.feedburner.com/~r/ThinkingSpace/~3/381149959/programming-universe-part-two.html&quot; id=&quot;link-id10c9f740&quot;&gt;Programming the Universe&lt;/a&gt;. The &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id10fbc0f8&quot;&gt;blog&lt;/a&gt; series shares Yihong&amp;#39;s thoughts and reflections stimulated by the book, also titled: &lt;a href=&quot;http://www.amazon.com/Programming-Universe-Quantum-Computer-Scientist/dp/1400033861/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1217201256&amp;amp;sr=1-1&quot; id=&quot;link-id14a34190&quot;&gt;Programming the Universe&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; What strikes &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id111dd940&quot;&gt;me&lt;/a&gt; the most, is how sharing his findings act as serendipitous connectors to related insights and points of view, that ultimately create deeper shared &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10d78460&quot;&gt;knowledge&lt;/a&gt; about the core subject matter, courtesy of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; hosted Blogosphere.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1390&quot; id=&quot;link-id1723bd88&quot;&gt;Metcalfe, Einstein, and Linked Data.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-09-03T07:56:50-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Connecting Freebase, Wikipedia, DBpedia, and other Linked Data Spaces (Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-29#1427</atom:id>
  <atom:published>2008-08-29T17:53:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here are some demonstrations of (X)HTML based representations of resource descriptions from &lt;a href=&quot;http://www.freebase.com&quot; id=&quot;link-id12275470&quot;&gt;Freebase&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id168abcc0&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://www.bbc.co.uk/music/artists&quot; id=&quot;link-id107c75c8&quot;&gt;BBC Music Beta&lt;/a&gt;, &lt;a href=&quot;http://crunchbase.com&quot; id=&quot;link-id1322e9a0&quot;&gt;CrunchBase&lt;/a&gt;, &lt;a href=&quot;http://sw.opencyc.org&quot; id=&quot;link-id16e09ea8&quot;&gt;OpenCyc&lt;/a&gt;, and &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id188687c0&quot;&gt;UMBEL&lt;/a&gt; etc. What is really being demonstrated here is the use of Proxy / Wrapper URIs to expose powerful links across entities distilled from their container documents (or &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13e117b0&quot;&gt;information&lt;/a&gt; resources). Of course, you see exactly the same technique in action whenever you visit &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10afe178&quot;&gt;DBpedia&lt;/a&gt; pages. Again, we are moving the concept of Linking from the document to document level, down to the document-&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id16032730&quot;&gt;entity&lt;/a&gt; to document-&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id13eef3d8&quot;&gt;entity&lt;/a&gt; level. The evolution of network link focal points is illustrated in slides &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html#(15)&quot; id=&quot;link-id183523a8&quot;&gt;15&lt;/a&gt; to &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html#(22)&quot; id=&quot;link-id18270200&quot;&gt;22&lt;/a&gt; of my &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html&quot; id=&quot;link-id16f0a7c8&quot;&gt;Linked Data Planet presentation&lt;/a&gt; remix.&lt;/p&gt; &lt;h3&gt;Live Examples&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://www.freebase.com/view/en/abraham_lincoln&quot; id=&quot;link-id11cf00b8&quot;&gt;Abraham Lincoln&lt;/a&gt; - Freebase (note: link from Freebase to &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id17db1620&quot;&gt;DBpedia&lt;/a&gt; via Wikipedia)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://www.crunchbase.com/company/amazon&quot; id=&quot;link-id171d9930&quot;&gt;Amazon&lt;/a&gt; - CrunchBase (note: links from CruncBase to &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1ed41510&quot;&gt;DBpedia&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://www.bbc.co.uk/music/artists/cc197bad-dc9c-440d-a5b5-d52ba2e14234&quot; id=&quot;link-id10a01dc0&quot;&gt;Cold Play&lt;/a&gt; - &lt;a href=&quot;http://dbpedia.org/resource/BBC&quot; id=&quot;link-id12fa5648&quot;&gt;BBC&lt;/a&gt; Music Beta (note: links to &lt;a href=&quot;http://musicbrainz.org/&quot; id=&quot;link-id126f71c8&quot;&gt;Musicbrainz&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html&quot; id=&quot;link-id1732e820&quot;&gt;Linked Data Planet Presentation&lt;/a&gt; - Also a Slidy, Bibo Ontology, and &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id104869a8&quot;&gt;RDFa&lt;/a&gt; usage example&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://sw.opencyc.org/2008/06/10/concept/en/Music&quot; id=&quot;link-id1699d628&quot;&gt;Music&lt;/a&gt; - &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id126c74f0&quot;&gt;OpenCyc&lt;/a&gt; Concept which exposes a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id15687380&quot;&gt;Hyperdata&lt;/a&gt; link to its equivalent &lt;a href=&quot;http://demo.openlinksw.com/proxy/html/http://umbel.org/ns/sc/Music&quot; id=&quot;link-id13ebbac0&quot;&gt;UMBEL Subject Concept&lt;/a&gt; and back&lt;/li&gt; &lt;/ol&gt; &lt;h4&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10537a28&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s RDFization Middleware &amp;amp; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10869440&quot;&gt;Linked Data&lt;/a&gt; Deployment Architecture Diagram&lt;/h4&gt; &lt;div&gt; &lt;table border=&quot;1&quot;&gt; &lt;tr&gt; &lt;td&gt;&lt;br /&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/ldp_presentation/images/linked_data_gen_opts3.png&quot; /&gt; &lt;br /&gt; &lt;br /&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/div&gt; &lt;p&gt;Note: You can substitute my examples using any &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; resource &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id105a3e20&quot;&gt;URL&lt;/a&gt;. The underlying RDFization and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id18155cd0&quot;&gt;Linked Data&lt;/a&gt; deployment functionality of the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13f56ed0&quot;&gt;Virtuoso&lt;/a&gt; demo instance takes care of everything else. Also note that the HTML based resource description page capability is now deployed as part of the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id17db1128&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id100a7630&quot;&gt;Sponger&lt;/a&gt; component of every &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id109eed20&quot;&gt;Virtuoso&lt;/a&gt; installation starting with from version &lt;a href=&quot;http://sourceforge.net/project/shownotes.php?group_id=161622&amp;amp;release_id=622380&quot; id=&quot;link-id1441f530&quot;&gt;5.0.8.&lt;/a&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-08-29T14:57:02.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Is the Semantic Web necessary (and feasible)?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-29#1426</atom:id>
  <atom:published>2008-08-29T15:00:50Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here is another &amp;quot;Linked Discourse&amp;quot; effort via a &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id13edcda8&quot;&gt;blog&lt;/a&gt; post that attempts to add perspective to a developing &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; based conversation. In this case, the conversation originates from &lt;a href=&quot;http://geekaustin.org&quot; id=&quot;link-id15a33728&quot;&gt;Juan Sequeda&lt;/a&gt;&amp;#39;s recent interview with &lt;a href=&quot;http://www.linkedin.com/in/luxzia&quot; id=&quot;link-id182a4a80&quot;&gt;Jana Thompson&lt;/a&gt; titled: &lt;a href=&quot;http://geekaustin.org/2008/08/21/juan-sequeda-jana-thompson-necessity-semantic-web/&quot; id=&quot;link-id146e1f40&quot;&gt;Is the Semantic Web necessary (and feasible)?&lt;/a&gt; &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: What are the benefits you see to the business community in adopting semantic technology? &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id1941e3b0&quot;&gt;Me&lt;/a&gt;: Exposure, exploitation, of untapped treasure trove of interlinked &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13593fc0&quot;&gt;information&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id1290c318&quot;&gt;knowledge&lt;/a&gt; across disparate IT infrastructure via conceptual entry points (&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id107bad60&quot;&gt;Entity&lt;/a&gt; IDs / URIs / Data Source Names) that refer to as &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id15fab9f8&quot;&gt;Context&lt;/a&gt; Lenses&amp;quot;.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt; Jana: Do you think these benefits are great enough for businesses to adopt the changes?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id0x584ffe0&quot;&gt;Me&lt;/a&gt;: Yes, infrastructural heterogeneity is a fact of corporate life (growth, mergers, acquisitions etc). Any technology that addresses these challenges is extremely important and valuable. Put differently, the opportunity costs associated with IT infrastructural heterogeneity remains high!&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: How large do you think this impact will actually be?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: Huge, enterprise have been aware of their data, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1b8057b0&quot;&gt;information&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1b3e3760&quot;&gt;knowledge&lt;/a&gt; treasure troves etc. for eons. Tapping into these via a materialization of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Information&quot;&gt;information&lt;/a&gt; at your fingertips&amp;quot; vision is something they&amp;#39;ve simply been waiting to pursue without any platform lock-in, for as long as I&amp;#39;ve been in this industry.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: I’ve heard, from contacts in the Bay Area, that they are skeptical of how large this impact of semantic technology will actually be on the web itself, but that the best uses of the technology are for fields such as medical information, or as you mentioned, geo-spatial data.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: Unfortunately, those people aren&amp;#39;t connecting the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10a337d8&quot;&gt;Semantic Web&lt;/a&gt; and open access to heterogeneous data sources, or the intrinsic value of holistic exploration location of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0xaa58c520&quot;&gt;entity&lt;/a&gt; based data networks (aka &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id188a1910&quot;&gt;Linked Data&lt;/a&gt;).&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt; Jana: Are semantic technologies going to be part of the web because of people championing the cause or because it is actually a necessary step?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x9eb9aca0&quot;&gt;Linked Data&lt;/a&gt; technology on the Web is a vital extension of the current Web. Semantic Technology without the &amp;quot;Web&amp;quot; component, or what I refer to as &amp;quot;Semantics Inside only&amp;quot; solutions, simply offer little or no value as Web enhancements based on their incongruence with the essence of the Web i.e., &amp;quot;Open Linkage&amp;quot; and no Silos! A nice looking Silo is still a Silo.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: In the early days of the web, there was an explosion of new websites, due to the ease of learning HTML, from a business to a person to some crackpot talking about aliens. Even today, CSS and XHTML are not so difficult to learn that a determined person can’t learn them from W3C or other tutorials easily. If OWL becomes the norm for websites, what do you think the effects will be on the web? Do you think it is easy enough to learn that it will be readily adopted as part of the standard toolkit for web developers for businesses?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: Correction, learning HTML had nothing to do with the Web&amp;#39;s success. The value proposition of the Web simply reached critical mass and you simply couldn&amp;#39;t afford to not be part of it. The easiest route to joining the Web juggernaut was a Web Page hosted on a Web Site. The question right now is: what&amp;#39;s the equivalent driver for the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id12e25c98&quot;&gt;Web&lt;/a&gt; bearing in mind the initial Web bootstrap. My answer is simply this: Open Data Access i.e., getting beyond the data silos that have inadvertently emerged from Web 2.0.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt; Jana: Following the same theme, do you think this will lead to an &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id17041398&quot;&gt;internet&lt;/a&gt; full of corporate-controlled websites, with sites only written by developers rather than individuals?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; Me: Not at all, we will have an &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0x16a4abe0&quot;&gt;Internet&lt;/a&gt; owned by it&amp;#39;s participants i.e., You and the agents that work on your behalf.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: So, you are imagining technologies such as &lt;a href=&quot;http://dbpedia.org/resource/Drupal&quot; id=&quot;link-id107d1d70&quot;&gt;Drupal&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/WordPress&quot; id=&quot;link-id13f48db8&quot;&gt;Wordpress&lt;/a&gt;, that allow users to manage sites without a great deal of &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot;&gt;knowledge&lt;/a&gt; of the nuts and bolts of current web technologies?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: Not at all! I envisage simple forms that provide conduits to powerful meshes of interlinked data spaces associated with Web users.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: Given all of the buzz, and my own familiarity with ontology, I am just very curious if the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1955d360&quot;&gt;semantic web&lt;/a&gt; is truly necessary? &lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me:This question is no different than saying: I hear the Web is becoming a Database, and I wonder if a Data Dictionary is necessary, or even if access to structured data is necessary. It&amp;#39;s also akin to saying: I accept &amp;quot;Search&amp;quot; as my only mechanism for Web interaction even though in reality, I really want to be able to &amp;quot;Find&amp;quot; and &amp;quot;Process&amp;quot; relevant things at a quicker rate than I do today, relative to the amount of information, and information processing time, at my disposal.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: Will it be worth it to most people to go away from the web in its current form, with keyword searches on sites like Google, to a richer and more interconnected internet with potentially better search technology?&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: As stated above, we need to add &amp;quot;Find&amp;quot; to the portfolio of functions we seek to perform against the Web. &amp;quot;Finding&amp;quot; and &amp;quot;Searching&amp;quot; are mutually inclusive pursuits at different ends of an activity spectrum.&lt;/p&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Jana: For our more technical readers, I have a few additional questions: If no standardization comes about for mapping relational databases to domain ontologies, how do you see that as influencing the decisions about adoption of semantic technology by businesses? After all, the success of technology often lives or dies on its ease of adoption.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;Me: Standardization of&lt;a href=&quot;http://esw.w3.org/topic/Rdb2RdfXG/StateOfTheArt&quot; id=&quot;link-id10abbc30&quot;&gt; RDBMS to RDF Mapping&lt;/a&gt; is not the critical success factor here (of course it would be nice). As stated earlier, the issue of data integration that arises from IT infrastructural heterogeneity has been with decision makers in the enterprise for ever. The problem is now seeping into the broader consumer realm via Web ubiquity. The mistakes made in the enterprise realm are now playing out in the consumer Web realm. In both realms the critical success factors are:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; Scalable productivity relative to exponential growth of data generated across Intranets, Extranets, and the Internet&lt;/li&gt; &lt;li&gt;Concept based &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id0x114e6888&quot;&gt;Context&lt;/a&gt; Lenses that transcend logical and physical data heterogeneity by putting dereferencable URIs in front of the Line of Business Application Data and/or Web Data Spaces such as Blogs, Wikis, Discussion Forums etc.).&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-08-29T11:08:12.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Essence of the Matter re. Information Overload</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-28#1425</atom:id>
  <atom:published>2008-08-28T12:17:55Z</atom:published>
  <atom:content type="html">&lt;p&gt;The title of this post is an expression of my gut reaction to the quotes below, which originate from &lt;a href=&quot;http://leobard.twoday.net/&quot; id=&quot;link-id104b2308&quot;&gt;Leo Sauermann&lt;/a&gt;&amp;#39;s post about the &lt;a href=&quot;http://leobard.twoday.net/stories/5151765/&quot; id=&quot;link-id1889d5d8&quot;&gt;Nepomuk Semantic Desktop for KDE&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&lt;strong&gt;Ansgar Bernardi&lt;/strong&gt;, deputy head of the &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id16d79970&quot;&gt;Knowledge&lt;/a&gt; Management Department at Deutsches Forschungszentrum für Künstliche Intelligenz (DFKI, or the German Research Center for Artificial Intelligence) and Nepomuk&amp;#39;s coordinator, explains, &amp;quot;The basic problem that we all face nowadays is how to handle vast amounts of &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13a01b58&quot;&gt;information&lt;/a&gt; at a sensible rate.&amp;quot; According to Bernardi, Nepomuk takes a traditional approach by creating a meta-&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; layer with well-defined elements that services can be built upon to create and manipulate the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id102433e8&quot;&gt;information&lt;/a&gt;.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; The comment above echoes my sentiments about the imminence of &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x10dd6c20&quot;&gt;information&lt;/a&gt; overload&amp;quot; due to the vast amounts of user generated content on the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id139926b0&quot;&gt;Internet&lt;/a&gt; as a whole. We are going to need to process more an more data within a fixed 24 hour timeframe, while attempting to balance our professional and personal lives. Be rest assured, this is a very serious issue, and you cannot event begin to address it without a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id188ebc20&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&amp;quot;The first idea of building the semantic desktop arose from the fact that one of our colleagues could not remember the girlfriends of his friends,&amp;quot; Bernard says, more than half-seriously. &amp;quot;Because they kept changing -- you know how it is. The point is, you have a vast amount of &lt;a href=&quot;http://dbpedia.org/resource/Information&quot;&gt;information&lt;/a&gt; on your desktop, hidden in files, hidden in emails, hidden in the names and structures of your folders. Nepomuk gives a standard way to handle such information.&amp;quot;&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt;If you get a personal &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id171dd2e0&quot;&gt;URI&lt;/a&gt; for &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id18294318&quot;&gt;Entity&lt;/a&gt; &amp;quot;You&amp;quot;, via a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id188a1b10&quot;&gt;Linked Data&lt;/a&gt; aware platform (e.g. &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id167ad840&quot;&gt;OpenLink Data Spaces&lt;/a&gt;) that virtualizes data across your existing Web data spaces (blogs, feed subscriptions, wikis, shared bookmarks, photo galleries, calendars, etc.), you then only have to remember your &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id171c3ef0&quot;&gt;URI&lt;/a&gt; whenever you need to &amp;quot;Find&amp;quot; something, imagine that!&lt;/p&gt; &lt;p&gt;To conclude, &amp;quot;information overload&amp;quot; is the imminent challenge of our time, and the keys to challenge alleviation lie in our ability to construct and maintain (via solutions) few &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1074ade0&quot;&gt;context&lt;/a&gt; lenses (URIs) that provide coherent conduits into the dense mesh of structured &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xd30b090&quot;&gt;Linked Data&lt;/a&gt; on the Web. &lt;/p&gt;</atom:content>
  <atom:updated>2008-08-28T15:56:20-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Crunchbase &amp; Semantic Web Interview (Remix - Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-27#1424</atom:id>
  <atom:published>2008-08-27T18:16:37Z</atom:published>
  <atom:content type="html">&lt;p&gt;After reading &lt;a href=&quot;http://blog.crunchbase.com/2008/08/26/building-a-semantic-web-interview-with-benjamin-nowack/&quot; id=&quot;link-id16b8e0e0&quot;&gt;Bengee&amp;#39;s interview with CrunchBase&lt;/a&gt;, I decided to knock up a quick interview remix as part of my usual attempt to add to the developing discourse.&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&lt;a href=&quot;http://www.crunchbase.com/&quot; id=&quot;link-id17c8e7b8&quot;&gt;CrunchBase&lt;/a&gt;: When we released the &lt;a href=&quot;http://www.crunchbase.com/help/api&quot; id=&quot;link-id16681f68&quot;&gt;CrunchBase API&lt;/a&gt;, you were one of the first developers to step up and quickly released a &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com&#39;s%20BLOG%20%5B127%5D/1395&quot; id=&quot;link-id1016d5f0&quot;&gt;CrunchBase Sponger Cartridge&lt;/a&gt;. Can you explain what a CrunchBase Sponger Cartridge is?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id13243300&quot;&gt;Me&lt;/a&gt;: A Sponger Cartridge is a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access driver for &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Resources that plugs into our &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id17042f08&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id1399b588&quot;&gt;Universal Server&lt;/a&gt; (DBMS and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id137fd188&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id100b23d8&quot;&gt;Web&lt;/a&gt; Server combo amongst other things). It uses the internal structure of a resource and/or a web service associated with a resource, to materialize an RDF based &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id10418750&quot;&gt;Linked Data graph&lt;/a&gt; that essentially describes the resource via its properties (Attributes &amp;amp; Relationships). &lt;/blockquote&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/images/ldp4.png&quot; /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: And what inspired you to create it?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id12fa60c0&quot;&gt;Me&lt;/a&gt;: Bengee built a new space with your data, and we&amp;#39;ve built a space on the fly from your data which still resides in your domain. Either solution extols the virtues of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id101a8d28&quot;&gt;Linked Data&lt;/a&gt; i.e. the ability to explore relationships across data items with high degrees of serendipity (also colloquially known as: following-your-nose pattern in &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id14a3ff30&quot;&gt;Semantic Web&lt;/a&gt; circles).&lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://cb.semsol.org/&quot; id=&quot;link-id182a0170&quot;&gt;Bengee&lt;/a&gt; posted a notice to the &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData&quot; id=&quot;link-id131e8d10&quot;&gt;Linking Open Data Community&lt;/a&gt;&amp;#39;s public &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/2008Jul/0110.html&quot; id=&quot;link-id11dd0720&quot;&gt;mailing list announcing his effort&lt;/a&gt;. Bearing in mind the fact that we&amp;#39;ve been using &lt;a href=&quot;http://www.openlinksw.com/blog/~kidehen/?id=1144&quot; id=&quot;link-id117cf6e8&quot;&gt;middleware to mesh the realms of Web 2.0 and the Linked Data Web&lt;/a&gt; for a while, it was a no-brainer to knock something up based on the conceptual similarities between &lt;a href=&quot;http://wikicompany.org/wiki/Main_Page&quot; id=&quot;link-id13b87a68&quot;&gt;Wikicompany&lt;/a&gt; and CrunchBase. In a sense, a quadrant of orthogonality is what immediately came to mind re. Wikicompany, CrunchBase, Bengee&amp;#39;s RDFization efforts, and ours.&lt;/blockquote&gt; &lt;blockquote&gt;Bengee created an RDF based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id133c8fc8&quot;&gt;Linked Data&lt;/a&gt; warehouse based on the data exposed by your API, which is exposed via the &lt;a href=&quot;http://cb.semsol.org/&quot; id=&quot;link-id1826f928&quot;&gt;Semantic CrunchBase&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id102d8890&quot;&gt;data space&lt;/a&gt;. In our case we&amp;#39;ve taken the &amp;quot;RDFization on the fly&amp;quot; approach which produces a transient &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id16a0b8d0&quot;&gt;Linked Data&lt;/a&gt; View of the CrunchBase data exposed by your APIs. Our approach is in line with our world view: all resources on the Web are data sources, and the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1668e6c8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id188e7da0&quot;&gt;Web&lt;/a&gt; is about incorporating HTTP into the naming scheme of these data sources so that the conventional &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id13490710&quot;&gt;URL&lt;/a&gt; based hyperlinking mechanism can be used to access a structured description of a resource, which is then transmitted using a range negotiable representation formats. In addition, based on the fact that we house and publish a lot of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id169aa568&quot;&gt;Linked Data&lt;/a&gt; on the Web (e.g. &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10af10e8&quot;&gt;DBpedia&lt;/a&gt;, &lt;a href=&quot;http://www.pingthesemanticweb.com/about/&quot; id=&quot;link-id10a2b710&quot;&gt;PingTheSemanticWeb&lt;/a&gt;, and others), we&amp;#39;ve also automatically meshed Crunchbase data with related data in &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1403cd40&quot;&gt;DBpedia&lt;/a&gt; and Wikicompany data.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: Do you know of any apps that are using CrunchBase Cartridge to enhance their functionality?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id177d24c8&quot;&gt;Me&lt;/a&gt;: Yes, the &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id10725ca0&quot;&gt;OpenLink Data Explorer&lt;/a&gt; which provides CrunchBase site visitors with the option to explore the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id17dedea8&quot;&gt;Linked Data&lt;/a&gt; in the CrunchBase &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id13f02a00&quot;&gt;data space&lt;/a&gt;. It also allows them to &amp;quot;Mesh&amp;quot; (rather than &amp;quot;Mash&amp;quot;) CrunchBase data with other &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11fb3ba0&quot;&gt;Linked Data&lt;/a&gt; sources on the Web without writing a single line of code. &lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: You have been immersed in the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id12e18a00&quot;&gt;Semantic Web&lt;/a&gt; movement for a while now. How did you first get interested in the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id15132110&quot;&gt;Semantic Web&lt;/a&gt;?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id0xddaa9c8&quot;&gt;Me&lt;/a&gt;: We saw the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id188b3330&quot;&gt;Semantic Web&lt;/a&gt; as a vehicle for standardizing conceptual views of heterogeneous data sources via &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10350978&quot;&gt;context&lt;/a&gt; lenses (URIs). In 1998 as part of our strategy to expand our business beyond the development and deployment of &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id171d6798&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id138120a0&quot;&gt;JDBC&lt;/a&gt;, and OLE-DB data providers, we decided to build a &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id13ea6618&quot;&gt;Virtual Database&lt;/a&gt; Engine (see: &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSHistory&quot; id=&quot;link-id11a4fa30&quot;&gt;Virtuoso History&lt;/a&gt;), and in doing so we sought a standards based mechanism for the conceptual output of the &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id101a1248&quot;&gt;data virtualization&lt;/a&gt; effort. As of the time of the &lt;a href=&quot;http://www.w3.org/DesignIssues/Semantic.html&quot; id=&quot;link-id18882cf8&quot;&gt;seminal unveiling of the Semantic Web in 1998&lt;/a&gt; we were clear about two things, in relation to the effects of the Web and &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id12fa2c58&quot;&gt;Internet&lt;/a&gt; data management infrastructure inflections: 1) Existing DBMS technology had reached it limits 2) Web Servers would ultimately hit their functional limits. These fundamental realities compelled us to develop &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id102b09a0&quot;&gt;Virtuoso&lt;/a&gt; with an eye to leveraging the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id11984d98&quot;&gt;Semantic Web&lt;/a&gt; as a vehicle from completing its technical roadmap.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: Can you put into layman’s terms exactly what RDF and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1066dcf0&quot;&gt;SPARQL&lt;/a&gt; are and why they are important? Do they only matter for developers or will they extend past developers at some point and be used by website visitors as well?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;Me: RDF (Resource Description Framework) is a Graph based Data Model that facilitates resource description using the &lt;a href=&quot;http://www.eslincanada.com/englishlesson2.html&quot; id=&quot;link-id178b94a8&quot;&gt;Subject, Predicate, and Object principle&lt;/a&gt;. Associated with the core data model, as part of the overall framework, are a number of markup languages for expressing your descriptions (just as you express presentation markup semantics in HTML or document structure semantics in XML) that include: &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id188db0a8&quot;&gt;RDFa&lt;/a&gt; (simple extension of HTML markup for embedding descriptions of things in a page), N3 (a human friendly markup for describing resources), RDF/XML (a machine friendly markup for describing resources).&lt;/blockquote&gt; &lt;blockquote&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id188c2030&quot;&gt;SPARQL&lt;/a&gt; is the query language associated with the RDF Data Model, just as &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id13f0ffe0&quot;&gt;SQL&lt;/a&gt; is a query language associated with the Relational Database Model. Thus, when you have RDF based structured and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id166874d0&quot;&gt;linked data&lt;/a&gt; on the Web, you can query against Web using &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1016cc98&quot;&gt;SPARQL&lt;/a&gt; just as you would against an &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id101c9708&quot;&gt;Oracle&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id11cb0b18&quot;&gt;SQL&lt;/a&gt; Server/&lt;a href=&quot;http://dbpedia.org/resource/IBM_DB2&quot; id=&quot;link-id10760ec0&quot;&gt;DB2&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/IBM_Informix&quot; id=&quot;link-id1066c8c0&quot;&gt;Informix&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Ingres&quot; id=&quot;link-id18894f40&quot;&gt;Ingres&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/MySQL&quot; id=&quot;link-iddc9ebb0&quot;&gt;MySQL&lt;/a&gt;/etc.. DBMS using &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1030d120&quot;&gt;SQL&lt;/a&gt;. That&amp;#39;s it in a nutshell.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: On your website you wrote that “RDF and &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id168e9ad0&quot;&gt;SPARQL&lt;/a&gt; as productivity boosters in everyday web development”. Can you elaborate on why you believe that to be true?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;Me: I think the ability to discern a formal description of anything via its discrete properties is of immense value re. productivity, especially when the capability in question results in a graph of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x179f6328&quot;&gt;Linked Data&lt;/a&gt; that isn&amp;#39;t confined to a specific host operating system, database engine, application or service, programming language, or development framework. RDF &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; is about infrastructure for the true materialization of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id13e475b8&quot;&gt;Information&lt;/a&gt; at Your Fingertips&amp;quot; vision of yore. Even though it&amp;#39;s taken the emergence of RDF Linked Data to make the aforementioned vision tractable, the comprehension of the vision&amp;#39;s intrinsic value have been clear for a very long time. Most organizations and/or individuals are quite familiar with the adage: &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id13e38a30&quot;&gt;Knowledge&lt;/a&gt; is Power, well there isn&amp;#39;t any &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id188b7348&quot;&gt;knowledge&lt;/a&gt; without accessible &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id140415d0&quot;&gt;Information&lt;/a&gt;, and there isn&amp;#39;t any accessible &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id11a976e8&quot;&gt;Information&lt;/a&gt; without accessible Data. The Web has always be grounded in accessibility to data (albeit via compound container documents called Web Pages).&lt;/blockquote&gt; &lt;blockquote&gt;Bottom line, RDF based Linked Data is about Open &lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id1206bfb8&quot;&gt;Data access by reference&lt;/a&gt; using URIs (HTTP based &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-idfaa6ce0&quot;&gt;Entity&lt;/a&gt; IDs / Data Object IDs / Data Source Names), and as I said earlier, the intrinsic value is pretty obvious bearing in mind the costs associated with integrating disparate and heterogeneous data sources -- across intranets, extranets, and the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id188ecc68&quot;&gt;Internet&lt;/a&gt;.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;CrunchBase: In his definition of Web 3.0, Nova Spivack proposes that the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id12e2d968&quot;&gt;Semantic Web&lt;/a&gt;, or Semanti&lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id105744c0&quot;&gt;c&lt;/a&gt; Web technologies, will be force behind much of the innovation that will occur during Web 3.0. Do you agree with Nova Spivack? What role, if any, do you feel the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id13fa4218&quot;&gt;Semantic Web&lt;/a&gt; will play in Web 3.0?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;Me: I agree with Nova. But I see Web 3.0 as a phase within the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id188c9000&quot;&gt;Semantic Web&lt;/a&gt; innovation continuum. Web 3.0 exists because Web 2.0 exists. Both of these Web versions express usage and technology focus patterns. Web 2.0 is about the use of Open Source technologies to fashion Web Services that are ultimately used to drive proprietary Software as Service (SaaS) style solutions. Web 3.0 is about the use of &amp;quot;Smart Data Access&amp;quot; to fashion a new generation of Linked Data aware Web Services and solutions that exploit the federated nature of the Web to maximum effect; proprietary branding will simply be conveyed via quality of data (cleanliness, &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id188d2ef8&quot;&gt;context&lt;/a&gt; fidelity, and comprehension of privacy) exposed by URIs.&lt;/blockquote&gt; &lt;p&gt;Here are some examples of the CrunchBase Linked Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id122756f8&quot;&gt;Space&lt;/a&gt;, as projected via our CruncBase Sponger Cartridge:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri=http%3A%2F%2Fwww.crunchbase.com%2Fcompany%2Famazon&quot; id=&quot;link-id13e0fd18&quot;&gt;Amazon.com&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri=http%3A%2F%2Fwww.crunchbase.com%2Fcompany%2Fmicrosoft&quot; id=&quot;link-id13eef9e0&quot;&gt;Microsoft&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri=http%3A%2F%2Fwww.crunchbase.com%2Fcompany%2Fgoogle&quot; id=&quot;link-id13fe47a0&quot;&gt;Google&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri=http%3A%2F%2Fwww.crunchbase.com%2Fcompany%2Fapple&quot; id=&quot;link-id170c73b8&quot;&gt;Apple&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-08-27T20:35:15-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>A quick look at SP2B, the SPARQL Performance Benchmark</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-08-27#1423</atom:id>
  <atom:published>2008-08-27T16:03:40Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;A quick look at SP2B, the SPARQL Performance Benchmark&lt;/div&gt; &lt;p&gt;I finally got around to running the &lt;a href=&quot;http://dbis.informatik.uni-freiburg.de/index.php?project=SP2B&quot; id=&quot;link-id17bac628&quot;&gt;SP&lt;sup&gt;2&lt;/sup&gt;B SPARQL Performance Benchmark&lt;/a&gt; on the current &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1dcaaa48&quot;&gt;Virtuoso&lt;/a&gt; Open Source Edition, v5.0.8.&lt;/p&gt; &lt;p&gt;I ran it with the 5M triples scale, which is the highest scale for which the authors give numbers.&lt;/p&gt; &lt;p&gt;I got a run time of 25 minutes for the 12 queries, giving an arithmetic mean of the query time of 125 seconds. This is better than the 800 or so seconds that the authors had measured. Also, Q6 of the set had failed for the authors, but we have since fixed this; the fix is in the v5.0.8 cut.&lt;/p&gt; &lt;p&gt;I also tried it with a scale of 25M, but this became I/O bound and took a bit longer. I will try this with v6 and v7 cluster later, which are vastly better at anything I/O bound.&lt;/p&gt; &lt;p&gt;The machine was a 2GHz Xeon with 8G RAM. The query text was the one from the authors, with an explicit &lt;code&gt;FROM&lt;/code&gt; clause added; the client was the command line Interactive &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1be2c808&quot;&gt;SQL&lt;/a&gt; (iSQL).&lt;/p&gt; &lt;p&gt;If one does the test with the default index layout without specifying a graph, things will not work very well. Also, returning the million-row results of these queries over the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x1d7ac018&quot;&gt;SPARQL protocol&lt;/a&gt; is not practical.&lt;/p&gt; &lt;p&gt;I will say something more about SP&lt;sup&gt;2&lt;/sup&gt;B when I get to have a closer look.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-09-02T09:49:57-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>A quick look at SP2B, the SPARQL Performance Benchmark</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-08-27#1422</atom:id>
  <atom:published>2008-08-27T16:00:07Z</atom:published>
  <atom:content type="html">&lt;p&gt;I finally got around to running the &lt;a href=&quot;http://dbis.informatik.uni-freiburg.de/index.php?project=SP2B&quot; id=&quot;link-id17bac628&quot;&gt;SP&lt;sup&gt;2&lt;/sup&gt;B SPARQL Performance Benchmark&lt;/a&gt; on the current &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1d2a6838&quot;&gt;Virtuoso&lt;/a&gt; Open Source Edition, v5.0.8.&lt;/p&gt; &lt;p&gt;I ran it with the 5M triples scale, which is the highest scale for which the authors give numbers.&lt;/p&gt; &lt;p&gt;I got a run time of 25 minutes for the 12 queries, giving an arithmetic mean of the query time of 125 seconds. This is better than the 800 or so seconds that the authors had measured. Also, Q6 of the set had failed for the authors, but we have since fixed this; the fix is in the v5.0.8 cut.&lt;/p&gt; &lt;p&gt;I also tried it with a scale of 25M, but this became I/O bound and took a bit longer. I will try this with v6 and v7 cluster later, which are vastly better at anything I/O bound.&lt;/p&gt; &lt;p&gt;The machine was a 2GHz Xeon with 8G RAM. The query text was the one from the authors, with an explicit &lt;code&gt;FROM&lt;/code&gt; clause added; the client was the command line Interactive &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x19e74ce0&quot;&gt;SQL&lt;/a&gt; (iSQL).&lt;/p&gt; &lt;p&gt;If one does the test with the default index layout without specifying a graph, things will not work very well. Also, returning the million-row results of these queries over the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x1c4231a0&quot;&gt;SPARQL protocol&lt;/a&gt; is not practical.&lt;/p&gt; &lt;p&gt;I will say something more about SP&lt;sup&gt;2&lt;/sup&gt;B when I get to have a closer look.&lt;/p&gt;</atom:content>
  <atom:updated>2008-09-02T09:49:55-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Nice Quote about Information Architecture &amp; World Wide Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-27#1421</atom:id>
  <atom:published>2008-08-27T14:47:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;Even with the marginal degrees of serendipitous discovery that the current document oriented &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; offers, it&amp;#39;s still possible to stumble across poignant gems such as this statement from &lt;a href=&quot;http://www.inspireux.com/&quot; id=&quot;link-id12432e10&quot;&gt;InspireUX&lt;/a&gt; :&lt;/p&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://www.inspireux.com/wp-content/uploads/67.gif&quot; /&gt; &lt;br /&gt; &lt;br /&gt; &lt;p&gt;The statement above resonates with a lot of my fundamental views about the essence of Web. It also drives right at the core of what we are trying to address with the &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id121118f8&quot;&gt;OpenLink Data Explorer&lt;/a&gt; (ODE) which simply isn&amp;#39;t about &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1a7fcc00&quot;&gt;Linked Data&lt;/a&gt; visualization, but the combination of visualization, user interaction, and unobtrusive exposure and exploitation of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; Entities culled from the existing Web of Linked Documents. ODE consumes and processes URIs or URLs. Thus, as long as the (X)HTML container / host document keeps URIs or URLs in &amp;quot;agent view&amp;quot;, ODE will give you the option to interact with the-&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;-behind Web &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x177c1dd0&quot;&gt;information&lt;/a&gt; resources (e.g., Web Pages, Images, Audio etc..)&lt;/p&gt; &lt;p&gt;Do remember, &amp;quot;mission-critical&amp;quot; is no longer a corporate / enterprise theme. The lines of demarcation between the individual and enterprise are blurring at warp speed.&lt;/p&gt;</atom:content>
  <atom:updated>2008-08-27T11:03:39-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso, Linked Data, and Linq2Rdf (Update 1)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-26#1420</atom:id>
  <atom:published>2008-08-26T12:36:05Z</atom:published>
  <atom:content type="html">&lt;p&gt;There are many challenges that have dogged attempts to mesh the DBMS &amp;amp; Object Technology realms for years, critical issues include:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access &amp;amp; manipulation impedance arising from Model mismatches between Relational Databases and Object Oriented &amp;amp; Object based Languages&lt;/li&gt; &lt;li&gt; Record / Data Object Referencing by ID. &lt;/li&gt; &lt;/ol&gt; &lt;p&gt;The big deal about &lt;a href=&quot;http://dbpedia.org/resourcei/Language_Integrated_Query&quot; id=&quot;link-id101df2c0&quot;&gt;LINQ&lt;/a&gt; has been the singular focus on addressing point 1, in particular.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve already written about the Linq2Rdf effort that meshes the best of .NET with the virtues of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10193ae8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id17143870&quot;&gt;Web&lt;/a&gt;&amp;quot;. &lt;/p&gt; &lt;p&gt;Here is an architecture diagram that seeks to illustrate the powerful data access and manipulation options that the combination of Linq2RDF and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10595ce0&quot;&gt;Linked Data&lt;/a&gt; deliver:&lt;/p&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; src=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/linqtordf/linqtordf2.png&quot; /&gt; &lt;p&gt;What may not have been obvious to most in the past, is the fact that Mapping from Object Models to Relational Models wasn&amp;#39;t really the solution to the problem at hand. Instead, the mapping should have been the other way around i.e., Relational to Object Model mapping. The emergence of RDF and &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id11e5a240&quot;&gt;RDBMS&lt;/a&gt; to RDF mapping technology is what makes this age-old headache addressable in very novel ways.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/RDF_Mapping_Presentation_W3C_workshop3/RDF_Mapping_Presentation_W3C_workshop3.html&quot; id=&quot;link-id10a9aa08&quot;&gt;RDBMS to RDF Mapping&lt;/a&gt; - W3C Workshop Presentation &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Virtuoso_Relational_to_RDF_Mapping/Virtuoso_Relational_to_RDF_Mapping.html&quot; id=&quot;link-id16d47330&quot;&gt;Virtuoso RDBMS to RDF Mapping&lt;/a&gt; - W3C Rdb2Rdf Incubator Group Presentation &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Virtuoso_RDF_Views/Virtuoso_RDF_Views_1.html&quot; id=&quot;link-id1403c4c8&quot;&gt;Creating RDF Views over SQL Data Sources&lt;/a&gt; - Technology Tutorial&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-08-27T07:51:23.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Configuring Virtuoso for Benchmarking</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-08-25#1419</atom:id>
  <atom:published>2008-08-25T14:06:11Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Configuring Virtuoso for Benchmarking&lt;/div&gt; &lt;p&gt;I will here summarize what should be known about running benchmarks with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xc152cf0&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Physical Memory&lt;/h2&gt; &lt;p&gt;For 8G RAM, in the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; NumberOfBuffers = 550000 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For 16G RAM, double this—&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; NumberOfBuffers = 1100000 &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Transaction Isolation&lt;/h2&gt; &lt;p&gt;For most cases, certainly all &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xb7ba270&quot;&gt;RDF&lt;/a&gt; cases, &lt;i&gt;Read Committed&lt;/i&gt; should be the default transaction isolation. In the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; DefaultIsolation = 2 &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Multiuser Workload&lt;/h2&gt; &lt;p&gt;If &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x1a40f308&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1e003cf8&quot;&gt;JDBC&lt;/a&gt;, or similarly connected client applications are used, there must be more &lt;code&gt;ServerThreads&lt;/code&gt; available than there will be client connections. In the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; ServerThreads = 100 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;With web clients (unlike ODBC, JDBC, or similar clients), it may be justified to have fewer &lt;code&gt;ServerThreads&lt;/code&gt; than there are concurrent clients. The &lt;code&gt;MaxKeepAlives&lt;/code&gt; should be the maximum number of expected web clients. This can be more than the &lt;code&gt;ServerThreads&lt;/code&gt; count. In the &lt;code&gt;[HTTPServer]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [HTTPServer]&lt;br /&gt; ...&lt;br /&gt; ServerThreads = 100 &lt;br /&gt; MaxKeepAlives = 1000 &lt;br /&gt; KeepAliveTimeout = 10 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Note&lt;/b&gt; — The &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt; are taken from the total pool made available by the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt;. Thus, the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; should always be at least as large as (and is best set greater than) the &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt;, and if using the closed-source Commercial Version, should not exceed the licensed thread count.&lt;/i&gt; &lt;/p&gt; &lt;h2&gt;Disk Use&lt;/h2&gt; &lt;p&gt;The basic rule is to use one stripe (file) per distinct physical device (not per file system), using no RAID. For example, one might stripe a database over 6 files (6 physical disks), with an initial size of 60000 pages (the files will grow as needed). &lt;/p&gt; &lt;p&gt;For the above described example, in the &lt;code&gt;[Database]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Database]&lt;br /&gt; ...&lt;br /&gt; Striping = 1&lt;br /&gt; MaxCheckpointRemap = 2000000 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;— and in the &lt;code&gt;[Striping]&lt;/code&gt; stanza, on one line per &lt;code&gt;SegmentName&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Striping]&lt;br /&gt; ...&lt;br /&gt; Segment1 = 60000 , /virtdev/db/virt-seg1.db = q1 , /data1/db/virt-seg1-str2.db = q2 , /data2/db/virt-seg1-str3.db = q3 , /data3/db/virt-seg1-str4.db = q4 , /data4/db/virt-seg1-str5.db = q5 , /data5/db/virt-seg1-str6.db = q6&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;As can be seen here, each file gets a background IO thread (the &lt;code&gt;= q&lt;i&gt;xxx&lt;/i&gt;&lt;/code&gt; clause). It should be noted that all files on the same physical device should have the same &lt;code&gt;q&lt;i&gt;xxx&lt;/i&gt;&lt;/code&gt; value. This is not directly relevant to the benchmarking scenario above, because we have only one file per device, and thus only one file per IO queue.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xc8b97c0&quot;&gt;SQL&lt;/a&gt; Optimization&lt;/h2&gt; &lt;p&gt;If queries have lots of joins but access little &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x193b2fa8&quot;&gt;data&lt;/a&gt;, as with the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1b283ca0&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;, the SQL compiler must be told not to look for better plans if the best plan so far is quicker than the compilation time expended so far. Thus, in the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; StopCompilerWhenXOverRunTime = 1 &lt;/code&gt; &lt;/blockquote&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-08-25T15:29:06.000036-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Configuring Virtuoso for Benchmarking</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-08-25#1418</atom:id>
  <atom:published>2008-08-25T14:05:46Z</atom:published>
  <atom:content type="html">&lt;p&gt;I will here summarize what should be known about running benchmarks with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xc53af18&quot;&gt;Virtuoso&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt;Physical Memory&lt;/h2&gt; &lt;p&gt;For 8G RAM, in the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; NumberOfBuffers = 550000 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;For 16G RAM, double this—&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; NumberOfBuffers = 1100000 &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Transaction Isolation&lt;/h2&gt; &lt;p&gt;For most cases, certainly all &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xc2f07a0&quot;&gt;RDF&lt;/a&gt; cases, &lt;i&gt;Read Committed&lt;/i&gt; should be the default transaction isolation. In the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; DefaultIsolation = 2 &lt;/code&gt; &lt;/blockquote&gt; &lt;h2&gt;Multiuser Workload&lt;/h2&gt; &lt;p&gt;If &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0xc1c7178&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xd16fb40&quot;&gt;JDBC&lt;/a&gt;, or similarly connected client applications are used, there must be more &lt;code&gt;ServerThreads&lt;/code&gt; available than there will be client connections. In the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; ServerThreads = 100 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;With web clients (unlike ODBC, JDBC, or similar clients), it may be justified to have fewer &lt;code&gt;ServerThreads&lt;/code&gt; than there are concurrent clients. The &lt;code&gt;MaxKeepAlives&lt;/code&gt; should be the maximum number of expected web clients. This can be more than the &lt;code&gt;ServerThreads&lt;/code&gt; count. In the &lt;code&gt;[HTTPServer]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [HTTPServer]&lt;br /&gt; ...&lt;br /&gt; ServerThreads = 100 &lt;br /&gt; MaxKeepAlives = 1000 &lt;br /&gt; KeepAliveTimeout = 10 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;i&gt;&lt;b&gt;Note&lt;/b&gt; — The &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt; are taken from the total pool made available by the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt;. Thus, the &lt;code&gt;[Parameters] ServerThreads&lt;/code&gt; should always be at least as large as (and is best set greater than) the &lt;code&gt;[HTTPServer] ServerThreads&lt;/code&gt;, and if using the closed-source Commercial Version, should not exceed the licensed thread count.&lt;/i&gt; &lt;/p&gt; &lt;h2&gt;Disk Use&lt;/h2&gt; &lt;p&gt;The basic rule is to use one stripe (file) per distinct physical device (not per file system), using no RAID. For example, one might stripe a database over 6 files (6 physical disks), with an initial size of 60000 pages (the files will grow as needed). &lt;/p&gt; &lt;p&gt;For the above described example, in the &lt;code&gt;[Database]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Database]&lt;br /&gt; ...&lt;br /&gt; Striping = 1&lt;br /&gt; MaxCheckpointRemap = 2000000 &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;— and in the &lt;code&gt;[Striping]&lt;/code&gt; stanza, on one line per &lt;code&gt;SegmentName&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Striping]&lt;br /&gt; ...&lt;br /&gt; Segment1 = 60000 , /virtdev/db/virt-seg1.db = q1 , /data1/db/virt-seg1-str2.db = q2 , /data2/db/virt-seg1-str3.db = q3 , /data3/db/virt-seg1-str4.db = q4 , /data4/db/virt-seg1-str5.db = q5 , /data5/db/virt-seg1-str6.db = q6&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;As can be seen here, each file gets a background IO thread (the &lt;code&gt;= q&lt;i&gt;xxx&lt;/i&gt;&lt;/code&gt; clause). It should be noted that all files on the same physical device should have the same &lt;code&gt;q&lt;i&gt;xxx&lt;/i&gt;&lt;/code&gt; value. This is not directly relevant to the benchmarking scenario above, because we have only one file per device, and thus only one file per IO queue.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xc9fa298&quot;&gt;SQL&lt;/a&gt; Optimization&lt;/h2&gt; &lt;p&gt;If queries have lots of joins but access little &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xb4e0aa0&quot;&gt;data&lt;/a&gt;, as with the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xb2de990&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt;, the SQL compiler must be told not to look for better plans if the best plan so far is quicker than the compilation time expended so far. Thus, in the &lt;code&gt;[Parameters]&lt;/code&gt; stanza of &lt;code&gt;virtuoso.ini&lt;/code&gt;, set —&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; [Parameters]&lt;br /&gt; ...&lt;br /&gt; StopCompilerWhenXOverRunTime = 1 &lt;/code&gt; &lt;/blockquote&gt;</atom:content>
  <atom:updated>2008-08-25T15:29:04-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Architecture</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-22#1416</atom:id>
  <atom:published>2008-08-22T02:50:07Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here is a pictorial of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot;&gt;DBpedia&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; Deployment &amp;amp; Data Management architecture:&lt;/p&gt; &lt;p&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; style=&quot;max-width: 800px;&quot; src=&quot;http://wiki.dbpedia.org/files/virtuoso_linked_data_deployment.png&quot; /&gt; &lt;/p&gt; &lt;p&gt;Key points:&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfapiandsql.html&quot; id=&quot;link-id13dcfb98&quot;&gt;SPASQL&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot;&gt;SPARQL&lt;/a&gt; extension for &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot;&gt;SQL&lt;/a&gt;) enables the intelligent resource representation request handling and &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot;&gt;URI&lt;/a&gt; dereferencing, that underlies &amp;quot;Linked Data&amp;quot; (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Hyperdata&lt;/a&gt; Linking) to occur in-process.&lt;br /&gt; &lt;/p&gt;</atom:content>
  <atom:updated>2008-08-21T22:50:09.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The Future of the Desktop</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-21#1415</atom:id>
  <atom:published>2008-08-21T15:26:18Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://www.jasonkolb.com/&quot; id=&quot;link-id13ba6d90&quot;&gt;Jason Kolb&lt;/a&gt; (who &lt;a href=&quot;http://www.jasonkolb.com/weblog/2008/08/the-future-of-t.html&quot; id=&quot;link-id1524e210&quot;&gt;initially&lt;/a&gt; nudged me to chime in), and then &lt;a href=&quot;http://www.readwriteweb.com/archives/future_of_the_desktop.php&quot; id=&quot;link-id13a182c0&quot;&gt;ReadWriteWeb&lt;/a&gt;, and of course &lt;a href=&quot;http://www.twine.com/item/11bshgkbr-1k5/the-future-of-the-desktop&quot; id=&quot;link-id13f1e1f0&quot;&gt;Nova&amp;#39;s Twine about the topic&lt;/a&gt;, have collectively started an interesting discussion about &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;.vNext (3.0 and beyond) under the heading: The Future of the Desktop.&lt;/p&gt; &lt;p&gt;My contribution to the developing discourse takes the form of a Q&amp;amp;A session. I&amp;#39;ve taken the questions posed and provided answers that express my particular points of view: &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;Q: Is the desktop of the future going to just be a web-hosted version of the same old-fashioned desktop metaphors we have today?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: No, it&amp;#39;s going to be a more &lt;a href=&quot;http://www.w3.org/TR/webarch/&quot; id=&quot;link-id1524d4a0&quot;&gt;Web Architecture&lt;/a&gt; aware and compliant variant exposed by appropriate metaphors.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The desktop of the future is going to be a hosted web service&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: A vessel for exploiting the virtues of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10827ad0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id155bc698&quot;&gt;Web&lt;/a&gt;.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The Browser is Going to Swallow Up the Desktop&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: Literally, of course not! Metaphorically, of course! And then the Browser metaphor will decomposes into function specific bits of Web interaction amenable to orchestration by its users.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The focus of the desktop will shift from &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1667e2e0&quot;&gt;information&lt;/a&gt; to attention&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: No! &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id104bb9c8&quot;&gt;Knowledge&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id1524dd48&quot;&gt;Information&lt;/a&gt;, and &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; sharing courtesy of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10723640&quot;&gt;Hyperdata&lt;/a&gt; &amp;amp; Hypertext Linking.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: Users are going to shift from acting as librarians to acting as daytraders&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: They were Librarians at Web 1.0, Journalist at Web 2.0, and Analysts in Web 3.0 (i.e, analyze structured and interlinked data), and CEOs in Web 4.0 (i.e. get Agents to do stuff intelligently en route to making decisions).&lt;/blockquote&gt; &lt;blockquote&gt; &lt;br /&gt; &lt;cite&gt;Q: The Webtop will be more social and will leverage and integrate collective intelligence&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13a01ed0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id106343a8&quot;&gt;Web&lt;/a&gt; vessel will only require you to fill in your profile (once) and then serendipitous discovery and meshing of relevant data will simply happen (the serendipity quotient will grow in line with &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10560050&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id100f4940&quot;&gt;Web&lt;/a&gt; density).&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The desktop of the future is going to have powerful semantic search and social search capabilities built-in&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: It is going to be able to &amp;quot;Find&amp;quot; rather than &amp;quot;Search&amp;quot; for stuff courtesy of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10a18a70&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10a976f0&quot;&gt;Web&lt;/a&gt;.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt; Q: Interactive shared spaces will replace folders&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: Data Spaces and their URIs (Data Source Names) replace everything. You simply choose the exploration metaphor that best suits you space interaction needs.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The Portable Desktop&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: Ubiquitous Desktop i.e. do the same thing (all answers above) on any device connected to the Web.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The Smart Desktop&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: Vessels with access to Smart Data (&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1666e4e8&quot;&gt;Linked Data&lt;/a&gt; + Action driven &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id171d1ff0&quot;&gt;Context&lt;/a&gt; sprinklings).&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: Federated, open policies and permissions&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: More federation for sure, XMPP will become a lot more important, and OAuth will enable resurgence of the federated aspects of the Web and &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id100a66a8&quot;&gt;Internet&lt;/a&gt;.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The personal cloud&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id104ba580&quot;&gt;Personal Data Spaces&lt;/a&gt; plugged into Clouds (&lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id15bbb970&quot;&gt;Intranet&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id1026d6b0&quot;&gt;Extranet&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id140508c8&quot;&gt;Internet&lt;/a&gt;).&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: The WebOS&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: An operating system endowed with traditional Database and Host Operating system functionality such as: RDF Data Model, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-idd86f48&quot;&gt;SPARQL&lt;/a&gt; Query Language, &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id13f47268&quot;&gt;URI&lt;/a&gt; based &lt;a href=&quot;http://en.wikipedia.org/wiki/Pointer&quot; id=&quot;link-id1055bc78&quot;&gt;Pointer mechanism&lt;/a&gt;, and HTTP based message Bus.&lt;/blockquote&gt; &lt;br /&gt; &lt;blockquote&gt; &lt;cite&gt;Q: Who is most likely to own the future desktop?&lt;/cite&gt; &lt;/blockquote&gt; &lt;blockquote&gt;A: You! And all you need is a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id106b79e8&quot;&gt;URI&lt;/a&gt; (an ID or Data Source Name for &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id133c88a0&quot;&gt;Entity&lt;/a&gt; You&amp;quot;) and a Profile Page (a place where &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id15fa8060&quot;&gt;Entity&lt;/a&gt; You&amp;quot; is Describe by You).&lt;/blockquote&gt; &lt;h3&gt;One Last Thing&lt;/h3&gt; &lt;p&gt;You can get a feel for the future desktop by &lt;a href=&quot;http://ode.openlinksw.com/#Download&quot; id=&quot;link-id165ec048&quot;&gt;downloading&lt;/a&gt; and then installing the &lt;a href=&quot;http://ode.openlinksw.com/&quot; id=&quot;link-id13baba38&quot;&gt;OpenLink Data Explorer&lt;/a&gt; plugin for Firefox, which allows you to switch viewing modes between Web Page and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13f12410&quot;&gt;Linked Data&lt;/a&gt; behind the page. :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenLink_Data_Spaces&quot; id=&quot;link-id12496e48&quot;&gt;OpenLink Data Spaces&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/GetAPersonalURIIn5MinutesOrLess&quot; id=&quot;link-id1027f060&quot;&gt;Get Yourself a URI in 5 Minutes or Less&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/DataPortability_and_DataSpaces/DataPortability_and_DataSpaces.html&quot; id=&quot;link-id10890f70&quot;&gt;Linked Data Spaces &amp;amp; Data Portability&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html&quot; id=&quot;link-id137efdf8&quot;&gt;Linked Data Conference Keynote&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id1239d300&quot;&gt;RDFa&lt;/a&gt; based remix edition that includes vital bits from &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1317a048&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id165f57c8&quot;&gt;Linked Data Planet presentation&lt;/a&gt;).&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-08-21T15:59:25.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Yahoo! and the Linked Data Web in a Nutshell</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-19#1414</atom:id>
  <atom:published>2008-08-19T19:43:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;This automated mail from Yahoo! speaks for itself re. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id133de628&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1404ff40&quot;&gt;Web&lt;/a&gt; incomprehension!&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;&lt;p&gt; Greetings! &lt;/p&gt; &lt;p&gt; This is an automated email from Yahoo! Application Gallery. Please do not reply to this email message. We regret to inform you that your application &amp;#39;&lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id1056e6e0&quot;&gt;Blog&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id170bde38&quot;&gt;Data Space&lt;/a&gt;&amp;#39; has been rejected. You can view all your applications &lt;a href=&quot;http://gallery.yahoo.com/mypage&quot; id=&quot;link-id1045f988&quot;&gt;here&lt;/a&gt;. Moderator Comments: insufficient info &lt;/p&gt; &lt;p&gt; Regards, &lt;/p&gt; &lt;p&gt; The Yahoo! Application Gallery Team &lt;/p&gt; &lt;p&gt; Your use of Yahoo! Application Gallery is subject to http://docs.yahoo.com/info/terms/ &lt;/p&gt; &lt;/cite&gt; &lt;/blockquote&gt; &lt;h3&gt;Message to Yahoo!:&lt;/h3&gt; &lt;p&gt; Why bother? You clearly see the Web in a totally different light to the rest of us.&lt;/p&gt; &lt;p&gt;If you want to private label the Web, then fine, just don&amp;#39;t park your vehicle in the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id100a8000&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; or &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id1085c490&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; spots.&lt;/p&gt; &lt;p&gt;The Web doesn&amp;#39;t need any subjectivity bootstraps or booster-shots, it just needs open access to Structured and &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; via URIs.&lt;/p&gt; &lt;h3&gt;Kind of Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://feeds.feedburner.com/~r/ThinkingSpace/~3/369221488/age-of-google-4-future.html&quot; id=&quot;link-id128d6fd8&quot;&gt;Yihong Ding&amp;#39;s Age of Google (4)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-08-19T17:54:38.000008-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Response to: Whole Data Post (Update 3)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-15#1413</atom:id>
  <atom:published>2008-08-15T13:06:12Z</atom:published>
  <atom:content type="html">&lt;p&gt;This post is in response to &lt;a href=&quot;http://www.furia.com&quot; id=&quot;link-id107907b8&quot;&gt;Glenn McDonald&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://www.furia.com/page.cgi?type=log&amp;amp;id=308&quot; id=&quot;link-id13dcf2d0&quot;&gt;Whole Data&lt;/a&gt;, where he highlights a number of issues relating to &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id1016c1f0&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; marketing communications and overall messaging, from his perspective.&lt;/p&gt; &lt;p&gt; By coincidence, Glenn and I presented at this month&amp;#39;s Cambridge &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-idd526f48&quot;&gt;Semantic Web&lt;/a&gt; Gathering.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve provided a dump of Glenn&amp;#39;s issues and my responses below:&lt;/p&gt; &lt;h3&gt;Issue - RDF&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Ingenious &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; decomposition idea, but: &lt;/li&gt; &lt;li&gt;too low-level; the assembly language of data, where we need Java or &lt;a href=&quot;http://dbpedia.org/resource/Ruby_programming_language&quot; id=&quot;link-id103f3dd0&quot;&gt;Ruby&lt;/a&gt; &lt;/li&gt; &lt;li&gt;&amp;quot;resource&amp;quot; is not the issue; there&amp;#39;s no such thing as &amp;quot;metadata&amp;quot;, it&amp;#39;s all data; &amp;quot;meta&amp;quot; is a perspective &lt;/li&gt; &lt;li&gt;lists need to be effortless, not painful and obscure &lt;/li&gt; &lt;li&gt;nodes need to be represented, not just implied; they need types and literals in a more pervasive, integrated way. &lt;/li&gt; &lt;/ul&gt; &lt;h4&gt;Response:&lt;/h4&gt; &lt;p&gt;RDF is a Graph based Data Model it stands for Resource Description Framework. The Metadata data angle comes from it&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/Meta_Content_Framework&quot; id=&quot;link-id1690df60&quot;&gt;Meta Content Framework (MCF)&lt;/a&gt; origins. You can express and serialize data based on the RDF Data Model using: Turtle, N3, TriX, N-Triples, and RDF/XML.&lt;/p&gt; &lt;h3&gt;Issue - &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10234b38&quot;&gt;SPARQL&lt;/a&gt; (and Freebase&amp;#39;s MQL)&lt;/h3&gt; &lt;p&gt;These are just appeasement: &lt;br /&gt;- old query paradigm: fishing in dark water with superstitiously tied lures; only works well in carefully stocked lakes &lt;br /&gt;- we don&amp;#39;t ask questions by defining answer shapes and then hoping they&amp;#39;re dredged up whole.&lt;/p&gt; &lt;h4&gt;Response:&lt;/h4&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id16e45e50&quot;&gt;SPARQL&lt;/a&gt;, &lt;a href=&quot;http://www.freebase.com/view/freebase/api&quot; id=&quot;link-id13e7d468&quot;&gt;MQL&lt;/a&gt;, and &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb387145.aspx&quot; id=&quot;link-id1516fbd8&quot;&gt;Entity-SQL&lt;/a&gt; are Graph Model oriented Query Languages. Query Languages always accompany Database Engines. &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id13f8c100&quot;&gt;SQL&lt;/a&gt; is the Relational Model equivalent. &lt;/p&gt; &lt;h3&gt;Issue - &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id171dee68&quot;&gt;Linked Data&lt;/a&gt; &lt;/h3&gt; &lt;p&gt;Noble attempt to ground the abstract, but: &lt;br /&gt;- &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1576d5f8&quot;&gt;URI&lt;/a&gt; dereferencing/namespace/&lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id15f50180&quot;&gt;open-world&lt;/a&gt; issues focus too much technical attention on cross-source cases where the human issues dwarf the technical ones anyway &lt;br /&gt;- &lt;a href=&quot;http://dbpedia.org/resource/Friend_of_a_friend&quot; id=&quot;link-id105df458&quot;&gt;FOAF&lt;/a&gt; query over the people in this room? forget it. &lt;br /&gt;- link asymmetry doesn&amp;#39;t scale &lt;br /&gt;- identity doesn&amp;#39;t scale &lt;br /&gt;- generating RDF from non-graph sources: more appeasement, right where the win from actually converting could be biggest! &lt;/p&gt; &lt;h4&gt;Response:&lt;/h4&gt; &lt;p&gt;Innovative use of HTTP to deliver &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_%28computer_science%29&quot; id=&quot;link-id13eeab20&quot;&gt;Data Access by Reference&lt;/a&gt;&amp;quot; to the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13492610&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id105dfc10&quot;&gt;Web&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;When you have a Data Model, Database Engine, and Query Language, the next thing you need is a Data Access mechanism that provides &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id100ef2c0&quot;&gt;Data Access by Reference&lt;/a&gt;&amp;quot;. &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id16692e88&quot;&gt;ODBC&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id1699b970&quot;&gt;JDBC&lt;/a&gt; (amongst others) provide &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot; id=&quot;link-id16034b48&quot;&gt;Data Access by Reference&lt;/a&gt;&amp;quot; via Data Source Names. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id16690118&quot;&gt;Linked Data&lt;/a&gt; is about the same thing (URIs are Data Source Names) with the following differences:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Naming is scoped to the &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1195dc48&quot;&gt;entity&lt;/a&gt; level rather than container level&lt;/li&gt; &lt;li&gt;HTTP&amp;#39;s use within the data source naming scheme expands the referencability of the Named &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id10485760&quot;&gt;Entity&lt;/a&gt; Descriptions beyond traditional confines such as applications, operating systems, and database engines. &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt; Issue - &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id104684d0&quot;&gt;Giant Global Graph&lt;/a&gt; &lt;/h3&gt; &lt;p&gt;Hugely motivating and powerful idea, worthy of a superhero (Graphius!), but: &lt;br /&gt;- giant and global parts are too hard, and starting global makes every problem harder &lt;br /&gt;- local projects become unmanageable in global &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id12497088&quot;&gt;context&lt;/a&gt; (Cyc, Freebase data-modeling lists...). And my thus my plea, again. Forget &amp;quot;semantic&amp;quot; and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;web&lt;/a&gt;&amp;quot;, let&amp;#39;s fix the database tech first: &lt;br /&gt;- node/arc data-model, path-based exploratory query-model &lt;br /&gt;- data-graph applications built easily on top of this common model; building them has to be easy, because if it&amp;#39;s hard, they&amp;#39;ll be bad &lt;br /&gt;- given good database tech, good web data-publishing tech will be trivial! &lt;br /&gt;- given good tools for graphs, the problems of uniting them will be only as hard as they have to be.&lt;/p&gt; &lt;h4&gt;Response:&lt;/h4&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id144466d8&quot;&gt;Giant Global Graph&lt;/a&gt; is just another moniker for a &amp;quot;Web of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id15c2c738&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; or &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14e73520&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10aef200&quot;&gt;Web&lt;/a&gt;&amp;quot;.&lt;/p&gt; &lt;p&gt;Multi-Model Database technology that meshes the best of the Graph &amp;amp; Relational Models exist. In a nutshell, this is what &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13492e10&quot;&gt;Virtuoso&lt;/a&gt; is all about and it&amp;#39;s existed for a very long time :-)&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id105a4f58&quot;&gt;Virtuoso&lt;/a&gt; is also a Virtual DBMS engine (so you can see Heterogeneous Relational Data via Graph Model &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id15845110&quot;&gt;Context&lt;/a&gt; Lenses). Naturally, it is also a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id109e2c78&quot;&gt;Linked Data&lt;/a&gt; Deployment platform (or &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1086d650&quot;&gt;Linked Data&lt;/a&gt; Sever). &lt;/p&gt; &lt;p&gt;The issue isn&amp;#39;t the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id107f1ba8&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; moniker per se., it&amp;#39;s about how &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xba72818&quot;&gt;Linked Data&lt;/a&gt; (foundation layer of &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id101dbf50&quot;&gt;Semantic Web&lt;/a&gt;) gets introduced to users. As I said during the MIT Gathering: &amp;quot;The Web is experienced via Web Browsers primarily, so any enhancement to the Web must be exposed via traditional Web Browsers&amp;quot;, which is why we&amp;#39;ve opted to simply add &amp;quot;View &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; Sources&amp;quot; to the existing set of common Browser options that includes:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;View page in rendered form (default)&lt;/li&gt; &lt;li&gt;View page source (i.e., how you see the markup behind the page)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;By exposing the Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id15a04b70&quot;&gt;Web&lt;/a&gt; option as described above, you enable the Web user to knowingly transition from the traditional Rendered (X)HTML page view to the Linked Data View (i.e., structured data behind the page). This simple &amp;quot;User Interaction&amp;quot; tweak makes the notion of exploiting a Structured Web becomes somewhat clearer.&lt;/p&gt; &lt;p&gt;The Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10a187d0&quot;&gt;Web&lt;/a&gt; isn&amp;#39;t a panacea. It&amp;#39;s just an addition to the existing Web that enrichens the things you can do with the Web. It&amp;#39;s predominance, like any application feature, will be subject to the degrees to which it delivers tangible value or matrializes internal and external opportunity costs.&lt;/p&gt; &lt;p&gt;Note: The Web isn&amp;#39;t ubiquitous today becuase all it&amp;#39;s users groked HTML Markup. It&amp;#39;s ubquitity is a function of opportunity costs: there simply came a point in the Web boostrap when nobody could afford the opportunity costs associated with being off the Web. The same thing will play out with Linked Data and the broader &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10a97330&quot;&gt;Semantic Web&lt;/a&gt; vision.&lt;/p&gt; &lt;b&gt;Links:&lt;/b&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2_TimBL_v3.html(15)&quot; id=&quot;link-id137fc560&quot;&gt;Linked Data Journey part of my Linked Data Planet Presentation Remix&lt;/a&gt;(from slides 15 to 22 - which include bits from &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1048a968&quot;&gt;TimBL&lt;/a&gt;&amp;#39;s presentation)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://ode.openlinksw.com&quot; id=&quot;link-id1667df98&quot;&gt;OpenLink Data Explorer&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://ode.openlinksw.com/example.html&quot; id=&quot;link-id137ee860&quot;&gt;OpenLink Data Explorer Screenshots and examples&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt;</atom:content>
  <atom:updated>2008-08-15T18:31:48-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia 3.1 is now Live!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-13#1411</atom:id>
  <atom:published>2008-08-13T17:54:31Z</atom:published>
  <atom:content type="html">&lt;a href=&quot;http://dbpedia.org/About&quot; id=&quot;link-id10afcac0&quot;&gt;DBpedia&lt;/a&gt; 3.1 is now live. The release highlights are as follows:&lt;br /&gt; &lt;ul&gt; &lt;li&gt;116,7 million triples (27% increase over prior release) &lt;/li&gt; &lt;li&gt;better &lt;a href=&quot;http://www.mpi-inf.mpg.de/%7Esuchanek/downloads/yago/&quot; id=&quot;link-id14095ce0&quot;&gt;YAGO&lt;/a&gt; mapping (instances associated with YAGO classes)&lt;/li&gt; &lt;li&gt;Geo extractor code has been improved and is now run for all 14 languages&lt;/li&gt; &lt;li&gt;New (X)HTML based Resource/&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1682b988&quot;&gt;Entity&lt;/a&gt; Description Page (Example:&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1045d8c0&quot;&gt; Linked Data&lt;/a&gt;)&lt;/li&gt; &lt;/ul&gt;Enjoy!&lt;br /&gt; &lt;br /&gt;</atom:content>
  <atom:updated>2008-08-14T08:15:47-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>BSBM With Triples and Mapped Relational Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-08-06#1410</atom:id>
  <atom:published>2008-08-06T19:41:50Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;BSBM With Triples and Mapped Relational Data&lt;/div&gt; &lt;p&gt;The special contribution of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id10039db0&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id106b2538&quot;&gt;BSBM&lt;/a&gt;) to the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id101a75f8&quot;&gt;RDF&lt;/a&gt; world is to raise the question of doing OLTP with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xae54170&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Of course, here we immediately hit the question of comparisons with relational databases. To this effect, &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0x1e847b08&quot;&gt;BSBM&lt;/a&gt; also specifies a relational schema and can generate the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1206c378&quot;&gt;data&lt;/a&gt; as either triples or &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1667f040&quot;&gt;SQL&lt;/a&gt; inserts.&lt;/p&gt; &lt;p&gt;The benchmark effectively simulates the case of exposing an existing &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id10a93518&quot;&gt;RDBMS&lt;/a&gt; as RDF. &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id13e46d80&quot;&gt;OpenLink Software&lt;/a&gt; calls this &lt;i&gt;RDF Views&lt;/i&gt;. &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id12027578&quot;&gt;Oracle&lt;/a&gt; is beginning to call this &lt;i&gt;semantic covers&lt;/i&gt;. The &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id161dc678&quot;&gt;RDB2RDF XG&lt;/a&gt;, a W3C incubator group, has been active in this area since Spring, 2008.&lt;/p&gt; &lt;h3&gt;But why an OLTP workload with RDF to begin with?&lt;/h3&gt; &lt;p&gt;We believe this is relevant because RDF promises to be the interoperability factor between potentially all of traditional IS. If &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1e7119d8&quot;&gt;data&lt;/a&gt; is online for human consumption, it may be online via a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id106a8908&quot;&gt;SPARQL&lt;/a&gt; end-point as well. The economic justification will come from discoverability and from applications integrating multi-source structured data. Online shopping is a fine use case.&lt;/p&gt; &lt;p&gt;Warehousing all the world&amp;#39;s publishable data as RDF is not our first preference, nor would it be the publisher&amp;#39;s. Considerations of duplicate infrastructure and maintenance are reason enough. Consequently, we need to show that mapping can outperform an RDF warehouse, which is what we&amp;#39;ll do here.&lt;/p&gt; &lt;h3&gt;What We Got &lt;/h3&gt; &lt;p&gt;First, we found that &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1400&quot; id=&quot;link-id150ea748&quot;&gt;making the query plan took much too long&lt;/a&gt; in proportion to the run time. With BSBM this is an issue because the queries have lots of joins but access relatively little data. So we made a faster compiler and along the way retouched the cost model a bit.&lt;/p&gt; &lt;p&gt;But the really interesting part with BSBM is mapping relational data to RDF. For us, BSBM is a great way of showing that mapping can outperform even the best triple store. A relational row store is as good as unbeatable with the query mix. And when there is a clear mapping, there is no reason the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xae5aff0&quot;&gt;SPARQL&lt;/a&gt; could not be directly translated.&lt;/p&gt; &lt;p&gt;If Chris Bizer et al launched the mapping ship, we will be the ones to pilot it to harbor!&lt;/p&gt; &lt;p&gt;We filled two &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id12dbdc70&quot;&gt;Virtuoso&lt;/a&gt; instances with a BSBM200000 data set, for 100M triples. One was filled with physical triples; the other was filled with the equivalent relational data plus mapping to triples. Performance figures are given in &amp;quot;query mixes per hour&amp;quot;. (An update or follow-on to this post will provide elapsed times for each test run.)&lt;/p&gt; &lt;p&gt;With the unmodified benchmark we got:&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt;1297 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt;&lt;b&gt;3144 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;In both cases, most of the time was spent on Q6, which looks for products with one of three words in the label. We altered Q6 to use text index for the mapping, and altered the databases accordingly. (There is no such thing as an e-commerce site without a text index, so we are amply justified in making this change.)&lt;/p&gt; &lt;p&gt;The following were measured on the second run of a 100 query mix series, single test driver, warm cache.&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; 5746 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; &lt;b&gt;7525 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;We then ran the same with 4 concurrent instances of the test driver. The qmph here is 400 / the longest run time.&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; 19459 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; &lt;b&gt;24531 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The system used was 64-bit Linux, 2GHz dual-Xeon 5130 (8 cores) with 8G RAM. The concurrent throughputs are a little under 4 times the single thread throughput, which is normal for SMP due to memory contention. The numbers do not evidence significant overhead from thread synchronization.&lt;/p&gt; &lt;p&gt;The query compilation represents about 1/3 of total server side CPU. In an actual online application of this type, queries would be parameterized, so the throughputs would be accordingly higher. We used the &lt;code&gt;StopCompilerWhenXOverRunTime = 1&lt;/code&gt; option here to cut needless compiler overhead, the queries being straightforward enough.&lt;/p&gt; &lt;p&gt;We also see that the advantage of mapping can be further increased by more compiler optimizations, so we expect in the end mapping will lead RDF warehousing by a factor of 4 or so.&lt;/p&gt; &lt;h3&gt;Suggestions for BSBM&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reporting Rules.&lt;/b&gt; The benchmark spec should specify a form for disclosure of test run data, TPC style. This includes things like configuration parameters and exact text of queries. There should be accepted variants of query text, as with the TPC.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Multiuser operation.&lt;/b&gt; The test driver should get a stream number as parameter, so that each client makes a different query sequence. Also, disk performance in this type of benchmark can only be reasonably assessed with a naturally parallel multiuser workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Add business intelligence.&lt;/b&gt; SPARQL has aggregates now, at least with &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id11a25ac0&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xb003180&quot;&gt;Virtuoso&lt;/a&gt;, so let&amp;#39;s use these. The BSBM business intelligence metric should be a separate metric off the same data. Adding synthetic sales figures would make more interesting queries possible. For example, producing recommendations like &amp;quot;customers who bought this also bought xxx.&amp;quot;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For the SPARQL community&lt;/b&gt;, BSBM sends the message that one ought to support parameterized queries and stored procedures. This would be a &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id109e2448&quot;&gt;SPARQL protocol&lt;/a&gt; extension; the SPARUL syntax should also have a way of calling a procedure. Something like &lt;code&gt;select proc (??, ??)&lt;/code&gt; would be enough, where &lt;code&gt;??&lt;/code&gt; is a parameter marker, like &lt;code&gt;?&lt;/code&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13febf48&quot;&gt;ODBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id120416a8&quot;&gt;JDBC&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Add transactions.&lt;/b&gt;Especially if we are contrasting mapping vs. storing triples, having an update flow is relevant. In practice, this could be done by having the test driver send web service requests for order entry and the SUT could implement these as updates to the triples or a mapped relational store. This could use stored procedures or logic in an app server.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Comments on Query Mix&lt;/h3&gt; &lt;p&gt;The time of most queries is less than linear to the scale factor. Q6 is an exception if it is not implemented using a text index. Without the text index, Q6 will inevitably come to dominate query time as the scale is increased, and thus will make the benchmark less relevant at larger scales.&lt;/p&gt; &lt;h2&gt;Next&lt;/h2&gt; &lt;p&gt;We include the sources of our RDF view definitions and other material for running BSBM with our forthcoming Virtuoso Open Source 5.0.8 release. This also includes all the query optimization work done for BSBM. This will be available in the coming days.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-08-06T16:29:44.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>BSBM With Triples and Mapped Relational Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-08-06#1409</atom:id>
  <atom:published>2008-08-06T19:35:27Z</atom:published>
  <atom:content type="html">&lt;p&gt;The special contribution of the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id10039db0&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id106b2538&quot;&gt;BSBM&lt;/a&gt;) to the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id101a75f8&quot;&gt;RDF&lt;/a&gt; world is to raise the question of doing OLTP with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xb230eb0&quot;&gt;RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Of course, here we immediately hit the question of comparisons with relational databases. To this effect, &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xa832da8&quot;&gt;BSBM&lt;/a&gt; also specifies a relational schema and can generate the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1206c378&quot;&gt;data&lt;/a&gt; as either triples or &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1667f040&quot;&gt;SQL&lt;/a&gt; inserts.&lt;/p&gt; &lt;p&gt;The benchmark effectively simulates the case of exposing an existing &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id10a93518&quot;&gt;RDBMS&lt;/a&gt; as RDF. &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id13e46d80&quot;&gt;OpenLink Software&lt;/a&gt; calls this &lt;i&gt;RDF Views&lt;/i&gt;. &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id12027578&quot;&gt;Oracle&lt;/a&gt; is beginning to call this &lt;i&gt;semantic covers&lt;/i&gt;. The &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-id161dc678&quot;&gt;RDB2RDF XG&lt;/a&gt;, a W3C incubator group, has been active in this area since Spring, 2008.&lt;/p&gt; &lt;h3&gt;But why an OLTP workload with RDF to begin with?&lt;/h3&gt; &lt;p&gt;We believe this is relevant because RDF promises to be the interoperability factor between potentially all of traditional IS. If &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xabe48a0&quot;&gt;data&lt;/a&gt; is online for human consumption, it may be online via a &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id106a8908&quot;&gt;SPARQL&lt;/a&gt; end-point as well. The economic justification will come from discoverability and from applications integrating multi-source structured data. Online shopping is a fine use case.&lt;/p&gt; &lt;p&gt;Warehousing all the world&amp;#39;s publishable data as RDF is not our first preference, nor would it be the publisher&amp;#39;s. Considerations of duplicate infrastructure and maintenance are reason enough. Consequently, we need to show that mapping can outperform an RDF warehouse, which is what we&amp;#39;ll do here.&lt;/p&gt; &lt;h3&gt;What We Got &lt;/h3&gt; &lt;p&gt;First, we found that &lt;a href=&quot;http://www.openlinksw.com/dataspace/oerling/weblog/Orri%20Erling%27s%20Blog/1400&quot; id=&quot;link-id150ea748&quot;&gt;making the query plan took much too long&lt;/a&gt; in proportion to the run time. With BSBM this is an issue because the queries have lots of joins but access relatively little data. So we made a faster compiler and along the way retouched the cost model a bit.&lt;/p&gt; &lt;p&gt;But the really interesting part with BSBM is mapping relational data to RDF. For us, BSBM is a great way of showing that mapping can outperform even the best triple store. A relational row store is as good as unbeatable with the query mix. And when there is a clear mapping, there is no reason the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x96bb5e0&quot;&gt;SPARQL&lt;/a&gt; could not be directly translated.&lt;/p&gt; &lt;p&gt;If Chris Bizer et al launched the mapping ship, we will be the ones to pilot it to harbor!&lt;/p&gt; &lt;p&gt;We filled two &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id12dbdc70&quot;&gt;Virtuoso&lt;/a&gt; instances with a BSBM200000 data set, for 100M triples. One was filled with physical triples; the other was filled with the equivalent relational data plus mapping to triples. Performance figures are given in &amp;quot;query mixes per hour&amp;quot;. (An update or follow-on to this post will provide elapsed times for each test run.)&lt;/p&gt; &lt;p&gt;With the unmodified benchmark we got:&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt;1297 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt;&lt;b&gt;3144 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;In both cases, most of the time was spent on Q6, which looks for products with one of three words in the label. We altered Q6 to use text index for the mapping, and altered the databases accordingly. (There is no such thing as an e-commerce site without a text index, so we are amply justified in making this change.)&lt;/p&gt; &lt;p&gt;The following were measured on the second run of a 100 query mix series, single test driver, warm cache.&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; 5746 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; &lt;b&gt;7525 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;We then ran the same with 4 concurrent instances of the test driver. The qmph here is 400 / the longest run time.&lt;/p&gt; &lt;blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Physical Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; 19459 qmph&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;i&gt;Mapped Triples:&lt;/i&gt; &lt;/td&gt; &lt;td&gt;   &lt;/td&gt; &lt;td&gt; &lt;b&gt;24531 qmph&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/blockquote&gt; &lt;p&gt;The system used was 64-bit Linux, 2GHz dual-Xeon 5130 (8 cores) with 8G RAM. The concurrent throughputs are a little under 4 times the single thread throughput, which is normal for SMP due to memory contention. The numbers do not evidence significant overhead from thread synchronization.&lt;/p&gt; &lt;p&gt;The query compilation represents about 1/3 of total server side CPU. In an actual online application of this type, queries would be parameterized, so the throughputs would be accordingly higher. We used the &lt;code&gt;StopCompilerWhenXOverRunTime = 1&lt;/code&gt; option here to cut needless compiler overhead, the queries being straightforward enough.&lt;/p&gt; &lt;p&gt;We also see that the advantage of mapping can be further increased by more compiler optimizations, so we expect in the end mapping will lead RDF warehousing by a factor of 4 or so.&lt;/p&gt; &lt;h3&gt;Suggestions for BSBM&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Reporting Rules.&lt;/b&gt; The benchmark spec should specify a form for disclosure of test run data, TPC style. This includes things like configuration parameters and exact text of queries. There should be accepted variants of query text, as with the TPC.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Multiuser operation.&lt;/b&gt; The test driver should get a stream number as parameter, so that each client makes a different query sequence. Also, disk performance in this type of benchmark can only be reasonably assessed with a naturally parallel multiuser workload.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Add business intelligence.&lt;/b&gt; SPARQL has aggregates now, at least with &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id11a25ac0&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa83f490&quot;&gt;Virtuoso&lt;/a&gt;, so let&amp;#39;s use these. The BSBM business intelligence metric should be a separate metric off the same data. Adding synthetic sales figures would make more interesting queries possible. For example, producing recommendations like &amp;quot;customers who bought this also bought xxx.&amp;quot;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;For the SPARQL community&lt;/b&gt;, BSBM sends the message that one ought to support parameterized queries and stored procedures. This would be a &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id109e2448&quot;&gt;SPARQL protocol&lt;/a&gt; extension; the SPARUL syntax should also have a way of calling a procedure. Something like &lt;code&gt;select proc (??, ??)&lt;/code&gt; would be enough, where &lt;code&gt;??&lt;/code&gt; is a parameter marker, like &lt;code&gt;?&lt;/code&gt; in &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13febf48&quot;&gt;ODBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id120416a8&quot;&gt;JDBC&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Add transactions.&lt;/b&gt;Especially if we are contrasting mapping vs. storing triples, having an update flow is relevant. In practice, this could be done by having the test driver send web service requests for order entry and the SUT could implement these as updates to the triples or a mapped relational store. This could use stored procedures or logic in an app server.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Comments on Query Mix&lt;/h3&gt; &lt;p&gt;The time of most queries is less than linear to the scale factor. Q6 is an exception if it is not implemented using a text index. Without the text index, Q6 will inevitably come to dominate query time as the scale is increased, and thus will make the benchmark less relevant at larger scales.&lt;/p&gt; &lt;h2&gt;Next&lt;/h2&gt; &lt;p&gt;We include the sources of our RDF view definitions and other material for running BSBM with our forthcoming Virtuoso Open Source 5.0.8 release. This also includes all the query optimization work done for BSBM. This will be available in the coming days.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:15:22.760513-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>.NET, LINQ, and RDF based Linked Data (Update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-03#1408</atom:id>
  <atom:published>2008-08-03T16:07:09Z</atom:published>
  <atom:content type="html">&lt;p&gt;At OpenLink, we&amp;#39;ve been investigating &lt;a href=&quot;http://code.google.com/p/linqtordf/&quot; id=&quot;link-id1296eb18&quot;&gt;LinqToRdf&lt;/a&gt;, an exciting project from &lt;a href=&quot;http://aabs.wordpress.com/&quot; id=&quot;link-id13e860a8&quot;&gt;Andrew Matthews&lt;/a&gt; that seeks to expose the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id105d84f8&quot;&gt;Semantic Web&lt;/a&gt; technology space to the large community of .NET developers. &lt;/p&gt; &lt;p&gt;The LinqToRdf project is about binding LINQ to RDF. It sits atop &lt;a href=&quot;http://razor.occams.info/&quot; id=&quot;link-id102e3b10&quot;&gt;Joshua Tauberer&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id1471b0d0&quot;&gt;C&lt;/a&gt;# based &lt;a href=&quot;http://razor.occams.info/code/semweb/&quot; id=&quot;link-id14cb9030&quot;&gt;Semantic Web/RDF library&lt;/a&gt; which has been out there for a while and works across Microsoft .NET and it&amp;#39;s open source variant &amp;quot;Mono&amp;quot;.&lt;/p&gt; &lt;p&gt;Historically, the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id13ee9f40&quot;&gt;Semantic Web&lt;/a&gt; realm has been dominated by RDF frameworks such as &lt;a href=&quot;http://www.openrdf.org/&quot; id=&quot;link-id109f8a68&quot;&gt;Sesame&lt;/a&gt;, &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id144c3210&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://librdf.org/&quot; id=&quot;link-id10600228&quot;&gt;Redland&lt;/a&gt;; which by their Open Source orientation, predominantly favor non-Windows platforms (Java and Linux). Conversely, Microsoft&amp;#39;s .NET frameworks have sought to offer Conceptualization technology for heterogeneous Logical &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Sources via .NET&amp;#39;s &lt;a href=&quot;http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework&quot; id=&quot;link-id10726628&quot;&gt;Entity Frameworks&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id13e7edd8&quot;&gt;ADO.NET&lt;/a&gt;, but without any actual bindings to RDF. &lt;/p&gt; &lt;p&gt;Interestingly, believe it or not, .NET already has a data query language that shares a number of similarities with &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id1042f480&quot;&gt;SPARQL&lt;/a&gt;, called &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id105a46b0&quot;&gt;Entity&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id1041d2e8&quot;&gt;SQL&lt;/a&gt;, and a very innovative programming language called LINQ; that offers a blend of constructs for natural data access and manipulation across relational (&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id139f5848&quot;&gt;SQL&lt;/a&gt;), hierarchical (XML), and graph (Object) models without the traditional object language-&amp;gt;database impedance tensions of the past.&lt;/p&gt; &lt;p&gt;With regards to all of the above, we&amp;#39;ve just released a mini white paper that covers the exploitation of &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/linqtordf/linqtordf1.htm&quot; id=&quot;link-id14b2f138&quot;&gt;RDF-based Linked Data using .NET via LINQ&lt;/a&gt;. The paper offers a an overview of LinqToRdf, plus enhancements we&amp;#39;ve contributed to the project (available in &lt;a href=&quot;http://aabs.wordpress.com/2008/08/01/announcing-linqtordf-v08/&quot; id=&quot;link-id101defa8&quot;&gt;LinqToRdf v0.8&lt;/a&gt;.). The paper includes real-world examples that tap into a MusicBrainz powered &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id101ffd18&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id105cb858&quot;&gt;Space&lt;/a&gt;, the Music Ontology, the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13f55860&quot;&gt;Virtuoso&lt;/a&gt; RDF Quad Store, &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id12826718&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id1030cb60&quot;&gt;Sponger&lt;/a&gt; Middleware, and our RDfization Cartridges for Musicbrainz. &lt;/p&gt; Enjoy!</atom:content>
  <atom:updated>2008-08-08T08:54:01.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso&#39;s Universal Server Architecture (Conceptual &amp; Technical)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-03#1406</atom:id>
  <atom:published>2008-08-03T13:07:12Z</atom:published>
  <atom:content type="html">As they say, a picture speaks a thousand words, so I am exposing two views of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13fe7df8&quot;&gt;Virtuoso&lt;/a&gt; that have been on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; for while. &lt;br /&gt; &lt;br /&gt;Remember, &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13f53ed0&quot;&gt;Virtuoso&lt;/a&gt; offers &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; management, data access, web &lt;a href=&quot;http://dbpedia.org/resource/Application_server&quot; id=&quot;link-id109f04b0&quot;&gt;application server&lt;/a&gt;, enterprise service bus, and virtualization of disparate and heterogeneous data sources, as part of a single, multi threaded, cross-platform server solution; hence it&amp;#39;s description as a &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Virtuoso_Universal_Server&quot; id=&quot;link-id104d2e48&quot;&gt;Universal Server&lt;/a&gt;&amp;quot;.&lt;br /&gt; &lt;br /&gt;Conceptual View:&lt;br /&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; style=&quot;max-width: 800px;&quot; src=&quot;http://virtuoso.openlinksw.com/images/vconc650.jpg&quot; /&gt; &lt;br /&gt; &lt;br /&gt;Technical View (kinda missing &lt;a href=&quot;http://dbpedia.org/resource/PHP&quot; id=&quot;link-id10660110&quot;&gt;PHP&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Perl&quot; id=&quot;link-id1053d9b8&quot;&gt;Perl&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Python_programming_language&quot; id=&quot;link-id107bc9c0&quot;&gt;Python&lt;/a&gt; runtime hosting in the Virtual Application Sever realm):&lt;br /&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; style=&quot;max-width: 800px;&quot; src=&quot;http://virtuoso.openlinksw.com/images/virtuoso3arch.gif&quot; /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x13cf3798&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s architecture is not a reaction to current trends. The diagrams above are pretty old (with minor touch ups in recent times). At &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id13e194c0&quot;&gt;OpenLink Software&lt;/a&gt;, we&amp;#39;ve have a consistent world-view re. standards and the vital role they play when it comes to developing software that enables the construction and exploitation of &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id133c84a8&quot;&gt;Context&lt;/a&gt; Lenses&amp;quot; that tap into a substrate of Virtualized Logical Data Sources (&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id104d1c30&quot;&gt;SQL&lt;/a&gt;, XML, RDF, Web Services, Full Text etc.).&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;</atom:content>
  <atom:updated>2008-08-05T18:07:45-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Time for Context Lenses (Update)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-02#1405</atom:id>
  <atom:published>2008-08-02T19:06:57Z</atom:published>
  <atom:content type="html">As the &lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id13dfe618&quot;&gt;Linked Data meme&lt;/a&gt; continues on it&amp;#39;s quest to unravel the mysteries of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10527b30&quot;&gt;Semantic Web&lt;/a&gt; vision, it&amp;#39;s quite gratifying to see that &lt;a href=&quot;http://dbpedia.org/resource/Federated_database_system&quot; id=&quot;link-id104f58b0&quot;&gt;data virtualization&lt;/a&gt; comprehension: creating &amp;quot;Conceptual Views&amp;quot; into logically organized &amp;quot;Disparate &amp;amp; Heterogeneous &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Sources&amp;quot; via &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id14a46998&quot;&gt;Context&lt;/a&gt; Lenses&amp;quot; is taking shape, as illustrated in the &amp;quot;&lt;a href=&quot;http://feeds.feedburner.com/%7Er/SemanticBusiness/%7E3/353668031/note-to-self-virtualconceptual-as-wwwsw.html&quot; id=&quot;link-id13179dd8&quot;&gt;note-to-self&lt;/a&gt;&amp;quot; post by &lt;a href=&quot;http://www.linkedin.com/in/davidprovost&quot; id=&quot;link-id1403dc88&quot;&gt;David Provost&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Virtualization of heterogeneous data sources is only achievable if you have a dexterous data model based &amp;quot;Bus&amp;quot; into which the data sources are plugged. RDF has offered such a model for a long time.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img alt=&quot;Image&quot; style=&quot;max-width: 800px;&quot; src=&quot;http://www.w3.org/DesignIssues/diagrams/sw-clients.png&quot; /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;When heterogeneous data sources are plugged into an RDF based integration bus e.g., customer records sourced from a variety of tables, across a plethora of databases, you can only end up with true value if the emergent entities from such an effort are coherently linked and (de)referencable; which is what &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id12b06e20&quot;&gt;Linked Data&lt;/a&gt;&amp;#39;s fundamental preoccupation with dereferencable URIs is all about. Of course, Even when you have all of the above in place, you also need to be able to construct &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id103c2c80&quot;&gt;Context&lt;/a&gt; Lenses&amp;quot; i.e., &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id1037a260&quot;&gt;context&lt;/a&gt; driven views of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13e48ab8&quot;&gt;Linked Data&lt;/a&gt; Mesh (or &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id101c7718&quot;&gt;Linked Data&lt;/a&gt; Spaces).&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Additional Diagrams:&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;1. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2824%29&quot; id=&quot;link-id10808cb8&quot;&gt;Clients of the RDF Bus&lt;/a&gt; &lt;br /&gt;2. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2825%29&quot; id=&quot;link-id11e5a300&quot;&gt;RDF Bus Server plugins: Scripts that emit RDF&lt;/a&gt; &lt;br /&gt;3. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2826%29&quot; id=&quot;link-id13ea46a0&quot;&gt;RDF Bus Servers: RDF Data Managers (Triple or Quad Stores)&lt;/a&gt; &lt;br /&gt;4. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2827%29&quot; id=&quot;link-id101d3470&quot;&gt;RDF Bus Servers: Relational to RDF Mappers (RDF Views, Semantic Covers etc.)&lt;/a&gt; &lt;br /&gt;5. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2828%29&quot; id=&quot;link-id1052c450&quot;&gt;RDF Bus Server plugins: XML to RDF Mappers &lt;/a&gt; &lt;br /&gt;6. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2829%29&quot; id=&quot;link-id10281ec0&quot;&gt;RDF Bus Server plugins: GRDDL based XSLT stylesheets that emit RDF&lt;/a&gt; &lt;br /&gt;7. &lt;a href=&quot;http://www.w3.org/2005/Talks/1110-iswc-tbl/#%2830%29&quot; id=&quot;link-id1444faf0&quot;&gt;RDF Bus Server plugins: Intelligent RDF Middleware&lt;/a&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;</atom:content>
  <atom:updated>2008-08-04T11:24:50.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Exploiting the RDF-based Linked Data Web using .NET via LINQ</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-08-01#1403</atom:id>
  <atom:published>2008-08-01T17:58:19Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Exploiting the RDF-based Linked Data Web using .NET via LINQ&lt;/div&gt; Recently OpenLink has been investigating &lt;a href=&quot;http://code.google.com/p/linqtordf/&quot; id=&quot;link-id0x20d8a248&quot;&gt;LinqToRdf&lt;/a&gt;, an exciting project from &lt;a href=&quot;http://aabs.wordpress.com&quot; id=&quot;link-id0x21f48218&quot;&gt;Andrew Matthews&lt;/a&gt; which aims to bring the Semantic Web to .NET. Because of their language bindings and heritage, existing RDF APIs such as Sesame, Jena and Redland predominantly favour non-Windows clients. Conversely Microsoft&amp;#39;s ADO.NET Data Services provides a Redmond vision of exposing data on the Web but has no support for RDF. LinqToRdf is, as far as we&amp;#39;re aware, the first serious effort to fill this gap and provide a bridge between Windows applications and the Semantic Web.&lt;br /&gt; &lt;br /&gt;OpenLink has produced a whitepaper &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/linqtordf/linqtordf1.htm&quot; id=&quot;link-id0x21f47348&quot;&gt;Exploiting the RDF-based Linked Data Web using .NET via LINQ&lt;/a&gt; which provides a brief overview of LinqToRdf and an example of its use to retrieve data from the &lt;a href=&quot;http://musicbrainz.org&quot; id=&quot;link-id0x21f49a88&quot;&gt;MusicBrainz&lt;/a&gt; music metadatabase via an OpenLink Virtuoso Quad Store. The document also illustrates the use of the &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/pdf/sponger_whitepaper_10102007.pdf&quot; id=&quot;link-id0x21f92758&quot;&gt;Virtuoso Sponger&lt;/a&gt;, an &amp;quot;RDFizer&amp;quot; forming part of the RDF toolset provided with OpenLink Virtuoso Universal Server, to convert the raw MusicBrainz data to RDF on-the-fly. A further aim of the whitepaper is to draw attention to Andrew&amp;#39;s excellent effort and hopefully tempt members of the Semantic Web community to contribute.&lt;br /&gt; &lt;br /&gt;Andrew was kind enough to incorporate some changes into LinqToRdf in response to OpenLink&amp;#39;s testing. These have been included with major improvements of his own in a new release - &lt;a href=&quot;http://aabs.wordpress.com/2008/08/01/announcing-linqtordf-v08/&quot; id=&quot;link-id0x21f465b8&quot;&gt;LinqToRdf v0.8&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Carl Blakeley&lt;br /&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-08-01T13:58:19.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data, Meshups, Twitter, and Friendfeed</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-08-01#1402</atom:id>
  <atom:published>2008-08-01T02:11:31Z</atom:published>
  <atom:content type="html">&lt;p&gt;Here are some links from my Friendfeed and Twitter &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Spaces that expose a number of recent &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xa91a798&quot;&gt;Linked Data&lt;/a&gt; &amp;quot;Meshup&amp;quot; examples:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://friendfeed.com/kidehen&quot; id=&quot;link-id101740a8&quot;&gt;Friendfeed&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://twitter.com/kidehen&quot; id=&quot;link-id104baa80&quot;&gt;Twitter&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</atom:content>
  <atom:updated>2008-07-31T22:17:35-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Optimizations for the Berlin SPARQL Benchmark</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-07-30#1401</atom:id>
  <atom:published>2008-07-30T18:52:11Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Virtuoso Optimizations for the Berlin SPARQL Benchmark &lt;/div&gt; &lt;p&gt;We had a look at Chris Bizer&amp;#39;s initial results with the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id105c9f78&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id102d62b0&quot;&gt;BSBM&lt;/a&gt;) on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13eb9780&quot;&gt;Virtuoso&lt;/a&gt;. The first results were rather bad, as nearly all of the run time was spent optimizing the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id14a51258&quot;&gt;SPARQL&lt;/a&gt; statements and under 10% actually running them.&lt;/p&gt; &lt;p&gt;So I spent a couple of days on the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xaad28d0&quot;&gt;SPARQL&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id108745b0&quot;&gt;SQL&lt;/a&gt; compiler, to the effect of making it do a better guess of initial execution plan and streamlining some operations. In fact, many of the queries in &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xaa230b8&quot;&gt;BSBM&lt;/a&gt; are not particularly sensitive to execution plan, as they access a very small portion of the database. So to close the matter, I put in a flag that makes the &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e9e8e28&quot;&gt;SQL&lt;/a&gt; compiler give up on devising new plans if the time of the best plan so far is less than the time spent compiling so far.&lt;/p&gt; &lt;p&gt;With these changes, available now as a diff on top of 5.0.7, we run quite well, several times better than initially. With the compiler time cut-off in place (ini parameter &lt;code&gt;StopCompilerWhenXOverRunTime = 1&lt;/code&gt;), we get the following times, output from the BSBM test driver:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; Starting test... 0: 1031.22 ms, total: 1151 ms 1: 982.89 ms, total: 1040 ms 2: 923.27 ms, total: 968 ms 3: 898.37 ms, total: 932 ms 4: 855.70 ms, total: 865 ms Scale factor: 10000 Number of query mix runs: 5 times min/max Query mix runtime: 0.8557 s / 1.0312 s Total runtime: 4.691 seconds QMpH: 3836.77 query mixes per hour CQET: 0.93829 seconds average runtime of query mix CQET (geom.): 0.93625 seconds geometric mean runtime of query mix Metrics for Query 1: Count: 5 times executed in whole run AQET: 0.012212 seconds (arithmetic mean) AQET(geom.): 0.009934 seconds (geometric mean) QPS: 81.89 Queries per second minQET/maxQET: 0.00684000s / 0.03115700s Average result count: 7.0 min/max result count: 3 / 10 Metrics for Query 2: Count: 35 times executed in whole run AQET: 0.030490 seconds (arithmetic mean) AQET(geom.): 0.029776 seconds (geometric mean) QPS: 32.80 Queries per second minQET/maxQET: 0.02467300s / 0.06753000s Average result count: 22.5 min/max result count: 15 / 30 Metrics for Query 3: Count: 5 times executed in whole run AQET: 0.006947 seconds (arithmetic mean) AQET(geom.): 0.006905 seconds (geometric mean) QPS: 143.95 Queries per second minQET/maxQET: 0.00580000s / 0.00795100s Average result count: 4.0 min/max result count: 0 / 10 Metrics for Query 4: Count: 5 times executed in whole run AQET: 0.008858 seconds (arithmetic mean) AQET(geom.): 0.008829 seconds (geometric mean) QPS: 112.89 Queries per second minQET/maxQET: 0.00804400s / 0.01019500s Average result count: 3.4 min/max result count: 0 / 10 Metrics for Query 5: Count: 5 times executed in whole run AQET: 0.087542 seconds (arithmetic mean) AQET(geom.): 0.087327 seconds (geometric mean) QPS: 11.42 Queries per second minQET/maxQET: 0.08165600s / 0.09889200s Average result count: 5.0 min/max result count: 5 / 5 Metrics for Query 6: Count: 5 times executed in whole run AQET: 0.131222 seconds (arithmetic mean) AQET(geom.): 0.131216 seconds (geometric mean) QPS: 7.62 Queries per second minQET/maxQET: 0.12924200s / 0.13298200s Average result count: 3.6 min/max result count: 3 / 5 Metrics for Query 7: Count: 20 times executed in whole run AQET: 0.043601 seconds (arithmetic mean) AQET(geom.): 0.040890 seconds (geometric mean) QPS: 22.94 Queries per second minQET/maxQET: 0.01984400s / 0.06012600s Average result count: 26.4 min/max result count: 5 / 96 Metrics for Query 8: Count: 10 times executed in whole run AQET: 0.018168 seconds (arithmetic mean) AQET(geom.): 0.016205 seconds (geometric mean) QPS: 55.04 Queries per second minQET/maxQET: 0.01097600s / 0.05066900s Average result count: 12.8 min/max result count: 6 / 20 Metrics for Query 9: Count: 20 times executed in whole run AQET: 0.043813 seconds (arithmetic mean) AQET(geom.): 0.043807 seconds (geometric mean) QPS: 22.82 Queries per second minQET/maxQET: 0.04274900s / 0.04504100s Average result count: 0.0 min/max result count: 0 / 0 Metrics for Query 10: Count: 15 times executed in whole run AQET: 0.030697 seconds (arithmetic mean) AQET(geom.): 0.029651 seconds (geometric mean) QPS: 32.58 Queries per second minQET/maxQET: 0.02072000s / 0.03975700s Average result count: 1.1 min/max result count: 0 / 4 real 0 m 5.485 s user 0 m 2.233 s sys 0 m 0.170 s &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Of the approximately 5.5 seconds of running five query mixes, the test driver spends 2.2 s. The server side processing time is 3.1 s, of which SQL compilation is 1.35 s. The rest is miscellaneous system time. The measurement is on 64-bit Linux, 2GHz dual-Xeon 5130 (8 cores) with 8G RAM. &lt;/p&gt; &lt;p&gt;We note that this type of workload would be done with stored procedures or prepared, parameterized queries in the SQL world.&lt;/p&gt; &lt;p&gt;There will be some further tuning still but this addresses the bulk of the matter. There will be a separate message about the patch containing these improvements.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-08-06T16:29:42-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Optimizations for the Berlin SPARQL Benchmark</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-07-30#1400</atom:id>
  <atom:published>2008-07-30T18:17:54Z</atom:published>
  <atom:content type="html">&lt;p&gt;We had a look at Chris Bizer&amp;#39;s initial results with the &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id105c9f78&quot;&gt;Berlin SPARQL Benchmark&lt;/a&gt; (&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id102d62b0&quot;&gt;BSBM&lt;/a&gt;) on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13eb9780&quot;&gt;Virtuoso&lt;/a&gt;. The first results were rather bad, as nearly all of the run time was spent optimizing the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id14a51258&quot;&gt;SPARQL&lt;/a&gt; statements and under 10% actually running them.&lt;/p&gt; &lt;p&gt;So I spent a couple of days on the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xa5a8d0e8&quot;&gt;SPARQL&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id108745b0&quot;&gt;SQL&lt;/a&gt; compiler, to the effect of making it do a better guess of initial execution plan and streamlining some operations. In fact, many of the queries in &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/BerlinSPARQLBenchmark/spec/index.html&quot; id=&quot;link-id0xaf04af8&quot;&gt;BSBM&lt;/a&gt; are not particularly sensitive to execution plan, as they access a very small portion of the database. So to close the matter, I put in a flag that makes the &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1e8d2360&quot;&gt;SQL&lt;/a&gt; compiler give up on devising new plans if the time of the best plan so far is less than the time spent compiling so far.&lt;/p&gt; &lt;p&gt;With these changes, available now as a diff on top of 5.0.7, we run quite well, several times better than initially. With the compiler time cut-off in place (ini parameter &lt;code&gt;StopCompilerWhenXOverRunTime = 1&lt;/code&gt;), we get the following times, output from the BSBM test driver:&lt;/p&gt; &lt;blockquote&gt; &lt;pre&gt; Starting test... 0: 1031.22 ms, total: 1151 ms 1: 982.89 ms, total: 1040 ms 2: 923.27 ms, total: 968 ms 3: 898.37 ms, total: 932 ms 4: 855.70 ms, total: 865 ms Scale factor: 10000 Number of query mix runs: 5 times min/max Query mix runtime: 0.8557 s / 1.0312 s Total runtime: 4.691 seconds QMpH: 3836.77 query mixes per hour CQET: 0.93829 seconds average runtime of query mix CQET (geom.): 0.93625 seconds geometric mean runtime of query mix Metrics for Query 1: Count: 5 times executed in whole run AQET: 0.012212 seconds (arithmetic mean) AQET(geom.): 0.009934 seconds (geometric mean) QPS: 81.89 Queries per second minQET/maxQET: 0.00684000s / 0.03115700s Average result count: 7.0 min/max result count: 3 / 10 Metrics for Query 2: Count: 35 times executed in whole run AQET: 0.030490 seconds (arithmetic mean) AQET(geom.): 0.029776 seconds (geometric mean) QPS: 32.80 Queries per second minQET/maxQET: 0.02467300s / 0.06753000s Average result count: 22.5 min/max result count: 15 / 30 Metrics for Query 3: Count: 5 times executed in whole run AQET: 0.006947 seconds (arithmetic mean) AQET(geom.): 0.006905 seconds (geometric mean) QPS: 143.95 Queries per second minQET/maxQET: 0.00580000s / 0.00795100s Average result count: 4.0 min/max result count: 0 / 10 Metrics for Query 4: Count: 5 times executed in whole run AQET: 0.008858 seconds (arithmetic mean) AQET(geom.): 0.008829 seconds (geometric mean) QPS: 112.89 Queries per second minQET/maxQET: 0.00804400s / 0.01019500s Average result count: 3.4 min/max result count: 0 / 10 Metrics for Query 5: Count: 5 times executed in whole run AQET: 0.087542 seconds (arithmetic mean) AQET(geom.): 0.087327 seconds (geometric mean) QPS: 11.42 Queries per second minQET/maxQET: 0.08165600s / 0.09889200s Average result count: 5.0 min/max result count: 5 / 5 Metrics for Query 6: Count: 5 times executed in whole run AQET: 0.131222 seconds (arithmetic mean) AQET(geom.): 0.131216 seconds (geometric mean) QPS: 7.62 Queries per second minQET/maxQET: 0.12924200s / 0.13298200s Average result count: 3.6 min/max result count: 3 / 5 Metrics for Query 7: Count: 20 times executed in whole run AQET: 0.043601 seconds (arithmetic mean) AQET(geom.): 0.040890 seconds (geometric mean) QPS: 22.94 Queries per second minQET/maxQET: 0.01984400s / 0.06012600s Average result count: 26.4 min/max result count: 5 / 96 Metrics for Query 8: Count: 10 times executed in whole run AQET: 0.018168 seconds (arithmetic mean) AQET(geom.): 0.016205 seconds (geometric mean) QPS: 55.04 Queries per second minQET/maxQET: 0.01097600s / 0.05066900s Average result count: 12.8 min/max result count: 6 / 20 Metrics for Query 9: Count: 20 times executed in whole run AQET: 0.043813 seconds (arithmetic mean) AQET(geom.): 0.043807 seconds (geometric mean) QPS: 22.82 Queries per second minQET/maxQET: 0.04274900s / 0.04504100s Average result count: 0.0 min/max result count: 0 / 0 Metrics for Query 10: Count: 15 times executed in whole run AQET: 0.030697 seconds (arithmetic mean) AQET(geom.): 0.029651 seconds (geometric mean) QPS: 32.58 Queries per second minQET/maxQET: 0.02072000s / 0.03975700s Average result count: 1.1 min/max result count: 0 / 4 real 0 m 5.485 s user 0 m 2.233 s sys 0 m 0.170 s &lt;/pre&gt;&lt;/blockquote&gt; &lt;p&gt;Of the approximately 5.5 seconds of running five query mixes, the test driver spends 2.2 s. The server side processing time is 3.1 s, of which SQL compilation is 1.35 s. The rest is miscellaneous system time. The measurement is on 64-bit Linux, 2GHz dual-Xeon 5130 (8 cores) with 8G RAM. &lt;/p&gt; &lt;p&gt;We note that this type of workload would be done with stored procedures or prepared, parameterized queries in the SQL world.&lt;/p&gt; &lt;p&gt;There will be some further tuning still but this addresses the bulk of the matter. There will be a separate message about the patch containing these improvements.&lt;/p&gt;</atom:content>
  <atom:updated>2008-08-06T16:29:37.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>WUPnP Cheatsheet</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-07-28#1397</atom:id>
  <atom:published>2008-07-29T03:37:55Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://vanirsystems.com/danielsblog/2008/07/28/wupnp-cheatsheet/#comments&quot; id=&quot;link-id133b9048&quot;&gt;WUPnP Cheatsheet&lt;/a&gt;: &amp;quot;&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1ccdfc68&quot;&gt;Web&lt;/a&gt; Universal Plug and Play (&lt;acronym title=&quot;Web Universal Plug and Play&quot;&gt;WUPnP&lt;/acronym&gt;) Cheatsheet:&lt;/p&gt; &lt;p&gt; &lt;img src=&quot;http://vanirsystems.com/images/wupnparch.png&quot; alt=&quot;Web Universal Plug and Play (WUPnP) Cheatsheet&quot; width=&quot;50%&quot; /&gt; &lt;/p&gt; &lt;p&gt;Essentially, if you build an application and use the technologies suggested in the ‘glue section’ then your &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x1d626818&quot;&gt;web&lt;/a&gt; application/service (whether it’s front-end or back-end) will fit into many many other &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;web&lt;/a&gt; applications/services… and therefore also more manageable for the future! This is WUPnP.&lt;/p&gt; &lt;p&gt;Key technologies for making your services/applications as sticky as possible:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Dereferenceable_Uniform_Resource_Identifier&quot; id=&quot;link-id1016cbd8&quot;&gt;Dereferenceable URI’s&lt;/a&gt; (which indicate &lt;a href=&quot;http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol&quot; id=&quot;link-id101d7790&quot;&gt;HTTP&lt;/a&gt; networking)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenID&quot; id=&quot;link-id12ea5e68&quot;&gt;OpenID&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/OAuth&quot; id=&quot;link-id12e1acf0&quot;&gt;OAuth&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/SPARQL&quot; id=&quot;link-id133d34e0&quot;&gt;SPARQL&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Linked_Data&quot; id=&quot;link-id106a7040&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Resource_Description_Framework&quot; id=&quot;link-id1072d890&quot;&gt;RDF&lt;/a&gt; (or &lt;a href=&quot;http://en.wikipedia.org/wiki/RDFa&quot; id=&quot;link-id14040c38&quot;&gt;RDFa&lt;/a&gt;) and &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_Ontology_Language&quot; id=&quot;link-id1044dda8&quot;&gt;OWL&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Web-based plug and play fun!&lt;/p&gt;&amp;quot; &lt;p&gt;(Via &lt;a href=&quot;http://vanirsystems.com/danielsblog&quot; id=&quot;link-id10a15838&quot;&gt;Daniel Lewis&lt;/a&gt;.)&lt;/p&gt;</atom:content>
  <atom:updated>2008-07-29T13:06:40-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>CrunchBase gets hooked up with the Linked Data Web!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-07-25#1395</atom:id>
  <atom:published>2008-07-25T14:01:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;It&amp;#39;s getting really hot in &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id15eea8f8&quot;&gt;Linked Data&lt;/a&gt; land! Two days ago &lt;a href=&quot;http://bnode.org/about&quot; id=&quot;link-id107e2f70&quot;&gt;Benjamin Nowack&lt;/a&gt; pinged the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id11b93670&quot;&gt;LOD&lt;/a&gt; community about his &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/2008Jul/0110.html&quot; id=&quot;link-id1022a270&quot;&gt;RDFization of Crunchbase&lt;/a&gt; (sample (X)HTML view: http://cb.semsol.org/company/opera-software) courtesy of Crounchbase releasing an API. As you know, I&amp;#39;ve always equated &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Service API to Database CLIs (&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id16327528&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id1027f410&quot;&gt;JDBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id10683850&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id13beb9b8&quot;&gt;NET&lt;/a&gt; etc.) as both offer code level hooks into &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Spaces.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Naturally, we&amp;#39;ve decided to join the Crunchbase RDFization party, and have just completed a &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10282208&quot;&gt;Virtuoso&lt;/a&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id10acf0f8&quot;&gt;Sponger&lt;/a&gt; Cartridge (an RDFizer) for Crouncbase. What we add in our particular cartridge is additional meshing with &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id115e2a98&quot;&gt;DBpedia&lt;/a&gt; and Wikicompany &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id132f0568&quot;&gt;Linked Data&lt;/a&gt; Spaces, plus RDFizaton of the Crunchbase (X)HTML pages :-)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;As I&amp;#39;ve postulated for a while, &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13304010&quot;&gt;Linked Data&lt;/a&gt; is about data &amp;quot;Meshing&amp;quot; and &amp;quot;Meshups&amp;quot;. This isn&amp;#39;t a buzzword play. I am pointing out an important distinction between &amp;quot;Mashups&amp;quot; and &amp;quot;Meshpus&amp;quot;. Which goes as follows: &amp;quot;Mashups&amp;quot; are about code level joining devoid of structured modelling, hence the revelation of code as opposed to data when you look behind a &amp;quot;Mashup&amp;quot;. &amp;quot;Meshups&amp;quot; on the other hand, are about joining disparate structured data sources across the Web. And when you look behind a &amp;quot;Meshup&amp;quot; you see structured data (preferably &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id143bdb68&quot;&gt;Linked Data&lt;/a&gt;) that enables further &amp;quot;Meshing&amp;quot;.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;I truly believe that we are now inches away from critical mass re. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14829640&quot;&gt;Linked Data&lt;/a&gt;, and because we are dealing with data, the network-effect will be sky-high! I shudder to think about the state of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1c41d150&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id133364e8&quot;&gt;Web&lt;/a&gt; in 12 months time. Yes, I am giving the explosion 12 months (or less). These are very exciting times.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Demo Links:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/ode/?uri%5B%5D=http%3A%2F%2Fcb.semsol.org%2Fcompany%2Fopera-software&amp;amp;&quot; id=&quot;link-id12fe1dc8&quot;&gt;Opera Software via Benjee&amp;#39;s Linked Data Space for Cunchbase&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://demo.openlinksw.com/ode/?uri=http%3A%2F%2Fwww.crunchbase.com%2Fcompany%2Fopera-software&quot; id=&quot;link-id10739a18&quot;&gt;Opera Software via our Linked Data Space for Crunchbas&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;For best experience I encourage you to look at the &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/8062&quot; id=&quot;link-id1499a0f8&quot;&gt;OpenLink Data Explorer extension&lt;/a&gt; for Firefox (2.x - 3.x). This enables you to go to Crunchbase (X)HTML pages (and other sites on the Web of course), and then simply use the &amp;quot;View | &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; Sources&amp;quot; main or &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10051b50&quot;&gt;context&lt;/a&gt; menu sequence to unveil the Linked Data Sources associated with any Web Page.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Of course there is much more to come!&lt;/p&gt;</atom:content>
  <atom:updated>2008-07-29T21:43:27-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Twine Opens Up Linked Data Style!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-07-25#1394</atom:id>
  <atom:published>2008-07-25T02:18:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;Note to Nova: big time welcome to the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10a424f0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id13351960&quot;&gt;Web&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;I&amp;#39;ve just digested &lt;a href=&quot;http://www.twine.com/item/1w3ckhq8-997&quot; id=&quot;link-id103a38b0&quot;&gt;Nova&lt;/a&gt;&amp;#39;s post &lt;a href=&quot;http://novaspivack.typepad.com/nova_spivacks_weblog/2008/07/subscribe-to-my.html&quot; id=&quot;link-id105be838&quot;&gt;announcing the opening up of Twine&lt;/a&gt;. My test was simple, I opened up his Twine page using Firefox (with the new &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/8062&quot; id=&quot;link-id103d2148&quot;&gt;OpenLink Data Explorer extension&lt;/a&gt; in place), and then simply executed the following browser menu sequence:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;View&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id102b7880&quot;&gt;Linked Data&lt;/a&gt; Sources&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;And voila! The Twine page morphs into a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id137b5cd0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10467260&quot;&gt;Space&lt;/a&gt; where each &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id16296328&quot;&gt;entity&lt;/a&gt; presented is endowed with &lt;a href=&quot;http://intranet.usnet.private:8893/RPC2&quot; id=&quot;link-id1053b2f0&quot;&gt;dereferencable URIs&lt;/a&gt;; enabling me to traverse and/or &lt;a href=&quot;http://demo.openlinksw.com/ode/?uri%5B%5D=http%3A%2F%2Fwww.twine.com%2Ftwine%2F1p2dqhdx-1jg%2Fnova-spivack-my-public-twine&amp;amp;uri%5B%5D=http%3A%2F%2Fwww.twine.com%2Fitem%2F1w3ckhq8-997&amp;amp;uri%5B%5D=http%3A%2F%2Fmyopenlink.net%2Fdataspace%2Fperson%2Fkidehen&amp;amp;&quot; id=&quot;link-id106eb2a0&quot;&gt;Mesh&lt;/a&gt; his data with other &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; Spaces such as &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen&quot; id=&quot;link-id12e51748&quot;&gt;mine&lt;/a&gt;, for instance.&lt;/p&gt; &lt;p&gt;This is what Linked Data is all about! The fun has only just begun :-)&lt;/p&gt;  </atom:content>
  <atom:updated>2008-07-29T21:52:27.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 5.0.7 Release, Now With Jena and Sesame APIs</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-07-17#1393</atom:id>
  <atom:published>2008-07-17T17:18:09Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Virtuoso 5.0.7 Release, Now With Jena and Sesame APIs&lt;/div&gt; &lt;h2&gt;Improvements&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfnativestorageproviders.html&quot; id=&quot;link-id13e54d98&quot;&gt;Full operation&lt;/a&gt; with &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x11a3d360&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x1108d428&quot;&gt;Sesame&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1288aa00&quot;&gt;RDF&lt;/a&gt; Frameworks. This fully replaces any previous attempts at interop, and introduces samples and test suites.&lt;/li&gt; &lt;li&gt;Better support for alternate RDF indexing schemes&lt;/li&gt; &lt;li&gt;Parallel operation of the RDF Sponger, importing multiple sources concurrently.&lt;/li&gt; &lt;li&gt;New &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x128a9810&quot;&gt;data&lt;/a&gt; formats supported for on-demand RDF-ization in the Sponger&lt;/li&gt; &lt;li&gt;More efficient support for inference of subclass and sub-property; now capable of efficiently handling taxonomies of tens of thousands of classes&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x6af0678&quot;&gt;OWL&lt;/a&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfsparqlrule.html#rdfsparqlruleintro&quot; id=&quot;link-id104d58d8&quot;&gt;equivalentClass and equivalentProperty&lt;/a&gt; support.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfdatarepresentation.html#rdfdynamiclocal&quot; id=&quot;link-id109606a8&quot;&gt;Dynamic IRI host part&lt;/a&gt; support for mapped data and for metadata of local resources. Renaming the host or using multiple virtual hosts will accept URIs with the right host part and refer to the same thing, no duplicate storage required.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x12e0cc38&quot;&gt;SPARQL&lt;/a&gt; optimizations for &lt;code&gt;LIMIT&lt;/code&gt; and &lt;code&gt;OFFSET&lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Documentation&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/perfdiag.html#perfdiagqueryplans&quot; id=&quot;link-id10a56dd0&quot;&gt;How to read query plans and how to use the key performance meters&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfperformancetuning.html#rdfperfcost&quot; id=&quot;link-id106cb5c0&quot;&gt;How to diagnose SPARQL queries and how to decide what indexing scheme is right for each RDF use case&lt;/a&gt; &lt;/li&gt; &lt;li&gt;How to debug RDF views&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/sparqldebug.html&quot; id=&quot;link-id133b4420&quot;&gt;Better documentation of SPARQL extensions and options&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfviews.html#rdfviewnorthwindexample1&quot; id=&quot;link-id1060fdd8&quot;&gt;A sample of correct RDF view usage with the Northwind demo data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/ul&gt; &lt;h2&gt;Bug Fixes&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Generally improved safety of built-in functions, better argument checking.&lt;/li&gt; &lt;li&gt;Verified UTF8 international character support in all RDF use cases, &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x12839fd0&quot;&gt;SQL&lt;/a&gt; client/&lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x1288f350&quot;&gt;SPARQL protocol&lt;/a&gt;/all data formats.&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-07-17T15:28:22.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso 5.0.7 Release, Now With Jena and Sesame APIs</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-07-17#1392</atom:id>
  <atom:published>2008-07-17T17:16:19Z</atom:published>
  <atom:content type="html">&lt;h2&gt;Improvements&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfnativestorageproviders.html&quot; id=&quot;link-id13e54d98&quot;&gt;Full operation&lt;/a&gt; with &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x11839970&quot;&gt;Jena&lt;/a&gt; and &lt;a href=&quot;http://sourceforge.net/projects/sesame/&quot; id=&quot;link-id0x118521a0&quot;&gt;Sesame&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x11e14758&quot;&gt;RDF&lt;/a&gt; Frameworks. This fully replaces any previous attempts at interop, and introduces samples and test suites.&lt;/li&gt; &lt;li&gt;Better support for alternate RDF indexing schemes&lt;/li&gt; &lt;li&gt;Parallel operation of the RDF Sponger, importing multiple sources concurrently.&lt;/li&gt; &lt;li&gt;New &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x13661868&quot;&gt;data&lt;/a&gt; formats supported for on-demand RDF-ization in the Sponger&lt;/li&gt; &lt;li&gt;More efficient support for inference of subclass and sub-property; now capable of efficiently handling taxonomies of tens of thousands of classes&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x9df079b8&quot;&gt;OWL&lt;/a&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfsparqlrule.html#rdfsparqlruleintro&quot; id=&quot;link-id104d58d8&quot;&gt;equivalentClass and equivalentProperty&lt;/a&gt; support.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfdatarepresentation.html#rdfdynamiclocal&quot; id=&quot;link-id109606a8&quot;&gt;Dynamic IRI host part&lt;/a&gt; support for mapped data and for metadata of local resources. Renaming the host or using multiple virtual hosts will accept URIs with the right host part and refer to the same thing, no duplicate storage required.&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x110e7688&quot;&gt;SPARQL&lt;/a&gt; optimizations for &lt;code&gt;LIMIT&lt;/code&gt; and &lt;code&gt;OFFSET&lt;/code&gt; &lt;/li&gt; &lt;/ul&gt; &lt;h2&gt;Documentation&lt;/h2&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/perfdiag.html#perfdiagqueryplans&quot; id=&quot;link-id10a56dd0&quot;&gt;How to read query plans and how to use the key performance meters&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfperformancetuning.html#rdfperfcost&quot; id=&quot;link-id106cb5c0&quot;&gt;How to diagnose SPARQL queries and how to decide what indexing scheme is right for each RDF use case&lt;/a&gt; &lt;/li&gt; &lt;li&gt;How to debug RDF views&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/sparqldebug.html&quot; id=&quot;link-id133b4420&quot;&gt;Better documentation of SPARQL extensions and options&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfviews.html#rdfviewnorthwindexample1&quot; id=&quot;link-id1060fdd8&quot;&gt;A sample of correct RDF view usage with the Northwind demo data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/ul&gt; &lt;h2&gt;Bug Fixes&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Generally improved safety of built-in functions, better argument checking.&lt;/li&gt; &lt;li&gt;Verified UTF8 international character support in all RDF use cases, &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x11140c28&quot;&gt;SQL&lt;/a&gt; client/&lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x110947e8&quot;&gt;SPARQL protocol&lt;/a&gt;/all data formats.&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-07-17T15:28:20-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Response to: Where&#39;s the Killer Semantic Web Application (Update #2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-26#1391</atom:id>
  <atom:published>2008-06-26T18:28:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;As is often the case these days, it&amp;#39;s much easier to drop a &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id13519b98&quot;&gt;blog&lt;/a&gt; post than it is to make a simple comment in an &amp;quot;old media&amp;quot; style&lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id134e92c8&quot;&gt; data space &lt;/a&gt;:-(&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt; &lt;cite&gt;My use of &amp;quot;old media&amp;quot; implies: a place that still seeks subscriber data (no OpenID etc..), for the umpteenth time, as the toll fee for discourse development and participation on the Web.&lt;/cite&gt; &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;Anyway, here is what I attempted to post as a comment to Dan Grigorovici&amp;#39;s post titled: &lt;a href=&quot;http://www.semanticweb.com/article.php/12160_3753806_2&quot; id=&quot;link-id134dfb80&quot;&gt;Where is the Semantic Web Killer App?&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Dan,&lt;/p&gt; &lt;p&gt;An intriguing post to say the least :-) &lt;/p&gt; &lt;p&gt;&amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id134265c0&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id133d7048&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; aren&amp;#39;t synonymous, they are simply connected, infrastructure DNA-wise. You can have &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id1096cb70&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; style graphs (i.e RDF Data) and not have &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id133f0f48&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; as per &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id134fc7c0&quot;&gt;Linked Data&lt;/a&gt; deployment tenets and best practices, a very important point.&lt;/p&gt; &lt;p&gt;I&amp;#39;ve stated repeatedly, the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id134f03e8&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; emphasis has more to do with focusing on a point of crystallization within the larger &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id134104f0&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; vision, so here is a quick recap:&lt;/p&gt; &lt;h3&gt;What is &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id133decd0&quot;&gt;Linked Data&lt;/a&gt;?&lt;/h3&gt; &lt;p&gt;A term coined by &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id1340dd28&quot;&gt;TimBL&lt;/a&gt; that describes an application of HTTP to the time-tested process of &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Reference_(computer_science)&quot;&gt;Data Access by Reference&lt;/a&gt;&amp;quot;. &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10695c20&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; adds vital items to the &amp;quot;Data Access by Reference&amp;quot; pattern that have been erstwhile unattainable:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; The use of a Data Source Naming scoped to Database / Data Container Records as opposed to Tables, Views, Stored Procedures, Databases, and other Record Container tuple collections. Example: in &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-idd9c8af8&quot;&gt;ODBC&lt;/a&gt; / &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id130b0df0&quot;&gt;JDBC&lt;/a&gt;, a Data Source Name&amp;#39;s scope stops at the Table / View level. In the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; realm you get an added layer of granularity due to record level name scope&lt;/li&gt; &lt;li&gt;Incorporation of HTTP into the Data Source Naming scheme, which injects the expanse of the Web into the Data Access Range of the Data Source Name (i.e. a Named Record); so you can reference a record&amp;#39;s description directly via HTTP which is simply a major deal (to put things mildly).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;So we have HTTP based URIs as the Data Sources Names for a &amp;quot;Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1044a2d8&quot;&gt;Web&lt;/a&gt;&amp;quot; i.e a Web of inter-connected Data Source Names that de-emphasize the importance of their host containers (Compound Documents / &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id134e0d38&quot;&gt;Information&lt;/a&gt; Resources).&lt;/p&gt; &lt;p&gt;The business case or value proposition of &amp;quot;Linked Data&amp;quot; is synonymous with the value proposition of data access technologies such as &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id13400500&quot;&gt;ODBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id134f0250&quot;&gt;JDBC&lt;/a&gt;. &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id10923840&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id134ef878&quot;&gt;NET&lt;/a&gt;, OLE-DB, XMLA, and others (enterprise or consumer) in relation to the Individual and Enterprise pursuit of agility; in a realm where data is growing exponentially, and the maximum processing time in a single day remains 24 hrs. Data Access &amp;amp; Data Integration are timeless challenges due to the following constants:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Structured Data Schema Heterogeneity - we will always model the same things differently&lt;/li&gt; &lt;li&gt;Dirtiness of Data within Structured Data Containers - we are error prone due to laziness / sloppiness, time constraints, and the inherent limitation of our DNA based CPUs when dealing with large volumes of data.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Note: The line between the Enterprise &amp;amp; Individuals continue to blur by the second, this is something I covered during my &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2.html&quot; id=&quot;link-id13479488&quot;&gt;Linked Data Planet keynote&lt;/a&gt;, which is like most things I put on the Web (via this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id130ac870&quot;&gt;blog&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10923ba8&quot;&gt;data space&lt;/a&gt;), is a live and practical demonstration of the virtues of Linked Data courtesy of &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id133fd270&quot;&gt;RDFa&lt;/a&gt;, the &lt;a href=&quot;http://bibliontology.com/&quot; id=&quot;link-id134248d8&quot;&gt;Bibliographic Ontology&lt;/a&gt;, and dereferencable URIs (i.e. HTTP based Data Source Names for Documents and the Entities they host).&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://zitgist.com/labs/linked_data.html&quot; id=&quot;link-id104778a8&quot;&gt;Linked Data FAQ&lt;/a&gt; - by &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mkbergman#this&quot; id=&quot;link-idd8e71b0&quot;&gt;Mike Bergman&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.wired.com/special_multimedia/2008/st_infoporn_1607&quot; id=&quot;link-id134c1e80&quot;&gt;The Planetary Computer&lt;/a&gt; from &lt;a href=&quot;http://www.wired.com&quot; id=&quot;link-id13416518&quot;&gt;Wired Magazine&lt;/a&gt; - which is basically the effect of Linked Data under a different label (note to Wired: &amp;quot;Tired of old Media repetitive Registrations&amp;quot; when seeking to make comments in the OpenID era!).&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-07-19T15:50:46-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Metcalfe, Einstein, and Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-23#1390</atom:id>
  <atom:published>2008-06-23T20:48:30Z</atom:published>
  <atom:content type="html">&lt;p&gt;Metcalfe’s law states that the value of a telecommunications network is proportional to the square of the number of users of the system (n²), where the linkages between users (nodes) exist by definition. For &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id106b0c10&quot;&gt;information&lt;/a&gt; bases, the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; objects are the nodes. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13fc5940&quot;&gt;Linked Data&lt;/a&gt; works to add the connections between the nodes.&lt;/p&gt; &lt;p&gt;I would tweak of the law modification expressed in &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mkbergman#this&quot; id=&quot;link-id1401cce0&quot;&gt;Mike Bergman&lt;/a&gt;&amp;#39;s &lt;a href=&quot;http://feeds.feedburner.com/%7Er/AI3_AdaptiveInformation/%7E3/318146056/&quot; id=&quot;link-id104fc870&quot;&gt;post&lt;/a&gt; which states:&lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;the value of a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14b74530&quot;&gt;Linked Data&lt;/a&gt; network is proportional to the square of the number of links between the data objects.&lt;/cite&gt; &lt;/blockquote&gt; By simply injecting &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10ca1eb8&quot;&gt;Context&lt;/a&gt;&amp;quot; which is what a high fidelity &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x9c3d088&quot;&gt;linked data&lt;/a&gt; mesh facilitates i.e. a mesh of weighted links endowed with specifically typed links (as opposed to a single ambiguous type unspecific link), you end up with an even more insight into the power of a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10cebfc8&quot;&gt;Web&lt;/a&gt;. &lt;h3&gt;Channeling Einstein&lt;/h3&gt; &lt;p&gt;How about &lt;a href=&quot;http://dbpedia.org/resource/Albert_Einstein&quot; id=&quot;link-id1115dd38&quot;&gt;Einstein&lt;/a&gt;&amp;#39;s famous equaton: &lt;a href=&quot;http://en.wikipedia.org/wiki/Mass-energy_equivalence&quot; id=&quot;link-id1a783ab8&quot;&gt;E=mc&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;? I am talking Energy (vitality) and Mass equivalence, where &amp;quot;E&amp;quot; is for Energy, &amp;quot;m&amp;quot; for Network Mesh base Mass ( where each &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x97482d0&quot;&gt;entity&lt;/a&gt; network node contains sub-particles that are themselves dense network meshes all endowed with typed links and weightings), and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/C_%28programming_language%29&quot; id=&quot;link-id10b632c0&quot;&gt;c&lt;/a&gt;&amp;quot; is for computer processing speed (processing speed is growing exponentially!). When you beam queries down a &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id14398d00&quot;&gt;context&lt;/a&gt; rich mesh (a &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10acf280&quot;&gt;giant global graph&lt;/a&gt; comprised of named and dereferencable data sources), especially a mesh to which we are all connected, what do you get? Infrastructure for generating an unbelievable amount of intellectual energy (the result of exploding the sub-data-graphs within graph nodes) that is much better equipped to handle current and future challenges. Even better, we end up making constructive use of Einstein&amp;#39;s findings (remember, we built a bomb the first time around!). &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/&quot; id=&quot;link-id10ece0b8&quot;&gt;TimBL&lt;/a&gt; articulates this fundamental value of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; in slightly different language, but at the core, this is the essence of the Web as I believe he envisioned; the ability to connect us all in such a way that we exploit our collective manpower and &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id1300bf58&quot;&gt;knowledge&lt;/a&gt; constructively and unobtrusively, en route to making the world a much better place :-)&lt;/p&gt; &lt;p&gt;Note: None of this in incongruent with being compensated (i.e. making money) for contributing tangible value into, or around, the Mesh we know as the Web :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/Business_@_the_Speed_of_Thought&quot; id=&quot;link-id1095d330&quot;&gt;Business at the Speed of Thought&lt;/a&gt; - by &lt;a href=&quot;http://dbpedia.org/resource/Bill_Gates&quot; id=&quot;link-id14043c50&quot;&gt;Bill Gates&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.gladwell.com/blink/index.html&quot; id=&quot;link-id1043a4d0&quot;&gt;Blink&lt;/a&gt; - by &lt;a href=&quot;http://dbpedia.org/resource/Malcolm_Gladwell&quot; id=&quot;link-id13825918&quot;&gt;Malcolm Gladwell&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-09-02T13:03:01-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>A Simple Linked Data Guide for the Enterprise</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-23#1389</atom:id>
  <atom:published>2008-06-23T19:29:16Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mkbergman#this&quot; id=&quot;link-id12dd9d88&quot;&gt;Mike Bergman&lt;/a&gt; has just published a nice &lt;a href=&quot;http://feeds.feedburner.com/~r/AI3_AdaptiveInformation/~3/318146056/&quot; id=&quot;link-id10b96a98&quot;&gt;Linked Data FAQ&lt;/a&gt; aimed at Enterprise audiences. His post draws on a collection of questions collated from a plethora of interactions with Enterprise oriented folks during last week&amp;#39;s &lt;a href=&quot;http://www.linkeddataplanet.com&quot; id=&quot;link-id12276c00&quot;&gt;Linked Data Planet conference&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-23T16:54:29-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>What do people have against URLs or URIs? (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-22#1388</atom:id>
  <atom:published>2008-06-22T22:36:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;Stumbled across a nice post titled: &lt;a href=&quot;http://derivadow.com/2008/06/22/what-do-people-have-against-urls&quot; id=&quot;link-id10c035c8&quot;&gt;What do people have against URLs&lt;/a&gt;?. My answer: Everything, if they don&amp;#39;t understand the inherent power of URLs when incorporated into the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Source Naming&amp;quot; mechanism of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; called: URIs :-)&lt;/p&gt; &lt;p&gt;URIs are simple to use i.e you simply click on them via a user agents UI. However, URLs when incorporated into Data Source Naming en route to constructing HTTP based Identifiers, that deliver HTTP based pointers to the location / address of a Resource Descriptions, another matter.&lt;/p&gt; &lt;p&gt;I touched on this issue in my &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2.html&quot; id=&quot;link-id1076e998&quot;&gt;Linked Data Planet keynote&lt;/a&gt; last week, and I must say, it did set off a light.&lt;/p&gt; &lt;p&gt;I believe, we can only get the broader Web community to comprehend the utility of URIs (Web Data Source Names) by exposing said utility via the Web&amp;#39;s Universal Client (Web Browser). For instance, how do URN based Identity / Naming schemes help in a world dominated by Web Browsers that only grok &amp;quot;http://&amp;quot;? From my vantage point, the practical solution is for data providers who already have &amp;quot;doi&amp;quot;, &amp;quot;lsid&amp;quot; and other Handle based Identifiers in place, to embark upon http-to-native-naming-scheme-proxying.&lt;/p&gt; &lt;p&gt;In my usual &amp;quot;dog-fooding&amp;quot; and &amp;quot;practice what you preach&amp;quot; fashion, this is exactly what we do in the new &lt;a href=&quot;http://myopenlink.net:8890/~kidehen/Public/rdfb.xpi&quot; id=&quot;link-id13038bb0&quot;&gt;Linked Data Web extension&lt;/a&gt; that we&amp;#39;ve decided to reveal to the public (albeit late beta). Thus, when you use an existing browser to view pages with &amp;quot;lsid&amp;quot; or &amp;quot;doi&amp;quot; URNs, you still enjoy the utility of getting at the &amp;quot;Raw &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1090f2a0&quot;&gt;Linked Data&lt;/a&gt; Sources&amp;quot; that these names expose.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-23T09:37:57.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>My Linked Data Planet Keynote (Updated with missing link)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-19#1387</atom:id>
  <atom:published>2008-06-19T05:25:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve finally found a second to drop a note about my keynote.&lt;/p&gt; &lt;p&gt;The keynote: &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Creating_Deploying_Exploiting_Linked_Data2.html&quot; id=&quot;link-id103acfb8&quot;&gt;Creating, Deploying, and Exploiting Linked Data&lt;/a&gt;, sought to achieve the fundamental goal of: Demystify the concept of &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id107134e8&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; using anecdotal material that resonates with enterprise decision makers.&lt;/p&gt; &lt;p&gt;To my pleasure, 90% of the audience members confirmed familiarization with the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Source Name&amp;quot; concept of &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id106d97a8&quot;&gt;Open Database Connectivity&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id10956268&quot;&gt;ODBC&lt;/a&gt;). Thus, all I had to do was map &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10a55728&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; to &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id10e77210&quot;&gt;ODBC&lt;/a&gt;, and then unveil the fundamental add-ons that &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10d1d290&quot;&gt;Linked Data&lt;/a&gt;&amp;quot; delivers:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The ability to give database records names (Identifiers)&lt;/li&gt; &lt;li&gt;The use of HTTP in the database record naming mechanism - which expands a named database record&amp;#39;s reference scope via the expanse of the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; (i.e HTTP based Identifiers called URIs).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I believe a majority of attendees came to realize that the combination above injects a new Web interaction dynamic: access to &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id110978d0&quot;&gt;Subject matter Concepts&lt;/a&gt;&amp;quot; and &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id10ea5160&quot;&gt;Named Entities&lt;/a&gt; contained within a page via HTTP base Data Source Names (URIs).&lt;/p&gt; &lt;p&gt;BTW - My presentation is a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id109e5e30&quot;&gt;Linked Data Space&lt;/a&gt; in it&amp;#39;s own right courtesy of the &lt;a href=&quot;http://bibliontology.com/&quot; id=&quot;link-id10e76d90&quot;&gt;Bibliographic Ontology&lt;/a&gt; (which provides slide show modeling) and &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id10d48e40&quot;&gt;RDFa&lt;/a&gt; that allows me to embed annotations into my &lt;a href=&quot;http://www.w3.org/Talks/Tools/Slidy/&quot; id=&quot;link-id104be488&quot;&gt;Slidy&lt;/a&gt; based presentation :-)&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://virtuoso.openlinksw.com/presentations/Creating_Deploying_Exploiting_Linked_Data2/Linked_Data_2008_keynote.ppt&quot; id=&quot;link-id10a63640&quot;&gt;PowerPoint&lt;/a&gt; version of Presentation&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.slideshare.net/rumito/linked-data-planet-key-note/&quot; id=&quot;link-id103aaff8&quot;&gt;Slideshare hosted &lt;/a&gt;version&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://www.authorstream.com/Presentation/rumito-72460-linked-data-planet-key-note-2008-keynote-science-technology-ppt-powerpoint/&quot; id=&quot;link-id10b97c68&quot;&gt;Authorstream hosted &lt;/a&gt;version&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://docs.google.com/Presentation?id=dc7jvc6m_1061gz888hdb&quot; id=&quot;link-id10e01640&quot;&gt;Google Docs hosted &lt;/a&gt;version&lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-06-19T09:48:14-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Missing Bits from semanticweb.com Interview</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-13#1386</atom:id>
  <atom:published>2008-06-13T02:02:56Z</atom:published>
  <atom:content type="html">&lt;p&gt;Yikes! I&amp;#39;ve just discovered that the final part of the semanticweb.com&amp;#39;s interview with &lt;a href=&quot;http://www.cs.umd.edu/~hendler/2003/foaf.rdf#jhendler&quot; id=&quot;link-id10483c28&quot;&gt;Jim Hendler&lt;/a&gt; and I, includes critical paragraphs that omit my example links :-( As you can imagine, this is a quite excruciating, bearing in mind that &amp;quot;Literals&amp;quot; are of marginal value in a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1418a578&quot;&gt;Linked Data&lt;/a&gt; world.&lt;/p&gt; &lt;p&gt;Anyway, thanks to the Blogosphere, I can attempt to fix this problem myself -- via this post :-)&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Q. If you wanted to provide a bewildered but still curious novice a public example of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id107e67d0&quot;&gt;Linked Data&lt;/a&gt; at work in their everyday life, what would it be?&lt;/strong&gt; &lt;/p&gt; &lt;p&gt; &lt;strong&gt;&lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id13851f80&quot;&gt;Kingsley Idehen&lt;/a&gt;:&lt;/strong&gt; Any one of the following:&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/kidehen2&quot; id=&quot;link-id144c84b0&quot;&gt;My Linking Open Data community Profile Page&lt;/a&gt; - the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10339910&quot;&gt;Linked Data&lt;/a&gt; integration is exposed via the &amp;quot;Explore &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt;&amp;quot; Tab &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri%5B%5D=http%3A%2F%2Fmyopenlink.net%2Fdataspace%2Fkidehen&amp;amp;&quot; id=&quot;link-id12116d10&quot;&gt;My Linked Data Space&lt;/a&gt; - viewed via OpenLink&amp;#39;s AJAR (Asynchronous Javascript and RDF) based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10728ed0&quot;&gt;Linked Data&lt;/a&gt; Brower &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser2/?uri=http%3A%2F%2Fmyopenlink.net%2Fdataspace%2Fkidehen%2Fcalendar%2FKingsley%2527s%2520Calendar&quot; id=&quot;link-id144ef138&quot;&gt;My Events Calendar Tag Cloud&lt;/a&gt; - a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xb8fdf10&quot;&gt;Linked Data&lt;/a&gt; view of my Calendar Space using an RDF-aware browser In all cases, you have the ability to explore my data spaces by simply clicking on the links, which on the surface appear to be standard hypertext links, although in reality you are dealing with &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id142827a8&quot;&gt;hyperdata&lt;/a&gt; links (i.e., links to entities that result in the generation of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id144c8438&quot;&gt;entity&lt;/a&gt; description pages that expose &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id149c9cf8&quot;&gt;entity&lt;/a&gt; properties via &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10551628&quot;&gt;hyperdata&lt;/a&gt; links). Thus, you have a single page that describes me in a very rich way since it encompasses all data associated with me, covering: personal profile, &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id10ac5148&quot;&gt;blog&lt;/a&gt; posts, bookmarks, &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id122ff4b0&quot;&gt;tag&lt;/a&gt; clouds, social networks etc.&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Q. What would you show the CEO or CTO of a company outside the tech industry?&lt;/strong&gt; &lt;/p&gt; &lt;p&gt; &lt;strong&gt;&lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id106143a8&quot;&gt;Kingsley Idehen&lt;/a&gt;:&lt;/strong&gt; A link to the &lt;a href=&quot;http://demo.openlinksw.com/Northwind/Customer/ALFKI#this&quot; id=&quot;link-id106144e0&quot;&gt;Entity ALFKI&lt;/a&gt;, from the popular Northwind Database associated with Microsoft Access and &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id10ca6f68&quot;&gt;SQL&lt;/a&gt; Server database installations. This particular link exposes a typical enterprise &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id14202348&quot;&gt;data space&lt;/a&gt; (orders, customers, employees, suppliers ...) in a single page. The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id144e9070&quot;&gt;hyperdata&lt;/a&gt; links represent intricate data relationships common to most business systems that will ultimately seek to repurpose existing legacy data sources and SOA services as &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt;. Alternatively, I would show the same links via the &lt;a href=&quot;http://dataviewer.zitgist.com/?uri=http%3A//demo.openlinksw.com/Northwind/Customer/ALFKI&quot; id=&quot;link-id10e2e1d0&quot;&gt;Zitgist Data Viewer&lt;/a&gt; (another Linked Data-aware browser). In both cases, I am exploiting direct access to entities via HTTP due to the protocols incorporation into the Data Source Naming scheme.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-13T09:01:40.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Internet.com Interviews Jim Hendler &amp; I</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-12#1385</atom:id>
  <atom:published>2008-06-12T00:40:19Z</atom:published>
  <atom:content type="html">&lt;p&gt;The build up to &lt;a href=&quot;http://www.linkeddataplanet.com&quot; id=&quot;link-id110a2350&quot;&gt;Linked Data Planet&lt;/a&gt; continues... Here is &lt;a href=&quot;http://www.semanticweb.com&quot; id=&quot;link-id11083a68&quot;&gt;semanticweb.com&lt;/a&gt;&amp;#39;s interview with &lt;a href=&quot;http://www.cs.rpi.edu/~hendler/&quot; id=&quot;link-id10c4e560&quot;&gt;Jim Hendler&lt;/a&gt; and *&lt;a href=&quot;http://community.linkeddata.org/dataspace/person/kidehen2#this&quot; id=&quot;link-id10e71dc8&quot;&gt;I&lt;/a&gt;* titled: &lt;a href=&quot;http://www.semanticweb.com//article.php/3751731&quot; id=&quot;link-id1071c688&quot;&gt;Linked Data Leaders - The Semantic Web is Here&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T20:55:15-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data in Action: Library of Congress</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-11#1384</atom:id>
  <atom:published>2008-06-11T16:36:40Z</atom:published>
  <atom:content type="html">&lt;p&gt;As I start my countdown to the upcoming &lt;a href=&quot;http://www.linkeddataplanet.com&quot; id=&quot;link-id106a81b8&quot;&gt;Linked Data Planet conference&lt;/a&gt;, here is the first of a series of posts geared towards showcasing practical use of the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id109470d0&quot;&gt;Linked Data Web&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First up, the Library of Congress, take a look at the following pages which are &amp;quot;Human&amp;quot; and machine based &amp;quot;User Agent&amp;quot; friendly:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://lcsh.info/sh85118553#concept&quot; id=&quot;link-id102927f8&quot;&gt;Science&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lcsh.info/sh85062913#concept&quot; id=&quot;link-id10f13820&quot;&gt;Humanities&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lcsh.info/sh85082139#concept&quot; id=&quot;link-id10ca5c58&quot;&gt;Mathematics&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lcsh.info/sh85020816#concept&quot; id=&quot;link-id1230aef8&quot;&gt;Cataloging&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://lcsh.info/sh95000541#concept&quot; id=&quot;link-id1110e140&quot;&gt;World Wide Web&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Key point: The pages above are served up in line with &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id102f96a8&quot;&gt;Linked Data&lt;/a&gt; deployment and publishing tenets espoused by the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id10685ed8&quot;&gt;Linking Open Data Community&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id103915b0&quot;&gt;LOD&lt;/a&gt;) which include (in my preferred terminology):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Giving &amp;quot;Names&amp;quot; to things you observe (aka &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Source Names or &amp;quot;DSNs&amp;quot; for short)&lt;/li&gt; &lt;li&gt;Use HTTP URLs in your data source naming scheme so that &amp;quot;access by reference&amp;quot; to your data sources exploits the expanse of the HTTP driven &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; i.e make your DSNs &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1071cb88&quot;&gt;Linked Data Source Names&lt;/a&gt;&amp;quot; (LDNS)&lt;/li&gt; &lt;li&gt;Remember that Documents / Pages are compound in nature, and they aren&amp;#39;t the only data sources we would want to name; a document&amp;#39;s LDSN must be distinct from the LDSNs used for the &lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id10c020d0&quot;&gt;subject matter concepts&lt;/a&gt; and/or &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-ide7a0a58&quot;&gt;named entities&lt;/a&gt; associated with a document &lt;/li&gt; &lt;li&gt; Use the RDF Data Model to express structure within your data source(s)&lt;/li&gt; &lt;li&gt;Use LDSNs when constructing statements/claims/assertions/records (triples) inside your structured data sources&lt;/li&gt; &lt;li&gt; When publishing Web Pages related to your data sources; use at least one of the following to methods to guide user agents to data sources associated with your published page; the HTML &lt;a href=&quot;http://blogs.usnet.private:8893/RPC2&quot; id=&quot;link-id12326c48&quot;&gt;LINK tag&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id10751788&quot;&gt;RDFa&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/GRDDL&quot; id=&quot;link-id1050e290&quot;&gt;GRDDL&lt;/a&gt;, or &lt;a href=&quot;http://dbpedia.org/resource/Content_negotiation&quot; id=&quot;link-id12e930b0&quot;&gt;Content Negotiation&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The items above are features that users and decision makers should start to hone into when seeking, and evaluating, platforms that facilitate cost-effective exploitation of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x9dde928&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x18c3b1c0&quot;&gt;Web&lt;/a&gt;.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T13:16:31.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>De Paradigmata and The Foundational Issues</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-06-09#1383</atom:id>
  <atom:published>2008-06-09T14:02:21Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;De Paradigmata and The Foundational Issues&lt;/div&gt; &lt;p&gt;I thought that we had talked ourselves to exhaustion and beyond over the issue of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1dd07c68&quot;&gt;semantic web&lt;/a&gt; layer cake. Apparently not. There was a paper called &lt;i&gt;Functional Architecture for the Semantic Web&lt;/i&gt; by &lt;a href=&quot;http://gerberaj.googlepages.com/&quot; id=&quot;link-id106b8130&quot;&gt;Aurona Gerber&lt;/a&gt; et al at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x17137300&quot;&gt;ESWC2008&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The thrust of the matter was that for newcomers the layer cake was confusing and did not clearly indicate the architecture. Why, sure. My point is that no rearranging of the boxes will cut it for the general case.&lt;/p&gt; &lt;p&gt;Any diagram containing the boxes of the layer cake (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1a9138c0&quot;&gt;URI&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x1cc4a8d8&quot;&gt;XML&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xa21c1308&quot;&gt;SPARQL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x1aa28050&quot;&gt;OWL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Rule_Interchange_Format&quot; id=&quot;link-id0x137268d0&quot;&gt;RIF&lt;/a&gt;, Crypto, etc., etc.) in whatever order or arrangement can at best be a sort of overview of how these standards reference each other.&lt;/p&gt; &lt;p&gt;Such diagrams are a little like saying that a car combines the combustion properties of fuel/air mixes with the tension and compression resistance properties of metals and composites for producing motion and secondly links to Newton&amp;#39;s laws of motion and to aerodynamics.&lt;/p&gt; &lt;p&gt;Not false. But it does not say that a car is good for economical commute or showing off at the strip or any number of niches that a mature industry has grown to serve.&lt;/p&gt; &lt;p&gt;Now, talking of software engineering, modules and interfaces are good and even necessary. The trick is to know where to put the interface.&lt;/p&gt; &lt;p&gt;Such a thing cannot possibly be inferred from the standards&amp;#39; inter-reference picture. APIs, especially if these are Web service APIs, should go where there is low &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x196fcba0&quot;&gt;data&lt;/a&gt; volume and tolerance for latency. For example, either inference is a preprocessing step or it is embedded right inside a SPARQL engine. Such a thing cannot be seen from the picture. Same for trust. Trust is not an after-thought at the top of the picture, except maybe in the sense of referring to the other parts.&lt;/p&gt; &lt;p&gt;We hear it over and over. Scale and speed are critical. Arrange the blocks of any real system as makes sense for data flow; do not confuse literature references with control or data structure.&lt;/p&gt; &lt;p&gt;The even-more foundational issue is the promotion of the general concept of a Web of Data.&lt;/p&gt; &lt;p&gt;The core idea that the Web would be a query-able collection of data with meaningful reference between data of different provenance cannot be inferred from the picture, even though this should be its primary message. Or it is better to say that the first picture shown should stress this idea and then one could leave the layer cake, in whatever version, for explaining the standards&amp;#39; order of evolution or inter-reference.&lt;/p&gt; &lt;p&gt;So, the value proposition:&lt;/p&gt; &lt;p&gt;Why? Explosion of data volume, increased need of keeping up-to-date, increasing opportunity cost of not keeping in real time.&lt;/p&gt; &lt;p&gt;What? An architecture that is designed for unanticipated joining and evolution of data across heterogeneous sources, either at Web or enterprise scale.&lt;/p&gt; &lt;p&gt;How? URI everything and everything is cool, or, give things global names. Use &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x13700d00&quot;&gt;RDF&lt;/a&gt;. Reuse names or ontologies where can. (An ontology is a set of classes and property names plus some more.) Map relational data on the fly or store as RDF, whichever works. Query with SPARQL, easier than &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x17865208&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, my challenge for the graphics people would be to make an illustration of the above. Forget the alphabet soup. Show the layer cake as a historical reference or literature guide. Do not imply that this proliferation of boxes equates to an equal proliferation of Web services, for example.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-06-11T15:54:49-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>voiD, or Will the LOD Cloud Bring Rain?</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-06-09#1382</atom:id>
  <atom:published>2008-06-09T14:02:20Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;voiD, or Will the LOD Cloud Bring Rain?&lt;/div&gt; &lt;p&gt;At &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1c3bec48&quot;&gt;ESWC2008&lt;/a&gt;, we saw the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1f0db270&quot;&gt;Linked Open Data&lt;/a&gt; Cloud condense its first drops of precipitation.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/MediaWiki/index.php?MetaLOD#Kick-off_meeting_at_ESWC08&quot; id=&quot;link-id106ee858&quot;&gt;voiD, Vocabulary of Interlinked Datasets&lt;/a&gt;, is an idea whose time has clearly come. By the end of the conference, many speakers had already adopted the &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id0x16c99ad0&quot;&gt;meme&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The point is to describe what is inside the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c540958&quot;&gt;data&lt;/a&gt; sets. People may know this from having worked with the sets or from putting them together but to an outsider this is not evident.&lt;/p&gt; &lt;p&gt;The Semantic Sitemap says where there are files or end points for access. But it does not say what is inside these. Also for federation, it is important to be able to determine whether it makes sense to send a particular query to a particular end point.&lt;/p&gt; &lt;p&gt;If we play this right, this is what voiD will provide. I have to think of Dan Simmons&amp;#39; flamboyant Hyperion sci-fi series where the &amp;quot;void which binds&amp;quot; was a sort of hyperspace containing the thoughts of entities, past and present and even provided teleportation.&lt;/p&gt; &lt;p&gt;So what does the voiD hold, aside infinite potentialities?&lt;/p&gt; &lt;p&gt;The obvious part is DC-like provenance, version, authorship, license and such data set wide &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x16c05280&quot;&gt;information&lt;/a&gt;. Also the subject matter could be classified by reference to &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x1abf1558&quot;&gt;UMBEL&lt;/a&gt; or the &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id0x1b49ee78&quot;&gt;Yago&lt;/a&gt; classification of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x184dea28&quot;&gt;DBpedia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;More is needed, though. The simple part is listing the ontologies, if any. Also a set of namespaces would be an idea but this could be very large.&lt;/p&gt; &lt;p&gt;So let us look at what we&amp;#39;d like to be able to answer with the voiD set.&lt;/p&gt; &lt;p&gt;The below could be a sample of voiD questions?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What subjects are in the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1bbac318&quot;&gt;LOD&lt;/a&gt; cloud?&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1f74c7e8&quot;&gt;URI&lt;/a&gt;, what set in the LOD cloud can tell me more?&lt;/i&gt; This is divided into asking a text index like &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x1d57a8f8&quot;&gt;Sindice&lt;/a&gt; for the location, getting the namespace or data set and then querying voiD.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What need I federate/load in order to combine all that is reachable from a given vocabulary?&lt;/i&gt; There could be for example a graph showing the data sets and edges between them, edges being qualified by a set of same as assertions, itself a voiD described set, if translations were needed.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What sets are from the same or equally trusted publisher as this one?&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These things are roughly divided into description of the set and then some details on how it is stored on a given end point.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, in which other sets will I find use of the same URIs?&lt;/i&gt; For example, if I have language version x, I wish to know that language version y will have the same URIs insofar the things meant are the same.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, which sets of same as assertions will I have for mapping to which other sets?&lt;/i&gt; For example, if I have &lt;a href=&quot;http://www.geonames.org/&quot; id=&quot;link-id0x1b372140&quot;&gt;Geonames&lt;/a&gt;, I wish to know that set x will map at least some of the URIs in Geonames to DBpedia URIs.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Let me further point out that it is increasingly clear to the community that universal sameAs is dubious, hence sameAs assertions ought to be kept separate and included or excluded depending on the usage context.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, what are the interesting queries I can do?&lt;/i&gt; This is a sort of advertisement for human consumption. This is not a list of queries for crashing the end point. Denial of service can be done in &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1b25dea8&quot;&gt;SPARQL&lt;/a&gt; without knowing the end point content anyhow, so this is not an added risk exposer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Vocabularies used.&lt;/i&gt; This is a reference to the OWL or RDFS resources giving the applicable ontologies, if present. Also, a complete list of classes whose direct instances actually occur in the set is useful.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Ballpark cardinality.&lt;/i&gt; Something like a &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x1ed8f580&quot;&gt;DARQ&lt;/a&gt; optimization profile would be a good idea. I would say that there should be a possibility of just including a DARQ description file as is. This is a sort of baseline and since it already exist, we are spared the committee trouble of figuring out what it ought to contain and what not. If we start defining this from scratch, it will take long. Further, let this be optional. Quite Independently of this, query processors may make optimization related queries to remote end points insofar the specific end point supports these. This will come in time. For now, just the basics.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Along with this, LOD SPARQL end points could adopt a couple of basic conventions. The simplest would be to agree that each would host a graph with a given URI that would contain the voiD descriptions of the data sets contained, along with the graph URI used for each set, if different from the publisher&amp;#39;s URI for the graph. There is a point to this since an end point may load multiple data sets into one graph.&lt;/p&gt; &lt;p&gt;We hope to have a good idea of the matter in a couple of weeks, certainly a general statement of direction to be published at &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id0x1b049830&quot;&gt;Linked Data Planet&lt;/a&gt; in a couple of weeks.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-06-11T15:15:21-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The DARQ Matter of Federation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-06-09#1381</atom:id>
  <atom:published>2008-06-09T14:02:19Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;The DARQ Matter of Federation&lt;/div&gt; &lt;p&gt;Astronomers propose that the universe is held together, so to speak, by the gravity of invisible &amp;quot;dark matter&amp;quot; spread in interstellar and intergalactic space.&lt;/p&gt; &lt;p&gt;For the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x19dbf410&quot;&gt;data&lt;/a&gt; web, it will be held together by federation, also an invisible factor. As in Minkowski space, so in &lt;a href=&quot;http://dbpedia.org/resource/Cyberspace&quot; id=&quot;link-id0x9fc13ff8&quot;&gt;cyberspace&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To take the astronomical analogy further, putting too much visible stuff in one place makes a black hole, whose chief properties are that it is very heavy, can only get heavier and that nothing comes out.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x1d06bd88&quot;&gt;DARQ&lt;/a&gt; is Bastian Quilitz&amp;#39;s federated extension of the &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x1cf28f70&quot;&gt;Jena&lt;/a&gt; &lt;a href=&quot;http://jena.sourceforge.net/ARQ/&quot; id=&quot;link-id0x1cba22c8&quot;&gt;ARQ&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x171c7dc8&quot;&gt;SPARQL&lt;/a&gt; processor. It has existed for a while and was also presented at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1ed53cd0&quot;&gt;ESWC2008&lt;/a&gt;. There is also SPARQL FED from Andy Seaborne, an explicit means of specifying which end point will process which fragment of a distributed SPARQL query. Still, for federation to deliver in an open, decentralized world, it must be transparent. For a specific application, with a predictable workload, it is of course OK to partition queries explicitly.&lt;/p&gt; &lt;p&gt;Bastian had split &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1ce846c0&quot;&gt;DBpedia&lt;/a&gt; among five &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1cad0640&quot;&gt;Virtuoso&lt;/a&gt; servers and was querying this set with DARQ. The end result was that there was a rather frightful cost of federation as opposed to all the data residing in a single Virtuoso. The other result was that if selectivity of predicates was not correctly guessed by the federation engine, the proposition was a non-starter. With correct join order it worked, though.&lt;/p&gt; &lt;p&gt;Yet, we really want federation. Looking further down the road, we simply must make federation work. This is just as necessary as running on a server cluster for mid-size workloads.&lt;/p&gt; &lt;p&gt;Since we are convinced of the cause, let&amp;#39;s talk about the means.&lt;/p&gt; &lt;p&gt;For DARQ as it now stands, there&amp;#39;s probably an order of magnitude or even more to gain from a couple of simple tricks. If going to a SPARQL end point that is not the outermost in the loop join sequence, batch the requests together in one &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x19a48280&quot;&gt;HTTP&lt;/a&gt;/1.1 message. So, if the query is &amp;quot;get me my friends living in cities of over a million people,&amp;quot; there will be the fragment &amp;quot;get city where x lives&amp;quot; and later &amp;quot;ask if population of x greater than 1000000&amp;quot;. If I have 100 friends, I send the 100 requests in a batch to each eligible server.&lt;/p&gt; &lt;p&gt;Further, if running against a server of known brand, use a client-server connection and prepared statements with array parameters. This can well improve the processing speed at the remote end point by another order of magnitude. This gain may however not be as great as the latency savings from message batching. We will provide a sample of how to do this with Virtuoso over &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x1cf18278&quot;&gt;JDBC&lt;/a&gt; so Bastian can try this if interested.&lt;/p&gt; &lt;p&gt;These simple things will give a lot of mileage and may even decide whether federation is an option in specific applications. For the open web however, these measures will not yet win the day.&lt;/p&gt; &lt;p&gt;When federating &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1cf7d0e8&quot;&gt;SQL&lt;/a&gt;, colocation of data is sort of explicit. If two tables are joined and they are in the same source, then the join can go to the source. For SPARQL this is also so but with a twist:&lt;/p&gt; &lt;p&gt;If a foaf:Person is found on a given server, this does not mean that the Person&amp;#39;s geek code or email hash will be on the same server. Thus &lt;code&gt;{?p name &amp;quot;Johnny&amp;quot; . ?p geekCode ?g . ?p emailHash ?h }&lt;/code&gt; does not necessarily denote a colocated join if many servers serve items of the vocabulary.&lt;/p&gt; &lt;p&gt;However, in most practical cases, for obtaining a rapid answer, treating this as a colocated fragment will be appropriate. Thus, it may be necessary to be able to declare that geek codes will be assumed colocated with names. This will save a lot of message passing and offer decent, if not theoretically total recall. For search style applications, starting with such assumptions will make sense. If nothing is found, then we can partition each join step separately for the unlikely case that there were a server that gave geek codes but not names.&lt;/p&gt; &lt;p&gt;For Virtuoso, we find that a federated query&amp;#39;s asynchronous, parallel evaluation model is not so different from that on a local cluster. So the cluster version could have the option of federated query. The difference is that a cluster is local and tightly coupled and predictably partitioned but a federated setting is none of these.&lt;/p&gt; &lt;p&gt;For description, we would take DARQ&amp;#39;s description model and maybe extend it a little where needed. Also we would enhance the protocol to allow just asking for the query cost estimate given a query with literals specified. We will do this eventually.&lt;/p&gt; &lt;p&gt;We would like to talk to Bastian about large improvements to DARQ, specially when working with Virtuoso. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;Of course, one mode of federating is the crawl-as-you-go approach of the Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1e163140&quot;&gt;Sponger&lt;/a&gt;. This will bring in fragments following seeAlso or sameAs declarations or other references. This will however not have the recall of a warehouse or federation over well described SPARQL end-points. But up to a certain volume it has the speed of local storage.&lt;/p&gt; &lt;p&gt;The emergence of voiD (Vocabulary of Interlinked Data) is a step in the direction of making federation a reality. There is &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-id1109a4c8&quot;&gt;a separate post&lt;/a&gt; about this.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-06-11T15:15:14-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Aspects of RDF to RDF Mapping</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-06-09#1380</atom:id>
  <atom:published>2008-06-09T14:02:18Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Aspects of RDF to RDF Mapping&lt;/div&gt; &lt;p&gt;The W3C has recently launched an &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-idd763f48&quot;&gt;incubator group about mapping relational data to RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;From participating in the group for the few initial sessions, I get the following impressions.&lt;/p&gt; &lt;p&gt;There is a segment of users, for example from the biomedical community, who do heavy duty &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x17f9e6f8&quot;&gt;data&lt;/a&gt; integration and look to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x17eabf48&quot;&gt;RDF&lt;/a&gt; for managing complexity. Unifying heterogeneous data under OWL ontologies, reasoning, and data integrity, are points of interest.&lt;/p&gt; &lt;p&gt;There is another segment that is concerned with semantifying the document web, which topic includes initiatives such as &lt;a href=&quot;http://triplify.org/&quot; id=&quot;link-id0x1a25cd28&quot;&gt;Triplify&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x182c41e8&quot;&gt;semantic web&lt;/a&gt; search such as &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x1a29c5e8&quot;&gt;Sindice&lt;/a&gt;. The emphasis there is on minimizing entry cost and creating critical mass. The next one to come will clean up the semantics, if these need be cleaned up at all.&lt;/p&gt; &lt;p&gt;(Some cleanup is taking place with &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id0x17fd2b70&quot;&gt;Yago&lt;/a&gt; and &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0x17e6ab88&quot;&gt;Zitgist&lt;/a&gt;, but this is a matter for a different post.)&lt;/p&gt; &lt;p&gt;Thus, technically speaking, the mapping landscape is diverse, but ETL (extract-transform-load) seems to predominate. The biomedical people make data warehouses for answering specific questions. The web people are interested in putting data out in the expectation that the next player will warehouse it and allow running complex meshups against the whole of the RDF-ized web.&lt;/p&gt; &lt;p&gt;As one would expect, these groups see different issues and needs. Roughly speaking, one is about quality and structure and the other is about volume.&lt;/p&gt; &lt;p&gt;Where do we stand?&lt;/p&gt; &lt;p&gt;We are with the research data warehousers in saying that the mapping question is very complex and that it would indeed be nice to bypass ETL and go to the source &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x182acd68&quot;&gt;RDBMS&lt;/a&gt;(s) on demand. Projects in this direction are ongoing.&lt;/p&gt; &lt;p&gt;We are with the web people in building large RDF stores with scalable query answering for arbitrary RDF, for example, hosting a lot of the Linking Open Data sets, and working with Zitgist.&lt;/p&gt; &lt;p&gt;These things are somewhat different.&lt;/p&gt; &lt;p&gt;At present, both the research warehousers and the web scalers predominantly go for ETL.&lt;/p&gt; &lt;p&gt;This is fine by us as we definitely are in the large RDF store race.&lt;/p&gt; &lt;p&gt;Still, mapping has its point. A relational store will perform quite a bit faster than a quad store if it has the right covering indices or application-specific compressed columnar layout. Thus, there is nothing to block us from querying analytics in &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x16c91438&quot;&gt;SPARQL&lt;/a&gt;, once the obviously necessary extensions of sub-query, expressions and aggregation are in place.&lt;/p&gt; &lt;p&gt;To cite an example, the Ordnance Survey of the UK has a GIS system running on &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x17ee37c8&quot;&gt;Oracle&lt;/a&gt; with an entry pretty much for each mailbox, lamp post, and hedgerow in the country. According to Ordnance Survey, this would be 1 petatriple, 1e15 triples. &amp;quot;Such a big server farm that we&amp;#39;d have to put it on our map,&amp;quot; as Jenny Harding put it at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1cab6330&quot;&gt;ESWC2008&lt;/a&gt;. I&amp;#39;d add that an even bigger map entry would be the power plant needed to run the 100,000 or so PCs this would take. This is counting 10 gigatriples per PC, which would not even give very good working sets.&lt;/p&gt; &lt;p&gt;So, on-the-fly RDBMS-to-RDF mapping in some cases is simply necessary. Still, the benefits of RDF for integration can be preserved if the translation middleware is smart enough. Specifically, this entails knowing what tables can be joined with what other tables and pushing maximum processing to the RDBMS(s) involved in the query.&lt;/p&gt; &lt;p&gt;You can download the slide set I used for the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa1fb7e8&quot;&gt;Virtuoso&lt;/a&gt; presentation for the RDB to RDF mapping incubator group (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/Relational2RDF.ppt&quot; id=&quot;link-id106f9e88&quot;&gt;PPT&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id10a8dc90&quot;&gt;other formats&lt;/a&gt; coming soon). The main point is that real integration is hard and needs smart query splitting and optimization, as well as real understanding of the databases and subject matter from the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x17ee38a0&quot;&gt;information&lt;/a&gt; architect. Sometimes in the web space it can suffice to put data out there with trivial RDF translation and hope that a search engine or such will figure out how to join this with something else. For the enterprise, things are not so. Benefits are clear if one can navigate between disjoint silos but making this accurate enough for deriving business conclusions, as well as efficient enough for production, is a soluble and non-trivial question.&lt;/p&gt; &lt;p&gt;We will show the basics of this with the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x1844d718&quot;&gt;TPC-H&lt;/a&gt; mapping, and by joining this with physical triples. We will also make a set of TPC-H format table sets, make mappings between keys in one to keys in the other, and show joins between the two. The SPARQL querying of one such data store is a done deal, including the SPARQL extensions for this. There is even a demo paper, Business Intelligence Extensions for SPARQL (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/RDFAndMapped_BI.pdf&quot; id=&quot;link-id12ea4b18&quot;&gt;PDF&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id106e1810&quot;&gt;other formats&lt;/a&gt; coming soon), by us on the subject in the ESWC 2008 proceedings. If there is an issue left, it is just the technicality of always producing &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x17fc8d60&quot;&gt;SQL&lt;/a&gt; that looks hand-crafted and hence is better understood by the target RDBMS(s). For example, Oracle works better if one uses an &lt;code&gt;IN&lt;/code&gt; sub-query instead of the equivalent existence test.&lt;/p&gt; &lt;p&gt;Follow this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0xa9bcef8&quot;&gt;blog&lt;/a&gt; for more on the topic; published papers are always a limited view on the matter.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-06-11T13:15:39-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ESWC 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-06-09#1379</atom:id>
  <atom:published>2008-06-09T14:02:16Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;ESWC 2008&lt;/div&gt; &lt;p&gt;Yrjänä Rankka and I attended &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id10b7a038&quot;&gt;ESWC2008&lt;/a&gt; on behalf of OpenLink.&lt;/p&gt; &lt;p&gt;We were invited at the last minute to give a &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id105df758&quot;&gt;Linked Open Data&lt;/a&gt; talk at Paolo Bouquet&amp;#39;s Identity and Reference workshop. We also had a demo of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id12eacca0&quot;&gt;SPARQL&lt;/a&gt; BI (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/ESWC2008%20SPARQL%20BI%20OpenLink.ppt&quot; id=&quot;link-id10b43e58&quot;&gt;PPT&lt;/a&gt;); &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id1116d8f0&quot;&gt;other formats coming soon&lt;/a&gt;), our business intelligence extensions to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x16c9bfc8&quot;&gt;SPARQL&lt;/a&gt; as well as joining between relational &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10badc40&quot;&gt;data&lt;/a&gt; mapped to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id108edaf8&quot;&gt;RDF&lt;/a&gt; and native &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x181a5ed8&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x17e69910&quot;&gt;data&lt;/a&gt;. i was also speaking at the social networks panel chaired by Harry Halpin.&lt;/p&gt; &lt;p&gt;I have gathered a few impressions that I will share in the next few posts (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1375&quot; id=&quot;link-id107298e0&quot;&gt;1 - RDF Mapping&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id10b3a530&quot;&gt;2 - DARQ&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-id107290e0&quot;&gt;3 - voiD&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1378&quot; id=&quot;link-id1071a950&quot;&gt;4 - Paradigmata&lt;/a&gt;). &lt;i&gt;Caveat: This is not meant to be complete or impartial press coverage of the event but rather some quick comments on issues of personal/OpenLink interest. The fact that I do not mention something does not mean that it is unimportant.&lt;/i&gt; &lt;/p&gt; &lt;h2&gt;The voiD Graph&lt;/h2&gt; &lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1a87f110&quot;&gt;Linked Open Data&lt;/a&gt; was well represented, with Chris Bizer, Tom Heath, ourselves and many others. The great advance for &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id108f3c48&quot;&gt;LOD&lt;/a&gt; this time around is &lt;a href=&quot;http://community.linkeddata.org/MediaWiki/index.php?MetaLOD#Kick-off_meeting_at_ESWC08&quot; id=&quot;link-id10df9830&quot;&gt;voiD, the Vocabulary of Interlinked Datasets&lt;/a&gt;, a means to describe what in fact is inside the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1a089980&quot;&gt;LOD&lt;/a&gt; cloud, how to join it with what and so forth. Big time important if there is to be a &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-iddf74578&quot;&gt;web of federatable data sources&lt;/a&gt;, feeding directly into what we have been saying for a while about SPARQL end-point self-description and discovery. There is reasonable hope of having something by the date of &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id10dd0848&quot;&gt;Linked Data Planet&lt;/a&gt; in a couple of weeks.&lt;/p&gt; &lt;h2&gt;Federating&lt;/h2&gt; &lt;p&gt;Bastian Quilitz gave a talk about his &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id108746e8&quot;&gt;DARQ&lt;/a&gt;, a federated version of Jena&amp;#39;s ARQ.&lt;/p&gt; &lt;p&gt;Something like &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x1a2d9860&quot;&gt;DARQ&lt;/a&gt;&amp;#39;s optimization statistics should make their way into the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id10992348&quot;&gt;SPARQL protocol&lt;/a&gt; as well as the voiD data set description.&lt;/p&gt; &lt;p&gt;We really need federation but more on this in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id1059d688&quot;&gt;a separate post&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://xsparql.deri.ie/&quot; id=&quot;link-id10314308&quot;&gt;XSPARQL&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;Axel Polleres et al had a paper about &lt;a href=&quot;http://xsparql.deri.ie/&quot; id=&quot;link-id0x1ad77490&quot;&gt;XSPARQL&lt;/a&gt;, a merge of &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id10b98e90&quot;&gt;XQuery&lt;/a&gt; and SPARQL. While visiting DERI a couple of weeks back and again at the conference, we talked about OpenLink implementing the spec. It is evident that the engines must be in the same process and not communicate via the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x17e75190&quot;&gt;SPARQL protocol&lt;/a&gt; for this to be practical. We could do this. We&amp;#39;ll have to see when.&lt;/p&gt; &lt;p&gt;Politically, using &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id0x18a9bf10&quot;&gt;XQuery&lt;/a&gt; to give expressions and XML synthesis to SPARQL would be fitting. These things are needed anyhow, as surely as aggregation and sub-queries but the latter would not so readily come from XQuery. Some rapprochement between RDF and XML folks is desirable anyhow.&lt;/p&gt; &lt;h2&gt;Panel: Will the Sem Web Rise to the Challenge of the Social Web?&lt;/h2&gt; &lt;p&gt;The social web panel presented the question of whether the sem web was ready for prime time with data portability.&lt;/p&gt; &lt;p&gt;The main thrust was expressed in Harry Halpin&amp;#39;s rousing closing words: &amp;quot;Men will fight in a battle and lose a battle for a cause they believe in. Even if the battle is lost, the cause may come back and prevail, this time changed and under a different name. Thus, there may well come to be something like our &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id122f4da0&quot;&gt;semantic web&lt;/a&gt;, but it may not be the one we have worked all these years to build if we do not rise to the occasion before us right now.&amp;quot;&lt;/p&gt; &lt;p&gt;So, how to do this? Dan Brickley asked the audience how many supported, or were aware of, the latest Web 2.0 things, such as &lt;a href=&quot;http://dbpedia.org/page/OAuth&quot; id=&quot;link-idf300bc0&quot;&gt;OAuth&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/OpenID&quot; id=&quot;link-id10ce7a40&quot;&gt;OpenID&lt;/a&gt;. A few were. The general idea was that research (after all, this was a research event) should be more integrated and open to the world at large, not living at the &amp;quot;outdated pace&amp;quot; of a 3 year funding cycle. Stefan Decker of DERI acquiesced in principle. Of course there is impedance mismatch between specialization and interfacing with everything.&lt;/p&gt; &lt;p&gt;I said that triples and vocabularies existed, that OpenLink had &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id1210dbf8&quot;&gt;ODS&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id11076be8&quot;&gt;OpenLink Data Spaces&lt;/a&gt;, &lt;a href=&quot;http://community.linkeddata.org/&quot; id=&quot;link-id10d46710&quot;&gt;Community LinkedData&lt;/a&gt;) for managing one&amp;#39;s data-web presence, but that scale would be the next thing. Rather large scale even, with 100 gigatriples (Gtriples) reached before one even noticed. It takes a lot of PCs to host this, maybe $400K worth at today&amp;#39;s prices, without replication. Count 16G ram and a few cores per Gtriple so that one is not waiting for disk all the time.&lt;/p&gt; &lt;p&gt;The tricks that Web 2.0 silos do with app-specific data structures and app-specific partitioning do not really work for RDF without compromising the whole point of smooth schema evolution and tolerance of ragged data.&lt;/p&gt; &lt;p&gt;So, simple vocabularies, minimal inference, minimal blank nodes. Besides, note that the inference will have to be done at run time, not forward-chained at load time, if only because users will not agree on what sameAs and other declarations they want for their queries. Not to mention spam or malicious sameAs declarations!&lt;/p&gt; &lt;p&gt;As always, there was the question of business models for the open data web and for semantic technologies in general. As we see it, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id108b7688&quot;&gt;information&lt;/a&gt; overload is the factor driving the demand. Better contextuality will justify semantic technologies. Due to the large volumes and complex processing, a data-as-service model will arise. The data may be open, but its query infrastructure, cleaning, and keeping up-to-date, can be monetized as services.&lt;/p&gt; &lt;h2&gt;Identity and Reference&lt;/h2&gt; &lt;p&gt;For the identity and reference workshop, the ultimate question is metaphysical and has no single universal answer, even though people, ever since the dawn of time and earlier, have occupied themselves with the issue. Consequently, I started with the Genesis quote where Adam called things by &lt;i&gt;nominibus suis&lt;/i&gt;, off-hand implying that things would have some intrinsic ontologically-due names. This would be among the older references to the question, at least in widely known sources.&lt;/p&gt; &lt;p&gt;For present purposes, the consensus seemed to be that what would be considered the same as something else depended entirely on the application. What was similar enough to warrant a sameAs for cooking purposes might not warrant a sameAs for chemistry. In fact, complete and exact sameness for URIs would be very rare. So, instead of making generic weak similarity assertions like similarTo or seeAlso, one would choose a set of strong sameAs assertions and have these in effect for query answering if they were appropriate to the granularity demanded by the application.&lt;/p&gt; &lt;p&gt;Therefore sameAs is our permanent companion, and there will in time be malicious and spam sameAs. So, nothing much should be materialized on the basis of sameAs assertions in an &lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id10c4dfd0&quot;&gt;open world&lt;/a&gt;. For an app-specific warehouse, sameAs can be resolved at load time.&lt;/p&gt; &lt;p&gt;There was naturally some apparent tension between the Occam camp of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id105fd240&quot;&gt;entity&lt;/a&gt; name services and the LOD camp. I would say that the issue is more a perceived polarity than a real one. People will, inevitably, continue giving things names regardless of any centralized authority. Just look at natural language. But having a dictionary that is commonly accepted for established domains of discourse is immensely helpful.&lt;/p&gt; &lt;h2&gt;CYC and NLP&lt;/h2&gt; &lt;p&gt;The semantic search workshop was interesting, especially CYC&amp;#39;s presentation. CYC is, as it were, the grand old man of &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10568158&quot;&gt;knowledge&lt;/a&gt; representation. Over the long term, I would have support of the CYC inference language inside a database query processor. This would mostly be for repurposing the huge &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1acff9d0&quot;&gt;knowledge&lt;/a&gt; base for helping in search type queries. If it is for transactions or financial reporting, then queries will be &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id130a0a80&quot;&gt;SQL&lt;/a&gt; and make little or no use of any sort of inference. If it is for summarization or finding things, the opposite holds. For scaling, the issue is just making correct cardinality guesses for query planning, which is harder when inference is involved. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;I will also have a closer look at natural language one of these days, quite inevitably, since &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id10795828&quot;&gt;Zitgist&lt;/a&gt; (for example) is into &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x18a12918&quot;&gt;entity&lt;/a&gt; disambiguation.&lt;/p&gt; &lt;h2&gt;Scale&lt;/h2&gt; &lt;p&gt;Garlic gave a talk about their Data Patrol and QDOS. We agree that storing the data for these as triples instead of 1000 or so constantly changing relational tables could well make the difference between next-to-unmanageable and efficiently adaptive.&lt;/p&gt; &lt;p&gt;Garlic probably has the largest triple collection in constant online use to date. We will soon join them with our hosting of the whole LOD cloud and &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x17f18a38&quot;&gt;Sindice&lt;/a&gt;/&lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0x184e9e90&quot;&gt;Zitgist&lt;/a&gt; as triples.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;There is a mood to deliver applications. Consequently, scale remains a central, even the principal topic. So for now we make bigger centrally-managed databases. At the next turn around the corner we will have to turn to federation. The point here is that a planetary-scale, centrally-managed, online system can be made when the workload is uniform and anticipatable, but if it is free-form queries and complex analysis, we have a problem. So we move in the direction of federating and charging based on usage whenever the workload is more complex than making simple lookups now and then.&lt;/p&gt; &lt;p&gt;For the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1026ac28&quot;&gt;Virtuoso&lt;/a&gt; roadmap, this changes little. Next we make data sets available on Amazon EC2, as widely promised at ESWC. With big scale also comes rescaling and repartitioning, so this gets additional weight, as does further parallelizing of single user workloads. As it happens, the same medicine helps for both. At &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id0x17ff5c20&quot;&gt;Linked Data Planet&lt;/a&gt;, we will make more announcements.&lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-06-11T13:15:33-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>De Paradigmata and The Foundational Issues</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-06-09#1378</atom:id>
  <atom:published>2008-06-09T14:00:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;I thought that we had talked ourselves to exhaustion and beyond over the issue of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xa1684d90&quot;&gt;semantic web&lt;/a&gt; layer cake. Apparently not. There was a paper called &lt;i&gt;Functional Architecture for the Semantic Web&lt;/i&gt; by &lt;a href=&quot;http://gerberaj.googlepages.com/&quot; id=&quot;link-id106b8130&quot;&gt;Aurona Gerber&lt;/a&gt; et al at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1ce7f490&quot;&gt;ESWC2008&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The thrust of the matter was that for newcomers the layer cake was confusing and did not clearly indicate the architecture. Why, sure. My point is that no rearranging of the boxes will cut it for the general case.&lt;/p&gt; &lt;p&gt;Any diagram containing the boxes of the layer cake (i.e., &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x19d3bdf8&quot;&gt;URI&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/XML&quot; id=&quot;link-id0x19a89358&quot;&gt;XML&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1de67920&quot;&gt;SPARQL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0xa50c0e40&quot;&gt;OWL&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Rule_Interchange_Format&quot; id=&quot;link-id0x171be3b0&quot;&gt;RIF&lt;/a&gt;, Crypto, etc., etc.) in whatever order or arrangement can at best be a sort of overview of how these standards reference each other.&lt;/p&gt; &lt;p&gt;Such diagrams are a little like saying that a car combines the combustion properties of fuel/air mixes with the tension and compression resistance properties of metals and composites for producing motion and secondly links to Newton&amp;#39;s laws of motion and to aerodynamics.&lt;/p&gt; &lt;p&gt;Not false. But it does not say that a car is good for economical commute or showing off at the strip or any number of niches that a mature industry has grown to serve.&lt;/p&gt; &lt;p&gt;Now, talking of software engineering, modules and interfaces are good and even necessary. The trick is to know where to put the interface.&lt;/p&gt; &lt;p&gt;Such a thing cannot possibly be inferred from the standards&amp;#39; inter-reference picture. APIs, especially if these are Web service APIs, should go where there is low &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1aad9288&quot;&gt;data&lt;/a&gt; volume and tolerance for latency. For example, either inference is a preprocessing step or it is embedded right inside a SPARQL engine. Such a thing cannot be seen from the picture. Same for trust. Trust is not an after-thought at the top of the picture, except maybe in the sense of referring to the other parts.&lt;/p&gt; &lt;p&gt;We hear it over and over. Scale and speed are critical. Arrange the blocks of any real system as makes sense for data flow; do not confuse literature references with control or data structure.&lt;/p&gt; &lt;p&gt;The even-more foundational issue is the promotion of the general concept of a Web of Data.&lt;/p&gt; &lt;p&gt;The core idea that the Web would be a query-able collection of data with meaningful reference between data of different provenance cannot be inferred from the picture, even though this should be its primary message. Or it is better to say that the first picture shown should stress this idea and then one could leave the layer cake, in whatever version, for explaining the standards&amp;#39; order of evolution or inter-reference.&lt;/p&gt; &lt;p&gt;So, the value proposition:&lt;/p&gt; &lt;p&gt;Why? Explosion of data volume, increased need of keeping up-to-date, increasing opportunity cost of not keeping in real time.&lt;/p&gt; &lt;p&gt;What? An architecture that is designed for unanticipated joining and evolution of data across heterogeneous sources, either at Web or enterprise scale.&lt;/p&gt; &lt;p&gt;How? URI everything and everything is cool, or, give things global names. Use &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1ae09b88&quot;&gt;RDF&lt;/a&gt;. Reuse names or ontologies where can. (An ontology is a set of classes and property names plus some more.) Map relational data on the fly or store as RDF, whichever works. Query with SPARQL, easier than &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1ab0b5e0&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, my challenge for the graphics people would be to make an illustration of the above. Forget the alphabet soup. Show the layer cake as a historical reference or literature guide. Do not imply that this proliferation of boxes equates to an equal proliferation of Web services, for example.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T15:54:42-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>voiD, or Will the LOD Cloud Bring Rain?</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-06-09#1377</atom:id>
  <atom:published>2008-06-09T13:58:41Z</atom:published>
  <atom:content type="html">&lt;p&gt;At &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1d07a490&quot;&gt;ESWC2008&lt;/a&gt;, we saw the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xa288f548&quot;&gt;Linked Open Data&lt;/a&gt; Cloud condense its first drops of precipitation.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/MediaWiki/index.php?MetaLOD#Kick-off_meeting_at_ESWC08&quot; id=&quot;link-id106ee858&quot;&gt;voiD, Vocabulary of Interlinked Datasets&lt;/a&gt;, is an idea whose time has clearly come. By the end of the conference, many speakers had already adopted the &lt;a href=&quot;http://dbpedia.org/resource/Meme&quot; id=&quot;link-id0x171cb518&quot;&gt;meme&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The point is to describe what is inside the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1ce412a0&quot;&gt;data&lt;/a&gt; sets. People may know this from having worked with the sets or from putting them together but to an outsider this is not evident.&lt;/p&gt; &lt;p&gt;The Semantic Sitemap says where there are files or end points for access. But it does not say what is inside these. Also for federation, it is important to be able to determine whether it makes sense to send a particular query to a particular end point.&lt;/p&gt; &lt;p&gt;If we play this right, this is what voiD will provide. I have to think of Dan Simmons&amp;#39; flamboyant Hyperion sci-fi series where the &amp;quot;void which binds&amp;quot; was a sort of hyperspace containing the thoughts of entities, past and present and even provided teleportation.&lt;/p&gt; &lt;p&gt;So what does the voiD hold, aside infinite potentialities?&lt;/p&gt; &lt;p&gt;The obvious part is DC-like provenance, version, authorship, license and such data set wide &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0xa04eb368&quot;&gt;information&lt;/a&gt;. Also the subject matter could be classified by reference to &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x19a96a00&quot;&gt;UMBEL&lt;/a&gt; or the &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id0x1ce30fe8&quot;&gt;Yago&lt;/a&gt; classification of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1ced78a0&quot;&gt;DBpedia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;More is needed, though. The simple part is listing the ontologies, if any. Also a set of namespaces would be an idea but this could be very large.&lt;/p&gt; &lt;p&gt;So let us look at what we&amp;#39;d like to be able to answer with the voiD set.&lt;/p&gt; &lt;p&gt;The below could be a sample of voiD questions?&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What subjects are in the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x1a623bd8&quot;&gt;LOD&lt;/a&gt; cloud?&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id0x1712a638&quot;&gt;URI&lt;/a&gt;, what set in the LOD cloud can tell me more?&lt;/i&gt; This is divided into asking a text index like &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x9f815570&quot;&gt;Sindice&lt;/a&gt; for the location, getting the namespace or data set and then querying voiD.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What need I federate/load in order to combine all that is reachable from a given vocabulary?&lt;/i&gt; There could be for example a graph showing the data sets and edges between them, edges being qualified by a set of same as assertions, itself a voiD described set, if translations were needed.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;What sets are from the same or equally trusted publisher as this one?&lt;/i&gt; &lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;These things are roughly divided into description of the set and then some details on how it is stored on a given end point.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, in which other sets will I find use of the same URIs?&lt;/i&gt; For example, if I have language version x, I wish to know that language version y will have the same URIs insofar the things meant are the same.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, which sets of same as assertions will I have for mapping to which other sets?&lt;/i&gt; For example, if I have &lt;a href=&quot;http://www.geonames.org/&quot; id=&quot;link-id0x1ce04288&quot;&gt;Geonames&lt;/a&gt;, I wish to know that set x will map at least some of the URIs in Geonames to DBpedia URIs.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Let me further point out that it is increasingly clear to the community that universal sameAs is dubious, hence sameAs assertions ought to be kept separate and included or excluded depending on the usage context.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Given this set, what are the interesting queries I can do?&lt;/i&gt; This is a sort of advertisement for human consumption. This is not a list of queries for crashing the end point. Denial of service can be done in &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x19a887f8&quot;&gt;SPARQL&lt;/a&gt; without knowing the end point content anyhow, so this is not an added risk exposer.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Vocabularies used.&lt;/i&gt; This is a reference to the OWL or RDFS resources giving the applicable ontologies, if present. Also, a complete list of classes whose direct instances actually occur in the set is useful.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;i&gt;Ballpark cardinality.&lt;/i&gt; Something like a &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x19a1fa10&quot;&gt;DARQ&lt;/a&gt; optimization profile would be a good idea. I would say that there should be a possibility of just including a DARQ description file as is. This is a sort of baseline and since it already exist, we are spared the committee trouble of figuring out what it ought to contain and what not. If we start defining this from scratch, it will take long. Further, let this be optional. Quite Independently of this, query processors may make optimization related queries to remote end points insofar the specific end point supports these. This will come in time. For now, just the basics.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Along with this, LOD SPARQL end points could adopt a couple of basic conventions. The simplest would be to agree that each would host a graph with a given URI that would contain the voiD descriptions of the data sets contained, along with the graph URI used for each set, if different from the publisher&amp;#39;s URI for the graph. There is a point to this since an end point may load multiple data sets into one graph.&lt;/p&gt; &lt;p&gt;We hope to have a good idea of the matter in a couple of weeks, certainly a general statement of direction to be published at &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id0x1a8f7d40&quot;&gt;Linked Data Planet&lt;/a&gt; in a couple of weeks.&lt;/p&gt;</atom:content>
  <atom:updated>2015-08-20T17:14:17.124682-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>The DARQ Matter of Federation</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-06-09#1376</atom:id>
  <atom:published>2008-06-09T13:57:30Z</atom:published>
  <atom:content type="html">&lt;p&gt;Astronomers propose that the universe is held together, so to speak, by the gravity of invisible &amp;quot;dark matter&amp;quot; spread in interstellar and intergalactic space.&lt;/p&gt; &lt;p&gt;For the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x19bbd830&quot;&gt;data&lt;/a&gt; web, it will be held together by federation, also an invisible factor. As in Minkowski space, so in &lt;a href=&quot;http://dbpedia.org/resource/Cyberspace&quot; id=&quot;link-id0x19af2488&quot;&gt;cyberspace&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;To take the astronomical analogy further, putting too much visible stuff in one place makes a black hole, whose chief properties are that it is very heavy, can only get heavier and that nothing comes out.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x19b7a9c8&quot;&gt;DARQ&lt;/a&gt; is Bastian Quilitz&amp;#39;s federated extension of the &lt;a href=&quot;http://jena.sourceforge.net/&quot; id=&quot;link-id0x19ce3da0&quot;&gt;Jena&lt;/a&gt; &lt;a href=&quot;http://jena.sourceforge.net/ARQ/&quot; id=&quot;link-id0xa569a258&quot;&gt;ARQ&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1a8d2270&quot;&gt;SPARQL&lt;/a&gt; processor. It has existed for a while and was also presented at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x1aad1d00&quot;&gt;ESWC2008&lt;/a&gt;. There is also SPARQL FED from Andy Seaborne, an explicit means of specifying which end point will process which fragment of a distributed SPARQL query. Still, for federation to deliver in an open, decentralized world, it must be transparent. For a specific application, with a predictable workload, it is of course OK to partition queries explicitly.&lt;/p&gt; &lt;p&gt;Bastian had split &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1a8ac770&quot;&gt;DBpedia&lt;/a&gt; among five &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x19601d30&quot;&gt;Virtuoso&lt;/a&gt; servers and was querying this set with DARQ. The end result was that there was a rather frightful cost of federation as opposed to all the data residing in a single Virtuoso. The other result was that if selectivity of predicates was not correctly guessed by the federation engine, the proposition was a non-starter. With correct join order it worked, though.&lt;/p&gt; &lt;p&gt;Yet, we really want federation. Looking further down the road, we simply must make federation work. This is just as necessary as running on a server cluster for mid-size workloads.&lt;/p&gt; &lt;p&gt;Since we are convinced of the cause, let&amp;#39;s talk about the means.&lt;/p&gt; &lt;p&gt;For DARQ as it now stands, there&amp;#39;s probably an order of magnitude or even more to gain from a couple of simple tricks. If going to a SPARQL end point that is not the outermost in the loop join sequence, batch the requests together in one &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x19b94818&quot;&gt;HTTP&lt;/a&gt;/1.1 message. So, if the query is &amp;quot;get me my friends living in cities of over a million people,&amp;quot; there will be the fragment &amp;quot;get city where x lives&amp;quot; and later &amp;quot;ask if population of x greater than 1000000&amp;quot;. If I have 100 friends, I send the 100 requests in a batch to each eligible server.&lt;/p&gt; &lt;p&gt;Further, if running against a server of known brand, use a client-server connection and prepared statements with array parameters. This can well improve the processing speed at the remote end point by another order of magnitude. This gain may however not be as great as the latency savings from message batching. We will provide a sample of how to do this with Virtuoso over &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0x17822258&quot;&gt;JDBC&lt;/a&gt; so Bastian can try this if interested.&lt;/p&gt; &lt;p&gt;These simple things will give a lot of mileage and may even decide whether federation is an option in specific applications. For the open web however, these measures will not yet win the day.&lt;/p&gt; &lt;p&gt;When federating &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x1a651628&quot;&gt;SQL&lt;/a&gt;, colocation of data is sort of explicit. If two tables are joined and they are in the same source, then the join can go to the source. For SPARQL this is also so but with a twist:&lt;/p&gt; &lt;p&gt;If a foaf:Person is found on a given server, this does not mean that the Person&amp;#39;s geek code or email hash will be on the same server. Thus &lt;code&gt;{?p name &amp;quot;Johnny&amp;quot; . ?p geekCode ?g . ?p emailHash ?h }&lt;/code&gt; does not necessarily denote a colocated join if many servers serve items of the vocabulary.&lt;/p&gt; &lt;p&gt;However, in most practical cases, for obtaining a rapid answer, treating this as a colocated fragment will be appropriate. Thus, it may be necessary to be able to declare that geek codes will be assumed colocated with names. This will save a lot of message passing and offer decent, if not theoretically total recall. For search style applications, starting with such assumptions will make sense. If nothing is found, then we can partition each join step separately for the unlikely case that there were a server that gave geek codes but not names.&lt;/p&gt; &lt;p&gt;For Virtuoso, we find that a federated query&amp;#39;s asynchronous, parallel evaluation model is not so different from that on a local cluster. So the cluster version could have the option of federated query. The difference is that a cluster is local and tightly coupled and predictably partitioned but a federated setting is none of these.&lt;/p&gt; &lt;p&gt;For description, we would take DARQ&amp;#39;s description model and maybe extend it a little where needed. Also we would enhance the protocol to allow just asking for the query cost estimate given a query with literals specified. We will do this eventually.&lt;/p&gt; &lt;p&gt;We would like to talk to Bastian about large improvements to DARQ, specially when working with Virtuoso. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;Of course, one mode of federating is the crawl-as-you-go approach of the Virtuoso &lt;a href=&quot;http://virtuoso.openlinksw.com/Whitepapers/html/VirtSpongerWhitePaper.html&quot; id=&quot;link-id0x1dddce48&quot;&gt;Sponger&lt;/a&gt;. This will bring in fragments following seeAlso or sameAs declarations or other references. This will however not have the recall of a warehouse or federation over well described SPARQL end-points. But up to a certain volume it has the speed of local storage.&lt;/p&gt; &lt;p&gt;The emergence of voiD (Vocabulary of Interlinked Data) is a step in the direction of making federation a reality. There is &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-id1109a4c8&quot;&gt;a separate post&lt;/a&gt; about this.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T15:15:00-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Aspects of RDF to RDF Mapping</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-06-09#1375</atom:id>
  <atom:published>2008-06-09T13:52:20Z</atom:published>
  <atom:content type="html">&lt;p&gt;The W3C has recently launched an &lt;a href=&quot;http://www.w3.org/2005/Incubator/rdb2rdf/&quot; id=&quot;link-idd763f48&quot;&gt;incubator group about mapping relational data to RDF&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;From participating in the group for the few initial sessions, I get the following impressions.&lt;/p&gt; &lt;p&gt;There is a segment of users, for example from the biomedical community, who do heavy duty &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1b388bf0&quot;&gt;data&lt;/a&gt; integration and look to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1a24b198&quot;&gt;RDF&lt;/a&gt; for managing complexity. Unifying heterogeneous data under OWL ontologies, reasoning, and data integrity, are points of interest.&lt;/p&gt; &lt;p&gt;There is another segment that is concerned with semantifying the document web, which topic includes initiatives such as &lt;a href=&quot;http://triplify.org/&quot; id=&quot;link-id0x16cb5c48&quot;&gt;Triplify&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1adcd2b8&quot;&gt;semantic web&lt;/a&gt; search such as &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x1a462ee0&quot;&gt;Sindice&lt;/a&gt;. The emphasis there is on minimizing entry cost and creating critical mass. The next one to come will clean up the semantics, if these need be cleaned up at all.&lt;/p&gt; &lt;p&gt;(Some cleanup is taking place with &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id0x17faa940&quot;&gt;Yago&lt;/a&gt; and &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0x1acd23f0&quot;&gt;Zitgist&lt;/a&gt;, but this is a matter for a different post.)&lt;/p&gt; &lt;p&gt;Thus, technically speaking, the mapping landscape is diverse, but ETL (extract-transform-load) seems to predominate. The biomedical people make data warehouses for answering specific questions. The web people are interested in putting data out in the expectation that the next player will warehouse it and allow running complex meshups against the whole of the RDF-ized web.&lt;/p&gt; &lt;p&gt;As one would expect, these groups see different issues and needs. Roughly speaking, one is about quality and structure and the other is about volume.&lt;/p&gt; &lt;p&gt;Where do we stand?&lt;/p&gt; &lt;p&gt;We are with the research data warehousers in saying that the mapping question is very complex and that it would indeed be nice to bypass ETL and go to the source &lt;a href=&quot;http://dbpedia.org/resource/Relational_database_management_system&quot; id=&quot;link-id0x17f28d60&quot;&gt;RDBMS&lt;/a&gt;(s) on demand. Projects in this direction are ongoing.&lt;/p&gt; &lt;p&gt;We are with the web people in building large RDF stores with scalable query answering for arbitrary RDF, for example, hosting a lot of the Linking Open Data sets, and working with Zitgist.&lt;/p&gt; &lt;p&gt;These things are somewhat different.&lt;/p&gt; &lt;p&gt;At present, both the research warehousers and the web scalers predominantly go for ETL.&lt;/p&gt; &lt;p&gt;This is fine by us as we definitely are in the large RDF store race.&lt;/p&gt; &lt;p&gt;Still, mapping has its point. A relational store will perform quite a bit faster than a quad store if it has the right covering indices or application-specific compressed columnar layout. Thus, there is nothing to block us from querying analytics in &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1a2c81c8&quot;&gt;SPARQL&lt;/a&gt;, once the obviously necessary extensions of sub-query, expressions and aggregation are in place.&lt;/p&gt; &lt;p&gt;To cite an example, the Ordnance Survey of the UK has a GIS system running on &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x18a82010&quot;&gt;Oracle&lt;/a&gt; with an entry pretty much for each mailbox, lamp post, and hedgerow in the country. According to Ordnance Survey, this would be 1 petatriple, 1e15 triples. &amp;quot;Such a big server farm that we&amp;#39;d have to put it on our map,&amp;quot; as Jenny Harding put it at &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id0x16533418&quot;&gt;ESWC2008&lt;/a&gt;. I&amp;#39;d add that an even bigger map entry would be the power plant needed to run the 100,000 or so PCs this would take. This is counting 10 gigatriples per PC, which would not even give very good working sets.&lt;/p&gt; &lt;p&gt;So, on-the-fly RDBMS-to-RDF mapping in some cases is simply necessary. Still, the benefits of RDF for integration can be preserved if the translation middleware is smart enough. Specifically, this entails knowing what tables can be joined with what other tables and pushing maximum processing to the RDBMS(s) involved in the query.&lt;/p&gt; &lt;p&gt;You can download the slide set I used for the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x16c57ed0&quot;&gt;Virtuoso&lt;/a&gt; presentation for the RDB to RDF mapping incubator group (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/Relational2RDF.ppt&quot; id=&quot;link-id106f9e88&quot;&gt;PPT&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id10a8dc90&quot;&gt;other formats&lt;/a&gt; coming soon). The main point is that real integration is hard and needs smart query splitting and optimization, as well as real understanding of the databases and subject matter from the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id0x1b132910&quot;&gt;information&lt;/a&gt; architect. Sometimes in the web space it can suffice to put data out there with trivial RDF translation and hope that a search engine or such will figure out how to join this with something else. For the enterprise, things are not so. Benefits are clear if one can navigate between disjoint silos but making this accurate enough for deriving business conclusions, as well as efficient enough for production, is a soluble and non-trivial question.&lt;/p&gt; &lt;p&gt;We will show the basics of this with the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x17fc7b58&quot;&gt;TPC-H&lt;/a&gt; mapping, and by joining this with physical triples. We will also make a set of TPC-H format table sets, make mappings between keys in one to keys in the other, and show joins between the two. The SPARQL querying of one such data store is a done deal, including the SPARQL extensions for this. There is even a demo paper, Business Intelligence Extensions for SPARQL (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/RDFAndMapped_BI.pdf&quot; id=&quot;link-id12ea4b18&quot;&gt;PDF&lt;/a&gt;; &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id106e1810&quot;&gt;other formats&lt;/a&gt; coming soon), by us on the subject in the ESWC 2008 proceedings. If there is an issue left, it is just the technicality of always producing &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x18439b70&quot;&gt;SQL&lt;/a&gt; that looks hand-crafted and hence is better understood by the target RDBMS(s). For example, Oracle works better if one uses an &lt;code&gt;IN&lt;/code&gt; sub-query instead of the equivalent existence test.&lt;/p&gt; &lt;p&gt;Follow this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x16c29ea0&quot;&gt;blog&lt;/a&gt; for more on the topic; published papers are always a limited view on the matter.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T13:15:19.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ESWC 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-06-09#1374</atom:id>
  <atom:published>2008-06-09T13:49:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;Yrjänä Rankka and I attended &lt;a href=&quot;http://www.eswc2008.org/&quot; id=&quot;link-id10b7a038&quot;&gt;ESWC2008&lt;/a&gt; on behalf of OpenLink.&lt;/p&gt; &lt;p&gt;We were invited at the last minute to give a &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id105df758&quot;&gt;Linked Open Data&lt;/a&gt; talk at Paolo Bouquet&amp;#39;s Identity and Reference workshop. We also had a demo of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id12eacca0&quot;&gt;SPARQL&lt;/a&gt; BI (&lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations/ESWC2008%20SPARQL%20BI%20OpenLink.ppt&quot; id=&quot;link-id10b43e58&quot;&gt;PPT&lt;/a&gt;); &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VirtPresentations&quot; id=&quot;link-id1116d8f0&quot;&gt;other formats coming soon&lt;/a&gt;), our business intelligence extensions to &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1843a368&quot;&gt;SPARQL&lt;/a&gt; as well as joining between relational &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10badc40&quot;&gt;data&lt;/a&gt; mapped to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id108edaf8&quot;&gt;RDF&lt;/a&gt; and native &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1843a3b0&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1843a3c8&quot;&gt;data&lt;/a&gt;. i was also speaking at the social networks panel chaired by Harry Halpin.&lt;/p&gt; &lt;p&gt;I have gathered a few impressions that I will share in the next few posts (&lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1375&quot; id=&quot;link-id107298e0&quot;&gt;1 - RDF Mapping&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id10b3a530&quot;&gt;2 - DARQ&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-id107290e0&quot;&gt;3 - voiD&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1378&quot; id=&quot;link-id1071a950&quot;&gt;4 - Paradigmata&lt;/a&gt;). &lt;i&gt;Caveat: This is not meant to be complete or impartial press coverage of the event but rather some quick comments on issues of personal/OpenLink interest. The fact that I do not mention something does not mean that it is unimportant.&lt;/i&gt; &lt;/p&gt; &lt;h2&gt;The voiD Graph&lt;/h2&gt; &lt;p&gt; &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x16c781e0&quot;&gt;Linked Open Data&lt;/a&gt; was well represented, with Chris Bizer, Tom Heath, ourselves and many others. The great advance for &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id108f3c48&quot;&gt;LOD&lt;/a&gt; this time around is &lt;a href=&quot;http://community.linkeddata.org/MediaWiki/index.php?MetaLOD#Kick-off_meeting_at_ESWC08&quot; id=&quot;link-id10df9830&quot;&gt;voiD, the Vocabulary of Interlinked Datasets&lt;/a&gt;, a means to describe what in fact is inside the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x16c78228&quot;&gt;LOD&lt;/a&gt; cloud, how to join it with what and so forth. Big time important if there is to be a &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1377&quot; id=&quot;link-iddf74578&quot;&gt;web of federatable data sources&lt;/a&gt;, feeding directly into what we have been saying for a while about SPARQL end-point self-description and discovery. There is reasonable hope of having something by the date of &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id10dd0848&quot;&gt;Linked Data Planet&lt;/a&gt; in a couple of weeks.&lt;/p&gt; &lt;h2&gt;Federating&lt;/h2&gt; &lt;p&gt;Bastian Quilitz gave a talk about his &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id108746e8&quot;&gt;DARQ&lt;/a&gt;, a federated version of Jena&amp;#39;s ARQ.&lt;/p&gt; &lt;p&gt;Something like &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0x16c782e8&quot;&gt;DARQ&lt;/a&gt;&amp;#39;s optimization statistics should make their way into the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id10992348&quot;&gt;SPARQL protocol&lt;/a&gt; as well as the voiD data set description.&lt;/p&gt; &lt;p&gt;We really need federation but more on this in &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1376&quot; id=&quot;link-id1059d688&quot;&gt;a separate post&lt;/a&gt;.&lt;/p&gt; &lt;h2&gt; &lt;a href=&quot;http://xsparql.deri.ie/&quot; id=&quot;link-id10314308&quot;&gt;XSPARQL&lt;/a&gt; &lt;/h2&gt; &lt;p&gt;Axel Polleres et al had a paper about &lt;a href=&quot;http://xsparql.deri.ie/&quot; id=&quot;link-id0x1a2d8458&quot;&gt;XSPARQL&lt;/a&gt;, a merge of &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id10b98e90&quot;&gt;XQuery&lt;/a&gt; and SPARQL. While visiting DERI a couple of weeks back and again at the conference, we talked about OpenLink implementing the spec. It is evident that the engines must be in the same process and not communicate via the &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-protocol/&quot; id=&quot;link-id0x1d99c1d0&quot;&gt;SPARQL protocol&lt;/a&gt; for this to be practical. We could do this. We&amp;#39;ll have to see when.&lt;/p&gt; &lt;p&gt;Politically, using &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id0x1acae1f0&quot;&gt;XQuery&lt;/a&gt; to give expressions and XML synthesis to SPARQL would be fitting. These things are needed anyhow, as surely as aggregation and sub-queries but the latter would not so readily come from XQuery. Some rapprochement between RDF and XML folks is desirable anyhow.&lt;/p&gt; &lt;h2&gt;Panel: Will the Sem Web Rise to the Challenge of the Social Web?&lt;/h2&gt; &lt;p&gt;The social web panel presented the question of whether the sem web was ready for prime time with data portability.&lt;/p&gt; &lt;p&gt;The main thrust was expressed in Harry Halpin&amp;#39;s rousing closing words: &amp;quot;Men will fight in a battle and lose a battle for a cause they believe in. Even if the battle is lost, the cause may come back and prevail, this time changed and under a different name. Thus, there may well come to be something like our &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id122f4da0&quot;&gt;semantic web&lt;/a&gt;, but it may not be the one we have worked all these years to build if we do not rise to the occasion before us right now.&amp;quot;&lt;/p&gt; &lt;p&gt;So, how to do this? Dan Brickley asked the audience how many supported, or were aware of, the latest Web 2.0 things, such as &lt;a href=&quot;http://dbpedia.org/page/OAuth&quot; id=&quot;link-idf300bc0&quot;&gt;OAuth&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/page/OpenID&quot; id=&quot;link-id10ce7a40&quot;&gt;OpenID&lt;/a&gt;. A few were. The general idea was that research (after all, this was a research event) should be more integrated and open to the world at large, not living at the &amp;quot;outdated pace&amp;quot; of a 3 year funding cycle. Stefan Decker of DERI acquiesced in principle. Of course there is impedance mismatch between specialization and interfacing with everything.&lt;/p&gt; &lt;p&gt;I said that triples and vocabularies existed, that OpenLink had &lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id1210dbf8&quot;&gt;ODS&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/OpenLink_Data_Spaces&quot; id=&quot;link-id11076be8&quot;&gt;OpenLink Data Spaces&lt;/a&gt;, &lt;a href=&quot;http://community.linkeddata.org/&quot; id=&quot;link-id10d46710&quot;&gt;Community LinkedData&lt;/a&gt;) for managing one&amp;#39;s data-web presence, but that scale would be the next thing. Rather large scale even, with 100 gigatriples (Gtriples) reached before one even noticed. It takes a lot of PCs to host this, maybe $400K worth at today&amp;#39;s prices, without replication. Count 16G ram and a few cores per Gtriple so that one is not waiting for disk all the time.&lt;/p&gt; &lt;p&gt;The tricks that Web 2.0 silos do with app-specific data structures and app-specific partitioning do not really work for RDF without compromising the whole point of smooth schema evolution and tolerance of ragged data.&lt;/p&gt; &lt;p&gt;So, simple vocabularies, minimal inference, minimal blank nodes. Besides, note that the inference will have to be done at run time, not forward-chained at load time, if only because users will not agree on what sameAs and other declarations they want for their queries. Not to mention spam or malicious sameAs declarations!&lt;/p&gt; &lt;p&gt;As always, there was the question of business models for the open data web and for semantic technologies in general. As we see it, &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id108b7688&quot;&gt;information&lt;/a&gt; overload is the factor driving the demand. Better contextuality will justify semantic technologies. Due to the large volumes and complex processing, a data-as-service model will arise. The data may be open, but its query infrastructure, cleaning, and keeping up-to-date, can be monetized as services.&lt;/p&gt; &lt;h2&gt;Identity and Reference&lt;/h2&gt; &lt;p&gt;For the identity and reference workshop, the ultimate question is metaphysical and has no single universal answer, even though people, ever since the dawn of time and earlier, have occupied themselves with the issue. Consequently, I started with the Genesis quote where Adam called things by &lt;i&gt;nominibus suis&lt;/i&gt;, off-hand implying that things would have some intrinsic ontologically-due names. This would be among the older references to the question, at least in widely known sources.&lt;/p&gt; &lt;p&gt;For present purposes, the consensus seemed to be that what would be considered the same as something else depended entirely on the application. What was similar enough to warrant a sameAs for cooking purposes might not warrant a sameAs for chemistry. In fact, complete and exact sameness for URIs would be very rare. So, instead of making generic weak similarity assertions like similarTo or seeAlso, one would choose a set of strong sameAs assertions and have these in effect for query answering if they were appropriate to the granularity demanded by the application.&lt;/p&gt; &lt;p&gt;Therefore sameAs is our permanent companion, and there will in time be malicious and spam sameAs. So, nothing much should be materialized on the basis of sameAs assertions in an &lt;a href=&quot;http://dbpedia.org/resource/Open_world_assumption&quot; id=&quot;link-id10c4dfd0&quot;&gt;open world&lt;/a&gt;. For an app-specific warehouse, sameAs can be resolved at load time.&lt;/p&gt; &lt;p&gt;There was naturally some apparent tension between the Occam camp of &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id105fd240&quot;&gt;entity&lt;/a&gt; name services and the LOD camp. I would say that the issue is more a perceived polarity than a real one. People will, inevitably, continue giving things names regardless of any centralized authority. Just look at natural language. But having a dictionary that is commonly accepted for established domains of discourse is immensely helpful.&lt;/p&gt; &lt;h2&gt;CYC and NLP&lt;/h2&gt; &lt;p&gt;The semantic search workshop was interesting, especially CYC&amp;#39;s presentation. CYC is, as it were, the grand old man of &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10568158&quot;&gt;knowledge&lt;/a&gt; representation. Over the long term, I would have support of the CYC inference language inside a database query processor. This would mostly be for repurposing the huge &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x17f7dd40&quot;&gt;knowledge&lt;/a&gt; base for helping in search type queries. If it is for transactions or financial reporting, then queries will be &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id130a0a80&quot;&gt;SQL&lt;/a&gt; and make little or no use of any sort of inference. If it is for summarization or finding things, the opposite holds. For scaling, the issue is just making correct cardinality guesses for query planning, which is harder when inference is involved. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;I will also have a closer look at natural language one of these days, quite inevitably, since &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id10795828&quot;&gt;Zitgist&lt;/a&gt; (for example) is into &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id0x1a2c8bd0&quot;&gt;entity&lt;/a&gt; disambiguation.&lt;/p&gt; &lt;h2&gt;Scale&lt;/h2&gt; &lt;p&gt;Garlic gave a talk about their Data Patrol and QDOS. We agree that storing the data for these as triples instead of 1000 or so constantly changing relational tables could well make the difference between next-to-unmanageable and efficiently adaptive.&lt;/p&gt; &lt;p&gt;Garlic probably has the largest triple collection in constant online use to date. We will soon join them with our hosting of the whole LOD cloud and &lt;a href=&quot;http://sindice.org/&quot; id=&quot;link-id0x1b383720&quot;&gt;Sindice&lt;/a&gt;/&lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id0x1b383738&quot;&gt;Zitgist&lt;/a&gt; as triples.&lt;/p&gt; &lt;h2&gt;Conclusions&lt;/h2&gt; &lt;p&gt;There is a mood to deliver applications. Consequently, scale remains a central, even the principal topic. So for now we make bigger centrally-managed databases. At the next turn around the corner we will have to turn to federation. The point here is that a planetary-scale, centrally-managed, online system can be made when the workload is uniform and anticipatable, but if it is free-form queries and complex analysis, we have a problem. So we move in the direction of federating and charging based on usage whenever the workload is more complex than making simple lookups now and then.&lt;/p&gt; &lt;p&gt;For the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id1026ac28&quot;&gt;Virtuoso&lt;/a&gt; roadmap, this changes little. Next we make data sets available on Amazon EC2, as widely promised at ESWC. With big scale also comes rescaling and repartitioning, so this gets additional weight, as does further parallelizing of single user workloads. As it happens, the same medicine helps for both. At &lt;a href=&quot;http://www.linkeddataplanet.com/&quot; id=&quot;link-id0x1a2c7eb0&quot;&gt;Linked Data Planet&lt;/a&gt;, we will make more announcements.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-11T13:15:11.000008-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Reasoning Matters Contd</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-06#1373</atom:id>
  <atom:published>2008-06-06T18:29:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;I just stumbled across a post titled: &lt;a href=&quot;http://clarkparsia.com/weblog/2008/06/06/why-reasoning-matters-consistency-checking/&quot; id=&quot;link-id11003f00&quot;&gt;Why Reasoning Matters: Consistency Checking&lt;/a&gt; from &lt;a href=&quot;http://clarkparsia.com/about&quot; id=&quot;link-id137e8bc0&quot;&gt;Clark and Parsia&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As you can see from my recent post about how we&amp;#39;ve started the process of &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1372&quot; id=&quot;link-id100b7d20&quot;&gt;inoculating DBpedia against the potential dangers of &amp;quot;contextual incoherence&amp;quot;&lt;/a&gt;, we are entering a newer era in the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id106c35e0&quot;&gt;Semantic Web&lt;/a&gt;&amp;#39;s evolution. My post and the one from Clark &amp;amp; Parsia both touch different aspects of the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Dictionary&amp;quot; for the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x9d80080&quot;&gt;Semantic Web&lt;/a&gt; issue.&lt;/p&gt; &lt;p&gt;Note: in my universe of discourse, a Data Dictionary manifests when the constraints and class hierarchies defined in an ontology (e.g. a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;web&lt;/a&gt; accessible shared ontology) are functionally bound to a data manager. Interestingly the binding can take the following forms:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Engine Hosted - which is what you get with &lt;a href=&quot;http://docs.openlinksw.com:80/virtuoso/rdfsparqlrule.html#rdfsparqlruleintro&quot; id=&quot;link-id105c4408&quot;&gt;Virtuoso&amp;#39;s in-built Inference Engine&lt;/a&gt; &lt;/li&gt; &lt;li&gt;External - which is what you get when the Inference Engine is a distinct component from the data manager (example: &lt;a href=&quot;http://pellet.owldl.org/owlgres&quot; id=&quot;link-id13fa37f8&quot;&gt;Owlgres&lt;/a&gt; which can sit in front of 3rd party &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id107127e8&quot;&gt;SPARQL&lt;/a&gt; endpoints via ARQ)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The classification terminology I use above is very much off-the-cuff, its sole purpose is architectural distinction.&lt;/p&gt; &lt;p&gt;Anyway, it&amp;#39;s really nice to see that we are entering an era re. the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot;&gt;Semantic Web&lt;/a&gt; vision, where the virtues of reasoning are getting simpler to demonstrate and articulate.&lt;/p&gt; &lt;p&gt;In a nutshell, the point-point data integration era is coming to an end! The era of intelligent ontology based enterprise data integration is nigh!&lt;/p&gt; &lt;p&gt;Of course, there is much more to come on the practical utility front, so stay tuned as we work our way through the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10424078&quot;&gt;DBpedia&lt;/a&gt; inoculation program.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-06T14:38:54-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia receives shot #1 of CLASSiness vaccine</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-05#1372</atom:id>
  <atom:published>2008-06-05T17:11:34Z</atom:published>
  <atom:content type="html">&lt;p&gt; The current live instance of &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id107c7b60&quot;&gt;DBpedia&lt;/a&gt; has just received dose #1 of a series of planned &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10d3ec78&quot;&gt;Context&lt;/a&gt;&amp;quot; oriented booster shots. These shots seek to to protect &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id143648f0&quot;&gt;DBpedia&lt;/a&gt; from contextual incoherence as it grows in &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; set expanse and popularity. Dose #1 (vaccine label: &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id16d497d0&quot;&gt;Yago&lt;/a&gt;) equips &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id13f90120&quot;&gt;DBpedia&lt;/a&gt; with a functional (albeit non exclusive) Data Dictionary component courtesy of the &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id10509a08&quot;&gt;Yago&lt;/a&gt; Class Hierarchy .&lt;/p&gt; &lt;p&gt; When the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10a1b378&quot;&gt;DBpedia&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id10934068&quot;&gt;Yago&lt;/a&gt; integration took place last year (around WWW2007, Banff) there was a little, but costly omission that occurred: nobody sought to load the &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id106e47f0&quot;&gt;Yago&lt;/a&gt; Class Hierarchy into the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13f90890&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s Inference Engine :-(&lt;/p&gt; &lt;p&gt; Anyway, the Class Hierarchy has now been loaded into the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id100004f8&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s inference engine (as &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id139900e8&quot;&gt;Virtuoso&lt;/a&gt; Inference Rules) and the following queries are now feasible using the live &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id109b02c8&quot;&gt;Virtuoso&lt;/a&gt; based &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id143624d8&quot;&gt;DBpedia&lt;/a&gt; instance hosted by &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id12f918c0&quot;&gt;OpenLink Software&lt;/a&gt;:&lt;/p&gt; &lt;p&gt; -- Find all Fiction Books associated with a property &amp;quot;dbpedia:name&amp;quot; that has literal value:  &amp;quot;The Lord of the Rings&amp;quot; .&lt;/p&gt; &lt;p&gt; &lt;span _fck_bookmark=&quot;1&quot; style=&quot;display: none; &quot;&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;DEFINE input:inference &amp;quot;http://dbpedia.org/resource/inference/rules/yago#&amp;quot;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;PREFIX rdf: &amp;amp;lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;PREFIX dbpedia: &amp;amp;lt;http://dbpedia.org/property&amp;amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;PREFIX yago: &amp;amp;lt;http://dbpedia.org/class/yago&amp;amp;gt;&amp;amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;SELECT DISTINCT  ?s&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;FROM &amp;lt; xmlns=&amp;quot;http&amp;quot; dbpedia.org=&amp;quot;dbpedia.org&amp;quot;&amp;gt;//dbpedia.org&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;WHERE {&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?s a yago:Fiction106367107 .&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?s dbpedia:name &amp;quot;The Lord of the Rings&amp;quot;@en .&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;/div&gt; &lt;p&gt; -- Variant of query with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10870920&quot;&gt;Virtuoso&lt;/a&gt;&amp;#39;s Full Text Index extension via the bif:contains function/magic predicate&lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:14px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;DEFINE input:inference &amp;quot;http://dbpedia.org/resource/inference/rules/yago#&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:14px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;PREFIX rdf: &amp;amp;lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;PREFIX dbpedia: &amp;amp;lt;http://dbpedia.org/property&amp;amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;PREFIX yago: &amp;amp;lt;http://dbpedia.org/class/yago&amp;amp;gt;&amp;amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;SELECT DISTINCT ?s ?n&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;FROM &amp;lt; xmlns=&amp;quot;http&amp;quot; dbpedia.org=&amp;quot;dbpedia.org&amp;quot;&amp;gt;//dbpedia.org&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;WHERE {&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?s a yago:Fiction106367107 .&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?s dbpedia:name ?n .&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?n bif:contains &amp;#39;Lord and Rings&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; -- Retrieve all individuals instances of Fiction Class which should include all Books.&lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;span style=&quot;font-size:16px;&quot;&gt;DEFINE input:inference &amp;quot;http://dbpedia.org/resource/inference/rules/yago#&amp;quot;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt; &lt;span style=&quot;font-size:16px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;PREFIX rdf: &amp;amp;lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica&quot;&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;span style=&quot;font-size:16px;&quot;&gt;PREFIX dbpedia: &amp;amp;lt;http://dbpedia.org/property&amp;amp;gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica&quot;&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt; &lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica&quot;&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;span style=&quot;font-size:16px;&quot;&gt;PREFIX yago: &amp;amp;lt;http://dbpedia.org/class/yago&amp;amp;gt;&amp;amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;&lt;br /&gt; &lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;SELECT DISTINCT ?s&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;FROM &amp;lt; xmlns=&amp;quot;http&amp;quot; dbpedia.org=&amp;quot;dbpedia.org&amp;quot;&amp;gt;//dbpedia.org&amp;gt;&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;WHERE {&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;?s a yago:Fiction106367107 .&lt;/span&gt; &lt;/div&gt; &lt;div&gt; &lt;span style=&quot;font-family:courier new,courier,monospace;&quot;&gt;} LIMIT 50&lt;/span&gt; &lt;/div&gt; &lt;p&gt; Note: you can also move the inference pragmas to the &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13dd0d20&quot;&gt;Virtuoso&lt;/a&gt; Sever side i.e place the inference rules in a server instance config file, thereby negating the need to place &amp;quot;define input:inference &amp;#39;http://dbpedia.org/resource/inference/rules/yago#&amp;#39;&amp;quot; pragmas directly in your &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10dddd08&quot;&gt;SPARQL&lt;/a&gt; queries.&lt;/p&gt; &lt;h3&gt; Related&lt;/h3&gt; &lt;ul&gt; &lt;li&gt; Mike&amp;#39;s &lt;a href=&quot;http://www.mkbergman.com/?p=431&quot; id=&quot;link-id13f2f318&quot;&gt;UMBEL: Making Linked Data Classy&lt;/a&gt;post&lt;/li&gt; &lt;li&gt; Fred&amp;#39;s announcement about the &lt;a href=&quot;http://fgiasson.com/blog/index.php/2007/12/20/second-version-of-yago-more-facts-and-entities/&quot; id=&quot;link-id10a1b178&quot;&gt;Yago revamp en route to UMBEL&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;uo&gt; &lt;a href=&quot;http://fgiasson.com/blog/index.php/2008/04/20/exploding-the-domain-umbel-web-services-by-zitgist/&quot; id=&quot;link-id14363358&quot;&gt;Expanding Data Object Domains via UMBEL&lt;/a&gt; &lt;/uo&gt; &lt;/li&gt; &lt;li&gt; My &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=umbel&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id1101ca98&quot;&gt;Prior posts about UMBEL&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2010-07-13T10:45:40-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>1995</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-04#1371</atom:id>
  <atom:published>2008-06-04T21:05:17Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://vanirsystems.com/danielsblog/2008/06/04/1995/#comments&quot; id=&quot;link-id10422580&quot;&gt;1995&lt;/a&gt;: &amp;quot;&lt;/p&gt; &lt;p&gt;1995 (and the early 90’s) must have been a visionaries time of dreaming… most of their dreams are happening today.&lt;/p&gt; &lt;p&gt;Watch &lt;a href=&quot;http://dbpedia.org/resource/Steve_Jobs&quot; id=&quot;link-id102d3868&quot;&gt;Steve Jobs&lt;/a&gt; (then of &lt;a href=&quot;http://dbpedia.org/resource/NeXT&quot; id=&quot;link-id13fa5140&quot;&gt;NeXT&lt;/a&gt;) discuss what he thinks will be popular in 1996 and beyond at &lt;a href=&quot;http://dbpedia.org/resource/OpenStep&quot; id=&quot;link-id10df20e0&quot;&gt;OpenStep&lt;/a&gt; Days 1995:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://uk.youtube.com/watch?v=odqojmB6C_Y&quot; id=&quot;link-id103534a0&quot;&gt;‘The Future of Objects, 3/5″ by Steve Jobs (YouTube Video)&lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://uk.youtube.com/watch?v=j7WpcRReDlo&quot; id=&quot;link-id13f31910&quot;&gt;‘The Future of Objects, 4/5″ by Steve Jobs (YouTube Video)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Heres a spoiler:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;There is static &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;web&lt;/a&gt; document publishing&lt;/li&gt; &lt;li&gt;There is dynamic web document publishing&lt;/li&gt; &lt;li&gt;People will want to buy things off the web: e-commerce&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The thing that OpenStep propose is:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;http://dbpedia.org/resource/WebObjects&quot; id=&quot;link-id10762ed8&quot;&gt;WebObjects&lt;/a&gt;: an &lt;a href=&quot;http://dbpedia.org/resource/Object-oriented_programming&quot; id=&quot;link-id1107f680&quot;&gt;Object Oriented&lt;/a&gt; representation of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; available in distributed form over the web&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;What Steve was suggesting was one of the beginnings of the &lt;a href=&quot;http://dbpedia.org/resource/Data_Web&quot; id=&quot;link-id1047b568&quot;&gt;Data Web&lt;/a&gt;! Yep, &lt;a href=&quot;http://dbpedia.org/resource/Portable_Distributed_Objects&quot; id=&quot;link-id105c5330&quot;&gt;Portable Distributed Objects&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Enterprise_Objects_Framework&quot; id=&quot;link-id1006c850&quot;&gt;Enterprise Objects Framework&lt;/a&gt; was one of the influences of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id143cf598&quot;&gt;Semantic Web&lt;/a&gt; / &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1075c898&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0x1e9ade30&quot;&gt;Web&lt;/a&gt;…. not surprising as &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id10b56c80&quot;&gt;Tim Berners-Lee&lt;/a&gt; designed the initial web stack on a &lt;a href=&quot;http://dbpedia.org/resource/NeXT&quot; id=&quot;link-id105edcb0&quot;&gt;NeXT&lt;/a&gt; computer!&lt;/p&gt; &lt;p&gt;I’m going to spend a little time this evening figuring out how much ‘distributed objects’ stuff has been taken from the OpenStep stuff into the Objective-&lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id0x19fe21b8&quot;&gt;C&lt;/a&gt; + Cocoa environment. (&amp;lt;- I guess I must be quite geeky ;-))&lt;/p&gt;&amp;quot; &lt;p&gt;(Via &lt;a href=&quot;http://vanirsystems.com/danielsblog&quot; id=&quot;link-id1092ed90&quot;&gt;Daniel Lewis&lt;/a&gt;.)&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-06T07:54:33.000010-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Nice Presentation about Semantic Web by Nova Spivack</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-06-03#1370</atom:id>
  <atom:published>2008-06-03T18:53:47Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://thenextweb.org/2008/06/03/video-nova-spivack-making-sense-of-the-semantic-web/&quot; id=&quot;link-id1046bfc8&quot;&gt;Nova Spivack delivers a nice Semantic Web presentation&lt;/a&gt; at &lt;a href=&quot;http://2008.thenextweb.org/&quot; id=&quot;link-idff1b7d8&quot;&gt;NextWeb&lt;/a&gt;. My only differences with Nova are:&lt;/p&gt; &lt;ul&gt;-- Timeframe - I believe we are closer to 2020 than he envisages&lt;/ul&gt; &lt;ul&gt;-- Business models - there are going to be new business models courtesy of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x1f71c1b0&quot;&gt;Semantic Web&lt;/a&gt; effect.&lt;/ul&gt; &lt;p&gt;Anyway, enjoy!&lt;/p&gt; &lt;p&gt;BTW - The only reason why the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot;&gt;Semantic Web&lt;/a&gt; is perceived as complex relative to the original Document &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; is simple this: The Semantic Web was designed in public view by the W3C and many collaborators, whereas the Document Web simply came into public view and consciousness as a somewhat finished solution.&lt;/p&gt;</atom:content>
  <atom:updated>2008-06-03T15:06:33.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Cluster Paper</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-05-30#1369</atom:id>
  <atom:published>2008-05-30T10:02:04Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;Virtuoso Cluster Paper&lt;/div&gt; &lt;div&gt; &lt;div&gt;We have a new article on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10424890&quot;&gt;Virtuoso&lt;/a&gt; cluster, submitted to ISWC 2008.&lt;/div&gt; &lt;div&gt; Right now we are working on hosting the billion triples challenge &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1077f800&quot;&gt;data&lt;/a&gt; set at Amazon EC2 using &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id102117f0&quot;&gt;Virtuoso&lt;/a&gt; Cluster. This will be the first publicly available instance of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x20387e80&quot;&gt;Virtuoso&lt;/a&gt; Cluster and all interested may then instantiate their own copy on the EC2 infrastructure. &lt;/div&gt; &lt;br /&gt; &lt;div&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008iswc_webscale_rdf.pdf&quot; id=&quot;link-id10af2f30&quot;&gt;Towards Web Scale RDF&lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/RDFAndMapped_BI.pdf&quot; id=&quot;link-idfedf9f0&quot;&gt;Integrating Open Sources and Relational Data with SPARQL&lt;/a&gt; &lt;br /&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/bisparql2.pdf&quot; id=&quot;link-id106e5418&quot;&gt;Business Intelligence Extensions for SPARQL&lt;/a&gt; &lt;br /&gt; &lt;/div&gt; &lt;br /&gt; &lt;div&gt; Look for a separate announcement in the near future. &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-05-30T06:02:05-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Virtuoso Cluster Paper</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-05-30#1368</atom:id>
  <atom:published>2008-05-30T09:57:47Z</atom:published>
  <atom:content type="html">&lt;p&gt;We have a new article on &lt;a href=&quot;http://virtuoso.openlinksw.com&quot;&gt;Virtuoso&lt;/a&gt; Cluster, submitted to ISWC 2008.&lt;/p&gt; &lt;p&gt;Right now we are working on hosting the billion triples challenge &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; set on Amazon EC2 using Virtuoso Cluster. This will be the first publicly available instance of Virtuoso Cluster and all interested may then instantiate their own copy on the EC2 infrastructure.&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/2008iswc_webscale_rdf.pdf&quot; id=&quot;link-id1062bc98&quot;&gt;Towards Web Scale RDF&lt;/a&gt; (PDF)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/RDFAndMapped_BI.pdf&quot; id=&quot;link-id1063efa8&quot;&gt;Integrating Open Sources and Relational Data with SPARQL&lt;/a&gt; (PDF)&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/bisparql2.pdf&quot; id=&quot;link-id10c37708&quot;&gt;Business Intelligence Extensions for SPARQL&lt;/a&gt; (PDF)&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Look for a separate announcement in the near future.&lt;/p&gt; &lt;a href=&quot;index.vspx?tag=database&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;database&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=databases&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;databases&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=rdf&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;rdf&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=semanticweb&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;semanticweb&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=sparql&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;sparql&lt;/a&gt;&lt;a href=&quot;index.vspx?tag=virtuoso&quot; rel=&quot;tag&quot; style=&quot;display:none;&quot;&gt;virtuoso&lt;/a&gt;</atom:content>
  <atom:updated>2008-05-30T10:36:31-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Web Evolution</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-26#1367</atom:id>
  <atom:published>2008-05-26T14:51:59Z</atom:published>
  <atom:content type="html">&lt;a href=&quot;http://yihongs-research.blogspot.com&quot; id=&quot;link-id109b5500&quot;&gt;Yihong Ding&lt;/a&gt; has posted an interesting series of posts under the banner: &lt;a href=&quot;http://feeds.feedburner.com/~r/ThinkingSpace/~3/297992608/revision-of-web-evolution-series.html&quot; id=&quot;link-id130cb6e8&quot;&gt;Web Evolution&lt;/a&gt;. Post number 4 in the series covers: &lt;a href=&quot;http://yihongs-research.blogspot.com/2007/08/mapping-between-web-evolution-and-human.html&quot; id=&quot;link-id10275ec0&quot;&gt;Web Evolution and Human Growth&lt;/a&gt;. This particular post is orthogonal (related but independent) to some of my &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=data%20web%20evolution&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id10b1cf18&quot;&gt;earlier posts about Web Evolution&lt;/a&gt;.</atom:content>
  <atom:updated>2008-05-27T07:45:51.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>State of the Semantic Web Presentation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-22#1365</atom:id>
  <atom:published>2008-05-22T20:38:28Z</atom:published>
  <atom:content type="html">&lt;p&gt;Unfortunately a number of Linking Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-idffe3680&quot;&gt;LOD&lt;/a&gt;) community / &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1017b420&quot;&gt;Linked Data&lt;/a&gt; tribe members (myself included) aren&amp;#39;t at the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10035c28&quot;&gt;Semantic Web&lt;/a&gt; Technologies conference in San Jose (we are in a busy period for &lt;a href=&quot;http://idehen.net/dataspace/kidehen/calendar/MyCalendar&quot; id=&quot;link-id10228c50&quot;&gt;Semantic Web Technology related Conferences&lt;/a&gt;). But all isn&amp;#39;t lost as &lt;a href=&quot;http://www.w3.org/People/Ivan/&quot; id=&quot;link-id100be140&quot;&gt;Ivan Herman&lt;/a&gt; (W3C &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id10181b78&quot;&gt;Semantic Web&lt;/a&gt; Activity Lead) , &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1004a7e8&quot;&gt;LOD&lt;/a&gt; member, and SWEO colleague has carried the banner with aplomb.&lt;/p&gt; &lt;p&gt;Ivan&amp;#39;s presentation titled: &lt;a href=&quot;http://www.w3.org/2008/Talks/0518-SanJose-IH/HTML/Overview.html&quot; id=&quot;link-id11011990&quot;&gt;State of the Semantic Web&lt;/a&gt;, is a must view for those who need a quick update on where things are re. the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id101797b0&quot;&gt;Semantic Web&lt;/a&gt; in general.&lt;/p&gt; &lt;p&gt;I also liked the fact that in proper &amp;quot;Lead by example&amp;quot; manner, his presentation isn&amp;#39;t PDF or PPT based, it&amp;#39;s a &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Document :-)&lt;/p&gt; &lt;p&gt;Hint: as per usual, this post contains a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id100bdc28&quot;&gt;Linked Data&lt;/a&gt; demo nugget. This time around, it&amp;#39;s in the form of a shared calendar covering a large number of &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id1002dd00&quot;&gt;Semantic Web&lt;/a&gt; Technology events. All I had to do was subscribe to a number of WebDAV accessible iCal files from my &lt;a href=&quot;http://idehen.net/dataspace/kidehen/calendar/MyCalendar&quot; id=&quot;link-id10f90900&quot;&gt;Calendar Data Space&lt;/a&gt; and the platform did the rest i.e. produce &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10044188&quot;&gt;Linked Data&lt;/a&gt; Objects for events associated with a plethora of conferences.&lt;/p&gt; &lt;p&gt;If you assimilate Ivan&amp;#39;s presentation properly, you will note I&amp;#39;ve just generated, and shared, a large number of URIs covering a range of conference events. Thus, you can extend my contributions (thereby enriching the &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1018ea80&quot;&gt;GGG&lt;/a&gt;) by simply associating additional data from your &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10180538&quot;&gt;Linked&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10103330&quot;&gt;Data Space&lt;/a&gt; with mine. All you have to do is use my calendar data objects URIs in your statements.&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-23T06:53:08-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Context, Tagging, Semantic Web, and Linked Data (Updated)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-22#1366</atom:id>
  <atom:published>2008-05-22T17:23:02Z</atom:published>
  <atom:content type="html">&lt;p&gt;Courtesy of &lt;a href=&quot;http://novaspivack.typepad.com/about.html&quot; id=&quot;link-id101d8750&quot;&gt;Nova Spivack&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://feeds.feedburner.com/~r/typepad/MindingThePlanet/~3/295624567/tagging-and-the.html&quot; id=&quot;link-id11067248&quot;&gt;Tagging and the Semantic Web: Tags as Objects&lt;/a&gt;, I stumbled across a related post by &lt;a href=&quot;http://www.designmills.com/&quot; id=&quot;link-idffb9a38&quot;&gt;John Clarke&lt;/a&gt; titled: &lt;a href=&quot;http://feeds.feedburner.com/~r/DesignMills/~3/294554634/&quot; id=&quot;link-id101d6138&quot;&gt;Tagging and the Semantic Web&lt;/a&gt;. Both of these posts use the common practice of tagging to shed light on the increasing realization that &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id11011f98&quot;&gt;&lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/1356&quot; id=&quot;link-id1003f248&quot;&gt;The Pursuit of Context&lt;/a&gt;&lt;/a&gt;&amp;quot; is the fusion point between the current &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; and its evolution into a structured Web of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id101d6788&quot;&gt;Linked Data&lt;/a&gt;.&lt;/p&gt; &lt;h3&gt;How Semantic Tagging Works (from a 1000 feet)&lt;/h3&gt; &lt;p&gt;When tagging a document, the semantic tagging service passes the content of a target document through a processing pipeline (a distillation process of sorts) that results in automagic extraction of the following:&lt;/p&gt; &lt;ul&gt; -- &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id1015fdd0&quot;&gt;Named Entities&lt;/a&gt; &lt;/ul&gt; &lt;ul&gt;-- &lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id100ccff8&quot;&gt;Subject matter Entities&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-idfe9a898&quot;&gt;Subject matter Concepts&lt;/a&gt; reflecting topics covered by the document&lt;/ul&gt; &lt;p&gt;Once the extraction phase is completed, a user is presented with a list of &amp;quot;suggested tags&amp;quot; using a variety of user interaction techniques. The literal values of elected Tags are then associated with one or more &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-idfed5eb0&quot;&gt;Tag&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id101ae0c8&quot;&gt;Tag&lt;/a&gt; Meaning &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Objects, with each Object type endowed with a unique Identifier.&lt;/p&gt; &lt;h3&gt;Issues to Note&lt;/h3&gt; &lt;p&gt;Broad acceptance that: &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id100b9010&quot;&gt;Context&lt;/a&gt; is king&amp;quot;, is gradually taking shape. That said, &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id101d2670&quot;&gt;Context&lt;/a&gt;&amp;quot; landlocked within Literal values offers little over what we have right now (e.g. at &lt;a href=&quot;http://del.icio.us&quot; id=&quot;link-id1004be08&quot;&gt;Del.icio.us&lt;/a&gt; or &lt;a href=&quot;http://www.technorati.com&quot; id=&quot;link-id100421c8&quot;&gt;Technorati&lt;/a&gt;), long term. By this I mean: if the end product of semantically enhanced tagging leaves us with: Literal &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id101e5730&quot;&gt;Tag&lt;/a&gt; values only, Tags associated with &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id1004a890&quot;&gt;Tag&lt;/a&gt; Data Objects endowed with platform specific Identifiers, or &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id100364f8&quot;&gt;Tag&lt;/a&gt; Data Objects with any other Identity scheme that excludes &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id101e6630&quot;&gt;HTTP&lt;/a&gt;, the ability of Web users to discern or derive multiple perspectives from the base &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10180868&quot;&gt;Context&lt;/a&gt; (exposed by semantically enhanced Tags) will be lost, or severely impeded at best.&lt;/p&gt; &lt;p&gt;The shape, form, and quality of the lookup substrate that underlies semantic tagging services, ultimately affects &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id10160f28&quot;&gt;context&lt;/a&gt; fidelity&amp;quot; matters such as &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id100f2618&quot;&gt;Entity&lt;/a&gt; Disambiguation. The importance of quality lookup infrastructure on the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10044b10&quot;&gt;Linked Data Web&lt;/a&gt; is the reason why &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id10102360&quot;&gt;OpenLink Software&lt;/a&gt; is intimately involved with the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id110760f8&quot;&gt;DBpedia&lt;/a&gt; and &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id1015fc68&quot;&gt;UMBEL&lt;/a&gt; projects. &lt;/p&gt; &lt;h3&gt;Conclusions&lt;/h3&gt; &lt;p&gt;I am immensely happy to see that the Web 2.0 and &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-idffb8ca8&quot;&gt;Semantic Web&lt;/a&gt; communities are beginning to coalesce around the issue of &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id101656b0&quot;&gt;Context&lt;/a&gt;&amp;quot;. This was the case at the &lt;a href=&quot;http://events.linkeddata.org/ldow2008/&quot; id=&quot;link-id1017b878&quot;&gt;WWW2008 Linked Data Workshop&lt;/a&gt;, I am feeling a similar vibe emerging from the &lt;a href=&quot;http://www.semantic-conference.com/&quot; id=&quot;link-idffb9978&quot;&gt;Semantic Web Technologies&lt;/a&gt; conference currently nearing completion in San Jose. Of course, I will be talking about, and demonstrating practical utility of all of this, at the upcoming &lt;a href=&quot;http://www.linkeddataplanet.com&quot; id=&quot;link-id10042168&quot;&gt;Linked Data Planet&lt;/a&gt; conference.&lt;/p&gt; &lt;h3&gt;Related&lt;/h3&gt; &lt;ul&gt; &lt;a href=&quot;http://www.openlinksw.com/dataspace/kidehen@openlinksw.com/weblog/kidehen@openlinksw.com%27s%20BLOG%20%5B127%5D/tagcloud&quot; id=&quot;link-id147a1848&quot;&gt;My Data Space Tag Cloud&lt;/a&gt; (*a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x24756e98&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0x24c2bd20&quot;&gt;Space&lt;/a&gt;*) &lt;/ul&gt; &lt;ul&gt; &lt;a href=&quot;http://www.faviki.com/&quot; id=&quot;link-id101ac668&quot;&gt;Faviki&lt;/a&gt; (note: this service needs to expose &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1042cdc0&quot;&gt;Linked Data&lt;/a&gt; compliant &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id1038c2e0&quot;&gt;Tag&lt;/a&gt; URIs) &lt;/ul&gt; &lt;ul&gt; &lt;a href=&quot;http://moat-project.org/ontology&quot; id=&quot;link-id10199770&quot;&gt;MOAT Ontology&lt;/a&gt; &lt;/ul&gt;</atom:content>
  <atom:updated>2008-05-27T18:36:37-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>ODBC &amp; WODBC Comparison</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-20#1364</atom:id>
  <atom:published>2008-05-20T19:37:53Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id100eb550&quot;&gt;ODBC&lt;/a&gt; delivers open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-idffd2338&quot;&gt;data&lt;/a&gt; access (by reference) to a broad range of enterprise databases via a &amp;#39;&lt;a href=&quot;http://dbpedia.org/resource/C_(programming_language)&quot; id=&quot;link-id104fd1d8&quot;&gt;C&lt;/a&gt;&amp;#39; based API. Thanks to the &lt;a href=&quot;http://www.iodbc.org&quot; id=&quot;link-id104721b0&quot;&gt;iODBC&lt;/a&gt; and &lt;a href=&quot;http://www.unixodbc.org&quot; id=&quot;link-id10954990&quot;&gt;unixODBC&lt;/a&gt; projects, &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id10494670&quot;&gt;ODBC&lt;/a&gt; is available across broad range of platforms beyond Windows.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0xc900928&quot;&gt;ODBC&lt;/a&gt; identifies &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10f82200&quot;&gt;data&lt;/a&gt; sources using &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xcaad080&quot;&gt;Data&lt;/a&gt; Source Names (DSNs). &lt;/p&gt; &lt;p&gt; WODBC (&lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; Open Database Connectivity) delivers open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; access to Web Databases / Data Spaces. The Data Source Naming scheme: &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id1009ce40&quot;&gt;URI&lt;/a&gt; or IRI, is &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id101fc1b0&quot;&gt;HTTP&lt;/a&gt; based thereby enabling data access by reference via the Web. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot;&gt;ODBC&lt;/a&gt; DSNs bind ODBC client applications to Tables, Views, Stored Procedures. &lt;/p&gt; &lt;p&gt;WODBC DSNs bind you to a Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10182a88&quot;&gt;Space&lt;/a&gt; (e.g. my &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen&quot; id=&quot;link-id105a7858&quot;&gt;FOAF based Profile Page&lt;/a&gt; where you can use the &amp;quot;Explore Data Tab&amp;quot; to look around if you are a human visitor) or a specific &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id10bd8578&quot;&gt;Entity&lt;/a&gt; within a Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10780dc0&quot;&gt;Space&lt;/a&gt; (i.e &lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id10848e08&quot;&gt;Person Entity Me&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;ODBC Drivers are built using APIs (DBMS Call Level Interfaces) provided by DBMS vendors. Thus, a DBMS vendor can chose not to release an API, or do so selectivity, for competitive advantage or market disruption purposes (it&amp;#39;s happened!).&lt;/p&gt; &lt;p&gt;WODBC Drivers are also built using APIs (Web Services associated with a Web Data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id0xcbe6348&quot;&gt;Space&lt;/a&gt;). These drivers are also referred to as &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=rdf%20middleware&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id16564058&quot;&gt;RDF Middleware&lt;/a&gt; or RDFizers. The &amp;quot;Web&amp;quot; component of WODBC ensures openness, you publish Data with URIs from your &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1064a768&quot;&gt;Linked Data&lt;/a&gt; Server and that&amp;#39;s it; your data &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot;&gt;space&lt;/a&gt; or specific data entities are live and accessible (by reference) over the Web!&lt;/p&gt; &lt;p&gt;So we have come full circle (or cycle), the Web is becoming more of a structured database everyday! What&amp;#39;s new is old, and what&amp;#39;s old is new! &lt;/p&gt; &lt;p&gt;Data Access is everything, without &amp;quot;Data&amp;quot; there is no &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id100a9de8&quot;&gt;information&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id10bb67e8&quot;&gt;knowledge&lt;/a&gt;. Without &amp;quot;Data&amp;quot; there&amp;#39;s not notion of vitality, purpose, or value.&lt;/p&gt; &lt;p&gt;URIs make or break everything in the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10a71638&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10494400&quot;&gt;Web&lt;/a&gt; just as ODBC DSNs do within the enterprise. &lt;/p&gt; &lt;p&gt;I&amp;#39;ve deliberately left &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id10a05280&quot;&gt;JDBC&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id104e4a70&quot;&gt;ADO&lt;/a&gt;.&lt;a href=&quot;http://dbpedia.org/resource/ADO.NET&quot; id=&quot;link-id10215668&quot;&gt;NET&lt;/a&gt;, and OLE-DB out of this piece due to their respective programming languages and frameworks specificity. None of these mechanisms match the platform availability breadth of ODBC.&lt;/p&gt; &lt;p&gt;The Web as a true &lt;a href=&quot;http://dbpedia.org/resource/Model-view-controller&quot; id=&quot;link-id108ee598&quot;&gt;M&lt;/a&gt;-&lt;a href=&quot;http://dbpedia.org/resource/Model-view-controller&quot; id=&quot;link-id0xcda5e90&quot;&gt;V&lt;/a&gt;-C pattern is now crystalizing. The &amp;quot;M&amp;quot; (Model) component of M-V-C is finally rising to the realm of broad attention courtesy of the &amp;quot;&lt;a href=&quot;http://www.w3.org/DesignIssues/LinkedData.html&quot; id=&quot;link-id1024ff08&quot;&gt;Linked Data&amp;quot; meme&lt;/a&gt; and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id1831b418&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; vision.&lt;/p&gt; &lt;p&gt;By the way, M-V-C lines up nicely with Web 1.0 (Web Forms / Pages), Web 2.0 (Web Services based APIs), and Web 3.0 (Data Web, Web of Data, or &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xb6d0e90&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0xb22a158&quot;&gt;Web&lt;/a&gt;) :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-20T15:46:11-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Commercializing the Semantic Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-16#1363</atom:id>
  <atom:published>2008-05-16T22:04:01Z</atom:published>
  <atom:content type="html">&lt;p&gt;Unfortunately, I could only spend 4 days at the recent &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id196acf60&quot;&gt;WWW2008&lt;/a&gt; event in &lt;a href=&quot;http://dbpedia.org/resource/Beijing&quot; id=&quot;link-id1974fe28&quot;&gt;Beijing&lt;/a&gt; (I departed the morning following the &lt;a href=&quot;http://events.linkeddata.org/ldow2008/&quot; id=&quot;link-id1863f858&quot;&gt;Linked Data Workshop&lt;/a&gt;), so I couldn&amp;#39;t take my slot on the &amp;quot;Commercializing the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id18990f90&quot;&gt;Semantic Web&lt;/a&gt; panel&amp;quot; etc.. Anyway, thanks to the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id0x18f29310&quot;&gt;Web&lt;/a&gt; I can still inject my points of view in the broad &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; based discourse. Well so I hoped, when I attempted to post a comment to Paul Miller&amp;#39;s ZDNet domain hosted &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id180d6750&quot;&gt;blog&lt;/a&gt; thread titled: &lt;a href=&quot;http://blogs.zdnet.com/semantic-web/?p=132&quot; id=&quot;link-id12d206c0&quot;&gt;Commercialising the Semantic Web&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Unfortunately, the cost of completing ZDNet&amp;#39;s unwieldy signup process simply exceeded the benefits of dropping my comments in their particular space :-( Thus, I&amp;#39;ll settle for a trackback ping instead.&lt;/p&gt; &lt;p&gt;What follows is the cut and paste of my intended comment contributions to Paul&amp;#39;s post.&lt;/p&gt; &lt;p&gt;Paul,&lt;/p&gt; &lt;p&gt; As discussed earlier this week during &lt;a href=&quot;http://blogs.talis.com/nodalities/2008/05/kingsley-idehen-talks-about-openlink-software-linked-data-and-the-semantic-web.php&quot; id=&quot;link-id1332fb48&quot;&gt;our podcast session&lt;/a&gt;, commercialization of &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id17382338&quot;&gt;Semantic Web&lt;/a&gt; technology shouldn&amp;#39;t be a mercurial matter at this stage in the game :-) It&amp;#39;s all about looking at how it provides value :-)&lt;/p&gt; &lt;p&gt;From the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10d4f4a8&quot;&gt;Linked Data&lt;/a&gt; angle, the ability to produce, dispatch, and exploit &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id13bed160&quot;&gt;Context&lt;/a&gt;&amp;quot; across an array of &amp;quot;Perspectives&amp;quot; from a plethora of disparate &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1731e5f0&quot;&gt;data&lt;/a&gt; sources on the Web and/or behind corporate firewalls, offers immense commercial value.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://developer.yahoo.com/searchmonkey/&quot; id=&quot;link-id1975d248&quot;&gt;Yahoo&amp;#39;s Searchmonkey&lt;/a&gt; effort will certainly bring clarity to some of the points I made during the podcast re. the role of URIs as &amp;quot;value consumption tickets&amp;quot; (&lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id173eb7b0&quot;&gt;Data&lt;/a&gt; Services are exposed via URIs). There has to be a trigger (in user space) that compels Web users to seek broader, or simply varied, perspectives as a response to &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c7e7f60&quot;&gt;data&lt;/a&gt; encountered on the Web. Yahoo! is about to put this light on in a big way (imho).&lt;/p&gt; &lt;p&gt;The &amp;quot;self annotating&amp;quot; nature of the Web is what ultimately drives the manifestation of the long awaited &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xa18a83e8&quot;&gt;Semantic Web&lt;/a&gt;. I believe I postulated about &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=self%20annotation&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id173d7458&quot;&gt;&amp;quot;Self Annotation &amp;amp; the Semantic Web&amp;quot; in a number of prior posts&lt;/a&gt; which, by the way, should be &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;type=text&amp;amp;kwds=self%20annotation&amp;amp;OpenSearch&quot; id=&quot;link-id10b12208&quot;&gt;DataRSS compatible right now&lt;/a&gt; due to Yahoo&amp;#39;s support of OpenSearch &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1b8412e8&quot;&gt;Data&lt;/a&gt; Providers (which this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id170b8df8&quot;&gt;Blog&lt;/a&gt; Space has been for eons).&lt;/p&gt; &lt;p&gt;Today, have many communities adding strucuture to the Web (via their respective tools of preference) without explicitly realizing what they are contributing. Every RSS/Atom feed, &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id183d5178&quot;&gt;Tag&lt;/a&gt;, Weblog, Shared Bookmark, &lt;a href=&quot;http://dbpedia.org/resource/WikiWord&quot; id=&quot;link-id10c5e758&quot;&gt;Wikiword&lt;/a&gt;, Microformat, Microformat++ (&lt;a href=&quot;http://dbpedia.org/resource/Embedded_RDF&quot; id=&quot;link-id16d8ee40&quot;&gt;eRDF&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id1059a688&quot;&gt;RDFa&lt;/a&gt;), &lt;a href=&quot;http://dbpedia.org/resource/GRDDL&quot; id=&quot;link-id1090ae10&quot;&gt;GRDDL&lt;/a&gt; stylesheet, and RDFizer etc.. is a piece of structured &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Finally, the different communities are all finding ways to work together (thank heavens!) and the results are going to be cataclysmic when it all plays out :-)&lt;/p&gt; &lt;p&gt;Data, Structure, and Extraction are the keys to the Semantic Life! First you get the Data in a container (&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id180e5648&quot;&gt;information&lt;/a&gt; resource), and then you add Structure to the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id103801e0&quot;&gt;information&lt;/a&gt; resource (RSS, Atom, &lt;a href=&quot;http://dbpedia.org/resource/Microformats&quot; id=&quot;link-id17825e40&quot;&gt;microformats&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id189a8738&quot;&gt;RDFa&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Embedded_RDF&quot; id=&quot;link-id1933d5c0&quot;&gt;eRDF&lt;/a&gt;, SIOC, FOAF, etc.), once you have Structure RDFization (i.e. transformation to &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id19744878&quot;&gt;Linked Data&lt;/a&gt;) is a synch thanks to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id180dde30&quot;&gt;RDF&lt;/a&gt; Middleware (as per &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;type=text&amp;amp;kwds=self%20annotation&amp;amp;OpenSearch&quot; id=&quot;link-id16dc3130&quot;&gt;earlier RDF middleware posts&lt;/a&gt;).&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-18T10:58:26.000003-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Commercializing the Semantic Web</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-16#1362</atom:id>
  <atom:published>2008-05-16T20:02:45Z</atom:published>
  <atom:content type="html">&lt;p&gt;Unfortunately, I could only spend 4 days at the recent &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id196acf60&quot;&gt;WWW2008&lt;/a&gt; event in &lt;a href=&quot;http://dbpedia.org/resource/Beijing&quot; id=&quot;link-id1974fe28&quot;&gt;Beijing&lt;/a&gt; (I departed the morning following the &lt;a href=&quot;http://events.linkeddata.org/ldow2008/&quot; id=&quot;link-id1863f858&quot;&gt;Linked Data Workshop&lt;/a&gt;), so I couldn&amp;#39;t take my slot on the &amp;quot;Commercializing the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id18990f90&quot;&gt;Semantic Web&lt;/a&gt; panel&amp;quot; etc.. Anyway, thanks to the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; I can still inject my points of view in the broad Web based discourse. Well so I hoped, when I attempted to post a comment to Paul Miller&amp;#39;s ZDNet domain hosted &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id180d6750&quot;&gt;blog&lt;/a&gt; thread titled: &lt;a href=&quot;http://blogs.zdnet.com/semantic-web/?p=132&quot; id=&quot;link-id12d206c0&quot;&gt;Commercialising the Semantic Web&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Unfortunately, the cost of completing ZDNet&amp;#39;s unwieldy signup process simply exceeded the benefits of dropping my comments in their particular space :-( Thus, I&amp;#39;ll settle for a trackback ping instead.&lt;/p&gt; &lt;p&gt;What follows is the cut and paste of my intended comment contributions to Paul&amp;#39;s post.&lt;/p&gt; &lt;p&gt;Paul,&lt;/p&gt; &lt;p&gt; As discussed earlier this week during &lt;a href=&quot;http://blogs.talis.com/nodalities/2008/05/kingsley-idehen-talks-about-openlink-software-linked-data-and-the-semantic-web.php&quot; id=&quot;link-id1332fb48&quot;&gt;our podcast session&lt;/a&gt;, commercialization of &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id17382338&quot;&gt;Semantic Web&lt;/a&gt; technology shouldn&amp;#39;t be a mercurial matter at this stage in the game :-) It&amp;#39;s all about looking at how it provides value :-)&lt;/p&gt; &lt;p&gt;From the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10d4f4a8&quot;&gt;Linked Data&lt;/a&gt; angle, the ability to produce, dispatch, and exploit &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id13bed160&quot;&gt;Context&lt;/a&gt;&amp;quot; across an array of &amp;quot;Perspectives&amp;quot; from a plethora of disparate &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1731e5f0&quot;&gt;data&lt;/a&gt; sources on the Web and/or behind corporate firewalls, offers immense commercial value.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://developer.yahoo.com/searchmonkey/&quot; id=&quot;link-id1975d248&quot;&gt;Yahoo&amp;#39;s Searchmonkey&lt;/a&gt; effort will certainly bring clarity to some of the points I made during the podcast re. the role of URIs as &amp;quot;value consumption tickets&amp;quot; (&lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id173eb7b0&quot;&gt;Data&lt;/a&gt; Services are exposed via URIs). There has to be a trigger (in user space) that compels Web users to seek broader, or simply varied, perspectives as a response to &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1c7e7f60&quot;&gt;data&lt;/a&gt; encountered on the Web. Yahoo! is about to put this light on in a big way (imho).&lt;/p&gt; &lt;p&gt;The &amp;quot;self annotating&amp;quot; nature of the Web is what ultimately drives the manifestation of the long awaited &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xa18a83e8&quot;&gt;Semantic Web&lt;/a&gt;. I believe I postulated about &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=self%20annotation&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id173d7458&quot;&gt;&amp;quot;Self Annotation &amp;amp; the Semantic Web&amp;quot; in a number of prior posts&lt;/a&gt; which, by the way, should be &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;type=text&amp;amp;kwds=self%20annotation&amp;amp;OpenSearch&quot; id=&quot;link-id10b12208&quot;&gt;DataRSS compatible right now&lt;/a&gt; due to Yahoo&amp;#39;s support of OpenSearch &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;Data&lt;/a&gt; Providers (which this &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id170b8df8&quot;&gt;Blog&lt;/a&gt; Space has been for eons).&lt;/p&gt; &lt;p&gt;Today, have many communities adding strucuture to the Web (via their respective tools of preference) without explicitly realizing what they are contributing. Every RSS/Atom feed, &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id183d5178&quot;&gt;Tag&lt;/a&gt;, Weblog, Shared Bookmark, &lt;a href=&quot;http://dbpedia.org/resource/WikiWord&quot; id=&quot;link-id10c5e758&quot;&gt;Wikiword&lt;/a&gt;, Microformat, Microformat++ (&lt;a href=&quot;http://dbpedia.org/resource/Embedded_RDF&quot; id=&quot;link-id16d8ee40&quot;&gt;eRDF&lt;/a&gt; or &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id1059a688&quot;&gt;RDFa&lt;/a&gt;), &lt;a href=&quot;http://dbpedia.org/resource/GRDDL&quot; id=&quot;link-id1090ae10&quot;&gt;GRDDL&lt;/a&gt; stylesheet, and RDFizer etc.. is a piece of structured data.&lt;/p&gt; &lt;p&gt;Finally, the different communities are all finding ways to work together (thank heavens!) and the results are going to be cataclysmic when it all plays out :-)&lt;/p&gt; &lt;p&gt;Data, Structure, and Extraction are the keys to the Semantic Life! First you get the Data in a container (&lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id180e5648&quot;&gt;information&lt;/a&gt; resource), and then you add Structure to the &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id103801e0&quot;&gt;information&lt;/a&gt; resource (RSS, Atom, &lt;a href=&quot;http://dbpedia.org/resource/Microformats&quot; id=&quot;link-id17825e40&quot;&gt;microformats&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/RDFa&quot; id=&quot;link-id189a8738&quot;&gt;RDFa&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Embedded_RDF&quot; id=&quot;link-id1933d5c0&quot;&gt;eRDF&lt;/a&gt;, SIOC, FOAF, etc.), once you have Structure RDFization (i.e. transformation to &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id19744878&quot;&gt;Linked Data&lt;/a&gt;) is a synch thanks to &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id180dde30&quot;&gt;RDF&lt;/a&gt; Middleware (as per &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;type=text&amp;amp;kwds=self%20annotation&amp;amp;OpenSearch&quot; id=&quot;link-id16dc3130&quot;&gt;earlier RDF middleware posts&lt;/a&gt;).&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-16T16:15:29.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>My Talis Podcast re. Semantic Web, Linked Data, and OpenLink Software</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-16#1361</atom:id>
  <atom:published>2008-05-16T00:10:23Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://blogs.talis.com/nodalities/2008/05/kingsley-idehen-talks-about-openlink-software-linked-data-and-the-semantic-web.php&quot; id=&quot;link-id1036b118&quot;&gt;My podcast interview&lt;/a&gt; with &lt;a href=&quot;http://www.linkedin.com/in/pau1mi11er&quot; id=&quot;link-id1026ed10&quot;&gt;Paul Miller&lt;/a&gt; of &lt;a href=&quot;http://www.talis.com&quot; id=&quot;link-id12d210d8&quot;&gt;Talis&lt;/a&gt; is out. As I listened to the podcast (naturally awkward affair) I got a first hand sense of Paul&amp;#39;s mastery of the art of interviewing, even when dealing with a fast talking &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id180e1208&quot;&gt;data&lt;/a&gt; blitzers like me. Personally, I think I still talk a little too fast (the Nigerian in me), especially when the subject matter hones right into the epicenter of my professional passions: Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1737a258&quot;&gt;Data&lt;/a&gt; Access and Heterogeneous &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id180f0668&quot;&gt;Data&lt;/a&gt; Integration (aka. &lt;a href=&quot;http://dbpedia.org/resource/Virtual_Database&quot; id=&quot;link-id10c62348&quot;&gt;Virtual Database&lt;/a&gt; Technology) -- so you may need to rewind every now and then during the interview :-)&lt;/p&gt; &lt;p&gt;During this particular podcast interview, I deliberately wanted to have an conversation about the practical value of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id180c9f88&quot;&gt;Linked Data&lt;/a&gt;, rather than the technical innards. The fundamental utility of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id17387618&quot;&gt;Linked Data&lt;/a&gt; remains somewhat mercurial, and I am certainly hoping to do my bit at the upcoming &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id183ec288&quot;&gt;Linked Data&lt;/a&gt; Planet conference re. demonstrating and articulating &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1401f250&quot;&gt;linked data&lt;/a&gt; value across the blurring realms of &amp;quot;the individual&amp;quot; and &amp;quot;the enterprise&amp;quot;.&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Note to my old schoolmates on Facebook&lt;/strong&gt;: when you listen to this podcast you will at least reconcile &amp;quot;Uyi Idehen&amp;quot; with &amp;quot;&lt;a href=&quot;http://myopenlink.net/dataspace/person/kidehen#this&quot; id=&quot;link-id180a7060&quot;&gt;Kingsley Idehen&lt;/a&gt;&amp;quot;. Unfortunately, Facebook refuses to let me Identify myself in the manner I choose. Ideally, I would like to have the name: &amp;quot;Kingsley (Uyi) Idehen&amp;quot; associated with my Facebook ID since this is the Identifier known to my personal network of friends, family, and old schoolmates. This Identity predicament is a long running Identity case study in the making.&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-16T12:53:49.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>On &quot;Semantic&quot;, &quot;Semantic Web&quot;, and &quot;Linked Data Web&quot;</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-15#1360</atom:id>
  <atom:published>2008-05-15T14:11:13Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://novaspivack.typepad.com/&quot; id=&quot;link-id102f4e00&quot;&gt;Nova Spivack&lt;/a&gt; has just penned a post titled: &lt;a href=&quot;http://novaspivack.typepad.com/nova_spivacks_weblog/2008/05/on-the-differen.html&quot; id=&quot;link-id101a2300&quot;&gt;On the Difference Between &amp;quot;Semantic&amp;quot; and &amp;quot;Semantic Web&lt;/a&gt;&amp;quot;, where he covers the fundamental difference between &amp;quot;Semantic&amp;quot; (what I call &amp;quot;Semantics Inside&amp;quot;) and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id11dd0578&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; applications. I would like to extend the distinctions further by adding the &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10b54ca0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id106f73d0&quot;&gt;Web&lt;/a&gt;&amp;quot; distinctions to the developing discourse. &lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1089ff48&quot;&gt;Linked Data Web&lt;/a&gt; (aka. &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10653828&quot;&gt;Linked Data&lt;/a&gt;) describes &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id134abfb0&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id140283a8&quot;&gt;data&lt;/a&gt; injected into the Web, where the &lt;a href=&quot;http://dbpedia.org/resource/Identity_(object-oriented_programming)&quot; id=&quot;link-id1029ebf0&quot;&gt;Data Object Identifiers&lt;/a&gt; (URIs) in an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id1011b180&quot;&gt;RDF&lt;/a&gt; graph (collection of &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id103a4960&quot;&gt;RDF&lt;/a&gt; triples) are endowed with &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id104362d8&quot;&gt;HTTP&lt;/a&gt; based URIs. The net effect of this approach to &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id107963a0&quot;&gt;Data&lt;/a&gt; Object Identity is that it facilitates &amp;quot;Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id1331f640&quot;&gt;Data&lt;/a&gt; Access by Reference&amp;quot; on the Web (aka &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10a3c608&quot;&gt;data&lt;/a&gt; dereferencing).&lt;/p&gt; &lt;p&gt;If you recall pre Web ubiquity, in the enterprise realm for instance, Open Database Connectivity (&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id12c6dd40&quot;&gt;ODBC&lt;/a&gt;) emerged as a mechanism for separating &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id13d6a5b0&quot;&gt;Data&lt;/a&gt; Access and &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10b29488&quot;&gt;Data&lt;/a&gt; Management in the database oriented Client-Sever model. Although &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id106a8bd8&quot;&gt;ODBC&lt;/a&gt; gave you access to &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt;, the data access entry point took the form of a data access specific naming mechanism called a &amp;quot;Data Source Name&amp;quot; (DSN). &lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id106eef18&quot;&gt;ODBC&lt;/a&gt; DSNs typically exposed Tables or Views. The same thing applies to &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id12c6dfe8&quot;&gt;JDBC&lt;/a&gt; where a non &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id104cb620&quot;&gt;HTTP&lt;/a&gt; based URN scheme applies.&lt;/p&gt; &lt;p&gt;Zip forward to where we are today on the Web; the Web is evolving from a Document centric Database to a Distributed &lt;a href=&quot;http://dbpedia.org/resource/Object_database&quot; id=&quot;link-id12d15268&quot;&gt;Object Database&lt;/a&gt;, and you should see that in &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10716bb8&quot;&gt;Linked Data&lt;/a&gt; we are now truly looking at the best of all worlds: Web Open Database Connectivity (WODBC) with the following advantages:&lt;/p&gt; &lt;ul&gt;- direct Access to a single Record (an &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1037d530&quot;&gt;Entity&lt;/a&gt;) or Record Sets (&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id10d48e98&quot;&gt;RDF&lt;/a&gt; based &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id1402c8f0&quot;&gt;Entity&lt;/a&gt; Sets) by reference over &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id10bae7a8&quot;&gt;HTTP&lt;/a&gt; across disparate Data Spaces on the Web&lt;/ul&gt; &lt;ul&gt;- the ability to mesh disparate data sources without being impeded by back-end DBMS engine model, vendor, host operating development frameworks, or host operating system specificity&lt;/ul&gt; &lt;ul&gt;- an opportunity to learn from the enterprise DBMS market and Client-Server markets of yore with regards to the shape and form of next generation &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10fe4558&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10153c98&quot;&gt;Web&lt;/a&gt; oriented solutions.&lt;/ul&gt; &lt;p&gt;To conclude, we now have &amp;quot;Semantics Inside&amp;quot; (&lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id109d1280&quot;&gt;RDF&lt;/a&gt; or non &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot;&gt;RDF&lt;/a&gt;), &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id106741a8&quot;&gt;Semantic Web&lt;/a&gt;&amp;quot; (RDF graphs with Object Identifiers that may or may not be &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id1011cc28&quot;&gt;HTTP&lt;/a&gt; based), and &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10793f70&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id149ecc10&quot;&gt;Web&lt;/a&gt;&amp;quot; (RDF graphs with Object Identifiers that must be &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id10a3b860&quot;&gt;HTTP&lt;/a&gt; based and dereferencable) oriented applications, in the emerging landscape associated with the &amp;quot;Semantics&amp;quot; moniker.&lt;/p&gt; &lt;p&gt;As per usual, this post is a record in my &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id1020e240&quot;&gt;Blog&lt;/a&gt; oriented &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id105cbf90&quot;&gt;Data Space&lt;/a&gt; on the Web. The permalink of this post is a &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id10ce53a8&quot;&gt;URI&lt;/a&gt; constructed with &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1082f0f8&quot;&gt;Giant Global Graph&lt;/a&gt; enrichment in mind :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-15T14:31:38.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Benchmark Revisited</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-05-09#1359</atom:id>
  <atom:published>2008-05-09T19:33:42Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;DBpedia Benchmark Revisited&lt;/div&gt; &lt;p&gt;We ran the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1cd6d0c8&quot;&gt;DBpedia&lt;/a&gt; benchmark queries again with different configurations of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1bf01048&quot;&gt;Virtuoso&lt;/a&gt;. I had not studied the details of the matter previously but now did have a closer look at the queries.&lt;/p&gt; &lt;p&gt;Comparing numbers given by different parties is a constant problem. In the case reported here, we loaded the full DBpedia 3, all languages, with about 198M triples, onto Virtuoso v5 and Virtuoso Cluster v6, all on the same 4 core 2GHz Xeon with 8G RAM. All databases were striped on 6 disks. The Cluster configuration was with 4 processes in the same box.&lt;/p&gt; &lt;p&gt;We ran the queries in two variants:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;With graph specified in the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1b9d3ca0&quot;&gt;SPARQL&lt;/a&gt; &lt;code&gt;FROM&lt;/code&gt; clause, using the default indices.&lt;/li&gt; &lt;li&gt;With no graph specified anywhere, using an alternate indexing scheme.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The times below are for the sequence of 5 queries; individual query times are not reported. I did not do a line-by-line review of the execution plans since they seem to run well enough. We could get some extra mileage from cost model tweaks, especially for the numeric range conditions, but we will do this when somebody comes up with better times.&lt;/p&gt; &lt;p&gt;First, about Virtuoso v5: Because there is a query in the set that specifies no condition on S or O and only P, this simply cannot be done with the default indices. With Virtuoso Cluster v6 it sort-of can, because v6 is more space efficient.&lt;/p&gt; &lt;p&gt;So we added the index:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; create bitmap index &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1c364a58&quot;&gt;rdf&lt;/a&gt;_quad_pogs on rdf_quad (p, o, g, s); &lt;/code&gt; &lt;/blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso v5 with&lt;br /&gt; gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso Cluster v6 with &lt;br /&gt;gspo, ogps&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso Cluster v6 with &lt;br /&gt;gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;cold&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;210 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;136 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;33.4 s&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;warm&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.600 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.01 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.628 s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;OK, so now let us do it without a graph being specified. For all platforms, we drop any existing indices, and --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; create table r2 (g iri_id_8, s, iri_id_8, p iri_id_8, o any, primary key (s, p, o, g)) &lt;br /&gt; alter index R2 on R2 partition (s int (0hexffff00)); &lt;br /&gt; &lt;br /&gt; log_enable (2); &lt;br /&gt; insert into r2 (g, s, p, o) select g, s, p, o from rdf_quad; &lt;br /&gt; &lt;br /&gt; drop table rdf_quad; &lt;br /&gt; alter table r2 rename RDF_QUAD; &lt;br /&gt; create bitmap index rdf_quad_opgs on rdf_quad (o, p, g, s) partition (o varchar (-1, 0hexffff)); &lt;br /&gt; create bitmap index rdf_quad_pogs on rdf_quad (p, o, g, s) partition (o varchar (-1, 0hexffff)); &lt;br /&gt; create bitmap index rdf_quad_gpos on rdf_quad (g, p, o, s) partition (o varchar (-1, 0hexffff)); &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The code is identical for v5 and v6, except that with v5 we use &lt;code&gt;iri_id (32 bit)&lt;/code&gt; for the type, not &lt;code&gt;iri_id_8 (64 bit)&lt;/code&gt;. We note that we run out of IDs with v5 around a few billion triples, so with v6 we have double the ID length and still manage to be vastly more space efficient.&lt;/p&gt; &lt;p&gt;With the above 4 indices, we can query the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1bae4cd8&quot;&gt;data&lt;/a&gt; pretty much in any combination without hitting a full scan of any index. We note that all indices that do not begin with s end with s as a bitmap. This takes about 60% of the space of a non-bitmap index for data such as DBpedia.&lt;/p&gt; &lt;p&gt;If you intend to do completely arbitrary RDF queries in Virtuoso, then chances are you are best off with the above index scheme.&lt;/p&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt; Virtuoso v5 with&lt;br /&gt; gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt; Virtuoso Cluster v6 with &lt;br /&gt; spog, pogs, opgs, gpos &lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;warm&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.595 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.617 s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The cold times were about the same as above, so not reproduced.&lt;/p&gt; &lt;h3&gt;Graph or No Graph?&lt;/h3&gt; &lt;p&gt;It is in the SPARQL spirit to specify a graph and for pretty much any application, there are entirely sensible ways of keeping the data in graphs and specifying which ones are concerned by queries. This is why Virtuoso is set up for this by default.&lt;/p&gt; &lt;p&gt;On the other hand, for the open web scenario, dealing with an unknown large number of graphs, enumerating graphs is not possible and questions like which graph of which source asserts x become relevant. We have two distinct use cases which warrant different setups of the database, simple as that.&lt;/p&gt; &lt;p&gt;The latter use case is not really within the SPARQL spec, so implementations may or may not support this. For example &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x1cd2db78&quot;&gt;Oracle&lt;/a&gt; or Vertica would not do this well since they partition data according to graph or predicate, respectively. On the other hand, stores that work with one quad table, which is most of the ones out there, should do it maybe with some configuring, as shown above.&lt;/p&gt; &lt;p&gt;Frameworks like Jena are not to my &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1b300390&quot;&gt;knowledge&lt;/a&gt; geared towards having a wildcard for graph, although I would suppose this can be arranged by adding some &amp;quot;super-graph&amp;quot; object, a graph of all graphs. I don&amp;#39;t think this is directly supported and besides most apps would not need it.&lt;/p&gt; &lt;p&gt;Once the indices are right, there is no difference between specifying a graph and not specifying a graph with the queries considered. With more complex queries, specifying a graph or set of graphs does allow some optimizations that cannot be done with no graph specified. For example, bitmap intersections are possible only when all leading key parts are given.&lt;/p&gt; &lt;h3&gt;Conclusions&lt;/h3&gt; &lt;p&gt;The best warm cache time is with v5; the five queries run under 600 ms after the first go. This is noted to show that all-in-memory with a single thread of execution is hard to beat.&lt;/p&gt; &lt;p&gt;Cluster v6 performs the same queries in 623 ms. What is gained in parallelism is lost in latency if all operations complete in microseconds. On the other hand, Cluster v6 leaves v5 in the dust in any situation that has less than 100% hit rate. This is due to actual benefit from parallelism if operations take longer than a few microseconds, such as in the case of disk reads. Cluster v6 has substantially better data layout on disk, as well as fewer pages to load for the same content.&lt;/p&gt; &lt;p&gt;This makes it possible to run the queries without the pogs index on Cluster v6 even when v5 takes prohibitively long.&lt;/p&gt; &lt;p&gt;The morale of the story is to have a lot of RAM and space-efficient data representation.&lt;/p&gt; &lt;p&gt;The DBpedia benchmark does not specify any random access pattern that would give a measure of sustained throughput under load, so we are left with the extremes of cold and warm cache of which neither is quite realistic.&lt;/p&gt; &lt;p&gt;Chris Bizer and I have talked on and off about benchmarks and I have made suggestions that we will see incorporated into the Berlin SPARQL benchmark, which will, I believe, be much more informative.&lt;/p&gt; &lt;h3&gt;Appendix: Query Text&lt;/h3&gt; &lt;p&gt;For reference, the query texts specifying the graph are below. To run without specifying the graph, just drop the &lt;code&gt;FROM &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1c371db0&quot;&gt;http&lt;/a&gt;://dbpedia.org&amp;gt;&lt;/code&gt; from each query. The returned row counts are indicated below each query&amp;#39;s text.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; sparql SELECT ?p ?o FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/Metropolitan_Museum_of_Art&amp;gt; ?p ?o }; -- 1337 rows sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?film1 ?actor1 ?film2 ?actor2 FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { ?film1 p:starring &amp;lt;http://dbpedia.org/resource/Kevin_Bacon&amp;gt; . ?film1 p:starring ?actor1 . ?film2 p:starring ?actor1 . ?film2 p:starring ?actor2 . }; -- 23910 rows sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?artist ?artwork ?museum ?director FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { ?artwork p:artist ?artist . ?artwork p:museum ?museum . ?museum p:director ?director }; -- 303 rows sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; SELECT ?s ?homepage FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:lat ?berlinLat . &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:long ?berlinLong . ?s geo:lat ?lat . ?s geo:long ?long . ?s foaf:homepage ?homepage . FILTER ( ?lat &amp;lt;= ?berlinLat + 0.03190235436 &amp;amp;&amp;amp; ?long &amp;gt;= ?berlinLong - 0.08679199218 &amp;amp;&amp;amp; ?lat &amp;gt;= ?berlinLat - 0.03190235436 &amp;amp;&amp;amp; ?long &amp;lt;= ?berlinLong + 0.08679199218) }; -- 56 rows sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?s ?a ?homepage FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:lat ?nyLat . &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:long ?nyLong . ?s geo:lat ?lat . ?s geo:long ?long . ?s p:architect ?a . ?a foaf:homepage ?homepage . FILTER ( ?lat &amp;lt;= ?nyLat + 0.3190235436 &amp;amp;&amp;amp; ?long &amp;gt;= ?nyLong - 0.8679199218 &amp;amp;&amp;amp; ?lat &amp;gt;= ?nyLat - 0.3190235436 &amp;amp;&amp;amp; ?long &amp;lt;= ?nyLong + 0.8679199218) }; -- 13 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-05-12T11:24:43-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>DBpedia Benchmark Revisited</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-05-09#1358</atom:id>
  <atom:published>2008-05-09T19:27:00Z</atom:published>
  <atom:content type="html">&lt;p&gt;We ran the &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id0x1b7f9688&quot;&gt;DBpedia&lt;/a&gt; benchmark queries again with different configurations of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1cca2e00&quot;&gt;Virtuoso&lt;/a&gt;. I had not studied the details of the matter previously but now did have a closer look at the queries.&lt;/p&gt; &lt;p&gt;Comparing numbers given by different parties is a constant problem. In the case reported here, we loaded the full DBpedia 3, all languages, with about 198M triples, onto Virtuoso v5 and Virtuoso Cluster v6, all on the same 4 core 2GHz Xeon with 8G RAM. All databases were striped on 6 disks. The Cluster configuration was with 4 processes in the same box.&lt;/p&gt; &lt;p&gt;We ran the queries in two variants:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;With graph specified in the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x1b77f758&quot;&gt;SPARQL&lt;/a&gt; &lt;code&gt;FROM&lt;/code&gt; clause, using the default indices.&lt;/li&gt; &lt;li&gt;With no graph specified anywhere, using an alternate indexing scheme.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The times below are for the sequence of 5 queries; individual query times are not reported. I did not do a line-by-line review of the execution plans since they seem to run well enough. We could get some extra mileage from cost model tweaks, especially for the numeric range conditions, but we will do this when somebody comes up with better times.&lt;/p&gt; &lt;p&gt;First, about Virtuoso v5: Because there is a query in the set that specifies no condition on S or O and only P, this simply cannot be done with the default indices. With Virtuoso Cluster v6 it sort-of can, because v6 is more space efficient.&lt;/p&gt; &lt;p&gt;So we added the index:&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; create bitmap index &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0x1cb0b180&quot;&gt;rdf&lt;/a&gt;_quad_pogs on rdf_quad (p, o, g, s); &lt;/code&gt; &lt;/blockquote&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso v5 with&lt;br /&gt; gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso Cluster v6 with &lt;br /&gt;gspo, ogps&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt;Virtuoso Cluster v6 with &lt;br /&gt;gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;cold&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;210 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;136 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;33.4 s&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;warm&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.600 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;4.01 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.628 s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;OK, so now let us do it without a graph being specified. For all platforms, we drop any existing indices, and --&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt; create table r2 (g iri_id_8, s, iri_id_8, p iri_id_8, o any, primary key (s, p, o, g)) &lt;br /&gt; alter index R2 on R2 partition (s int (0hexffff00)); &lt;br /&gt; &lt;br /&gt; log_enable (2); &lt;br /&gt; insert into r2 (g, s, p, o) select g, s, p, o from rdf_quad; &lt;br /&gt; &lt;br /&gt; drop table rdf_quad; &lt;br /&gt; alter table r2 rename RDF_QUAD; &lt;br /&gt; create bitmap index rdf_quad_opgs on rdf_quad (o, p, g, s) partition (o varchar (-1, 0hexffff)); &lt;br /&gt; create bitmap index rdf_quad_pogs on rdf_quad (p, o, g, s) partition (o varchar (-1, 0hexffff)); &lt;br /&gt; create bitmap index rdf_quad_gpos on rdf_quad (g, p, o, s) partition (o varchar (-1, 0hexffff)); &lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;The code is identical for v5 and v6, except that with v5 we use &lt;code&gt;iri_id (32 bit)&lt;/code&gt; for the type, not &lt;code&gt;iri_id_8 (64 bit)&lt;/code&gt;. We note that we run out of IDs with v5 around a few billion triples, so with v6 we have double the ID length and still manage to be vastly more space efficient.&lt;/p&gt; &lt;p&gt;With the above 4 indices, we can query the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x6339b80&quot;&gt;data&lt;/a&gt; pretty much in any combination without hitting a full scan of any index. We note that all indices that do not begin with s end with s as a bitmap. This takes about 60% of the space of a non-bitmap index for data such as DBpedia.&lt;/p&gt; &lt;p&gt;If you intend to do completely arbitrary RDF queries in Virtuoso, then chances are you are best off with the above index scheme.&lt;/p&gt; &lt;table&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt; Virtuoso v5 with&lt;br /&gt; gspo, ogps, pogs&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;&lt;b&gt; Virtuoso Cluster v6 with &lt;br /&gt; spog, pogs, opgs, gpos &lt;/b&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;warm&lt;/b&gt; &lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.595 s&lt;/td&gt; &lt;td align=&quot;center&quot;&gt;0.617 s&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;p&gt;The cold times were about the same as above, so not reproduced.&lt;/p&gt; &lt;h3&gt;Graph or No Graph?&lt;/h3&gt; &lt;p&gt;It is in the SPARQL spirit to specify a graph and for pretty much any application, there are entirely sensible ways of keeping the data in graphs and specifying which ones are concerned by queries. This is why Virtuoso is set up for this by default.&lt;/p&gt; &lt;p&gt;On the other hand, for the open web scenario, dealing with an unknown large number of graphs, enumerating graphs is not possible and questions like which graph of which source asserts x become relevant. We have two distinct use cases which warrant different setups of the database, simple as that.&lt;/p&gt; &lt;p&gt;The latter use case is not really within the SPARQL spec, so implementations may or may not support this. For example &lt;a href=&quot;http://dbpedia.org/resource/Oracle_Database&quot; id=&quot;link-id0x11ed7028&quot;&gt;Oracle&lt;/a&gt; or Vertica would not do this well since they partition data according to graph or predicate, respectively. On the other hand, stores that work with one quad table, which is most of the ones out there, should do it maybe with some configuring, as shown above.&lt;/p&gt; &lt;p&gt;Frameworks like Jena are not to my &lt;a href=&quot;http://dbpedia.org/resource/Knowledge&quot; id=&quot;link-id0x1a49ded0&quot;&gt;knowledge&lt;/a&gt; geared towards having a wildcard for graph, although I would suppose this can be arranged by adding some &amp;quot;super-graph&amp;quot; object, a graph of all graphs. I don&amp;#39;t think this is directly supported and besides most apps would not need it.&lt;/p&gt; &lt;p&gt;Once the indices are right, there is no difference between specifying a graph and not specifying a graph with the queries considered. With more complex queries, specifying a graph or set of graphs does allow some optimizations that cannot be done with no graph specified. For example, bitmap intersections are possible only when all leading key parts are given.&lt;/p&gt; &lt;h3&gt;Conclusions&lt;/h3&gt; &lt;p&gt;The best warm cache time is with v5; the five queries run under 600 ms after the first go. This is noted to show that all-in-memory with a single thread of execution is hard to beat.&lt;/p&gt; &lt;p&gt;Cluster v6 performs the same queries in 623 ms. What is gained in parallelism is lost in latency if all operations complete in microseconds. On the other hand, Cluster v6 leaves v5 in the dust in any situation that has less than 100% hit rate. This is due to actual benefit from parallelism if operations take longer than a few microseconds, such as in the case of disk reads. Cluster v6 has substantially better data layout on disk, as well as fewer pages to load for the same content.&lt;/p&gt; &lt;p&gt;This makes it possible to run the queries without the pogs index on Cluster v6 even when v5 takes prohibitively long.&lt;/p&gt; &lt;p&gt;The morale of the story is to have a lot of RAM and space-efficient data representation.&lt;/p&gt; &lt;p&gt;The DBpedia benchmark does not specify any random access pattern that would give a measure of sustained throughput under load, so we are left with the extremes of cold and warm cache of which neither is quite realistic.&lt;/p&gt; &lt;p&gt;Chris Bizer and I have talked on and off about benchmarks and I have made suggestions that we will see incorporated into the Berlin SPARQL benchmark, which will, I believe, be much more informative.&lt;/p&gt; &lt;h3&gt;Appendix: Query Text&lt;/h3&gt; &lt;p&gt;For reference, the query texts specifying the graph are below. To run without specifying the graph, just drop the &lt;code&gt;FROM &amp;lt;&lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id0x1905bfd0&quot;&gt;http&lt;/a&gt;://dbpedia.org&amp;gt;&lt;/code&gt; from each query. The returned row counts are indicated below each query&amp;#39;s text.&lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;&lt;pre&gt; sparql SELECT ?p ?o FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/Metropolitan_Museum_of_Art&amp;gt; ?p ?o }; -- 1337 rows sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?film1 ?actor1 ?film2 ?actor2 FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { ?film1 p:starring &amp;lt;http://dbpedia.org/resource/Kevin_Bacon&amp;gt; . ?film1 p:starring ?actor1 . ?film2 p:starring ?actor1 . ?film2 p:starring ?actor2 . }; -- 23910 rows sparql PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?artist ?artwork ?museum ?director FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { ?artwork p:artist ?artist . ?artwork p:museum ?museum . ?museum p:director ?director }; -- 303 rows sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; SELECT ?s ?homepage FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:lat ?berlinLat . &amp;lt;http://dbpedia.org/resource/Berlin&amp;gt; geo:long ?berlinLong . ?s geo:lat ?lat . ?s geo:long ?long . ?s foaf:homepage ?homepage . FILTER ( ?lat &amp;lt;= ?berlinLat + 0.03190235436 &amp;amp;&amp;amp; ?long &amp;gt;= ?berlinLong - 0.08679199218 &amp;amp;&amp;amp; ?lat &amp;gt;= ?berlinLat - 0.03190235436 &amp;amp;&amp;amp; ?long &amp;lt;= ?berlinLong + 0.08679199218) }; -- 56 rows sparql PREFIX geo: &amp;lt;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;gt; PREFIX foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; PREFIX xsd: &amp;lt;http://www.w3.org/2001/XMLSchema#&amp;gt; PREFIX p: &amp;lt;http://dbpedia.org/property/&amp;gt; SELECT ?s ?a ?homepage FROM &amp;lt;http://dbpedia.org&amp;gt; WHERE { &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:lat ?nyLat . &amp;lt;http://dbpedia.org/resource/New_York_City&amp;gt; geo:long ?nyLong . ?s geo:lat ?lat . ?s geo:long ?long . ?s p:architect ?a . ?a foaf:homepage ?homepage . FILTER ( ?lat &amp;lt;= ?nyLat + 0.3190235436 &amp;amp;&amp;amp; ?long &amp;gt;= ?nyLong - 0.8679199218 &amp;amp;&amp;amp; ?lat &amp;gt;= ?nyLat - 0.3190235436 &amp;amp;&amp;amp; ?long &amp;lt;= ?nyLong + 0.8679199218) }; -- 13 rows &lt;/pre&gt; &lt;/code&gt; &lt;/blockquote&gt;</atom:content>
  <atom:updated>2008-05-12T11:24:36-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Comments about recent Semantic Gang Podcast</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-02#1357</atom:id>
  <atom:published>2008-05-02T21:44:31Z</atom:published>
  <atom:content type="html">&lt;p&gt;After listening to the &lt;a href=&quot;http://semanticgang.talis.com/2008/05/02/april-2008-the-semantic-web-gang-discuss-a-wikipedia-for-data/&quot; id=&quot;link-id1089e218&quot;&gt;latest Semantic Web Gang podcast&lt;/a&gt;, I found myself agreeing with some of the points made by &lt;a href=&quot;http://www.linkedin.com/in/iskold&quot; id=&quot;link-id10b91e58&quot;&gt;Alex Iskold&lt;/a&gt;, specifically: &lt;/p&gt; &lt;ul&gt;-- &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id106e24e0&quot;&gt;Linked Data&lt;/a&gt; does not implicitly imply making all your &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id17ab3d48&quot;&gt;data&lt;/a&gt; public&lt;/ul&gt; &lt;ul&gt;-- &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11fdcef0&quot;&gt;Linked Data&lt;/a&gt; principles benefit &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id109756e8&quot;&gt;Intranet&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Extranet&quot; id=&quot;link-id1099cfd8&quot;&gt;Extranet&lt;/a&gt; style &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10cd25b0&quot;&gt;data&lt;/a&gt; integration (trumps alternative &lt;a href=&quot;http://dbpedia.org/resource/federated_database_system&quot; id=&quot;link-id14f29940&quot;&gt;distributed database&lt;/a&gt; integration approaches any day)&lt;/ul&gt; &lt;ul&gt;-- Business exploitation of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0xca51940&quot;&gt;Linked Data&lt;/a&gt; on the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; will certainly be driven by the correlation of opportunity costs (which is more than likely what Alex meant by &amp;quot;use cases&amp;quot;) associated with the lack of URIs originating from the domain of a given business (Tom Heath: also effectively alluded to this via his &lt;a href=&quot;http://dbpedia.org/resource/BBC&quot; id=&quot;link-id16f33348&quot;&gt;BBC&lt;/a&gt; and &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id10decf38&quot;&gt;URI&lt;/a&gt; land grab anecdotes; same applies Georgi&amp;#39;s examples)&lt;/ul&gt; &lt;ul&gt;-- History is a great tutor, answers to many of today&amp;#39;s problems always lie somewhere in plain sight of the past.&lt;/ul&gt; &lt;p&gt;Of course, I also believe that &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; serves Web &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x1afebd58&quot;&gt;Data&lt;/a&gt; Integration across the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id10aa5668&quot;&gt;Internet&lt;/a&gt; very well too, and the fact that it will be beneficial to businesses in a big way. No individual or organization is an island, I think the &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id0xb25fbd0&quot;&gt;Internet&lt;/a&gt; and Web have done a good job of demonstrating that thus far :-) We&amp;#39;re all &lt;a href=&quot;http://dbpedia.org/resource/Data&quot;&gt;data&lt;/a&gt; nodes in a &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id5d8a3a8&quot;&gt;Giant Global Graph&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/danieljohnlewis#this&quot; id=&quot;link-id17cac8a0&quot;&gt;Daniel lewis&lt;/a&gt; did shed light on the read-write aspects of the Linked Data &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10be8590&quot;&gt;Web&lt;/a&gt;, which is actually very close to the callout for a Wikipedia for Data. &lt;a href=&quot;http://www.w3.org/People/Berners-Lee/card#i&quot; id=&quot;link-id10a810c0&quot;&gt;TimBL&lt;/a&gt; has been working on this via &lt;a href=&quot;http://dig.csail.mit.edu/2005/ajar/release/tabulator/0.8/tab.html&quot; id=&quot;link-id184b7108&quot;&gt;Tabulator&lt;/a&gt; (see &lt;a href=&quot;http://dig.csail.mit.edu/2007/tab/tutorial/editing.mov&quot; id=&quot;link-id1416f1e8&quot;&gt;Tabulator Editing Screencast&lt;/a&gt;), &lt;a href=&quot;http://bnode.org/about&quot; id=&quot;link-id17e33750&quot;&gt;Bengamin Nowack&lt;/a&gt; also added &lt;a href=&quot;http://arc.semsol.org/download/plugins/data_wiki&quot; id=&quot;link-id1688cc40&quot;&gt;similar functionality to ARC&lt;/a&gt;, and of course we support the same &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id10bff7c8&quot;&gt;SPARQL&lt;/a&gt; UPDATE into an &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id168ace08&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Information&quot; id=&quot;link-id10641878&quot;&gt;information&lt;/a&gt; resource via the &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xddb5240&quot;&gt;RDF&lt;/a&gt; Sink feature of our WebDAV and &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/OdsBriefcase&quot; id=&quot;link-id0x11199310&quot;&gt;ODS&lt;/a&gt;-Briefcase implementations.&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-05T20:06:42.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>In Perpetual Pursuit of Context</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-02#1356</atom:id>
  <atom:published>2008-05-02T19:18:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;I&amp;#39;ve always been of the opinion that concise value proposition articulation shouldn&amp;#39;t be the achilles of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id158efe90&quot;&gt;Semantic Web&lt;/a&gt;. As the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id13a2db40&quot;&gt;Linked Data&lt;/a&gt; wave climbs up the &amp;quot;value Appreciation and Comprehension chain&amp;quot;, it&amp;#39;s getting clearer by the second that &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id109316f0&quot;&gt;Context&lt;/a&gt;&amp;quot; is a point of confluence for &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id108daa60&quot;&gt;Semantic Web&lt;/a&gt; Technologies and easy to comprehend value, from the perspectives of those outside the core community.&lt;/p&gt; &lt;p&gt;In today&amp;#39;s primarily Document centric &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt;, the pursuit of &lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id14edadd0&quot;&gt;Context&lt;/a&gt; is akin to pursuing a mirage in a desert of user generated content. The quest is labor intensive, and you ultimaely end up without water at the end of the pursuit :-)&lt;/p&gt; &lt;p&gt;Listening to the &lt;a href=&quot;http://blogs.talis.com/nodalities/2008/05/christine-connors-talks-about-semantic-technologies-at-dow-jones.php&quot; id=&quot;link-id12d5e1c0&quot;&gt;Christine Connor&amp;#39;s podcast interview with Talis&lt;/a&gt; simply reinforces my strong belief that &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Context_%28language_use%29&quot; id=&quot;link-id0x1ec69518&quot;&gt;Context&lt;/a&gt;, Context, Context&amp;quot; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xa279438&quot;&gt;Semantic Web&lt;/a&gt;&amp;#39;s equivalent of Real Estate&amp;#39;s &amp;quot;Location, Location, Location&amp;quot; (ignore the &lt;a href=&quot;http://dbpedia.org/resource/Subprime_lending&quot; id=&quot;link-id140b8098&quot;&gt;subprime&lt;/a&gt; loans mess for now). The critical thing to note is that you cannot unravel &amp;quot;Context&amp;quot; from existing Web content without incorporating powerful disambiguation technology into an &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id15a2f380&quot;&gt;Entity&lt;/a&gt; Extraction&amp;quot; process. Of course, you cannot even consider seriously pursing any &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id10868a18&quot;&gt;entity&lt;/a&gt; extraction and disambiguation endeavor without a lookup backbone that exposes &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id168dc230&quot;&gt;Named Entities&lt;/a&gt;&amp;quot; and their relationships to &amp;quot;&lt;a href=&quot;http://dbpedia.org/resource/Topic&quot; id=&quot;link-id17cb1950&quot;&gt;Subject matter Concepts&lt;/a&gt;&amp;quot; (BTW - this is what &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id14f406a0&quot;&gt;UMBEL&lt;/a&gt; is all about). Thus, when looking at the broad subject of the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot;&gt;Semantic Web&lt;/a&gt;, we can also look at &amp;quot;Context&amp;quot; as the vital point of confluence for the &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id12d67e38&quot;&gt;Data&lt;/a&gt; oriented (&lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14f8daf0&quot;&gt;Linked Data&lt;/a&gt;) and the &amp;quot;Linguistic Meaning&amp;quot; oriented perspectives.&lt;/p&gt; &lt;p&gt;I am even inclined to state publicly that &amp;quot;Context&amp;quot; may ultimately be the foundation for &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=dimension%20web%204.0%20&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id17cb0708&quot;&gt;4th &amp;quot;Web Interaction Dimension&amp;quot;&lt;/a&gt; where practical use of &lt;a href=&quot;http://dbpedia.org/resource/Artificial_intelligence&quot; id=&quot;link-id10b15088&quot;&gt;AI&lt;/a&gt; leverages a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1ebf9310&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10b27018&quot;&gt;Web&lt;/a&gt; substrate en route to exposing new kinds of value :-)&lt;/p&gt; &lt;p&gt;&amp;quot;Context&amp;quot; may also be the focal point of concise value proposition articulation to &lt;a href=&quot;http://dbpedia.org/resource/Venture_Capital&quot; id=&quot;link-id10837578&quot;&gt;VCs&lt;/a&gt; as in: &amp;quot;My solution offers the ability to discover and exploit &amp;quot;Context&amp;quot; iteratively, at the rate of $X.XX per iteration, across a variety of market segments :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-03T15:07:32-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>XTech Talks covering Linked Data</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-05-02#1355</atom:id>
  <atom:published>2008-05-02T14:53:08Z</atom:published>
  <atom:content type="html">&lt;p&gt;Courtesy a post by &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/bizer#this&quot; id=&quot;link-id10868548&quot;&gt;Chris Bizer&lt;/a&gt; to the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id15739748&quot;&gt;LOD&lt;/a&gt; community &lt;a href=&quot;http://lists.w3.org/Archives/Public/public-lod/&quot; id=&quot;link-id10fae0f8&quot;&gt;mailing list&lt;/a&gt;, here is a list of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id140a0880&quot;&gt;Linked Data&lt;/a&gt; oriented talks at the upcoming &lt;a href=&quot;http://2008.xtech.org&quot; id=&quot;link-id12801f00&quot;&gt;XTech&lt;/a&gt; 2008 event (also see the &lt;a href=&quot;http://2008.xtech.org/public/schedule/grid&quot; id=&quot;link-id10f65940&quot;&gt;XTech 2008 Schedule&lt;/a&gt; which is &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1258a4c8&quot;&gt;Linked Data&lt;/a&gt; friendly). Of course, I am posting this to my &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id140a29c0&quot;&gt;Blog&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id12d5a640&quot;&gt;Data&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Spaces&quot; id=&quot;link-id10979b80&quot;&gt;Space&lt;/a&gt; with the sole purpose of adding &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id176be078&quot;&gt;data&lt;/a&gt; to the rapidly growing &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id1099aec8&quot;&gt;Giant Global Graph&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10d72d88&quot;&gt;Linked Data&lt;/a&gt;, basically adding to my collection of live &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11014000&quot;&gt;Linked Data&lt;/a&gt; utility demos :-)&lt;/p&gt; &lt;p&gt;Here is the list:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/561&quot; id=&quot;link-id17df4d78&quot;&gt;Linked Data Deployment&lt;/a&gt; (&lt;a href=&quot;http://myopenlink.net/dataspace/person/danieljohnlewis#this&quot; id=&quot;link-id17c47d28&quot;&gt;Daniel Lewis&lt;/a&gt;, &lt;a href=&quot;http://www.openlinksw.com/dataspace/organization/openlink#this&quot; id=&quot;link-id108fce00&quot;&gt;OpenLink Software&lt;/a&gt;)&lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/524&quot; id=&quot;link-id1068c0e0&quot;&gt;The Programmes Ontology&lt;/a&gt; (Tom Scott, &lt;a href=&quot;http://dbpedia.org/resource/BBC&quot; id=&quot;link-id1566da50&quot;&gt;BBC&lt;/a&gt; and all) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/528&quot; id=&quot;link-id1072be40&quot;&gt;SemWebbing the London Gazette&lt;/a&gt; (Jeni Tennison, The Stationery Office) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/583&quot; id=&quot;link-id1099e4e0&quot;&gt;Searching, publishing and remixing a Web of Semantic Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/person/cygri#this&quot; id=&quot;link-id17e25b78&quot;&gt;Richard Cyganiak&lt;/a&gt;, DERI Galway) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/477&quot; id=&quot;link-idf9764c8&quot;&gt;Building a Semantic Web Search Engine: Challenges and Solutions&lt;/a&gt; (Aidan Hogan, DERI Galway) &lt;/li&gt; &lt;li&gt;&amp;#39;&lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/550&quot; id=&quot;link-id140a3c50&quot;&gt;That&amp;#39;s not what you said yesterday!&lt;/a&gt;&amp;#39; - evolving your &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; API (&lt;a href=&quot;http://iandavis.com/id/me&quot; id=&quot;link-id14f8d498&quot;&gt;Ian Davis&lt;/a&gt;, Talis) &lt;/li&gt; &lt;li&gt; &lt;a href=&quot;http://2008.xtech.org/public/schedule/detail/527&quot; id=&quot;link-id10c5a9c8&quot;&gt;Representing, indexing and mining scientific data using XML and RDF: Golem and CrystalEye&lt;/a&gt; (&lt;a href=&quot;http://wwmm.ch.cam.ac.uk/blogs/walkingshaw/&quot; id=&quot;link-id108c5e28&quot;&gt;Andrew Walkingshaw&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/University_of_Cambridge&quot; id=&quot;link-id10891560&quot;&gt;University of Cambridge&lt;/a&gt;)&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;For the time challenged (i.e. those unable to view this post using it&amp;#39;s permalink / &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id10db39f0&quot;&gt;URI&lt;/a&gt; as a &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10f29bb8&quot;&gt;data&lt;/a&gt; source via the &lt;a href=&quot;http://demo.openlinksw.com/rdfbrowser&quot; id=&quot;link-id10f72778&quot;&gt;OpenLink RDF Browser&lt;/a&gt;, &lt;a href=&quot;http://zitgist.com/about/&quot; id=&quot;link-id107b73b0&quot;&gt;Zitgist&lt;/a&gt; &lt;a href=&quot;http://dataviewer.zitgist.com&quot; id=&quot;link-id1686d528&quot;&gt;Data Viewer&lt;/a&gt;, &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/rdf_browser&quot; id=&quot;link-id110479e8&quot;&gt;DISCO Hyperdata Browser&lt;/a&gt;, or &lt;a href=&quot;http://dig.csail.mit.edu/2005/ajar/release/tabulator/0.8/tab.html&quot; id=&quot;link-id140ba0e8&quot;&gt;Tabulator&lt;/a&gt;), the benefits of this post are as follows:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;automatic &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Identifier&quot; id=&quot;link-id172d2fc8&quot;&gt;URI&lt;/a&gt; generation for all linked items in this post&lt;/li&gt; &lt;li&gt;automatic propagation of tags to &lt;a href=&quot;http://del.icio.us&quot; id=&quot;link-id10547380&quot;&gt;del&lt;/a&gt;.&lt;a href=&quot;http://del.icio.us&quot; id=&quot;link-id1093cc10&quot;&gt;icio&lt;/a&gt;.&lt;a href=&quot;http://del.icio.us&quot; id=&quot;link-id168ce3a0&quot;&gt;us&lt;/a&gt;, &lt;a href=&quot;http://www.technorati.com&quot; id=&quot;link-id17aa8af0&quot;&gt;Technorati&lt;/a&gt;, and &lt;a href=&quot;http://www.pingthesemanticweb.com/about/&quot; id=&quot;link-id10868ad8&quot;&gt;PingTheSemanticWeb&lt;/a&gt; &lt;/li&gt; &lt;li&gt;automatic association of formal meanings to my Tags using the &lt;a href=&quot;http://moat-project.org/ontology&quot; id=&quot;link-id10c98608&quot;&gt;MOAT Ontology&lt;/a&gt; &lt;/li&gt; &lt;li&gt;automatic collation and generation of statistical &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id10a4d1d8&quot;&gt;data&lt;/a&gt; about my tags using the SCOT Ontology (*missing link is a callout to SCOT &lt;a href=&quot;http://dbpedia.org/resource/Tag&quot; id=&quot;link-id168b7c10&quot;&gt;Tag&lt;/a&gt; Ontology folks to sort the project&amp;#39;s home page &lt;a href=&quot;http://dbpedia.org/resource/Uniform_Resource_Locator&quot; id=&quot;link-id11fd4118&quot;&gt;URL&lt;/a&gt; at the very least*) &lt;/li&gt; &lt;li&gt;explicit typing of my Tags as &lt;a href=&quot;http://dbpedia.org/resource/SKOS&quot; id=&quot;link-id10940eb8&quot;&gt;SKOS&lt;/a&gt; Concepts. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Put differently, I cost-effectively contribute to the &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10a081a8&quot;&gt;GGG&lt;/a&gt; across all &lt;a href=&quot;http://www.openlinksw.com/weblog/public/search.vspx?blogid=127&amp;amp;q=web%20dimensions&amp;amp;type=text&amp;amp;output=html&quot; id=&quot;link-id10597530&quot;&gt;Web interaction dimensions&lt;/a&gt; (1.0, 2.0, 3.0) :-)&lt;/p&gt;</atom:content>
  <atom:updated>2008-05-05T17:07:17-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL at WWW 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-30#1354</atom:id>
  <atom:published>2008-04-30T16:28:10Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;SPARQL at WWW 2008&lt;/div&gt; &lt;p&gt;Andy Seaborne and Eric Prud&amp;#39;hommeaux, editors of the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0x183b13a8&quot;&gt;SPARQL&lt;/a&gt; recommendation, convened a SPARQL birds of a feather session at &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0xd31c2d0&quot;&gt;WWW 2008&lt;/a&gt;. The administrative outcome was that implementors could now experiment with extensions, hopefully keeping each other current about their efforts and that towards the end of 2008, a new W3C working group might begin formalizing the experiences into a new SPARQL spec.&lt;/p&gt; &lt;p&gt;The session drew a good crowd, including many users and developers. The wishes were largely as expected, with a few new ones added. Many of the wishes already had diverse implementations, however most often without interop. I will below give some comments on the main issues discussed.&lt;/p&gt; &lt;/div&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SPARQL Update&lt;/b&gt; - This is likely the most universally agreed upon extension. Implementations exist, largely along the lines of Andy Seaborne&amp;#39;s SPARUL spec, which is also likely material for a W3C member submission. The issue is without much controversy; transactions fall outside the scope, which is reasonable enough. With triple stores, we can define things as combinations of inserts and deletes, and isolation we just leave aside. If anything, operating on a transactional platform such as &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x1d442cd8&quot;&gt;Virtuoso&lt;/a&gt;, one wishes to disable transactions for any operations such as bulk loads and long-running inserts and deletes. Transactionality has pretty much no overhead for a few hundred rows, but for a few hundred million rows the cost of locking and rollback is prohibitive. With Virtuoso, we have a row auto-commit mode which we recommend for use with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xec62c58&quot;&gt;RDF&lt;/a&gt;: It commits by itself now and then, optionally keeping a roll forward log, and is transactional enough not to leave half triples around, i.e., inserted in one index but not another.&lt;/p&gt; &lt;p&gt;As far as we are concerned, updating physical triples along the SPARUL lines is pretty much a done deal.&lt;/p&gt; &lt;p&gt;The matter of updating relational &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x19f995c8&quot;&gt;data&lt;/a&gt; mapped to RDF is a whole other kettle of fish. On this, I should say that RDF has no special virtues for expressing transactions but rather has a special genius for integration. Updating is best left to web service interfaces that use &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0x125b2b98&quot;&gt;SQL&lt;/a&gt; on the inside. Anyway, updating union views, which most mappings will be, is complicated. Besides, for transactions, one usually knows exactly what one wishes to update.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Full Text&lt;/b&gt; - Many people expressed a desire for full text access. Here we run into a deplorable confusion with regexps. The closest SPARQL has to full text in its native form is regexps, but these are not really mappable to full text except in rare special cases and I would despair of explaining to an end user what exactly these cases are. So, in principle, some regexps are equivalent to full text but in practice I find it much preferable to keep these entirely separate.&lt;/p&gt; &lt;p&gt;It was noted that what the users want is a text box for search words. This is a front end to the CONTAINS predicate of most SQL implementations. Ours is MS SQL Server compatible and has a SPARQL version called &lt;code&gt;bif:contains&lt;/code&gt;. One must still declare which triples one wants indexed for full text, though. This admin overhead seems inevitable, as text indexing is a large overhead and not needed by all applications.&lt;/p&gt; &lt;p&gt;Also, text hits are not boolean; usually they come with a hit score. Thus, a SPARQL extension for this could look like &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;select * where { ?thing has_description ?d . ?d ftcontains &amp;quot;gizmo&amp;quot; ftand &amp;quot;widget&amp;quot; score ?score . }&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return all the subjects, descriptions, and scores, from subjects with a has_description property containing widget and gizmo. Extending the basic pattern is better than having the match in a filter, since the match binds a variable.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id0xfec6788&quot;&gt;XQuery&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0x1a789e38&quot;&gt;XPath&lt;/a&gt; groups have recently come up with a full-text spec, so I used their style of syntax above. We already have a full-text extension, as do some others. but for standardization, it is probably most appropriate to take the XQuery work as a basis. The XQuery full-text spec is quite complex, but I would expect most uses to get by with a small subset, and the structure seems better thought out, at first glance, than the more ad-hoc implementations in diverse SQLs.&lt;/p&gt; &lt;p&gt;Again, declaring any text index to support the search, as well as its timeliness or transactionality, are best left to implementations.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Federation&lt;/b&gt; - This is a tricky matter. &lt;a href=&quot;http://jena.sourceforge.net/ARQ/&quot; id=&quot;link-id0xba487f0&quot;&gt;ARQ&lt;/a&gt; has a SPARQL extension for sending a nested set of triple patterns to a specific end-point. The &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0xf8a5ab0&quot;&gt;DARQ&lt;/a&gt; project has something more, including a selectivity model for SPARQL.&lt;/p&gt; &lt;p&gt;With federated SQL, life is simpler since after the views are expanded, we have a query where each table is at a known server and has more or less known statistics. Generally, execution plans where as much work as possible is pushed to the remote servers are preferred, and modeling the latencies is not overly hard. With SPARQL, each triple pattern could in principle come from any of the federated servers. Associating a specific end-point to a fragment of the query just passes the problem to the user. It is my guess that this is the best we can do without getting very elaborate, and possibly buggy, end-point content descriptions for routing federated queries.&lt;/p&gt; &lt;p&gt;Having said this, there remains the problem of join order. I suggested that we enhance the protocol by allowing asking an end-point for the query cost for a given SPARQL query. Since they all must have a cost model for optimization, this should not be an impossible request. A time cost and estimated cardinality would be enough. Making statistics available &lt;i&gt;à la&lt;/i&gt; DARQ was also discussed. Being able to declare cardinalities expected of a remote end-point is probably necessary anyway, since not all will implement the cost model interface. For standardization, agreeing on what is a proper description of content and cardinality and how fine grained this must be will be so difficult that I would not wait for it. A cost model interface would nicely hide this within the end-point itself.&lt;/p&gt; &lt;p&gt;With Virtuoso, we do not have a federated SPARQL scheme but we could have the ARQ-like service construct. We&amp;#39;d use our own cost model with explicit declarations of cardinalities of the remote data for guessing a join order. Still, this is a bit of work. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;For practicality, the service construct coupled with join order hints is the best short term bet. Making this pretty enough for standardization is not self-evident, as it requires end-point description and/or cost model hooks for things to stay declarative.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;End-point description&lt;/b&gt; - This question has been around for a while; I have &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1085&quot; id=&quot;link-id101d3440&quot;&gt;blogged about it earlier&lt;/a&gt;, but we are not really at a point where there would be even rough consensus about an end-point ontology. We should probably do something on our own to demonstrate some application of this, as we host lots of &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x162d0de8&quot;&gt;linked open data&lt;/a&gt; sets.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SQL equivalence&lt;/b&gt; - There were many requests for aggregation, some for subqueries and nesting, expressions in select, negation, existence and so on. I would call these all SQL equivalence. One use case was taking all the teams in the database and for all with over 5 members, add the big_team class and a property for member count.&lt;/p&gt; &lt;p&gt;With Virtuoso, we could write this as -- &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;construct { ?team a big_team . ?team member_count ?ct } from ... where {?team a team . { select ?team2 count (*) as ?ct where { ?m member_of ?team2 } . filter (?team = ?team2 and ? ct &amp;gt; 5) }}&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We have pretty much all the SQL equivalence features, as we have been working for some time at translating the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0x11c870c8&quot;&gt;TPC-H&lt;/a&gt; workload into SPARQL.&lt;/p&gt; &lt;p&gt;The usefulness of these things is uncontested but standardization could be hard as there are subtle questions about variable scope and the like.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Inference&lt;/b&gt; - The SPARQL spec does not deal with transitivity or such matters because it is assumed that these are handled by an underlying inference layer. This is however most often not so. There was interest in more fine grained control of inference, for example declaring that just one property in a query would be transitive or that subclasses should be taken into account in only one triple pattern. As far as I am concerned, this is very reasonable, and we even offer extensions for this sort of thing in Virtuoso&amp;#39;s SPARQL. This however only makes sense if the inference is done at query time and pattern by pattern. For instance, if forward chaining is used, this no longer makes sense. Specifying that some forward chaining ought to be done at query time is impractical, as the operation can be very large and time consuming and it is the DBA&amp;#39;s task to determine what should be stored and for how long, how changes should be propagated, and so on. All these are application dependent and standardizing will be difficult.&lt;/p&gt; &lt;p&gt;Support for RDF features like lists and bags would all fall into the functions an underlying inference layer should perform. These things are of special interest when querying &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0x156f3830&quot;&gt;OWL&lt;/a&gt; models, for example.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Path expressions&lt;/b&gt; - Path expressions were requested by a few people. We have implemented some, as in &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;?product+?has_supplier+&amp;gt;s_name = &amp;quot;Gizmos, Inc.&amp;quot;.&lt;/code&gt; &lt;/blockquote&gt; This means that one supplier of product has name &amp;quot;Gizmo, Inc.&amp;quot;. This is a nice shorthand but we run into problems if we start supporting repetitive steps, optional steps, and the like.&lt;/li&gt; &lt;p&gt;In conclusion, update, full text, and basic counting and grouping would seem straightforward at this point. Nesting queries, value subqueries, views, and the like should not be too hard if an agreement is reached on scope rules. Inference and federation will probably need more experimentation but a lot can be had already with very simple fine grained control of backward chaining, if such applies, or with explicit end-point references and explicit join order. These are practical but not pretty enough for committee consensus, would be my guess. Anyway, it will be a few months before anything formal will happen.&lt;/p&gt;</atom:content>
  <atom:updated>2008-08-28T11:26:06.000004-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>SPARQL at WWW 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-04-30#1353</atom:id>
  <atom:published>2008-04-30T15:59:15Z</atom:published>
  <atom:content type="html">&lt;p&gt;Andy Seaborne and Eric Prud&amp;#39;hommeaux, editors of the &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xddcd418&quot;&gt;SPARQL&lt;/a&gt; recommendation, convened a SPARQL birds of a feather session at &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0xf6c0510&quot;&gt;WWW 2008&lt;/a&gt;. The administrative outcome was that implementors could now experiment with extensions, hopefully keeping each other current about their efforts and that towards the end of 2008, a new W3C working group might begin formalizing the experiences into a new SPARQL spec.&lt;/p&gt; &lt;p&gt;The session drew a good crowd, including many users and developers. The wishes were largely as expected, with a few new ones added. Many of the wishes already had diverse implementations, however most often without interop. I will below give some comments on the main issues discussed.&lt;/p&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SPARQL Update&lt;/b&gt; - This is likely the most universally agreed upon extension. Implementations exist, largely along the lines of Andy Seaborne&amp;#39;s SPARUL spec, which is also likely material for a W3C member submission. The issue is without much controversy; transactions fall outside the scope, which is reasonable enough. With triple stores, we can define things as combinations of inserts and deletes, and isolation we just leave aside. If anything, operating on a transactional platform such as &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xf9e8d18&quot;&gt;Virtuoso&lt;/a&gt;, one wishes to disable transactions for any operations such as bulk loads and long-running inserts and deletes. Transactionality has pretty much no overhead for a few hundred rows, but for a few hundred million rows the cost of locking and rollback is prohibitive. With Virtuoso, we have a row auto-commit mode which we recommend for use with &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id0xe098028&quot;&gt;RDF&lt;/a&gt;: It commits by itself now and then, optionally keeping a roll forward log, and is transactional enough not to leave half triples around, i.e., inserted in one index but not another.&lt;/p&gt; &lt;p&gt;As far as we are concerned, updating physical triples along the SPARUL lines is pretty much a done deal.&lt;/p&gt; &lt;p&gt;The matter of updating relational &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xf55ec50&quot;&gt;data&lt;/a&gt; mapped to RDF is a whole other kettle of fish. On this, I should say that RDF has no special virtues for expressing transactions but rather has a special genius for integration. Updating is best left to web service interfaces that use &lt;a href=&quot;http://dbpedia.org/resource/SQL&quot; id=&quot;link-id0xff00f38&quot;&gt;SQL&lt;/a&gt; on the inside. Anyway, updating union views, which most mappings will be, is complicated. Besides, for transactions, one usually knows exactly what one wishes to update.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Full Text&lt;/b&gt; - Many people expressed a desire for full text access. Here we run into a deplorable confusion with regexps. The closest SPARQL has to full text in its native form is regexps, but these are not really mappable to full text except in rare special cases and I would despair of explaining to an end user what exactly these cases are. So, in principle, some regexps are equivalent to full text but in practice I find it much preferable to keep these entirely separate.&lt;/p&gt; &lt;p&gt;It was noted that what the users want is a text box for search words. This is a front end to the CONTAINS predicate of most SQL implementations. Ours is MS SQL Server compatible and has a SPARQL version called &lt;code&gt;bif:contains&lt;/code&gt;. One must still declare which triples one wants indexed for full text, though. This admin overhead seems inevitable, as text indexing is a large overhead and not needed by all applications.&lt;/p&gt; &lt;p&gt;Also, text hits are not boolean; usually they come with a hit score. Thus, a SPARQL extension for this could look like &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;select * where { ?thing has_description ?d . ?d ftcontains &amp;quot;gizmo&amp;quot; ftand &amp;quot;widget&amp;quot; score ?score . }&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;This would return all the subjects, descriptions, and scores, from subjects with a has_description property containing widget and gizmo. Extending the basic pattern is better than having the match in a filter, since the match binds a variable.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://dbpedia.org/resource/XQuery&quot; id=&quot;link-id0xee42f50&quot;&gt;XQuery&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/XPath&quot; id=&quot;link-id0xd169630&quot;&gt;XPath&lt;/a&gt; groups have recently come up with a full-text spec, so I used their style of syntax above. We already have a full-text extension, as do some others. but for standardization, it is probably most appropriate to take the XQuery work as a basis. The XQuery full-text spec is quite complex, but I would expect most uses to get by with a small subset, and the structure seems better thought out, at first glance, than the more ad-hoc implementations in diverse SQLs.&lt;/p&gt; &lt;p&gt;Again, declaring any text index to support the search, as well as its timeliness or transactionality, are best left to implementations.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Federation&lt;/b&gt; - This is a tricky matter. &lt;a href=&quot;http://jena.sourceforge.net/ARQ/&quot; id=&quot;link-id0xcbe1e18&quot;&gt;ARQ&lt;/a&gt; has a SPARQL extension for sending a nested set of triple patterns to a specific end-point. The &lt;a href=&quot;http://darq.sourceforge.net/&quot; id=&quot;link-id0xe7c0088&quot;&gt;DARQ&lt;/a&gt; project has something more, including a selectivity model for SPARQL.&lt;/p&gt; &lt;p&gt;With federated SQL, life is simpler since after the views are expanded, we have a query where each table is at a known server and has more or less known statistics. Generally, execution plans where as much work as possible is pushed to the remote servers are preferred, and modeling the latencies is not overly hard. With SPARQL, each triple pattern could in principle come from any of the federated servers. Associating a specific end-point to a fragment of the query just passes the problem to the user. It is my guess that this is the best we can do without getting very elaborate, and possibly buggy, end-point content descriptions for routing federated queries.&lt;/p&gt; &lt;p&gt;Having said this, there remains the problem of join order. I suggested that we enhance the protocol by allowing asking an end-point for the query cost for a given SPARQL query. Since they all must have a cost model for optimization, this should not be an impossible request. A time cost and estimated cardinality would be enough. Making statistics available &lt;i&gt;à la&lt;/i&gt; DARQ was also discussed. Being able to declare cardinalities expected of a remote end-point is probably necessary anyway, since not all will implement the cost model interface. For standardization, agreeing on what is a proper description of content and cardinality and how fine grained this must be will be so difficult that I would not wait for it. A cost model interface would nicely hide this within the end-point itself.&lt;/p&gt; &lt;p&gt;With Virtuoso, we do not have a federated SPARQL scheme but we could have the ARQ-like service construct. We&amp;#39;d use our own cost model with explicit declarations of cardinalities of the remote data for guessing a join order. Still, this is a bit of work. We&amp;#39;ll see.&lt;/p&gt; &lt;p&gt;For practicality, the service construct coupled with join order hints is the best short term bet. Making this pretty enough for standardization is not self-evident, as it requires end-point description and/or cost model hooks for things to stay declarative.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;End-point description&lt;/b&gt; - This question has been around for a while; I have &lt;a href=&quot;http://www.openlinksw.com/weblog/oerling/?id=1085&quot; id=&quot;link-id101d3440&quot;&gt;blogged about it earlier&lt;/a&gt;, but we are not really at a point where there would be even rough consensus about an end-point ontology. We should probably do something on our own to demonstrate some application of this, as we host lots of &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xfaec780&quot;&gt;linked open data&lt;/a&gt; sets.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;SQL equivalence&lt;/b&gt; - There were many requests for aggregation, some for subqueries and nesting, expressions in select, negation, existence and so on. I would call these all SQL equivalence. One use case was taking all the teams in the database and for all with over 5 members, add the big_team class and a property for member count.&lt;/p&gt; &lt;p&gt;With Virtuoso, we could write this as -- &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;construct { ?team a big_team . ?team member_count ?ct } from ... where {?team a team . { select ?team2 count (*) as ?ct where { ?m member_of ?team2 } . filter (?team = ?team2 and ? ct &amp;gt; 5) }}&lt;/code&gt; &lt;/blockquote&gt; &lt;p&gt;We have pretty much all the SQL equivalence features, as we have been working for some time at translating the &lt;a href=&quot;http://dbpedia.org/resource/TPC-H&quot; id=&quot;link-id0xe2392e8&quot;&gt;TPC-H&lt;/a&gt; workload into SPARQL.&lt;/p&gt; &lt;p&gt;The usefulness of these things is uncontested but standardization could be hard as there are subtle questions about variable scope and the like.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Inference&lt;/b&gt; - The SPARQL spec does not deal with transitivity or such matters because it is assumed that these are handled by an underlying inference layer. This is however most often not so. There was interest in more fine grained control of inference, for example declaring that just one property in a query would be transitive or that subclasses should be taken into account in only one triple pattern. As far as I am concerned, this is very reasonable, and we even offer extensions for this sort of thing in Virtuoso&amp;#39;s SPARQL. This however only makes sense if the inference is done at query time and pattern by pattern. For instance, if forward chaining is used, this no longer makes sense. Specifying that some forward chaining ought to be done at query time is impractical, as the operation can be very large and time consuming and it is the DBA&amp;#39;s task to determine what should be stored and for how long, how changes should be propagated, and so on. All these are application dependent and standardizing will be difficult.&lt;/p&gt; &lt;p&gt;Support for RDF features like lists and bags would all fall into the functions an underlying inference layer should perform. These things are of special interest when querying &lt;a href=&quot;http://dbpedia.org/resource/Web_Ontology_Language&quot; id=&quot;link-id0xfd87f78&quot;&gt;OWL&lt;/a&gt; models, for example.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt; &lt;b&gt;Path expressions&lt;/b&gt; - Path expressions were requested by a few people. We have implemented some, as in &lt;/p&gt; &lt;blockquote&gt; &lt;code&gt;?product+?has_supplier+&amp;gt;s_name = &amp;quot;Gizmos, Inc.&amp;quot;.&lt;/code&gt; &lt;/blockquote&gt; This means that one supplier of product has name &amp;quot;Gizmo, Inc.&amp;quot;. This is a nice shorthand but we run into problems if we start supporting repetitive steps, optional steps, and the like.&lt;/li&gt; &lt;p&gt;In conclusion, update, full text, and basic counting and grouping would seem straightforward at this point. Nesting queries, value subqueries, views, and the like should not be too hard if an agreement is reached on scope rules. Inference and federation will probably need more experimentation but a lot can be had already with very simple fine grained control of backward chaining, if such applies, or with explicit end-point references and explicit join order. These are practical but not pretty enough for committee consensus, would be my guess. Anyway, it will be a few months before anything formal will happen.&lt;/p&gt;</atom:content>
  <atom:updated>2008-08-28T11:26:00-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Clearing Up RDF misrepresentation once again!</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-04-30#1352</atom:id>
  <atom:published>2008-04-30T15:51:17Z</atom:published>
  <atom:content type="html">&lt;p&gt; &lt;a href=&quot;http://myopenlink.net/dataspace/person/danieljohnlewis#this&quot; id=&quot;link-id12d57690&quot;&gt;Daniel Lewis&lt;/a&gt; has penned a post titled: &lt;a href=&quot;http://vanirsystems.com/danielsblog/2008/04/30/clearing-up-some-misconceptions-again/&quot; id=&quot;link-id10c99f18&quot;&gt;Clearing up some misconceptions..again&lt;/a&gt;, in response to &lt;a href=&quot;http://elgg.org/bwerdmuller/foaf#elgg2&quot; id=&quot;link-id14fe1bc8&quot;&gt;Ben Werdmuller&lt;/a&gt;&amp;#39;s post titled: &lt;a href=&quot;http://blogs.zdnet.com/social/?p=477&quot; id=&quot;link-id141cee58&quot;&gt;Introducing the Open Data Definition&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;The great thing about the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id105991a8&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id10a6ec78&quot;&gt;Web&lt;/a&gt; is that it&amp;#39;s much easier to discovery and respond to these points of view before the ink dries :-) Ben certainly needs to take a look at the &lt;a href=&quot;http://www.w3.org/RDF/FAQ&quot; id=&quot;link-id10f78958&quot;&gt;Semantic Web FAQ&lt;/a&gt; pre or post assimilation of Daniel&amp;#39;s response.&lt;/p&gt;</atom:content>
  <atom:updated>2008-04-30T12:07:58.000001-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data enters state of Evoluation</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-04-29#1351</atom:id>
  <atom:published>2008-04-29T19:56:14Z</atom:published>
  <atom:content type="html">&lt;p&gt;During a brief chat with &lt;a href=&quot;http://community.linkeddata.org/dataspace/person/mhausenblas#this&quot; id=&quot;link-idfeb0100&quot;&gt;Michael Hausenblas&lt;/a&gt; about a new &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1049feb0&quot;&gt;Linked Data&lt;/a&gt; project he is championing called: &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/LinkingOpenData/LForum&quot; id=&quot;link-id16a857d8&quot;&gt;LForum&lt;/a&gt;, I made a freudian slip, in the form of the typo: &lt;strong&gt;Evoluation&lt;/strong&gt;, which at the time was supposed to have been: &lt;strong&gt;Evolution&lt;/strong&gt;. Anyway, we had a chuckle and realized we were on to something, so I proceeded to formalize the definition: &lt;/p&gt; &lt;blockquote&gt; &lt;cite&gt;Evoluation is evolution devoid of the randomness of mutation. A state of being in which it is possible to evaluate and choose evolutionary paths.&lt;/cite&gt; &lt;/blockquote&gt; &lt;p&gt; &lt;strong&gt;Evoluation&lt;/strong&gt; actually describes where we are today in relation to the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot; id=&quot;link-id105c1518&quot;&gt;World Wide Web&lt;/a&gt;; to the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id103f9d00&quot;&gt;Linking Open Data community&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1048c210&quot;&gt;LOD&lt;/a&gt;), it&amp;#39;s taking the path towards becoming a &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id104c3a20&quot;&gt;Giant Global Graph&lt;/a&gt; of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id104968e0&quot;&gt;Linked Data&lt;/a&gt;; to the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; 2.0 community, it&amp;#39;s simply a collection of Web Services and associated APIs; and to many others, it remains an opaque collection of interlinked documents.&lt;/p&gt; &lt;p&gt;The great thing about the Web is that it allows netizens to explore a plethora of paths without adversely affecting the paths of others. That said, controlling one&amp;#39;s path may take mutation out of evolution, but we are still left with the requirement to adapt and eventually survive in a competitive environment. Thus, although we can evaluate and choose from the many paths the Web&amp;#39;s evolution offers us, the path that delivers the most benefits ultimately dominates. :-) &lt;/p&gt;</atom:content>
  <atom:updated>2008-04-29T16:25:47-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data and Information Architecture</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-29#1350</atom:id>
  <atom:published>2008-04-29T14:37:22Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2015-08-21T14:32:10.859283-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>On Sem Web Search</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-29#1349</atom:id>
  <atom:published>2008-04-29T14:37:21Z</atom:published>
  <atom:content type="html">&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;</atom:content>
  <atom:updated>2015-08-21T14:31:03.220528-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>WWW 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/vdb/blog/?date=2008-04-29#1348</atom:id>
  <atom:published>2008-04-29T14:37:20Z</atom:published>
  <atom:content type="html">&lt;div&gt; &lt;div style=&quot;display:none;&quot;&gt;WWW 2008&lt;/div&gt; &lt;p&gt;Following my return from WWW 2008 in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x9ff7d5d0&quot;&gt;Beijing&lt;/a&gt;, I will write a series of &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0x9e4a7650&quot;&gt;blog&lt;/a&gt; posts discussing diverse topics that were brought up in presentations and conversations during the week.&lt;/p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x9e7ae398&quot;&gt;Linked data&lt;/a&gt; was our main interest in the conference and there was a one day workshop on this, unfortunately overlapping with a day of W3C Advisory Committee meetings. Hence Tim Berners-Lee, one of the chairs of the workshop, could not attend for most of the day. Still, he was present to say that &amp;quot;&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xa287d38&quot;&gt;Linked open data&lt;/a&gt; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0x15372940&quot;&gt;semantic web&lt;/a&gt; and the web done as it ought to be done.&amp;quot; &lt;p&gt;For my part, I will draw some architecture conclusions from the different talks and extrapolate about the requirements on database platforms for linked data.&lt;/p&gt; &lt;p&gt;Chris Bizer predicted that 2008 would be the year of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0xa1454c58&quot;&gt;data&lt;/a&gt; web search, if 2007 was the year of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xa0f73c50&quot;&gt;SPARQL&lt;/a&gt;. This may be the case, as linked data is now pretty much a reality and the questions of discovery become prevalent. There was a birds-of-a-feather session on this and I will make some comments on what we intend to explore in bridging between the text index based semantic web search engines and SPARQL.&lt;/p&gt; &lt;p&gt;Andy Seaborne convened a birds-of-a-feather session on the future of SPARQL. Many of the already anticipated and implemented requirements were confirmed and a few were introduced. A separate blog post will discuss these further.&lt;/p&gt; &lt;p&gt;From the various discussions held throughout the conference, we conclude that plug-and-play operation with the major semantic web frameworks of Jena, Sesame, and Redland, is our major immediate-term deliverable. Our efforts in this direction thus far are insufficient and we will next have these done with the right supervision and proper interop testing. The issues are fortunately simple but doing things totally right require some small server side support and some &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xa5d4d5b8&quot;&gt;JDBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x9dc28d10&quot;&gt;ODBC&lt;/a&gt; tweaks, so to the interested, we advise to wait for an update to be published on this blog.&lt;/p&gt; &lt;p&gt;I further had a conversation with Andy Seaborne about using Jena reasoning capabilities with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0xa2754050&quot;&gt;Virtuoso&lt;/a&gt; and generally the issues of &amp;quot;impedance mismatch&amp;quot; between reasoning and typical database workloads. More on this later. &lt;/p&gt; &lt;/div&gt;</atom:content>
  <atom:updated>2008-04-29T13:35:23-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data and Information Architecture</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-04-29#1347</atom:id>
  <atom:published>2008-04-29T12:08:24Z</atom:published>
  <atom:content type="html">&lt;p&gt;We had a workshop on &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0x9e7e5098&quot;&gt;Linked Open Data&lt;/a&gt; (&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xb9e86c8&quot;&gt;LOD&lt;/a&gt;) last week in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0x131a72a0&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-id0x9da015a0&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-id0x14813578&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-id0x9f1a1d8&quot;&gt;linked data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id0xa5a3e1b0&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-id0xad44dc0&quot;&gt;Zitgist&lt;/a&gt; has compiled the &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-id0x9ebde358&quot;&gt;UMBEL&lt;/a&gt; taxonomy using &lt;a href=&quot;http://dbpedia.org/resource/SKOS&quot; id=&quot;link-id0xa04a85c0&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-id0x9fdd9018&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-id0xa0b9cb70&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-id0xdc5d940&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-id0xa0aa2cc0&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-id0x9e6f4b28&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-id0xcc203f8&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-id0xa0d28c98&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-id0xc89a768&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-id0x9fe62620&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-id0xa16319a8&quot;&gt;Linked Data Planet&lt;/a&gt; in New York in June.&lt;/p&gt;</atom:content>
  <atom:updated>2008-04-29T17:18:15.000009-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>On Sem Web Search</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-04-29#1346</atom:id>
  <atom:published>2008-04-29T12:03:47Z</atom:published>
  <atom:content type="html">&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-id0x1a474e80&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-id0x18e93100&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-id0x19f64110&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-id0x19f34660&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-id0x1afbb680&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-id0x17e36628&quot;&gt;PTSW&lt;/a&gt; (&lt;a href=&quot;http://www.pingthesemanticweb.com/&quot; id=&quot;link-id0x1a2a9060&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-id0x192732f8&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-id0x192611e0&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-id0x1b0abcf0&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-id0x1b2d4078&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-id0x1a563b50&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-id0x1bb17320&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-id0x1b20cfc8&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;</atom:content>
  <atom:updated>2008-10-02T11:37:07.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>WWW 2008</atom:title>
  <atom:id>http://www.openlinksw.com:443/weblog/oerling/?date=2008-04-29#1345</atom:id>
  <atom:published>2008-04-29T11:59:16Z</atom:published>
  <atom:content type="html">&lt;p&gt;Following my return from WWW 2008 in &lt;a href=&quot;http://www2008.org/&quot; id=&quot;link-id0xa1901330&quot;&gt;Beijing&lt;/a&gt;, I will write a series of &lt;a href=&quot;http://dbpedia.org/resource/Blog&quot; id=&quot;link-id0xd356660&quot;&gt;blog&lt;/a&gt; posts discussing diverse topics that were brought up in presentations and conversations during the week.&lt;/p&gt; &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id0x1290cb78&quot;&gt;Linked data&lt;/a&gt; was our main interest in the conference and there was a one day workshop on this, unfortunately overlapping with a day of W3C Advisory Committee meetings. Hence Tim Berners-Lee, one of the chairs of the workshop, could not attend for most of the day. Still, he was present to say that &amp;quot;&lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id0xa2754050&quot;&gt;Linked open data&lt;/a&gt; is the &lt;a href=&quot;http://dbpedia.org/resource/Semantic_Web&quot; id=&quot;link-id0xa099dea8&quot;&gt;semantic web&lt;/a&gt; and the web done as it ought to be done.&amp;quot; &lt;p&gt;For my part, I will draw some architecture conclusions from the different talks and extrapolate about the requirements on database platforms for linked data.&lt;/p&gt; &lt;p&gt;Chris Bizer predicted that 2008 would be the year of &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id0x9e0f0a98&quot;&gt;data&lt;/a&gt; web search, if 2007 was the year of &lt;a href=&quot;http://dbpedia.org/resource/SPARQL&quot; id=&quot;link-id0xd9e64a0&quot;&gt;SPARQL&lt;/a&gt;. This may be the case, as linked data is now pretty much a reality and the questions of discovery become prevalent. There was a birds-of-a-feather session on this and I will make some comments on what we intend to explore in bridging between the text index based semantic web search engines and SPARQL.&lt;/p&gt; &lt;p&gt;Andy Seaborne convened a birds-of-a-feather session on the future of SPARQL. Many of the already anticipated and implemented requirements were confirmed and a few were introduced. A separate blog post will discuss these further.&lt;/p&gt; &lt;p&gt;From the various discussions held throughout the conference, we conclude that plug-and-play operation with the major semantic web frameworks of Jena, Sesame, and Redland, is our major immediate-term deliverable. Our efforts in this direction thus far are insufficient and we will next have these done with the right supervision and proper interop testing. The issues are fortunately simple but doing things totally right require some small server side support and some &lt;a href=&quot;http://dbpedia.org/resource/Java_Database_Connectivity&quot; id=&quot;link-id0xacc8c7e8&quot;&gt;JDBC&lt;/a&gt;/&lt;a href=&quot;http://dbpedia.org/resource/Open_Database_Connectivity&quot; id=&quot;link-id0x9e48d258&quot;&gt;ODBC&lt;/a&gt; tweaks, so to the interested, we advise to wait for an update to be published on this blog.&lt;/p&gt; &lt;p&gt;I further had a conversation with Andy Seaborne about using Jena reasoning capabilities with &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id0x134b8e98&quot;&gt;Virtuoso&lt;/a&gt; and generally the issues of &amp;quot;impedance mismatch&amp;quot; between reasoning and typical database workloads. More on this later. &lt;/p&gt;</atom:content>
  <atom:updated>2008-04-29T13:35:17-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Trip Report - Part 1 (Update 2)</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-04-28#1343</atom:id>
  <atom:published>2008-04-28T18:48:33Z</atom:published>
  <atom:content type="html">&lt;p&gt;Typo cleansed edition :-)&lt;/p&gt; &lt;h2&gt;Objectives&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Meet &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id12c52e40&quot;&gt;LOD&lt;/a&gt; Community Members&lt;/li&gt; &lt;li&gt;Participate in Workshop &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Meeting &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id10456058&quot;&gt;LOD&lt;/a&gt; Community Members&lt;/h3&gt; &lt;p&gt;Although the &lt;a href=&quot;http://dbpedia.org/resource/World_Wide_Web&quot;&gt;Web&lt;/a&gt; continues to shrink the planet by removing the restrictions of geopgrahic location, meeting people face-to-face remains invaluable (*priceless in Mastercard AD speak*). Naturally, meeting and chatting with as many &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1382d4f8&quot;&gt;LOD&lt;/a&gt; community members as possible was high up on my agenda.&lt;/p&gt; &lt;h3&gt;Participate in Workshop &lt;/h3&gt; &lt;p&gt;As one of the co-chairs of the Linking Open &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id143a8c30&quot;&gt;Data&lt;/a&gt; Workshop (&lt;a href=&quot;http://events.linkeddata.org/ldow2008/&quot; id=&quot;link-id10621d70&quot;&gt;LODW&lt;/a&gt;), I had a 5 minute workshop opening slot during which I spoke about the following:&lt;/p&gt; &lt;h4&gt;Where we are today: &lt;/h4&gt; &lt;p&gt;We have &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id109b40a0&quot;&gt;DBpedia&lt;/a&gt; as a major hub on the burgeoning &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1074f248&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id101ed948&quot;&gt;Web&lt;/a&gt;. When OpenLink offered to host &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id10cd1b20&quot;&gt;DBpedia&lt;/a&gt; (a combination of &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id13d19880&quot;&gt;Virtuoso&lt;/a&gt; DBMS Software and sizable backend Hardware infrastructure), it did so knowing that such an effort would emphatically address the &amp;quot;chicken and egg&amp;quot; conundrum that, prior to this undertaking, stifled the ability to demonstrate practical utility of &lt;a href=&quot;http://dbpedia.org/resource/Hypertext_Transfer_Protocol&quot; id=&quot;link-id13835980&quot;&gt;HTTP&lt;/a&gt; based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14a89c28&quot;&gt;Linked Data&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt; Today, the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10aa9fe0&quot;&gt;Linked Data&lt;/a&gt; bootstrap mission has been accomplished.&lt;/p&gt; &lt;h4&gt;Where we go next:&lt;/h4&gt; &lt;p&gt;Although &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id12fe5d98&quot;&gt;DBpedia&lt;/a&gt; is a hub (ground zero of &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14aca9b8&quot;&gt;Linked Data&lt;/a&gt;), we have to put it into perspective in relation to a new set of needs and expectations moving forward. Today, &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id1027f098&quot;&gt;DBpedia&lt;/a&gt; is a Sun at the heart of a Solar System within the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id14a6adf8&quot;&gt;Linked Data&lt;/a&gt; Galaxy. But unlike Space as we know it, in &lt;a href=&quot;http://dbpedia.org/resource/Cyberspace&quot; id=&quot;link-id14a80398&quot;&gt;Cyberspace&lt;/a&gt; we can have connectivity and collaboration across Solar Systems -- life exists elsewhere and we are part of a collaborative collective unimpeded by constraints of space travel etc. Thus, expect to see the emergence of other Solar Systems accessible to &lt;a href=&quot;http://dbpedia.org/resource/DBpedia&quot; id=&quot;link-id14904998&quot;&gt;DBpedia&lt;/a&gt; and its collections of planets (see. &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id1097d200&quot;&gt;LOD&lt;/a&gt; &lt;a href=&quot;http://richard.cyganiak.de/2007/10/lod/&quot; id=&quot;link-id14acecf0&quot;&gt;diagram&lt;/a&gt;). Examples underway include &lt;a href=&quot;http://umbel.org/about/&quot; id=&quot;link-idfe92c08&quot;&gt;UMBEL&lt;/a&gt; which will serve the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id107fac40&quot;&gt;Linked Data&lt;/a&gt; planets from &lt;a href=&quot;http://dbpedia.org/resource/Cyc&quot; id=&quot;link-id12fb9e88&quot;&gt;OpenCyc&lt;/a&gt; (Subject Matter Concepts), &lt;a href=&quot;http://www.mpi-inf.mpg.de/~suchanek/downloads/yago/&quot; id=&quot;link-id147ea790&quot;&gt;Yago&lt;/a&gt; (&lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id14ae83a8&quot;&gt;Named Entities&lt;/a&gt;), and &lt;a href=&quot;http://www.bio2rdf.org/&quot; id=&quot;link-id10890640&quot;&gt;Bio2RDF&lt;/a&gt; (which provides powerful Bio Informatics based &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1439a858&quot;&gt;Linked Data&lt;/a&gt; planet).&lt;/p&gt; &lt;p&gt;I urged the community to veer more aggressively towards developing and demonstrating practical &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id11f8e188&quot;&gt;Linked Data&lt;/a&gt; driven solutions that are aligned to well known problems. Of course, I encouraged all presenters to make this an integral part of their presentations :-) &lt;/p&gt; &lt;h4&gt;Workshop Summary: &lt;/h4&gt; &lt;p&gt;The workshop was well attended and I found all the presentations engaging and full of enthusiasm. &lt;/p&gt; &lt;p&gt;As the sessions progressed, it became clear during a number of accompanying Q&amp;amp;A sessions that a new &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-idff249b0&quot;&gt;Linked Data&lt;/a&gt; exploitation frontier is emerging. The frontier in question takes the form of a &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id10f73b50&quot;&gt;Linked Data&lt;/a&gt; substrate capable of addressing the taxonomic needs of solutions aimed at automated &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id10d16e00&quot;&gt;Named Entity Extraction&lt;/a&gt;, Disambiguation, Subject matter Concept alignment, transparently integrated with existing Web Content. Thus, we are moving beyond the minting and deployment of of dereferencable URIs and &lt;a href=&quot;http://dbpedia.org/resource/Resource_Description_Framework&quot; id=&quot;link-id10419210&quot;&gt;RDF&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id151520d0&quot;&gt;data&lt;/a&gt; sets to automagically associating existing Web Content with &lt;a href=&quot;http://dbpedia.org/resource/Named_entity_recognition&quot; id=&quot;link-id105573b0&quot;&gt;Named Entities&lt;/a&gt; (People, Organizations, Places, Events etc..) and Subject matter Concepts (Politics, Music, Sports, and others) while remaining true to the &lt;a href=&quot;http://community.linkeddata.org/dataspace/organization/lod#this&quot; id=&quot;link-id14579108&quot;&gt;Linking Open Data Community&lt;/a&gt; creed i.e. ensuring the Named &lt;a href=&quot;http://dbpedia.org/resource/Entity&quot; id=&quot;link-id147d31e8&quot;&gt;Entity&lt;/a&gt; and Subject matter Concept URIs are available to user agents or users seeking to produce alternative &lt;a href=&quot;http://dbpedia.org/resource/Data&quot; id=&quot;link-id14ae41f0&quot;&gt;data&lt;/a&gt; views (i.e. Mesh-ups).&lt;/p&gt; &lt;p&gt;I will get to part 2 of this report once the actual workshop sessions slides go live (*these are different from the &lt;a href=&quot;http://events.linkeddata.org/ldow2008/&quot; id=&quot;link-id1034eee8&quot;&gt;pre-event PDFs links&lt;/a&gt;*).&lt;/p&gt;</atom:content>
  <atom:updated>2008-04-29T11:07:43.000002-04:00</atom:updated>
 </atom:entry>
 <atom:entry>
  <atom:title>Linked Data Illustrated and a Virtuoso Functionality Reminder</atom:title>
  <atom:id>http://www.openlinksw.com:443/blog/kidehen@openlinksw.com/blog/?date=2008-04-28#1342</atom:id>
  <atom:published>2008-04-28T17:32:47Z</atom:published>
  <atom:content type="html">&lt;a href=&quot;http://myopenlink.net/dataspace/person/danieljohnlewis#this&quot; id=&quot;link-id156ceb30&quot;&gt;Daniel Lewis&lt;/a&gt; has put together a nice &lt;a href=&quot;http://vanirsystems.com/danielsblog/2008/04/27/linked-data-the-role-of-the-data-server/&quot; id=&quot;link-id10456040&quot;&gt;collection of Linked Data related posts&lt;/a&gt; that illustrate the fundamentals of the &lt;a href=&quot;http://dbpedia.org/resource/Linked_Data&quot; id=&quot;link-id1033f6f0&quot;&gt;Linked Data&lt;/a&gt; &lt;a href=&quot;http://dbpedia.org/resource/Giant_Global_Graph&quot; id=&quot;link-id106fa168&quot;&gt;Web&lt;/a&gt; and the vital role that &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10141c20&quot;&gt;Virtuoso&lt;/a&gt; plays as a deployment platform. Remember, &lt;a href=&quot;http://virtuoso.openlinksw.com&quot; id=&quot;link-id10301e38&quot;&gt;Virtuoso&lt;/a&gt; was architected in 1998 (see &lt;a href=&quot;http://virtuoso.openlinksw.com/wiki/main/Main/VOSHistory&quot; id=&quot;link-id10c44088&quot;&gt;Virtuoso History&lt;/a&gt;) in anticipation of the eventual &lt;a href=&quot;http://dbpedia.org/resource/Internet&quot; id=&quot;link-id1383a1e8&quot;&gt;Internet&lt;/a&gt;, &lt;a href=&quot;http://dbpedia.org/resource/Intranet&quot; id=&quot;link-id1028e770&quot;&gt;Int