Пакетная обработка в Cypher Или загрузить несколько файлов из браузера Neo4j

Я загружаю данные из CSV в Neo4j, используя следующий запрос:

CREATE CONSTRAINT ON (e:Entity) ASSERT e.entity IS UNIQUE;

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:/file1.csv' AS line FIELDTERMINATOR '|'

WITH line 

MERGE (e0:Entity {entity: line.entities_0_entity})
ON CREATE SET e0.confidence = toFloat(line.entities_0_confidence)

MERGE (e1:Entity {entity: line.entities_1_entity})
ON CREATE SET e1.confidence = toFloat(line.entities_1_confidence)

MERGE (e0)-[r:REL {name: line.relation_relation, confidence: toFloat(line.relation_confidence)}]->(e1)

RETURN *

Может кто-нибудь сказать эквивалентный запрос для загрузки данных из командной строки Neo4j или способ динамического изменения имени файла в браузере или передать его как "file:/file*"...??

2 ответа

Решение

Если вы хотите обрабатывать один и тот же оператор Cypher несколько раз, каждый раз корректируя одно или несколько значений, можно использовать процедуру APOC apoc.periodic.iterate.

В вашем примере вы хотели бы выполнить CREATE CONSTRAINT заявление заранее (и только один раз).

Например:

CALL apoc.periodic.iterate(
  "
    WITH ['file1', 'x', 'y'] AS filenames,
    UNWIND filenames AS name
    RETURN name;
  ",
  "
    USING PERIODIC COMMIT 1000
    LOAD CSV WITH HEADERS FROM 'file:/' + {name} + '.csv' AS line FIELDTERMINATOR '|'
    WITH line 
    MERGE (e0:Entity {entity: line.entities_0_entity})
    ON CREATE SET e0.confidence = toFloat(line.entities_0_confidence)
    MERGE (e1:Entity {entity: line.entities_1_entity})
    ON CREATE SET e1.confidence = toFloat(line.entities_1_confidence)
    MERGE (e0)-[r:REL {name: line.relation_relation, confidence: toFloat(line.relation_confidence)}]->(e1);
  ",
  {});

Этот запрос выполнит LOAD CSV заявление 3 раза (последовательно, так как parallel Вариант процедуры false по умолчанию), передавая одну из строк ("file1", "y" и "z") каждый раз как name параметр.

Вы можете просто поместить все свои файлы в каталог импорта neo4j, а затем использовать скрипт bash для их загрузки:

#!bin/sh

for file in /Users/ikwattro/dev/_graphs/310/import/*
do
    curl -H "Content-Type: application/json" \
        -d '{"statements": [{"statement": "LOAD CSV WITH HEADERS FROM file:///$file AS row ..."}]' \
        http://localhost:7474/db/data/transaction/commit
done

В самом Neo4j нет стандартного способа указать несколько файлов для импорта.

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