Aracılığıyla paylaş


SHORTEST_PATH (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Bir graf için yinelemeli veya tekrarlı olarak aranan bir arama koşulu belirtir. SHORTEST_PATH SELECT deyiminde MATCH içinde graf düğümü ve kenar tablolarıyla kullanılabilir.

Transact-SQL söz dizimi kuralları

En kısa yol

SHORTEST_PATH işlevi şunları bulmanızı sağlar:

  • Verilen iki düğüm/varlık arasındaki en kısa yol
  • Tek kaynaklı en kısa yollar.
  • Birden çok kaynak düğümden birden çok hedef düğüme giden en kısa yol.

Giriş olarak rastgele bir uzunluk deseni alır ve iki düğüm arasında var olan en kısa yolu döndürür. Bu işlev yalnızca KAÇINCI içinde kullanılabilir. İşlev, belirli iki düğüm arasında yalnızca bir en kısa yol döndürür. Herhangi bir kaynak ve hedef düğüm çifti arasında aynı uzunlukta iki veya daha kısa yol varsa, işlev dolaşma sırasında ilk olarak bulunan tek bir yol döndürür. Rastgele uzunluk deseni yalnızca bir SHORTEST_PATH işlevi içinde belirtilebilir.

Tam söz dizimi için KAÇINCI (SQL Graph) bölümüne bakın.

PATH IÇIN

FOR PATH, rastgele bir uzunluk deseninde yer alan FROM yan tümcesindeki herhangi bir düğüm veya kenar tablosu adıyla kullanılmalıdır. FOR PATH, altyapıya düğüm veya kenar tablosunun, geçiş yapılan yol boyunca bulunan düğümlerin veya kenarların listesini temsil eden sıralı bir koleksiyon döndürdüğünü bildirir. Bu tablolardaki öznitelikler doğrudan SELECT yan tümcesinde yansıtılamaz. Bu tablolardan öznitelikleri yansıtmak için graf yolu toplama işlevleri kullanılmalıdır.

Rastgele uzunluk deseni

Bu desen, aşağıdakilerden herhangi biri olana kadar art arda geçiş yapılması gereken düğümleri ve kenarları içerir:

  • İstenen düğüme ulaşılır.
  • Desende belirtilen en fazla yineleme sayısı karşılanır.

Aşağıdaki iki desen niceleyicisi desteklenir:

  • '+': Deseni 1 veya daha fazla kez yineleyin. En kısa yol bulunur bulunmaz sonlandırılır.
  • {1,n}: Deseni 1 ile n kez yineleyin. En kısası bulunur bulunmaz sonlandır.

LAST_NODE

LAST_NODE() işlevi, iki rastgele uzunluk dolaşma deseninin zincirlenmesine olanak tanır. Şu senaryolarda kullanılabilir:

  • Sorguda birden fazla en kısa yol deseni kullanılır ve bir desen önceki desenin LAST düğümünde başlar.
  • En kısa iki yol deseni aynı LAST_NODE() birleştirilir.

Graf yolu sırası

Graf yolu sırası, çıkış yolundaki verilerin sırasını ifade eder. Çıkış yolu sırası her zaman desenin özyinelemeli olmayan bölümünden başlar ve ardından özyinelemeli bölümde görünen düğümler/kenarlar gelir. Sorgu iyileştirme/yürütme sırasında grafiğin geçiş sırasının çıkışta yazdırılan sıralamayla hiçbir ilgisi yoktur. Benzer şekilde, özyinelemeli desendeki okun yönü de grafik yolu sırasını etkilemez.

Graf yolu toplama işlevleri

Rastgele uzunluk deseninde yer alan düğümler ve kenarlar bir koleksiyon (bu yolda çapraz geçiş yapılan düğümler ve kenarlar) döndüreceğinden, kullanıcılar geleneksel tablename.attributename söz dizimini kullanarak öznitelikleri doğrudan yansıtamaz. Ara düğümden veya kenar tablolarından öznitelik değerlerini yansıtmanın gerekli olduğu sorgular için, geçiş yapılan yolda aşağıdaki grafik yolu toplama işlevlerini kullanın: STRING_AGG, LAST_VALUE, SUM, AVG, MIN, MAX ve COUNT. SELECT yan tümcesinde bu toplama işlevlerini kullanmak için genel söz dizimi şöyledir:

<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

STRING_AGG işlevi giriş olarak bir ifade ve ayırıcı alır ve bir dize döndürür. Kullanıcılar, çapraz geçiş yapılan yoldaki ara düğümlerden veya kenarlardan öznitelikleri yansıtmak için SELECT yan tümcesinde bu işlevi kullanabilir.

LAST_VALUE

Geçiş yapılan yolun son düğümünden öznitelikleri yansıtmak için LAST_VALUE toplama işlevi kullanılabilir. Bu işleve giriş olarak kenar tablosu diğer adı sağlamak bir hatadır; yalnızca düğüm tablo adları veya diğer adları kullanılabilir.

Son Düğüm: Son düğüm, KAÇINCI koşulundaki ok yönünden bağımsız olarak, çapraz geçiş yapılan yolda en son görünen düğüme başvurur. Örneğin: MATCH(SHORTEST_PATH(n(-(e)->p)+) ). Burada yoldaki son düğüm, son ziyaret edilen P düğümüdür.

Desende MATCH(SHORTEST_PATH((n<-(e)-)+p)) , son düğüm ziyaret edilen son N düğümüdür.

SUM

Bu işlev, sağlanan düğüm/kenar öznitelik değerlerinin veya çapraz geçiş yolunda görünen ifadenin toplamını döndürür.

COUNT

Bu işlev, yolda belirtilen düğüm/kenar özniteliğinin null olmayan değerlerinin sayısını döndürür. BAĞ_DEĞ_SAY işlevi işlecini * desteklemiyor. Söz dizimi hatasıyla sonuç kullanımı * denendi.

{  COUNT( <expression> )  <order_clause>  }

AVG

Sağlanan düğüm/kenar öznitelik değerlerinin veya çapraz geçiş yolunda görünen ifadenin ortalamasını döndürür.

MIN

Sağlanan düğüm/kenar öznitelik değerlerinden veya çapraz geçiş yolunda görünen ifadeden en düşük değeri döndürür.

MAX

Sağlanan düğüm/kenar öznitelik değerlerinden veya çapraz geçiş yolunda görünen ifadeden en yüksek değeri döndürür.

Remarks

  • SHORTEST_PATH işlevi yalnızca KAÇINCI içinde kullanılabilir.
  • LAST_NODE işlevi yalnızca SHORTEST_PATH içinde desteklenir.
  • SHORTEST_PATH işlevi düğümler arasındaki en kısa yolu döndürür. Şu anda düğümler arasındaki en kısa yolların tümünü döndürmeyi desteklememektedir ; ayrıca düğümler arasındaki tüm yolların döndürülmesi de desteklenmez.
  • SHORTEST_PATH uygulaması, sıklıksız en kısa yolu bulur.
  • Bazı durumlarda, daha fazla atlama sayısına sahip sorgular için hatalı planlar oluşturulabilir ve bu da sorgu yürütme sürelerinin daha yüksek olmasını sağlar. OPTION (HASH JOIN) ve / veya OPTION (MAXDOP 1) gibi sorgu ipuçlarının yardımcı olup olmadığını değerlendirin.

Examples

Burada gösterilen örnek sorgular için SQL Graph örneğinde oluşturulan düğüm ve kenar tablolarını kullanırız

A. İki kişi arasındaki en kısa yolu bulma

Aşağıdaki örnekte, Yakup ve Ayla arasında en kısa yolu buluyoruz. Person oluşturulan düğüme ve friendOf kenara ihtiyacımız var.

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. Belirli bir düğümden grafikteki diğer tüm düğümlere giden en kısa yolu bulun.

Aşağıdaki örnek, Jacob'ın bağlı olduğu tüm kişileri grafikte ve Jacob'dan başlayarak tüm bu kişilere giden en kısa yolu bulur.

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. Grafikte bir kişiden diğerine geçmek için geçiş yapılan atlama/düzey sayısını sayın.

Aşağıdaki örnek, Yakup ve Ayla arasındaki en kısa yolu bulur ve Yakup'tan Ayla'ya gitmek için gereken atlama sayısını yazdırır.

 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. Belirli bir kişiden 1-3 atlama uzakta kişileri bulma

Aşağıdaki örnek, Jacob ile Jacob'ın bağlı olduğu tüm kişiler arasındaki en kısa yolu grafikte bir ila üç atlama ötede bulur.

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. Belirli bir kişiden tam olarak iki atlama uzakta olan kişileri bulma

Aşağıdaki örnek, grafikte Jacob ile ondan tam olarak iki atlama uzakta olan kişiler arasındaki en kısa yolu bulur.

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. Belirli bir restorana benzeyen belirli bir kişiden 1-3 atlama uzakta olan kişileri bulun

Aşağıdaki örnek, 1-3 atlama uzaktaki grafikte Yakup ile bağlandığı tüm kişiler arasındaki en kısa yolu bulur. Sorgu ayrıca bağlı kişileri belirli bir restorana göre filtreler. Aşağıdaki örnekte, LAST_NODE(Person2) en kısa her yol için son düğümü döndürür. Bundan sonra elde edilen Person "son" LAST_NODE düğüm, beğendikleri restoranları bulmak için daha fazla geçiş için "zincirlenebilir".

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. "Döngüler" hariç, belirli bir düğümden grafikteki diğer tüm düğümlere giden en kısa yolu bulma

Aşağıdaki örnek, Alice'in grafikte bağlı olduğu tüm kişileri ve Alice'ten başlayarak tüm bu kişilere giden en kısa yolu bulur. Örnek, yolun başlangıç ve bitiş düğümünün aynı olduğu "döngüleri" açıkça denetler.

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'

Sonraki Adımlar