グラフDBであるneo4jを操作するCypherについて勉強中。
公式の解説では「SQLライク」と売り文句が記載されている。個人的には、これが逆に理解の妨げになった。
SQLならわかるぜー、の気持ちで勉強するとさっぱりわからない。「予約語が似ている」ぐらいのの方がいいかもしれない。
SQLと異なるというところを重点的に記載したほうがわかりやすいのではないかと思い、勉強したことをメモする。個人の感覚を多分に含む。
INSERT
SQLのINSERTにあたるのは、CypherのCREATEのような気がする。
CyhperのCREATEは、SQLにおけるCREATEというよりINSERTに似ている気がする。Cypherにはテーブルという概念がないのでCREATEに似ている気もする。
name属性にhogeを持つPersonノードを作成する。
CREATE (Person{name:"hoge"});
複数まとめることもできる。
CREATE (p1:Person{name:"hoge"}), (p2:Person{name:"huge"});
ここでのp1とp2は、SQLのASのようなものと考えたほうがいいかもしれない。汎用言語の変数と考えてもいいかもしれない。
CREATE (p:Person{name:"hoge"})
RETURN p;
ノードを生成しながら、SQLのSELECTみたいなことをやっている。
SELECT
SELECTが出たので、SELECTを書く。CyherのMATCHがそれにあたる。
CypherのMATCH...RETURN...がSQLのSELECTかもしれない。
MATCH (p:Person{name:'hoge'})
RETURN p;
name属性が'hoge'のノードを返す。CypherにもWHEREがある。
MATCH (p:Person)
WHERE p.name='hoge'
RETURN p;
一応、同じ結果が返ってくる。
CypherのWHEREは、結果のフィルタをするものらしく、SQLのHAVINGみたいなものという理解。
エッジ
name属性がhugeのPersonノードから、name属性がhogeのPesonノードへ、Loveというエッジを引いてみる。
MATCH (p1:Person{name:'hoge'}), (p2:Person{name:'huge'})
CREATE (p1)-[:Love]->(p2);
SQL的に言えば、INSERT...SELECT...が近い気がする。
なお、これもRETURNをつければ作成しながら、返るようだ。
MATCH (p1:Person{name:'hoge'}), (p2:Person{name:'huge'})
CREATE (p1)-[e1:Love]->(p2)
RETURN p1, e1, p2;