neo4j - 从关系数据库中获取的数据的 csv 创建节点和关系
问题描述
我是 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 行)运行上述查询时,它会持续执行很长时间,而且我从未能够达到可以看到一些结果的状态。
所以我想知道一种更好的方法(从头到尾)来实现我的结果。
提前致谢。
解决方案
您需要确保在用于查找和识别节点的标签/属性组合上具有索引和/或唯一约束,这将加快节点的匹配和合并。
如果 CSV 很大,您需要在加载时使用USING PERIODIC COMMIT ,这会为您处理批处理。
您可能还希望将节点创建与关系创建分开,因此请尝试使用仅用于创建/合并节点的查询,通过您的 CSV 进行传递,然后使用单独的加载查询来匹配您现在创建的节点并创建他们之间的关系。
并且不要在最后返回数据,没有必要,并且浏览器不擅长处理大量数据行的返回,如果那是你正在使用的。
推荐阅读
- c - 函数调用中的花括号在 C 中是什么意思?
- oracle - 发现 Oracle 数据库上的表返回一个空列表
- c++ - 使用模板从不同 cin 的用户获取值
- kotlin - UninitializedPropertyAccessException 使用匕首 2
- javascript - 从 MongoDB 中重复文档集合中的唯一文档中获取值的总和
- asp.net-core-2.0 - Autofac拦截器不适用于某些类
- python - 如何在不影响 DataFrame 中的数值数据的情况下对分类数据进行编码?
- magento2 - 不生成构建magento 2.3.3
- flutter - Flutter:添加后刷新图像
- docker - 为什么我们要构建“内部”docker?