Импортировать выбранные строки из файла TSV в neo4j - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть файл со связями в этом формате:

!comment
!comment
nodeID   nodeName   edgeType   nodeID
nodeID   nodeName   edgeType   nodeID
nodeID   nodeName   edgeType   nodeID

Я хочу импортировать узлы и ребра этого файла в мою базу данных neo4j.
Я попробовал следующие шаги:

  1. Создание уникального ограничения на идентификаторы узлов
  2. Чтение файла, пропуск строк комментариев, создание уникальных узлов из каждой строки (пропуск строки, если узел уже существует)
  3. Чтение файла, пропусккомментируйте строки, создавайте ребра из каждой строки
// Each node id is unique
CREATE CONSTRAINT ON (n:Node) ASSERT n.id IS UNIQUE

// For each row not starting by "!", create node if it doesn't exist
LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row =~ '^!.*'
CREATE (:Node {id: row[0], name: row[1]})

// For each row not starting by "!", create edge
LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row =~ '^!.*'
MATCH (n:Node), (m:Node)
WHERE n.id = row[0] AND m.id = row[3]
WITH n, m, row
CASE row[2]
  WHEN 'F' THEN
    CREATE UNIQUE (m)-[:Edge {type: 'friend'}]->(n)
  WHEN 'P' THEN
    CREATE UNIQUE (m)-[:Edge {type: 'partner'}]->(n)
END

Приведенный выше код не работает.Будучи новичком в шифровании, я не уверен, что делаю неправильно.В конечном итоге я хотел бы объединить шаги 2 и 3, чтобы один раз прочитать файл и покончить с ним.Как эффективно импортировать эти данные?

1 Ответ

0 голосов
/ 20 сентября 2018

[ОБНОВЛЕНО дважды]

Эта версия вашего третьего запроса должна работать:

LOAD CSV FROM "file:///relationships.tsv" AS row
FIELDTERMINATOR '\t'
WITH row
WHERE NOT row[0] STARTS WITH '!'
MATCH (m:Node)
WHERE m.id = row[3]
MERGE (n:Node {id: row[0]})
SET n.name = row[1]
FOREACH (domain IN
    CASE
        WHEN row[2] = 'F' THEN ['friend']
        WHEN row[2] = 'P' THEN ['partner']
        ELSE []
    END |
    MERGE (t)-[:Edge {type: domain}]->(p)
);

Он правильно проверяет первый элемент в строке (не всю строку список *)1007 * - что не является строкой) для начального '!'.Он также использует предложение FOREACH для выполнения условных обновлений (которое предложение Cypher CASE не поддерживает самостоятельно).Этот запрос также использует MERGE вместо устаревшего CREATE UNIQUE.И он также использует MERGE вместо CREATE для создания n узлов, чтобы быть уверенным, что вы не создадите дубликаты (скажем, если вы повторно запустите тот же запрос).

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