我是Cypher的新手,我正在尝试根据从SQL DB中获取的数据创建节点和关系。我已经将数据导出为csv。
这是我的数据的虚拟数据表示(我正在处理的数据集有约84k行):
membership_id member_id hotel hotel_location visit_dt
1 A11 Hotel1 Texas 2019-01-01
1 A12 Hotel2 Texas 2019-02-04
1 A13 Hotel1 Texas 2019-01-01
2 B11 Hotel3 California 2019-01-25
2 B12 Hotel2 California 2019-02-04
2 B13 Hotel3 California 2019-01-25
2 B12 Hotel1 California 2019-01-01
上述数据的csv字符串如下:
"membership_id,member_id,hotel,hotel_location,visit_dt\n1,A11,Hotel1,Texas,2019-01-01\n1,A12,Hotel2,NewYork,2019-02-04\n1,A13,Hotel1,Texas,2019-01-01\n2,B11,Hotel3,California,2019-01-25\n2,B12,Hotel2,NewYork,2019-02-04\n2,B13,Hotel3,California,2019-01-25\n2,B12,Hotel1,Texas,2019-01-01"
假设上述数据已作为dataset
加载。
我要创建的实体是:
:Membership{membership_id:dataset.membership_id}
:Member{member_id:dataset.member_id}
:Hotel{hotel_name:dataset.hotel}
:State{state_name:dataset.hotel_location}
我要在上述实体之间建立的关系是:
(:Membership)-[:ASSOCIATE]-(:Member)
(:Member)-[:VISIT{visit_date:dataset.visit_dt}]->(:Hotel)
(:Hotel)-[:LOCATED_AT{location:dataset.hotel_location}]->(:State)
为此,我尝试了以下查询:
LOAD CSV WITH HEADERS FROM "file:///test.csv" AS dataset
MERGE (ms:Membership{family_id:dataset.patient_family_id})
WITH dataset, ms
MERGE (m::Member{member_id:dataset.member_id})
WITH dataset, ms, m
MERGE (h:Hotel{hotel_name:dataset.hotel})
WITH ms, m, h, dataset
MERGE (s:State{state_name:dataset.hotel_location})
WITH ms, m, h, s, dataset
MERGE (ms)-[:ASSOCIATE]-(m)
WITH ms, m, h, s, dataset
MERGE (m)-[:VISIT{visit_date:dataset.visit_dt}]->(h)
WITH ms, m, h, s, dataset
MERGE (h)-[:LOCATED_AT{location:dataset.hotel_location}]->(s)
RETURN ms, m, h, s
但是在数据集(约84k行)上运行上述查询时,它在执行中的时间很长,而且我一直无法达到可以看到一些结果的状态。
所以我想知道一种更好的方法(从头到尾)来达到我的结果。
谢谢。
答案 0 :(得分:1)
您将要确保在用于查找和标识节点的标签/属性组合上具有索引和/或唯一约束,这将加快节点的匹配和合并。
如果CSV很大,则在加载时要使用USING PERIODIC COMMIT,这样可以为您批量处理。
您可能还希望将节点创建与关系创建分开,因此请尝试仅使用查询来创建/合并节点,并使用CSV进行传递,然后使用单独的负载查询来匹配您现在创建的节点并建立它们之间的关系。
并且不要在最后返回数据,这是没有必要的,并且如果您使用的是浏览器,那么它就无法处理大量数据行的返回。