fbpx

CL LAB

HOME > Blog > lee > Cypher Query演習用のグラフデータベース #neo4j

Cypher Query演習用のグラフデータベース #neo4j

 ★ 61

この記事は、Neo4j v4.0(2020-01)に合わせて更新しています!

Neo4jのクエリ言語であるCypherがなかなか上達しないという悩みを聞くと、筆者は「グラフを忘れて思い切りRDB的な事をやってみたらどうですか」と答えます。大概、Cypherに十分慣れていない内に、パターンマッチのような新しい概念に取り組んでいるからです。

その演習用のデータベースとして開発したのが、「Cypher Query演習用のグラフデータベース」です。中身は、架空のECサイトの販売履歴です。

次の書籍は、色々試してみたことをまとめた結果です。

セットで開発したCypher Queryなどは、2015年10月29日、『Cypherクエリー言語の事例で学ぶグラブテータベースNeo4j』(著者:李 昌桓、監修:クリエーションライン株式会社、発刊:株式会社インプレスR&D)のようにリリースされました。

著作権について
販売履歴データベースの著作権はクリエーションライン社にありますが、ご利用において特に制限はありません。ご自由に利用してください。

グラフDBのスキーマ

グラフDBでは、スキーマをみれば、データベースの構成が一目瞭然に把握できます。

販売履歴データベースの構築

販売履歴データベースは、次のリンクからダウンロードできます。

ダウンロード

ファイルを解凍し、内容を確認してみてください。LOAD CSVで「My販売履歴データベース」が作れるようになっています。

create-salesdb-ddl.txt # LOAD CSVでデータベースを構築するソースコード
csv/ec-users-10000.csv # ユーザーデータ
csv/ec-goods-10000.csv # 商品データ
csv/ec-sales-10000.csv # 販売履歴データ

  • CSVファイルを${NEO4J_HOME}/import配下にコピー
  • Neo4jサーバーを起動
  • create-salesdb-ddlを参考にして実行

販売履歴データベースの構築開始

Neo4jブラウザーから、次のように実行します。

制約及びインデックス作成
後続のCypherにインデクスが必要なものがあります。

CREATE CONSTRAINT cnt_uid ON (u:User) ASSERT u.uid IS UNIQUE;

CREATE CONSTRAINT cnt_gid ON (g:Goods) ASSERT g.gid IS UNIQUE;

CREATE CONSTRAINT cnt_oid ON (o:Order) ASSERT o.oid IS UNIQUE;

CREATE INDEX idx_day FOR (d:Day) ON (d.day);

ユーザーノードの作成

LOAD CSV WITH HEADERS FROM "file:///ec-users-10000.csv" AS line
CREATE (u:User { uid:line.uid, born:toInteger(line.born), gender:line.gender })

商品ノードの作成

LOAD CSV WITH HEADERS FROM "file:///ec-goods-10000.csv" AS line
CREATE (g:Goods { gid:line.gid, color:line.color })

販売履歴ノードの作成

//USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///ec-sales-10000.csv" AS line
CREATE (o:Order{oid:line.oid, number:toInteger(line.number), 
        price:toInteger(line.price),
        date:substring(line.datetime,0,10),
        datetime:line.datetime})

ユーザーと販売履歴間の関係性の作成
殆どのグラフDBでは、RDBとは違ってデータの結合関係を永続化します。
内部的にリレーションシップ(PLACED)の前後に始点と終点のIDを持ちます。

[cc lang="html"]
//USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///ec-sales-10000.csv" AS line
MATCH (u:User { uid:line.uid }), (o:Order { oid:line.oid})
CREATE (u)-

Author

データベースが大好きなサーバサイドのエンジニア。現代的なデータ基盤のソリューションアーキテクトとして活動しています。

[著書]
グラフデータベースNeo4jの他
https://www.amazon.co.jp/李昌桓/e/B004LWEKOU

leeの記事一覧

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post

[無料ウェビナー] GitLab_CI/CDハンズオン_2023111