Ошибка при загрузке данных в neo4j в операторе case в запросе на шифрование - PullRequest
1 голос
/ 25 февраля 2020

попробуйте загрузить CSV данные с оператором регистра в запросе, но появляется следующая ошибка:

шифр:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///test.csv' as line
MATCH(a:test_t{tid:line.pid})
CASE
  WHEN line.key !='NA' THEN
    WITH split(line.key,",") as name
    UNWIND name as x
    MERGE(k:test_key{key_term:toLower(x)})
    MERGE(a)-[:contains]->(k)
END

Ошибка

Neo.ClientError.Statement.SyntaxError: Неверный ввод 'S': ожидается 'l / L' (строка 5, столбец 3 (смещение: 137)) "CASE"

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Предложение CASE не поддерживает встраивание других предложений Cypher (но может вызывать функции). На самом деле, предложение CASE на самом деле не требуется для вашего варианта использования.

Этот запрос должен работать (:auto в начале необходим в neo4j 4.0 +):

:auto USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///test.csv' as line FIELDTERMINATOR ';'
WITH line
WHERE line.key <> 'NA'
MATCH (a:test_t {tid: line.pid})
UNWIND split(line.key, ',') as x
MERGE (k:test_key {key_term: TOLOWER(x)})
MERGE (a)-[:contains]->(k)

Этот запрос отфильтровывает все нежелательные line с, как только они получены из файла. Хорошей практикой является сокращение количества строк данных, с которыми нужно работать как можно раньше.

Кроме того, у вас есть вторая проблема. Ваш файл данных не может использовать запятую как в качестве (по умолчанию) терминатора поля, так и в качестве разделителя между значениями x.

Чтобы устранить эту неоднозначность, в приведенном выше запросе была выбрана опция FIELDTERMINATOR ';', чтобы указать что ";" символ будет использоваться как терминатор поля. Пример файла данных будет выглядеть следующим образом:

pid;key
123;NA
234;Foo,Bar
345;Bar,Baz
456;NA
567;Baz
0 голосов
/ 25 февраля 2020

Вы используете CASE неправильно. Вы не можете иметь предложения обновления внутри оператора CASE. Вместо этого вы можете использовать предложение WHERE для фильтрации строк файла. Например, добавление WHERE line.key != 'NA' при обработке файла перед переходом на обновление будет работать. Нечто подобное должно отвечать всем требованиям.

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///test.csv' as line
MATCH (a:test_t {tid: line.pid})
WITH line
WHERE line.key <> 'NA' 
WITH split(line.key, ",") as name
UNWIND name as x
MERGE (k:test_key {key_term: toLower(x)})
MERGE (a)-[:contains]->(k)

Похоже, из вашей логики c вы могли бы даже поднять тест выше MATCH. Так что это может быть лучше (меньше ненужных совпадений).

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///test.csv' as line
WITH line
WHERE line.key <> 'NA' 
MATCH (a:test_t {tid: line.pid})
WITH split(line.key, ",") as name
UNWIND name as x
MERGE (k:test_key {key_term: toLower(x)})
MERGE (a)-[:contains]->(k)
...