ここでは、Cypher LOAD CSV
句を使用してインポートする方法のヒントを紹介します。本当に大量のデータインポートタスクを処理するには、代わりにneo4j-importツールを使用することをおすすめします。
各CSVファイルの行をアイテムの集合として扱うことができるため、さまざまな数の列を処理することは問題にはなりません。
CSVファイルを2回パスしてデータをインポートする必要があります。最初のパスで、Person
ノードをすべて作成します。 2番目のパスでは、適切なノードに一致させてから、それらの間にリレーションシップを作成します。 2回目のパスを大幅に高速化するには、Person
ノードをIDで照合するために、indexまたはuniqueness constraint(インデックスを作成する)のいずれかを作成する必要があります。
私はそれを仮定します:Person
あたりCSVファイルの1行は、その人の固有のIDを持つ、各行の最初の列に、ある
- 。
Person
の行は、その人が誰にも従わない場合は1つの列しか持ちません。 [次] - - >(P2:人{ID:234})
(P1:::人{123 ID})
あなたのNeo4jモデルは次のように見えますあなたのCSVファイルの最初の列にIDを使用してPerson
ノードを作成し、その後
CREATE CONSTRAINT ON (p:Person) ASSERT p.id IS UNIQUE;
:まず、一意性制約を作成します。 MERGE
を使用して、LOAD
が列1に重複したIDが存在した場合に(一意性制約のために)中断しないようにします。IDが重複していないと確信できる場合は、代わりにCREATE
を使用することができます。メモリの不足を回避するために、我々は処理し、一度に10000行をコミット:
USING PERIODIC COMMIT 10000
LOAD CSV FROM "file:///varying.csv" AS row
MERGE (:Person {id: row[0]});
最後に、適切なPerson
ノード間の関係を作成します。このクエリではUSING INDEX
ヒントを使用して、Cypherが適切なPerson
ノードをすばやく見つけるためにインデックス(ユニーク制約によって自動的に作成される)を利用するよう促します。繰り返しますが、メモリ不足を避けるため、一度に10000行を処理します。
ありがとうございます。あなたの前提は大丈夫です!もう1つの質問ですが、私はneo4j-importツールのドキュメントを読んでいますが、neo4j-importツールを使用してさまざまな数のCSVをインポートする方法はまだ分かりません。例はすべて標準のCSVファイルに関するものです。 – callofdutyops
はい、neo4j-importを使用して列の数が異なるCSVファイルをインポートすることはできません。そのツールは各列のヘッダーに依存しているためです。 – cybersam
メソッドを使用してデータを正常にインポートできますが、処理が遅いです。約800万のノードと7億のノード間の関係があります。それは約24時間かかりますが、停止していません。私のラップトップのCPUはIntel Core i5で、SSDと8Gメモリを装備しています。それは本当に高性能のマシンではありませんが、進歩は遅すぎると思います。 – callofdutyops