Neo4j #3 個人的に詰まったところ


はじめに

自分の紹介をしておきますと, 当方関東の大学の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にはapocalgoという拡張ライブラリが存在し, これにより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に下記のように記載する必要がある.

neo4j.conf
dbms.security.procedures.unrestricted=algo.*,apoc.*
dbms.security.procedures.whitelist=algo.*,apoc.*

まとめ

また触ってみて詰まったところだったりがあったら記載していこうと思います. とにかくNeo4jは日本語の記事が少なかったり, 大幅アップデートによりクエリの書き方が大きく変化しているなどのせいか古い記事が役に立たなかったり等々あるので,参考になれば幸いです.