Cypher编程风格指南


译者:wry2008wry@163.com

原文:https://github.com/opencypher/openCypher/blob/master/docs/style-guide.adoc

本文:https://blog.csdn.net/wry2008wry/article/details/80350450


目录

1. 为什么风格很重要
2. 规则
  2.1. 缩进和换行
  2.2. 元字符
  2.3. 大小写
  2.4. 模式
  2.5. 空格
3. 建议

  3.1. 图建模

  • 这是Cypher语言的风格指南,其正通过openCypher项目标准化。本文档由两大部分组成:【规则】和【建议】。
  • 在【规则】中,我们列举出一些符合常规、面向可读性的编写Cypher查询的语法指南。所提供的示例总是以推荐的格式将有效但格式不佳的查询转换为相同的语义的查询。
  • 在【建议】中,我们列出了一些可能影响查询语义的准则,比如如何通过"标签"和"关系类型"来构造图。请记住:如果图结构已经构造好了这些规则将不起作用,如果不重构图则无法运用【建议】来重新格式化查询。

1 为什么【指南】很重要?

看看这个达达主义艺术作品吧:(译注:达达主义是一种“追求非理性状态、拒绝约定俗成”的艺术流派)

【不好】

MATCH (null)-[:merge]->(true)
with null.delete as foreach, `true`.false as null
return 2 + foreach, coalesce(null, 3.1415)
limit 10;

然后与马克·李约瑟的经典作品进行比较一下吧:

【好的】

MATCH (member:Member {name: 'Mark Needham'})
      -[:HAS_MEMBERSHIP]->()-[:OF_GROUP]->(:Group)-[:HAS_TOPIC]->(topic)
WITH member, topic, count(*) AS score
MATCH (topic)<-[:HAS_TOPIC]-(otherGroup:Group)
WHERE NOT (member)-[:HAS_MEMBERSHIP]->(:Membership)-[:OF_GROUP]->(otherGroup)
RETURN otherGroup.name, collect(topic.name), sum(score) AS score
ORDER BY score DESC

本文档旨在让大家以最小摩擦共享彼此的查询,并构造一种跨用例及实现一致的、可移植的用法。


2 规则

* 如果两条规则相冲突且没有提到哪条规则优先,则最后提到的规则适用

2.1 缩进和换行

2.1.1 子句另起一行

【不好】

MATCH (n) WHERE n.name CONTAINS 's' RETURN n.name

【好的】

MATCH (n)
WHERE n.name CONTAINS 's'
RETURN n.name

ON MATCH和ON CREATE缩进两个空格

【不好】

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

【好的】

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

如果ON CREATE和ON MATCH同时出现,ON CREATE放在前面

2.1.2 子查询在左大括号后另起一行且缩进两个空格,右大括号单独一行

【不好】

MATCH (a:A)
WHERE
  EXISTS { MATCH (a)-->(b:B) WHERE b.prop = $param }
RETURN a.foo

【不好】

MATCH (a:A)
WHERE EXISTS
{MATCH (a)-->(b:B)
WHERE b.prop = $param}
RETURN a.foo

【好的】

MATCH (a:A)
WHERE EXISTS {
  MATCH (a)-->(b:B)
  WHERE b.prop = $param
}
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

2.2 元字符

2.2.1 字符串字面值使用单引号

【不好】

RETURN "Cypher"

【好的】

RETURN 'Cypher'

注:如果字符串内容包含了单引号忽略这条规则,如果字符串中同时包含单引号、双引号则使用创建较少转义符的方式,如果一样则优先单引号

【不好】

RETURN 'Cypher\'s a nice language', "Mats' quote: \"statement\""

【好的】

RETURN "Cypher's a nice language", 'Mats\' quote: "statement"'

2.2.2 避免必须要用反引号来处理转义字符和关键字的情况

【不好】

MATCH (`odd-ch@racter$`:`Spaced Label` {`&property`: 42})
RETURN labels(`odd-ch@racter$`)

【好的】

MATCH (node:NonSpacedLabel {property: 42})
RETURN labels(node)

2.2.3 语句末不要加分号

【不好】

RETURN 1;

【好的】

RETURN 1

2.3 大小写

2.3.1 关键字都大写

【不好】

match (p:Person)
where p.name starts with 'Ma'
return p.name

【好的】

MATCH (p:Person)
WHERE p.name STARTS WITH 'Ma'
RETURN p.name

2.3.2 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

2.3.3 boolean字面值小写

【不好】

WITH TRUE AS b1, False AS b2
RETURN b1 AND b2

【好的】

WITH true AS b1, false AS b2
RETURN b1 AND b2

2.3.4 下列使用小写开头的驼峰命名法:

函数
属性
变量

参数

【不好】

CREATE (N {Prop: 0})
WITH RAND() AS Rand, $pArAm AS MAP
RETURN Rand, MAP.property_key, Count(N)

【好的】

CREATE (n {prop: 0})
WITH rand() AS rand, $param AS map
RETURN rand, map.propertyKey, count(n)

