我有简单的大型CSV文件,没有标题,结构如下:
name1, name2
name3, name4
name2, name4
...
我试图将它全部导入Neo4J并同时创建关系。首先,我添加了约束CREATE CONSTRAINT ON (u:User) ASSERT u.name IS UNIQUE
,然后我跑了:
USING PERIODIC COMMIT
LOAD CSV FROM '${file}' AS line
WITH line LIMIT 50000
MERGE (u:User {name: line[0]})-[:connected_to]->(q:User {name: line[1]})
我得到的图表只是连接对。我找不到具有多个关系的单个节点(即使许多节点在左右列中多次出现)。此外,我希望看到一些集群。
显然,我在插入时出错了。我假设我可以运行两次文件并创建所有节点然后创建所有关系,但我觉得我错过了一些简单的东西,可以在一次操作中完成所有这些。
更正:其中一个属性名称为' number' - 他们都是' name'。
答案 0 :(得分:2)
您需要先单独创建条目。 MERGE
将确保创建整个模式。因此,您只能获得与文件的每一行匹配的对。
如果您MERGE
首先在该行中添加了每个名称,然后MERGE
之后的关系,您将获得所需的连接图。请注意,MERGE的关系是无向的。这将确保在两个特定节点之间只创建一个关系,而不管文件中的顺序或出现次数。
USING PERIODIC COMMIT
LOAD CSV FROM '${file}' AS line
WITH line LIMIT 50000
MERGE (u:User {name: trim(line[0])} )
MERGE (q:User {name: trim(line[1])} )
MERGE (u)-[:connected_to]-(q)
如果包含与此类似的条目的数据以不同的顺序重复并希望在两个方向上创建关系,那么您可以使MERGE定向关系
...
name1, name2
name2, name1
...
如以下示例
USING PERIODIC COMMIT
LOAD CSV FROM '${file}' AS line
WITH line LIMIT 50000
MERGE (u:User {name: trim(line[0])} )
MERGE (q:User {name: trim(line[1])} )
MERGE (u)-[:connected_to]->(q)