-
Notifications
You must be signed in to change notification settings - Fork 152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Subclauses CIP #200
base: master
Are you sure you want to change the base?
Subclauses CIP #200
Changes from 1 commit
2967f79
3a3f198
aa6a008
2343256
5339768
3369038
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
= CIP2017-03-01 - LIMIT subclause | ||
:numbered: | ||
:toc: | ||
:toc-placement: macro | ||
:source-highlighter: codemirror | ||
|
||
*Author:* Mats Rydberg <mats@neotechnology.com> | ||
|
||
toc::[] | ||
|
||
== Background | ||
|
||
This CIP is a proposal in answer to link:https://github.com/opencypher/openCypher/issues/194[CIR-2017-194]. | ||
|
||
== Proposal | ||
|
||
The `LIMIT` subclause is used to constrain the cardinality of its parent clause by providing an upper limit. | ||
This can be useful for data exploration, or verifying partial results of expensive queries. | ||
|
||
=== Syntax | ||
|
||
.Syntax overview: | ||
[source, ebnf] | ||
---- | ||
clause-with-limit = read-only-clause, [ limit ] ; | ||
read-only-clause = match | ||
| with | ||
| unwind | ||
| return | ||
; | ||
limit = "LIMIT", expr ; | ||
---- | ||
|
||
=== Semantics | ||
|
||
The `LIMIT` subclause prevents records passing through its parent clause after the specified amount of rows, as determined by the limit expression, has been processed. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "limit expression" -> hmmm... it reads a bit awkwardly at present. Maybe something such as "expression provided to the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about the expression used as argument to ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That works - just include "the argument" |
||
For these semantics to be well defined, the limit expression must be constant over the query lifetime, such as parameters or literals. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can this be expanded on a bit more? It's not 100% clear what is being said. If need be, an example could be provided. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Expanded and gave two examples. |
||
|
||
==== Updating queries | ||
|
||
The use of `LIMIT` opens the possibility for certain performance optimisations. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "opens the possibility" -> "opens up the possibility" |
||
Clauses that come early in the query do not have to be evaluated over the full dataset, just enough to reach the subsequent limit. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "that come early" -> "appearing earlier" There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "do not have to be evaluated over the full dataset, just enough to reach the subsequent limit." |
||
These optimisations are however not always applicable in combination with updating clauses. | ||
Semantics between clauses is defined such that _all_ of a previous clause is processed (logically) before _any_ of a subsequent clause is processed. | ||
This means that _all_ side effects must happen before a `LIMIT` is allowed to halt the processing of records in preceding clauses. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "halt" -> "terminate" |
||
|
||
Consider the below query: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "below query" |
||
|
||
.Create a producer for each item, return first 100 product ids. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Format "producer" There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "item, return first 100 product ids" There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think producer needs formatting here. The example talks about items and producers as concepts, and I think it's clear that these are then represented by nodes with matching labels. |
||
[source, cypher] | ||
---- | ||
MATCH (i:Item) | ||
CREATE (i)-[:PRODUCED_BY]->(:Producer) | ||
RETURN i.productId | ||
LIMIT 100 | ||
---- | ||
|
||
This query must execute its `CREATE` clause once for every `:Item` node, even though only 100 records are to be returned. | ||
|
||
If the user intention is to only do a partial update of the graph, the query must be rewritten: | ||
|
||
.Create a producer for the 100 first items, return their product ids. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "100 first items, return their product ids" There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Format "producer" |
||
[source, cypher] | ||
---- | ||
MATCH (i:Item) | ||
LIMIT 100 | ||
CREATE (i)-[:PRODUCED_BY]->(:Producer) | ||
RETURN i.productId | ||
---- | ||
|
||
=== Examples | ||
|
||
.Limiting a pattern match: | ||
[source, cypher] | ||
---- | ||
MATCH (a:Person) | ||
WHERE a.name STARTS WITH 'And' | ||
LIMIT $limit | ||
RETURN a.age, a.name | ||
---- | ||
|
||
.Limiting between query parts: | ||
[source, cypher] | ||
---- | ||
MATCH (a:Person) | ||
WHERE a.age < 18 | ||
SET a.child = true | ||
WITH a | ||
LIMIT 100 | ||
MATCH (a)<-[:PARENT_OF]-(p) | ||
RETURN p.age, p.name | ||
---- | ||
|
||
.Limiting the query result: | ||
[source, cypher] | ||
---- | ||
MATCH (a:Person) | ||
WHERE a.age > 18 | ||
RETURN p.age, p.name | ||
LIMIT 100 | ||
---- |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"answer" -> "response"