图数据库(十四):Neo4j中Cypher书写规范

​样式规范指南的目的是使代码尽可能易于阅读,从而有助于降低维护成本。有关标签、关系类型和属性命名的规则和建议,如下:

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

猜你喜欢

转载自blog.csdn.net/weixin_43145427/article/details/124270064