[ОБНОВЛЕНИЕ] У меня здесь было несколько хороших рекомендаций на форуме сообщества Neo4j: https://community.neo4j.com/t/nodejs-neo4j-driver-trying-to-read-and-return-result-set-of-over-4m-records/22705/13
Предложение 1) Выполняйте поиск только по кампаниям с идентификатором отрасли - поэтому добавьте метка для узлов Campaign с идентификатором отраслевого сектора HasIndustrySector.
Предложение 2) Разделите запрос на две части: 1-я часть, захватите все кампании с отраслевым сектором. 2-я часть, объедините взаимосвязи, которые необязательно будут искать вместе, как таковые:
MATCH (c:Campaign)
WHERE c.industrySectorId IS NOT NULL
RETURN id(c) as campaignId
MATCH (c)-[r:SENT_EMAIL|OPENED|CLICKED]-(p)
WHERE id(c) = $campaignId
WITH c, type(r) as type, count(distinct p) as count LIMIT 1000
WITH c, {type: type, count: count} as data
WITH c, collect(data) as totals
RETURN c.campaignId AS campaignId, c.industrySectorId AS industrySectorId, c.senddate AS sendDate, c.subjectLine AS subject, c.preHeader AS preHeader, totals
Это фактически привело к завершению запроса. Результат профиля по этому запросу:
134178426 общее количество обращений к базе данных за 5 мс (в нем указано 5 мсек, но определенно потребовалось около 50+ секунд для фактического завершения и возврата результата профиля).
введите описание изображения здесь
[ОРИГИНАЛЬНЫЙ ВОПРОС]
У нас есть новый сервер, на котором запущен выделенный корпоративный Neo4j.
Недавно импортированные данные из базы данных MS SQL, производящей около 100 м узлов и больше количество связей.
Я подключил neo4j-драйвер для nodejs штраф и успешно выполнил много запросов.
Однако я нахожусь в точке, где мне нужно читать / передавать около 4 миллионов записей из конкретной метки узла.
Я использовал как сеанс, так и реактивный сеанс, чтобы попытаться сделать это, но результаты никогда не появляются, даже если я оставляю его на несколько часов. Однако, если я помещаю в запрос предложение LIMIT, я получаю хорошие результаты для всего до 500 000. Однако при превышении этого ответа просто нет никакого ответа, а также я ничего не вижу в журналах.
Вот запрос:
cypher runtime=slotted
MATCH (c:Campaign)
OPTIONAL MATCH (c)<-[:HAS]-(i:IndustrySector)
WITH c,i
OPTIONAL MATCH (c {campaignId: c.campaignId})-[sent:SENT_EMAIL]->(sp:Person)
OPTIONAL MATCH (c {campaignId: c.campaignId})<-[opened:OPENED]-(op:Person)
OPTIONAL MATCH (c {campaignId: c.campaignId})<-[clicked:CLICKED]-(cp:Person)
WITH c, i, COUNT(DISTINCT(sp)) AS totalSent, COUNT(DISTINCT(op)) AS totalOpened, COUNT(DISTINCT(cp)) AS totalClicked
RETURN c.campaignId AS campaignId, i.industrySectorId AS industrySectorId, c.senddate AS sendDate, c.subjectLine AS subject, c.preHeader AS preHeader, totalSent, totalOpened, totalClicked
Как видите, у меня установите время выполнения шифра для использования слотами. Я пробовал без этого, но похоже, что он отправляет все результаты обратно в одном пакете, а не по очереди.
Вот две версии, которые я пробовал, первая - нормальный сеанс. Во втором случае используется реактивный сеанс:
// Normal Session
session.run(query)
.subscribe({
onKeys: keys => {
},
onNext: record => {
},
onCompleted: () => {
},
onError: error => {
}});
// Reactive Session
rxSession.run(query)
.records()
.pipe(map(record => record.toObject()))
.subscribe({
...same as above
})
Еще я пробовал использовать SKIP и LIMIT для запроса, обрабатывая его партиями по 10 тыс. Записей. Это отлично работает, пока не достигнет 520 000 записей, а затем снова зависнет.
Был бы очень благодарен, если бы кто-нибудь мог указать мне, где я ошибаюсь, или лучший способ достичь того, чего я хочу. Я просмотрел библиотеку apo c, такую как apo c .periodi c .iterate, однако это применимо только для выполнения операций записи.
Спасибо за любую помощь.