Ускорение отношений и создание узлов с помощью шифра в Neo4j

у меня есть 2 CSV-файла A и B. Файл A содержит 7000 строк с 6 свойствами, а файл B содержит 10M строк с 11 свойствами. Кроме того, файл A имеет свойство PKA, которое используется в качестве первичного ключа, тогда как файл B имеет свойство FKA, которое используется в качестве внешнего ключа по отношению к PKA.

Я хочу загрузить эти файлы в Neo4j следующим образом: 1 - вставить новый узел для каждой строки файла A и файла B 2 - добавить связь между любым созданным узлом, который представляет описанную связь первичного и внешнего ключа.

В настоящее время я вставил эти файлы с помощью BatchInserter с помощью JAVA API, добавив узел для каждой строки этих файлов и установив метки «A» и «B» для файлов A и файлов B соответственно. Я также создал два индекса для PKA и FKA. Чтобы добавить отношения, я намерен вызвать следующий оператор шифрования (из Neo4jShell):

match (a:A), (b:B) where a.PKA=b.FKB create (a)<-[:KEYREL]-(b);

Мои проблемы: - добавление узлов с помощью BatchInserter занимает 14 минут для файла B (самого большого) только с одной фиксацией в конце (~ 12 тыс. узлов/сек, ~130 тыс. свойств/сек), я хочу ускорить процесс импорта фактор 2. - запрос шифра не может быть обработан с этим размером набора данных, но я хотел бы сделать это возможным.

Я работаю на виртуальной машине с двухъядерным процессором IntelXeon @ 2,6 ГГц и 8 ГБ ОЗУ с установленными 64-разрядными версиями Windows и 64-разрядной версией Java8. Я запустил свою программу импорта java и Neo4jShell со следующими параметрами java:

-server -XX:+UseConcMarkSweepGC -Xms2000m -Xmx5000m

person hitotsukami    schedule 11.06.2014    source источник
comment
не забудьте удалить FKB после того, как вы создали отношения   -  person Michael Hunger    schedule 16.06.2014


Ответы (1)


Запуск ПОИСКПОЗ обычно происходит довольно медленно при работе с большим объемом данных.

Вы можете попытаться ускорить его, создав ограничение на узлах, в котором вы определяете каждый узел как уникальный. Это может ускорить MATCH, хотя для создания ограничения также требуется время:

CREATE CONSTRAINT ON (a:A) ASSERT a.PKA IS UNIQUE;
CREATE INDEX ON :B(PKB); 

Затем вы можете запустить ПОИСКПОЗ, который вы можете запустить из третьего файла CSV в соответствии с документы Neo4j, в которых описан сценарий, аналогичный вашему.

person songololo    schedule 12.06.2014
comment
Также ваша операция для вставки отношений должна быть другой, MATCH (a:A) MATCH (b:B) where b.FKB=a.PKA create (a)<-[:KEYREL]-(b); Возможно, вам придется добавить USING INDEX ON b:B(FKB) после второго совпадения. - person Michael Hunger; 16.06.2014
comment
Спасибо за ваши ответы! Я уже заметил уникальное ограничение, но оно кажется медленным и занимает всю доступную память. Прямо сейчас я пытаюсь установить отношения непосредственно во время процесса импорта, используя команду оболочки import-cypher. Эта команда намного медленнее, но она занимает не более 1 ГБ оперативной памяти и более универсальна. Есть ли способ ускорить эту команду? - person hitotsukami; 17.06.2014
comment
С точки зрения скорости лучшим вариантом является использование встроенного Java API напрямую, если это возможно. то есть избегать REST - person songololo; 17.06.2014
comment
@MichaelHunger Я пробовал ваш шифрованный запрос с двумя операторами соответствия, но он возвращает мне ноль, он работает только с моим запросом. Индексы загружены правильно. - person hitotsukami; 18.06.2014