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

问题描述 投票:1回答:1

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

neo4j graph-databases ontology import-csv
1个回答
2
投票

我以前遇到过类似的情况,并选择使用最接近你的第一个选择的东西 - 尽管有一个unwind语句使得不需要预过滤CSV。

假设索引0提供(药物)的id和(d)从索引1 - 191运行的可以为空的id:

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
投票

最终,事实证明它有点复杂。大多数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;

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

© www.soinside.com 2019 - 2024. All rights reserved.