如何将具有大量空值和列的中型 CSV 导入 Neo4j

How to import medium-sized CSV with a large number of nulls and columns into Neo4j

我必须将现有药物 ontology 导入 Neo4j。此 ontology 存储在 CSV 文件中;它包含约 30000 行和每行 192 列(即值)。问题是,在这 192 列中,绝大多数 (~170) 在几乎所有行中都有空值。

到目前为止,我遇到的示例涉及更简单的模式(具有 4 或 5 列)。此外,我还没有找到任何关于如何处理此类模型的有用见解。但是,我发现了有关一般空值的信息;尽管如此,作为 Neo4j 的新手,我不确定导入 CSV 文件中的数据的最佳方法是什么。据我所知,这些是备选方案:

  1. 分阶段导入。根据 Neo4j 官方网页上的网络研讨会,我可以先导入 ID 列,然后,对于每个包含空值的列 "X",过滤 X 列中的非空值并将两列转储到新的 CSV 文件中。最后一个操作将导致类似于以下的 Cypher 代码(假设所有药物都已导入):
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:///Users/user/ontology_with .csv" AS line

MATCH (drug:Drug {id: line.`Class ID`})
MATCH (d:Drug {id: line.`X`})
CREATE (drug)-[:ACTIVATES_DRUG]->(d)
  1. 使用 FOR EACH 语句,我认为这简化了之前的操作:
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:///Users/user/ontology_with .csv" AS line
FOREACH(n IN (CASE WHEN line.activates IS NULL THEN [] ELSE [1] END) |
    MERGE (drug:Drug {id: line.`Class ID`})
    CREATE (n)-[:ACTIVATES_DRUG]->(drug)
)
  1. 使用批量导入器。尽管根据 CSV 的大小(~30000 行)应该取消此选项,但考虑到空值是否有益?如果最好的选择是批量导入器,我将如何处理空值?

考虑到我的原始 CSV 文件的特点,尤其是列数众多,您建议采用哪种方式将数据导入 Neo4j?非常感谢专家或有经验的 Neo4j 用户的建议。

我以前遇到过类似的情况,并选择使用最接近您的第一个替代方案的东西 - 尽管使用了一个不需要预过滤 CSV 的展开语句。

假设索引 0 提供了索引中 (drug) 的 ID 和 (d) 运行 的可空 ID 1 - 191:

USING PERIODIC COMMIT 10000
LOAD CSV FROM "file:///Users/user/ontology_with .csv" AS line
UNWIND range(1,191) as i
MATCH (drug:Drug {id: line[0]})
MATCH (d:Drug {id: line[i]})
CREATE (drug)-[:ACTIVATES_DRUG]->(d)

Null 值不应该 return MATCH (d:Drug {id: line[i]}) 的任何内容,因此将被跳过。

最终,结果变得有点复杂。大多数 CSV 列存储多值关系,值之间用“|”分隔,因此我不得不调整之前的答案。这是这种多值关系的示例,以防万一它对其他人有用:

LOAD CSV WITH HEADERS FROM "file:///DINTO_CSVLint.csv" AS line
WITH line, SPLIT(line.`may interact with`, '|') AS ddiDrugs
UNWIND ddiDrugs AS i
MATCH (sourceDrug:Drug {preferredLabel: line.`Preferred Label`})
MATCH (destDrug:Drug {uri: i})
MERGE (sourceDrug)-[r:MAY_INTERACT_WITH]->(destDrug)
RETURN r;

我在剩下的关系中使用了类似的方法。