Cypher 样式指南
Cypher® 样式指南的目的是使查询尽可能易于阅读。
有关标签、关系类型和属性命名的规则和建议,请参阅命名规则和建议。
一般建议
-
在散文中使用 Cypher 语言结构时,请使用
等宽
字体并遵循样式规则。 -
在引用标签和关系类型时,应包含冒号,如下所示:
:Label
,:REL_TYPE
。 -
在引用函数时,请使用小驼峰命名法和括号。例如:
toString()
。 -
如果您将 Cypher 语句存储在单独的文件中,请使用文件扩展名
.cypher
。
缩进和换行
-
在新行开始一个新的子句。
MATCH (n) WHERE n.name CONTAINS 's' RETURN n.name
MATCH (n)
WHERE n.name CONTAINS 's'
RETURN n.name
-
使用两个空格缩进
ON CREATE
和ON MATCH
。如果同时存在,请将ON CREATE
放在ON MATCH
之前。
MERGE (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
MERGE (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
-
在打开的花括号后,在新行开始一个子查询,缩进两个(额外)空格。将关闭的花括号放在它自己的行上。
MATCH (a:A)
WHERE
EXISTS { MATCH (a)-->(b:B) WHERE b.prop = 'yellow' }
RETURN a.foo
MATCH (a:A)
WHERE EXISTS
{MATCH (a)-->(b:B)
WHERE b.prop = 'yellow'}
RETURN a.foo
MATCH (a:A)
WHERE EXISTS {
MATCH (a)-->(b:B)
WHERE b.prop = 'yellow'
}
RETURN a.foo
-
如果使用简化的子查询形式,则不要换行。
MATCH (a:A)
WHERE EXISTS {
(a)-->(b:B)
}
RETURN a.prop
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop
大小写
-
以大写字母编写关键字。
match (p:Person)
where p.name starts with 'Ma'
return p.name
MATCH (p:Person)
WHERE p.name STARTS WITH 'Ma'
RETURN p.name
-
以小写字母编写值
null
。
WITH NULL AS n1, Null AS n2
RETURN n1 IS NULL AND n2 IS NOT NULL
WITH null AS n1, null AS n2
RETURN n1 IS NULL AND n2 IS NOT NULL
-
以小写字母编写
BOOLEAN
字面量(true
和false
)。
WITH TRUE AS b1, False AS b2
RETURN b1 AND b2
WITH true AS b1, false AS b2
RETURN b1 AND b2
-
使用驼峰命名法,以小写字母开头,用于
-
函数
-
属性
-
变量
-
参数
-
CREATE (N:Label {Prop: 0})
WITH N, RAND() AS Rand, $pArAm AS MAP
RETURN Rand, MAP.property_key, count(N)
CREATE (n:Label {prop: 0})
WITH n, rand() AS rand, $param AS map
RETURN rand, map.propertyKey, count(n)
间距
-
对于字面映射
-
打开的花括号和第一个键之间没有空格
-
键和冒号之间没有空格
-
冒号和值之间有一个空格
-
值和逗号之间没有空格
-
逗号和下一个键之间有一个空格
-
最后一个值和关闭的花括号之间没有空格
-
WITH { key1 :'value' ,key2 : 42 } AS map
RETURN map
WITH {key1: 'value', key2: 42} AS map
RETURN map
-
模式中标签/类型谓词和属性谓词之间有一个空格。
MATCH (p:Person{property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
MATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
-
模式中没有空格。
MATCH (:Person) --> (:Vehicle)
RETURN count(*)
MATCH (:Person)-->(:Vehicle)
RETURN count(*)
-
在运算符周围使用包装空格。
MATCH p=(s)-->(e)
WHERE s.name<>e.name
RETURN length(p)
MATCH p = (s)-->(e)
WHERE s.name <> e.name
RETURN length(p)
-
标签谓词中没有空格。
MATCH (person : Person : Owner )
RETURN person.name
MATCH (person:Person:Owner)
RETURN person.name
-
在列表和枚举中的每个逗号后使用一个空格。
MATCH (),()
WITH ['a','b',3.14] AS list
RETURN list,2,3,4
MATCH (), ()
WITH ['a', 'b', 3.14] AS list
RETURN list, 2, 3, 4
-
函数调用括号内没有填充空格。
RETURN split( 'original', 'i' )
RETURN split('original', 'i')
-
在简单的子查询表达式中使用填充空格。
MATCH (a:A)
WHERE EXISTS {(a)-->(b:B)}
RETURN a.prop
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop
模式
-
当模式换行时,在箭头后换行,而不是在箭头前换行。
MATCH (:Person)-->(vehicle:Car)-->(:Company)
<--(:Country)
RETURN count(vehicle)
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--
(:Country)
RETURN count(vehicle)
-
当变量不会被使用时,使用匿名节点和关系。
MATCH (kate:Person {name: 'Kate'})-[r:LIKES]-(c:Car)
RETURN c.type
MATCH (:Person {name: 'Kate'})-[:LIKES]-(c:Car)
RETURN c.type
-
将模式链接在一起,以避免重复变量。
MATCH (:Person)-->(vehicle:Car), (vehicle:Car)-->(:Company)
RETURN count(vehicle)
MATCH (:Person)-->(vehicle:Car)-->(:Company)
RETURN count(vehicle)
-
将命名节点放在匿名节点之前。
MATCH ()-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
MATCH (manufacturer:Company)<--(vehicle:Car)<--()
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
-
将锚节点放在
MATCH
子句的开头。
MATCH (:Person)-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
MATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
-
优先使用出站(从左到右)模式关系,而不是入站模式关系。
MATCH (:Country)-->(:Company)<--(vehicle:Car)<--(:Person)
RETURN vehicle.mileage
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country)
RETURN vehicle.mileage
元字符
-
对于字面
STRING
值,请使用单引号,'
。
RETURN "Cypher"
RETURN 'Cypher'
-
对于包含单引号字符的字面
STRING
值,请忽略此规则。如果STRING
同时包含两者,请使用产生最少转义的格式。如果出现平局,请优先使用单引号。
RETURN 'Cypher\'s a nice language', "Mats' quote: \"statement\""
RETURN "Cypher's a nice language", 'Mats\' quote: "statement"'
-
避免使用反引号转义字符和关键字。
MATCH (`odd-ch@racter$`:`Spaced Label` {`&property`: 42})
RETURN labels(`odd-ch@racter$`)
MATCH (node:NonSpacedLabel {property: 42})
RETURN labels(node)
-
不要在语句末尾使用分号。
RETURN 1;
RETURN 1