样式规范指南的目的是使代码尽可能易于阅读,从而有助于降低维护成本。有关标签、关系类型和属性命名的规则和建议,如下:
1. 一般建议
- 在使用 Cypher 语言结构时,请使用等宽字体并遵循样式规则。
- 引用标签和关系类型时,冒号应包括如下::Label,:REL_TYPE。
- 引用函数时,请使用小写驼峰式,括号应使用如下:shortestPath()。 通常不应包含参数。
- 如果将 Cypher 语句存储在单独的文件中,请使用文件扩展名 .cypher。
2.缩进和换行
在新行上开始一个新子句
Bad Cypher
MATCH (n) WHERE n.name CONTAINS 's' RETURN n.name
Good Cypher
MATCH (n)
WHERE n.name CONTAINS 's'
RETURN n.name
使用两个空格缩进 ON CREATE 和 ON MATCH。 如果两者都存在,则在 ON MATCH 之前放置 ON CREATE。
Bad Cypher
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
Good Cypher
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
在左大括号后的新行上开始一个子查询,缩进两个额外空格,右大括号单独一行。
Bad Cypher
MATCH (a:A)
WHERE
EXISTS { MATCH (a)-->(b:B) WHERE b.prop = $param }
RETURN a.foo
Also bad Cypher
MATCH (a:A)
WHERE EXISTS
{MATCH (a)-->(b:B)
WHERE b.prop = $param}
RETURN a.foo
Good Cypher
MATCH (a:A)
WHERE EXISTS {
MATCH (a)-->(b:B)
WHERE b.prop = $param
}
RETURN a.foo
如果使用简化的子查询表单,请不要换行
Bad Cypher
MATCH (a:A)
WHERE EXISTS {
(a)-->(b:B)
}
RETURN a.prop
Good Cypher
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop
3. 大小写
关键字大写
Bad Cypher
match (p:Person)
where p.name starts with 'Ma'
return p.name
Good Cypher
MATCH (p:Person)
WHERE p.name STARTS WITH 'Ma'
RETURN p.name
null值小写
Bad Cypher
WITH NULL AS n1, Null AS n2
RETURN n1 IS NULL AND n2 IS NOT NULL
Good Cypher
WITH null AS n1, null as n2
RETURN n1 IS NULL AND n2 IS NOT NULL
布尔值 (true
and false
) 小写
Bad Cypher
WITH TRUE AS b1, False AS b2
RETURN b1 AND b2
Good Cypher
WITH true AS b1, false AS b2
RETURN b1 AND b2
对函数,属性,变量和参数以小写字母开头使用驼峰命名规则
Bad Cypher
CREATE (N {Prop: 0})
WITH RAND() AS Rand, $pArAm AS MAP
RETURN Rand, MAP.property_key, Count(N)
Good Cypher
CREATE (n {prop: 0})
WITH rand() AS rand, $param AS map
RETURN rand, map.propertyKey, count(n)
4. 空格
mapping中空格
- 左大括号和第一个键之间没有空格
- 键和冒号之间没有空格
- 冒号和值之间有一个空格
- 值和逗号之间没有空格
- 逗号和下一个键之间有一个空格
- 最后一个值和右大括号之间没有空格
Bad Cypher
WITH { key1 :'value' ,key2 : 42 } AS map
RETURN map
Good Cypher
WITH {key1: 'value', key2: 42} AS map
RETURN map
标签/类型谓词和属性谓词之间一个空格
Bad Cypher
MATCH (p:Person{property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
Good Cypher
MATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
模式之间不空格
Bad Cypher
MATCH (:Person) --> (:Vehicle)
RETURN count(*)
Good Cypher
MATCH (:Person)-->(:Vehicle)
RETURN count(*)
在运算符两端使用空格
Bad Cypher
MATCH p=(s)-->(e)
WHERE s.name<>e.name
RETURN length(p)
Good Cypher
MATCH p = (s)-->(e)
WHERE s.name <> e.name
RETURN length(p)
标签谓词中没有空格
Bad Cypher
MATCH (person : Person : Owner )
RETURN person.name
Good Cypher
MATCH (person:Person:Owner)
RETURN person.name
在列表和枚举中的每个逗号后使用一个空格
Bad Cypher
MATCH (),()
WITH ['a','b',3.14] AS list
RETURN list,2,3,4
Good Cypher
MATCH (), ()
WITH ['a', 'b', 3.14] AS list
RETURN list, 2, 3, 4
函数调用括号左右没有空格
Bad Cypher
RETURN split( 'original', 'i' )
Good Cypher
RETURN split('original', 'i')
在简单的子查询表达式中使用空格
Bad Cypher
MATCH (a:A)
WHERE EXISTS {(a)-->(b:B)}
RETURN a.prop
Good Cypher
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop
5. 模式
当匹配模型需要换行时, 在箭头后换行
Bad Cypher
MATCH (:Person)-->(vehicle:Car)-->(:Company)
<--(:Country)
RETURN count(vehicle)
Good Cypher
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--
(:Country)
RETURN count(vehicle)
对后续不用的节点和关系,使用匿名
Bad Cypher
CREATE (a:End {prop: 42}),
(b:End {prop: 3}),
(c:Begin {prop: id(a)})
Good Cypher
CREATE (a:End {prop: 42}),
(:End {prop: 3}),
(:Begin {prop: id(a)})
尽量将模式连在一起
Bad Cypher
MATCH (:Person)-->(vehicle:Car), (vehicle:Car)-->(:Company)
RETURN count(vehicle)
Good Cypher
MATCH (:Person)-->(vehicle:Car)-->(:Company)
RETURN count(vehicle)
将命名的节点放在为命名节点之前
Bad Cypher
MATCH ()-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
Good Cypher
MATCH (manufacturer:Company)<--(vehicle:Car)<--()
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
MATCH之后尽量有命名的节点
Bad Cypher
MATCH (:Person)-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
Good Cypher
MATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
尽量使用从左到右模式关系
Bad Cypher
MATCH (:Country)-->(:Company)<--(vehicle:Car)<--(:Person)
RETURN vehicle.mileage
Good Cypher
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country)
RETURN vehicle.mileage
6. 元字符
尽量使用单引号‘返回值
Bad Cypher
RETURN "Cypher"
Good Cypher
RETURN 'Cypher'
对于包含单引号字符的文字字符串,请忽略上面规则。 如果字符串两者都有,使用创建最少转义的形式。
Bad Cypher
RETURN 'Cypher\'s a nice language', "Mats' quote: \"statement\""
Good Cypher
RETURN "Cypher's a nice language", 'Mats\' quote: "statement"'
避免使用反引号来转义字符和关键字
Bad Cypher
MATCH (`odd-ch@racter$`:`Spaced Label` {`&property`: 42})
RETURN labels(`odd-ch@racter$`)
Good Cypher
MATCH (node:NonSpacedLabel {property: 42})
RETURN labels(node)
不要在语句末尾使用分号
Bad Cypher
RETURN 1;
Good Cypher
RETURN 1