http://git-wip-us.apache.org/repos/asf/asterixdb-site/blob/d00eca89/content/docs/0.9.4/aql/fulltext.html ---------------------------------------------------------------------- diff --git a/content/docs/0.9.4/aql/fulltext.html b/content/docs/0.9.4/aql/fulltext.html new file mode 100644 index 0000000..022e124 --- /dev/null +++ b/content/docs/0.9.4/aql/fulltext.html @@ -0,0 +1,208 @@ +<!DOCTYPE html> +<!-- + | Generated by Apache Maven Doxia Site Renderer 1.8.1 from src/site/markdown/aql/fulltext.md at 2018-10-02 + | Rendered using Apache Maven Fluido Skin 1.7 +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta name="Date-Revision-yyyymmdd" content="20181002" /> + <meta http-equiv="Content-Language" content="en" /> + <title>AsterixDB – AsterixDB Support of Full-text search queries</title> + <link rel="stylesheet" href="../css/apache-maven-fluido-1.7.min.css" /> + <link rel="stylesheet" href="../css/site.css" /> + <link rel="stylesheet" href="../css/print.css" media="print" /> + <script type="text/javascript" src="../js/apache-maven-fluido-1.7.min.js"></script> + + </head> + <body class="topBarDisabled"> + <div class="container-fluid"> + <div id="banner"> + <div class="pull-left"><a href=".././" id="bannerLeft"><img src="../images/asterixlogo.png" alt="AsterixDB"/></a></div> + <div class="pull-right"></div> + <div class="clear"><hr/></div> + </div> + + <div id="breadcrumbs"> + <ul class="breadcrumb"> + <li id="publishDate">Last Published: 2018-10-02</li> + <li id="projectVersion" class="pull-right">Version: 0.9.4</li> + <li class="pull-right"><a href="../index.html" title="Documentation Home">Documentation Home</a></li> + </ul> + </div> + <div class="row-fluid"> + <div id="leftColumn" class="span2"> + <div class="well sidebar-nav"> + <ul class="nav nav-list"> + <li class="nav-header">Get Started - Installation</li> + <li><a href="../ncservice.html" title="Option 1: using NCService"><span class="none"></span>Option 1: using NCService</a></li> + <li><a href="../ansible.html" title="Option 2: using Ansible"><span class="none"></span>Option 2: using Ansible</a></li> + <li><a href="../aws.html" title="Option 3: using Amazon Web Services"><span class="none"></span>Option 3: using Amazon Web Services</a></li> + <li class="nav-header">AsterixDB Primer</li> + <li><a href="../sqlpp/primer-sqlpp.html" title="Option 1: using SQL++"><span class="none"></span>Option 1: using SQL++</a></li> + <li><a href="../aql/primer.html" title="Option 2: using AQL"><span class="none"></span>Option 2: using AQL</a></li> + <li class="nav-header">Data Model</li> + <li><a href="../datamodel.html" title="The Asterix Data Model"><span class="none"></span>The Asterix Data Model</a></li> + <li class="nav-header">Queries - SQL++</li> + <li><a href="../sqlpp/manual.html" title="The SQL++ Query Language"><span class="none"></span>The SQL++ Query Language</a></li> + <li><a href="../sqlpp/builtins.html" title="Builtin Functions"><span class="none"></span>Builtin Functions</a></li> + <li class="nav-header">Queries - AQL</li> + <li><a href="../aql/manual.html" title="The Asterix Query Language (AQL)"><span class="none"></span>The Asterix Query Language (AQL)</a></li> + <li><a href="../aql/builtins.html" title="Builtin Functions"><span class="none"></span>Builtin Functions</a></li> + <li class="nav-header">API/SDK</li> + <li><a href="../api.html" title="HTTP API"><span class="none"></span>HTTP API</a></li> + <li><a href="../csv.html" title="CSV Output"><span class="none"></span>CSV Output</a></li> + <li class="nav-header">Advanced Features</li> + <li class="active"><a href="#"><span class="none"></span>Support of Full-text Queries</a></li> + <li><a href="../aql/externaldata.html" title="Accessing External Data"><span class="none"></span>Accessing External Data</a></li> + <li><a href="../feeds/tutorial.html" title="Support for Data Ingestion"><span class="none"></span>Support for Data Ingestion</a></li> + <li><a href="../udf.html" title="User Defined Functions"><span class="none"></span>User Defined Functions</a></li> + <li><a href="../aql/filters.html" title="Filter-Based LSM Index Acceleration"><span class="none"></span>Filter-Based LSM Index Acceleration</a></li> + <li><a href="../aql/similarity.html" title="Support of Similarity Queries"><span class="none"></span>Support of Similarity Queries</a></li> +</ul> + <hr /> + <div id="poweredBy"> + <div class="clear"></div> + <div class="clear"></div> + <div class="clear"></div> + <div class="clear"></div> +<a href=".././" title="AsterixDB" class="builtBy"><img class="builtBy" alt="AsterixDB" src="../images/asterixlogo.png" /></a> + </div> + </div> + </div> + <div id="bodyColumn" class="span10" > +<!-- + ! Licensed to the Apache Software Foundation (ASF) under one + ! or more contributor license agreements. See the NOTICE file + ! distributed with this work for additional information + ! regarding copyright ownership. The ASF licenses this file + ! to you under the Apache License, Version 2.0 (the + ! "License"); you may not use this file except in compliance + ! with the License. You may obtain a copy of the License at + ! + ! http://www.apache.org/licenses/LICENSE-2.0 + ! + ! Unless required by applicable law or agreed to in writing, + ! software distributed under the License is distributed on an + ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ! KIND, either express or implied. See the License for the + ! specific language governing permissions and limitations + ! under the License. + !--> +<h1>AsterixDB Support of Full-text search queries</h1> +<div class="section"> +<h2><a name="Table_of_Contents"></a><a name="toc" id="toc">Table of Contents</a></h2> +<ul> + +<li><a href="#Motivation">Motivation</a></li> +<li><a href="#Syntax">Syntax</a></li> +<li><a href="#FulltextIndex">Creating and utilizing a Full-text index</a></li> +</ul></div> +<div class="section"> +<h2><a name="Motivation_.5BBack_to_TOC.5D"></a><a name="Motivation" id="Motivation">Motivation</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2> +<p>Full-Text Search (FTS) queries are widely used in applications where users need to find records that satisfy an FTS predicate, i.e., where simple string-based matching is not sufficient. These queries are important when finding documents that contain a certain keyword is crucial. FTS queries are different from substring matching queries in that FTS queries find their query predicates as exact keywords in the given string, rather than treating a query predicate as a sequence of characters. For example, an FTS query that finds “rain” correctly returns a document when it contains “rain” as a word. However, a substring-matching query returns a document whenever it contains “rain” as a substring, for instance, a document with “brain” or “training” would be returned as well.</p></div> +<div class="section"> +<h2><a name="Syntax_.5BBack_to_TOC.5D"></a><a name="Syntax" id="Syntax">Syntax</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2> +<p>The syntax of AsterixDB FTS follows a portion of the XQuery FullText Search syntax. Two basic forms are as follows:</p> + +<div> +<div> +<pre class="source"> ftcontains(Expression1, Expression2, {FullTextOption}) + ftcontains(Expression1, Expression2) +</pre></div></div> + +<p>For example, we can execute the following query to find tweet messages where the <tt>message-text</tt> field includes “voice” as a word. Please note that an FTS search is case-insensitive. Thus, “Voice” or “voice” will be evaluated as the same word.</p> + +<div> +<div> +<pre class="source"> use dataverse TinySocial; + + for $msg in dataset TweetMessages + where ftcontains($msg.message-text, "voice", {"mode":"any"}) + return {"id": $msg.id} +</pre></div></div> + +<p>The DDL and DML of TinySocial can be found in <a href="primer.html#ADM:_Modeling_Semistructed_Data_in_AsterixDB">ADM: Modeling Semistructed Data in AsterixDB</a>.</p> +<p>The same query can be also expressed in the SQL++.</p> + +<div> +<div> +<pre class="source"> use TinySocial; + + select element {"id":msg.id} + from TweetMessages as msg + where TinySocial.ftcontains(msg.`message-text`, "voice", {"mode":"any"}) +</pre></div></div> + +<p>The <tt>Expression1</tt> is an expression that should be evaluable as a string at runtime as in the above example where <tt>$msg.message-text</tt> is a string field. The <tt>Expression2</tt> can be a string, an (un)ordered list of string value(s), or an expression. In the last case, the given expression should be evaluable into one of the first two types, i.e., into a string value or an (un)ordered list of string value(s).</p> +<p>The following examples are all valid expressions.</p> + +<div> +<div> +<pre class="source"> ... where ftcontains($msg.message-text, "sound") + ... where ftcontains($msg.message-text, "sound", {"mode":"any"}) + ... where ftcontains($msg.message-text, ["sound", "system"], {"mode":"any"}) + ... where ftcontains($msg.message-text, {{"speed", "stand", "customization"}}, {"mode":"all"}) + ... where ftcontains($msg.message-text, let $keyword_list := ["voice", "system"] return $keyword_list, {"mode":"all"}) + ... where ftcontains($msg.message-text, $keyword_list, {"mode":"any"}) +</pre></div></div> + +<p>In the last example above, <tt>$keyword_list</tt> should evaluate to a string or an (un)ordered list of string value(s).</p> +<p>The last <tt>FullTextOption</tt> parameter clarifies the given FTS request. If you omit the <tt>FullTextOption</tt> parameter, then the default value will be set for each possible option. Currently, we only have one option named <tt>mode</tt>. And as we extend the FTS feature, more options will be added. Please note that the format of <tt>FullTextOption</tt> is a record, thus you need to put the option(s) in a record <tt>{}</tt>. The <tt>mode</tt> option indicates whether the given FTS query is a conjunctive (AND) or disjunctive (OR) search request. This option can be either <tt>“any”</tt> or <tt>“all”</tt>. The default value for <tt>mode</tt> is <tt>“all”</tt>. If one specifies <tt>“any”</tt>, a disjunctive search will be conducted. For example, the following query will find documents whose <tt>message-text</tt> field contains “sound” or “system”, so a document will be returned if it contains eit her “sound”, “system”, or both of the keywords.</p> + +<div> +<div> +<pre class="source"> ... where ftcontains($msg.message-text, ["sound", "system"], {"mode":"any"}) +</pre></div></div> + +<p>The other option parameter,<tt>“all”</tt>, specifies a conjunctive search. The following examples will find the documents whose <tt>message-text</tt> field contains both “sound” and “system”. If a document contains only “sound” or “system” but not both, it will not be returned.</p> + +<div> +<div> +<pre class="source"> ... where ftcontains($msg.message-text, ["sound", "system"], {"mode":"all"}) + ... where ftcontains($msg.message-text, ["sound", "system"]) +</pre></div></div> + +<p>Currently AsterixDB doesn’t (yet) support phrase searches, so the following query will not work.</p> + +<div> +<div> +<pre class="source"> ... where ftcontains($msg.message-text, "sound system", {"mode":"any"}) +</pre></div></div> + +<p>As a workaround solution, the following query can be used to achieve a roughly similar goal. The difference is that the following queries will find documents where <tt>$msg.message-text</tt> contains both “sound” and “system”, but the order and adjacency of “sound” and “system” are not checked, unlike in a phrase search. As a result, the query below would also return documents with “sound system can be installed.”, “system sound is perfect.”, or “sound is not clear. You may need to install a new system.”</p> + +<div> +<div> +<pre class="source"> ... where ftcontains($msg.message-text, ["sound", "system"], {"mode":"all"}) + ... where ftcontains($msg.message-text, ["sound", "system"]) +</pre></div></div> +</div> +<div class="section"> +<h2><a name="Creating_and_utilizing_a_Full-text_index_.5BBack_to_TOC.5D"></a><a name="FulltextIndex" id="FulltextIndex">Creating and utilizing a Full-text index</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2> +<p>When there is a full-text index on the field that is being searched, rather than scanning all records, AsterixDB can utilize that index to expedite the execution of a FTS query. To create a full-text index, you need to specify the index type as <tt>fulltext</tt> in your DDL statement. For instance, the following DDL statement create a full-text index on the TweetMessages.message-text attribute.</p> + +<div> +<div> +<pre class="source">create index messageFTSIdx on TweetMessages(message-text) type fulltext; +</pre></div></div></div> + </div> + </div> + </div> + <hr/> + <footer> + <div class="container-fluid"> + <div class="row-fluid"> +<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache + feather logo, and the Apache AsterixDB project logo are either + registered trademarks or trademarks of The Apache Software + Foundation in the United States and other countries. + All other marks mentioned may be trademarks or registered + trademarks of their respective owners. + </div> + </div> + </div> + </footer> + </body> +</html>
http://git-wip-us.apache.org/repos/asf/asterixdb-site/blob/d00eca89/content/docs/0.9.4/aql/js-sdk.html ---------------------------------------------------------------------- diff --git a/content/docs/0.9.4/aql/js-sdk.html b/content/docs/0.9.4/aql/js-sdk.html new file mode 100644 index 0000000..50700e9 --- /dev/null +++ b/content/docs/0.9.4/aql/js-sdk.html @@ -0,0 +1,873 @@ +<!DOCTYPE html> +<!-- + | Generated by Apache Maven Doxia Site Renderer 1.8.1 from src/site/markdown/aql/js-sdk.md at 2018-10-02 + | Rendered using Apache Maven Fluido Skin 1.7 +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta name="Date-Revision-yyyymmdd" content="20181002" /> + <meta http-equiv="Content-Language" content="en" /> + <title>AsterixDB – AsterixDB Javascript SDK</title> + <link rel="stylesheet" href="../css/apache-maven-fluido-1.7.min.css" /> + <link rel="stylesheet" href="../css/site.css" /> + <link rel="stylesheet" href="../css/print.css" media="print" /> + <script type="text/javascript" src="../js/apache-maven-fluido-1.7.min.js"></script> + + </head> + <body class="topBarDisabled"> + <div class="container-fluid"> + <div id="banner"> + <div class="pull-left"><a href=".././" id="bannerLeft"><img src="../images/asterixlogo.png" alt="AsterixDB"/></a></div> + <div class="pull-right"></div> + <div class="clear"><hr/></div> + </div> + + <div id="breadcrumbs"> + <ul class="breadcrumb"> + <li id="publishDate">Last Published: 2018-10-02</li> + <li id="projectVersion" class="pull-right">Version: 0.9.4</li> + <li class="pull-right"><a href="../index.html" title="Documentation Home">Documentation Home</a></li> + </ul> + </div> + <div class="row-fluid"> + <div id="leftColumn" class="span2"> + <div class="well sidebar-nav"> + <ul class="nav nav-list"> + <li class="nav-header">Get Started - Installation</li> + <li><a href="../ncservice.html" title="Option 1: using NCService"><span class="none"></span>Option 1: using NCService</a></li> + <li><a href="../ansible.html" title="Option 2: using Ansible"><span class="none"></span>Option 2: using Ansible</a></li> + <li><a href="../aws.html" title="Option 3: using Amazon Web Services"><span class="none"></span>Option 3: using Amazon Web Services</a></li> + <li class="nav-header">AsterixDB Primer</li> + <li><a href="../sqlpp/primer-sqlpp.html" title="Option 1: using SQL++"><span class="none"></span>Option 1: using SQL++</a></li> + <li><a href="../aql/primer.html" title="Option 2: using AQL"><span class="none"></span>Option 2: using AQL</a></li> + <li class="nav-header">Data Model</li> + <li><a href="../datamodel.html" title="The Asterix Data Model"><span class="none"></span>The Asterix Data Model</a></li> + <li class="nav-header">Queries - SQL++</li> + <li><a href="../sqlpp/manual.html" title="The SQL++ Query Language"><span class="none"></span>The SQL++ Query Language</a></li> + <li><a href="../sqlpp/builtins.html" title="Builtin Functions"><span class="none"></span>Builtin Functions</a></li> + <li class="nav-header">Queries - AQL</li> + <li><a href="../aql/manual.html" title="The Asterix Query Language (AQL)"><span class="none"></span>The Asterix Query Language (AQL)</a></li> + <li><a href="../aql/builtins.html" title="Builtin Functions"><span class="none"></span>Builtin Functions</a></li> + <li class="nav-header">API/SDK</li> + <li><a href="../api.html" title="HTTP API"><span class="none"></span>HTTP API</a></li> + <li><a href="../csv.html" title="CSV Output"><span class="none"></span>CSV Output</a></li> + <li class="nav-header">Advanced Features</li> + <li><a href="../aql/fulltext.html" title="Support of Full-text Queries"><span class="none"></span>Support of Full-text Queries</a></li> + <li><a href="../aql/externaldata.html" title="Accessing External Data"><span class="none"></span>Accessing External Data</a></li> + <li><a href="../feeds/tutorial.html" title="Support for Data Ingestion"><span class="none"></span>Support for Data Ingestion</a></li> + <li><a href="../udf.html" title="User Defined Functions"><span class="none"></span>User Defined Functions</a></li> + <li><a href="../aql/filters.html" title="Filter-Based LSM Index Acceleration"><span class="none"></span>Filter-Based LSM Index Acceleration</a></li> + <li><a href="../aql/similarity.html" title="Support of Similarity Queries"><span class="none"></span>Support of Similarity Queries</a></li> +</ul> + <hr /> + <div id="poweredBy"> + <div class="clear"></div> + <div class="clear"></div> + <div class="clear"></div> + <div class="clear"></div> +<a href=".././" title="AsterixDB" class="builtBy"><img class="builtBy" alt="AsterixDB" src="../images/asterixlogo.png" /></a> + </div> + </div> + </div> + <div id="bodyColumn" class="span10" > +<!-- + ! Licensed to the Apache Software Foundation (ASF) under one + ! or more contributor license agreements. See the NOTICE file + ! distributed with this work for additional information + ! regarding copyright ownership. The ASF licenses this file + ! to you under the Apache License, Version 2.0 (the + ! "License"); you may not use this file except in compliance + ! with the License. You may obtain a copy of the License at + ! + ! http://www.apache.org/licenses/LICENSE-2.0 + ! + ! Unless required by applicable law or agreed to in writing, + ! software distributed under the License is distributed on an + ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ! KIND, either express or implied. See the License for the + ! specific language governing permissions and limitations + ! under the License. + !--> +<h1>AsterixDB Javascript SDK</h1> +<div class="section"> +<h2><a name="Obtaining_and_Including"></a>Obtaining and Including</h2> +<p><a class="externalLink" href="http://asterixdb.ics.uci.edu/download/bindings/asterix-sdk-stable.js">Download</a> the javascript SDK and include it like any other javascript library by adding the following line in the appropriate HTML file:</p> + +<div> +<div> +<pre class="source"><script src="path/to/asterix-sdk-stable.js"></script> +</pre></div></div> +</div> +<div class="section"> +<h2><a name="Interactive_Demos"></a>Interactive Demos</h2> +<p>There are two interactive demos that are available for download. Both of the demos illustrate how the javascript API would be used in an application:</p> +<ul> + +<li><a class="externalLink" href="http://asterixdb.ics.uci.edu/download/demos/tweetbook-demo.zip">Tweetbook Demo</a>: a contrived geo-spatial application dealing with artificial Tweets allowing spatial, temporal, and keyword-based filtering.</li> +<li><a class="externalLink" href="http://asterixdb.ics.uci.edu/download/demos/admaql101-demo.zip">ADM/AQL 101 Demo</a>: an interactive version of all of the examples that are provided in the following section.</li> +</ul></div> +<div class="section"> +<h2><a name="The_javascript_SDK:_by_example"></a>The javascript SDK: by example</h2> +<p>In this section, we explore how to form AQL queries using the javascript SDK. The queries from <a href="primer.html">AsterixDB 101: An ADM and AQL Primer</a> are used as examples here. For each AQL statement, the equivalent javascript expression is shown below it, followed by the results of executing the query.</p> +<div class="section"> +<h3><a name="Query_0-A_-_Exact-Match_Lookup"></a>Query 0-A - Exact-Match Lookup</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +where $user.id = 8 +return $user; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression0a = new FLWOGRExpression() + .ForClause("$user", new AExpression("dataset FacebookUsers")) + .WhereClause(new AExpression("$user.id = 8")) + .ReturnClause("$user"); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 8 } , "alias": "Nila", "name": "NilaMilliron", "user-since": { datetime: 1199182200000}, "friend-ids": { unorderedlist: [{ int32: 3 } ]}, "employment": { orderedlist: [{ "organization-name": "Plexlane", "start-date": { date: 1267315200000}, "end-date": null } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_0-B_-_Range_Scan"></a>Query 0-B - Range Scan</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +where $user.id >= 2 and $user.id <= 4 +return $user; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression0b = new FLWOGRExpression() + .ForClause("$user", new AExpression("dataset FacebookUsers")) + .WhereClause().and(new AExpression("$user.id >= 2"), new AExpression("$user.id <= 4")) + .ReturnClause("$user"); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} } +{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} } +{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_1_-_Other_Query_Filters"></a>Query 1 - Other Query Filters</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +where $user.user-since >= datetime('2010-07-22T00:00:00') +and $user.user-since <= datetime('2012-07-29T23:59:59') +return $user; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression1 = new FLWOGRExpression() + .ForClause("$user", new AExpression("dataset FacebookUsers")) + .WhereClause().and( + new AExpression("$user.user-since >= datetime('2010-07-22T00:00:00')"), + new AExpression("$user.user-since <= datetime('2012-07-29T23:59:59')") + ).ReturnClause("$user"); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} } +{ "id": { int32: 10 } , "alias": "Bram", "name": "BramHatch", "user-since": { datetime: 1287223800000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "physcane", "start-date": { date: 1181001600000}, "end-date": { date: 1320451200000} } ]} } +{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} } +{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_2-A_-_Equijoin"></a>Query 2-A - Equijoin</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +for $message in dataset FacebookMessages +where $message.author-id = $user.id +return { + "uname": $user.name, + "message": $message.message +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression2a = new FLWOGRExpression() + .ForClause ("$user", new AExpression("dataset FacebookUsers")) + .ForClause ("$message", new AExpression("dataset FacebookMessages")) + .WhereClause(new AExpression("$message.author-id = $user.id")) + .ReturnClause({ + "uname" : "$user.name", + "message" : "$message.message" + }); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "uname": "MargaritaStoddard", "message": " dislike x-phone its touch-screen is horrible" } +{ "uname": "MargaritaStoddard", "message": " like ccast the 3G is awesome:)" } +{ "uname": "MargaritaStoddard", "message": " can't stand product-w the touch-screen is terrible" } +{ "uname": "MargaritaStoddard", "message": " can't stand acast the network is horrible:(" } +{ "uname": "MargaritaStoddard", "message": " can't stand acast its plan is terrible" } +{ "uname": "IsbelDull", "message": " like product-y the plan is amazing" } +{ "uname": "IsbelDull", "message": " like product-z its platform is mind-blowing" } +{ "uname": "WoodrowNehling", "message": " love acast its 3G is good:)" } +{ "uname": "BramHatch", "message": " dislike x-phone the voice-command is bad:(" } +{ "uname": "BramHatch", "message": " can't stand product-z its voicemail-service is OMG:(" } +{ "uname": "EmoryUnk", "message": " love product-b its shortcut-menu is awesome:)" } +{ "uname": "EmoryUnk", "message": " love ccast its wireless is good" } +{ "uname": "WillisWynne", "message": " love product-b the customization is mind-blowing" } +{ "uname": "SuzannaTillson", "message": " like x-phone the voicemail-service is awesome" } +{ "uname": "VonKemble", "message": " dislike product-b the speed is horrible" } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_2-B_-_Index_join"></a>Query 2-B - Index join</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +for $message in dataset FacebookMessages +where $message.author-id /*+ indexnl */ = $user.id +return { + "uname": $user.name, + "message": $message.message +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression2b = new FLWOGRExpression() + .ForClause ("$user", new AExpression("dataset FacebookUsers")) + .ForClause ("$message", new AExpression("dataset FacebookMessages")) + .WhereClause(new AExpression("$message.author-id /*+ indexnl */ = $user.id")) + .ReturnClause({ + "uname" : "$user.name", + "message" : "$message.message" + }); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "uname": "MargaritaStoddard", "message": " dislike x-phone its touch-screen is horrible" } +{ "uname": "MargaritaStoddard", "message": " like ccast the 3G is awesome:)" } +{ "uname": "MargaritaStoddard", "message": " can't stand product-w the touch-screen is terrible" } +{ "uname": "MargaritaStoddard", "message": " can't stand acast the network is horrible:(" } +{ "uname": "MargaritaStoddard", "message": " can't stand acast its plan is terrible" } +{ "uname": "IsbelDull", "message": " like product-y the plan is amazing" } +{ "uname": "IsbelDull", "message": " like product-z its platform is mind-blowing" } +{ "uname": "WoodrowNehling", "message": " love acast its 3G is good:)" } +{ "uname": "BramHatch", "message": " dislike x-phone the voice-command is bad:(" } +{ "uname": "BramHatch", "message": " can't stand product-z its voicemail-service is OMG:(" } +{ "uname": "EmoryUnk", "message": " love product-b its shortcut-menu is awesome:)" } +{ "uname": "EmoryUnk", "message": " love ccast its wireless is good" } +{ "uname": "WillisWynne", "message": " love product-b the customization is mind-blowing" } +{ "uname": "SuzannaTillson", "message": " like x-phone the voicemail-service is awesome" } +{ "uname": "VonKemble", "message": " dislike product-b the speed is horrible" } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_3_-_Nested_Outer_Join"></a>Query 3 - Nested Outer Join</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $user in dataset FacebookUsers +return { + "uname": $user.name, + "messages": for $message in dataset FacebookMessages + where $message.author-id = $user.id + return $message.message +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression3messages = new FLWOGRExpression() + .ForClause("$message", new AExpression("dataset FacebookMessages")) + .WhereClause(new AExpression("$message.author-id = $user.id")) + .ReturnClause("$message.message"); + +var expression3 = new FLWOGRExpression() + .ForClause ("$user", new AExpression("dataset FacebookUsers")) + .ReturnClause({ + "uname": "$user.name", + "messages" : expression3messages + }); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "uname": "MargaritaStoddard", "messages": { orderedlist: [" dislike x-phone its touch-screen is horrible", " like ccast the 3G is awesome:)", " can't stand product-w the touch-screen is terrible", " can't stand acast the network is horrible:(", " can't stand acast its plan is terrible" ]} } +{ "uname": "IsbelDull", "messages": { orderedlist: [" like product-y the plan is amazing", " like product-z its platform is mind-blowing" ]} } +{ "uname": "NilaMilliron", "messages": { orderedlist: [ ]} } +{ "uname": "WoodrowNehling", "messages": { orderedlist: [" love acast its 3G is good:)" ]} } +{ "uname": "BramHatch", "messages": { orderedlist: [" dislike x-phone the voice-command is bad:(", " can't stand product-z its voicemail-service is OMG:(" ]} } +{ "uname": "EmoryUnk", "messages": { orderedlist: [" love product-b its shortcut-menu is awesome:)", " love ccast its wireless is good" ]} } +{ "uname": "WillisWynne", "messages": { orderedlist: [" love product-b the customization is mind-blowing" ]} } +{ "uname": "SuzannaTillson", "messages": { orderedlist: [" like x-phone the voicemail-service is awesome" ]} } +{ "uname": "NicholasStroh", "messages": { orderedlist: [ ]} } +{ "uname": "VonKemble", "messages": { orderedlist: [" dislike product-b the speed is horrible" ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_4_-_Theta_Join"></a>Query 4 - Theta Join</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $t in dataset TweetMessages +return { + "message": $t.message-text, + "nearby-messages": for $t2 in dataset TweetMessages + where spatial-distance($t.sender-location, $t2.sender-location) <= 1 + return { "msgtxt":$t2.message-text} +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression4messages = new FLWOGRExpression() + .ForClause( "$t2", new AExpression("dataset TweetMessages")) + .WhereClause( new AExpression("spatial-distance($t.sender-location, $t2.sender-location) <= 1")) + .ReturnClause({ "msgtxt" : "$t2.message-text" }); + +var expression4 = new FLWOGRExpression() + .ForClause( "$t", new AExpression("dataset TweetMessages")) + .ReturnClause({ + "message" : "$t.message-text", + "nearby-messages" : expression4messages + }); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "message": " hate ccast its voice-clarity is OMG:(", "nearby-messages": { orderedlist: [{ "msgtxt": " hate ccast its voice-clarity is OMG:(" }, { "msgtxt": " like product-w the speed is good:)" } ]} } +{ "message": " like x-phone the voice-clarity is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like x-phone the voice-clarity is good:)" } ]} } +{ "message": " like product-y the platform is good", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-y the platform is good" } ]} } +{ "message": " love product-z its customization is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " love product-z its customization is good:)" } ]} } +{ "message": " like product-y the voice-command is amazing:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-y the voice-command is amazing:)" } ]} } +{ "message": " like product-w the speed is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " hate ccast its voice-clarity is OMG:(" }, { "msgtxt": " like product-w the speed is good:)" } ]} } +{ "message": " love ccast its voicemail-service is awesome", "nearby-messages": { orderedlist: [{ "msgtxt": " love ccast its voicemail-service is awesome" } ]} } +{ "message": " can't stand product-w its speed is terrible:(", "nearby-messages": { orderedlist: [{ "msgtxt": " can't stand product-w its speed is terrible:(" } ]} } +{ "message": " like product-z the shortcut-menu is awesome:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-z the shortcut-menu is awesome:)" } ]} } +{ "message": " can't stand x-phone its platform is terrible", "nearby-messages": { orderedlist: [{ "msgtxt": " can't stand x-phone its platform is terrible" } ]} } +{ "message": " like ccast its shortcut-menu is awesome:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like ccast its shortcut-menu is awesome:)" } ]} } +{ "message": " like product-b the voice-command is mind-blowing:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-b the voice-command is mind-blowing:)" } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_5_-_Fuzzy_Join"></a>Query 5 - Fuzzy Join</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> +<p>use dataverse TinySocial;</p> + +<div> +<div> +<pre class="source">set simfunction "edit-distance"; +set simthreshold "3"; + +for $fbu in dataset FacebookUsers +return { + "id": $fbu.id, + "name": $fbu.name, + "similar-users": for $t in dataset TweetMessages + let $tu := $t.user + where $tu.name ~= $fbu.name + return { + "twitter-screenname": $tu.screen-name, + "twitter-name": $tu.name + } +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var similarUsersExpression = new FLWOGRExpression() + .ForClause("$t", new AExpression("dataset TweetMessages")) + .LetClause ("$tu", new AExpression("$t.user")) + .WhereClause(new AExpression("$tu.name ~= $fbu.name")) + .ReturnClause({ + "twitter-screenname": "$tu.screen-name", + "twitter-name": "$tu.name" + }); + +var expression5 = new FLWOGRExpression() + .ForClause ("$fbu", new AExpression("dataset FacebookUsers")) + .ReturnClause( + { + "id" : "$fbu.id", + "name" : "$fbu.name", + "similar-users" : similarUsersExpression + } + ); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 1 } , "name": "MargaritaStoddard", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 2 } , "name": "IsbelDull", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 8 } , "name": "NilaMilliron", "similar-users": { orderedlist: [{ "twitter-screenname": "NilaMilliron_tw", "twitter-name": "Nila Milliron" } ]} } +{ "id": { int32: 9 } , "name": "WoodrowNehling", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 10 } , "name": "BramHatch", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 3 } , "name": "EmoryUnk", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 6 } , "name": "WillisWynne", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 7 } , "name": "SuzannaTillson", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 4 } , "name": "NicholasStroh", "similar-users": { orderedlist: [ ]} } +{ "id": { int32: 5 } , "name": "VonKemble", "similar-users": { orderedlist: [ ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_6_-_Existential_Quantification"></a>Query 6 - Existential Quantification</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $fbu in dataset FacebookUsers +where (some $e in $fbu.employment satisfies is-null($e.end-date)) +return $fbu; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression6 = new FLWOGRExpression() + .ForClause ("$fbu", new AQLClause().set("dataset FacebookUsers")) + .WhereClause( + new QuantifiedExpression ( + "some" , + {"$e" : new AExpression("$fbu.employment") }, + new FunctionExpression("is-null", new AExpression("$e.end-date")) + ) + ) + .ReturnClause("$fbu"); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 1 } , "alias": "Margarita", "name": "MargaritaStoddard", "user-since": { datetime: 1345457400000}, "friend-ids": { unorderedlist: [{ int32: 2 } , { int32: 3 } , { int32: 6 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Codetechno", "start-date": { date: 1154822400000}, "end-date": null } ]} } +{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} } +{ "id": { int32: 8 } , "alias": "Nila", "name": "NilaMilliron", "user-since": { datetime: 1199182200000}, "friend-ids": { unorderedlist: [{ int32: 3 } ]}, "employment": { orderedlist: [{ "organization-name": "Plexlane", "start-date": { date: 1267315200000}, "end-date": null } ]} } +{ "id": { int32: 6 } , "alias": "Willis", "name": "WillisWynne", "user-since": { datetime: 1105956600000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 3 } , { int32: 7 } ]}, "employment": { orderedlist: [{ "organization-name": "jaydax", "start-date": { date: 1242345600000}, "end-date": null } ]} } +{ "id": { int32: 7 } , "alias": "Suzanna", "name": "SuzannaTillson", "user-since": { datetime: 1344334200000}, "friend-ids": { unorderedlist: [{ int32: 6 } ]}, "employment": { orderedlist: [{ "organization-name": "Labzatron", "start-date": { date: 1303171200000}, "end-date": null } ]} } +{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} } +{ "id": { int32: 5 } , "alias": "Von", "name": "VonKemble", "user-since": { datetime: 1262686200000}, "friend-ids": { unorderedlist: [{ int32: 3 } , { int32: 6 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Kongreen", "start-date": { date: 1290816000000}, "end-date": null } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_7_-_Universal_Quantification"></a>Query 7 - Universal Quantification</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $fbu in dataset FacebookUsers +where (every $e in $fbu.employment satisfies not(is-null($e.end-date))) +return $fbu; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression7 = new FLWOGRExpression() + .ForClause("$fbu", new AExpression("dataset FacebookUsers")) + .WhereClause( + new QuantifiedExpression ( + "every" , + {"$e" : new AExpression("$fbu.employment") }, + new FunctionExpression("not", new FunctionExpression("is-null", new AExpression("$e.end-date"))) + ) + ) + .ReturnClause("$fbu"); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "id": { int32: 9 } , "alias": "Woodrow", "name": "WoodrowNehling", "user-since": { datetime: 1127211000000}, "friend-ids": { unorderedlist: [{ int32: 3 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Zuncan", "start-date": { date: 1050969600000}, "end-date": { date: 1260662400000} } ]} } +{ "id": { int32: 10 } , "alias": "Bram", "name": "BramHatch", "user-since": { datetime: 1287223800000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "physcane", "start-date": { date: 1181001600000}, "end-date": { date: 1320451200000} } ]} } +{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_8_-_Simple_Aggregation"></a>Query 8 - Simple Aggregation</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +count(for $fbu in dataset FacebookUsers return $fbu); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression8 = new FunctionExpression( + "count", + new FLWOGRExpression() + .ForClause("$fbu", new AExpression("dataset FacebookUsers")) + .ReturnClause("$fbu") +); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ int64: 10 } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_9-A_-_Grouping_and_Aggregation"></a>Query 9-A - Grouping and Aggregation</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $t in dataset TweetMessages +group by $uid := $t.user.screen-name with $t +return { + "user": $uid, + "count": count($t) +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression9a = new FLWOGRExpression() + .ForClause("$t", new AExpression("dataset TweetMessages")) + .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t") + .ReturnClause( + { + "user" : "$uid", + "count" : new FunctionExpression("count", new AExpression("$t")) + } + ); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "user": "ColineGeyer@63", "count": { int64: 3 } } +{ "user": "OliJackson_512", "count": { int64: 1 } } +{ "user": "NilaMilliron_tw", "count": { int64: 1 } } +{ "user": "ChangEwing_573", "count": { int64: 1 } } +{ "user": "NathanGiesen@211", "count": { int64: 6 } } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_9-B_-_.28Hash-Based.29_Grouping_and_Aggregation"></a>Query 9-B - (Hash-Based) Grouping and Aggregation</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $t in dataset TweetMessages +/*+ hash*/ +group by $uid := $t.user.screen-name with $t +return { + "user": $uid, + "count": count($t) +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression9b = new FLWOGRExpression() + .ForClause("$t", new AExpression("dataset TweetMessages")) + .AQLClause("/*+ hash*/") + .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t") + .ReturnClause( + { + "user" : "$uid", + "count" : new FunctionExpression("count", new AExpression("$t")) + } + ); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "user": "ColineGeyer@63", "count": { int64: 3 } } +{ "user": "OliJackson_512", "count": { int64: 1 } } +{ "user": "NilaMilliron_tw", "count": { int64: 1 } } +{ "user": "ChangEwing_573", "count": { int64: 1 } } +{ "user": "NathanGiesen@211", "count": { int64: 6 } } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_10_-_Grouping_and_Limits"></a>Query 10 - Grouping and Limits</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +for $t in dataset TweetMessages +group by $uid := $t.user.screen-name with $t +let $c := count($t) +order by $c desc +limit 3 +return { + "user": $uid, + "count": $c +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression10 = new FLWOGRExpression() + .ForClause("$t", new AExpression("dataset TweetMessages")) + .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t") + .LetClause("$c", new FunctionExpression("count", new AExpression("$t"))) + .OrderbyClause( new AExpression("$c"), "desc" ) + .LimitClause(new AExpression("3")) + .ReturnClause( + { + "user" : "$uid", + "count" : "$c" + } + ); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "user": "NathanGiesen@211", "count": { int64: 6 } } +{ "user": "ColineGeyer@63", "count": { int64: 3 } } +{ "user": "NilaMilliron_tw", "count": { int64: 1 } } +</pre></div></div> +</div></div></div></div> +<div class="section"> +<h3><a name="Query_11_-_Left_Outer_Fuzzy_Join"></a>Query 11 - Left Outer Fuzzy Join</h3> +<div class="section"> +<div class="section"> +<div class="section"> +<h6><a name="AQL"></a>AQL</h6> + +<div> +<div> +<pre class="source">use dataverse TinySocial; + +set simfunction "jaccard"; +set simthreshold "0.3"; + +for $t in dataset TweetMessages +return { + "tweet": $t, + "similar-tweets": for $t2 in dataset TweetMessages + where $t2.referred-topics ~= $t.referred-topics + and $t2.tweetid != $t.tweetid + return $t2.referred-topics +}; +</pre></div></div> +</div> +<div class="section"> +<h6><a name="JS"></a>JS</h6> + +<div> +<div> +<pre class="source">var expression11 = new FLWOGRExpression() + .ForClause( "$t", new AExpression("dataset TweetMessages")) + .ReturnClause({ + "tweet" : new AExpression("$t"), + "similar-tweets": new FLWOGRExpression() + .ForClause( "$t2", new AExpression("dataset TweetMessages")) + .WhereClause().and( + new AExpression("$t2.referred-topics ~= $t.referred-topics"), + new AExpression("$t2.tweetid != $t.tweetid") + ) + .ReturnClause("$t2.referred-topics") + }); +</pre></div></div> +</div> +<div class="section"> +<h6><a name="Results"></a>Results</h6> + +<div> +<div> +<pre class="source">{ "tweet": { "tweetid": "10", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [29.15, 76.53]}, "send-time": { datetime: 1201342200000}, "referred-topics": { unorderedlist: ["ccast", "voice-clarity" ]}, "message-text": " hate ccast its voice-clarity is OMG:(" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "voice-clarity" ]}, { unorderedlist: ["ccast", "shortcut-menu" ]}, { unorderedlist: ["ccast", "voicemail-service" ]} ]} } +{ "tweet": { "tweetid": "6", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [47.51, 83.99]}, "send-time": { datetime: 1273227000000}, "referred-topics": { unorderedlist: ["x-phone", "voice-clarity" ]}, "message-text": " like x-phone the voice-clarity is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["x-phone", "platform" ]} ]} } +{ "tweet": { "tweetid": "7", "user": { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": { int32: 182 } , "statuses_count": { int32: 394 } , "name": "Chang Ewing", "followers_count": { int32: 32136 } }, "sender-location": { point: [36.21, 72.6]}, "send-time": { datetime: 1314267000000}, "referred-topics": { unorderedlist: ["product-y", "platform" ]}, "message-text": " like product-y the platform is good" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "platform" ]}, { unorderedlist: ["product-y", "voice-command" ]} ]} } +{ "tweet": { "tweetid": "1", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [47.44, 80.65]}, "send-time": { datetime: 1209204600000}, "referred-topics": { unorderedlist: ["product-z", "customization" ]}, "message-text": " love product-z its customization is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-z", "shortcut-menu" ]} ]} } +{ "tweet": { "tweetid": "12", "user": { "screen-name": "OliJackson_512", "lang": "en", "friends_count": { int32: 445 } , "statuses_count": { int32: 164 } , "name": "Oli Jackson", "followers_count": { int32: 22649 } }, "sender-location": { point: [24.82, 94.63]}, "send-time": { datetime: 1266055800000}, "referred-topics": { unorderedlist: ["product-y", "voice-command" ]}, "message-text": " like product-y the voice-command is amazing:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-y", "platform" ]}, { unorderedlist: ["product-b", "voice-command" ]} ]} } +{ "tweet": { "tweetid": "3", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [29.72, 75.8]}, "send-time": { datetime: 1162635000000}, "referred-topics": { unorderedlist: ["product-w", "speed" ]}, "message-text": " like product-w the speed is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-w", "speed" ]} ]} } +{ "tweet": { "tweetid": "9", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [36.86, 74.62]}, "send-time": { datetime: 1342865400000}, "referred-topics": { unorderedlist: ["ccast", "voicemail-service" ]}, "message-text": " love ccast its voicemail-service is awesome" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["ccast", "shortcut-menu" ]} ]} } +{ "tweet": { "tweetid": "5", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [40.09, 92.69]}, "send-time": { datetime: 1154686200000}, "referred-topics": { unorderedlist: ["product-w", "speed" ]}, "message-text": " can't stand product-w its speed is terrible:(" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-w", "speed" ]} ]} } +{ "tweet": { "tweetid": "8", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [46.05, 93.34]}, "send-time": { datetime: 1129284600000}, "referred-topics": { unorderedlist: ["product-z", "shortcut-menu" ]}, "message-text": " like product-z the shortcut-menu is awesome:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "shortcut-menu" ]}, { unorderedlist: ["product-z", "customization" ]} ]} } +{ "tweet": { "tweetid": "11", "user": { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": { int32: 445 } , "statuses_count": { int32: 164 } , "name": "Nila Milliron", "followers_count": { int32: 22649 } }, "sender-location": { point: [37.59, 68.42]}, "send-time": { datetime: 1205057400000}, "referred-topics": { unorderedlist: ["x-phone", "platform" ]}, "message-text": " can't stand x-phone its platform is terrible" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "voice-clarity" ]}, { unorderedlist: ["product-y", "platform" ]} ]} } +{ "tweet": { "tweetid": "2", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [32.84, 67.14]}, "send-time": { datetime: 1273745400000}, "referred-topics": { unorderedlist: ["ccast", "shortcut-menu" ]}, "message-text": " like ccast its shortcut-menu is awesome:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-z", "shortcut-menu" ]}, { unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["ccast", "voicemail-service" ]} ]} } +{ "tweet": { "tweetid": "4", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [39.28, 70.48]}, "send-time": { datetime: 1324894200000}, "referred-topics": { unorderedlist: ["product-b", "voice-command" ]}, "message-text": " like product-b the voice-command is mind-blowing:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-y", "voice-command" ]} ]} } +</pre></div></div></div></div></div></div></div> + </div> + </div> + </div> + <hr/> + <footer> + <div class="container-fluid"> + <div class="row-fluid"> +<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache + feather logo, and the Apache AsterixDB project logo are either + registered trademarks or trademarks of The Apache Software + Foundation in the United States and other countries. + All other marks mentioned may be trademarks or registered + trademarks of their respective owners. + </div> + </div> + </div> + </footer> + </body> +</html>
