グラフデータベースとは
- プロパティを持つノードでデータとそのリレーションをあらわす
ノードとは
- ノードとはデータを保持するレコードである
- データはノードのプロパティとして格納される
- プロパティはKV形式になっている
- プロパティはString, Number, Boolean
- Neo4j can store billions of nodes
ラベル
- ノードにはラベルを付けることが出来る
- ノードは複数のラベルを持つことが出来る
- ラベルは一切プロパティーをもてない
リレーションシップ
- リレーションシップはレコードがどのように紐付いているかを示す
- リレーションシップは常に方向を持っている
- リレーションシップはタイプを持っている
- リレーションシップはデータのパターンである
- リレーションシップはプロパティを持てる
Cypher
- グラフデータを扱うためのSQL的なもの
-
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
CREATE
データを作るための宣言()
ノードを示すee:Person
eeはデータ名称、Personはラベル名称{}
プロパティ宣言
MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
MATCH
where句宣言みたいなもの
(ee:Person)
対象のノード
WHERE
WHERE句
ee.name = "Emil"
where句の左側的な
RETURN
リターン
- 一度にたくさんのデータを作ることが可能
MATCH (ee:Person) WHERE ee.name = "Emil" CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }), (ir:Person { name: "Ian", from: "England", title: "author" }), (rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }), (ally:Person { name: "Allison", from: "California", hobby: "surfing" }), (ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir), (js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb), (ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally), (rvb)-[:KNOWS]->(ally)
リレーションから検索する
-
MATCH (ee:Person)-[:KNOWS]-(friends) WHERE ee.name = "Emil" RETURN ee, friends
-[:KNOWS]
リレーションシップがKNOWであるかどうか
(friends)
エミリーの友達に限定することを指定 グラフデータの得意な検索
-
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer) WHERE js.name = "Johan" AND surfer.hobby = "surfing" RETURN DISTINCT surfer
()
空の丸カッコはsqlでいうところの*
DISTINCT
sqlでいうところのdistinctと同じ。ヒットするノードへのパスが複数あるときに役立つ。