2.4 模式

2.4.1 如果模式需要换行,在箭头后换行而不要在箭头前

【不好】

MATCH (:Person)-->(vehicle:Car)-->(:Company)
      <--(:Country)
RETURN count(vehicle)

【好的】

MATCH (:Person)-->(vehicle:Car)-->(:Company)<--
      (:Country)
RETURN count(vehicle)

2.4.2 如果变量后续没有被使用,则使用匿名结点及关系

【不好】

CREATE (a:End {prop: 42}),
       (b:End {prop: 3}),
       (c:Begin {prop: id(a)})

【好的】

CREATE (a:End {prop: 42}),
       (:End {prop: 3}),
       (:Begin {prop: id(a)})

2.4.3 将模式链接到一起,避免重复变量

【不好】

MATCH (:Person)-->(vehicle:Car), (vehicle:Car)-->(:Company)
RETURN count(vehicle)

【好的】

MATCH (:Person)-->(vehicle:Car)-->(:Company)
RETURN count(vehicle)

2.4.4 将有名结点放到匿名结点前

【不好】

MATCH ()-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.founded_year < 2000
RETURN vehicle.mileage

【好的】

MATCH (manufacturer:Company)<--(vehicle:Car)<--()
WHERE manufacturer.founded_year < 2000
RETURN vehicle.mileage

2.4.5 将锚结点放到MATCH子句的开头

【不好】

MATCH (:Person)-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.founded_year < 2000
RETURN vehicle.mileage

【好的】

MATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person)
WHERE manufacturer.founded_year < 2000
RETURN vehicle.mileage

2.4.6 优先使用传出关系(从左至右)而非传入关系

【不好】

MATCH (:Country)-->(:Company)<--(vehicle:Car)<--(:Person)
RETURN vehicle.mileage

【好的】

MATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country)
RETURN vehicle.mileage

2.5 空格

2.5.1 对于映射(map)字面值:

   在右大括号和第一个key间不要放置空格;
   key和冒号间不要放置空格;
   冒号和值之前放一个空格;
   值和逗号之前不要空格;
   逗号和下一个key之前放置一个空格;

   在最后的值和右大括号间不要空格;

【不好】

WITH { key1 :'value' ,key2  :  42 } AS map
RETURN map

【好的】

WITH {key1: 'value', key2: 42} AS map
RETURN map

2.5.2 参数不要空格

【不好】

RETURN { param }

【好的】

RETURN {param}

2.5.3 标签/类型谓词和属性谓词间放置一个空格

【不好】

MATCH (p:Person{property: -1})-[:KNOWS   {since: 2016}]->()
RETURN p.name

【好的】

MATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name

2.5.4 模式中不要有空格

【不好】

MATCH (:Person) --> (:Vehicle)
RETURN count(*)

【好的】

MATCH (:Person)-->(:Vehicle)
RETURN count(*)

2.5.5 操作符前后加空格

【不好】

MATCH p=(s)-->(e)
WHERE s.name<>e.name
RETURN length(p)

【好的】

MATCH p = (s)-->(e)
WHERE s.name <> e.name
RETURN length(p)

2.5.6 在标签谓词间不加空格

【不好】

MATCH (person    : Person  :  Owner  )
RETURN person.name

【好的】

MATCH (person:Person:Owner)
RETURN person.name

2.5.7 在lists和enumerations中每个逗号后加空格

【不好】

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

2.5.8 函数调用左右括号内侧不要填充空格

【不好】

RETURN split( 'original', 'i' )

【好的】

RETURN split('original', 'i')

2.5.9 简单子查询表达式在左右大括号内侧填充空格

【不好】

MATCH (a:A)
WHERE EXISTS {(a)-->(b:B)}
RETURN a.prop

【好的】

MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop

3 建议

当在文章中书写Cypher代码时,使用monospaced字体并遵守以下规则:
  • 当引用了标签或关系类型时,应当包含前面的冒号如:Label,:REL_TYPE
  • 当引用了函数,使用小写的驼峰命名法且应包含小括号如:shortestPath(),不要包含参数
  • 如果将Cypher语句存储在一个单独的文件中,使用.cypher后缀

3.1 图建模

3.1 标签名优先使用单个单词

【不好】

MATCH (e:IsEmployed)
RETURN e.name

【好的】

MATCH (e:Employee)
RETURN e.name

3.2 标签名使用大写字母开头的驼峰命名法

【不好】

MATCH (e:editor_in_chief)-->(:EMPLOYEE)
RETURN e.name

【好的】

MATCH (e:EditorInChief)-->(:Employee)
RETURN e.name

3.3 关系类型名大写,单词间用下划线隔开

【不好】

MATCH (:Person)-[own:ownsVehicle]->(:Car)
RETURN own.since

【好的】

MATCH (:Person)-[own:OWNS_VEHICLE]->(:Car)
RETURN own.since

阅读更多
个人分类: neo4j
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