Neo4j使用自定义ID加载CSV

Neo4j使用自定义ID加载CSV,csv,neo4j,cypher,load-csv,Csv,Neo4j,Cypher,Load Csv,我正在使用Neo4j 2.2.3,并尝试使用Cypher的LOAD CSV导入一个CSV文件,如下所示: PRODUCT_ID,PRODUCT_DESC,PRODUCT_TYPE 99,"A","X" 999,"B","X" 9999,"C","Y" 99999,"D","Y" LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row CREATE (p:Product { id: toInt(row.`PRODUCT_ID

我正在使用Neo4j 2.2.3,并尝试使用Cypher的LOAD CSV导入一个CSV文件,如下所示:

PRODUCT_ID,PRODUCT_DESC,PRODUCT_TYPE
99,"A","X"
999,"B","X"
9999,"C","Y"
99999,"D","Y"
LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
CREATE (p:Product { id: toInt(row.`PRODUCT_ID`),
                    name: row.`PRODUCT_DESC`,
                    type: row.`PRODUCT_TYPE` })
"PRODUCT_ID","PRODUCT_DESC","PRODUCT_TYPE"
但是,我在使用自定义ID时遇到困难。Neo4j不会导入它们

PRODUCT\u ID
列是一个来自不同系统(我无法控制)的唯一ID,但可以说,它不是一个行号。需要
产品ID
来匹配其他文件中的数据

查看该文件时,我会看到所有字段:

LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
RETURN row
当我选择除
PRODUCT\u ID
之外的任何列时也是如此:

LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
RETURN row.PRODUCT_DESC
当我使用
返回row.PRODUCT\u ID
时,会得到一个空值表

同样,这也不起作用:

LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
CREATE (p:Product { id: toInt(row.PRODUCT_ID),
                    name: row.PRODUCT_DESC,
                    type: row.PRODUCT_TYPE })
我得到了带有描述和类型的产品,但是ID丢失了。我需要ID来匹配这个CSV文件和其他文件,但我被卡住了,希望能得到一些帮助。我在文档中没有看到关于ID列的任何限制

当我将
PRODUCT\u ID
列从第一个位置移开时,它的工作原理是忽略第一列。因此,如果我将
PRODUCT\u ID
设为最后一列,
PRODUCT\u DESC
为空。是否需要将行号作为CSV中的第一列?看起来很奇怪


有什么建议吗?

我不太确定问题出在哪里,但我有一些建议可以尝试。您可以在字段名称周围加上反勾号,如下所示:

PRODUCT_ID,PRODUCT_DESC,PRODUCT_TYPE
99,"A","X"
999,"B","X"
9999,"C","Y"
99999,"D","Y"
LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
CREATE (p:Product { id: toInt(row.`PRODUCT_ID`),
                    name: row.`PRODUCT_DESC`,
                    type: row.`PRODUCT_TYPE` })
"PRODUCT_ID","PRODUCT_DESC","PRODUCT_TYPE"
您也可以尝试用引号将标题括起来,如下所示:

PRODUCT_ID,PRODUCT_DESC,PRODUCT_TYPE
99,"A","X"
999,"B","X"
9999,"C","Y"
99999,"D","Y"
LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
CREATE (p:Product { id: toInt(row.`PRODUCT_ID`),
                    name: row.`PRODUCT_DESC`,
                    type: row.`PRODUCT_TYPE` })
"PRODUCT_ID","PRODUCT_DESC","PRODUCT_TYPE"
当然,您可以删除标题并按索引进行操作,尽管这有点蹩脚。让它变得更好的一种方法是:

LOAD CSV FROM 'file:///path/to/product.csv' AS row
WITH
  toInt(row[0]) AS product_id,
  row[1] AS product_desc,
  row[2] AS product_type
CREATE // etc...

可能是这个问题吗


基本上,他的CSV中有
NULL
字符,这导致数据被错误读取。

那么,到底是什么起了作用?我从Linux系统中获取了这些文件,尝试在Windows中导入它们,并适当修改了行尾,但没有成功。相反,我不得不将文件保存为ANSI而不是UTF-8。如果有人能告诉我这有什么关系,我将不胜感激,因为文档明确规定文件应该是UTF-8而不是ANSI,甚至在Windows上也不应该。不管怎样,它现在起作用了。

不确定这里有什么问题。我将数据复制到一个junk.txt文件中,并且能够导入而不会出现问题

从加载带有标题的CSV'file://junk.txt“作为csvLine
字段终止符','
返回csvLine

注:也不带字段终止符

最初的问题是关于产品id的

从加载带有标题的CSV'file://junk.txt“作为csvLine
字段终止符','

返回csvLine.PRODUCT_ID

文件开头的两个字节可能是字节顺序标记(BOM)


如果删除了(在文本中是不可见的)该选项,则该选项应该会起作用。

问题在于第一列完全被忽略。在使用backticks运行示例之后,我得到了与之前相同的结果:
添加了4个标签,创建了4个节点,设置了8个属性,语句在2901毫秒内执行。
。属性是
name
type
。用双引号括住标题也没用。不。它甚至不能处理前面提到的四行模拟数据。我试着转换行尾,但也没用。有趣的是。。。顺便问一下,你是说ASCII码吗?我想知道是否有Neo4j没有想到的UTF-8字符,转换成ASCII后删除了它们……是的,就是这个。我正在阅读,并检查了这个没有提到BOM的地方。然而,这是一个常见的陷阱。我认为,手册本可以更清楚地说明这一点。