我是graph databases
的新手,特别是cypher
。我正在从csv
导入数据。以下是我为某些country data
提取的示例,并添加了cities
和states
。现在我正在推送areas
LOAD CSV WITH HEADERS FROM
"file:///X:/loc.csv" as csvRow
MATCH (ct:city {poc:csvRow.poc})
MERGE (loc:area {eoc: csvRow.eoc, name:csvRow.loc_nme, name_wr:replace(csvRow.loc_nme," ","")})
MERGE (loc)-[:exists_inside]->(ct)
我已经使用相同的查询推送了城市和国家/地区数据,并在它们之间建立了关系。
但是,当我尝试在areas
内创建city
时,它只是继续前进,没有阻止它。 (15分钟过去了)。
我从互联网获得的数据中有7000个城市,这些城市内有90,000个区域。
只是花时间或者我搞砸了查询。
更新后
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
"file:///X:/loc.csv" as csvRow
MATCH (ct:city {poc:csvRow.poc})
MERGE (loc:area {eoc: csvRow.eoc, name:csvRow.loc_nme, name_wr:replace(csvRow.loc_nme," ","")})
MERGE (loc)-[:exists_inside]->(ct)
答案 0 :(得分:0)
好的,您的查询计划显示NodeByLabelScans和过滤器正用于查找您的节点,这意味着每次匹配或合并到一个节点时,它必须扫描具有给定标签的所有节点并对所有节点执行属性访问他们找到你正在寻找的节点。
您需要在相关标签/属性组合上add indexes(或唯一约束,具体取决于字段是否应该是唯一的),以便快速查找这些内容。
所以你需要一个:city(poc),可能还有一个:area(eoc),假设这些属性指的是唯一属性。
修改
我最初错过的另一件大事,你需要在LOAD CSV之前添加USING PERIODIC COMMIT
,这样负载就会批量写入数据库,这应该可以解决这个问题。