Microsoft Fabric'te grafik için GQL dil kılavuzu

GQL (Graph Sorgu Dili), graf veritabanları için ISO standartlaştırılmış sorgu dilidir. Microsoft Fabric'te graf verilerini sorgulamak, analiz etmek ve grafla verimli bir şekilde çalışmak için GQL kullanın.

SQL'i standartlaştıran ISO çalışma grubu GQL geliştirir. Sonuç olarak, GQL ifadeler, koşul ve veri türleri dahil olmak üzere SQL ile birçok kavramı paylaşır. SQL deneyiminiz varsa bu bilgilerin çoğunu GQL'ye uygulayabilirsiniz.

Bu makale, grafikte GQL için kapsamlı bir başvuru sağlar. Aşağıdakileri kapsar:

  • Temel kavramlar: Graf veri yapıları, desenler ve sorgu temelleri
  • Temel deyimler: MATCH, FILTER, LET, ORDER BY, LIMIT, ve RETURN
  • Veri türleri ve ifadeler: Değer türleri, işleçler ve yerleşik işlevler
  • Gelişmiş teknikler: Çok deyimli oluşturma, değişken kapsam belirleme ve toplama stratejileri

Uyarı

GQL için resmi Uluslararası Standart ISO/IEC 39075 Bilgi Teknolojisi - Veritabanı Dilleri - GQL'dir.

Tam dil başvurusu yerine görev odaklı rehberlik arıyorsanız, nasıl yapılır kılavuzlarına bakın:

Önkoşullar

Başlamadan önce şu kavramları bildiğinizden emin olun:

  • Basik veritabanlarını anlama - İlişkisel (SQL), NoSQL veya grafik gibi herhangi bir veritabanı sistemiyle ilgili deneyim yararlı olur.
  • Grafik kavramları - Bağlı verilerdeki düğümleri, kenarları ve ilişkileri anlama.
  • Sorgu temelleri - Filtreleme, sıralama ve toplama gibi temel sorgu kavramları hakkında bilgi.

