我正在调用一个嵌套的 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})"
^
最佳答案
正如错误消息所示,Cypher 不喜欢您以
CALL
结束查询。子句(除非它是查询中的唯一子句)。您只需添加RETURN
即可解决此问题子句放在查询末尾,即使您不关心结果。Cypher 还希望您
YIELD
至少有一个来自CALL
的返回值ed 程序,即使您不关心它。您的
'CALL apoc.load.jdbc(url, query) YIELD row'
字符串不会自动使用您的url
和query
变量。您可以使用parameters来解决这个问题.
此示例解决了所有 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
关于neo4j - 嵌套 apoc 迭代与 apoc load jdbc 返回 "cannot conclude with CALL"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58562226/