Megosztás a következőn keresztül:


SHORTEST_PATH (Transact-SQL)

A következőkre vonatkozik: Az SQL Server 2019 (15.x) és újabb verziói az Azure SQL DatabaseAzure SQL Managed InstanceSQL 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'

Következő lépések