Neo4j Cypher - 使用LOAD CSV创建节点并设置标签

10

我正在尝试使用LOAD CSV创建节点,将标签设置为来自CSV的值。这是可能的吗?我正在尝试类似以下的东西:

LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (x:line.label)

...但我得到了一个无效语法错误。有没有什么方法可以解决这个问题?

5个回答

9

bicpence,

首先,使用Java批量导入应用程序很容易实现,编写起来也不难。请参考此批量插入示例。您可以使用opencsv读取您的CSV文件。

如果您更愿意使用Cypher,并且您有一个有限的标签集合要处理,那么您可以尝试这样做:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS LINE
CREATE (n:load {lab:line.label, prop:line.prop});

CREATE INDEX ON :load(lab);

MATCH (n:load {lab:'label1'})
SET n:label1
REMOVE n:load
REMOVE n.lab;

MATCH (n:load {lab:'label2'})
SET n:label2
REMOVE n:load
REMOVE n.lab;

恩惠与平安,

吉姆


3
很遗憾,参数标签不被支持。 Chris

2
你可以采用一种折中的方法——创建所有节点,然后对它们进行筛选,创建所需的节点,最后删除旧节点。请保留HTML标记。
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (tmp:line[1])
WITH tmp
CREATE (x:Person {name: labels(tmp)[0]})
WITH tmp
REMOVE tmp

将以下文本粘贴到 http://console.neo4j.org 上查看示例:
LOAD CSV 
WITH HEADERS FROM "http://docs.neo4j.org/chunked/2.1.2/csv/import/persons.csv" AS csvLine
CREATE (p:tmp { id: toInt(csvLine.id), name: csvLine.name })
WITH p
CREATE (pp:Person { name: labels(p)[0]})
WITH p, pp
DELETE p
RETURN pp

这个设置是如何使用CSV中的数据来设置节点的标签的?据我所理解,这只是从CSV中添加一个属性,而不是标签本身 - 所有创建的节点都具有“Person”标签。 - Lucas Lima
1
@LucasLima 是的,它只是应该创建一个属性,而不是标签。在撰写本答案时,neo4j中的节点标记尚不可用(它是在2版中引入的),只有关系标签。这就是为什么我回答时提供了解决方法的原因。当然,今天你可以直接给节点贴上标签了。 - ulkas

0
我查看了一些类似的问题并得出结论:处理“LOAD CSV”无法轻松添加动态标签的这些复杂挫败感的好方法是使用您最喜欢的编程语言读取CSV行,并生成Cypher语句的文本输出文件,以生成所需的Neo4j节点/边缘结构。然后,您还可以直接编辑文本文件,以进一步自定义命令。
就我个人而言,由于我最熟悉Java,所以我使用了Java。我将CSV的每一行读入自定义对象中,该对象代表CSV文件中的一行。然后,我将反映所需Cypher语句的行打印到文件中。然后,我只需要剪切并粘贴这些命令到Neo4j浏览器命令行即可。
这样,您可以按照自己的方式构建命令,并完全避免使用Cypher的“LOAD CSV”命令的限制。

使用代码生成工作查询确实更容易,但会产生更多的内存开销、更多需要维护的代码,并且会错过使用中的数据库(在这种情况下是neo4j)的功能。 - Nexaspx

0

Jim Biard的回答 可以正常运行,但使用了PERIODIC COMMIT,虽然有用但已过时。

我能够编写一个查询:

  1. 从CSV加载数据
  2. 使用多个事务
  3. 创建节点
  4. 追加标签
  5. 将适用于4.5及以后的版本
:auto LOAD CSV WITH HEADERS FROM 'file:///nodes_build_ont_small.csv' AS row
CALL { 
        with row
        call apoc.create.node([row.label], {id: row.id})
        yield node
        return null
} IN TRANSACTIONS of 100 rows 
return null

看起来apoc过程比命令本身更有用,因为使用CREATE命令无法实现这一点(至少在我的尝试中是如此)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接