LoginSignup
2
0

More than 1 year has passed since last update.

Cypherスタイルガイド

Posted at

出典:https://neo4j.com/docs/cypher-manual/current/styleguide/

この付録には、Cypherクエリを作成する際の推奨スタイルを記載しています。

この付録では、次の内容について説明します。

  • 一般的な推奨事項
  • インデントと改行
  • 大文字/小文字
  • スペース
  • パターン
  • メタ文字

スタイルガイドの目的は、コードをできるだけ読みやすくし、保守コストの削減に貢献することです。
ラベル、リレーションシップのタイプ、プロパティの命名規則と推奨事項については、命名規則と推奨事項を参照してください。

一般的な推奨事項

  • Cypher構文を散文で記述する場合は、モノスペースフォントを使用し、スタイルガイドに従ってください。

Clean Codeはシンプルで直接的なもの。Clean Codeは散文のようなコードだ -- Grady Booch.

  • ラベルおよびリレーションシップタイプを参照する場合は、:を含めてください。
    例::Label:REL_TYPE
  • 関数を参照する場合は、キャメルケースを使用し、()を使用します。引数は通常含みません。
    例::shortestPath()
  • Cypher文を別ファイルに保存する場合は、拡張子.cypherを使用します。

インデントと改行

  • 新しい句は新しい行で開始します。
BAD
MATCH(n)WHERE n.name CONTAINS's'RETURN n.name
GOOD
MATCH (n)
WHERE n.name CONTAINS 's'
RETURN n.name
  • ON CREATEON MATCHは半角スペース2個でインデントします。ON CREATEON MATCHの両方が存在する場合は、ON CREATEを先に記述します。
BAD
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
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
  • サブクエリは{の後に記述しますが、新しい行で半角スペース2個分インデントします。}は単独で記述します。
BAD
//例1
MATCH (a:A)
WHERE
  EXISTS { MATCH (a)-->(b:B) WHERE b.prop = $param }
RETURN a.foo

//例2
MATCH (a:A)
WHERE EXISTS
{MATCH (a)-->(b:B)
WHERE b.prop = $param}
RETURN a.foo
GOOD
MATCH (a:A)
WHERE EXISTS {
  MATCH (a)-->(b:B)
  WHERE b.prop = $param
}
RETURN a.foo
  • 簡易サブクエリは改行しないでください。
BAD
MATCH (a:A)
WHERE EXISTS {
  (a)-->(b:B)
}
RETURN a.prop
GOOD
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop

小文字/大文字の使い分け

  • キーワードは大文字で記述します。
BAD
match (p:Person)
where p.name starts with 'Ma'
return p.name
GOOD
MATCH (p:Person)
WHERE p.name STARTS WITH 'Ma'
RETURN p.name
  • NULL値は小文字で記述します。
BAD
WITH NULL AS n1, Null AS n2
RETURN n1 IS NULL AND n2 IS NOT NULL
GOOD
WITH null AS n1, null as n2
RETURN n1 IS NULL AND n2 IS NOT NULL
  • ブールリテラル(trueおよびfalse)は小文字で記述します。
BAD
WITH TRUE AS b1, False AS b2
RETURN b1 AND b2
GOOD
WITH true AS b1, false AS b2
RETURN b1 AND b2
  • 次の場合はキャメルケースを使用します。
    • 関数
    • プロパティ
    • 変数
    • パラメータ
BAD
CREATE (N {Prop: 0})
WITH RAND() AS Rand, $pArAm AS MAP
RETURN Rand, MAP.property_key, Count(N)
GOOD
CREATE (n {prop: 0})
WITH rand() AS rand, $param AS map
RETURN rand, map.propertyKey, count(n)

スペース

  • リテラルマップの場合:
    • {と最初のキーの間にはスペースを入れません。
    • キーと:の間にはスペースを入れません。
    • :と値の間にはスペースを入れます。
    • 値と:の間にはスペースを入れません。
    • ,と次のキーの間にはスペースを入れます。
    • 最後の値と}の間にはスペースを入れません。
