Escritura de consultas de patrones de grafos en Microsoft Fabric

Note

Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin un contrato de nivel de servicio y no es aconsejable usarla para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure.

La coincidencia de patrones de grafos le permite describir la estructura de los datos que desea encontrar mediante la sintaxis visual intuitiva. En lugar de combinar tablas, se escriben patrones que parecen las propias relaciones: nodos conectados por bordes. En este artículo se muestra cómo escribir consultas de patrones GQL para escenarios comunes en el grafo en Microsoft Fabric.

En los ejemplos se usa el conjunto de datos de ejemplo de red social. Para obtener una referencia de sintaxis de patrón completa, consulte Patrones de grafos de GQL.

Prerequisites

  • Un elemento de grafo con datos cargados. Si no está familiarizado con el grafo, complete primero el tutorial .
  • Familiaridad con las consultas de MATCH y RETURN básicas. Consulte la guía del lenguaje GQL.

Coincidencia de relaciones directas

Un patrón básico coincide con un tipo de nodo, un tipo perimetral específico y otro tipo de nodo. La sintaxis es similar a un diagrama de la relación.

Por ejemplo, para encontrar hasta 100 personas emparejadas con la empresa en la que trabajan:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

Use un patrón de borde no direccionado cuando no sepa o no le interese la dirección. Por ejemplo, para buscar hasta 100 conocidos mutuos independientemente de quién inició la conexión:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

Actualmente, el grafo no admite la creación de aristas no dirigidas, pero puede consultar aristas en cualquier dirección mediante la sintaxis -[:label]-.

Filtrar patrones con WHERE insertado

Coloque WHERE dentro del patrón para filtrar nodos y bordes a medida que coincidan. Este enfoque es más eficaz que filtrar a posteriori.

Por ejemplo, para buscar personas nacidas antes de 1990 que trabajan en una empresa cuyo nombre comienza por "A":

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

Filtre por las propiedades perimetrales para restringir qué relaciones coinciden. Por ejemplo, para mostrar solo a las personas que comenzaron a trabajar en una empresa en 2010 o posteriormente:

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

Coincidencia de relaciones de varios saltos

Use patrones de longitud variable para recorrer varios saltos en una expresión. Especifique el número mínimo y máximo de saltos con {min,max} sintaxis.

Por ejemplo, para encontrar hasta 100 personas accesibles dentro de dos a cuatro grados de amistad de Alice:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Para encontrar hasta 100 conexiones inmediatas y de segundo grado (uno o dos saltos) de Alice:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

Control del recorrido con modos de recorrido

De forma predeterminada, GQL usa el TRAIL modo, lo que impide que la misma arista se recorra más de una vez. Usa los modos de ruta explícitamente cuando necesites diferentes garantías.

Modo de ruta Comportamiento Use cuando...
WALK Permite nodos y bordes repetidos Quiere un recorrido sin restricciones. Rara vez es necesario; principalmente útil para consultas exploratorias.
TRAIL Sin bordes repetidos (valor predeterminado) Quiere evitar volver a rastrear la misma relación, pero el mismo nodo puede aparecer a través de relaciones diferentes. Funciona bien para la mayoría de las consultas transversales.
SIMPLE No se permiten nodos repetidos, salvo al inicio y al fin. Quieres que ningún nodo aparezca más de una vez en medio de un camino, pero permite que los caminos se cierren y regresen al inicio. Resulta útil para detectar bucles.
ACYCLIC No hay nodos repetidos en absoluto Debe garantizar que ningún nodo aparezca en ninguna parte del camino más de una vez. Se usa para jerarquías estrictas, linaje o cualquier recorrido en el que volver a visitar un nodo produciría resultados incorrectos.

WALK es el modo más permisivo y ACYCLIC es el más restrictivo. TRAIL es el valor predeterminado y funciona bien para la mayoría de las consultas. Use un modo más restrictivo solo cuando el caso de uso lo requiera.

Para ilustrar la diferencia, considere la ruta alice → Bob → Carol → Bob:

  • WALK : permite esta ruta de acceso. Los nodos y los bordes pueden repetirse libremente.
  • TRAIL : permite esta ruta de acceso. Bob aparece dos veces, pero cada borde usado es una relación diferente (Alice→Bob y Carol→Bob son bordes distintos), por lo que no se repite ningún borde.
  • SIMPLE : bloquea esta ruta de acceso. Bob aparece más de una vez y SIMPLE solo permite repetir un nodo si es tanto el inicio como el final del camino (un ciclo cerrado). Aquí Alice es el principio y Bob es el final, por lo que no se aplica ninguna excepción.
  • ACÍCLICO — bloquea esta trayectoria. Bob aparece más de una vez en cualquier parte de la ruta de acceso.

En el ejemplo siguiente se muestra cómo usar TRAIL para contar cuántas rutas de acceso distintas conducen a cada una de las primeras 100 personas a las que se puede acceder en la red de Alice en cuatro saltos:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

Use ACYCLIC para devolver hasta 100 personas accesibles desde Alice dentro de cuatro saltos, donde cada persona en el camino es única:

MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Sugerencia

Para gráficos grandes, establezca siempre un límite superior en los patrones de longitud variable ({1,4} en lugar de {1,}). La travesía sin restricciones a través de gráficos densos puede alcanzar los límites de tiempo de espera de consulta. Consulte Limitaciones actuales.

Uso de la reutilización de variables para expresar entidades compartidas

La reutilización de la misma variable en dos partes de un patrón crea una restricción de igualdad implícita: ambas referencias deben coincidir con el mismo nodo. Esta técnica le permite expresar "buscar entidades conectadas a través de una tercera entidad compartida".

Por ejemplo, para encontrar hasta 100 pares de personas que se conocen entre sí y trabajan en la misma empresa:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

La variable c se reutiliza para ambos workAt destinos, por lo que la consulta solo devuelve pares en los que ambas personas se conocen entre sí y trabajan en la misma empresa.

Para encontrar hasta 100 pares de personas a las que les gustó la misma publicación:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Sugerencia

La WHERE a.id < b.id condición impide que los pares duplicados (Alice + Bob y Bob + Alice) aparezcan en los resultados.

Combinar varios patrones

Enumere varios patrones en un único MATCH, separados por comas. Todos los patrones deben compartir al menos una variable para que se unan correctamente.

Por ejemplo, para encontrar hasta 100 personas junto con su lugar de trabajo y la ciudad en la que viven:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

La variable p compartida conecta los dos patrones. Cada fila de resultados representa a una persona con su empresa y ciudad.

Coincidencia de relaciones opcionales

Use OPTIONAL MATCH cuando es posible que una relación no exista para cada nodo. Las filas sin coincidencia se conservan con NULL valores similares a sql LEFT JOIN.

Por ejemplo, devuelva hasta 100 personas con su nombre de empresa, incluidas las personas sin empleador (es decir, que devuelven NULL para la columna de la empresa):

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

Usa IS NULL después de OPTIONAL MATCH para encontrar hasta 100 personas que no trabajan en ninguna empresa.

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100