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

时间:2019-04-20 22:07:44

标签: neo4j graph-databases ontology import-csv

我必须将现有的药物本体导入Neo4j。该本体存储在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的专家或有经验的用户的建议。

2 个答案:

答案 0 :(得分:2)

我以前也遇到过类似的情况,并且选择使用最接近您的第一个替代方法的方法-尽管带有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]})返回任何内容,因此将被跳过。

答案 1 :(得分:1)

最终,结果变得更加复杂。大多数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;

在其余的关系中,我使用了类似的方法。