blob: 9d5c13fb98abf653773f66066f83747d23cd8ab4 [file] [log] [blame]
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ORDER BY &mdash; Apache AGE master documentation</title>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/custom.css" type="text/css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="SKIP" href="skip.html" />
<link rel="prev" title="RETURN" href="return.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> Apache AGE
<img src="../_static/logo.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption" role="heading"><span class="caption-text">Introduction</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../intro/overview.html">Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/setup.html">Setup</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/graphs.html">Graphs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/cypher.html">The AGE Cypher Query Format</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/types.html">Data Types - An Introduction to agtype</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/comparability.html">Comparability, Equality, Orderability and Equivalence</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/operators.html">Operators</a></li>
<li class="toctree-l1"><a class="reference internal" href="../intro/aggregation.html">Aggregation</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Clauses</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="match.html">MATCH</a></li>
<li class="toctree-l1"><a class="reference internal" href="with.html">WITH</a></li>
<li class="toctree-l1"><a class="reference internal" href="return.html">RETURN</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">ORDER BY</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#introduction">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="#order-nodes-by-property">Order nodes by property</a></li>
<li class="toctree-l2"><a class="reference internal" href="#order-nodes-by-multiple-properties">Order nodes by multiple properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="#order-nodes-in-descending-order">Order nodes in descending order</a></li>
<li class="toctree-l2"><a class="reference internal" href="#ordering-null">Ordering null</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="skip.html">SKIP</a></li>
<li class="toctree-l1"><a class="reference internal" href="limit.html">LIMIT</a></li>
<li class="toctree-l1"><a class="reference internal" href="create.html">CREATE</a></li>
<li class="toctree-l1"><a class="reference internal" href="set.html">SET</a></li>
<li class="toctree-l1"><a class="reference internal" href="remove.html">REMOVE</a></li>
<li class="toctree-l1"><a class="reference internal" href="delete.html">DELETE</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Functions</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../functions/predicate_functions.html">Predicate Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/scalar_functions.html">Scalar Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/list_functions.html">List Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/numeric_functions.html">Numeric Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/logarithmic_functions.html">Logarithmic Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/trigonometric_functions.html">Trigonometric Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/string_functions.html">String Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/aggregate_functions.html">Aggregation Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../functions/user_functions.html">User defined functions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">AGE Beyond Cypher</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../advanced/advanced_overview.html">Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/advanced.html">Using Cypher in a CTE Expression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/advanced.html#using-cypher-in-a-join-expression">Using Cypher in a Join expression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/advanced.html#cypher-in-sql-expressions">Cypher in SQL expressions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/prepared_statements.html">Prepared Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/plpgsql.html">PL/pgSQL Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../advanced/sql_in_cypher.html">SQL In Cypher</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Apache AGE</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
<li>ORDER BY</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/incubator-age-website/blob/master/docs/clauses/order_by.md" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="tex2jax_ignore mathjax_ignore section" id="order-by">
<h1>ORDER BY<a class="headerlink" href="#order-by" title="Permalink to this headline"></a></h1>
<p>ORDER BY is a sub-clause following WITH, and it specifies that the output should be sorted and how.</p>
<div class="section" id="introduction">
<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
<p>Note that you cannot sort on nodes or relationships, just on properties on these. ORDER BY relies on comparisons to sort the output, see Ordering and comparison of values.</p>
<p>In terms of scope of variables, ORDER BY follows special rules, depending on if the projecting RETURN or WITH clause is either aggregating or DISTINCT. If it is an aggregating or DISTINCT projection, only the variables available in the projection are available. If the projection does not alter the output cardinality (which aggregation and DISTINCT do), variables available from before the projecting clause are also available. When the projection clause shadows already existing variables, only the new variables are available.</p>
<p>Lastly, it is not allowed to use aggregating expressions in the ORDER BY sub-clause if they are not also listed in the projecting clause. This last rule is to make sure that ORDER BY does not change the results, only the order of them.</p>
</div>
<div class="section" id="order-nodes-by-property">
<h2>Order nodes by property<a class="headerlink" href="#order-nodes-by-property" title="Permalink to this headline"></a></h2>
<p>ORDER BY is used to sort the output.</p>
<p>Query</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>SELECT *
FROM cypher(&#39;graph_name&#39;, $$
MATCH (n)
WITH n.name as name, n.age as age
ORDER BY n.name
RETURN name, age
$$) as (name agtype, age agtype);
</pre></div>
</div>
<p>The nodes are returned, sorted by their name.</p>
<p>Result</p>
<table>
<tr>
<td><strong>name</strong>
</td>
<td><strong>age</strong>
</td>
</tr>
<tr>
<td>"A"
</td>
<td>34
</td>
</tr>
<tr>
<td>"B"
</td>
<td>34
</td>
</tr>
<tr>
<td>"C"
</td>
<td>32
</td>
</tr>
<tr>
<td colspan="2" >(1 row)
</td>
</tr>
</table>
</div>
<div class="section" id="order-nodes-by-multiple-properties">
<h2>Order nodes by multiple properties<a class="headerlink" href="#order-nodes-by-multiple-properties" title="Permalink to this headline"></a></h2>
<p>You can order by multiple properties by stating each variable in the ORDER BY clause. Cypher will sort the result by the first variable listed, and for equal values, go to the next property in the ORDER BY clause, and so on.</p>
<p>Query</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>SELECT *
FROM cypher(&#39;graph_name&#39;, $$
MATCH (n)
WITH n.name as name, n.age as age
ORDER BY n.age, n.name
RETURN name, age
$$) as (name agtype, age agtype);
</pre></div>
</div>
<p>This returns the nodes, sorted first by their age, and then by their name.</p>
<p>Result</p>
<table>
<tr>
<td><strong>name</strong>
</td>
<td><strong>age</strong>
</td>
</tr>
<tr>
<td>"C"
</td>
<td>32
</td>
</tr>
<tr>
<td>"A"
</td>
<td>34
</td>
</tr>
<tr>
<td>"B"
</td>
<td>34
</td>
</tr>
<tr>
<td colspan="2" >(1 row)
</td>
</tr>
</table>
</div>
<div class="section" id="order-nodes-in-descending-order">
<h2>Order nodes in descending order<a class="headerlink" href="#order-nodes-in-descending-order" title="Permalink to this headline"></a></h2>
<p>By adding DESC[ENDING] after the variable to sort on, the sort will be done in reverse order.</p>
<p>Query</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>SELECT *
FROM cypher(&#39;graph_name&#39;, $$
MATCH (n)
WITH n.name AS name, n.age AS age
ORDER BY n.name DESC
RETURN name, age
$$) as (name agtype, age agtype);
</pre></div>
</div>
<p>The example returns the nodes, sorted by their name in reverse order.</p>
<p>Result</p>
<table>
<tr>
<td><strong>name</strong>
</td>
<td><strong>age</strong>
</td>
</tr>
<tr>
<td>"C"
</td>
<td>32
</td>
</tr>
<tr>
<td>"B"
</td>
<td>34
</td>
</tr>
<tr>
<td>"A"
</td>
<td>34
</td>
</tr>
<tr>
<td colspan="2" >(3 rows)
</td>
</tr>
</table>
</div>
<div class="section" id="ordering-null">
<h2>Ordering null<a class="headerlink" href="#ordering-null" title="Permalink to this headline"></a></h2>
<p>When sorting the result set, null will always come at the end of the result set for ascending sorting,and first when doing descending sort.</p>
<p>Query</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>SELECT *
FROM cypher(&#39;graph_name&#39;, $$
MATCH (n)
WITH n.name AS name, n.age AS age, n.height
ORDER BY n.height
RETURN name, age, height
$$) as (name agtype, age agtype, height agtype);
</pre></div>
</div>
<p>The nodes are returned sorted by the length property, with a node without that property last.</p>
<p>Result</p>
<table>
<tr>
<td><strong>name</strong>
</td>
<td><strong>age</strong>
</td>
<td>
</td>
</tr>
<tr>
<td>"A"
</td>
<td>34
</td>
<td>170
</td>
</tr>
<tr>
<td>"C"
</td>
<td>32
</td>
<td>185
</td>
</tr>
<tr>
<td>"B"
</td>
<td>34
</td>
<td>&lt;NULL>
</td>
</tr>
<tr>
<td colspan="3" >(3 rows)
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="skip.html" class="btn btn-neutral float-right" title="SKIP" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="return.html" class="btn btn-neutral float-left" title="RETURN" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Apache AGE.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Other Versions</span>
v: v0.6.0
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<dl>
<dt>Versions</dt>
<dd><a href="../../master/index.html">master</a></dd>
<dd><a href="order_by.html">v0.6.0</a></dd>
</dl>
</div>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>