見出し画像

Neo4j GraphDBブートキャンプ完全版: APOC② (セクション42/49)

  • APOCライブラリを使用することで、URLやローカルファイルシステムからCSVデータを簡単かつ柔軟にNeo4jにロードできる。

  • CSVデータに基づいてノード間のリレーションシップを効率的に作成し、共通の識別子でノードをマッチングできる。

  • 大規模なデータセットの場合、APOCのバッチ処理機能を活用して、メモリ使用量を最適化し、パフォーマンスを向上させることができる。

2024年版のComplete Neo4j GraphDB Bootcamp のセクション42では、強力なAPOC(Awesome Procedures on Cypher)ライブラリを使用して、CSVデータをNeo4jグラフデータベースに効率的にロードする方法を探っています。このセクションでは、URLやローカルファイルシステムからのCSVファイルのロード、ヘッダーの処理、ノード間のリレーションシップの作成、最適化されたパフォーマンスのためのバッチ操作の実行など、さまざまなシナリオを扱っています。

CSVデータのロードにAPOCを使用する主な利点の1つは、その単純さと柔軟性です。わずか1行のCypherコードで、URLからCSVファイルをNeo4jデータベースにロードできます:

CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/customers.csv')
YIELD map AS row
CREATE (n:Customer {customerID: row.customerID, customerName: row.companyName, country: row.country, phone: row.phone})
RETURN n

このクエリは、`apoc.load.csv`関数を使用してCSVファイルをロードし、各行をマップとして生成し、CSVの列から抽出されたプロパティを持つ`Customer`ノードを作成し、新しく作成されたノードを返します。

APOCは、ローカルファイルシステムからのCSVファイルのロードもサポートしています。Neo4jのインポートディレクトリを基準にファイルパスを指定することで、ローカルのCSVデータを簡単にロードできます:

CALL apoc.load.csv('file:///student.csv')
YIELD map AS row
CREATE (n:Student {firstName: row.FIRST_NAME, lastName: row.LAST_NAME, score: toInteger(row.SCORE), subject: row.SUBJECT})
RETURN n

CSVファイルにヘッダー行がない場合、APOCはそのシナリオを処理するためのオプションを提供します。`{header: false}`を設定することで、最初の行を通常のデータとして扱い、インデックス位置を使用して列の値にアクセスできます:

CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/customers.csv', {header: false})
YIELD list AS row
CREATE (n:Customer {id: row[0], name: row[1]})
RETURN n

CSVデータに基づいてノード間のリレーションシップを作成することは、APOCのもう1つの強力な機能です。複数のCSVファイルをロードし、共通の識別子に基づいてノードをマッチングすることで、効率的にリレーションシップを確立できます:

CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/customers.csv') YIELD map AS row
MERGE (c:Customer {customerID: row.customerID})
WITH c
CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/orders.csv') YIELD map AS row
WITH c, row WHERE c.customerID = row.customerID
MERGE (o:Order {orderID: row.orderID})
MERGE (c)-[:PLACED]->(o)
RETURN c, o

このクエリは、最初に顧客データをロードして`Customer`ノードを作成し、次に注文データをロードして`Order`ノードを作成し、最後に一致する`customerID`に基づいて顧客とそれぞれの注文の間に`PLACED`リレーションシップを確立します。

大規模なデータセットの場合、APOCはメモリ使用量を最適化し、パフォーマンスを向上させるためのバッチ処理機能を提供します。`apoc.periodic.iterate`を活用することで、データをバッチで処理し、操作を並列化できます:

CALL apoc.periodic.iterate(
  "CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/customers.csv') YIELD map AS row RETURN row",
  "MERGE (c:Customer {customerID: row.customerID})
   WITH c
   CALL apoc.load.csv('https://raw.githubusercontent.com/neo4j-contrib/northwind-neo4j/master/data/orders.csv') YIELD map AS orderRow
   WITH c, orderRow WHERE c.customerID = orderRow.customerID  
   MERGE (o:Order {orderID: orderRow.orderID, customerID: orderRow.customerID})
   MERGE (c)-[:PLACED]->(o)",
  {batchSize: 1000, parallel: true, iterateList: true}
) YIELD batches, total RETURN batches, total

このクエリは、`apoc.periodic.iterate`を使用して、CSVデータを1000行のバッチで処理し、`Customer`ノードと`Order`ノードをマージし、それらの間に`PLACED`リレーションシップを作成します。`parallel`と`iterateList`のオプションは、並列処理を有効にし、CSVデータの反復を最適化します。

APOCを使用したCSVデータのロードのこれらのテクニックを習得することで、さまざまなソースからのデータを効率的にNeo4jグラフデータベースに取り込み、意味のあるリレーションシップを作成し、最適なパフォーマンスのためにバッチ処理を活用できます。APOCは、Neo4jでのデータ統合タスクのための強力で柔軟なツールセットを提供します。

より高度な機能とユースケースについては、APOCの公式ドキュメントを参照してください。ハッピーグラフビルディング!

「超本当にドラゴン」へ

この記事が気に入ったらサポートをしてみませんか?