Cypher styleguide
The purpose of the Cypher® styleguide is to make queries as easy to read as possible.
For rules and recommendations for naming of labels, relationship types and properties, please see the Naming rules and recommendations.
General recommendations
-
When using Cypher language constructs in prose, use a
monospaced
font and follow the styling rules. -
When referring to labels and relationship types, the colon should be included as follows:
:Label
,:REL_TYPE
. -
When referring to functions, use lower camel case and parentheses should be used as follows:
shortestPath()
. Arguments should normally not be included. -
If you are storing Cypher statements in a separate file, use the file extension
.cypher
.
Indentation and line breaks
-
Start a new clause on a new line.
BadMATCH (n) WHERE n.name CONTAINS 's' RETURN n.name
GoodMATCH (n) WHERE n.name CONTAINS 's' RETURN n.name
-
Indent
ON CREATE
andON MATCH
with two spaces. PutON CREATE
beforeON MATCH
if both are present.BadMERGE (n) ON CREATE SET n.prop = 0 MERGE (a:A)-[:T]->(b:B) ON MATCH SET b.name = 'you' ON CREATE SET a.name = 'me' RETURN a.prop
GoodMERGE (n) ON CREATE SET n.prop = 0 MERGE (a:A)-[:T]->(b:B) ON CREATE SET a.name = 'me' ON MATCH SET b.name = 'you' RETURN a.prop
-
Start a subquery on a new line after the opening brace, indented with two (additional) spaces. Leave the closing brace on its own line.
BadMATCH (a:A) WHERE EXISTS { MATCH (a)-->(b:B) WHERE b.prop = 'yellow' } RETURN a.foo
Also badMATCH (a:A) WHERE EXISTS {MATCH (a)-->(b:B) WHERE b.prop = 'yellow'} RETURN a.foo
GoodMATCH (a:A) WHERE EXISTS { MATCH (a)-->(b:B) WHERE b.prop = 'yellow' } RETURN a.foo
-
Do not break the line if the simplified subquery form is used.
BadMATCH (a:A) WHERE EXISTS { (a)-->(b:B) } RETURN a.prop
GoodMATCH (a:A) WHERE EXISTS { (a)-->(b:B) } RETURN a.prop
Casing
-
Write keywords in upper case.
Badmatch (p:Person) where p.name starts with 'Ma' return p.name
GoodMATCH (p:Person) WHERE p.name STARTS WITH 'Ma' RETURN p.name
-
Write the value
null
in lower case.BadWITH NULL AS n1, Null AS n2 RETURN n1 IS NULL AND n2 IS NOT NULL
GoodWITH null AS n1, null AS n2 RETURN n1 IS NULL AND n2 IS NOT NULL
-
Write boolean literals (
true
andfalse
) in lower case.BadWITH TRUE AS b1, False AS b2 RETURN b1 AND b2
GoodWITH true AS b1, false AS b2 RETURN b1 AND b2
-
Use camel case, starting with a lower-case character, for:
-
functions
-
properties
-
variables
-
parameters
BadCREATE (N {Prop: 0}) WITH RAND() AS Rand, $pArAm AS MAP RETURN Rand, MAP.property_key, Count(N)
GoodCREATE (n {prop: 0}) WITH rand() AS rand, $param AS map RETURN rand, map.propertyKey, count(n)
-
Spacing
-
For literal maps:
-
No space between the opening brace and the first key
-
No space between key and colon
-
One space between colon and value
-
No space between value and comma
-
One space between comma and next key
-
No space between the last value and the closing brace
BadWITH { key1 :'value' ,key2 : 42 } AS map RETURN map
GoodWITH {key1: 'value', key2: 42} AS map RETURN map
-
-
One space between label/type predicates and property predicates in patterns.
BadMATCH (p:Person{property: -1})-[:KNOWS {since: 2016}]->() RETURN p.name
GoodMATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->() RETURN p.name
-
No space in patterns.
BadMATCH (:Person) --> (:Vehicle) RETURN count(*)
GoodMATCH (:Person)-->(:Vehicle) RETURN count(*)
-
Use a wrapping space around operators.
BadMATCH p=(s)-->(e) WHERE s.name<>e.name RETURN length(p)
GoodMATCH p = (s)-->(e) WHERE s.name <> e.name RETURN length(p)
-
No space in label predicates.
BadMATCH (person : Person : Owner ) RETURN person.name
GoodMATCH (person:Person:Owner) RETURN person.name
-
Use a space after each comma in lists and enumerations.
BadMATCH (),() WITH ['a','b',3.14] AS list RETURN list,2,3,4
GoodMATCH (), () WITH ['a', 'b', 3.14] AS list RETURN list, 2, 3, 4
-
No padding space within function call parentheses.
BadRETURN split( 'original', 'i' )
GoodRETURN split('original', 'i')
-
Use padding space within simple subquery expressions.
BadMATCH (a:A) WHERE EXISTS {(a)-->(b:B)} RETURN a.prop
GoodMATCH (a:A) WHERE EXISTS { (a)-->(b:B) } RETURN a.prop
Patterns
-
When patterns wrap lines, break after arrows, not before.
BadMATCH (:Person)-->(vehicle:Car)-->(:Company) <--(:Country) RETURN count(vehicle)
GoodMATCH (:Person)-->(vehicle:Car)-->(:Company)<-- (:Country) RETURN count(vehicle)
-
Use anonymous nodes and relationships when the variable would not be used.
BadCREATE (a:End {prop: 42}), (b:End {prop: 3}), (c:Begin {prop: elementId(a)})
GoodCREATE (a:End {prop: 42}), (:End {prop: 3}), (:Begin {prop: elementId(a)})
-
Chain patterns together to avoid repeating variables.
BadMATCH (:Person)-->(vehicle:Car), (vehicle:Car)-->(:Company) RETURN count(vehicle)
GoodMATCH (:Person)-->(vehicle:Car)-->(:Company) RETURN count(vehicle)
-
Put named nodes before anonymous nodes.
BadMATCH ()-->(vehicle:Car)-->(manufacturer:Company) WHERE manufacturer.foundedYear < 2000 RETURN vehicle.mileage
GoodMATCH (manufacturer:Company)<--(vehicle:Car)<--() WHERE manufacturer.foundedYear < 2000 RETURN vehicle.mileage
-
Keep anchor nodes at the beginning of the
MATCH
clause.BadMATCH (:Person)-->(vehicle:Car)-->(manufacturer:Company) WHERE manufacturer.foundedYear < 2000 RETURN vehicle.mileage
GoodMATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person) WHERE manufacturer.foundedYear < 2000 RETURN vehicle.mileage
-
Prefer outgoing (left to right) pattern relationships to incoming pattern relationships.
BadMATCH (:Country)-->(:Company)<--(vehicle:Car)<--(:Person) RETURN vehicle.mileage
GoodMATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country) RETURN vehicle.mileage
Meta-characters
-
Use single quotes,
'
, for literal string values.BadRETURN "Cypher"
GoodRETURN 'Cypher'
-
Disregard this rule for literal strings that contain a single quote character. If the string has both, use the form that creates the fewest escapes. In the case of a tie, prefer single quotes.
BadRETURN 'Cypher\'s a nice language', "Mats' quote: \"statement\""
GoodRETURN "Cypher's a nice language", 'Mats\' quote: "statement"'
-
-
Avoid having to use back-ticks to escape characters and keywords.
BadMATCH (`odd-ch@racter$`:`Spaced Label` {`&property`: 42}) RETURN labels(`odd-ch@racter$`)
GoodMATCH (node:NonSpacedLabel {property: 42}) RETURN labels(node)
-
Do not use a semicolon at the end of the statement.
BadRETURN 1;
GoodRETURN 1
Was this page helpful?