Önerilen arka plan:

  • SQL veya openCypher dilleri deneyimi, GQL söz dizimini öğrenmeyi kolaylaştırır (bunlar GQL'nin kökleridir).
  • Veri modellemeyi tanıma, grafik şeması tasarımına yardımcı olur.
  • Graf verileri için özel kullanım örneğinizi anlama.

Neye ihtiyacınız var:

  • Sorgu özelliklerine sahip bir grafik çalışma alanına erişim.
  • Örnek veriler veya sosyal ağ örneklerimizle çalışmaya istekli olma.
  • Sorgu yazmak için temel metin düzenleyicisi.

Tip

Grafik veritabanlarını kullanmaya yeni başladıysanız, bu kılavuza devam etmeden önce graf veri modellerine genel bakış ile başlayın.

GQL'i özel kılan şey

GQL özellikle graf verileri için tasarlanmıştır. Bu tasarım, bağlı bilgilerle çalışmayı doğal ve sezgisel hale getirir.

GQL, ilişkileri ifade etmek için tablo birleşimlerini kullanan SQL'in aksine görsel graf desenlerini kullanır. Bu desenler varlıkların bağlanma şeklini doğrudan yansıtarak sorguların daha kolay okunmasını ve daha kolay akıl yürütmesini sağlar.

1999'da doğmuş kişileri ve arkadaşlarını (birbirini bilen kişiler) bulmak istediğinizi varsayalım. GQL, görsel graf deseni kullanarak bu koşulu şu şekilde ifade eder:

MATCH (person:Person)-[:knows]-(friend:Person)
WHERE person.birthday < 19990101 
  AND friend.birthday < 19990101
RETURN person.firstName || ' ' || person.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name

Bu sorgu, her ikisi de 1999'da doğmuş olan arkadaşları (birbirini bilen kişiler) bulur. Desen (person:Person)-[:knows]-(friend:Person) , aradığınız ilişki yapısını görsel olarak gösterir; verilerinizin diyagramını çizmeye çok benzer.

GQL ile ilgili temel bilgiler

Sorgulara girmeden önce, GQL'nin temelini oluşturan şu temel kavramları anlayın:

  • Grafikler verilerinizi düğümler (varlıklar) ve kenarlar (ilişkiler) olarak depolar ve bunların her birinde etiketler ve özellikler bulunur.
  • Graf türleri şemalar gibi davranır ve grafiğinizde hangi düğümlerin ve kenarların bulunabileceğini tanımlar.
  • Kısıtlamalar , graf türlerinin veri bütünlüğünü zorlamak için graflara uyguladığı diğer kurallar ve kısıtlamalardır.
  • Sorgular, verileri işlemek ve MATCH sonuçları göstermek için , FILTERve gibi RETURNdeyimleri kullanır.
  • Desenler , sezgisel görsel söz dizimini kullanarak bulmak istediğiniz grafik yapılarını açıklar.
  • İfadeler , SQL ifadelerine benzer şekilde verileriniz üzerinde hesaplamalar ve karşılaştırmalar yapar.
  • Koşul, sorgular içindeki sonuçları filtreleyen boole değeri ifadeleridir.
  • Değer türleri , işleyebileceğiniz ve depolayabileceğiniz değer türlerini tanımlar.

Grafik verilerini anlama

GQL ile etkili bir şekilde çalışmak için graf verilerinin nasıl yapılandırıldığını anlamanız gerekir. Bu temel, daha iyi sorgular yazmanıza ve verilerinizi etkili bir şekilde modellemenize yardımcı olur.

Düğümler ve kenarlar: yapı taşları

GQL'de etiketli özellik graflarıyla çalışırsınız. Graf iki tür öğeden oluşur:

  • Düğümler genellikle sisteminizdeki varlıkları (kişiler, kuruluşlar, gönderiler veya ürünler gibi) temsil eder. Bunlar, etki alanınızda bulunan bağımsız nesnelerdir. Bazen düğüm köşelerini de çağırırsınız.

  • Kenarlar varlıklar arasındaki ilişkileri temsil eder ("fiiller") - varlıklarınızın nasıl bağlanıp etkileşime geçtiğini gösterir.

Örneğin, insanlar birbirini tanır (:knows), belirli bölgelerde faaliyet gösteren organizasyonlar (:operates), veya ürün satın alan müşteriler (:purchased).
Bazen kenar ilişkilerini de çağırırsınız.

Her grafik öğesi şu özelliklere sahiptir:

  • Benzersiz olarak tanımlayan bir iç kimlik
  • Bir veya daha fazla etiket - veya Persongibi knows açıklayıcı adlar. Grafikte kenarlar her zaman tam olarak bir etikete sahiptir.
  • Özellikler - öğesiyle ilgili verileri depolayan ad-değer çiftleri (veya gibi firstName: "Alice"birthday: "19730108").

Grafikler nasıl yapılandırılır?

Her kenar tam olarak iki düğüme bağlanır: kaynak ve hedef. Bu bağlantı grafiğin yapısını oluşturur ve varlıkların birbiriyle ilişkisini gösterir. Kenarların yönü önemlidir- başka Person birinin followsPerson yönlendirilmiş bir ilişki oluşturduğu kişi.

Uyarı

graph şu anda dolaylı olmayan kenarları desteklememektedir.

Grafikte desteklenen özellik grafikleri her zaman iyi biçimlendirilmiş olur, yani her kenar iki geçerli düğümü bağlar. Grafikte bir kenar görürseniz, her iki uç noktası da aynı grafikte bulunur.

Graf modelleri ve grafik türleri

Graf modeli, grafın yapısını açıklar. Uygulama etki alanınız için bir veritabanı şeması gibi davranır. Graf modelleri şunları tanımlar:

  • Hangi düğümlerin ve kenarların bulunabileceği
  • Hangi etiketlere ve özelliklere sahip olabilirler?
  • Düğümler ve kenarlar nasıl bağlanır?

Graf modelleri ayrıca kısıtlamalar, özellikle de her düğümü benzersiz olarak tanımlayan özellikleri belirten düğüm anahtarı kısıtlamaları aracılığıyla veri bütünlüğünü güvence altına alır.

Uyarı

Grafik modellerini GQL standart söz dizimlerini kullanarak belirtebilirsiniz. Bu örnekte bunlara grafik türleri adı verilir.

Pratik bir örnek: sosyal ağ

Bu belge boyunca, bir sosyal ağ örneği GQL kavramlarını gösterir. Bu etki alanını anlamak, örnekleri izlemenize ve kendi verilerinize benzer desenler uygulamanıza yardımcı olur.

Sosyal ağ şemasını gösteren diyagram.

Uyarı

Sosyal ağ örneği, GDC (Graph Veri Konseyi) tarafından yayımlanan LDBC SNB'sinden (LDBC Sosyal Ağ Karşılaştırması) türetilmiştir. Daha fazla bilgi için bkz. "LDBC Sosyal Ağ Karşılaştırması".

Sosyal ağ varlıkları

Sosyal ağımız, etki alanının varlıklarını temsil eden şu ana düğüm türlerini içerir:

kişilerin adları, doğum günleri ve cinsiyetleri gibi kişisel bilgileri vardır. Şehirlerde yaşarlar ve sosyal bağlantılar oluştururlar.

Yerler coğrafi hiyerarşi oluşturur:

  • "New York" veya "Londra" gibi şehirler
  • "Birleşik Devletler" veya "Birleşik Krallık" gibi Countries/regions
  • "Kuzey Amerika" veya "Avrupa" gibi kıtalar

İnsanların zaman geçirdiği kuruluşlar:

  • İnsanların eğitim gördüğü üniversiteler
  • kişilerin çalıştığı şirketler

İçerik ve tartışmalar:

  • Gönderi içeren başlıklara sahip forumlar
  • İçerik, dil ve isteğe bağlı görüntüler içeren gönderiler
  • Gönderileri veya diğer yorumları yanıtlayan açıklamalar
  • İçeriği kategorilere ayıran ve ilgi alanlarını temsil eden etiketler

Her şey nasıl bağlanır?

Varlıklar arasındaki bağlantılar ağı ilginç hale getirir:

  • İnsanlar birbirlerini tanır (arkadaşlıklar, :knows).
  • İnsanlar şirketlerde (:workAt) veya üniversitelerde (:studyAt) çalışır.
  • Kişiler gönderiler ve yorumlar (:hasCreator) oluşturur.
  • Gönderileri ve yorumları (:likes) seven kişiler.
  • Gönderiler, forumlar ve yorumlar etiketlere (:hasTag) sahip olabilir.
  • Kişilerin belirli etiketlerle ( ) ilgi alanları vardır:hasInterest.
  • Forumlarda gönderiler (:containerOf) bulunur ve üyeleri (:hasMember) ve moderatörleri (:hasModerator).

Graf kenarları etki alanı ilişkilerini temsil eder. Bu zengin ağ ilginç sorgular ve analizler için birçok fırsat oluşturur.

İlk GQL sorgularınız

Grafla ilgili temel bilgileri anladığınıza göre GQL kullanarak graf verilerini sorgulamayı görelim. Bu örnekler basitten karmaşıka doğru derlenip GQL'nin yaklaşımının grafik sorgularını nasıl sezgisel ve güçlü hale getirdiğini gösterir.

Basit bir başlangıç: tüm kişileri bulma

Mümkün olan en temel sorguyla başlayın. Grafikteki tüm kişilerin:Person adlarını (ad, soyadı) bulun.

MATCH (p:Person)
RETURN p.firstName, p.lastName

Bu sorgu aşağıdaki gibi çalışır:

  1. MATCH etiketli Persontüm düğümleri bulur.
  2. RETURN adlarını ve soyadlarını gösterir.

Filtreleme ekleme: belirli kişileri bulma

Şimdi belirli özelliklere sahip kişileri bulun. Bu durumda, Alice adlı herkesi bulun ve adlarını ve doğum günlerini gösterin.

MATCH (p:Person)
FILTER p.firstName = 'Annemarie'
RETURN p.firstName, p.lastName, p.birthday

Bu sorgu aşağıdaki gibi çalışır:

  1. MATCH Kişi etiketli tüm düğümleri (p) bulur.
  2. FILTER adı Alice olan düğümler (p).
  3. RETURN adlarını, soyadını ve doğum gününü gösterir.

Temel sorgu yapısı

Temel GQL sorgularının tümü tutarlı bir desen izler: verileri bulmak, filtrelemek ve döndürmek için birlikte çalışan deyim dizisi. Çoğu sorgu, grafikte desen bulmakla başlar MATCH ve çıktıyı belirtmek için sona RETURN erer.

İşte birbirini tanıyan ve aynı doğum gününü paylaşan çiftleri bulan basit bir sorgu, ardından bu arkadaş çiftlerinin toplam sayısını döndürüyor.

MATCH (n:Person)-[:knows]-(m:Person)
FILTER n.birthday = m.birthday
RETURN count(*) AS same_age_friends

Bu sorgu aşağıdaki gibi çalışır:

  1. MATCH birbirini bilen tüm düğüm çiftlerini Person bulur.
  2. FILTER yalnızca her iki kişinin de doğum gününün aynı olduğu çiftleri tutar.
  3. RETURN bu tür arkadaş çiftlerinin sayısını sayar.

Tip

Ayrıca bir yan tümcesi ekleyerek WHERE doğrudan bir desenin parçası olarak filtreleme gerçekleştirebilirsiniz. Örneğin, MATCH (n:Person WHERE n.age > 23) yalnızca özelliği 23'ten büyük olan Person düğümleri eşleştirirage.

GQL, C stili // çizgi açıklamalarını, SQL stili -- çizgi açıklamalarını ve C stili /* */ blok açıklamalarını destekler.

Yaygın ifadeler

  • MATCH: Aranan grafik desenini belirler—burada ilgilendiğiniz verinin yapısını tanımlarsınız.
  • LET: Eşleşen verilere dayalı yeni değişkenler veya hesaplanan değerler atar—sonuca türetilmiş sütunlar ekler.
  • FILTER: Koşullar uygulayarak sonuçları daraltır—kriterleri karşılamayan satırları kaldırır.
  • ORDER BY: Filtrelenen verileri sıralar—çıktıyı bir veya daha fazla alana göre düzenlemeye yardımcı olur.
  • OFFSET ve LIMIT: Geri dönen satır sayısını kısıtlayın—sayfa oluşturma veya üst-k sorguları için faydalıdır.
  • RETURN: Son çıktıyı belirtir—sonuç kümesine hangi verilerin dahil edilmesini sağlar ve toplama işlemi gerçekleştirir.

Deyimler birlikte nasıl çalışır?

GQL ifadeleri bir boru hattı oluşturur ve her ifadenin bir önceki ifadenin çıktısını işler. Bu ardışık yürütme, sorguların kolayca okunmasını ve hata ayıklamasını sağlar çünkü uygulama sırası okuma sırasıyla eşleşir.

Önemli noktalar:

  • Cümleler etkili bir şekilde sıralı olarak yürütülür.
  • Her ifade veriyi dönüştürür ve bir sonrakine iletir.
  • Bu işlem, karmaşık sorguları basitleştiren net, öngörülebilir bir veri akışı oluşturur.

Önemli

Graf, performansı en üst düzeye çıkarmak için deyimlerin yürütülmesini yeniden sıralayabilir ve tek tek deyimleri paralel olarak çalıştırabilir. Bu iyileştirmeler sonuçların doğruluğunu etkilemez.

Deyim oluşturma örneği

Aşağıdaki GQL sorgusu, adlarında "Air" olan şirketlerde çalışan ilk 10 kişiyi bulur, onları tam isimlerine göre ayırır ve tam isimleriyle birlikte şirket adlarını geri getirir.

-- Data flows: Match → Let → Filter → Order → Limit → Return
MATCH (p:Person)-[:workAt]->(c:Company)           -- Input: unit table, Output: (p, c) table
LET fullName = p.firstName || ' ' || p.lastName   -- Input: (p, c) table, Output: (p, c, fullName) table
FILTER c.name CONTAINS 'Air'                      -- Input: (p, c, fullName) table, Output: filtered table
ORDER BY fullName                                 -- Input: filtered table, Output: sorted table
LIMIT 10                                          -- Input: sorted table, Output: top 10 rows table
RETURN fullName, c.name AS companyName            -- Input: top 10 rows table
                                                  -- Output: projected (fullName, companyName) result table

Bu sorgu aşağıdaki gibi çalışır:

  1. MATCH adında "Air" olan şirketlerde çalışan kişileri bulur.
  2. LET ad ve aile adlarını birleştirerek tam adlar oluşturur.
  3. FILTER yalnızca Contoso çalışanlarını tutar.
  4. ORDER BY tam ada göre sıralar.
  5. LIMIT ilk 10 sonucu alır.
  6. RETURN adları ve şirket konumlarını döndürür.

Değişkenler verilerinizi birbirine bağlar

Önceki örneklerde , pve c gibi fullNamedeğişkenler deyimler arasında veri taşır. Bir değişken adını yeniden kullandığınızda, GQL otomatik olarak aynı verilere başvurduğundan emin olur ve güçlü birleştirme koşulları oluşturur. Değişkenler bazen bağlama değişkenleri olarak da adlandırılır.

Değişkenleri farklı şekillerde kategorilere ayırabilirsiniz:

Bağlama kaynağına göre:

  • Desen değişkenleri - eşleşen grafik desenlerine bağlı
  • Normal değişkenler - diğer dil yapılarına bağlı

Desen değişkeni türleri:

  • Öğe değişkenleri - grafik öğesi başvuru değerlerine bağlama
    • Düğüm değişkenleri - tek tek düğümlere bağlama
    • Kenar değişkenleri - tek tek kenarlara bağlama
  • Yol değişkenleri - eşleşen yolları temsil eden yol değerlerine bağlama

Başvuru derecelerine göre:

  • Tekil değişkenler - desenlerden tek tek öğe başvuru değerlerine bağlama
  • Grup değişkenleri - değişken uzunluklu desenlerden öğe başvuru değerleri listelerine bağlama (bkz . Gelişmiş Toplama Teknikleri)

Yürütme sonuçları ve sonuçları

Bir sorgu çalıştırdığınızda, aşağıdakilerden oluşan bir yürütme sonucu elde edersiniz:

  • Deyiminizdeki verileri içeren RETURN.
  • Sorgunun başarılı olup olmadığını gösteren durum bilgileri.

Sonuç tabloları

Sonuç tablosu (varsa) sorgu yürütmenin gerçek sonucudur.

Sonuç tablosu, sütunlarının adı ve türü, sonuçları görüntülemek için kullanılacak tercih edilen sütun adı dizisi, tablonun sıralı olup olmadığı ve gerçek satırların kendisi hakkında bilgi içerir.

Uyarı

Yürütme başarısız olursa, yürütme sonucuna sonuç tablosu eklenmez.

Durum bilgileri

Sorgu yürütme sırasında, işlem hatalar veya uyarılar gibi dikkat çekici çeşitli koşulları algılar. Her koşul, yürütme sonucunun durum bilgilerine bir durum nesnesi tarafından kaydedilir.

Durum bilgileri birincil durum nesnesi ve diğer durum nesnelerinin (muhtemelen boş) bir listesinden oluşur. Birincil durum nesnesi her zaman var olur ve sorgu yürütmenin başarılı mı yoksa başarısız mı olduğunu gösterir.

Her durum nesnesi, kaydedilen koşulu tanımlayan beş basamaklı bir durum kodu (GQLSTATUS olarak adlandırılır) ve bunu açıklayan bir ileti içerir.

Başarı durum kodları:

GQLSTATUS Message Ne zaman
00000 not: başarılı tamamlama En az bir satırla başarı
00001 not: başarılı tamamlama - atlanmış sonuç Tablo olmadan başarı (şu anda kullanılmayan)
02000 not: veri yok Sıfır satırla başarı

Diğer durum kodları, sorgu yürütme işleminin algıladığınız diğer hataları veya uyarıları gösterir.

Önemli

Uygulama kodunda, belirli koşulları test etmek için her zaman durum kodlarına güvenin. Durum kodlarının kararlı olması garanti edilir ve genel anlamları gelecekte değişmez. Bir durum kodu için bildirilen somut ileti gelecekte sorguya bağlı olarak veya hatta aynı sorgunun yürütmeleri arasında değişeebileceği için iletilerin içeriğini test etmeyin.

Ayrıca, durum nesneleri temel alınan bir neden durum nesnesi ve kaydedilen koşulu karakterize eden daha fazla bilgi içeren bir tanılama kaydı içerebilir.

Temel kavramlar ve deyimler

Bu bölüm, etkili GQL sorguları yazmak için ihtiyacınız olan temel yapı taşları kapsar. Her kavram pratik sorgu yazma becerilerine yöneliktir.

Graf desenleri: yapıyı bulma

Graf desenleri, GQL sorgularının kalbidir. Aradığınız veri yapısını bulmak istediğiniz ilişkilere benzeyen sezgisel, görsel söz dizimi kullanarak açıklamanıza olanak sağlar.

Basit desenler:

Temel ilişki desenleriyle başlayın:

-- Find direct friendships
(p:Person)-[:knows]->(f:Person)

-- Find people working at any company
(p:Person)-[:workAt]->(c:Company)

-- Find cities in any country/region
(ci:City)-[:isPartOf]->(co:Country)  

Belirli verilerle desenler:

-- Find who works at Microsoft specifically
(p:Person)-[:workAt]->(c:Company)
WHERE p.firstName = 'Annemarie'

-- Find friends who are both young
(p:Person)-[:knows]->(f:Person)  
WHERE p.birthday > 19950101 AND f.birthday > 19950101

Esnek varlık seçimi için etiket ifadeleri:

(:Person|Company)-[:isLocatedIn]->(p:City|Country)  -- OR with |
(:Place&City)                                       -- AND with &  
(:Person&!Company)                                  -- NOT with !

Uyarı

Düğümler birden çok etikete sahip olabilir, ancak birden çok etikete sahip kenar türleri henüz desteklenmiyor.

Etiket ifadeleri, farklı düğüm türlerini tek bir düzende eşleştirmenize olanak sağlayarak sorgularınızı daha esnek hale getirir.

Değişken yeniden kullanımı güçlü birleşimler oluşturur:

-- Find coworkers: people who work at the same company
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c)

