Neo4j Cypher - создание узлов и установка меток с помощью LOAD CSV

Я пытаюсь использовать LOAD CSV для создания узлов с метками, которые установлены в значения из CSV. Это возможно? Я пытаюсь что-то вроде:

LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (x:line.label)

... но я получаю неверную синтаксическую ошибку. Есть какой-либо способ сделать это?

5 ответов

Решение

bicpence,

Во-первых, это довольно легко сделать с помощью приложения пакетного импорта Java, и их нетрудно написать. Посмотрите этот пример пакетной вставки. Вы можете использовать opencsv для чтения вашего CSV-файла.

Если вы предпочитаете использовать Cypher и если у вас есть конечный набор меток для работы, вы можете сделать что-то вроде этого:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS LINE
CREATE (n:load {lab:line.label, prop:line.prop});

CREATE INDEX ON :load(lab);

MATCH (n:load {lab:'label1'})
SET n:label1
REMOVE n:load
REMOVE n.lab;

MATCH (n:load {lab:'label2'})
SET n:label2
REMOVE n:load
REMOVE n.lab;

Благодать и мир,

Джим

К сожалению нет, параметризованные метки не поддерживаются

Крис

Вы можете сделать обходной путь - создать все узлы и затем отфильтровать их и создать нужные узлы, а затем удалить эти старые узлы

LOAD CSV WITH HEADERS FROM 'file:///testfile.csv' AS line
CREATE (tmp:line[1])
WITH tmp
CREATE (x:Person {name: labels(tmp)[0]})
WITH tmp
REMOVE tmp

вставьте это в http://console.neo4j.org/ чтобы увидеть пример:

LOAD CSV 
WITH HEADERS FROM "http://docs.neo4j.org/chunked/2.1.2/csv/import/persons.csv" AS csvLine
CREATE (p:tmp { id: toInt(csvLine.id), name: csvLine.name })
WITH p
CREATE (pp:Person { name: labels(p)[0]})
WITH p, pp
DELETE p
RETURN pp

Ответ Джима Биарда работает, но используетPERIODIC COMMITкоторый полезен, но устарел.

Я смог написать запрос, который:

  1. Загрузки из CSV
  2. Использует несколько транзакций
  3. Создает узлы
  4. Добавляет ярлыки
  5. Будет работать для 4.5 и далее
      :auto LOAD CSV WITH HEADERS FROM 'file:///nodes_build_ont_small.csv' AS row
CALL { 
        with row
        call apoc.create.node([row.label], {id: row.id})
        yield node
        return null
} IN TRANSACTIONS of 100 rows 
return null

Кажется, что процедуры apoc более полезны, чем сами команды, поскольку это невозможно (по крайней мере, в моих попытках) сCREATE.

Я рассмотрел несколько подобных вопросов и пришел к выводу, что хороший краткий способ справиться с такими сложными проблемами, связанными с невозможностью легко добавлять динамические метки через 'ЗАГРУЗИТЬ CSV', - это просто использовать свой любимый язык программирования для прочтите строки CSV и создайте текстовый выходной файл с операторами Cypher, которые будут создавать структуру узла / края Neo4j, которую вы хотите. Затем вы также сможете напрямую редактировать текстовый файл, чтобы изменить все, что вы хотите, для дальнейшей настройки ваших команд.

Я лично использовал Java, потому что мне удобнее всего работать с Java. Я считываю каждую строку CSV в настраиваемый объект, представляющий строку в моем CSV-файле. Затем я распечатал в файл строку, отражающую нужное мне выражение Cypher. А потом все, что мне нужно было сделать, это вырезать и вставить эти команды в командную строку браузера Neo4j.

Таким образом, вы можете создавать свои команды, как хотите, и полностью избегать ограничений команд "ЗАГРУЗИТЬ CSV" с помощью Cypher.

Другие вопросы по тегам