如何在neo4j中从csv创建节点和关系

如何在neo4j中从csv创建节点和关系,neo4j,cypher,Neo4j,Cypher,我正在加载带有密码查询的csv文件。csv文件有4列。2列,2表,如下所示 我想从这4列创建2种类型的节点数据库和表。如何为数据库和列创建唯一的节点并在它们之间建立关系 根据logisima的回答,我在下面添加了查询,为数据库和列创建节点,并添加了关系。但在节点中存在一些重复 `LOAD CSV WITH HEADERS FROM 'file:///test1.csv' AS row MERGE (source:Database { source: row.Sou

我正在加载带有密码查询的csv文件。csv文件有4列。2列,2表,如下所示

我想从这4列创建2种类型的节点数据库和表。如何为数据库和列创建唯一的节点并在它们之间建立关系

根据logisima的回答,我在下面添加了查询,为数据库和列创建节点,并添加了关系。但在节点中存在一些重复

        `LOAD CSV WITH HEADERS FROM 'file:///test1.csv' AS row
        MERGE (source:Database { source: row.Source_DB})
        MERGE (target:Database { target: row.Target_DB})
        MERGE (source_table:Table { source_table: row.Source_Table})
        MERGE (target_table:Table { source_table: row.Target_Table})
        MERGE (source)-[:LINKED_TO]-> (target)
        MERGE (source)-[:LINKED_TO]-> (source_table)
        MERGE (source)-[:LINKED_TO]-> (target_table)
        MERGE (target)-[:LINKED_TO]-> (target_table)`
请容忍我,我是Neo4j的新手。

诸如此类

LOAD CSV WITH HEADERS FROM 'file:///MASTER.csv' AS row

MERGE (source:Database { db: row.Source_DB, table: row.Source_Table})
MERGE (target:Database { db: row.Target_DB, table: row.Target_Table})
MERGE (source)-[:LINKED_TO]->(target)
更新评论

CREATE CONSTRAINT ON (n:Database) ASSERT n.db IS UNIQUE;
CREATE CONSTRAINT ON (n:Table) ASSERT n.id IS UNIQUE;

LOAD CSV WITH HEADERS FROM 'file:///MASTER.csv' AS row

MERGE (sourceDb:Database { db: row.Source_DB})
MERGE (sourceTable:Table { id: row.Source_DB + "-" + row.Source_Table, table: row.Source_Table})
MERGE (sourceDb)-[:HAS_TABLE]->(sourceTable)

MERGE (targetDb:Database { db: row.Target_DB})
MERGE (targetTable:Table { id: row.Target_DB + "-" + row.Target_Table, table: row.Target_Table})
MERGE (targetDb)-[:HAS_TABLE]->(targetTable)

MERGE (sourceTable)-[:LINKED_TO]->(targetTable);
像这样的

LOAD CSV WITH HEADERS FROM 'file:///MASTER.csv' AS row

MERGE (source:Database { db: row.Source_DB, table: row.Source_Table})
MERGE (target:Database { db: row.Target_DB, table: row.Target_Table})
MERGE (source)-[:LINKED_TO]->(target)
更新评论

CREATE CONSTRAINT ON (n:Database) ASSERT n.db IS UNIQUE;
CREATE CONSTRAINT ON (n:Table) ASSERT n.id IS UNIQUE;

LOAD CSV WITH HEADERS FROM 'file:///MASTER.csv' AS row

MERGE (sourceDb:Database { db: row.Source_DB})
MERGE (sourceTable:Table { id: row.Source_DB + "-" + row.Source_Table, table: row.Source_Table})
MERGE (sourceDb)-[:HAS_TABLE]->(sourceTable)

MERGE (targetDb:Database { db: row.Target_DB})
MERGE (targetTable:Table { id: row.Target_DB + "-" + row.Target_Table, table: row.Target_Table})
MERGE (targetDb)-[:HAS_TABLE]->(targetTable)

MERGE (sourceTable)-[:LINKED_TO]->(targetTable);

您的查询需要为数据库名称创建具有一致属性的数据库节点。您正在使用两个不同的属性名称,因此有时会为同一个DB创建两个节点

而不是:

MERGE (source:Database { source: row.Source_DB})
MERGE (target:Database { target: row.Target_DB})
使用类似于:

MERGE (source:Database {name: row.Source_DB})
MERGE (target:Database {name: row.Target_DB})

您还必须修复查询的其余部分,才能使用该属性名称。

您的查询需要创建数据库节点,该数据库节点具有与数据库名称一致的属性。您正在使用两个不同的属性名称,因此有时会为同一个DB创建两个节点

而不是:

MERGE (source:Database { source: row.Source_DB})
MERGE (target:Database { target: row.Target_DB})
使用类似于:

MERGE (source:Database {name: row.Source_DB})
MERGE (target:Database {name: row.Target_DB})

您还必须修复查询的其余部分才能使用该属性名。

我需要用同样的方法定义表吗?那么,如何定义数据库和表之间的关系:-是的,它正在工作。但是前两行需要什么呢?这是一个错误。如果没有这一点,工作正常。前两行用于在节点上创建模式约束。这将确保数据库和表在数据库中的唯一性,还将加快查询速度,因为它会以我需要的方式为表定义隐式索引?那么,如何定义数据库和表之间的关系:-是的,它正在工作。但是前两行需要什么呢?这是一个错误。如果没有这一点,工作正常。前两行用于在节点上创建模式约束。这将确保数据库和表在数据库中的唯一性,并且会加快查询速度,因为它会创建隐式索引