我在使用Cypher LOAD CSV
命令将大量数据导入Neo4j实例时遇到问题。我正在尝试使用唯一的user_id加载大约253k个用户记录。我的第一步是在tje标签上添加一个唯一约束,以确保用户只运行一次
CREATE CONSTRAINT ON (b:User) ASSERT b.user_id IS UNIQUE;
然后我尝试使用定期提交运行LOAD CSV来提取数据。
此查询失败,因此我尝试在设置
之前合并用户记录USING PERIODIC COMMIT 1000
load csv with headers from "file:///home/data/uk_users.csv" as line
match (t:Territory{territory:"uk"})
merge (p:User {user_id:toInt(line.user_id)})-[:REGISTERED_TO]->(t)
set p.created=toInt(line.created), p.completed=toInt(line.completed);
修改定期提交值没有任何区别,返回相同的错误。
USING PERIODIC COMMIT 1000
load csv with headers from "file:///home/data/uk_buddies.csv" as line
match (t:Territory{territory:"uk"})
merge (p:User {user_id:toInt(line.user_id), created:toInt(line.created), completed:toInt(line.completed)})-[:REGISTERED_TO]->(t);
我收到以下错误:
LoadCsvStatusWrapCypherException: Node 9752 already exists with label Person and property "hpcm_uk_buddy_id"=[2446] (Failure when processing URL 'file:/home/data/uk_buddies.csv' on line 253316 (which is the last row in the file). Possibly the last row committed during import is line 253299. Note that this information might not be accurate.)
这些数字似乎大致相符,CSV文件总共包含253315条记录。定期提交似乎也没有生效,节点数只返回5446行。
neo4j-sh (?)$ match (n) return count(n);
+----------+
| count(n) |
+----------+
| 5446 |
+----------+
1 row
768 ms
如果此ID在CSV文件中只有大约5000行,我可以理解错误的节点数。但是,我可以使用任何技术或命令来成功导入此内容吗?
答案 0 :(得分:1)
我认为你是MERGE
常见错误的受害者。相对于密码查询,严重来说,这就像我关于密码常见问题的十大常见问题解答一样。看到你这样做:
USING PERIODIC COMMIT 1000
load csv with headers from "file:///home/data/uk_buddies.csv" as line
match (t:Territory{territory:"uk"})
merge (p:User {user_id:toInt(line.user_id), created:toInt(line.created), completed:toInt(line.completed)})-[:REGISTERED_TO]->(t);
最后一次合并的方式merge works与整个关系匹配,而不仅仅是在用户节点上。所以,您可能正在创建不应该存在的重复用户。运行此合并时,即使具有这些确切属性的用户已存在,与t
节点的关系也不存在,因此它尝试创建具有这些属性的新用户节点,以连接到{{1这不是你想要的。
解决方案是单独合并用户,然后单独合并关系路径,如下所示:
t
注意两个合并在最后。一个人只创造用户。如果用户已经存在,则不会尝试创建副本,并且您希望您的约束可以正常(假设没有两个用户具有相同的user_id,但创建的值不同)。在您仅合并用户之后,然后合并关系。
第二个查询的最终结果是相同的,但不应该创建重复的用户。