Поскольку база данных neo4j поддерживает статистику подсчета меток, использование меток Male
и Female
позволит сразу получить эти цифры - даже без необходимости выполнять какие-либо запросы узлов.
Например, этот запрос получает количество Male
узлов из статистики:
MATCH (:Male)
RETURN COUNT(*) AS males
Тем не менее, текущий планировщик Cypher, похоже, отказывается использовать статистику во второй раз в том же запросе (на основе моих PROFILE прогонов), поэтому следующий запрос фактически просканирует БД на предмет Female
узлов. Надеюсь, это можно улучшить в будущих планировщиках Cypher.
MATCH (m:Male)
WITH COUNT(m) AS males
MATCH (f:Female)
RETURN males, COUNT(f) AS females
[ОБНОВЛЕНИЕ 1]
Однако, как рекомендует @InverseFalcon, использование UNION ALL
приводит к тому, что статистика используется каждый раз:
MATCH (m:Male) RETURN {male: COUNT(m)} AS counts
UNION ALL
MATCH (f:Female) RETURN {female: COUNT(f)} AS counts
[ОБНОВЛЕНИЕ 2]
Если вы хотите получить действительные узлы вместо количества, то есть 2 ответа с примерно одинаковой производительностью (как показано их PROFILE
с).
Вы можете использовать Male
и Female
метки:
MATCH (m:Male)
WITH COLLECT(m) AS males
MATCH (f:Female)
RETURN males, COLLECT(f) AS females
Вы можете создать индекс для :Person(gender)
:
MATCH (m:Person {gender: 'male'})
WITH COLLECT(m) AS males
MATCH (f:Person {gender: 'female'})
RETURN males, COLLECT(f) AS females
Однако для этого подхода потребуется больше памяти, так как вам придется хранить свойство гендер с каждым узлом.