Neo4j Cypher - 从CSV加载树结构

时间:2018-04-24 15:05:26

标签: csv neo4j tree cypher

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创建此树结构的最佳方法是什么?

如果这个问题格式不正确或被问到,我很抱歉,我是堆栈溢出和图形数据库的新手。

3 个答案:

答案 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)