Группировка узлов одной метки по параметру - PullRequest
0 голосов
/ 29 июня 2018

Я новичок в графовых базах данных, поэтому извиняюсь за неправильную терминологию.

Я использую Neo4j, и у меня есть набор данных, состоящий, в основном, из одного вида узла. Эти узлы имеют множество параметров и взаимосвязей между собой и другими помеченными узлами на графике.

Чтобы привести простой пример того, чего я пытаюсь достичь, давайте предположим, что у меня есть ярлык «Персона». У каждого человека есть параметр с именем «пол», который будет иметь значение «мужской» или «женский». Что лучше, если я хочу выполнить запрос, который вернет всех мужчин в одной переменной и всех женщин в другой? Должны ли они быть отдельными ярлыками? Это кажется плохой идеей, учитывая, что параметры каждого из них идентичны.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Поскольку база данных 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 с).

  1. Вы можете использовать Male и Female метки:

    MATCH (m:Male)
    WITH COLLECT(m) AS males
    MATCH (f:Female)
    RETURN males, COLLECT(f) AS females
    
  2. Вы можете создать индекс для :Person(gender):

    MATCH (m:Person {gender: 'male'})
    WITH COLLECT(m) AS males
    MATCH (f:Person {gender: 'female'})
    RETURN males, COLLECT(f) AS females
    

    Однако для этого подхода потребуется больше памяти, так как вам придется хранить свойство гендер с каждым узлом.

0 голосов
/ 29 июня 2018

Вы можете иметь один ярлык Person для обоих с gender свойством.

Приведенный ниже запрос вернет List с двумя элементами, каждый из которых также будет List. Первый элемент предназначен для males, а второй - females

MATCH (male {gender:'male'})
WITH COLLECT(male) AS maleList
MATCH (female {gender:'female'})
RETURN maleList, COLLECT(female)

Я не уверен, что это лучший запрос. Но он должен вернуть вам то, что вам нужно

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