Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Фильтрация сужает результаты до строк, которые имеют значение. Агрегирование преобразует эти строки в подсчеты, итоги и средние значения. В этой статье показано, как применять оба метода в запросах GQL к графу в Microsoft Fabric.
Примеры используют пример набора данных социальной сети. Полный справочник по операторам и выражениям GQL см. в руководстве по языку GQL.
Необходимые условия
- Элемент графа с загруженными данными. Если вы не знакомы с графом, сначала выполните руководство .
- Знакомство с основными
MATCHиRETURNзапросами. См. руководство по языку 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