我正在使用大约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建议。
答案 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来加快此过程。
创建所有patient
,provider
,drug
个节点,并将py2neo节点存储在包含patient_id
,provider_id
或{{的Python dict中1}}作为关键。使用dict确保每个id只创建一次。
再次检查您的数据,创建drug_id
个节点以及与claim
,patient
,provider
个节点的关系。 Py2neo允许在同一批次中为该节点创建drug
节点和关系。
claim
17米的操作会使您的批次爆炸。尝试每1000次提交一次。