MATCH (Transact-SQL)MATCH (Transact-SQL)

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Especifica una condición de búsqueda para un gráfico.Specifies a search condition for a graph. MATCH puede usarse solo con tablas perimetrales o de nodo del gráfico, en la instrucción SELECT y como parte de la cláusula WHERE.MATCH can be used only with graph node and edge tables, in the SELECT statement as part of WHERE clause.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

MATCH (<graph_search_pattern>)

<graph_search_pattern>::=
  {  
      <simple_match_pattern> 
    | <arbitrary_length_match_pattern>  
    | <arbitrary_length_match_last_node_predicate> 
  }

<simple_match_pattern>::=
  {
      LAST_NODE(<node_alias>) | <node_alias>   { 
          { <-( <edge_alias> )- } 
        | { -( <edge_alias> )-> }
        <node_alias> | LAST(<node_alias>)
        } 
  }
  [ { AND } { ( <simple_match_pattern> ) } ]
  [ ,...n ]

<node_alias> ::=
  node_table_name | node_table_alias 

<edge_alias> ::=
  edge_table_name | edge_table_alias


<arbitrary_length_match_pattern>  ::=
  { 
    SHORTEST_PATH( 
      <arbitrary_length_pattern> 
      [ { AND } { <arbitrary_length_pattern> } ] 
      [ ,…n] 
    )
  } 

<arbitrary_length_match_last_node_predicate> ::=
  {  LAST_NODE( <node_alias> ) = LAST_NODE( <node_alias> ) }


<arbitrary_length_pattern> ::=
    {  LAST_NODE( <node_alias> )   | <node_alias>
     ( <edge_first_al_pattern> [<edge_first_al_pattern>…,n] )
     <al_pattern_quantifier> 
  }
    |  ( {<node_first_al_pattern> [<node_first_al_pattern> …,n] )
        <al_pattern_quantifier> 
        LAST_NODE( <node_alias> ) | <node_alias> 
 }
    
<edge_first_al_pattern> ::=
  { (  
        { -( <edge_alias> )->   } 
      | { <-( <edge_alias> )- } 
      <node_alias>
      ) 
  } 

<node_first_al_pattern> ::=
  { ( 
      <node_alias> 
        { <-( <edge_alias> )- } 
      | { -( <edge_alias> )-> }
      ) 
  } 


<al_pattern_quantifier> ::=
  {
        +
      | { 1 , n }
  }

n -  positive integer only.
 

ArgumentosArguments

graph_search_patterngraph_search_pattern
Especifica el patrón que buscar o la ruta de acceso que atravesar en el gráfico.Specifies the pattern to search or path to traverse in the graph. Este patrón usa sintaxis de arte ASCII para atravesar una ruta de acceso en el gráfico.This pattern uses ASCII art syntax to traverse a path in the graph. El patrón va de un nodo a otro a través de un borde, en la dirección de la flecha proporcionada.The pattern goes from one node to another via an edge, in the direction of the arrow provided. Los nombres o alias de borde se suministran entre paréntesis.Edge names or aliases are provided inside parentheses. Los nombres o alias de nodo aparecen en los dos extremos de la flecha.Node names or aliases appear at the two ends of the arrow. La flecha puede ir en ambas direcciones en el patrón.The arrow can go in either direction in the pattern.

node_aliasnode_alias
Nombre o alias de una tabla de nodo que se proporciona en la cláusula FROM.Name or alias of a node table provided in the FROM clause.

edge_aliasedge_alias
Nombre o alias de una tabla perimetral que se proporciona en la cláusula FROM.Name or alias of an edge table provided in the FROM clause.

SHORTEST_PATH SHORTEST_PATH
La función de ruta de acceso más corta se usa para encontrar la ruta más corta entre dos nodos dados de un grafo o entre un nodo dado y todos los demás nodos del grafo.Shortest path function is used to find shortest path between two given nodes in a graph or between a given node and all the other nodes in a graph. Esta función toma como entrada un patrón de longitud arbitraria, que se busca varias veces en un grafo.It takes an arbitrary length pattern as input, that is searched repeatedly in a graph.

arbitrary_length_match_patternarbitrary_length_match_pattern
Especifica los nodos y bordes que se deben recorrer repetidamente hasta que se alcance el nodo deseado o hasta que se cumpla el número máximo de iteraciones especificadas en el patrón.Specifies the nodes and edges that must be traversed repeatedly until the desired node is reached or until the maximum number of iterations as specified in the pattern is met.

