neo4j загрузить CSV, занимая бесконечное время, чтобы выполнить мой запрос - PullRequest
0 голосов
/ 07 января 2020

Я загружаю данные в neo4j с помощью функции loadcsv. У меня есть два типа узлов - Директор и Компания. Приведенная ниже команда работает нормально и выполняется в течение 50 миллионов c.

LOAD CSV FROM "file:///Director.csv" AS line
CREATE(:Director {DirectorDIN:line[0]})

Load csv from "file:///Company.csv" AS line
Create(:Company{CompanyCIN:line[0]})

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

LOAD CSV FROM "file:///CompanyDirector.csv" AS line
match(c:Company{CompanyCIN:toString(line[0])}),(d:Director{DirectorDIN:toString(line[1])}) create (c)-[:Directed_by]->(d)

Я также пытался:

LOAD CSV FROM "file:///CompanyDirector.csv" AS line
match(c:Company{CompanyCIN:line[0]}),(d:Director{DirectorDIN:line[1]}) create (c)-[:Directed_by]->(d)

Это занимает бесконечное время. Пожалуйста, дайте мне знать, в чем может быть проблема здесь?

Информация: Файл CSV не содержит более 20 тыс. Записей. CompanyCIN является alphanumeri c DirectorDIN имеет номер 1017 * в природе

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Я думаю, что вы забыли создать какое-либо ограничение схемы в вашей базе данных:

CREATE CONSTRAINT on (n:Company) ASSERT n.CompanyCIN IS UNIQUE;
CREATE CONSTRAINT on (n:Director) ASSERT n.DirectorDIN IS UNIQUE;

Без этих ограничений сложность вашего запроса составляет N * M , где N - это число Company узлов, а M - число Director. Чтобы понять, что я имею в виду, вы можете EXPLAIN запрос до и после создания ограничений thoses.

Более того, вы также должны использовать PERIODIC COMMIT в вашем запросе LOAD CSV, например:

USING PERIODIC COMMIT 5000
LOAD CSV FROM "file:///CompanyDirector.csv" AS line
MATCH (c:Company{CompanyCIN:line[0]})
MATCH (d:Director{DirectorDIN:line[1]}) 
CREATE (c)-[:Directed_by]->(d)
1 голос
/ 08 января 2020

Основная проблема заключалась в том, что у вас не было индексов на :Company(CompanyCIN) и :Director{DirectorDIN). Без индексов neo4j вынужден оценивать каждую возможную пару из Company и Director узлов для каждой строки в вашем CSV-файле. Это занимает много времени.

CREATE INDEX ON :Company(CompanyCIN);

CREATE INDEX ON :Director{DirectorDIN);

Кстати, создание соответствующих ограничений уникальности (как предложено @logisma) имеет побочный эффект при создании этих индексов, но проблема не была вызвано отсутствием ограничений уникальности.

Кроме того, следует избегать создания дублирующихся отношений Directed_by, используя MERGE вместо CREATE.

Это должно работать лучше (вы можете использовать опцию USING PERIODIC COMMIT, как предложено @logisima, если у вас есть):

USING PERIODIC COMMIT 5000 LOAD CSV FROM "file:///CompanyDirector.csv" AS line
MATCH (c:Company {CompanyCIN:line[0]})
MATCH (d:Director {DirectorDIN:line[1]}) 
MERGE (c)-[:Directed_by]->(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...