Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2017 (14.x) en latere versies
Van Azure SQL Database
Azure SQL Managed Instance
SQL Database in Microsoft Fabric Preview
Hiermee geeft u een zoekvoorwaarde voor een grafiek. VERGELIJKEN kan alleen worden gebruikt met grafiekknooppunt- en edge-tabellen, in de SELECT-instructie als onderdeel van de WHERE-component.
Transact-SQL syntaxis-conventies
Syntax
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(<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.
Arguments
graph_search_pattern
Hiermee geeft u het patroon op dat moet worden gezocht of pad moet worden doorkruist in de grafiek. In dit patroon wordt de ASCII-tekensyntaxis gebruikt om een pad in de grafiek te doorlopen. Het patroon gaat van het ene knooppunt naar het andere via een rand, in de richting van de opgegeven pijl. Edge-namen of -aliassen worden tussen haakjes weergegeven. Knooppuntnamen of aliassen worden weergegeven aan de twee uiteinden van de pijl. De pijl kan in beide richtingen in het patroon gaan.
node_alias
Naam of alias van een knooppunttabel die is opgegeven in de FROM-component.
edge_alias
Naam of alias van een edge-tabel die is opgegeven in de FROM-component.
SHORTEST_PATH
De kortste padfunctie wordt gebruikt om het kortste pad te vinden tussen twee knooppunten in een grafiek of tussen een bepaald knooppunt en alle andere knooppunten in een grafiek. Er wordt een willekeurig lengtepatroon gebruikt als invoer, die herhaaldelijk in een grafiek wordt doorzocht. Geïntroduceerd in SQL Server 2019. Vereist SQL Server 2019 of hoger.
arbitrary_length_match_pattern
Hiermee geeft u de knooppunten en randen die herhaaldelijk moeten worden doorkruist totdat het gewenste knooppunt is bereikt of tot het maximum aantal iteraties zoals opgegeven in het patroon wordt voldaan.
al_pattern_quantifier
Het willekeurige lengtepatroon neemt reguliere kwantificatoren voor expressiestijlen om het aantal keren op te geven dat een bepaald zoekpatroon wordt herhaald. De ondersteunde kwantificatoren voor zoekpatronen zijn:
- +: Herhaal het patroon 1 of meer keren. Eindig zodra er een kortst pad wordt gevonden.
- {1,n}: herhaal het patroon 1 tot n tijden. Eindig zodra er een kortst pad wordt gevonden.
Remarks
De knooppuntnamen in VERGELIJKEN kunnen worden herhaald. Met andere woorden, een knooppunt kan een willekeurig aantal keren in dezelfde query worden doorkruist.
Een randnaam kan niet worden herhaald in VERGELIJKEN.
Een rand kan in beide richtingen wijzen, maar moet een expliciete richting hebben.
OF- en NOT-operators worden niet ondersteund in het PATROON VERGELIJKEN.
VERGELIJKEN kan worden gecombineerd met andere expressies met BEHULP van AND in de WHERE-component. Het combineren ervan met andere expressies met OR of NOT wordt echter niet ondersteund.
Examples
Een vriend zoeken
In het volgende voorbeeld worden een tabel person-knooppunt en vrienden Edge-tabel gemaakt, enkele gegevens ingevoegd en vervolgens MATCH gebruikt om vrienden van Alice te vinden, een persoon in de grafiek.
-- 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';
Vriend van een vriend zoeken
In het volgende voorbeeld wordt geprobeerd een vriend van een vriend van Alice te vinden.
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';
Personen zoeken 1-3 hops weg van een bepaalde persoon
In het volgende voorbeeld vindt u het kortste pad tussen Jacob en alle mensen waarmee Jacob is verbonden in de grafiek één tot drie hops van hem af.
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends
FROM
Person AS Person1,
friendOf FOR PATH AS fo,
Person FOR PATH AS Person2
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2){1,3}))
AND Person1.name = 'Jacob'
More patterns
Hier volgen nog enkele manieren waarop een patroon kan worden opgegeven in VERGELIJKEN.
-- 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);