Как создать узлы и отношения из CSV в neo4j - PullRequest
0 голосов
/ 06 марта 2020

Я загружаю CSV-файл с запросом cypher. CSV-файл имеет 4 столбца. 2 для столбцов и 2 для таблиц, как показано ниже.

enter image description here

Я хочу создать базу данных узлов двух типов и таблицы из этих 4 столбцов. Как я могу создать уникальные узлы для базы данных и столбцов и иметь отношения между ними?

В соответствии с logisima's ответом, я добавил ниже запрос, чтобы создать узлы для базы данных и столбцов и добавил связи. Но в узлах есть некоторое дублирование.

        `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)`

enter image description here

Пожалуйста, потерпите меня, я новичок в Neo4j.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Что-то в этом роде?

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);
1 голос
/ 06 марта 2020

Ваш запрос должен создать Database узлы с непротиворечивым свойством для имени БД. Вы используете 2 разных имени свойства, поэтому вы иногда создаете 2 узла для одной и той же БД.

Вместо:

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})

Вам также придется исправить оставшуюся часть запроса, чтобы использовать это имя свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...