Referência de linguagem de consulta do Azure Digital Twins: cláusula MATCH
Este documento contém informações de referência sobre a cláusula MATCH para a linguagem de consulta dos Gêmeos Digitais do Azure.
A MATCH
cláusula é usada na linguagem de consulta do Azure Digital Twins como parte da cláusula FROM. MATCH
permite especificar qual padrão deve ser seguido ao percorrer relacionamentos no gráfico de Gêmeos Digitais do Azure (isso também é conhecido como um padrão de consulta de "salto variável").
Esta cláusula é opcional durante a consulta.
Sintaxe principal: MATCH
MATCH
suporta qualquer consulta que encontre um caminho entre gêmeos dentro de um intervalo de saltos, com base em determinadas condições de relacionamento.
A condição de relacionamento pode incluir um ou mais dos seguintes detalhes:
- Direção do relacionamento (da esquerda para a direita, da direita para a esquerda ou não direcional)
- nome do relacionamento (nome único ou uma lista de possibilidades)
- Número de "lúpulos" de um gémeo para outro (número exato ou intervalo)
- Uma atribuição de variável de consulta para representar a relação dentro do texto da consulta. Isso também permitirá que você filtre as propriedades de relacionamento.
Uma consulta com uma MATCH
cláusula também deve usar a cláusula WHERE para especificar o $dtId
para pelo menos um dos gêmeos aos quais ela faz referência.
Nota
MATCH
é um superconjunto de todas as JOIN
consultas que podem ser executadas no repositório de consultas.
Sintaxe
Aqui está a sintaxe básica MATCH
.
Ele contém estes espaços reservados:
twin_or_twin_collection
(x2): AMATCH
cláusula requer um operando para representar um único gêmeo. O outro operando pode representar outro gêmeo solteiro, ou uma coleção de gêmeos.relationship_condition
: Neste espaço, defina uma condição que descreva a relação entre as coleções de gêmeos ou gêmeos. A condição pode especificar a direção do relacionamento, especificar o nome do relacionamento, especificar o número de saltos, especificar propriedades do relacionamento ou qualquer combinação dessas opções.twin_ID
: Aqui, especifique um$dtId
dentro de uma das coleções de gêmeos para que um dos operandos represente um único gêmeo.
--SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_condition]-(twin_or_twin_collection_2)
WHERE twin_or_twin_collection.$dtId = 'twin_ID'
-- AND ...
Você pode deixar uma das coleções de gêmeos em branco para permitir que qualquer gêmeo trabalhe nesse local.
Você também pode alterar o número de condições de relacionamento, para ter várias condições de relacionamento encadeadas ou nenhuma condição de relacionamento:
--Chained relationship conditions
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_condition]-(twin_or_twin_collection_2)-[relationship_condition]-(twin_or_twin_collection_3)...
WHERE twin_or_twin_collection.$dtId = 'twin_ID'
-- No relationship condition
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)
WHERE twin_or_twin_collection.$dtId = 'twin_ID'
Para obter mais detalhes sobre cada tipo de condição de relacionamento e como combiná-los, consulte as outras seções deste documento.
Exemplo
Aqui está um exemplo de consulta usando MATCH
o .
A consulta especifica uma direção de relacionamento e procura por gêmeos Building e Sensor onde...
- o Sensor é alvo de qualquer relação de um Edifício twin com um
$dtId
de Building21, e - o sensor tem uma temperatura acima de 50. O Edifício e o Sensor estão incluídos no resultado da consulta.
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[]->(Sensor)
WHERE Building.$dtId = 'Building21' AND Sensor.temperature > 50
Especificar a direção do relacionamento
Use a condição de relacionamento na MATCH
cláusula para especificar uma direção de relacionamento entre os gêmeos. As direções possíveis incluem da esquerda para a direita, da direita para a esquerda ou não direcional. As relações cíclicas são detetadas automaticamente, de modo que uma relação é percorrida apenas uma vez.
Nota
É possível representar relações bidirecionais usando encadeamento.
Sintaxe
Nota
Os exemplos nesta seção se concentram na direção do relacionamento. Eles não especificam nomes de relacionamentos, usam como padrão um único salto e não atribuem variáveis de consulta aos relacionamentos. Para obter instruções sobre como fazer mais com essas outras condições, consulte Especificar nome do relacionamento, Especificar número de saltos e Atribuir variável de consulta ao relacionamento. Para obter informações sobre como usar vários deles juntos na mesma consulta, consulte Combinar operações MATCH.
As descrições de relacionamento direcional usam uma representação visual de uma seta para indicar a direção do relacionamento. A seta inclui um espaço reservado por colchetes ([]
) para um nome de relacionamento opcional.
Esta seção mostra a sintaxe para diferentes direções de relacionamentos. Os valores de espaço reservado que devem ser substituídos pelos seus valores são source_twin_or_twin_collection
e target_twin_or_twin_collection
.
Para uma relação da esquerda para a direita , use a sintaxe a seguir.
-- SELECT ... FROM ...
MATCH (source_twin_or_twin_collection)-[]->(target_twin_or_twin_collection)
-- WHERE ...
Para uma relação da direita para a esquerda , use a sintaxe a seguir.
-- SELECT ... FROM ...
MATCH (target_twin_or_twin_collection)<-[]-(source_twin_or_twin_collection)
-- WHERE ...
Para uma relação não direcional , use a sintaxe a seguir. Isso não especificará uma direção para o relacionamento, portanto, relacionamentos de qualquer direção serão incluídos no resultado.
-- SELECT ... FROM ...
MATCH (source_twin_or_twin_collection)-[]-(target_twin_or_twin_collection)
-- WHERE ...
Gorjeta
As consultas não direcionais exigem processamento adicional, o que pode resultar em maior latência e custo.
Exemplos
O primeiro exemplo mostra uma travessia direcional da esquerda para a direita. Esta consulta encontra gémeos Quarto e Fábrica onde...
- Sala de alvos Factory (com qualquer nome de relacionamento)
- O quarto tem um valor de temperatura superior a 50
- Fábrica tem um
$dtId
de 'ABC'
SELECT Room, Factory FROM DIGITALTWINS MATCH (Room)-[]->(Factory)
WHERE Room.temperature > 50 AND Factory.$dtId = 'ABC'
Nota
As consultas MATCH que contêm $dtId
filtros em qualquer gêmeo diferente do gêmeo inicial para a travessia MATCH podem mostrar resultados vazios. Isto aplica-se ao factory.$dtId
exemplo acima. Para obter mais informações, consulte Limitações.
O exemplo a seguir mostra uma travessia direcional da direita para a esquerda. Esta consulta é semelhante à anterior, mas a direção da relação entre Sala e Fábrica é invertida. Esta consulta encontra gémeos Quarto e Fábrica onde...
- Sala de alvos de fábrica (com qualquer nome de relacionamento)
- Fábrica tem um
$dtId
de 'ABC' - O quarto tem um valor de temperatura superior a 50
SELECT Room, Factory FROM DIGITALTWINS MATCH (Room)<-[]-(Factory)
WHERE Factory.$dtId = 'ABC' AND Room.temperature > 50
O exemplo a seguir mostra uma travessia não direcional. Esta consulta encontra gémeos Quarto e Fábrica onde...
- Sala e Fábrica compartilham qualquer nome de relacionamento, indo em qualquer direção
- Fábrica tem um
$dtId
de 'ABC' - O quarto tem um valor de humidade superior a 70
SELECT Factory, Room FROM DIGITALTWINS MATCH (Factory)-[]-(Room)
WHERE Factory.$dtId ='ABC' AND Room.humidity > 70
Especificar nome da relação
Opcionalmente, você pode usar a condição de relacionamento na MATCH
cláusula para especificar nomes para as relações entre os gêmeos. Você pode especificar um único nome ou uma lista de nomes possíveis. O nome de relacionamento opcional é incluído como parte da sintaxe de seta para especificar a direção do relacionamento.
Se você não fornecer um nome de relacionamento, a consulta incluirá todos os nomes de relacionamento por padrão.
Gorjeta
Especificar nomes de relacionamento na consulta pode melhorar o desempenho e tornar os resultados mais previsíveis.
Sintaxe
Nota
Os exemplos nesta seção se concentram no nome do relacionamento. Todos eles mostram relações não direcionais, usam como padrão um único salto e não atribuem variáveis de consulta aos relacionamentos. Para obter instruções sobre como fazer mais com essas outras condições, consulte Especificar a direção do relacionamento, Especificar o número de saltos e Atribuir variável de consulta ao relacionamento. Para obter informações sobre como usar vários deles juntos na mesma consulta, consulte Combinar operações MATCH.
Especifique o nome de uma relação a ser transversal na MATCH
cláusula entre colchetes ([]
), após dois pontos (:
). Esta seção mostra a sintaxe da especificação de relações nomeadas.
Para um único nome, use a sintaxe a seguir. Os valores de espaço reservado que devem ser substituídos pelos seus valores são twin_or_twin_collection_1
, relationship_name
e twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[:relationship_name]-(twin_or_twin_collection_2)
-- WHERE ...
Para vários nomes possíveis, use a sintaxe a seguir. Os valores de espaço reservado que devem ser substituídos por seus valores são twin_or_twin_collection_1
, relationship_name_option_1
, relationship_name_option_2
, twin_or_twin_collection_2
e a nota para continuar o padrão conforme necessário para o número de nomes de relacionamento que você deseja inserir.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[:relationship_name_option_1|relationship_name_option_2|continue pattern as needed...]-(twin_or_twin_collection_2)
-- WHERE ...
Importante
Os dois pontos (:
) entre colchetes são uma parte necessária da sintaxe para especificar um nome de relacionamento em uma MATCH
consulta. Se você não incluir os dois pontos, sua consulta não especificará um nome de relacionamento. Em vez disso, você tem uma consulta que atribui uma variável de consulta à relação.
(Padrão) Para deixar o nome não especificado, deixe os colchetes vazios de informações de nome, desta forma:
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[]-(twin_or_twin_collection_2)
-- WHERE ...
Exemplos
O exemplo a seguir mostra um único nome de relacionamento. Esta consulta encontra gémeos Edifício e Sensor onde...
- O edifício tem uma relação "contém" com o Sensor (indo em qualquer direção)
- Edifício tem um
$dtId
de 'Seattle21'
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[:contains]-(Sensor)
WHERE Building.$dtId = 'Seattle21'
O exemplo a seguir mostra vários nomes de relacionamento possíveis. Esta consulta é semelhante à anterior, mas há vários nomes de relacionamento possíveis que são incluídos no resultado. Esta consulta encontra gémeos Edifício e Sensor onde...
- O edifício tem uma relação 'contém' ou 'isAssociatedWith' com o Sensor (indo em qualquer direção)
- Edifício tem um
$dtId
de 'Seattle21'
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[:contains|isAssociatedWith]-(Sensor)
WHERE building.$dtId = 'Seattle21'
O exemplo a seguir não tem um nome de relacionamento especificado. Como resultado, as relações com qualquer nome serão incluídas no resultado da consulta. Esta consulta encontra gémeos Edifício e Sensor onde...
- Building tem uma relação com o Sensor com qualquer nome (e indo em qualquer direção)
- Edifício tem um
$dtId
de 'Seattle21'
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building-[]-(Sensor)
WHERE Building.$dtId = 'Seattle21'
Especificar o número de lúpulos
Opcionalmente, você pode usar a condição de relacionamento na MATCH
cláusula para especificar o número de saltos para as relações entre os gêmeos. Você pode especificar um número exato ou um intervalo. Esse valor opcional é incluído como parte da sintaxe de seta para especificar a direção da relação.
Se você não fornecer um número de saltos, a consulta será padronizada para um salto.
Importante
Se você especificar um número de saltos maior que um, não poderá atribuir uma variável de consulta à relação. Apenas uma dessas condições pode ser usada dentro da mesma consulta.
Sintaxe
Nota
Os exemplos nesta secção centram-se no número de lúpulos. Todos eles mostram relações não direcionais sem especificar nomes. Para obter instruções sobre como fazer mais com essas outras condições, consulte Especificar direção do relacionamento e Especificar nome do relacionamento. Para obter informações sobre como usar vários deles juntos na mesma consulta, consulte Combinar operações MATCH.
Especifique o número de lúpulos a percorrer na MATCH
cláusula entre parênteses retos ([]
).
Para especificar um número exato de saltos, use a sintaxe a seguir. Os valores de espaço reservado que devem ser substituídos pelos seus valores são twin_or_twin_collection_1
, number_of_hops
e twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*number_of_hops]-(twin_or_twin_collection_2)
-- WHERE ...
Para especificar um intervalo de lúpulos, use a sintaxe a seguir. Os valores de espaço reservado que devem ser substituídos pelos seus valores são twin_or_twin_collection_1
, starting_limit
ending_limit
e twin_or_twin_collection_2
. O limite inicial não está incluído no intervalo, enquanto o limite final está incluído.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*starting_limit..ending_limit]-(twin_or_twin_collection_2)
-- WHERE ...
Você também pode deixar de fora o limite inicial para indicar "qualquer coisa até" (e incluindo) o limite final. Deve ser sempre previsto um limite final.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*..ending_limit]-(twin_or_twin_collection_2)
-- WHERE ...
(Padrão) Para usar como padrão um salto, deixe os colchetes vazios de informações de salto, da seguinte forma:
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[]-(twin_or_twin_collection_2)
-- WHERE ...
Exemplos
O exemplo a seguir especifica um número exato de lúpulos. A consulta só retornará relações entre gêmeos Floor e Room que são exatamente 3 saltos.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*3]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
O exemplo a seguir especifica um intervalo de lúpulos. A consulta retornará relações entre gêmeos Floor e Room que estão entre 1 e 3 saltos (o que significa que o número de saltos é 2 ou 3).
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*1..3]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
Você também pode mostrar um intervalo fornecendo apenas um limite. No exemplo a seguir, a consulta retornará relações entre gêmeos Floor e Room que são, no máximo, 2 saltos (o que significa que o número de saltos é 1 ou 2).
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*..2]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
O exemplo a seguir não tem um número especificado de saltos, portanto, o padrão será um salto entre os gêmeos Floor e Room.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
Atribuir variável de consulta ao relacionamento (e especificar propriedades de relacionamento)
Opcionalmente, você pode atribuir uma variável de consulta à relação referenciada na cláusula, para MATCH
que possa fazer referência a ela pelo nome no texto da consulta.
Um resultado útil de fazer isso é a capacidade de filtrar as propriedades de relacionamento em sua WHERE
cláusula.
Importante
A atribuição de uma variável de consulta à relação só é suportada quando a consulta especifica um único salto. Em uma consulta, você deve escolher entre especificar uma variável de relacionamento e especificar um número maior de saltos.
Sintaxe
Nota
Os exemplos nesta seção se concentram em uma variável de consulta para a relação. Todos eles mostram relações não direcionais sem especificar nomes. Para obter instruções sobre como fazer mais com essas outras condições, consulte Especificar direção do relacionamento e Especificar nome do relacionamento. Para obter informações sobre como usar vários deles juntos na mesma consulta, consulte Combinar operações MATCH.
Para atribuir uma variável de consulta à relação, coloque o nome da variável entre colchetes ([]
). Os valores de espaço reservado mostrados abaixo que devem ser substituídos pelos seus valores são twin_or_twin_collection_1
, relationship_variable
e twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_variable]-(twin_or_twin_collection_2>)
-- WHERE ...
Exemplos
O exemplo a seguir atribui uma variável de consulta 'Rel' à relação. Mais tarde, na WHERE
cláusula, ele usa a variável para especificar que a relação Rel deve ter uma propriedade name com um valor de 'filho'.
SELECT Floor,Cafe, Rel DIGITALTWINS
MATCH (Floor)-[Rel]-(Cafe)
WHERE Floor.$dtId = 'thermostat-15' AND Rel.name = 'child'
Combinar operações MATCH
Você pode combinar várias condições de relacionamento na mesma consulta. Você também pode encadear várias condições de relacionamento para expressar relações bidirecionais ou outras combinações maiores.
Sintaxe
Em uma única consulta, você pode combinar a direção do relacionamento, o nome do relacionamento e um dos números de saltos ou uma atribuição de variável de consulta.
Os exemplos de sintaxe a seguir mostram como esses atributos podem ser combinados. Você também pode deixar de fora qualquer um dos detalhes opcionais mostrados nos espaços reservados para omitir essa parte da condição.
Para especificar a direção da relação, o nome da relação e o número de saltos em uma única consulta, use a sintaxe a seguir dentro da condição de relacionamento. Os valores de espaço reservado que devem ser substituídos pelos seus valores são e , e optional_right_angle_bracket
, e , relationship_name(s)
e number_of_hops
. optional_left_angle_bracket
twin_or_twin_collection_2
twin_or_twin_collection_1
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)optional_left_angle_bracket-[:relationship_name(s)*number_of_hops]-optional_right_angle_bracket(twin_or_twin_collection_2)
-- WHERE
Para especificar a direção do relacionamento, o nome do relacionamento e uma variável de consulta para o relacionamento em uma única consulta, use a sintaxe a seguir dentro da condição de relacionamento. Os valores de espaço reservado que devem ser substituídos pelos seus valores são e , e optional_right_angle_bracket
, e , relationship_variable
e relationship_name(s)
. optional_left_angle_bracket
twin_or_twin_collection_2
twin_or_twin_collection_1
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)optional_left_angle_bracket-[relationship_variable:relationship_name(s)]-optional_right_angle_bracket(twin_or_twin_collection_2)
-- WHERE
Nota
De acordo com as opções para especificar a direção da relação, você deve escolher entre um colchete angular esquerdo para uma relação da esquerda para a direita ou um colchete angular direito para uma relação da direita para a esquerda. Não é possível incluir ambos na mesma seta, mas pode representar relações bidirecionais encadeamento.
Você pode encadear várias condições de relacionamento juntas, como esta. Os valores de espaço reservado que devem ser substituídos pelos seus valores são twin_or_twin_collection_1
, todas as instâncias de relationship_condition
, e twin_or_twin_collection_2
.
--Chained relationship conditions
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_condition]-(twin_or_twin_collection_2)-[relationship_condition]-(twin_or_twin_collection_3)...
WHERE twin_or_twin_collection.$dtId = 'twin_ID'
Exemplos
Aqui está um exemplo que combina a direção do relacionamento, o nome do relacionamento e o número de saltos. A consulta a seguir localiza os gêmeos Andar e Quarto onde a relação entre Piso e Quarto atende a estas condições:
- a relação é da esquerda para a direita, com Floor como fonte e Room como alvo
- a relação tem um nome de 'contém' ou 'isAssociatedWith'
- a relação tem 4 ou 5 lúpulos
A consulta também especifica que o piso duplo tem um $dtId
de 'termostato-15'.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[:contains|isAssociatedWith*3..5]->(Room)
WHERE Floor.$dtId = 'thermostat-15'
Veja um exemplo que combina a direção do relacionamento, o nome do relacionamento e uma variável de consulta nomeada para o relacionamento. A consulta a seguir localiza os gêmeos Andar e Quarto onde a relação entre Andar e Sala é atribuída a uma variável r
de consulta e atende a estas condições:
- a relação é da esquerda para a direita, com Floor como fonte e Room como alvo
- a relação tem um nome de 'contém' ou 'isAssociatedWith'
- A relação, à qual é dada uma variável
r
de consulta, tem uma propriedade length igual a 10
A consulta também especifica que o piso duplo tem um $dtId
de 'termostato-15'.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[r:contains|isAssociatedWith]->(Room)
WHERE Floor.$dtId = 'thermostat-15' AND r.length = 10
O exemplo a seguir ilustra condições de relacionamento encadeado . A consulta encontra gêmeos Andar, Café e Quarto, onde...
- a relação entre Piso e Sala satisfaz estas condições:
- a relação é da esquerda para a direita, com Floor como fonte e Cafe como alvo
- a relação tem um nome de 'contém' ou 'isAssociatedWith'
- A relação, que é dada variável
r
de consulta , tem uma propriedade length igual a 10
- a relação entre Café e Quarto satisfaz as seguintes condições:
- a relação é da direita para a esquerda, com Room como fonte e Cafe como alvo
- a relação tem um nome de «tem» ou «inclui»
- a relação tem até 3 (portanto 1, 2 ou 3) lúpulos
A consulta também especifica que o twin Floor tem um $dtId
de 'termostato-15' e o twin Cafe tem uma temperatura de 55.
SELECT Floor,Room, Cafe FROM DIGITALTWINS
MATCH (Floor)-[r:contains|isAssociatedWith]->(Cafe)<-[has|includes*..3]-(Room)
WHERE Floor.$dtId = 'thermostat-15' AND r.length = 10 AND Cafe.temperature = 55
Você também pode usar condições de relacionamento encadeadas para expressar relações bidirecionais. A consulta a seguir encontra gêmeos Andar, Quarto e Edifício, onde...
- a relação entre Edifício e Pavimento satisfaz as seguintes condições:
- a relação é da esquerda para a direita, com Building como fonte e Floor como alvo
- a relação tem um nome de 'isAssociatedWith'
- A relação recebe uma variável de consulta
r1
- a relação entre Piso e Sala satisfaz estas condições:
- a relação é da direita para a esquerda, com Room como fonte e Floor como alvo
- a relação tem um nome de 'isAssociatedWith'
- A relação recebe uma variável de consulta
r2
A consulta também especifica que o edifício twin tem um $dtId
de 'edifício-3' e o quarto tem uma temperatura superior a 50.
SELECT Floor, Room, Building FROM DIGITALTWINS
MATCH (Building)-[r1:isAssociatedWith]->(Floor)<-[r2:isAssociatedWith]-(Room)
WHERE Building.$dtId = 'building-3' AND Room.temperature > 50
Limitações
Os seguintes limites aplicam-se a consultas que utilizem MATCH
:
Apenas uma
MATCH
expressão é suportada por instrução de consulta.$dtId
é obrigatório naWHERE
cláusula.A atribuição de uma variável de consulta à relação só é suportada quando a consulta especifica um único salto.
O máximo de saltos suportados em uma consulta é 10.
As consultas MATCH que contêm
$dtId
filtros em qualquer gêmeo diferente do gêmeo inicial para a travessia MATCH podem mostrar resultados vazios. Por exemplo, a seguinte consulta está sujeita a esta limitação:SELECT A, B, C FROM DIGITALTWINS MATCH A-[contains]->B-[is_part_of]->C WHERE B.$dtId = 'Device01'
Se o seu cenário exigir que você use
$dtId
em outros gêmeos, considere usar a cláusula JOIN.As consultas MATCH que atravessam o mesmo gémeo várias vezes podem remover inesperadamente este gémeo dos resultados.