Длительный запрос Neo4j будет разделен/выполнен на более мелкие куски?

Мой import.csv создает много узлов, а слияние создает огромное декартово произведение и работает в transaction timeout, поскольку данные так сильно выросли. В настоящее время я установил время ожидания транзакции на 1 секунду, потому что каждый другой запрос выполняется очень быстро и не должен занимать больше одной секунды.

Есть ли способ разделить или выполнить этот конкретный запрос на более мелкие фрагменты, чтобы предотвратить тайм-аут?

Повышение или отключение transaction timeout в neo4j.conf не вариант, потому что сервису neo4j требуется перезапуск для каждого изменения, сделанного в конфигурации.

Запрос, нарушающий тайм-аут из моего скрипта импорта:

 MATCH (l:NameLabel)
 MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
 MERGE (m)-[:LABEL {path: l.path}]->(l);

Nodecounts: 1000 Movie, 2500 Namelabel


person Theo    schedule 18.09.2017    source источник
comment
Пожалуйста, поделитесь с нами вашим скриптом импорта.   -  person Bruno Peres    schedule 18.09.2017
comment
@BrunoPeres добавил пример   -  person Theo    schedule 18.09.2017


Ответы (2)


Вы можете попробовать установить процедуры APOC и использовать процедуру apoc.periodic.commit.

call apoc.periodic.commit("
  MATCH (l:Namelabel)
  WHERE NOT (l)-[:LABEL]->(:Movie)
  WITH l LIMIT {limit}
  MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
  MERGE (m)-[:LABEL {path: l.path}]->(l)
  RETURN count(*)
",{limit:1000})

Приведенный ниже запрос будет выполняться многократно в отдельных транзакциях, пока не вернет 0.

Вы можете изменить значение {limit : 1000}.

Примечание: не забудьте установить процедуры APOC в соответствии с версией Neo4j, которую вы используете. Взгляните на Матрицу совместимости версий.

person Bruno Peres    schedule 18.09.2017

Количество узлов и меток в вашей базе данных предполагает, что это проблема индексации. Есть ли у вас ограничения как для узлов Movie, так и для Namelabel (который должен быть NameLabel, поскольку это узел)? Соответствующие ограничения должны быть установлены и активны.

Индексирование и производительность

Убедитесь, что индексы и ограничения объявлены и находятся в режиме ONLINE для сущностей, которые вы хотите СООТВЕТСТВОВАТЬ или ОБЪЕДИНЯТЬ.

Всегда MATCH и MERGE для одной метки и индексированного свойства первичного ключа

Предварите свои операторы загрузки USING PERIODIC COMMIT 10000. Если возможно, разделите создание узла и создание отношения на разные операторы.

Если ваш импорт выполняется медленно или возникают проблемы с памятью, см. запись в блоге Марка о нетерпеливой загрузке.

Если ваши узлы Movie имеют уникальные имена, используйте оператор CREATE UNIQUE. - документы

Если один из узлов не уникален, но будет использоваться в определении отношения, то оператор CREATE INDEX ON. С таким небольшим набором данных может быть не совсем очевидно, насколько неэффективны ваши запросы. Попробуйте команду PROFILE и посмотрите, сколько узлов просматривается. Ваш оператор MERGE должен проверять только пару узлов на каждом шаге.

person Nathan    schedule 18.09.2017