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 2019 (15.x) és újabb verziói az Azure SQL Database
Azure SQL Managed Instance
SQL Database-adatbázist a
Microsoft Fabricben
Keresési feltételt ad meg egy gráfhoz, amely rekurzívan vagy ismétlődően keres. SHORTEST_PATH a SELECT utasításban használható a MATCH függvényben gráfcsomóponttal és éltáblákkal.
Transact-SQL szintaxis konvenciói
Legrövidebb elérési út
A SHORTEST_PATH függvény a következőket teszi lehetővé:
- A legrövidebb elérési út két adott csomópont/entitás között
- Egyetlen forrás legrövidebb elérési útja(i).
- A legrövidebb elérési út több forráscsomóponttól több célcsomópontig.
Egy tetszőleges hosszmintát vesz fel bemenetként, és a legrövidebb útvonalat adja vissza, amely két csomópont között létezik. Ez a függvény csak a HOL.VAN függvényen belül használható. A függvény csak egy legrövidebb útvonalat ad vissza a két adott csomópont között. Ha van ilyen, a forrás- és célcsomópont(ok) közötti két vagy több azonos hosszúságú legrövidebb elérési út, a függvény csak egy elérési utat ad vissza, amely a bejárás során először található. Tetszőleges hosszminta csak SHORTEST_PATH függvényben adható meg.
A teljes szintaxisért tekintse meg EGYEZÉS (SQL Graph).
FOR PATH
A FOR PATH-t a FROM záradék bármely csomópont- vagy éltábla nevével együtt kell használni, amely tetszőleges hosszúságú mintában vesz részt. A FOR PATH tájékoztatja a motort, hogy a csomópont vagy az éltábla egy rendezett gyűjteményt ad vissza, amely a bejárt útvonal mentén található csomópontok vagy élek listáját jelöli. Ezekből a táblákból származó attribútumok nem vethetők ki közvetlenül a SELECT záradékban. A táblákból származó projektattribútumok létrehozásához gráfútvonal-összesítő függvényeket kell használni.
Tetszőleges hosszminta
Ez a minta tartalmazza azokat a csomópontokat és éleket, amelyeket többször kell áthaladni, amíg a következőt nem:
- A kívánt csomópont el lesz érve.
- A mintában megadott iterációk maximális száma teljesül.
A következő két mintakvantátor támogatott:
- "+": 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 idő elteltével állítsa le a elemet.
LAST_NODE
LAST_NODE() függvény két tetszőleges hosszúságú bejárási minta láncolását teszi lehetővé. Olyan helyzetekben használható, ahol:
- Egy lekérdezésben egynél több legrövidebb elérésiút-minta van használatban, és egy minta az előző minta UTOLSÓ csomópontján kezdődik.
- Két legrövidebb útvonalminta egyesül ugyanazon a LAST_NODE().
Gráf elérési útja sorrendje
A gráf elérési útjának sorrendje a kimeneti útvonalban lévő adatok sorrendjére vonatkozik. A kimeneti útvonal sorrendje mindig a minta nem rekurzív részén kezdődik, majd a rekurzív részben megjelenő csomópontok/élek. Annak a sorrendnek, amelyben a gráf áthalad a lekérdezésoptimalizálás/-végrehajtás során, semmi köze a kimenetben kinyomtatott sorrendhez. Hasonlóképpen a rekurzív mintában lévő nyíl iránya sem befolyásolja a gráf elérési útvonalának sorrendjét.
Gráfútvonal-összesítő függvények
Mivel az tetszőleges hosszúsági mintában érintett csomópontok és élek egy gyűjteményt adnak vissza (az elérési útvonalon áthaladó csomópont(ok) és él(ek)ből), a felhasználók nem vetíthetik ki közvetlenül az attribútumokat a hagyományos tablename.attributename szintaxis használatával. Olyan lekérdezések esetében, amelyekben a köztes csomópont vagy peremtáblák attribútumértékeinek kivetítése szükséges, a bejárt útvonalon használja a következő gráfútvonalak összesítő függvényeit: STRING_AGG, LAST_VALUE, SZUM, AVG, MIN, MAX és DARAB. A SELECT záradék összesítő függvényeinek általános szintaxisa a következő:
<GRAPH_PATH_AGGREGATE_FUNCTION>(<expression> , <separator>) <order_clause>
<order_clause> ::=
{ WITHIN GROUP (GRAPH PATH) }
<GRAPH_PATH_AGGREGATE_FUNCTION> ::=
STRING_AGG
| LAST_VALUE
| SUM
| COUNT
| AVG
| MIN
| MAX
STRING_AGG
A STRING_AGG függvény bemenetként egy kifejezést és elválasztót használ, és egy sztringet ad vissza. A felhasználók a SELECT záradékban ezt a függvényt használhatják az átjárt útvonal köztes csomópontjaiból vagy éleiből származó attribútumok kivetítéséhez.
LAST_VALUE
A bejárt elérési út utolsó csomópontjának attribútumaihoz LAST_VALUE összesítő függvény használható. Hiba az éltábla aliasának megadása a függvény bemeneteként, csak csomóponttáblák nevei vagy aliasai használhatók.
Utolsó csomópont: Az utolsó csomópont arra a csomópontra hivatkozik, amely utoljára jelenik meg a bejárt útvonalon, függetlenül attól, hogy a MATCH predikátumban a nyíl iránya van-e. Például: MATCH(SHORTEST_PATH(n(-(e)->p)+) ). Itt az elérési út utolsó csomópontja az utolsó meglátogatott P csomópont.
A MATCH(SHORTEST_PATH((n<-(e)-)+p)) mintában az utolsó csomópont az utolsó meglátogatott N csomópont.
SUM
Ez a függvény a bejárt útvonalon megjelenő megadott csomópont-/élattribútum-értékek vagy kifejezés összegét adja vissza.
COUNT
Ez a függvény az elérési úton megadott csomópont/él attribútum nem null értékű értékeinek számát adja vissza. A DARAB függvény nem támogatja a * operátort – a * megkísérelt használata szintaxishibát eredményez.
{ COUNT( <expression> ) <order_clause> }
AVG
A megadott csomópont-/élattribútum-értékek vagy -kifejezések átlagát adja vissza, amely a bejárt útvonalon jelent meg.
MIN
A megadott csomópont/él attribútum értékeiből vagy a bejárt útvonalon megjelenő kifejezésből származó minimális értéket adja vissza.
MAX
A megadott csomópont-/élattribútum-értékek vagy kifejezés maximális értékét adja vissza, amely a bejárt útvonalon jelent meg.
Remarks
- A SHORTEST_PATH függvény csak a HOL.VAN függvényen belül használható.
- A LAST_NODE függvény csak SHORTEST_PATH belül támogatott.
- A SHORTEST_PATH függvény a csomópontok közötti legrövidebb utat. Jelenleg nem támogatja a csomópontok közötti legrövidebb útvonalak visszaadását; Emellett nem támogatja a csomópontok közötti elérési utak visszaadását.
- A SHORTEST_PATH-implementáció egy nem súlyozott legrövidebb útvonalat talál.
- Bizonyos esetekben előfordulhat, hogy rossz tervek jönnek létre a nagyobb számú ugrással rendelkező lekérdezésekhez, ami magasabb lekérdezésvégrehajtási időt eredményez. Annak kiértékelése, hogy a lekérdezési tippek, például az OPTION (HASH JOIN) és/vagy az OPTION (MAXDOP 1) súgója segít-e.
Examples
Az itt látható példa-lekérdezésekhez az SQL Graph-minta létrehozott csomópont- és éltáblákat használjuk
A. Két személy közötti legrövidebb út megkeresése
Az alábbi példában Jacob és Alice közötti legrövidebb utat találjuk. Szükségünk van a Personlétrehozott friendOf csomópontra és élre.
SELECT PersonName, Friends
FROM (
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends,
LAST_VALUE(Person2.name) WITHIN GROUP (GRAPH PATH) AS LastNode
FROM
Person AS Person1,
friendOf FOR PATH AS fo,
Person FOR PATH AS Person2
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2)+))
AND Person1.name = 'Jacob'
) AS Q
WHERE Q.LastNode = 'Alice'
B. Keresse meg a legrövidebb útvonalat egy adott csomóponttól a gráf összes többi csomópontja felé.
Az alábbi példa megkeresi az összes olyan embert, akihez Jacob csatlakozik a gráfban, és a legrövidebb utat, amely Jacobtól az összes emberhez kapcsolódik.
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)+))
AND Person1.name = 'Jacob'
C. Megszámolhatja, hogy hány ugrás/szint halad át az egyik személyről a másikra a gráfban.
Az alábbi példa megkeresi Jacob és Alice közötti legrövidebb utat, és kinyomtatja a Jacobtól Alice-be vezető ugrások számát.
SELECT PersonName, Friends, levels
FROM (
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends,
LAST_VALUE(Person2.name) WITHIN GROUP (GRAPH PATH) AS LastNode,
COUNT(Person2.name) WITHIN GROUP (GRAPH PATH) AS levels
FROM
Person AS Person1,
friendOf FOR PATH AS fo,
Person FOR PATH AS Person2
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2)+))
AND Person1.name = 'Jacob'
) AS Q
WHERE Q.LastNode = 'Alice'
D. 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'
E. Személyek keresése pontosan két ugrásnyira egy adott személytől
Az alábbi példa megkeresi Jacob és azok között az emberek között a legrövidebb utat, akik pontosan két ugrásnyira vannak tőle a grafikonon.
SELECT PersonName, Friends
FROM (
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends,
COUNT(Person2.name) WITHIN GROUP (GRAPH PATH) AS levels
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'
) Q
WHERE Q.levels = 2
F. Keresse meg azokat az embereket, akik 1-3 ugrásnyira vannak egy adott személytől, akik egy adott éttermet is kedvelnek
Az alábbi példa megkeresi Jacob és az összes olyan ember közötti legrövidebb utat, amelyhez az 1-3. gráfban kapcsolódik, távolodik tőle. A lekérdezés szűri a csatlakoztatott személyeket is, ha kedvelik az adott éttermet. Az alábbi példában az LAST_NODE(Person2) az egyes legrövidebb útvonalak utolsó csomópontjait adja vissza. A Person kapott "utolsó" LAST_NODE csomópont ezután "láncolt" lehet a további bejárásokhoz, hogy megtalálják a nekik megfelelő éttermet(ek).
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends,
Restaurant.name
FROM
Person AS Person1,
friendOf FOR PATH AS fo,
Person FOR PATH AS Person2,
likes,
Restaurant
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2){1,3}) AND LAST_NODE(Person2)-(likes)->Restaurant )
AND Person1.name = 'Jacob'
AND Restaurant.name = 'Ginger and Spice'
G. Keresse meg az adott csomóponttól az összes többi csomópontig a legrövidebb útvonalat a gráfban, a "hurkok" kivételével
Az alábbi példa megkeresi az összes olyan embert, akihez Alice csatlakozik a gráfban, és a legrövidebb utat alice-től kezdve az összes emberig. A példa kifejezetten ellenőrzi azokat a "hurkokat", ahol az elérési út kezdő és végpontja megegyezik.
SELECT PersonName, Friends
FROM (
SELECT
Person1.name AS PersonName,
STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends,
LAST_VALUE(Person2.name) WITHIN GROUP (GRAPH PATH) AS LastNode
FROM
Person AS Person1,
friendOf FOR PATH AS fo,
Person FOR PATH AS Person2
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2)+))
AND Person1.name = 'Alice'
) AS Q
WHERE Q.LastNode != 'Alice'