我必须将现有的药物本体导入Neo4j。该本体存储在CSV文件中;它包括~30000行和每行192列(即值)。问题在于,在这192列中,绝大多数(~170)几乎在所有行中都具有空值。
到目前为止我遇到的例子涉及更简单的模式(有4或5列)。另外,我还没有找到任何关于如何处理这种模型的有用见解。但是,我一般找到了关于空值的信息;尽管如此,作为Neo4j的新手,我不确定导入CSV文件中数据的最佳方法是什么。据我所知,这些是替代方案:
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)
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文件的功能,特别是大量的列,您建议将数据导入Neo4j的方式?我很感激Neo4j的专家或有经验的用户的建议。
我以前遇到过类似的情况,并选择使用最接近你的第一个选择的东西 - 尽管有一个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]}),因此将被跳过。
最终,事实证明它有点复杂。大多数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;
我在其余的关系中使用了类似的方法。