3

我正在使用 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"

但是,我在使用自定义 ID 时遇到了困难。Neo4j 不导入它们。

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

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

LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
RETURN row

当我选择任何列时也是如此,除了 PRODUCT_ID

LOAD CSV WITH HEADERS FROM 'file:///path/to/product.csv' AS row
RETURN row.PRODUCT_DESC

当我RETURN row.PRODUCT_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 丢失了。我需要将这个 CSV 文件与其他文件匹配的 ID,但我被困住了,希望能得到一些帮助。我没有在文档中看到关于 ID 列的任何限制。

当我将PRODUCT_ID列从第一个位置移开时,它需要注意的是忽略第一个列。因此,如果我制作PRODUCT_ID最后一列,PRODUCT_DESC则为空。是否需要将行号作为 CSV 中的第一列?似乎很奇怪。

有什么建议么?

4

5 回答 5

1

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

如果您删除它(在文本中不可见),它应该可以工作。

于 2015-08-06T20:23:13.737 回答
1

会不会是这个问题?

http://www.markhneedham.com/blog/2014/10/18/neo4j-load-csv-the-sneaky-null-character/

基本上NULL,他的 CSV 中有字符,导致数据读取不正确。

于 2015-08-05T13:59:18.620 回答
1

不知道这里有什么问题。我将数据复制到一个 junk.txt 文件中,并且能够毫无问题地导入。

LOAD CSV WITH HEADERS FROM 'file://junk.txt' as csvLine FIELDTERMINATOR ',' return csvLine;

注意:同样没有 FIELDTERMINATOR。

最初的问题是关于产品 ID 的。

LOAD CSV WITH HEADERS FROM 'file://junk.txt' as csvLine FIELDTERMINATOR ',' return csvLine.PRODUCT_ID;

于 2015-08-06T12:33:46.507 回答
0

So, what worked in the end? I got the files from a Linux system, tried to import them in Windows with the line endings properly modified, but that did not work. Instead, I had to save the files as ANSI instead of UTF-8. I would appreciate it if anyone can tell my what that matters because the doc clearly states that files should be UTF-8 not ANSI, not even on Windows. Anyway, it now works.

于 2015-08-06T05:43:10.300 回答
0

我不太确定问题出在哪里,但我有一些建议可以尝试。您可以使用反引号将字段名称括起来,如下所示:

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...
于 2015-08-05T11:33:50.663 回答