Değişkenin c yeniden kullanılması, her iki kişinin de aynı şirkette çalışmasını sağlar ve otomatik birleştirme kısıtlaması oluşturur. Bu desen, "aynı varlık" ilişkilerini ifade etmek için kullanılan bir anahtar desendir.

Önemli

Kritik içgörü: Desenlerde değişken yeniden kullanımı yapısal kısıtlamalar oluşturur. "Aynı şirkette çalışan arkadaşlar" veya "aynı şehirdeki insanlar" gibi karmaşık graf ilişkilerini ifade etmek için bu tekniği kullanın.

WHERE ile desen düzeyi filtreleme:

-- Filter during pattern matching (more efficient)
(p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)

-- Filter edges during matching  
(p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)

Sınırlanmış değişken uzunluklu desenler:

(:Person)-[:knows]->{1,3}(:Person)  -- Friends up to 3 degrees away

Dolaşmayı denetlemek için yol modları:

Yol modları, değişken uzunlukta geçiş sırasında sorgu altyapısının yinelenen öğeleri nasıl işlediğini denetler:

Yol modu Açıklama
WALK Yinelenen düğümlere ve kenarlara izin verir. Geçişte kısıtlama yok.
TRAIL Yinelenen kenar yok, ancak düğümler yinelenebilir. Bu, varsayılan yol modudur.
SIMPLE Yinelenen düğüm yok (ilk ve son düğüm eşit olabilir hariç).
ACYCLIC Yinelenen düğüm yok, bu da yoldaki herhangi bir döngüyü engelliyor.