al_pattern_quantifier al_pattern_quantifier
El patrón de longitud arbitraria toma los cuantificadores del patrón de estilo de expresión regular para especificar el número de veces que se repite un patrón de búsqueda dado.The arbitrary length pattern takes regular expression style pattern quantifiers in order to specify the number of times a given search pattern is repeated. Los cuantificadores de patrón de búsqueda admitidos son:The supported search pattern quantifiers are:

  • + : repite el patrón una o más veces.+: Repeat the pattern 1 or more times. Finaliza en cuanto encuentra una ruta de acceso más corta.Terminate as soon as a shortest path is found.
  • {1, n} : repite el patrón de 1 a "n" veces.{1,n}: Repeat the pattern 1 to ‘n’ times. Finaliza en cuanto encuentra una ruta de acceso más corta.Terminate as soon as a shortest path is found.

NotasRemarks

Los nombres de nodo dentro de MATCH se pueden repetir.The node names inside MATCH can be repeated. Dicho de otro, un nodo se puede atravesar un número arbitrario de veces en la misma consulta.In other words, a node can be traversed an arbitrary number of times in the same query.
Los nombres de borde no se pueden repetir dentro de MATCH.An edge name cannot be repeated inside MATCH.
Un borde puede apuntar a cualquier dirección, pero debe tener una dirección explícita.An edge can point in either direction, but it must have an explicit direction.
Los operadores OR y NOT no se pueden usar en el patrón MATCH.OR and NOT operators are not supported in the MATCH pattern. MATCH se puede combinar con otras expresiones por medio de AND en la cláusula WHERE,MATCH can be combined with other expressions using AND in the WHERE clause. pero esto no es posible con los operadores OR ni NOT.However, combining it with other expressions using OR or NOT is not supported.

EjemplosExamples

A.A. Buscar un amigoFind a friend

En el siguiente ejemplo se crea una tabla de nodos Person y una tabla perimetral friend, se insertan algunos datos y, tras ello, se usa MATCH para encontrar amigos de Alice, una persona del gráfico.The following example creates a Person node table and friends Edge table, inserts some data and then uses MATCH to find friends of Alice, a person in the graph.

-- Create person node table
CREATE TABLE dbo.Person (ID integer PRIMARY KEY, name varchar(50)) AS NODE;
CREATE TABLE dbo.friend (start_date DATE) AS EDGE;

-- Insert into node table
INSERT INTO dbo.Person VALUES (1, 'Alice');
INSERT INTO dbo.Person VALUES (2,'John');
INSERT INTO dbo.Person VALUES (3, 'Jacob');

-- Insert into edge table
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
       (SELECT $node_id FROM dbo.Person WHERE name = 'John'), '9/15/2011');

INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
       (SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2011');

INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'John'),
       (SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2012');

-- use MATCH in SELECT to find friends of Alice
SELECT Person2.name AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person1-(friend)->Person2)
AND Person1.name = 'Alice';

B.B. Buscar un amigo de un amigoFind friend of a friend

En el siguiente ejemplo se intenta encontrar un amigo de un amigo de Alice.The following example tries to find friend of a friend of Alice.

SELECT Person3.name AS FriendName 
FROM Person Person1, friend, Person Person2, friend friend2, Person Person3
WHERE MATCH(Person1-(friend)->Person2-(friend2)->Person3)
AND Person1.name = 'Alice';

C.C. Más patrones de MATCHMore MATCH patterns

Aquí encontrará algunas formas más en las que se puede especificar un patrón en MATCH.Following are some more ways in which a pattern can be specified inside MATCH.

-- Find a friend
   SELECT Person2.name AS FriendName
   FROM Person Person1, friend, Person Person2
   WHERE MATCH(Person1-(friend)->Person2);
   
-- The pattern can also be expressed as below

   SELECT Person2.name AS FriendName
   FROM Person Person1, friend, Person Person2 
   WHERE MATCH(Person2<-(friend)-Person1);


-- Find 2 people who are both friends with same person
   SELECT Person1.name AS Friend1, Person2.name AS Friend2
   FROM Person Person1, friend friend1, Person Person2, 
        friend friend2, Person Person0
   WHERE MATCH(Person1-(friend1)->Person0<-(friend2)-Person2);
   
-- this pattern can also be expressed as below

   SELECT Person1.name AS Friend1, Person2.name AS Friend2
   FROM Person Person1, friend friend1, Person Person2, 
        friend friend2, Person Person0
   WHERE MATCH(Person1-(friend1)->Person0 AND Person2-(friend2)->Person0);

Consulte tambiénSee Also

CREATE TABLE (SQL Graph) CREATE TABLE (SQL Graph)
INSERT (SQL Graph)]INSERT (SQL Graph)]
Graph processing with SQL Server 2017 (Procesamiento de gráficos con SQL Server 2017)Graph processing with SQL Server 2017