cypher的新手,我正在尝试加载一个包含5列的树结构的csv。对于单行,每个项目都是一个节点,第n + 1列中的每个节点都是第n列中节点的子节点。
示例:
Csv列:Level1,Level2,Level3,Level4,Level5
结构:Level1_thing <--child_of-- Level2_thing <--child_of-- Level3_thing
等......
数据库是非规范化的,因此除了最低级别之外,所有级别中都有许多重复的节点名称。使用cypher加载此csv并从csv创建此树结构的最佳方法是什么?
如果这个问题格式不正确或被问到,我很抱歉,我是堆栈溢出和图形数据库的新手。
答案 0 :(得分:0)
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文件中读取时创建动态节点和关系。希望有所帮助。
答案 1 :(得分:0)
您要搜索的是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;
答案 2 :(得分:0)
如果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)