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

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Especifica um critério de pesquisa para um gráfico.Specifies a search condition for a graph. MATCH pode ser usado apenas com tabelas de nó de gráfico e borda, na instrução SELECT como parte da cláusula WHERE.MATCH can be used only with graph node and edge tables, in the SELECT statement as part of WHERE clause.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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 o padrão a ser pesquisado ou o caminho a ser percorrido no gráfico.Specifies the pattern to search or path to traverse in the graph. Esse padrão usa a sintaxe de arte ASCII para percorrer um caminho no gráfico.This pattern uses ASCII art syntax to traverse a path in the graph. O padrão varia de um nó para outro por meio de uma borda, na direção da seta fornecida.The pattern goes from one node to another via an edge, in the direction of the arrow provided. Os nomes de borda ou aliases são fornecidos em parênteses.Edge names or aliases are provided inside parentheses. Os nomes de nó ou os aliases são exibidos nas duas extremidades da seta.Node names or aliases appear at the two ends of the arrow. A seta pode apontar para qualquer direção no padrão.The arrow can go in either direction in the pattern.

node_aliasnode_alias
Nome ou alias de uma tabela de nó fornecida na cláusula FROM.Name or alias of a node table provided in the FROM clause.

edge_aliasedge_alias
Nome ou alias de uma tabela de borda fornecida na cláusula FROM.Name or alias of an edge table provided in the FROM clause.

SHORTEST_PATH SHORTEST_PATH
A função de caminho mais curta é usada para localizar o caminho mais curto entre dois nós ou entre um determinado nó e todos os outros nós em um gráfico.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. Ela usa como entrada um padrão de comprimento arbitrário que é pesquisado repetidamente em um gráfico.It takes an arbitrary length pattern as input, that is searched repeatedly in a graph.

arbitrary_length_match_patternarbitrary_length_match_pattern
Especifica os nós e bordas que precisam ser atravessadas repetidamente até atingir o nó desejado ou o número máximo de iterações, conforme especificado no padrão for atendido.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
O padrão de comprimento arbitrário considera quantificadores padrão de estilo de expressão regular para especificar o número de vezes que um padrão de pesquisa fornecido é repetido.The arbitrary length pattern takes regular expression style pattern quantifiers in order to specify the number of times a given search pattern is repeated. Os quantificadores padrão de pesquisa compatíveis são:The supported search pattern quantifiers are:

  • + : Repete o padrão por 1 ou mais vezes.+: Repeat the pattern 1 or more times. É encerrado assim que encontra um caminho mais curto.Terminate as soon as a shortest path is found.
  • {1,n} : repete o padrão 1 por “n” horas.{1,n}: Repeat the pattern 1 to ‘n’ times. É encerrado assim que encontra um caminho mais curto.Terminate as soon as a shortest path is found.

RemarksRemarks

Os nomes de nó dentro de MATCH podem ser repetidos.The node names inside MATCH can be repeated. Em outras palavras, um nó pode ser percorrido um número arbitrário de vezes na mesma consulta.In other words, a node can be traversed an arbitrary number of times in the same query.
Um nome de borda não pode ser repetido dentro de MATCH.An edge name cannot be repeated inside MATCH.
Uma borda pode apontar para qualquer direção, mas deve ter uma direção explícita.An edge can point in either direction, but it must have an explicit direction.
Os operadores OR ou NOT não são compatíveis com o padrão MATCH.OR and NOT operators are not supported in the MATCH pattern. MATCH pode ser combinado com outras expressões usando AND na cláusula WHERE.MATCH can be combined with other expressions using AND in the WHERE clause. No entanto, não há suporte para a combinação dele com outras expressões usando OR ou NOT.However, combining it with other expressions using OR or NOT is not supported.

ExemplosExamples

A.A. Encontrar um amigoFind a friend

O exemplo a seguir cria uma tabela de nó Person e a tabela de Borda friends, insere alguns dados e, em seguida, usa MATCH para encontrar amigos de Alice, uma pessoa no 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. Encontrar um amigo de um amigoFind friend of a friend

O exemplo a seguir tenta encontrar um amigo de um 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. Mais padrões de MATCHMore MATCH patterns

Estas são algumas outras maneiras pelas quais um padrão pode ser especificado dentro de 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 TambémSee Also

CREATE TABLE (SQL Graph) CREATE TABLE (SQL Graph)
INSERT (SQL Graph)]INSERT (SQL Graph)]
Processamento de grafo com o SQL Server 2017Graph processing with SQL Server 2017