Frågespråksreferens för Azure Digital Twins: MATCH-sats
Det här dokumentet innehåller referensinformation om MATCH-satsen för Azure Digital Twins-frågespråket.
Satsen MATCH
används i Azure Digital Twins-frågespråket som en del av FROM-satsen. MATCH
gör att du kan ange vilket mönster som ska följas när du passerar relationer i Azure Digital Twins-grafen (detta kallas även för ett frågemönster för "variable hop").
Den här satsen är valfri när du frågar.
Kärnsyntax: MATCH
MATCH
stöder alla frågor som hittar en sökväg mellan tvillingar inom ett intervall av hopp, baserat på vissa relationsvillkor.
Relationsvillkoret kan innehålla en eller flera av följande uppgifter:
- Relationsriktning (vänster till höger, höger till vänster eller icke-riktning)
- relationsnamn (enskilt namn eller en lista över möjligheter)
- Antal "hopp" från en tvilling till en annan (exakt antal eller intervall)
- En frågevariabeltilldelning som representerar relationen i frågetexten. På så sätt kan du också filtrera på relationsegenskaper.
En fråga med en MATCH
sats måste också använda WHERE-satsen för att ange $dtId
för minst en av de tvillingar som den refererar till.
Kommentar
MATCH
är en supermängd av alla JOIN
frågor som kan utföras i frågearkivet.
Syntax
Här är den grundläggande MATCH
syntaxen.
Den innehåller följande platshållare:
twin_or_twin_collection
(x2): SatsenMATCH
kräver en operand för att representera en enda tvilling. Den andra operanden kan representera en annan tvilling eller en samling tvillingar.relationship_condition
: I det här utrymmet definierar du ett villkor som beskriver relationen mellan tvillingarna eller tvillingsamlingarna. Villkoret kan ange relationsriktning, ange relationsnamn, ange antal hopp, ange relationsegenskaper eller valfri kombination av dessa alternativ.twin_ID
: Här anger du en$dtId
i en av tvillingsamlingarna så att en av operanderna representerar en enda tvilling.
--SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_condition]-(twin_or_twin_collection_2)
WHERE twin_or_twin_collection.$dtId = 'twin_ID'
-- AND ...
Du kan lämna en av tvillingsamlingarna tom så att alla tvillingar kan arbeta på den platsen.
Du kan också ändra antalet relationsvillkor, till att ha flera länkade relationsvillkor eller inget relationsvillkor alls :
--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'
Mer information om varje typ av relationsvillkor och hur du kombinerar dem finns i de andra avsnitten i det här dokumentet.
Exempel
Här är en exempelfråga med .MATCH
Frågan anger en relationsriktning och söker efter tvillingarna Building och Sensor där...
- Sensorn är riktad mot alla relationer från en byggtvilling med en
$dtId
av Building21 och - sensorn har en temperatur över 50. Både byggnaden och sensorn ingår i frågeresultatet.
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[]->(Sensor)
WHERE Building.$dtId = 'Building21' AND Sensor.temperature > 50
Ange relationsriktning
Använd relationsvillkoret MATCH
i -satsen för att ange en relationsriktning mellan tvillingarna. Möjliga riktningar är vänster till höger, höger till vänster eller icke-riktning. Cykliska relationer identifieras automatiskt, så att en relation endast passerar en gång.
Kommentar
Du kan representera dubbelriktade relationer med hjälp av länkning.
Syntax
Kommentar
Exemplen i det här avsnittet fokuserar på relationsriktning. De anger inte relationsnamn, de är standard för ett enda hopp och tilldelar inte frågevariabler till relationerna. Anvisningar om hur du gör mer med dessa andra villkor finns i Ange relationsnamn, Ange antal hopp och Tilldela frågevariabel till relation. Information om hur du använder flera av dessa tillsammans i samma fråga finns i Kombinera MATCH-åtgärder.
Beskrivningar av riktningsrelationer använder en visuell bild av en pil för att ange relationens riktning. Pilen innehåller ett utrymme som har reserverats med hakparenteser ([]
) för ett valfritt relationsnamn.
Det här avsnittet visar syntaxen för olika riktningar för relationer. De platshållarvärden som ska ersättas med dina värden är source_twin_or_twin_collection
och target_twin_or_twin_collection
.
Använd följande syntax för en relation från vänster till höger .
-- SELECT ... FROM ...
MATCH (source_twin_or_twin_collection)-[]->(target_twin_or_twin_collection)
-- WHERE ...
Använd följande syntax för en relation från höger till vänster .
-- SELECT ... FROM ...
MATCH (target_twin_or_twin_collection)<-[]-(source_twin_or_twin_collection)
-- WHERE ...
Använd följande syntax för en icke-riktningsrelation . Detta anger inte en riktning för relationen, så relationer i någon riktning inkluderas i resultatet.
-- SELECT ... FROM ...
MATCH (source_twin_or_twin_collection)-[]-(target_twin_or_twin_collection)
-- WHERE ...
Dricks
Icke-riktningsfrågor kräver ytterligare bearbetning, vilket kan leda till ökad svarstid och kostnad.
Exempel
Det första exemplet visar en vänster-till-höger-riktningsriktad bläddering. Den här frågan hittar tvillingarna Room och Factory där...
- Room targets Factory (med valfritt namn på relationen)
- Rummet har ett temperaturvärde som är större än 50
- Factory har en
$dtId
av "ABC"
SELECT Room, Factory FROM DIGITALTWINS MATCH (Room)-[]->(Factory)
WHERE Room.temperature > 50 AND Factory.$dtId = 'ABC'
Kommentar
MATCH-frågor som innehåller $dtId
filter på en annan tvilling än starttvillingen för MATCH-bläddningen kan visa tomma resultat. Detta gäller i factory.$dtId
exemplet ovan. Mer information finns i Begränsningar.
I följande exempel visas en höger-till-vänster-riktningsriktad bläddering. Den här frågan ser ut ungefär som den ovan, men riktningen för relationen mellan Room och Factory är omvänd. Den här frågan hittar tvillingarna Room och Factory där...
- Factory-målrum (med valfritt namn på relationen)
- Factory har en
$dtId
av "ABC" - Rummet har ett temperaturvärde som är större än 50
SELECT Room, Factory FROM DIGITALTWINS MATCH (Room)<-[]-(Factory)
WHERE Factory.$dtId = 'ABC' AND Room.temperature > 50
I följande exempel visas en icke-riktningsriktad bläddering. Den här frågan hittar tvillingarna Room och Factory där...
- Rum och fabrik delar valfritt namn på relationen och går i båda riktningarna
- Factory har en
$dtId
av "ABC" - Rummet har ett fuktighetsvärde som är större än 70
SELECT Factory, Room FROM DIGITALTWINS MATCH (Factory)-[]-(Room)
WHERE Factory.$dtId ='ABC' AND Room.humidity > 70
Ange relationsnamn
Du kan också använda relationsvillkoret MATCH
i -satsen för att ange namn för relationerna mellan tvillingarna. Du kan ange ett enda namn eller en lista med möjliga namn. Det valfria relationsnamnet ingår som en del av pilsyntaxen för att ange relationsriktning.
Om du inte anger något relationsnamn innehåller frågan alla relationsnamn som standard.
Dricks
Om du anger relationsnamn i frågan kan du förbättra prestandan och göra resultatet mer förutsägbart.
Syntax
Kommentar
Exemplen i det här avsnittet fokuserar på relationsnamn. De visar alla icke-riktningsrelationer, de är standard för ett enda hopp och de tilldelar inte frågevariabler till relationerna. Anvisningar om hur du gör mer med dessa andra villkor finns i Ange relationsriktning, Ange antal hopp och Tilldela frågevariabel till relation. Information om hur du använder flera av dessa tillsammans i samma fråga finns i Kombinera MATCH-åtgärder.
Ange namnet på en relation som ska korsas i MATCH
-satsen inom hakparenteser ([]
), efter ett kolon (:
). Det här avsnittet visar syntaxen för att ange namngivna relationer.
Använd följande syntax för ett enda namn. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
, relationship_name
och twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[:relationship_name]-(twin_or_twin_collection_2)
-- WHERE ...
För flera möjliga namn använder du följande syntax. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
, relationship_name_option_1
, relationship_name_option_2
, twin_or_twin_collection_2
och anteckningen för att fortsätta mönstret efter behov för det antal relationsnamn som du vill ange.
-- 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 ...
Viktigt!
Kolonet (:
) inom hakparenteserna är en obligatorisk del av syntaxen för att ange ett relationsnamn i en MATCH
fråga. Om du inte tar med kolonet anger inte frågan något relationsnamn. I stället har du en fråga som tilldelar en frågevariabel till relationen.
(Standard) Om du vill lämna namnet ospecificerat lämnar du hakparenteserna tomma med namninformation, så här:
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[]-(twin_or_twin_collection_2)
-- WHERE ...
Exempel
I följande exempel visas ett enda relationsnamn. Den här frågan hittar tvillingarna Building och Sensor där...
- Byggnaden har en "contains"-relation till sensorn (i båda riktningarna)
- Byggnaden har en
$dtId
av "Seattle21"
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[:contains]-(Sensor)
WHERE Building.$dtId = 'Seattle21'
I följande exempel visas flera möjliga relationsnamn. Den här frågan ser ut ungefär som den ovan, men det finns flera möjliga relationsnamn som ingår i resultatet. Den här frågan hittar tvillingarna Building och Sensor där...
- Byggnaden har antingen en "contains" eller "isAssociatedWith"-relation till sensorn (i båda riktningarna)
- Byggnaden har en
$dtId
av "Seattle21"
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building)-[:contains|isAssociatedWith]-(Sensor)
WHERE building.$dtId = 'Seattle21'
I följande exempel finns inget angivet relationsnamn. Därför inkluderas relationer med valfritt namn i frågeresultatet. Den här frågan hittar tvillingarna Building och Sensor där...
- Byggnaden har en relation till Sensor med valfritt namn (och går i båda riktningarna)
- Byggnaden har en
$dtId
av "Seattle21"
SELECT Building, Sensor FROM DIGITALTWINS
MATCH (Building-[]-(Sensor)
WHERE Building.$dtId = 'Seattle21'
Ange antal hopp
Du kan också använda relationsvillkoret MATCH
i -satsen för att ange antalet hopp för relationerna mellan tvillingarna. Du kan ange ett exakt tal eller ett intervall. Det här valfria värdet ingår som en del av pilsyntaxen för att ange relationsriktning.
Om du inte anger ett antal hopp kommer frågan som standard att vara ett hopp.
Viktigt!
Om du anger ett antal hopp som är större än ett kan du inte tilldela en frågevariabel till relationen. Endast ett av dessa villkor kan användas i samma fråga.
Syntax
Kommentar
Exemplen i det här avsnittet fokuserar på antalet hopp. De visar alla icke-riktningsrelationer utan att ange namn. Anvisningar om hur du gör mer med dessa andra villkor finns i Ange relationsriktning och Ange relationsnamn. Information om hur du använder flera av dessa tillsammans i samma fråga finns i Kombinera MATCH-åtgärder.
Ange antalet hopp som ska passeras i MATCH
-satsen inom hakparenteserna ([]
).
Om du vill ange ett exakt antal hopp använder du följande syntax. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
, number_of_hops
och twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*number_of_hops]-(twin_or_twin_collection_2)
-- WHERE ...
Om du vill ange ett intervall med hopp använder du följande syntax. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
, starting_limit
och ending_limit
twin_or_twin_collection_2
. Startgränsen ingår inte i intervallet, medan slutgränsen ingår.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*starting_limit..ending_limit]-(twin_or_twin_collection_2)
-- WHERE ...
Du kan också utelämna startgränsen för att ange "allt upp till" (och inklusive) slutgränsen. En slutgräns måste alltid anges.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[*..ending_limit]-(twin_or_twin_collection_2)
-- WHERE ...
(Standard) Om du vill ange ett hopp som standard lämnar du hakparenteserna tomma med hoppinformation, så här:
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[]-(twin_or_twin_collection_2)
-- WHERE ...
Exempel
I följande exempel anges ett exakt antal hopp. Frågan returnerar endast relationer mellan tvillingarna Floor och Room som är exakt 3 hopp.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*3]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
I följande exempel anges ett intervall med hopp. Frågan returnerar relationer mellan tvillingarna Floor och Room som är mellan 1 och 3 hopp (vilket innebär att antalet hopp är antingen 2 eller 3).
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*1..3]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
Du kan också visa ett intervall genom att endast ange en gräns. I följande exempel returnerar frågan relationer mellan tvillingarna Floor och Room som högst är 2 hopp (vilket innebär att antalet hopp är antingen 1 eller 2).
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[*..2]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
I följande exempel finns inget angivet antal hopp, så standardvärdet är ett hopp mellan tvillingarna Floor och Room.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[]-(Room)
WHERE Floor.$dtId = 'thermostat-15'
Tilldela frågevariabel till relation (och ange relationsegenskaper)
Du kan också tilldela en frågevariabel till relationen som refereras i MATCH
-satsen, så att du kan referera till den med namn i frågetexten.
Ett användbart resultat av att göra detta är möjligheten att filtrera på relationsegenskaper i din WHERE
sats.
Viktigt!
Det går bara att tilldela en frågevariabel till relationen när frågan anger ett enda hopp. I en fråga måste du välja mellan att ange en relationsvariabel och ange ett större antal hopp.
Syntax
Kommentar
Exemplen i det här avsnittet fokuserar på en frågevariabel för relationen. De visar alla icke-riktningsrelationer utan att ange namn. Anvisningar om hur du gör mer med dessa andra villkor finns i Ange relationsriktning och Ange relationsnamn. Information om hur du använder flera av dessa tillsammans i samma fråga finns i Kombinera MATCH-åtgärder.
Om du vill tilldela en frågevariabel till relationen placerar du variabelnamnet inom hakparenteserna ([]
). De platshållarvärden som visas nedan och som ska ersättas med dina värden är twin_or_twin_collection_1
, relationship_variable
och twin_or_twin_collection_2
.
-- SELECT ... FROM ...
MATCH (twin_or_twin_collection_1)-[relationship_variable]-(twin_or_twin_collection_2>)
-- WHERE ...
Exempel
I följande exempel tilldelas en frågevariabel "Rel" till relationen. Senare i WHERE
-satsen använder den variabeln för att ange att relationen Rel ska ha en namnegenskap med värdet "underordnad".
SELECT Floor,Cafe, Rel DIGITALTWINS
MATCH (Floor)-[Rel]-(Cafe)
WHERE Floor.$dtId = 'thermostat-15' AND Rel.name = 'child'
Kombinera MATCH-åtgärder
Du kan kombinera flera relationsvillkor i samma fråga. Du kan också länka flera relationsvillkor för att uttrycka dubbelriktade relationer eller andra större kombinationer.
Syntax
I en enda fråga kan du kombinera relationsriktning, relationsnamn och ett av antingen antal hopp eller en frågevariabeltilldelning.
Följande syntaxexempel visar hur dessa attribut kan kombineras. Du kan också utelämna valfri information som visas i platshållarna för att utelämna den delen av villkoret.
Om du vill ange relationsriktning, relationsnamn och antal hopp i en enda fråga använder du följande syntax i relationsvillkoret. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
och twin_or_twin_collection_2
, optional_left_angle_bracket
och optional_right_angle_bracket
, relationship_name(s)
och number_of_hops
.
-- 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
Om du vill ange relationsriktning, relationsnamn och en frågevariabel för relationen i en enda fråga använder du följande syntax i relationsvillkoret. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
och twin_or_twin_collection_2
, optional_left_angle_bracket
och optional_right_angle_bracket
, relationship_variable
och relationship_name(s)
.
-- 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
Kommentar
Enligt alternativen för att ange relationsriktning måste du välja mellan en vänster vinkelparentes för en vänster-till-höger-relation eller en höger vinkelparentes för en relation från höger till vänster. Du kan inte inkludera båda på samma pil, men kan representera dubbelriktade relationer genom att länka.
Du kan länka samman flera relationsvillkor, så här. De platshållarvärden som ska ersättas med dina värden är twin_or_twin_collection_1
, alla instanser av relationship_condition
och 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'
Exempel
Här är ett exempel som kombinerar relationsriktning, relationsnamn och antal hopp. Följande fråga hittar tvillingarna Floor och Room där relationen mellan Floor och Room uppfyller dessa villkor:
- relationen är från vänster till höger, med Floor som källa och Rum som mål
- relationen har namnet "contains" eller "isAssociatedWith"
- relationen har antingen 4 eller 5 hopp
Frågan anger också att tvillinggolvet har termostat-15 $dtId
.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[:contains|isAssociatedWith*3..5]->(Room)
WHERE Floor.$dtId = 'thermostat-15'
Här är ett exempel som kombinerar relationsriktning, relationsnamn och en namngiven frågevariabel för relationen. Följande fråga hittar tvillingarna Floor och Room där relationen mellan Floor och Room tilldelas till en frågevariabel r
och uppfyller dessa villkor:
- relationen är från vänster till höger, med Floor som källa och Rum som mål
- relationen har namnet "contains" eller "isAssociatedWith"
- relationen, som ges en frågevariabel
r
, har en längdegenskap som är lika med 10
Frågan anger också att tvillinggolvet har termostat-15 $dtId
.
SELECT Floor, Room FROM DIGITALTWINS
MATCH (Floor)-[r:contains|isAssociatedWith]->(Room)
WHERE Floor.$dtId = 'thermostat-15' AND r.length = 10
I följande exempel visas länkade relationsvillkor. Frågan hittar tvillingarna Floor, Cafe och Room, där...
- förhållandet mellan Golv och Rum uppfyller följande villkor:
- relationen är från vänster till höger, med Floor som källa och Cafe som mål
- relationen har namnet "contains" eller "isAssociatedWith"
- relationen, som ges frågevariabeln
r
, har en längdegenskap som är lika med 10
- förhållandet mellan Cafe och Room uppfyller dessa villkor:
- relationen är från höger till vänster, med Room som källa och Cafe som mål
- relationen har namnet "har" eller "inkluderar"
- relationen har upp till 3 (så 1, 2 eller 3) hopp
Frågan anger också att tvillinggolvet har termostaten-15 $dtId
och tvillingcaféet har en temperatur på 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
Du kan också använda länkade relationsvillkor för att uttrycka dubbelriktade relationer. Följande fråga hittar tvillingarna Floor, Room och Building, där...
- förhållandet mellan byggnad och golv uppfyller följande villkor:
- relationen är från vänster till höger, med Building som källa och Floor som mål
- relationen har namnet isAssociatedWith
- relationen ges en frågevariabel
r1
- förhållandet mellan Golv och Rum uppfyller följande villkor:
- relationen är från höger till vänster, med Room som källa och Floor som mål
- relationen har namnet isAssociatedWith
- relationen ges en frågevariabel
r2
Frågan anger också att twin Building har en $dtId
"building-3" och Rum har en temperatur som är större än 50.
SELECT Floor, Room, Building FROM DIGITALTWINS
MATCH (Building)-[r1:isAssociatedWith]->(Floor)<-[r2:isAssociatedWith]-(Room)
WHERE Building.$dtId = 'building-3' AND Room.temperature > 50
Begränsningar
Följande begränsningar gäller för frågor med hjälp av MATCH
:
Endast ett
MATCH
uttryck stöds per frågeuttryck.$dtId
krävs iWHERE
-satsen.Det går bara att tilldela en frågevariabel till relationen när frågan anger ett enda hopp.
Maximalt antal hopp som stöds i en fråga är 10.
MATCH-frågor som innehåller
$dtId
filter på en annan tvilling än starttvillingen för MATCH-bläddningen kan visa tomma resultat. Följande fråga omfattas till exempel av den här begränsningen:SELECT A, B, C FROM DIGITALTWINS MATCH A-[contains]->B-[is_part_of]->C WHERE B.$dtId = 'Device01'
Om ditt scenario kräver att du använder
$dtId
på andra tvillingar bör du överväga att använda JOIN-satsen i stället.MATCH-frågor som passerar samma tvilling flera gånger kan oväntat ta bort den här tvillingen från resultaten.