Neo4j
- 大量データをJOINさせたりしたい
プラットフォームの選択
- Windowsの場合WSLを使用してDebianでインストールしたほうがいい気がする
- neo4j-shell
- /etc/neo4j/neo4j.conf のコメントを外しておく
# Enable a remote shell server which Neo4j Shell clients can log in to. dbms.shell.enabled=true # The network interface IP the shell will listen on (use 0.0.0.0 for all interfaces). dbms.shell.host=127.0.0.1 # The port the shell will listen on, default is 1337. dbms.shell.port=1337
インストールした後はserviceコマンドで起動できる。
$ sudo service neo4j start
Neo4jのコンフィグまわり
- デフォルトではCSVファイルインポートができないので、Settingsから以下の設定を有効化
これをやらないとクエリを投げてもLOADできない。
# Determines if Cypher will allow using file URLs when loading data using # `LOAD CSV`. Setting this value to `false` will cause Neo4j to fail `LOAD CSV` # clauses that load data from the file system. dbms.security.allow_csv_import_from_file_urls=true
CSVロード(デフォルト)
- RDBからダンプしたCSVファイルをロードする
- Neo4jはCSVファイルを <NEO4J_HOME>/import/myfile.csv か <NEO4J_HOME>import/myproject/myfile.csv から読み取る
LOAD CSV WITH HEADERS FROM "file:///xxx.csv" AS line CREATE (:Record { title: line.title })
- WSLの環境へヘッダありCSVを読み込む例
まず一度WSLのLinux環境へファイルを送る
$ sudo cp /mnt/c/tmp/xxx.csv /var/lib/neo4j/import/
その後LOADクエリを実行する
> LOAD CSV WITH HEADERS FROM 'file:///xxx.csv' AS line CREATE (:X { head1: line.head1 });
なんか読み込みめっちゃ早い
neo4j-import
- WSLのファイルパスについておさらい WSLを楽しく使う
Windowsの C:\User\you\Documents というパスはWSLでは/mnt/c/Users/you/Documentsとして見えます。 この変換はほとんどの場合自動で行われますが、明示的に行いたい場合WSL上にwslpathというコマンドが用意されてます。
Cypherクエリ
参考
- Neo4j: Get all nodes in a graph, even those that are unconnected by relationships
- Delete all nodes and relationships in neo4j 1.8
- Neo4j - Create a Node using Cypher
- 3.3.10. LIMIT - 3.3. Clauses
SELECT
- SELECT * FROM x; 相当
MATCH (n) RETURN n;
LIMIT/ORDER BY
- テスト時によく使うやつ
MATCH (n) RETURN n.name ORDER BY n.name LIMIT 3
DELETE
- DELETE FROM x; 相当
MATCH (n) DETACH DELETE n;
CREATE TABLE
- CREATE/INSERT 相当
単独レコード(ノード)追加
CREATE (a:Artist { Name : "Strapping Young Lad" });
複数レコード(ノード)追加
CREATE (a:Album { Name: "Killers"}), (b:Album { Name: "Fear of the Dark"}); or CREATE (a:Album { Name: "Piece of Mind"}) CREATE (b:Album { Name: "Somewhere in Time"});
RDBにはない操作…いや~、残念だなw(大嘘)
ノード間の関係を作成
MATCH (a:Artist),(b:Album) WHERE a.Name = "Strapping Young Lad" AND b.Name = "Heavy as a Really Heavy Thing" CREATE (a)-[r:RELEASED]->(b);