Graf geçişi sırasında döngüleri önlemek için desenleri kullanın TRAIL ve her kenarın en fazla bir kez ziyaret edildiğinden emin olun:

-- Find paths without visiting the same :knows edge twice
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS num_connections
-- Find acyclic paths in social networks
MATCH TRAIL (p:Person)-[e:knows]->{,3}(celebrity:Person)
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  celebrity.firstName || ' ' || celebrity.lastName AS celebrity_name, 
  count(e) AS distance
LIMIT 1000

Hiçbir düğümün iki kez ziyaret edildiğinden emin olmanız gerektiğinde kullanın ACYCLIC :

-- Find paths where no person appears more than once
MATCH ACYCLIC (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice'
RETURN dst.firstName, dst.lastName
LIMIT 100

Değişken uzunlukta kenar bağlaması:

Değişken uzunluklu desenlerde kenar değişkenleri bağlama göre farklı bilgiler yakalar:

-- Edge variable 'e' binds to a single edge for each result row
MATCH (p:Person)-[e:knows]->(friend:Person)
RETURN p.firstName, e.creationDate, friend.firstName  -- e refers to one specific relationship
LIMIT 1000

-- Edge variable 'e' binds to a group list of all edges in the path
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)  
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  friend.firstName || ' ' || friend.lastName AS friend_name, 
  -- e is a list
  size(e) AS num_edges
LIMIT 1000

Bu ayrım, uç değişkenlerini doğru kullanmak için çok önemlidir.

Birden çok ilişki içeren karmaşık desenler:

MATCH (p:Person), (p)-[:workAt]->(c:Company), (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, p.lastName, c.name AS company_name, city.name AS city_name
LIMIT 1000

Bu düzen hem iş yeri hem de ikametgahlarıyla birlikte kişileri bulur ve bir kişinin birden çok başka varlık ile nasıl bağlantı kuracaklarını gösterir.

Çekirdek deyimleri

GQL, grafik verilerinizi adım adım işlemek için birlikte çalışan belirli deyim türleri sağlar. Bu deyimleri anlamak, etkili sorgular oluşturmak için gereklidir.

MATCH açıklama

Syntax:

MATCH <graph pattern>, <graph pattern>, ... [ WHERE <predicate> ]

deyimi MATCH giriş verilerini alır ve grafik desenlerini bulur. Giriş değişkenlerini desen değişkenleriyle birleştirir ve tüm eşleşen birleşimleri çıkışlar.

Giriş ve çıkış değişkenleri:

-- Input: unit table (no columns, one row)
-- Pattern variables: p, c  
-- Output: table with (p, c) columns for each person-company match
MATCH (p:Person)-[:workAt]->(c:Company)

WHERE kullanarak deyim düzeyi filtreleme:

-- Filter pattern matches
MATCH (p:Person)-[:workAt]->(c:Company) WHERE p.lastName = c.name

kullanarak WHEREtüm eşleşmeleri filtreleyebilirsiniz. Bu yaklaşım ayrı FILTER bir deyimden kaçınıyor.

Giriş değişkenlerini kullanarak birleştirme:

MATCH İlk deyim olmadığında, giriş verilerini desen eşleşmeleriyle birleştirir:

...
-- Input: table with 'targetCompany' column
-- Implicit join: targetCompany (equality join)
-- Output: table with (targetCompany, p, r) columns
MATCH (p:Person)-[r:workAt]->(targetCompany)

Önemli

Graph temel ve tam doğrusal deyim bileşimini (zincirleme MATCH, LET, FILTER, RETURNve diğer çekirdek deyimleri) destekler. , , UNION DISTINCTEXCEPTve INTERSECT gibi OTHERWISEişlemleri ayarlama henüz desteklenmiyor. Daha fazla bilgi için geçerli sınırlamalarla ilgili makaleye bakın.

Anahtar birleştirme davranışları:

Veri birleştirmeyi nasıl MATCH işler:

  • Değişken eşitliği: Giriş değişkenleri, eşitlik eşleştirmesi kullanarak desen değişkenleriyle birleşir
  • İç birleşim: Desen eşleşmeleri olmayan giriş satırları atılır. Sol dış birleşim davranışı için kullanın OPTIONAL MATCH .
  • Filtreleme sırası: Desen eşleştirme tamamlandıktan sonra deyim düzeyi WHERE filtreler
  • Desen bağlantısı: Doğru birleştirme için birden çok desenin en az bir değişken paylaşması gerekir
  • Performans: Paylaşılan değişkenler verimli birleştirme kısıtlamaları oluşturur

Önemli

Kısıtlama: Bu MATCH deyim ilk deyim değilse, en az bir giriş değişkeni bir desen değişkeniyle birleştirilmelidir. Birden çok desenin ortak bir değişkeni olmalıdır.

Birden çok desen paylaşılan değişkenler gerektirir:

-- Shared variable 'p' joins the two patterns
-- Output: people with both workplace and residence data
MATCH (p:Person)-[:workAt]->(c:Company), 
      (p)-[:isLocatedIn]->(city:City)

OPTIONAL MATCH açıklama

Syntax:

OPTIONAL MATCH <graph pattern> [ WHERE <predicate> ]

OPTIONAL MATCH gibi MATCH çalışır ancak sol dış birleşim semantiği kullanır. Desen bir giriş satırı için eşleşme bulursa, sorgu satırı atmak yerine eşleşmeyen değişkenlerin değerleriyle NULL korur.

Example:

-- Find all people and, if available, their workplace
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company_name

Herhangi bir şirkette çalışmayan kişiler, için NULLile company_name sonuçlarda görünmeye devam ediyor.

Tip

SQL'e OPTIONAL MATCHbenzer şekilde belirli bir ilişkisi olmayan varlıkları eklemek istediğinizde kullanınLEFT JOIN.

LET açıklama

Syntax:

LET <variable> = <expression>, <variable> = <expression>, ...

deyimi LET hesaplanan değişkenler oluşturur ve sorgu işlem hattınızda veri dönüştürmeyi etkinleştirir.

Temel değişken oluşturma:

MATCH (p:Person)
LET fullName = p.firstName || ' ' || p.lastName
RETURN *
LIMIT 1000

Karmaşık hesaplamalar:

MATCH (p:Person)
LET adjustedAge = 2000 - (p.birthday / 10000),
    fullProfile = p.firstName || ' ' || p.lastName || ' (' || p.gender || ')'
RETURN *
LIMIT 1000

Önemli davranışlar:

  • Sorgu altyapısı her giriş satırı için ifadeleri değerlendirir.
  • Sonuçlar çıkış tablosunda yeni sütunlara dönüşür.
  • Değişkenler yalnızca önceki deyimlerdeki mevcut değişkenlere başvurabilir.
  • Sorgu altyapısı, bir LET deyimdeki birden çok atamayı paralel olarak değerlendirir (çapraz başvuru yoktur).

FILTER açıklama

Syntax:

FILTER [ WHERE ] <predicate>

deyimi, FILTER sorgu işlem hattınızda hangi verilerin devam ettiği üzerinde hassas denetim sağlar.

Temel filtreleme:

MATCH (p:Person)
FILTER p.birthday < 19980101 AND p.gender = 'female'
RETURN *

Karmaşık mantıksal koşullar:

MATCH (p:Person)
FILTER (p.gender = 'male' AND p.birthday < 19940101) 
  OR (p.gender = 'female' AND p.birthday < 19990101)
  OR p.browserUsed = 'Edge'
RETURN *

Null kullanan filtreleme desenleri:

Null değerleri güvenli bir şekilde işlemek için şu desenleri kullanın:

  • Değerleri denetleyin: p.firstName IS NOT NULL - bir ad var
  • Verileri doğrulama: p.id > 0 - geçerli kimlik
  • Eksik verileri işleme: NOT coalesce(p.locationIP, '10.x.x.x') STARTS WITH '10.x.x.x' - yerel ağdan bağlanmadı
  • Koşulları birleştirme: Karmaşık mantık için açık null denetimlerle kullanma AND/OR

Dikkat

Null değerler içeren koşulların, bu satırları filtreleyen değerini döndürdüğünü UNKNOWNunutmayın. Null-kapsayıcı mantığa ihtiyacınız olduğunda açık IS NULL denetimler kullanın.

ORDER BY açıklama

Syntax:

ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ...

Hesaplanan ifadelerle çok düzeyli sıralama:

MATCH (p:Person)
RETURN *
ORDER BY p.firstName DESC,               -- Primary: by first name (Z-A)
         p.birthday ASC,                 -- Secondary: by age (oldest first)
         p.id DESC                       -- Tertiary: by ID (highest first)

Sıralamada null işleme:

ORDER BY coalesce(p.gender, 'not specified') DESC -- Treat NULL as 'not specified'

Sıralama davranışı ayrıntıları:

Nasıl ORDER BY çalıştığını anlama:

  • Sorgu altyapısı her satır için ifadeleri değerlendirir, ardından sonuçlar satır sırasını belirler.
  • Birden çok sıralama anahtarı hiyerarşik sıralama (birincil, ikincil, üçüncül vb.) oluşturur.
  • NULL karşılaştırmalarda her zaman en küçük değerdir.
  • ASC (artan) varsayılan düzendir ve açıkça belirtmeniz DESC gerekir (azalan).
  • Yalnızca depolanan özelliklere göre değil, hesaplanan değerlere göre sıralayabilirsiniz.

Dikkat

Yalnızca aşağıdaki deyim, oluşturulan sıralama düzenini ORDER BY görebilir. Bu nedenle, ORDER BY ardından RETURN * gelen sıralı bir sonuç üretmez.

Karşılaştırmak:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
ORDER BY r.creationDate DESC
/* intermediary result _IS_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
/* final result _IS_ _NOT_ guaranteed to be ordered here  */

ile:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
/* intermediary result _IS_ _NOT_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
ORDER BY r.creationDate DESC
/* final result _IS_ guaranteed to be ordered here              */

Bu farkın "Top-k" sorguları için hemen sonuçları vardır: LIMIT her zaman hedeflenen sıralama düzenini oluşturan deyimi izlemelidir ORDER BY .

OFFSET ve LIMIT deyimleri

Syntax:

  OFFSET <offset> [ LIMIT <limit> ]
| LIMIT <limit>

Yaygın düzenler:

-- Basic top-N query
MATCH (p:Person)
RETURN *
ORDER BY p.id DESC
LIMIT 10                                 -- Top 10 by ID

Önemli

Tahmin edilebilir sayfalandırma sonuçları için her zaman sorgular arasında tutarlı satır sıralaması sağlamak için önce ORDER BY ve OFFSET kullanınLIMIT.

RETURN: temel sonuç projeksiyonu

Syntax:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

deyimi, RETURN sonuç tablosunda hangi verilerin görüneceğini belirterek sorgunuzun son çıkışını oluşturur.

Temel çıkış:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday, 
       c.name

Netlik için diğer adları kullanma:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS first_name, 
       p.lastName AS last_name,
       c.name AS company_name

Sıralama ve üst k ile birleştirin:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday AS birth_year, 
       c.name AS company
ORDER BY birth_year ASC
LIMIT 10

DISTINCT kullanarak yinelenen işleme:

-- Remove duplicate combinations
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN DISTINCT p.gender, p.browserUsed, p.birthday AS birth_year
ORDER BY p.gender, p.browserUsed, birth_year

Toplama ile birleştir:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT p) AS employee_count