BAD
WITH { key1 :'value' ,key2  :  42 } AS map
RETURN map
GOOD
WITH {key1: 'value', key2: 42} AS map
RETURN map
  • パターン内のラベル/タイプ述部とプロパティ述部の間には、1つのスペースを入れます。
BAD
MATCH (p:Person{property: -1})-[:KNOWS   {since: 2016}]->()
RETURN p.name
GOOD
MATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
  • パターンにスペースは入れません。
BAD
MATCH (:Person) --> (:Vehicle)
RETURN count(*)
GOOD
MATCH (:Person)-->(:Vehicle)
RETURN count(*)
  • 演算子の前後はスペースで覆います。
BAD
MATCH p=(s)-->(e)
WHERE s.name<>e.name
RETURN length(p)
GOOD
MATCH p = (s)-->(e)
WHERE s.name <> e.name
RETURN length(p)
  • ラベル述部にスペースは入れません。
BAD
MATCH (person    : Person  :  Owner  )
RETURN person.name
GOOD
MATCH (person:Person:Owner)
RETURN person.name
  • リストおよび列挙では、各,の後にスペースを使用します。
BAD
MATCH (),()
WITH ['a','b',3.14] AS list
RETURN list,2,3,4
GOOD
MATCH (), ()
WITH ['a', 'b', 3.14] AS list
RETURN list, 2, 3, 4
  • 関数呼び出し括弧内にパディングスペースは入れません。
BAD
RETURN split( 'original', 'i' )
GOOD
RETURN split('original', 'i')
  • 簡易サブクエリ式ではパディングスペースを使用します。
BAD
MATCH (a:A)
WHERE EXISTS {(a)-->(b:B)}
RETURN a.prop
GOOD
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop

パターン

  • パターンの途中で改行する場合は、矢印の後で行います。
BAD
MATCH (:Person)-->(vehicle:Car)-->(:Company)
      <--(:Country)
RETURN count(vehicle)
GOOD
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--
      (:Country)
RETURN count(vehicle)
  • 変数を使用しない場合は、匿名ノードとリレーションシップを使用します。
BAD
CREATE (a:End {prop: 42}),
       (b:End {prop: 3}),
       (c:Begin {prop: id(a)})
GOOD
CREATE (a:End {prop: 42}),
       (:End {prop: 3}),
       (:Begin {prop: id(a)})
  • 繰り返し変数を避けるために、パターンを連結します。
BAD
MATCH (:Person)-->(vehicle:Car), (vehicle:Car)-->(:Company)
RETURN count(vehicle)
GOOD
MATCH (:Person)-->(vehicle:Car)-->(:Company)
RETURN count(vehicle)
  • 名前付きノードは匿名ノードの前に配置します。
BAD
MATCH ()-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
GOOD
MATCH (manufacturer:Company)<--(vehicle:Car)<--()
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
  • アンカーノードはMATCH句の先頭に置きます。
BAD
MATCH (:Person)-->(vehicle:Car)-->(manufacturer:Company)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
GOOD
MATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
  • リレーションシップのパターンは、左から右向きのものを優先します。
BAD
MATCH (:Country)-->(:Company)<--(vehicle:Car)<--(:Person)
RETURN vehicle.mileage
GOOD
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country)
RETURN vehicle.mileage

メタ文字

  • リテラル文字列値には'を使用します。
BAD
RETURN "Cypher"
GOOD
RETURN 'Cypher'

ただし、'を含むリテラル文字列の場合は、このルールを無視します。文字列に' ,"の文字が含まれる場合、エスケープ\の数が最も少なくなるよう記述します。タイの場合は、'を使用します。

BAD
RETURN 'Cypher\'s a nice language', "Mats' quote: \"statement\""
GOOD
RETURN "Cypher's a nice language", 'Mats\' quote: "statement"'
  • 文字やキーワードをエスケープするために`を使用する必要はありません。
BAD
MATCH (`odd-ch@racter$`:`Spaced Label` {`&property`: 42})
RETURN labels(`odd-ch@racter$`)
GOOD
MATCH (node:NonSpacedLabel {property: 42})
RETURN labels(node)
  • 文の末尾にセミコロンを使用しないでください。
BAD
RETURN 1;
GOOD
RETURN 1
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0