はじめに
データ操作はCypherと呼ばれるクエリ言語を利用
Cypherは以下4つのIFより実行可能
①Neo4jウェブインターフェー
②Neo4jシェル
③REST API
④Neo4jドライバー
Cypher動作検証にNeo4jシェルを利用した。
事前に以下セットアップを実施した。
pikesaku.hatenablog.com
データ構成要素
ノード(データの最小単位)
①ラベル
②属性
関係性
①タイプ
②方向性
③属性
データ構造
上記参考URLより引用
参考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では以下の様に表示される。
関係性のあるノードの削除
ノード削除ではエラーになる。事前に関係性を削除する必要あり。
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をみればなんとかできそう。
個人的な動作把握のためのメモとしては、これまでとする。