首页 > 解决方案 > 从关系数据库中获取的数据的 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.

我要创建的实体是:

  1. :Membership{membership_id:dataset.membership_id}
  2. :Member{member_id:dataset.member_id}
  3. :Hotel{hotel_name:dataset.hotel}
  4. :State{state_name:dataset.hotel_location}

我想在上述实体之间创建的关系是:

  1. (:Membership)-[:ASSOCIATE]-(:Member)
  2. (:Member)-[:VISIT{visit_date:dataset.visit_dt}]->(:Hotel)
  3. (: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 行)运行上述查询时,它会持续执行很长时间,而且我从未能够达到可以看到一些结果的状态。

所以我想知道一种更好的方法(从头到尾)来实现我的结果。

提前致谢。

标签: neo4jcypher

解决方案


您需要确保在用于查找和识别节点的标签/属性组合上具有索引和/或唯一约束,这将加快节点的匹配和合并。

如果 CSV 很大,您需要在加载时使用USING PERIODIC COMMIT ,这会为您处理批处理。

您可能还希望将节点创建与关系创建分开,因此请尝试使用仅用于创建/合并节点的查询,通过您的 CSV 进行传递,然后使用单独的加载查询来匹配您现在创建的节点并创建他们之间的关系。

并且不要在最后返回数据,没有必要,并且浏览器不擅长处理大量数据行的返回,如果那是你正在使用的。


推荐阅读