Neo4J Cypher- CSV的负载树结构



新的Cypher,我正在尝试加载带有5列的树结构的CSV。对于一行,每个项目都是节点,列n 1中的每个节点都是列中节点的孩子。

示例:

CSV列:Level1,Level2,Level3,Level4,Level5

结构: Level1_thing <--child_of-- Level2_thing <--child_of-- Level3_thing等...

数据库是非归一化的,因此除最低级别以外,所有级别的节点名称都有许多重复。使用Cypher加载此CSV并从CSV创建此树结构的最佳方法是什么?

很抱歉,如果这个问题格式不佳或提出要求,我是堆栈溢出和图形DBS的新手。

您要搜索的是MERGE命令。

要执行您的脚本,您必须在两个阶段进行最佳执行

进行操作。

1(创建节点,如果它们尚不存在

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///my_file.csv" AS row
MERGE (l5:Node {value:row.Level5})
MERGE (l4:Node {value:row.Level4})
MERGE (l3:Node {value:row.Level3})
MERGE (l2:Node {value:row.Level2})
MERGE (l1:Node {value:row.Level1})

2(创建关系,如果它们尚不存在

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///my_file.csv" AS row
MATCH (l5:Node {value:row.Level5})
MATCH (l4:Node {value:row.Level4})
MATCH (l3:Node {value:row.Level3})
MATCH (l2:Node {value:row.Level2})
MATCH (l1:Node {value:row.Level1})
MERGE (l5)-[:child_of]->(l4)
MERGE (l4)-[:child_of]->(l3)
MERGE (l3)-[:child_of]->(l2)
MERGE (l2)-[:child_of]->(l1)

在所有之前,您需要对节点上的约束来促进MERGE的工作。在我的示例上,将是:

CREATE CONSTRAINT ON (n:Node) ASSERT n.value IS UNIQUE;

iiuc,您可以在Cypher中使用LOAD CSV函数来加载节点和关系。在您的情况下,您可以使用MERGE来照顾重复。您的示例应该以这种方式工作,并有一些伪代码:

LOAD CSV with HEADERS from "your_path" AS row
MERGE (l1:Label {prop:row.Level1}
...
MERGE (l5:Label {prop:row.Level1}
MERGE (l1)<-[CHILD_OF]-(l2)<-...-(l5)

基本上,您可以在带有标头的.csv文件中读取时创建直立的节点和关系。希望会有所帮助。

如果CSV文件没有标题线,并且列序列已固定,则可以解决这样的问题:

LOAD CSV from "file:///path/to/tree.csv" AS row
// WITH row SKIP 1 // If there is a headers, you can skip the first line
// Pass on the columns:
UNWIND RANGE(0, size(row)-2) AS i
  MERGE (P:Node {id: row[i]})
  MERGE (C:Node {id: row[i+1]})
  MERGE (P)<-[:child_of]-(C)
RETURN *

是的,在此之前,确实值得添加索引:

CREATE INDEX ON :Node(id)

最新更新