将大数据集导入neo4j(带扭曲) - 慢

时间:2014-01-27 23:36:56

标签: neo4j cypher py2neo

我正在使用大约17毫米处方声明,每个处方声明包含以下字段(子集):

claim_id (one record per claim)
patient_id
drug_id
provider_id

我的节点与上面的字段相同,关系是:

patient - [:FILLED] -> prescription
provider - [:WROTE] -> prescription
prescription -[:CONTAINS] -> drug

输入文件未订购,即patient / provider / drug可出现在文件中的任何位置。

我正在使用py2neo,Cypher MERGE和批量大小为1,000行来处理,以确保没有重复的患者,提供者或药物被创建。

Problem:性能 - 每批大约需要一分钟(4个节点+ 4个关系X 1,000),随着图表的增长,时间也在增加。

Question:有更好的方法吗?打开非python建议。

3 个答案:

答案 0 :(得分:2)

如果你想做csv + cypher,你可以查看shell-import工具:

https://github.com/jexp/neo4j-shell-tools#cypher-import

csv列映射到cypher语句的参数。

确保预先创建唯一约束/索引(适用于2.0),因此您可以在使用MERGE插入期间利用它们

如果你想拥有一个动态的rel-type,你可以在你的语句中使用#{type}(这不是由cypher解决的,而是导入工具)

查看CSV批次导入程序,它应该能够在几分钟内导入您的数据。

请参阅:https://github.com/jexp/batch-import/tree/20#neo4j-csv-batch-importer

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

答案 1 :(得分:1)

您还可以通过Geoff扩展程序查看load2neo。这通过其感叹号语法支持唯一性,因此可以帮助您。

整体语法看起来与Cypher非常相似,但有一些细微差别,py2neo使用load_geoff方法直接支持load2neo。

答案 2 :(得分:1)

这是我在Python / py2neo中为类似大小的数据集做的事情:

拆分唯一节点和关系的创建。请务必使用WriteBatch来加快此过程。

  1. 创建所有patientproviderdrug个节点,并将py2neo节点存储在包含patient_idprovider_id或{{的Python dict中1}}作为关键。使用dict确保每个id只创建一次。

  2. 再次检查您的数据,创建drug_id个节点以及与claimpatientprovider个节点的关系。 Py2neo允许在同一批次中为该节点创建drug节点和关系。

    claim
  3. 17米的操作会使您的批次爆炸。尝试每1000次提交一次。