Search code examples
neo4jcypher

ORDER BY the result of UNION of subqueries


I would like to compute the UNION of multiple subqueries and sort the result using ORDER BY.

So I'd like to run this query (written in pseudo-Cypher):

(RETURN 2 AS x
UNION
RETURN 1 AS x)
ORDER BY x

And get the following result:

╒═══╕
│x  │
╞═══╡
│1  │
├───┤
│2  │
└───┘

Is there a way to do this? As ORDER BY is always tied to a single WITH/RETURN clause, I do not think this is possible, nor can I think of a good workaround.


Solution

  • The Cypher language does not yet support Post-Union processing.

    However, as a workaround, you should be able to use the APOC procedure apoc.cypher.run to perform the UNION operation in a "subroutine", and then perform the post-UNION processing in the main Cypher query. For example:

    CALL apoc.cypher.run("RETURN 2 AS x UNION RETURN 1 AS x", NULL) YIELD value
    RETURN value.x AS x
    ORDER BY x;
    

    Update: this is now possible in Neo4j 4.0+ using the CALL {subquery} construct:

    CALL {
      RETURN 2 AS x
      UNION ALL
      RETURN 1 AS x"
    }
    RETURN x
    ORDER BY x;