Graf sorguları ile ilişkileri sorgulama
Bazı veri ilişkileri doğal olarak sosyal bağlantılar, kuruluş hiyerarşileri, ürün önerileri ve sahtekarlık algılama desenleri gibi ağlar olarak temsil edilir. Bu ilişkileri yabancı anahtarlar ve birleşimler kullanarak modelleyebilirsiniz ancak işlecini MATCH kullanan graf sorguları, bağlı verileri dolaşmanın daha sezgisel ve genellikle daha verimli bir yolunu sağlar.
Graf veri yapılarını görselleştirme
Grafik sorguları yazmadan önce, grafik verilerinin nasıl düzenlendiğinde görselleştirilmesine yardımcı olur. İnsanların birbirlerini tanıdıkları ve ürün satın aldığı basit bir sosyal ağ düşünün:
Bu modelde:
- Düğümler (kutular) kişiler ve ürünler gibi varlıkları temsil eder
- Kenarlar (oklar), düğümler arasındaki ilişkileri temsil eder. Ok yönü ilişki yönünü gösterir (Alice Bob'u tanır, Bob'un Alice'i tanıması gerekmez).
Uyarı
Bu diyagramda grafik kavramları gösterilmektedir. Bu ünitedeki kod örnekleri, belirli özelliklere odaklanmak için benzer ancak basitleştirilmiş veriler kullanır.
Grafik özelliklerini anlama
Grafik özellikleri, ilişkisel modeli ayrılmış düğüm ve kenar tablolarıyla genişletir. Düğümler kişiler, ürünler ve konumlar gibi varlıkları temsil eder. Kenarlar, aralarındaki "tanır", "satın alır" veya "bulunduğu" gibi ilişkileri temsil eder.
Grafik sorgularının temel avantajı desen eşleştirmedir. Karmaşık çok yönlü birleşimler yazmak yerine, ASCII stili söz dizimi kullanarak aradığınız deseni ifade edersiniz:
-- Traditional relational approach (multiple joins)
SELECT p1.Name, p2.Name
FROM Person AS p1
INNER JOIN Friendship AS f ON p1.PersonID = f.Person1ID
INNER JOIN Person AS p2 ON f.Person2ID = p2.PersonID;
-- Graph approach (pattern matching)
SELECT Person1.Name, Person2.Name
FROM Person AS Person1, Friendship, Person AS Person2
WHERE MATCH(Person1-(Friendship)->Person2);
Uyarı
Grafik tabloları mevcut ilişkisel özelliklerle tamamen uyumludur. Grafik tablolarını normal tablolarla birleştirebilir, dizinleri kullanabilir ve tüm standart T-SQL işlemlerini uygulayabilirsiniz.
Düğüm tabloları oluştur
Düğüm tabloları, varlıkları grafiğinizde saklar. Bunları, CREATE TABLE ve AS NODE koşulunu kullanarak oluşturun.
-- Create a Person node table
CREATE TABLE dbo.Person (
PersonID INT PRIMARY KEY,
Name NVARCHAR(100) NOT NULL,
Email NVARCHAR(200),
Department NVARCHAR(50)
) AS NODE;
-- Create a Product node table
CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
Name NVARCHAR(200) NOT NULL,
Category NVARCHAR(100),
Price DECIMAL(10, 2)
) AS NODE;
-- Create a Location node table
CREATE TABLE dbo.Location (
LocationID INT PRIMARY KEY,
City NVARCHAR(100) NOT NULL,
CountryRegion NVARCHAR(100) NOT NULL
) AS NODE;
SQL Server, düğüm tablolarına her düğümü benzersiz olarak tanımlayan bir $node_id sütunu otomatik olarak ekler. Sistem, grafik ilişkileri için bu sütunu dahili olarak kullanır.
Aşağıdaki örnek, Kişi düğümü tablosuna dört kişi ekler ve ardından hem iş sütunlarını hem de sistem tarafından oluşturulan $node_idöğesini göstermek için tabloyu sorgular. INSERT deyiminin yalnızca kullanıcı tanımlı sütunları kullandığına dikkat edin. SQL Server, her satır için $node_id değerini otomatik olarak oluşturur.
-- Insert person data using standard INSERT syntax
INSERT INTO dbo.Person (PersonID, Name, Email, Department)
VALUES
(1, 'Alice Johnson', 'alice@contoso.com', 'Engineering'),
(2, 'Bob Smith', 'bob@contoso.com', 'Marketing'),
(3, 'Carol Davis', 'carol@contoso.com', 'Engineering'),
(4, 'David Lee', 'david@contoso.com', 'Sales');
-- Query shows the system-generated $node_id alongside user columns
SELECT $node_id, PersonID, Name FROM dbo.Person;
Kenar tabloları oluşturma
Kenar tabloları düğümler arasındaki ilişkileri temsil eder.
CREATE TABLE kullanarak, AS EDGE yan tümcesiyle bunları oluşturun.
-- Create a "reports to" relationship edge
CREATE TABLE dbo.ReportsTo (
StartDate DATE,
ReportType NVARCHAR(50)
) AS EDGE;
-- Create a "purchased" relationship edge
CREATE TABLE dbo.Purchased (
PurchaseDate DATE NOT NULL,
Quantity INT NOT NULL,
TotalAmount DECIMAL(10, 2)
) AS EDGE;
-- Create a "knows" relationship edge (social connection)
CREATE TABLE dbo.Knows (
ConnectionDate DATE,
ConnectionStrength INT -- 1-10 scale
) AS EDGE;
SQL Server, $edge_id, $from_id ve $to_id sütunlarını kenar tablolarına otomatik olarak ekler. Bağlı düğümlerden $from_id ve $to_id değerlerini belirterek kenarlar ekleyebilirsiniz, örneğin:
-- Alice reports to Bob
INSERT INTO dbo.ReportsTo ($from_id, $to_id, StartDate, ReportType)
SELECT
(SELECT $node_id FROM dbo.Person WHERE Name = 'Alice Johnson'),
(SELECT $node_id FROM dbo.Person WHERE Name = 'Bob Smith'),
'2023-01-15',
'Direct';
-- Create social connections
INSERT INTO dbo.Knows ($from_id, $to_id, ConnectionDate, ConnectionStrength)
SELECT
(SELECT $node_id FROM dbo.Person WHERE Name = 'Alice Johnson'),
(SELECT $node_id FROM dbo.Person WHERE Name = 'Carol Davis'),
'2022-06-01',
8;
Tavsiye
Kenar tabloları, ilişkinin kendisi hakkında tarihler, ağırlıklar veya türler gibi özellikleri depolayabilir. Bu, zamansal analiz veya ağırlıklı graf algoritmaları için yararlıdır.
MATCH koşuluyla graf sorgulama
MATCH koşulu, bulmak istediğiniz ilişkileri belirtmek için bir desen söz dizimi kullanır. Temel desen, ilişki yönünü göstermek için okları kullanır:
-- Find who reports to whom
SELECT
Employee.Name AS Employee,
Manager.Name AS Manager,
r.StartDate
FROM dbo.Person AS Employee,
dbo.ReportsTo AS r,
dbo.Person AS Manager
WHERE MATCH(Employee-(r)->Manager);
Ok yönü önemlidir:
-
(Node1)-(Edge)->(Node2): Edge, Node1'den Node2'ye geçer -
(Node1)<-(Edge)-(Node2): Edge, Node2'den Node1'e gider
Aşağıdaki örnek, Alice'i bilen tüm kişileri bulur:
SELECT
Connector.Name AS PersonWhoKnowsAlice,
k.ConnectionStrength
FROM dbo.Person AS Connector,
dbo.Knows AS k,
dbo.Person AS Target
WHERE MATCH(Connector-(k)->Target)
AND Target.Name = 'Alice Johnson';
Birden çok ilişkiyi dolaşma
Tek atlamalı sorgular doğrudan bağlantıları bulur, ancak grafik veritabanları çok atlamalı geçişlerde mükemmeldir. Birden fazla ilişkideki yolları izlemek için, tek bir MATCH hükmünde birden çok kenar deseni zincirleyebilirsiniz. Bu özellik, karmaşık iç içe alt sorgular yazmadan "arkadaşlarımın arkadaşları kimler?" veya "iş arkadaşlarım hangi ürünleri satın aldı?" gibi soruları yanıtlamanıza olanak tanır.
Aşağıdaki örnek, iki TANIR ilişkisini zincirleyerek arkadaşların arkadaşlarını bulur. Desen Person1-(k1)->Person2-(k2)->Person3 Kişi1'de başlar, BİLİR kenarını Kişi2'ye kadar izler, sonra da Kişi3'e ulaşmak için başka bir BİLİR kenarını izler.
-- Find friends of friends (2-hop connections)
SELECT DISTINCT
Person1.Name AS Person,
Person3.Name AS FriendOfFriend
FROM dbo.Person AS Person1,
dbo.Knows AS k1,
dbo.Person AS Person2,
dbo.Knows AS k2,
dbo.Person AS Person3
WHERE MATCH(Person1-(k1)->Person2-(k2)->Person3)
AND Person1.Name = 'Alice Johnson'
AND Person3.Name <> Person1.Name; -- Exclude self
Tek bir geçişte farklı ilişki türlerini de birleştirebilirsiniz. Aşağıdaki örnek KNOWS kenarlarından PURCHASED kenarlarına geçerek, belirli bir kişinin tanıdığı kişilerin hangi ürünleri satın aldığını bulmak için kullanılır.
-- Find products purchased by people in the same department
SELECT DISTINCT
p1.Name AS Person,
p1.Department,
prod.Name AS Product
FROM dbo.Person AS p1,
dbo.Knows AS k,
dbo.Person AS p2,
dbo.Purchased AS pu,
dbo.Product AS prod
WHERE MATCH(p1-(k)->p2-(pu)->prod)
AND p1.Department = p2.Department;
Önemli
Her bir kenar tablosu takma adı, tek bir MATCH desende yalnızca bir kez görünebilir. Aynı kenar türüne birden çok kez geçiş yapmak için ayrı takma adlar kullanın.
Değişken uzunlukta geçişler için kullanın SHORTEST_PATH
Değişken sayıda ilişki arasında en kısa bağlantıyı bulmak için kullanabilirsiniz SHORTEST_PATH . Anahtar FOR PATH sözcüğü, değişken uzunlukta eşleştirmeye katılan tabloları işaretler ve (bir veya daha fazla) veya + (bir-üç) gibi {1,3} niceleyiciler dolaşma derinliğini denetler.
Aşağıdaki örnek, üç atlama içinde Alice'ten ulaşılabilen tüm kişileri bulur ve her birine olan uzaklığı sayar:
SELECT
StartPerson.Name,
LAST_VALUE(ReachablePerson.Name) WITHIN GROUP (GRAPH PATH) AS ReachablePerson,
COUNT(ReachablePerson.Name) WITHIN GROUP (GRAPH PATH) AS Distance
FROM dbo.Person AS StartPerson,
dbo.Knows FOR PATH AS k,
dbo.Person FOR PATH AS ReachablePerson
WHERE MATCH(SHORTEST_PATH(StartPerson(-(k)->ReachablePerson){1,3}))
AND StartPerson.Name = 'Alice Johnson';
Graf ve ilişkisel yaklaşımlar arasında seçim yapma
Graf sorguları her zaman en iyi seçenek değildir. Graf ve geleneksel ilişkisel yaklaşımlar arasında karar verirken şu yönergeleri göz önünde bulundurun:
Aşağıdaki durumlarda grafik sorgularını kullanın:
- sorgularınızın birincil odağı ilişkilerdir
- Değişken veya bilinmeyen derinliklerde dolaşmanız gerekir (arkadaşlarınızın arkadaşları)
- Veriler doğal olarak bir ağ oluşturur (sosyal grafikler, hiyerarşiler, yollar)
- Sorgu desenleri, ilişkisel SQL'de birçok kendi kendine birleşim gerektirir
- Yol bulma veya bağlantı analizi gerçekleştirıyorsunuz
Şu durumlarda ilişkisel sorguları kullanın:
- İlişkiler basit ve sabit bir derinliğe sahiptir (tek seviyeli ebeveyn-çocuk ilişkisi)
- Öncelikle varlık özniteliklerini filtreleyip toplamanız gerekir
- Veri modeli çoğunlukla birkaç ilişki içeren tablosaldır
- Performans kritiktir ve yabancı anahtarlardaki dizinler yeterlidir
- Ekibiniz geleneksel SQL desenlerini daha iyi biliyor
Yaygın graf sorgusu sorunlarını giderme
Graf sorgularının hatalara neden olabilecek benzersiz söz dizimi gereksinimleri vardır. Aşağıdaki tabloda yaygın zorluklar ve bunların nasıl çözüleceğini açıklanmaktadır.
| Sınama | Nedeni | Çözüm |
|---|---|---|
| Sorgu sonuç döndürmez | Desendeki MATCH ok yönü, kenarların nasıl eklendiğiyle eşleşmiyor |
Kenarların nasıl eklendiğini doğrulayın.
$from_id Çalışan ve $to_id Yönetici ise, okun Çalışan'dan Yönetici'ye işaret etmesi gerekir. |
| Yinelenen kenarda söz dizimi hatası | Aynı kenar takma adı bir MATCH desende birden çok kez kullanıldı |
Aynı kenar türünün her geçişi için ayrı takma adlar oluşturun. |
SHORTEST_PATH sorgu başarısız oluyor |
FOR PATH ile işaretlenmemiş kenar ve düğüm tabloları |
Değişken uzunluklu eşleştirmeye katılan tüm tablolara anahtar sözcük ekleyin FOR PATH . |
| Kenar, var olmayan düğümlere referans verir |
$node_id değerleri yerine kullanılan iş anahtarı sütunları |
Kenar eklerken düğüm tablolarından seçim $node_id yapmak için alt sorgular kullanın. |
Uyarı
Graph tabloları ve MATCH işleci SQL Server 2017 ve sonraki sürümlerde ve Azure SQL Veritabanı'nda kullanılabilir.
SHORTEST_PATH İşlev için SQL Server 2019 veya üzeri gerekir. Belirli özellik kullanılabilirliği için platformunuzun belgelerine bakın.
Grafik özellikleri hakkında daha fazla bilgi için bkz. SQL Server ile graf işleme ve MATCH (Transact-SQL).