はじめに
自分の紹介をしておきますと, 当方関東の大学のB4で, Python, C, Java, SQLが書けます. インターンしている会社でNeo4jを触って詰まったところをリストアップしていこうと思います.かなり基礎的ですがこの記事は自分のメモとして利用しています. ご容赦ください...
データ消去
リレーションが入り組んだ場合のDELETE
リレーションはノードありきのため, リレーションだけでは存在できない. そのためリレーションが存在するノードを消去したいとき, リレーションを先に消去する必要がある.しかしながらノードにリレーションが入り組んでいる時,いちいちリレーションを消去するのはめんどくさい. そんな時はDETACH DELETE
というコマンドを使うことでノードに関係するリレーションも勝手に断ち切ることができる.
MATCH (n)
DETACH DELETE n
大量データをDELETEするとき
大量データをグラフにした後に前述のDETACH DELETEでは消去しきれないことがあった(2019年3月時点). そこでデータが保存されている場所にアクセスして物理的にrmコマンド等で消去することができる.
データは<neo4j-home>/data内のgraph.dbに保存されているのでそこを物理的に消去してあげると良い.
LOAD CSV周り
ファイルを置くべき場所
Neo4jのCypherという言語にはCSVファイルからデータを取ってくる処理を行うLOAD CSVというコマンドがある.これは入手したCSVファイルを元にグラフを構築することができるというものである.まずLOAD CSVでファイルを取ってくるときにファイルを<neo4j-home>/import内に置くことで
LOAD CSV FROM "file:///hogehoge.csv.gz"
のコマンドを打つことで取ってくることが可能である.
USING PERIODIC COMMIT
また, 大量のデータをLOAD CSVを用いて取得する際に
USING PERIODIC COMMIT <数字(約500くらい)>
というコマンドを打つことでJavaのヒープメモリのオーバーフローを防ぐことができる.
重複で取ってくることを防ぐ
データが複雑であると, データの中に誤って重複が含まれてしまうことがある. そんな時に重複が含まれないように制約を課すことが可能である.以下のようにクエリを書く.
CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE
また, この制約を取り除きたい場合は下記のように記述すれば良い.
DROP CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE
ノードのIDとid
自分で任意で属性として設定するidの他にノードやリレーション作成時にノード, リレーション固有のidが必ず自動的に付加される. 下図のように<id>として表される.
この固有のidを元に参照したい時は下記のように記述するMATCH (n)
WHERE id(n) = 4
RETURN n
apoc, algo導入
Neo4jにはapocとalgoという拡張ライブラリが存在し, これによりNeo4jでできることを増やすことができる.拡張ライブラリを利用するためには, github上のjarファイルを<neo4j-home>/pluginsに保存してあげる必要がある. apocのダウンロードは下記のようにコマンドラインに入力すると良い.
$ cd $NEO4J_HOME/plugins
$ wget https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.5.0.4/apoc-3.5.0.4-all.jar
一方algoについては以下のようにインストールする.
$ git clone https://github.com/neo4j-contrib/neo4j-graph-algorithms
$ cd neo4j-graph-algorithms
$ git checkout 3.3
$ mvn clean install
$ cp algo/target/graph-algorithms-*.jar $NEO4J_HOME/plugins/ $NEO4J_HOME/bin/neo4j restart
ただしこれだけでは実行ができない. <neo4j-home>/conf/neo4j.confに下記のように記載する必要がある.
dbms.security.procedures.unrestricted=algo.*,apoc.*
dbms.security.procedures.whitelist=algo.*,apoc.*
まとめ
また触ってみて詰まったところだったりがあったら記載していこうと思います. とにかくNeo4jは日本語の記事が少なかったり, 大幅アップデートによりクエリの書き方が大きく変化しているなどのせいか古い記事が役に立たなかったり等々あるので,参考になれば幸いです.