Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: Az SQL Server 2017 (14.x) és újabb verziói
az Azure SQL Database
Azure SQL Managed Instance
SQL Database-adatbázist a Microsoft Fabricben
Egy gráf keresési feltételét adja meg. A HOL záradék részeként a HOL.VAN utasításban csak gráfcsomóponttal és éltáblákkal használható a HOL.
Transact-SQL szintaxis konvenciók
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
Megadja a gráfban keresendő mintát vagy elérési utat. Ez a minta ASCII-ábraszintaxissal lépi át a gráf egy elérési útját. A minta az egyik csomópontról a másikra halad egy élen keresztül, a megadott nyíl irányában. Az élnevek és aliasok zárójelben vannak megadva. A csomópontnevek vagy aliasok a nyíl két végén jelennek meg. A nyíl a mintában bármelyik irányba haladhat.
node_alias
A FROM záradékban megadott csomóponttábla neve vagy aliasa.
edge_alias
A FROM záradékban megadott éltábla neve vagy aliasa.
SHORTEST_PATH
A legrövidebb elérési út függvény a gráf két adott csomópontja, illetve egy adott csomópont és a gráf összes többi csomópontja közötti legrövidebb elérési utat keresi. Bemenetként tetszőleges hosszmintát vesz fel, amelyet a rendszer egy gráfban ismételten keres. Bevezetés az SQL Server 2019-ben. Az SQL Server 2019-et vagy újabb verziót igényel.
arbitrary_length_match_pattern
Megadja azokat a csomópontokat és éleket, amelyeket többször kell áthaladni, amíg el nem éri a kívánt csomópontot, vagy amíg meg nem éri a mintában megadott maximális iterációk számát.
al_pattern_quantifier
Az tetszőleges hosszminta normál kifejezésstílus-kvantitátorokat használ annak meghatározásához, hogy egy adott keresési minta hányszor ismétlődik. A támogatott keresési minta kvantitátorai a következők:
- +: Ismételje meg a mintát 1 vagy több alkalommal. A legrövidebb elérési út megtalálása után azonnal leáll.
- {1,n}: Ismételje meg az 1 mintát n alkalommal. A legrövidebb elérési út megtalálása után azonnal leáll.
Remarks
A MATCH-ben lévő csomópontnevek megismételhetők. Más szóval egy csomópont tetszőleges számú alkalommal bejárható ugyanabban a lekérdezésben.
A peremhálózat neve nem ismételhető meg a MATCH fájlban.
Az élek bármelyik irányba mutathatnak, de explicit irányban kell lenniük.
Az OR és a NOT operátorok nem támogatottak a MATCH mintában.
A HOL záradék és a HOL záradék használatával a HOL függvény más kifejezésekkel is kombinálható. Az OR vagy NOT használatával történő más kifejezésekkel való kombinálása azonban nem támogatott.
Examples
Barát keresése
Az alábbi példa létrehoz egy Személycsomópont táblát és a barátok Edge-táblát, beszúr néhány adatot, majd a MATCH használatával megkeresi Alice ismerőseit, egy személyt a gráfban.
-- 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';
Barát megkeresése
Az alábbi példa alice barátját próbálja megtalálni.
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';
Személyek keresése 1-3 ugrásnyi távolságra egy adott személytől
Az alábbi példa megkeresi Jacob és az összes olyan ember közötti legrövidebb utat, amelyhez Jacob kapcsolódik a gráfban, egy-három ugrásnyira tőle.
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'
További minták
Az alábbiakban további módszereket talál arra, hogy miként adhatók meg minták a MATCH-ben.
-- 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);