我有一个csv文件,看起来如下:
我想在Neo4j
中创建一个数据库。行是带有标签gene
的节点,列也是带有标签cell
的节点。我需要编写一个CREATE
查询来创建我的所有gene
和cell
- 节点,并为gene
和cell
的每个组合创建一个关系。目前我坚持使用以下代码:
LOAD CSV WITH HEADERS FROM 'file:///merged_full.csv' AS line
CREATE (:Gene {id: line.gene_ids, name: line.wikigene_name})
我需要以某种方式迭代所有列 - 从索引3开始 - 在创建gene
个节点之后,但我不知道该怎么做。
答案 0 :(得分:3)
以下是3个按顺序执行的查询,应该按照您的意愿执行。
此查询创建一个临时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})
此查询使用APOC函数apoc.map.fromNodes生成名为cells
的映射,该映射将每个单元名称映射到其单元节点。它还获得Headers
节点。然后,它从CSV文件加载非标头数据(使用SKIP 1
跳过标题行),并按如下方式处理每一行。它使用MERGE
来获取/创建Gene
节点g
,其中包含所需的id
和name
。它使用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))
此查询只删除临时Headers
节点(如果您愿意):
MATCH (h:Headers)
DELETE h;
答案 1 :(得分:1)
如果列与单元节点对应,那么您应该知道所有需要查看CSV标头的单元节点。
我建议编写一个小查询,只是为了创建你需要的每个单元节点,然后创建一个索引或唯一约束:Cell(id)(或名称,或任何属性用于标识一个:细胞)
此时问题就变成了处理每个相关列(我假设只有1作为值)。 APOC Procedures可能会有所帮助。
apoc.map.sortedProperties()
可用于获取您的line
地图,并为您提供键/值列表对的列表,您可以将其过滤到键以“V”开头的那些,以及值为1,然后使用剩余的内容匹配相关的:Cell节点并创建关系。