RETURN ile GROUP BY: gruplandırılmış sonuç projeksiyonu

Syntax:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
GROUP BY <variable>, <variable>, ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

Satırları paylaşılan değerlere ve her grup içindeki işlem toplama işlevlerine göre gruplandırmak için kullanın GROUP BY .

Toplama ile temel gruplandırma:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, 
       count(*) AS employeeCount,
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName
ORDER BY employeeCount DESC

Çok sütunlu gruplandırma:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS person_count,
       avg(p.birthday) AS avg_birth_year,
       min(p.creationDate) AS first_joined,
       max(p.id) AS highest_id
GROUP BY gender, browser
ORDER BY avg_birth_year DESC
LIMIT 10

Uyarı

Değişken uzunluktaki desenler üzerinde yatay toplama da dahil olmak üzere gelişmiş toplama teknikleri için bkz. Gelişmiş Toplama Teknikleri.

Veri türleri: değerlerle çalışma

GQL, grafiğinizde farklı türde bilgileri depolamak ve işlemek için zengin veri türlerini destekler.

Temel değer türleri

  • Sayılar: INT64hesaplamalar ve ölçümler için , UINT64, FLOAT64 (aynı zamanda )DOUBLE
  • Metin: STRING adlar, açıklamalar ve metin verileri için
  • Mantık: BOOL üç değerle: DOĞRU, YANLIŞ ve BİlİNMEYEN (null işleme için)
  • Saat: ZONED DATETIME saat dilimi bilgilerini içeren zaman damgaları için
  • Koleksiyonlar: LIST<T> aynı türden Tbirden fazla değer için, PATH grafik dolaşımı sonuçları için
  • Graf öğeleri: NODE ve EDGE graf verilerine başvurmak için

Önemli

Özellik değeri türleri olarak belirli değer türlerini kullanamazsınız. Özellikle, grafik öğesi başvuru değerlerini içeren değerleri özellik değerleri (düğüm veya yol listeleri gibi) olarak kullanamazsınız.

Örnek değişmez değerler

42                                     -- Integer literal
"Hello, graph!"                        -- String  literal
TRUE                                   -- Boolean literal
ZONED_DATETIME('2024-01-15T10:30:00Z') -- DateTime with timezone literakl
[1, 2, 3]                              -- Literal list of integers

Kritik null işleme desenleri

-- Equality predicates with NULL always returns UNKNOWN
5 = NULL                              -- Evaluates to UNKNOWN (not FALSE!)
NULL = NULL                           -- Evaluates to UNKNOWN (not TRUE!)

-- Use IS NULL predicates for explicit null testing
p.nickname IS NULL                    -- Evaluates to TRUE if nickname is null
p.nickname IS NOT NULL                -- Evaluates to TRUE if nickname has a value

-- Use the COALESCE function for null-safe value selection
coalesce(p.nickname, p.firstName, '???')  -- Evaluates to first non-null value

Üç değerli mantık etkileri

-- In FILTER statements, only TRUE values pass through
FILTER p.birthday > 0        -- Removes rows where birthday is null or missing or zero

-- It's important to understand that NOT UNKNOWN = UNKNOWN
FILTER NOT (p.birthday > 0)  -- Removes rows where birthday is null or missing or positive

-- Use explicit null handling for inclusive filtering
FILTER p.birthday < 19980101 OR p.birthday IS NULL -- Includes null birthdays

Dikkat

Üç değerli mantık, döndürürNULL = NULL, değil UNKNOWNanlamına gelirTRUE. Bu davranış filtrelemeyi ve birleştirmeleri etkiler. Her zaman null testler için kullanın IS NULL .

İfadeler: verileri dönüştürme ve çözümleme

İfadeler sorgularınızdaki verileri hesaplamanıza, karşılaştırmanıza ve dönüştürmenize olanak sağlar. BUNLAR SQL'deki ifadelere benzer ancak grafik verilerini işlemek için ek özelliklere sahiptir.

Ortak ifade türleri

p.birthday < 19980101   -- Birth year comparison  
p.firstName || ' ' || p.lastName               -- String concatenation
count(*)                                       -- Aggregation
p.firstName IN ['Alice', 'Bob']                -- List membership
coalesce(p.firstName, p.lastName)              -- Null handling

Karmaşık koşul bileşimi

-- Combine conditions with proper precedence
FILTER (p.birthday > 19560101 AND p.birthday < 20061231) 
  AND ((p.gender IN ['male', 'female']) OR (p.browserUsed IS NOT NULL))

-- Use parentheses for clarity and correctness
FILTER p.gender = 'female' AND (p.firstName STARTS WITH 'A' OR p.id > 1000)

Dize deseni eşleştirme

-- Pattern matching with different operators
p.locationIP CONTAINS '192.168'      -- Substring search
p.firstName STARTS WITH 'John'       -- Prefix matching  
p.lastName ENDS WITH 'son'           -- Suffix matching

-- Case-insensitive operations
upper(p.firstName) = 'ALICE'         -- Convert to uppercase for comparison

Kategoriye göre yerleşik işlevler

