Импорт и создание нескольких меток и отношений из файла json в neo4j - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть следующий файл 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
)

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вам необходимо жестко закодировать метки, совпадающие в 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))
0 голосов
/ 17 апреля 2019

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

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

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

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

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