Почему при экспорте Neo4j APOC Cypher игнорируется команда unwindBatchSize? - PullRequest
1 голос
/ 15 июня 2019

Я использую плагин Neo4j (3.5.1) apoc-3.5.0.4 для экспорта подграфа БД Neo4j.

В экспорте Cypher у меня всегда есть большой блок узлов UNWIND (>500).

Как я понимаю, документация по адресу https://neo4j -contrib.github.io / neo4j-apoc-процедуры / 3.5 / export-import / # export-cypher ограничение по умолчаниюдля размера пакета «порции» равны 100. Мой экспорт создает гораздо большие блоки UNWIND.

При попытке импортировать экспортированный файл Cypher через Cypher Shell импорт точно останавливается на первом большом блоке UNWIND со следующимиошибка:

Неверный ввод '{': ожидался символ идентификатора, пробел, ОТ ГРАФ, КОНСТРУКЦИЯ, ЗАГРУЗИТЬ CSV, СТАРТ, СООТВЕТСТВИЕ, СЛЕДУЮЩАЯ, СЛИЯНИЕ, СОЗДАТЬ УНИКАЛЬНЫЙ, СОЗДАТЬ, УСТАНОВИТЬ, УДАЛИТЬ, УДАЛИТЬ, FOREACH,WITH, CALL, RETURN, UNION, ';'или конец ввода (строка 2, столбец 2593 (смещение: 2593))

В упомянутой документации говорится, что размер партии можно контролировать с помощью параметра

useOptimizations:{unwindBatchSize: 10}

, чтобы ограничить количествоЗаписи UNWIND.

Но когда я установил для него меньшее значение (например, 10), чтобы заставить экспорт ограничивать размер записей UNWIND, он прекрасно работает до случайной точки в экспорте.Без какой-либо распознаваемой причины после случайного количества строк экспорт начинает строить большие блоки связанных узлов (до 1000 узлов).

Я использую следующую команду для экспорта подграфа из БД Neo4j:

MATCH (a:LABEL1)-[r:LINK]->(b:LABEL1)
WHERE a.title IN [xyz,...]
WITH collect(a)+collect(b) as export_nodes, collect(r) as export_rels
CALL apoc.export.cypher.data(export_nodes,export_rels,"export.cypher",
{format:'plain',cypherFormat:'updateAll', useOptimizations:
{type:'unwind_batch',unwindBatchSize: 10}}) 
YIELD file, source, format, nodes, relationships, properties, time
RETURN nodes, relationships, time;

Я использую следующую команду для импорта файла Cypher:

$NEO4J_HOME/bin/cypher-shell -u myuser -p mypassword < 'export.cypher'

Импорт работает до ошибки.Все узлы в файле Cypher - до момента возникновения ошибки - импортируются правильно.

Я немного поигрался с командой unwindBatchSize, чтобы проверить, работает ли она - по крайней мере, до определенной точки -правильный.Так что я проверил 5 узлов UNWIND предел.Это создает правильно сформированные блоки из 5 записей до строки 200..500, когда внезапно появляется огромный блок.

У кого-нибудь есть совет, как исправить это поведение?

Большое спасибо заранее

Krid


UPDATE

При создании анонимной выдержки из сгенерированного вывода Cypher я понял, что, вероятно, не unwindBatchSize является основной причиной проблемы.Рассматривая данные более подробно, я обнаружил, что разрывы строки и отсутствующая команда Cypher MERGE кажутся причиной ошибки.

Когда вы смотрите на позиции индекса 9: 605 и 9: 1142 (изприведенный ниже экспорт) вы видите, что должен быть разрыв строки и запись команды MERGE.Вместо этого вывод продолжается с содержимым.

Я не изменил структуру вывода (только анонимные метки, свойства и содержимое).

CREATE CONSTRAINT ON (node:Entity) ASSERT (node.title) IS UNIQUE;
UNWIND [{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}},  {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}] as row
MERGE (n:Entity{title: row.title}) SET n += row.properties;
UNWIND [{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}] as row
MERGE (n:Entity{title: row.title}) SET n += row.properties;
...
<for the next 200 blocks everything works as expacted... when suddenly the MERGE line is no longer generated>
...
UNWIND [{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}] as row{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}] as row{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0, ...
...
<This behaviour repeats for a while an suddenly it falls back to the expacted blocks set by the unwindBatchSize>
...
CREATE CONSTRAINT ON (node:Entity) ASSERT (node.title) IS UNIQUE;
UNWIND [{title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:1, prop2:0, prop3:0}}, {title:"Xyz_Xyz", properties:{prop1:0, prop2:0, prop3:0}}] as row
MERGE (n:Entity{title: row.title}) SET n += row.properties;
...
<The exported structure for adding the relations appear to be ok>
...
...