Neo4j Cypher - загрузить древовидную структуру из CSV - PullRequest
0 голосов
/ 24 апреля 2018

Впервые на cypher, и я пытаюсь загрузить в CSV древовидной структуры с 5 столбцами.Для отдельной строки каждый элемент является узлом, а каждый узел в столбце n + 1 является дочерним по отношению к узлу в столбце n.

Пример:

Csv столбцы: Level1, Level2,Уровень 3, Уровень 4, Уровень 5

Структура: Level1_thing <--child_of-- Level2_thing <--child_of-- Level3_thing и т. Д.

База данных не нормализована, поэтому существует много повторений имен узлов на всех уровнях, кроме самых низких.Каков наилучший способ загрузки в этот CSV с использованием Cypher и создания этой древовидной структуры из CSV?

Извинения, если этот вопрос плохо отформатирован или задан, я новичок как в переполнении стека, так и в графических БД.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Что вы ищете, так это команда MERGE.

Чтобы выполнить сценарий, вы должны выполнить его в два этапа для оптимального выполнения

1) Создать узлы, если они не 't уже существует

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;
0 голосов
/ 24 апреля 2018

Если 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)
0 голосов
/ 24 апреля 2018

IIUC, вы можете использовать функцию LOAD CSV в Cypher для загрузки как узлов, так и отношений.В вашем случае вы можете использовать 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 с заголовками.Надеюсь, это поможет.

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