2015-06-23 3 views
0

В Neo4j существует простой способ комбинировать инструкции WHERE, чтобы избежать повторного чтения одного и того же файла при одновременном игнорировании значений NULL.Neo4j/Cypher Условные выражения для загрузки данных

Например, можно пройти через CSV один раз, и сделать что-то вроде следующего

LOAD CSV WITH HEADERS from "file" as line 
WITH line, line.FirstNodeID as NodeOneID 
WHERE NodeOneID IS NOT NULL 
WITH NodeOneID 
CREATE (n1:NodeOne { ID : NodeOneID }) 
WITH line, line.SecondNodeID as NodeTwoID 
WHERE NodeTwoID IS NOT NULL 
WITH NodeTwoID 
CREATE (n2:NodeTwo { ID : NodeTwoID}) 
; 

В настоящее время, сценарий НАГРУЗКИ выйдет, если NodeOneID равно нулю, даже если NodeTwoID НЕ ноль. Как я могу построить простое условие if-else, в котором сценарий LOAD загрузит соответствующие узлы, если NodeOneID или NodeTwoID не являются нулевыми?

ОБНОВЛЕНИЕ: Только что видел CASE. Собираюсь проверить это быстро.

ответ

3

Я думаю, вы могли бы сделать что-то подобное для каждой строки. Если значение не равно null, поместите его в коллекцию из одного. Тогда, если в коллекциях есть элемент, узел (и) создается /, и если они пусты, то не создаются узлы. Если они оба имеют значения, то оба узла создаются.

LOAD CSV WITH HEADERS from "file" as line 
WITH line 
, case when line.FirstNodeID is not null then [line] else [] end as NodeOneID 
, case when line.SecondNodeID is not null then [line] else [] end as NodeTwoID 
foreach(x in NodeOneID | CREATE (n1:NodeOne { ID : x.FirstNodeID })) 
foreach(x in NodeTwoID | CREATE (n2:NodeTwo { ID : x.SecondNodeID })) 
+0

Насколько эффективна память? Не будет ли хранить каждую строку в отдельных списках? Таким образом, для крупных импортных товаров это может быть разрушительным? – NumenorForLife

+1

Это прекрасно. –

1

Это работает для вас?

LOAD CSV WITH HEADERS from "file" as line 
foreach(x in COALESCE(line.FirstNodeID) | CREATE (:NodeOne { ID : x })) 
foreach(x in COALESCE(line.SecondNodeID) | CREATE (:NodeTwo { ID : x })); 
+1

Я думаю, это выглядит красиво и аккуратно; Я думал об этом. –