2017-12-11 14 views
1

* .csvファイルをneo4jにロードしようとしていますが、同じロードステートメントで行を分割します(デリミタはありませんが、ノードを作成します)。私は部分文字列関数を使用したい、私はそれを動作させる方法を把握することはできません。私が取得しているよNeo4j:CSVファイルを部分文字列関数と組み合わせてロードする

LOAD CSV WITH HEADERS FROM "file:/c:/itw/Ltemps.csv" AS line 
WITH line 
WHERE line.year IS split((substring(line, 15, 19))) and line.temp IS split((substring(line, 88, 92))) and line.qlfr IS split((substring(line, 87, 88))) and line.qual IS split((substring(line, 92, 93))) 
MERGE (y:Year {year:line.year}) 
MERGE (t:Temp {temp:line.temp}) 
MERGE (f:Qlfr {qlfr:line.qlfr}) 
MERGE (q:Qual {qual:line.qual}) 
CREATE (y)-[r:HAS_TEMP]->(t); 

:私は、次のコードを使用してみましたが

0067011990999991958051507004 + 68750 + 023550FM-12 + 038299999V0203301N00671220001CN9999999N9 + 00001 + 99999999999

:データは、単一のラインとして読み込みます4ノード:年、温度(絶対値)、修飾子(正または負の記号)、および品質番号。文字列内のデータのインデックスは正確でなければなりません。

答えて

1

まず、インデックスとタイプを正しく取得しようとします。その結果、良好な外観は、バックLOAD CSVMERGE句を追加した場合

╒══════╤══════╤══════╤══════╕ 
│"year"│"temp"│"qlfr"│"qual"│ 
╞══════╪══════╪══════╪══════╡ 
│1958 │0  │"+" │1  │ 
└──────┴──────┴──────┴──────┘ 

WITH '0067011990999991958051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999' AS line 
RETURN 
    toInteger(substring(line, 15, 4)) AS year, 
    toInteger(substring(line, 88, 2)) AS temp, 
    substring(line, 87, 1) AS qlfr, 
    toInteger(substring(line, 92, 1)) AS qual 

これが与える:整数に数値の部分文字列を変換するために、我々はtoInteger関数を使用します。 2つのもの:

  • WITH HEADERSを使用することは意味がありません。この場合、ヘッダーは役に立たないためです。行をロードして、row[0]を分割するためにlineとして使用してください。
  • 最初の2つのMERGE句とCREATE句を組み合わせて、MERGEを簡略化することができます。

だから、ローダーコードは以下の通りです:

LOAD CSV FROM 'file:/c:/itw/Ltemps.csv' AS row 
WITH row[0] AS line 
WITH 
    toInteger(substring(line, 15, 4)) AS year, 
    toInteger(substring(line, 88, 2)) AS temp, 
    substring(line, 87, 1) AS qlfr, 
    toInteger(substring(line, 92, 1)) AS qual 
MERGE (y:Year {year: year})-[r:HAS_TEMP]->(t:Temp {temp: temp}) 
MERGE (f:Qlfr {qlfr: qlfr}) 
MERGE (q:Qual {qual: qual}) 
関連する問題