pikesaku’s blog

個人的なプログラム勉強メモです。記載内容について一切の責任は持ちません。

グラフデータベースNeo4jのクエリ言語Cypherの動作検証

はじめに

 
データ操作はCypherと呼ばれるクエリ言語を利用
Cypherは以下4つのIFより実行可能
①Neo4jウェブインターフェー
②Neo4jシェル
REST API
④Neo4jドライバー
 
Cypher動作検証にNeo4jシェルを利用した。
事前に以下セットアップを実施した。
pikesaku.hatenablog.com

 

データ構成要素

ノード(データの最小単位)

①ラベル
②属性
 

関係性

①タイプ
②方向性
③属性
  

データ構造

 
上記参考URLより引用

f:id:pikesaku:20170717140119p:plain

 
参考URL筆者の考察の箇条書き
・ノードとノード間の関係性を明確に分離して管理
・ノードはノードストア・関係者は関係性ストアで管理
・同じラベルを持ったノード群がRDMSのテーブル、ノードの属性はレコードのような役割をする。
・関係性はタイプという情報を持つ。タイプは属性情報を保持し、多様性のある連結を表現。
 

データ操作

 
neo4j-shellで記述

全ノード参照

 

neo4j-sh (?)$ match (a) return a;
+---+
| a |
+---+
+---+
0 row
9 ms
neo4j-sh (?)$ 

  
上記で全ノードの情報確認が可能
上記のaは識別子。クエリ実行時のみ利用される識別子。aでなくてもOK
 

neo4j-sh (?)$ match (hoge) return hoge;
+------+
| hoge |
+------+
+------+
0 row
18 ms
neo4j-sh (?)$ 

 
returnや他操作(後述するcreate or merge or delete等)を指定しないとエラーになる。
 

neo4j-sh (?)$ match (a);
1 ms

WARNING: Query cannot conclude with MATCH (must be RETURN or an update clause) (line 1, column 1 (offset: 0))
"match (a)"
 ^
neo4j-sh (?)$ 

 

ノード登録

 

ラベルも属性もないノードを登録

neo4j-sh (?)$ create (hoge);
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
5 ms
neo4j-sh (?)$ match (a) return a;
+-----------+
| a         |
+-----------+
| Node[4]{} |
+-----------+
1 row
6 ms
neo4j-sh (?)$ 

 
Node[4]の4は内部でノードを特定するためのID番号が使われていると想定。
上記が[4]になった理由は、上記実行前に登録したデータがあったため。
 

登録後に状態を表示させるには、returnを付与

neo4j-sh (?)$ create (hoge2) return hoge2;;
+-----------+
| hoge2     |
+-----------+
| Node[0]{} |
+-----------+
1 row
Nodes created: 1
42 ms
neo4j-sh (?)$ 

 

ラベル有・属性なしで登録

識別子:ラベルで記述。
※くどいが識別子はクエリ実行時のみ利用される情報。なんでもOK。自分はこの情報を知らず、結構はまった。。。。。
以下の場合、

neo4j-sh (?)$ create (test:hoge) return test;
+-----------+
| test      |
+-----------+
| Node[2]{} |
+-----------+
1 row
Nodes created: 1
Labels added: 1
20 ms
neo4j-sh (?)$ 

 

ラベル有・属性ありノードを登録

neo4j-sh (?)$ create (test:hoge{zoku1:"test", zoku2:1000, zoku3:True}) return test;
+---------------------------------------------+
| test                                        |
+---------------------------------------------+
| Node[3]{zoku1:"test",zoku2:1000,zoku3:true} |
+---------------------------------------------+
1 row
Nodes created: 1
Properties set: 3
Labels added: 1
37 ms
neo4j-sh (?)$ 

 

全ノード削除

neo4j-sh (?)$ match (a) delete a;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 5
21 ms
neo4j-sh (?)$ 

 

関係性のあるノードの登録

neo4j-sh (?)$ create (a:hoge1{zoku:"test"}), (b:hoge2{zoku:"test"}), (a)-[kankeiseitype:huga]->(b) return a,b,kankeiseitype;
+-------------------------------------------------------------+
| a                    | b                    | kankeiseitype |
+-------------------------------------------------------------+
| Node[8]{zoku:"test"} | Node[9]{zoku:"test"} | :huga[1]{}    |
+-------------------------------------------------------------+
[f:id:pikesaku:20170717155751p:plain]1 row
Nodes created: 2
Relationships created: 1
Properties set: 2
Labels added: 2
18 ms
neo4j-sh (?)$ 

 
上記では、ラベルhoge1を持つノードとラベルhoge2を持つノードを関係性タイプhugaで関係性をもたせている。
GUIでは以下の様に表示される。

f:id:pikesaku:20170717155832p:plain
 

関係性のあるノードの削除

ノード削除ではエラーになる。事前に関係性を削除する必要あり。

neo4j-sh (?)$ match (a) delete a;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 2
4 ms
ConstraintViolationException: Cannot delete node<8>, because it still has relationships. To delete this node, you must first delete its relationships.
neo4j-sh (?)$ match (a) optional match (a)-[r]-() delete a,r;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 2
Relationships deleted: 1
17 ms
neo4j-sh (?)$ 

 
optional matchで関係性も削除すればOK
 

まとめ

 
他mergeなどいろいろな操作が可能だが、参考URLをみればなんとかできそう。
個人的な動作把握のためのメモとしては、これまでとする。