2

我正在处理大约 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、CypherMERGE和 1,000 行的批量进行处理,以确保没有重复的患者、提供者或药物被创建。

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

Question: 有没有更好的方法?对非 python 建议开放。

4

3 回答 3

2

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

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

csv 列映射到您的密码语句的参数。

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

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

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

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

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

于 2014-01-27T23:52:50.303 回答
1

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

拆分创建唯一节点和关系。确保使用WriteBatch来加快该过程。

  1. 创建所有patient, provider,drug节点并将 py2neo 节点存储在 Python dict 中,使用patient_id,provider_iddrug_id作为键。使用 dict 确保每个 id 只创建一次。

  2. 再次检查您的数据,创建claim节点和与 uniqe patientproviderdrug节点的关系。Py2neo 允许claim在同一批次中为该节点创建一个节点和关系。

    # 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 m 的操作将使您的批次爆炸。尝试每1000次左右提交一次。

于 2014-01-28T18:51:25.817 回答
1

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

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

于 2014-01-28T07:19:33.540 回答