我有一个巨大的两列csv,几乎100,000,000行,格式为source_node和destination_node。另外,我的neo4j数据库中有一个图表,其中存在所有节点和一些关系。现在我正在尝试使用此csv构建所有剩余的关系。我可以使用两个查询中的任何一个来执行此操作,但我想知道哪个更有效和更正确。我的疑问是
load csv with headers from
"file:///C:/Users/neo4j_workspace/graph_db/import/dependency_filename.csv" as table
match (a:Job{name:table.sourcenodename})
with a, table
match (b:Job{name:table.destinationnodename})
with a, b
merge (a)-[:with]->(b)
OR
load csv with headers from
"file:///C:/Users/neo4j_workspace/graph_db/import/dependency_filename.csv" as table
match (a:Job{name:table.sourcenodename}) ,(b:Job{name:table.destinationnodename})
merge (a)-[:with]->(b)
答案 0 :(得分:1)
我更喜欢显式匹配语句的第一种方法。
逗号分隔的匹配语句仍然算作同一个。虽然如果(a)和(b)之间没有关系,这没有区别,但是当可能存在已存在的关系时,这可能会改变match语句的含义(考虑到你正在为[:with使用合并语句] ]关系)并且可能在这种情况下使查询慢得多。
您可以做的另一个有用的事情是在load csv命令之前使用以下语句作为前缀来批量加载数据以进行性能优化
USING PERIODIC COMMIT 10000 //change number based on your specific needs