Вложенные apoc-итерации с загрузкой apoc jdbc возвращает сообщение «невозможно завершить с помощью CALL» - PullRequest
0 голосов
/ 25 октября 2019

Я вызываю вложенную процедуру apoc для итерации загрузки данных через драйвер jdbc из mysql для загрузки в neo4j. Заявление выглядит следующим образом:

WITH 'jdbc:mysql://x.x.x.x:3306/schema?user=x&password=x' AS url, 'select * from table' AS query 
CALL apoc.periodic.iterate('CALL apoc.load.jdbc(url, query) YIELD row', 'MERGE (e:MYNODE {id:row.id}) SET e.id = row.id', {batchSize:1000, parallel:false})

Получение следующего результата:

Neo.ClientError.Statement.SyntaxError: Query cannot conclude with CALL (must be RETURN or an update clause) (line 2, column 1 (offset: 123))
"CALL apoc.periodic.iterate('CALL apoc.load.jdbc(url, query) YIELD row', 'MERGE (e:MYNODE {id:row.id}) SET e.id = row.id', {batchSize:1000, parallel:false})"
 ^

1 Ответ

0 голосов
/ 25 октября 2019
  1. Как говорится в сообщении об ошибке, Cypher не нравится, когда вы заканчиваете запрос предложением CALL (если только это не единственное предложение в запросе). Вы можете решить эту проблему, просто добавив в конец запроса предложение RETURN, даже если вас не волнует результат.

  2. Сайфер также хочет, чтобы вы YIELDхотя бы одно из возвращенных значений из CALL ed процедуры, даже если вам это не важно.

  3. Ваша строка 'CALL apoc.load.jdbc(url, query) YIELD row' не будет автоматически использовать вашу url и query переменные. Вы можете решить это, используя параметры .

В этом примере решаются все 3 проблемы:

WITH
  'jdbc:mysql://x.x.x.x:3306/schema?user=x&password=x' AS url,
  'select * from table' AS query 
CALL apoc.periodic.iterate(
  'CALL apoc.load.jdbc($url, $query) YIELD row',
  'MERGE (e:MYNODE {id:row.id}) SET e.id = row.id',
  {batchSize:1000, parallel:false, params:{url: url, query: query}}) YIELD batches
RETURN batches
...