Delen via


SHORTEST_PATH (Transact-SQL)

van toepassing op: SQL Server 2019 (15.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Hiermee geeft u een zoekvoorwaarde voor een grafiek op, die recursief of herhaaldelijk wordt doorzocht. SHORTEST_PATH kan worden gebruikt in VERGELIJKEN met grafiekknooppunt- en randtabellen in de SELECT-instructie.

Transact-SQL syntaxisconventies

Kortst pad

Met de functie SHORTEST_PATH kunt u het volgende vinden:

  • Een kortst pad tussen twee opgegeven knooppunten/entiteiten
  • Eén kortste bronpad(en).
  • Kortst pad van meerdere bronknooppunten naar meerdere doelknooppunten.

Het duurt een willekeurig lengtepatroon als invoer en retourneert een kortst pad dat bestaat tussen twee knooppunten. Deze functie kan alleen worden gebruikt in VERGELIJKEN. De functie retourneert slechts één kortst pad tussen twee knooppunten. Als er twee of meer kortste paden van dezelfde lengte tussen een paar bron- en doelknooppunten bestaan, retourneert de functie slechts één pad dat als eerste is gevonden tijdens doorkruising. Een willekeurig lengtepatroon kan alleen worden opgegeven binnen een SHORTEST_PATH functie.

Raadpleeg MATCH (SQL Graph)voor volledige syntaxis.

VOOR PAD

FOR PATH moet worden gebruikt met een willekeurige knooppunt- of edge-tabelnaam in de FROM-component, die deelneemt aan een willekeurig lengtepatroon. FOR PATH vertelt de engine dat de knooppunt- of edge-tabel een geordende verzameling retourneert die de lijst met knooppunten of randen vertegenwoordigt die langs het pad zijn gevonden. De kenmerken uit deze tabellen kunnen niet rechtstreeks in de SELECT-component worden geprojecteerd. Als u kenmerken van deze tabellen wilt projecteren, moeten statistische functies voor grafiekpaden worden gebruikt.

Willekeurig lengtepatroon

Dit patroon omvat de knooppunten en randen die herhaaldelijk moeten worden doorkruist totdat:

  • Het gewenste knooppunt is bereikt.
  • Aan het maximum aantal iteraties zoals opgegeven in het patroon wordt voldaan.

De volgende twee patroon kwantificatoren worden ondersteund:

  • +-: herhaal het patroon 1 of meer keren. Eindig zodra er een kortst pad wordt gevonden.
  • {1,n}: herhaal het patroon 1 tot n tijden. Beëindig zodra er een kortste is gevonden.

LAST_NODE

LAST_NODE() functie maakt het koppelen van twee willekeurige lengte doorkruisingspatronen mogelijk. Deze kan worden gebruikt in scenario's waarin:

  • Er worden meer dan één kortste padpatronen gebruikt in een query en één patroon begint bij het LAATSTE knooppunt van het vorige patroon.
  • Twee kortste padpatronen worden samengevoegd op hetzelfde LAST_NODE().

Grafiekpadvolgorde

Grafiekpadvolgorde verwijst naar de volgorde van gegevens in het uitvoerpad. De uitvoerpadvolgorde begint altijd bij het niet-recursieve deel van het patroon, gevolgd door de knooppunten/randen die worden weergegeven in het recursieve deel. De volgorde waarin de grafiek wordt doorlopen tijdens het optimaliseren/uitvoeren van query's heeft niets te maken met de volgorde die in de uitvoer wordt afgedrukt. Op dezelfde manier heeft de richting van de pijl in het recursieve patroon ook geen invloed op de volgorde van het grafiekpad.

Statistische functies voor grafiekpad

Omdat de knooppunten en randen die betrokken zijn bij een willekeurig lengtepatroon een verzameling (van knooppunten) en randen die in dat pad zijn doorkruist, retourneren gebruikers de kenmerken niet rechtstreeks met behulp van de syntaxis van de conventionele tablename.attributename. Voor query's waarvoor kenmerkwaarden van het tussenliggende knooppunt of de edge-tabellen moeten worden geprojecteerd, gebruikt u in het pad dat is doorkruist de volgende statistische functies voor grafiekpaden: STRING_AGG, LAST_VALUE, SOM, GEM, MIN, MAX en COUNT. De algemene syntaxis voor het gebruik van deze statistische functies in de SELECT-component is:

<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

De functie STRING_AGG gebruikt een expressie en scheidingsteken als invoer en retourneert een tekenreeks. Gebruikers kunnen deze functie in de SELECT-component gebruiken om kenmerken van de tussenliggende knooppunten of randen in het pad te projecteren.

LAST_VALUE

Voor het projecteren van kenmerken van het laatste knooppunt van het pad dat is doorkruist, kan LAST_VALUE statistische functie worden gebruikt. Er is een fout opgetreden bij het opgeven van een edge-tabelalias als invoer voor deze functie. Alleen namen of aliassen van knooppunten kunnen worden gebruikt.

laatste knooppunt: het laatste knooppunt verwijst naar het knooppunt dat voor het laatst in het pad wordt weergegeven, ongeacht de richting van de pijl in het predicaat VERGELIJKEN. Bijvoorbeeld: MATCH(SHORTEST_PATH(n(-(e)->p)+) ). Hier is het laatste knooppunt in het pad het laatst bezochte P-knooppunt.

In het MATCH(SHORTEST_PATH((n<-(e)-)+p)) patroon is het laatste knooppunt het laatste N-knooppunt dat is bezocht.

SOM

Deze functie retourneert de som van opgegeven knooppunt-/edge-kenmerkwaarden of expressies die worden weergegeven in het doorkruiste pad.

TELLEN

Deze functie retourneert het aantal niet-null-waarden van het opgegeven knooppunt-/edge-kenmerk in het pad. De functie COUNT biedt geen ondersteuning voor de operator *: geprobeerd gebruik van * resulteert in een syntaxisfout.

{  COUNT( <expression> )  <order_clause>  }

AVG

Retourneert het gemiddelde van opgegeven knooppunt-/edge-kenmerkwaarden of expressies die worden weergegeven in het doorkruiste pad.

MIN

Retourneert de minimumwaarde van de opgegeven knooppunt-/edge-kenmerkwaarden of expressies die worden weergegeven in het doorkruiste pad.

MAX

Retourneert de maximumwaarde van de opgegeven knooppunt-/edge-kenmerkwaarden of expressies die worden weergegeven in het doorkruiste pad.

Opmerkingen

  • De functie SHORTEST_PATH kan alleen worden gebruikt in VERGELIJKEN.
  • De functie LAST_NODE wordt alleen ondersteund in SHORTEST_PATH.
  • De functie SHORTEST_PATH retourneert één kortst pad tussen knooppunten. Het biedt momenteel geen ondersteuning voor het retourneren van alle kortste paden tussen knooppunten; Het biedt ook geen ondersteuning voor het retourneren van alle paden tussen knooppunten.
  • De SHORTEST_PATH implementatie vindt een ongewogen kortst pad.
  • In sommige gevallen kunnen er ongeldige plannen worden gegenereerd voor query's met een hoger aantal hops, wat resulteert in hogere uitvoeringstijden van query's. Evalueer of queryhints zoals OPTION (HASH JOIN) en/of OPTION (MAXDOP 1) helpen.

Voorbeelden

Voor de voorbeeldquery's die hier worden weergegeven, gebruiken we de knooppunt- en edge-tabellen die zijn gemaakt in SQL Graph-voorbeeld

Een. Het kortste pad tussen twee personen zoeken

In het volgende voorbeeld vinden we het kortste pad tussen Jacob en Alice. We hebben het Person-knooppunt en friendOf edge nodig die zijn gemaakt op basis van SQL Graph-voorbeeld.

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. Zoek het kortste pad van een bepaald knooppunt naar alle andere knooppunten in de grafiek.

In het volgende voorbeeld vindt u alle personen waarmee Jacob is verbonden in de grafiek en het kortste pad vanaf Jacob naar al die mensen.

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. Tel het aantal hops/niveaus dat is doorkruist om van de ene persoon naar de andere in de grafiek te gaan.

In het volgende voorbeeld wordt het kortste pad tussen Jacob en Alice gevonden en wordt het aantal hops afgedrukt dat nodig is om van Jacob naar Alice te gaan.

 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. 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'

E. Mensen vinden precies twee hops weg van een bepaalde persoon

In het volgende voorbeeld wordt het kortste pad gevonden tussen Jacob en mensen die precies twee hops van hem af zijn in de grafiek.

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. Vind mensen 1-3 hops weg van een bepaalde persoon, die ook een specifiek restaurant leuk vinden

In het volgende voorbeeld vindt u het kortste pad tussen Jacob en alle mensen waarmee hij is verbonden in de grafiek 1-3, springt van hem weg. De query filtert ook verbonden personen op basis van hun voorkeur naar een bepaald restaurant. In het onderstaande voorbeeld retourneert LAST_NODE(Person2) het laatste knooppunt voor elk kortst pad. Het 'laatste' Person knooppunt dat is verkregen van LAST_NODE kan vervolgens worden 'gekoppeld' voor verdere doorkruisingen om de restaurants te vinden die ze leuk vinden.

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. Zoek het kortste pad van een bepaald knooppunt naar alle andere knooppunten in de grafiek, met uitzondering van 'lussen'

In het volgende voorbeeld vindt u alle personen waarmee Alice is verbonden in de grafiek en het kortste pad vanaf Alice naar al die personen. In het voorbeeld wordt expliciet gecontroleerd op 'lussen' waarbij het begin- en eindknooppunt van het pad hetzelfde zijn.

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'

Volgende stappen