Использование Case для создания узла при использовании Load CSV - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь создать два разных узла и отношения на основе определенных данных в CSV.

Я хочу иметь возможность создать узел, как показано в скрипте ниже. Где, если «AGGREGATE» находится в указанном столбце c, тогда создайте узел на основе другого столбца.

Если «AGGREGATE» отсутствует в этом столбце, не создавайте узел.

:auto USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS FROM 'file:///TestFull.csv' AS test

WITH test WHERE test.equip_id IS NOT NULL
WITH test, SPLIT(test.equip_id, '/') as eid,
(CASE test.path_bandwidth
WHEN 'AGGREGATE' THEN test.path_leg_name
END) as agg
MERGE (logip:LogiP {logiKey: eid[0] + '.' + agg})

Получение ошибки: "Невозможно объединить узел, используя нулевые значения свойств для logiKey "

Если я изменю оператор NOT NULL на test.path_leg_name или path_bandwidth, я получу ту же ошибку. Я не вижу ни одного места, там может быть нулевое значение. Если я удаляю строку NOT NULL, то я все равно получаю ту же ошибку.

Любые предложения, как я могу это сделать?

После того, как я заставлю это работать, мне нужно сделать отношения основаны на этом.

(p:Port) - [:SUB_EQUIP] -> (l:LogiP) 

, если LogiP не был создан из последнего оператора, то вместо этого автоматически создается это отношение:

(p:Port) - [:SUB_EQUIP] -> (s:SubPort)

Я не смог ничего найти чтобы помочь мне с этой частью.

Все предложения помогают!

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

На самом деле вам не нужно использовать выражение CASE:

:auto USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS FROM 'file:///TestFull.csv' AS test
WITH test
WHERE EXISTS(test.equip_id) AND test.path_bandwidth = 'AGGREGATE'
MERGE (logip:LogiP {logiKey: SPLIT(test.equip_id, '/')[0] + '.' + test.path_leg_name})

Кроме того, если вам нужно разделить path_leg_name и equip_id таким же образом:

:auto USING PERIODIC COMMIT 5000
LOAD CSV WITH HEADERS FROM 'file:///TestFull.csv' AS test
WITH test
WHERE EXISTS(test.equip_id) AND test.path_bandwidth = 'AGGREGATE'
MERGE (logip:LogiP {logiKey: SPLIT(test.equip_id, '/')[0] + '.' + SPLIT(test.path_leg_name, '/')[0]})
0 голосов
/ 14 марта 2020

Если у вас нет условия ELSE в вашем операторе CASE, когда значение не равно AGGREGATE, оно возвращает NULL для agg.

(CASE granite.path_bandwidth
    WHEN 'AGGREGATE' THEN granite.path_leg_name
    ELSE ''
END) as agg

Это исправит ошибка, но он все равно создаст узел, но со значением eid[0] + '.'. Чтобы создать узлы только для «AGGREGATE», попробуйте добавить оператор WHERE

(CASE granite.path_bandwidth
    WHEN 'AGGREGATE' THEN granite.path_leg_name
END) as agg
WHERE agg IS NOT NULL
...