Создание отношений Neo4j застревает во время импорта - PullRequest
0 голосов
/ 24 октября 2018

У меня проблемы с локальной базой данных neo4j.Я пытаюсь вставить около 100 000 узлов и 380 000 связей, используя официальный драйвер C # neo4j.В большинстве случаев импорт данных занимает около 23 секунд (что мне подходит).Однако время от времени (~ каждые 3 раза!) Импорт застревает.Это означает, что я отправляю запрос на создание новых отношений (через http, см. Скриншот Wireshark ниже), но я не получаю ответ от базы данных (через некоторое время я сталкиваюсь с таймаутом в своем приложении).Это всегда происходит, когда я пытаюсь вставить новые отношения.Создание новых узлов, кажется, работает нормально.Странно то, что иногда импорт успешно завершается без застревания в течение ~ 23 секунд!

Застревает запрос:

string query = "UNWIND {relations} AS relation " +
              $"MATCH (source:label1), (target:label2) " +
              $"WHERE source.ID = relation.ID AND target.ID = relation.ID " +
              $"CREATE (source)-[:newRelation]->(target)";
return ExecuteQuery(client, query, new Dictionary<string, object> { { "relations", ParameterSerializer.ToDictionary(relationInfos) } });

Это запрос на создание новогоузлы, которые не застревают:

 string query = "UNWIND {nodes} AS node " +
               $"CREATE (n:label1) " +
                "SET n = node";
 return ExecuteQuery(client, query, new Dictionary<string, object> { { "nodes", ParameterSerializer.ToDictionary(elements) } });

Я всегда обрабатываю 1000 узлов и отношений одновременно.Я возился с разными размерами кучи и кэша страниц, но, похоже, не оказал никакого влияния на мою проблему.Если вы посмотрите на второй скриншот, похоже, что в любом случае объем памяти достаточен.Я также попытался использовать протокол Bolt вместо http.Проблема все еще сохраняется.

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

Большое спасибо за помощь, с уважением,

Даниил

Дополнительная информация:

  • neo4j работает на виртуальной машине Window 10 с 4 назначенными ядрами процессора и 6 ГБ ОЗУ
  • настольная версия neo4j: 3.2.10
  • версия сервера neo4j: 3.4.9 (сообщество)
  • версия драйвера neo4j C #: 1.7.0
  • Конфигурация:
    • dbms.memory.heap.initial_size = 4G
    • dbms.memory.heap.max_size = 4G
    • dbms.memory.pagecache.size = 1G

Вот так это выглядиткак на проводе: Wireshark Screenshot

Это рабочая нагрузка виртуальной машины: enter image description here


ОБНОВЛЕНИЕ

У меня есть новости.После некоторых изменений в моем коде база данных больше не зависает.Обработка всех данных занимает немного больше времени.

Однако, что странно, это то, что первая вставляемая партия (около 1000 связей) занимает намного больше времени, чем остальные.Первый раз, когда я выполняю запрос Отношения, он занимает намного больше времени, чем следующий (примерно в три раза дольше).

Есть какое-нибудь объяснение или какой-то способ избежать этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...