#node.js #neo4j #cypher #neo4j-driver #neo4j-desktop
Вопрос:
Я совсем новичок в Neo4j и использую настольную версию Neo4j с драйвером Javascript. Мой график имеет около 30.000 узлов и 40.000 ребер. Окончательный подход состоял бы в том, чтобы получить все простые циклы на графике, но я сталкиваюсь с переполнением кучи при попытке выполнить следующий запрос шифра:
let res = await session.run('MATCH p=(n)-[*2..4]-(n) RETURN nodes(p)')
Это, конечно, потому, что запрос пытается вернуть все найденные простые циклы, что слишком много для моей кучи и, к сожалению, увеличивает объем памяти для node.js это не вариант.
Итак, есть ли какой — нибудь способ обойти эту проблему и получить все простые циклы из графика?
Вот ошибка переполнения кучи, которую я получил:
/Users/paulus/.nvm/versions/node/v15.10.0/bin/node /Users/paulus/routeplanner/RouteFinder.js
<--- Last few GCs --->
[39630:0x104e00000] 227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
<--- JS stacktrace --->
<--- Last few GCs --->
[39630:0x104e00000] 227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
<--- JS stacktrace --->
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
<--- Last few GCs --->
[39630:0x104e00000] 227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
[39630:0x104e00000] 228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms (average mu = 0.577, current mu = 0.321) allocation failure
<--- JS stacktrace --->
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Ответ №1:
Трудно дать вам точное решение, не зная модели данных вашего графика, но это может помочь использовать пропуск/ограничение для получения данных в меньших объемах.
Это позволит получить первые 100 паттернов:
MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 0 LIMIT 100
И это следующие 100:
MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 100 LIMIT 100
Комментарии:
1. Это работает идеально, но как мне узнать предел?
2. Если вы ссылаетесь на общее количество шаблонов, вы можете сначала сделать запрос с количеством (СОВПАДЕНИЕ p=(n)-[*2..4]-(n) КОЛИЧЕСТВО возвратов(p)), чтобы узнать общее количество. Но если вы ссылаетесь на объемный размер, вы должны рассчитать его на основе объема имеющихся у вас данных и их размера (достаточно большого, чтобы не выполнять много запросов, но не настолько большого, чтобы он мог завершиться неудачей).
3. Я искал общее количество шаблонов… Спасибо!