Фильтрация и агрегирование графовых данных в Microsoft Fabric

Фильтрация сужает результаты до строк, которые имеют значение. Агрегирование преобразует эти строки в подсчеты, итоги и средние значения. В этой статье показано, как применять оба метода в запросах GQL к графу в Microsoft Fabric.

Примеры используют пример набора данных социальной сети. Полный справочник по операторам и выражениям GQL см. в руководстве по языку GQL.

Необходимые условия

Фильтрация строк с помощью FILTER

Используется FILTER для хранения только строк, удовлетворяющих условию. Поместите FILTER после MATCH, чтобы сузить количество соответствующих результатов.

Следующий запрос возвращает всех женщин с их именем и днем рождения:

MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday

Объедините несколько условий с AND и OR. Например, следующий запрос возвращает имена всех женщин, родившихся до 1990 года:

MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName

Tip

Для повышения производительности фильтруйте во время сопоставления шаблонов с встроенным WHERE условием, а не в отдельной FILTER инструкции. См. фильтр во время сопоставления шаблонов.

Фильтрация во время сопоставления шаблонов

Встроенные WHERE предложения внутри MATCH шаблона ограничивают сопоставление узлов и ребер до создания любых результатов. Этот подход более эффективен, чем предложение после сопоставления FILTER , так как обработчик запросов обрезает строки ранее.

Например, чтобы найти людей, родившихся до 1994 года, и компанию, в которой они работают, ограничивая результаты компаниями, название которых начинается на "A":

MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

Фильтруйте граничные свойства таким же образом. Например, чтобы выбрать только тех, кто начал работать в компании в 2000 году или позднее.

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom

Дополнительные сведения о разнице в производительности между встроенной фильтрацией и фильтрацией после сопоставления см. в статье «Оптимизация производительности запросов GQL».

Обработка значений NULL в фильтрах

GQL использует трехзначную логику: предикаты оцениваются как TRUE, FALSEили UNKNOWN. Если значение свойства равно NULL, сравнения возвращаются UNKNOWN. FILTER трактует UNKNOWN как не соответствующий, поэтому строка исключается.

Используйте IS NULL и IS NOT NULL проверьте значения NULL явным образом:

-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname

Используется coalesce() для замены значения по умолчанию, если свойство может иметь значение NULL:

MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName

Предостережение

NULL = NULL вычисляет значение UNKNOWN, а не TRUE. Всегда используется IS NULL для проверки значений NULL, а не равенства.

Агрегировать результаты с помощью RETURN

Используйте агрегатные функции в RETURN для суммирования ваших результатов. GQL поддерживает count(), , sum()avg()и min()max().

Например, чтобы подсчитать всех людей в графе:

MATCH (p:Person)
RETURN count(*) AS totalPeople

Чтобы подсчитать уникальные значения, например, сколько отдельных компаний используют людей:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount

Группировка результатов с помощью GROUP BY

Используйте GROUP BY в RETURN для группировки строк по общим значениям и вычисления агрегатов в каждой группе. Это группирование является эквивалентом GQL SQL GROUP BY.

Например, для подсчета сотрудников на компанию:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

Группировать данные по нескольким столбцам и одновременно вычислять различные агрегаты. Например, разбиение числа пользователей и диапазона дней рождения по полу и браузеру, возвращая 10 наиболее распространенных сочетаний:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS personCount,
       min(p.birthday) AS earliestBirthday,
       max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10

Note

Все не агрегатные выражения в RETURN должны присутствовать в GROUP BY. Выражения, которые не находятся в GROUP BY, должны использовать агрегатную функцию.

Сортировка и ограничение агрегированных результатов

Используйте ORDER BY и LIMIT вместе с GROUP BY, чтобы найти топ-N результаты.

Например, чтобы найти первые пять городов по количеству жителей:

MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityName = city.name
RETURN cityName, count(*) AS residentCount
GROUP BY cityName
ORDER BY residentCount DESC
LIMIT 5

Это важно

Место ORDER BY перед LIMIT. LIMIT всегда применяется к уже отсортированному результирующему набору.

Использование CASE для условных значений в результатах

Используется CASE/WHEN/THEN/ELSEдля вычисления условных значений в RETURN или.LET

Например, чтобы классифицировать людей в эры на основе их года рождения:

MATCH (p:Person)
RETURN p.firstName,
       CASE WHEN p.birthday < 19800101 THEN 'Before 1980'
            WHEN p.birthday < 20000101 THEN '1980–1999'
            ELSE '2000 or later'
       END AS era