在将csv导入Neo4j时,仅为每列创建一个节点

时间:2018-01-30 20:19:38

标签: csv neo4j cypher

我有一个csv文件,看起来如下:

enter image description here

我想在Neo4j中创建一个数据库。行是带有标签gene的节点,列也是带有标签cell的节点。我需要编写一个CREATE查询来创建我的所有genecell - 节点,并为genecell的每个组合创建一个关系。目前我坚持使用以下代码:

LOAD CSV WITH HEADERS FROM 'file:///merged_full.csv' AS line
CREATE (:Gene {id: line.gene_ids, name: line.wikigene_name})

我需要以某种方式迭代所有列 - 从索引3开始 - 在创建gene个节点之后,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

以下是3个按顺序执行的查询,应该按照您的意愿执行。

  1. 此查询创建一个临时Headers节点,其names属性包含CSV文件中的标头集合。它使用LIMIT 1仅处理文件的第一行。它还会创建所有Cell个节点,每个节点都有自己的name属性。

    LOAD CSV FROM 'file:///merged_full.csv' AS line
    MERGE (h:Headers)
    SET h.names = line
    WITH line
    LIMIT 1
    UNWIND line[3..] AS name
    MERGE (c:Cell {name: name})
    
  2. 此查询使用APOC函数apoc.map.fromNodes生成名为cells的映射,该映射将每个单元名称映射到其单元节点。它还获得Headers节点。然后,它从CSV文件加载非标头数据(使用SKIP 1跳过标题行),并按如下方式处理每一行。它使用MERGE来获取/创建Gene节点g,其中包含所需的idname。它使用REDUCE函数生成当前行中具有“1”列值的Cell个节点的集合,然后FOREACH子句创建(g)-[:HAS]->(x)该集合中每个单元格x的关系(如有必要)。

    WITH apoc.map.fromNodes('Cell', 'name') AS cells
    MATCH (h:Headers)
    LOAD CSV FROM 'file:///merged_full.csv' AS line
    WITH h, cells, line
    SKIP 1 
    MERGE (g:Gene {id: line[1], name: line[2]})
    FOREACH(
      x IN REDUCE(s = [], i IN RANGE(3, SIZE(line)-1) |
        CASE line[i] WHEN "1" THEN s + cells[h.names[i]] ELSE s END) |
      MERGE (g)-[:HAS]->(x))
    
  3. 此查询只删除临时Headers节点(如果您愿意):

    MATCH (h:Headers)
    DELETE h;
    

答案 1 :(得分:1)

如果列与单元节点对应,那么您应该知道所有需要查看CSV标头的单元节点。

我建议编写一个小查询,只是为了创建你需要的每个单元节点,然后创建一个索引或唯一约束:Cell(id)(或名称,或任何属性用于标识一个:细胞)

此时问题就变成了处理每个相关列(我假设只有1作为值)。 APOC Procedures可能会有所帮助。

apoc.map.sortedProperties()可用于获取您的line地图,并为您提供键/值列表对的列表,您可以将其过滤到键以“V”开头的那些,以及值为1,然后使用剩余的内容匹配相关的:Cell节点并创建关系。