Neo4j 3.5 - Поиск только по отношениям очень медленный на моем графике отношений 12B - как мне повысить производительность? - PullRequest
0 голосов
/ 28 декабря 2018

У меня около 12 000 различных типов отношений, в узле 250M, граф rel 12B.

Иногда я хочу выполнить запрос, такой как: match (n) - [r] - (m), где тип(r) = "location_in" возвращает n, r, m limit 10;

, чтобы вернуть все с отношением location_in.Это очень медленно - описанное выше занимает часы в большой системе с большим объемом памяти и оптимизированными настройками памяти Java для этой БД.

Нужен ли какой-нибудь индекс отношений или запрос плохой?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Посмотрите на ОБЪЯСНЕНИЕ запроса, и вы заметите, что он выполняет AllNodesScan, чтобы найти ваши начальные узлы, поэтому он соответствует всем узлам вашего графа и расширяет все связи в вашем графе.

Как отметил ThirstForKnowledge, добавление меток в график и использование меток в запросе изменит это на NodeByLabelScan, поэтому он будет посещать только все узлы с данной меткой.

Neo4j не поддерживаетотношения в индексе схемы, хотя Neo4j 3.5.x позволяет вам создавать полнотекстовый индекс, который вы можете использовать для индексации свойств отношений определенного типа.Это может помочь вашему поиску, но вы не показали, что вам нужны определенные свойства для такого рода отношений.

0 голосов
/ 28 декабря 2018

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

MATCH (n:TypeA)-[r:LOCATED_IN]->(m:TypeB) RETURN n.attributeA, r, m.attributeB LIMIT 10;
...