neo4j - 将数据导出到 SQL/MS 通过 apoc.load.jdbcUpdate 访问

neo4j - Exporting data to SQL/MS Access via apoc.load.jdbcUpdate

我正在努力从要使用 apoc.load.jdbcUpdate 函数使用的键(n)结果列表中动态构建 CREATE 或 ALTER 语句。对于简单的 CREATE 和 INSERT 语句的 CREATE 和 INSERT 语句,我有这个函数工作得很好。

我面临的挑战是需要导出大量密钥列表 (n) 以便在 SQL/MS Access 中构建 table。有没有办法“循环”通过这个列表或集合来动态构建这个语句?这之后将是一个类似的动态构建的 INSERT 语句来插入记录本身。

我的实际数据由几个neo4j查询组成,以获取各个节点的键(n)并将它们组合成一个长列表。每次导出可能有 50-200 列,每列都是唯一的或不同的,每次导出只有大约 10 列。目前,我可以将每一列 TEXT 12,但接下来的步骤将为每个 Keys(n) 获取关联的 Type(n)。

我尝试的另一个选项是尝试更改现有的“模板”table,但是“循环遍历列”的相同问题仍然存在。

非常感谢!

:param exportUrl => 'jdbc:ucanaccess:///artifacts/export/sample.accdb'

WITH ['colA', 'colB', 'colC', 'colD', 'colE', 'colF', 'colG', 'colH', 'colI', 'colJ'] AS listCOLS
UNWIND listCOLS as columnNAMES
WITH columnNAMES,
 'CREATE Table TBL_ATTR ([colA] TEXT(12), [colB] Double, [colC] TEXT(36), [colD] TEXT(38), [colE] Integer, [colF] TEXT(24), ' +
     '[colG] TEXT(20), [colH] TEXT(2), [colI] TEXT(4), [colJ] TEXT(50))' as statement
CALL apoc.load.jdbcUpdate($exportUrl, statement) YIELD row
return COUNT(row);         

上面的代码似乎正确 运行 并创建了 table 但是我确实收到了以下异常

Failed to invoke procedure `apoc.load.jdbcUpdate`: Caused by: org.hsqldb.HsqlException: object name already exists: TBL_NEW```

看来我现在可以使用 CREATE 函数,然后为行中的每个元素添加 ALTER TABLE 语句(在 UNWIND 之后。)

实际上我将列表展开为 table 格式,然后是带有一些默认列的 apoc 函数 运行s table,然后是 运行 ALTER table命令为每一列进行编辑,但它也允许我修改每一行的数据类型(在下面的示例中)

运行 apoc.load.jdbcUpdate() 函数的每一行似乎都是多余的,它允许我进行一些控制并且不会真正影响速度。 (为更大的数据集在 54 毫秒内创建约 100 列,这看起来还不错)

:param exportUrl => 'jdbc:ucanaccess:///artifacts/export/sample.accdb'

WITH ['colA', 'colB', 'colC', 'colD', 'colE', 'colF', 'colG', 'colH', 'colI', 'colJ'] AS listCOLS
UNWIND listCOLS as columnNAMES
WITH columnNAMES,
 'CREATE Table TBL_ATTR ([DEFAULT] TEXT(12))' as statement
CALL apoc.load.jdbcUpdate($exportUrl, statement) YIELD row
WITH columnNAMES,
CASE columnNAMES  //modify data types for various data
     WHEN "colB" THEN 'ALTER TABLE TBL_ATTR ADD COLUMN ' + columnNAMES +  ' DOUBLE'
     WHEN "colC" THEN 'ALTER TABLE TBL_ATTR ADD COLUMN ' + columnNAMES +  ' INTEGER'
     WHEN "colH" THEN 'ALTER TABLE TBL_ATTR ADD COLUMN ' + columnNAMES +  ' DATE'
     WHEN "colJ" THEN 'ALTER TABLE TBL_ATTR ADD COLUMN ' + columnNAMES +  ' TEXT(12)'
ElSE 'ALTER TABLE TBL_ATTR ADD COLUMN ' + columnNAMES + ' TEXT(25)'
END as statement
WITH columnNAMES, statement
CALL apoc.load.jdbcUpdate($exportUrl, statement) YIELD row
return count(row);

虽然该函数成功执行并且我可以看到导出文件中正确反映的列,但我确实收到了一个错误,所以不确定是什么引发了异常。

Failed to invoke procedure `apoc.load.jdbcUpdate`: Caused by: org.hsqldb.HsqlException: object name already exists: TBL_ATTR