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

如何将包含大量空值和列的中型CSV导入Neo4j,neo4j,graph-databases,ontology,import-csv,Neo4j,Graph Databases,Ontology,Import Csv,我必须将现有的药物本体导入Neo4j。该本体存储在CSV文件中;它包含约30000行和每行192列(即值)。问题是,在这192列中,绝大多数(~170)在几乎所有的行中都有空值 到目前为止,我遇到的示例涉及更简单的模式(4或5列)。此外,我还没有发现任何关于如何处理此类模型的有用见解。然而,我发现了关于空值的信息;然而,作为Neo4j的新手,我不确定导入CSV文件中数据的最佳方式是什么。据我所知,有以下几种选择: 分阶段进口。根据Neo4j官方网页上的一次网络研讨会,我可以首先导入ID列,然后针

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

到目前为止,我遇到的示例涉及更简单的模式(4或5列)。此外,我还没有发现任何关于如何处理此类模型的有用见解。然而,我发现了关于空值的信息;然而,作为Neo4j的新手,我不确定导入CSV文件中数据的最佳方式是什么。据我所知,有以下几种选择:

  • 分阶段进口。根据Neo4j官方网页上的一次网络研讨会,我可以首先导入ID列,然后针对每个带有null的列“X”,过滤X列中的非null值,并将这两列转储到一个新的CSV文件中。最后一次操作将产生类似于以下内容的密码(假设所有药物都已进口):
  • 使用FOR EACH语句,我相信这简化了前面的操作:
  • 使用批导入器。尽管根据CSV的大小(~30000行),此选项应该被取消,但考虑到空值,它是否有益?。如果最好的选择是批量导入器,我将如何处理空值

  • 考虑到我的原始CSV文件的特性,特别是大量的列,您建议采用哪种方式将数据导入Neo4j?我非常感谢Neo4j的专家或经验丰富的用户的建议。

    我以前也遇到过类似的情况,并选择使用最接近您的第一个备选方案-尽管有一个“放松”语句,使得预先过滤CSV变得不必要

    假设索引0提供了(药物)的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)
    

    空值不应该为匹配返回任何内容(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;
    

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

    为什么不将RDF导入到适当的triplestore中?
    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)
    
    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;