GQL, farklı veri işleme gereksinimleri için şu işlev kategorilerini sağlar:

  • Verileri özetlemek için toplama işlevleri: count()sum(), avg(), , min(), max()

  • Koşullu ifadeler: CASE/WHEN/THEN/ELSE/END ve NULLIF() koşullu mantık için. Örneğin:

    MATCH (p:Person)
    RETURN p.firstName,
      CASE WHEN p.birthday < 20000101 THEN 'Before 2000' ELSE '2000 or later' END AS era,
      NULLIF(p.gender, 'unknown') AS gender
    
  • Metin işleme için dize işlevleri: char_length(), upper(), lower(), trim() (yalnızca büyük/küçük harf eşlemesi için US ASCII)

  • Grafik yapılarını analiz etmek için graf işlevleri: nodes(), edges(), elements(), , labels()path_length()

  • Genel işlevler: coalesce()null değerleri ve serileştirmeyi işlemek için . to_json_string()

Karmaşık ifadeler için işleç önceliği

  1. Özellik erişimi (.)
  2. Çarpma ve bölme (*, /)
  3. Toplama ve çıkarma (+, -)
  4. Karşılaştırma (=, <>, <, >, <=, >=)
  5. Mantıksal olumsuzlama (NOT)
  6. Mantıksal bağlantı (AND)
  7. Mantıksal dışlama ayrıştırma (XOR)
  8. Mantıksal ayrıştırma (OR)

Yukarıdaki listede, daha düşük sayıya sahip bir işleç, daha yüksek sayıya sahip bir işleçten "daha sıkı bağlar". Örneğin, NOT n.prop OR m.prop ancak (NOT n.prop) OR m.prop değil NOT (n.prop OR m.prop).

Tip

Önceliği açık hale getirmek için parantezleri kullanın. Gruplandırma temiz olduğunda karmaşık ifadelerin okunup hata ayıklaması daha kolaydır.

Gelişmiş sorgu teknikleri

Bu bölümde karmaşık ve verimli graf sorguları oluşturmaya yönelik gelişmiş desenler ve teknikler yer almaktadır. Bu desenler, güçlü analiz sorguları oluşturmanıza yardımcı olmak için temel deyim kullanımının ötesine geçer.

Karmaşık çok durumlu oluşturma

Önemli

Graph temel ve tam doğrusal deyim bileşimini destekler. , , UNION DISTINCTEXCEPTve INTERSECT gibi OTHERWISEişlemleri ayarlama henüz desteklenmiyor. Daha fazla bilgi için geçerli sınırlamalarla ilgili makaleye bakın.

Karmaşık sorguları verimli bir şekilde oluşturmanın anlaşılması, gelişmiş graf sorgulaması için çok önemlidir.

UNION ALL

İki veya daha fazla doğrusal sorgu bloğundaki sonuçları birleştirmek için kullanın UNION ALL :

-- Combine results from two separate pattern matches
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS name, c.name AS affiliation
UNION ALL
MATCH (p:Person)-[:studyAt]->(u:University)
RETURN p.firstName AS name, u.name AS affiliation

UNION ALL yinelenenler de dahil olmak üzere tüm satırları tutar. UNION DISTINCT (yinelenenleri kaldırır) henüz desteklenmiyor.

Çok adımlı desen ilerlemesi

Karmaşık çözümlemeleri aşamalı olarak oluşturmak için birden çok deyimi zincirleyin:

-- Build complex analysis step by step
MATCH (company:Company)<-[:workAt]-(employee:Person)
LET companyName = company.name
MATCH (employee)-[:isLocatedIn]->(city:City)
FILTER employee.birthday < 19850101
LET cityName = city.name
RETURN companyName, cityName, avg(employee.birthday) AS avgBirthday, count(employee) AS employeeCount
GROUP BY companyName, cityName
ORDER BY avgBirthday DESC

Bu sorgu giderek karmaşıklık oluşturuyor: şirketleri, çalışanlarını, çalışan konumlarını bul, 1985'ten önce doğmuş çalışanları olan şirketleri filtreleyin, ortalama doğum gününü hesaplayın ve sonuçları özetleyip sıralayın.

Yatay toplama kullanımı

Yatay toplama, tek bir satırdaki değişken uzunluklu desenler üzerinde toplanır:

-- Find people and their minimum distance to people working at Microsoft
MATCH TRAIL (p:Person)-[e:knows]->{,5}(:Person)-[:workAt]->(:Company { name: 'Microsoft'})
LET p_name = p.lastName || ', ' || p.firstName
RETURN p_name, min(count(e)) AS minDistance 
GROUP BY p_name
ORDER BY minDistance DESC

Uyarı

Bu sorgu henüz desteklenmiyor (bilinen sorun).

Değişken kapsamı ve gelişmiş akış denetimi

Değişkenler verileri sorgu deyimleri arasında bağlar ve karmaşık graf geçişlerini etkinleştirir. Gelişmiş kapsam kurallarını anlamak, karmaşık çok deyimli sorgular yazmanıza yardımcı olur.

Değişken bağlama ve kapsam desenleri

-- Variables flow forward through subsequent statements 
MATCH (p:Person)                                    -- Bind p 
LET fullName = p.firstName || ' ' || p.lastName     -- Bind concatenation of p.firstName and p.lastName as fullNume
FILTER fullName CONTAINS 'Smith'                    -- Filter for fullNames with “Smith” substring (p is still bound)
RETURN p.id, fullName                               -- Only return p.id and fullName (p is dropped from scope) 

Deyimler arasında birleşimler için değişken yeniden kullanımı

-- Multi-statement joins using variable reuse
MATCH (p:Person)-[:workAt]->(:Company)          -- Find people with jobs
MATCH (p)-[:isLocatedIn]->(:City)               -- Same p: people with both job and residence
MATCH (p)-[:knows]->(friend:Person)             -- Same p: their social connections
RETURN *

Kritik kapsam kuralları ve sınırlamaları

-- ✅ Backward references work
MATCH (p:Person)
LET adult = p.birthday < 20061231  -- Can reference p from previous statement
RETURN *

-- ❌ Forward references don't work  
LET adult = p.birthday < 20061231  -- Error: p not yet defined
MATCH (p:Person)
RETURN *

-- ❌ Variables in same LET statement can't reference each other
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName,
    greeting = 'Hello, ' || name     -- Error: name not visible yet
RETURN *

-- ✅ Use separate statements for dependent variables
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName
LET greeting = 'Hello, ' || name     -- Works: name now available
RETURN *

Karmaşık sorgularda değişken görünürlüğü

-- Variables remain visible until overridden or query ends
MATCH (p:Person)                     -- p available from here
LET gender = p.gender                -- gender available from here  
MATCH (p)-[:knows]->(e:Person)       -- p still refers to original person
                                     -- e is new variable for managed employee
RETURN p.firstName AS manager, e.firstName AS friend, gender

Dikkat

