neo4j - 如何将具有大量空值和列的中型 CSV 导入 Neo4j
问题描述
我必须将现有的药物本体导入 Neo4j。该本体存储在 CSV 文件中;它包括约 30000 行和每行 192 列(即值)。问题是,在这 192 列中,绝大多数(约 170 列)在几乎所有行中都有空值。
到目前为止,我遇到的示例涉及更简单的模式(具有 4 或 5 列)。此外,我还没有找到任何关于如何处理此类模型的有用见解。但是,我发现了有关一般空值的信息;不过,作为 Neo4j 的新手,我不确定在导入的 CSV 文件中获取数据的最佳方法是什么。据我所知,这些是替代方案:
- 分阶段进口。根据 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)
- 使用 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)
)
- 使用批量导入器。尽管根据 CSV 的大小(约 30000 行),应该取消此选项,但考虑到空值是否有益?如果最好的选择是批量导入器,我将如何处理空值?
考虑到我原始 CSV 文件的特性,特别是大量的列,您建议将数据导入 Neo4j 的哪种方式?我会感谢 Neo4j 专家或有经验的用户的建议。
解决方案
我之前遇到过类似的情况,并选择使用最接近您的第一个替代方案的东西 - 尽管使用 unwind 语句使预过滤 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)
空值不应为MATCH (d:Drug {id: line[i]})返回任何内容,因此将被跳过。