Neo4j: Зареждане на CSV файл, комбиниран с функция за подниз

Опитвам се да заредя *.csv файл в neo4j и в същия оператор за зареждане да разделя реда (който няма разделители, но има зададено местоположение за данните, от които трябва да създам възли). Искам да използвам функцията substring, но не мога да разбера как да я накарам да работи. Данните се четат като един ред:

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

Опитах да използвам следния код:

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);

Търся да получа 4 възела: година, темп (абсолютна стойност), квалификатор (положителен или отрицателен символ) и число за качество. Индексите за това къде се намират данните в низа трябва да са точни.


person ikenmike    schedule 11.12.2017    source източник


Отговори (1)


Първо, нека се опитаме да направим правилните индекси и типове. За да преобразуваме числови поднизове в цели числа, ние използваме toInteger функция:

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

Това дава:

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

Ако резултатите изглеждат добре, добавете обратно LOAD CSV MERGE клаузите. Две неща:

  • Не мисля, че има смисъл да се използва WITH HEADERS, тъй като заглавките са безполезни в този случай. Просто заредете реда и използвайте row[0] като line за разделяне.
  • Възможно е да опростите MERGE чрез комбиниране на вашите първи две MERGE клаузи с CREATE клауза.

Така че кодът на зареждащия механизъм е следният:

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})
person Gabor Szarnyas    schedule 11.12.2017