Cypherについて
Cypherは、Neo4jのようなグラフ型データベースにおけるクエリ言語である。基礎文法を書いていく。
ノードの作成
ノードはグラフの基本単位である。ノードを作成するには"CREATE"を使用する。以下は、"Person"というラベルをもったノードを作成する例。
CREATE (p: Person {name: "Alice", age:30})
- pはノードの変数名
- Personはノードのラベル
- {name: "Alice", age:30}はプロパティ
変数名とラベルの違い
- ラベル (Label): ノードのカテゴリやタイプを示すためのもの。ノードをグループ化し、効率的な検索や操作を可能にする。
- 変数名 (Variable): クエリ内でノードや関係を参照するための一時的な名前。クエリ内の特定の要素を識別し、操作するために使用。
関係の作成
ノード間の関係はグラフの重要な要素である。(エッジともいう)関係を作成するには、"CREATE"を使用する。以下は、"Alice"と"Bob"という二つのノード間に、"KNOWS"という関係を作成する例である。
CREATE (p1: Person {name: "Alice"})
CREATE (p2: Person {name: "Bob"})
CREATE (p1)-[:KNOWS]->(p2)
ここでは、"ノード(p1)とノード(p2)の間に[:KNOWS]という関係を持っている"ということを示している。
ノードの検索
ノードを検索するには、"MATCH"を使用する。以下は、"Person"ラベルを持つ、"Alice" という名前を持つノードを検索する例。
MATCH (p:Person {name: "Alice"})
RETURN p
関係の検索
関係を検索するには"MATCH"を使用する。以下は、"Alice"が知っている人を検索する例。
MATCH (p1: Person {name: "Alice"})-[:KNOWS]->(p2)
RETURN p2
このクエリは、"Alice"が"KNOWS"という関係を持つすべてのノードを検索し、それらのノードを返している。
- 注意:
MATCH (p1)-[:KNOWS]->(p2)
でも動作するが、このクエリは、ラベルを指定せずに、任意のノードp1がKNOWS関係を持つノードp2を返すp1ノードのプロパティに名前Aliceが含まれていることを前提としているが、ラベルに依存しないため、他のラベル(例えば、Person以外のラベル)を持つノードも検索対象になる。
ノードと関係の更新
既存のノードや関係を更新するには、"SET"を使用する。以下は、"Alice"の年齢を更新する例。
MATCH (p:Person { name: "Alice" })
SET p.age = 31
ノードと関係の削除
ノードや関係を削除するには、DELETE文を使用する。以下は、"Alice"のノードとそれに関連するすべての関係を削除する例。
MATCH (p:Person { name: "Alice" })
DETACH DELETE p
- DETACH DELETEはCypherクエリ言語で使用されるキーワードで、ノードを削除する際にそのノードに関連するすべてのリレーションシップも同時に削除するために使われる。これにより、ノードを削除する前に手動でリレーションシップを削除する必要がなくなる。
- DELETEのみでノードを削除した場合、例えばノードp1を消した時、p1に関係を持つノードがあった場合、エラーが発生する。p1を削除した場合、p1に関係をもつ関係をまるごと消すために、DETACHを用いる。
その他の基本操作
プロパティの追加
MATCH (p: Person {name: "Alice"})
SET p.city = "San Francisco"
プロパティの削除
MATCH (p: Person {name: "Alice"})
REMOVE p.city