У меня есть следующий файл JSON (data.json):

{
    "data": [
        {"name": "Folder One", "type": "folder", "id": 1},
        {"name": "Folder Two", "type": "folder", "id": 2},
        {"name": "File One", "type": "file", "id": 1, "folder_id": 1},
        {"name": "File Two", "type": "file", "id": 2, "folder_id": 2}
    ]
}

Я хочу импортировать и создать две метки (:Folder и :File) и отношение [:BELONGS_TO].

Застрял здесь:

CALL apoc.load.json("file:/data.json") YIELD value
with value['data'] as data
UNWIND data as row

...
(
    foreach where type is "folder" create a :Folder
    foreach where type is "file" create a :File and a relationship [:BELONGS_TO] to folder
)

Как бы вы это сделали?

0
2083 17 Апр 2019 в 16:50

2 ответа

Лучший ответ

Вам необходимо жестко закодировать соответствие меток в FOREACH.

Во-первых, создайте индекс для свойства id файла и папки:

CREATE INDEX ON :File(id)
CREATE INDEX ON :Folder(id)

Затем создайте узлы или отношения.

CALL apoc.load.json("file:/data.json") YIELD value
with value['data'] as data
UNWIND data as row
FOREACH (ignoreMe in CASE WHEN row.type="folder" THEN [1] ELSE [] END | 
    MERGE (f:Folder{id: row.id}) 
    SET f.name= row.name)
FOREACH (ignoreMe in CASE WHEN row.type="file" THEN [1] ELSE [] END | 
    MERGE (folder:Folder{id: row.folder_id}) 
    MERGE (file:File{id: row.id}) 
    ON CREATE SET 
        file.name= row.name  
    MERGE (file)-[:BELONGS_TO]->(folder))
1
Raj 18 Апр 2019 в 14:47

Обычно мы не рекомендуем использовать один файл импорта для создания узлов нескольких несвязанных типов, но для этих случаев есть несколько разных подходов:

  1. Используйте несколько проходов по файлу, по одному на тип, фильтруя строки по типу, чтобы обрабатывать в запросе только узлы одного типа, используя CREATE или MERGE на жестко закодированной метке (и убедитесь, что у вас есть индекс при использовании MERGE).

  2. Используйте общий тип для всех импортируемых узлов (что-то вроде: Узел, если он очень универсальный, или более общий тип, который подходит для всех типов, которые должны быть импортированы в файл), чтобы все узлы вы СОЗДАЛИ или СЛИВИЛИ (и снова убедитесь, что у вас есть индекс присутствует, связанный с более общей меткой (если используется MERGE), используйте эту общую метку, а после создания узла используйте Процедуры APOC для динамической установки оставшихся меток с помощью apoc.create.addLabels ().

Поскольку ваша структура заключается в создании папок и файлов и взаимосвязи между ними, я бы порекомендовал первый подход, сначала создав все: узлы папок, затем второй: узлы файлов, выполняющие сопоставление с ранее импортированными узлами папок и создавая отношения.

0
InverseFalcon 17 Апр 2019 в 14:30