Grafik desenleri dışında, aynı deyimdeki değişkenler birbirine başvuramaz. Bağımlı değişken oluşturmak için ayrı deyimler kullanın.

Gelişmiş toplama teknikleri

GQL, gruplar ve koleksiyonlar arasında verileri analiz etmek için iki ayrı toplama türünü destekler: değişken uzunluklu desenler üzerinde dikey GROUP BY toplama ve yatay toplama.

GROUP BY ile dikey toplama

Dikey toplama (ile RETURNkapsananGROUP BY) satırları paylaşılan değerlere ve her grup içindeki işlem toplamlarına göre gruplandırıyor:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN c.name AS companyName, 
       count(*) AS employee_count, 
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName

Bu yaklaşım, her grup içindeki tüm çalışanları toplayarak şirket başına bir sonuç satırı oluşturur.

Grup listesi değişkenleriyle yatay toplama

Yatay toplama, değişken uzunluktaki desenlere bağlı koleksiyonlar üzerinde toplamaları hesaplar. Değişken uzunlukta kenarlar kullandığınızda, kenar değişkeni eşleşen her yolda tüm kenarları tutan bir grup listesi değişkenine dönüşür:

-- Group list variable 'edges' enables horizontal aggregation
MATCH (p:Person)-[edges:knows]->{2,4}(friend:Person)
RETURN p.firstName || ' ' || p.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name,
       size(edges) AS degrees_of_separation,
       avg(edges.creationDate) AS avg_connection_age,
       min(edges.creationDate) AS oldest_connection

Uyarı

Bu sorgu henüz desteklenmiyor (bilinen sorun).

Dikey ve yatay toplama arasındaki temel farklar şunlardır:

  • Dikey toplama , satırlar arasında özetler veya satırları gruplandırıp her gruptaki satırlar arasında özetler.
  • Yatay toplama , tek tek kenar koleksiyonları içindeki öğeleri özetler.
  • Grup listesi değişkenleri yalnızca değişken uzunluklu kenar desenlerinden gelir.

Değişken uzunlukta kenar bağlama bağlamları

Kenar değişkenlerinin değişken uzunluklu desenlerde nasıl bağlandığını anlamak çok önemlidir:

Desen eşleştirme sırasında (tekil bağlam):

-- Edge variable 'e' refers to each individual edge during filtering
MATCH (p:Person)-[e:knows WHERE e.creationDate > zoned_datetime('2000-01-01T00:00:00Z')]->{2,4}(friend:Person)
-- 'e' is evaluated for each edge in the path during matching
RETURN *

Sonuç ifadelerinde (grup bağlamı):

-- Edge variable 'edges' becomes a list of all qualifying edges
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)
RETURN size(e) AS num_edges,                    -- Number of edges in path
       e[0].creationDate AS first_edge,         -- First edge in path
       avg(e.creationDate) AS avg_age           -- Horizontal aggregation

Uyarı

Bu sorgu henüz desteklenmiyor (bilinen sorun).

Dikey ve yatay toplamayı birleştirme

Her iki toplama türünü de karmaşık çözümleme desenlerinde birleştirebilirsiniz:

Uyarı

Bu sorgu henüz desteklenmiyor (bilinen sorun).

-- Find average connection age by city pairs
MATCH (p1:Person)-[:isLocatedIn]->(c1:City)
MATCH (p2:Person)-[:isLocatedIn]->(c2:City)
MATCH (p1)-[e:knows]->{1,3}(p2)
RETURN c1.name AS city1,
       c2.name AS city2,
       count(*) AS connection_paths,                  -- Vertical: count paths per city pair
       avg(size(e)) AS avg_degrees,                   -- Horizontal then vertical: path lengths
       avg(avg(e.creationDate)) AS avg_connection_age -- Horizontal then vertical: connection ages
GROUP BY city1, city2

Tip

Yatay toplama her zaman dikey toplamaya göre önceliklidir. Grup listesini normal listeye dönüştürmek için kullanın collect_list(edges).

Uyarı

Ayrıntılı toplama işlevi başvurusu için bkz. GQL ifadeleri ve işlevleri.

Hata işleme stratejileri

Yaygın hata desenlerini anlamak güçlü sorgular yazmanıza yardımcı olur.

Eksik verileri düzgün bir şekilde işleme:

MATCH (p:Person)
-- Use COALESCE for missing properties
LET displayName = coalesce(p.firstName, p.lastName, 'Unknown')
LET contact = coalesce(p.locationIP, p.browserUsed, 'No info')
RETURN *

Açık null denetimleri kullanın:

MATCH (p:Person)
-- Be explicit about null handling
FILTER p.id IS NOT NULL AND p.id > 0
-- Instead of just: FILTER p.id > 0
RETURN *

Ek bilgiler

GQLSTATUS kodları

Sorgu sonuçları bölümünde açıklandığı gibi GQL, yürütmenin başarılı veya olası başarısızlığıyla ilgili zengin durum bilgilerini raporlar. Listenin tamamı için GQL durum kodları başvurusuna bakın.

Ayrılmış sözcükler

GQL, değişkenler, özellik adları veya etiket adları gibi tanımlayıcılar olarak kullanamamanıza neden olan bazı anahtar sözcükleri ayırır. Listenin tamamı için GQL ayrılmış sözcükler başvurusuna bakın.

Tanımlayıcı olarak ayrılmış sözcükler kullanmanız gerekiyorsa, bunların arka uçlarıyla kaçış yapın: `match`, `return`.

Ayrılmış sözcüklerin kaçmasını önlemek için şu adlandırma kuralını kullanın:

  • Tek sözcüklü tanımlayıcılar için alt çizgi ekleyin: :Product_
  • Çok sözcüklü tanımlayıcılar için camelCase veya PascalCase kullanın: :MyEntity, :hasAttribute, textColor

Sonraki Adımlar

GQL ile ilgili temel bilgileri anladığınıza göre, önerilen öğrenme yolunuz aşağıdadır:

GQL becerilerinizi oluşturmaya devam edin

Yeni başlayanlar için:

Deneyimli kullanıcılar için:

Başvuru malzemeleri

Hızlı aramalar için bu başvuruları kullanışlı tutun:

Grafı keşfetme

Platformu öğrenin:

Dahil olun

  • Geri bildirim paylaşma - Belge ve araçların geliştirilmesine yardımcı olun
  • Topluluğa katılın - Diğer graf veritabanı uygulayıcılarıyla bağlantı kurun
  • Güncel kalın - Yeni özellikler için grafik duyurularını takip edin

Tip

Yaparak öğrenmeyi tercih ediyorsanız hızlı başlangıç öğreticisiyle başlayın veya önce sorgu dilini öğrenmek istiyorsanız grafik desenlerini inceleyin.

Nasıl yapılır kılavuzları:

Önemli konularla ilgili diğer ayrıntılar:

Hızlı başvurular:

Grafik: