将大型数据集导入neo4j(带有扭曲)-速度慢

将大型数据集导入neo4j(带有扭曲)-速度慢,neo4j,cypher,py2neo,Neo4j,Cypher,Py2neo,我正在处理大约17mm的处方索赔,每个索赔包含以下字段子集: claim_id (one record per claim) patient_id drug_id provider_id 我的节点与上面的字段相同,关系如下: patient - [:FILLED] -> prescription provider - [:WROTE] -> prescription prescription -[:CONTAINS] -> drug 输入文件未排序,即患者/提供者/药物可以

我正在处理大约17mm的处方索赔,每个索赔包含以下字段子集:

claim_id (one record per claim)
patient_id
drug_id
provider_id
我的节点与上面的字段相同,关系如下:

patient - [:FILLED] -> prescription
provider - [:WROTE] -> prescription
prescription -[:CONTAINS] -> drug
输入文件未排序,即患者/提供者/药物可以出现在文件中的任何位置

我使用py2neo、Cypher MERGE和1000行的批大小来处理,以确保没有重复的患者、提供者或药物被创建

问题:性能-每批4个节点+4个关系X 1000大约需要一分钟,并且随着图表的增长,时间也在增加


问:有没有更好的方法?接受非python的建议

如果要执行csv+cypher,可以查看shell导入工具:

这些csv列映射到cypher语句的参数

确保为2.0预先创建唯一的约束/索引,以便在插入合并期间利用它们

如果你想拥有一个动态的rel类型,你可以在你的语句中使用{type},它不是由cypher解析的,而是由导入工具解析的

查看CSV批量导入器,它应该能够在几分钟内导入您的数据

见:


只需为节点和关系创建一个或多个csv文件

如果要执行csv+cypher,可以查看shell导入工具:

这些csv列映射到cypher语句的参数

确保为2.0预先创建唯一的约束/索引,以便在插入合并期间利用它们

如果你想拥有一个动态的rel类型,你可以在你的语句中使用{type},它不是由cypher解析的,而是由导入工具解析的

查看CSV批量导入器,它应该能够在几分钟内导入您的数据

见:


只需为节点和关系创建一个或多个csv文件

,您还可以通过扩展看看如何使用。它通过感叹号语法支持唯一性,因此可能能够帮助您解决问题


整个语法看起来与Cypher非常相似,但有一些细微的区别,py2neo使用该方法直接支持load2neo

您还可以通过扩展看看如何使用。它通过感叹号语法支持唯一性,因此可能能够帮助您解决问题


整个语法看起来与Cypher非常相似,但有一些细微的区别,py2neo使用该方法直接支持load2neo

以下是我在Python/py2neo中对大小相似的数据集所做的操作:

拆分唯一节点和关系的创建。请确保使用a来加快流程

创建所有患者、提供者、药物节点,并将py2neo节点存储在Python dict中,其中患者id、提供者id或药物id为密钥。使用dict确保每个id只创建一次

再次检查您的数据,创建索赔节点以及与uniqe患者、提供者、药物节点的关系。Py2neo允许在同一批中创建索赔节点和该节点的关系

# write batch
batch = WriteBatch(graph_db)

for line in your_data:
    # your fields
    claim_id = ...
    patient_id = ...

    patient_node = my_dict_from_step_one[patient_id]

    claim_node = batch.create({'claim_id': claim_id})
    batch.create(rel(patient_node, "FILLED", claim_node))

results = batch.submit()

17米操作将使您的批次爆炸。尝试每1000次左右提交一次。

以下是我在Python/py2neo中对大小相似的数据集所做的操作:

拆分唯一节点和关系的创建。请确保使用a来加快流程

创建所有患者、提供者、药物节点,并将py2neo节点存储在Python dict中,其中患者id、提供者id或药物id为密钥。使用dict确保每个id只创建一次

再次检查您的数据,创建索赔节点以及与uniqe患者、提供者、药物节点的关系。Py2neo允许在同一批中创建索赔节点和该节点的关系

# write batch
batch = WriteBatch(graph_db)

for line in your_data:
    # your fields
    claim_id = ...
    patient_id = ...

    patient_node = my_dict_from_step_one[patient_id]

    claim_node = batch.create({'claim_id': claim_id})
    batch.create(rel(patient_node, "FILLED", claim_node))

results = batch.submit()

17米操作将使您的批次爆炸。尝试每1000次左右提交一次。

谢谢Michael。我看到了这些。我不明白的是如何确保节点不重复。也就是说,如果我在第1行有一个内科医师1,并在那里创建节点+rels,然后在第10行创建内科医师1,那么我如何为药物患者和rels构建相同的输入文件?若问题太幼稚,请提前道歉-仅使用neo4j一周:谢谢Michael。我看到了这些。我不明白的是如何确保节点不重复。也就是说,如果我在第1行有一个内科医师1,并在那里创建节点+rels,然后在第10行创建内科医师1,那么我如何为药物患者和rels构建相同的输入文件?如果问题幼稚,请提前道歉-仅使用neo4j一周左右: