علاقات العبور مع استعلامات الرسوم البيانية
بعض علاقات البيانات تمثل بشكل طبيعي كشبكات، بما في ذلك الروابط الاجتماعية، والتسلسلات الهرمية التنظيمية، وتوصيات المنتجات، وأنماط كشف الاحتيال. بينما يمكنك نمذجة هذه العلاقات باستخدام مفاتيح وروابط أجنبية، توفر استعلامات الرسوم البيانية باستخدام العامل MATCH طريقة أكثر بديهية وغالبا أكثر كفاءة لعبور البيانات المتصلة.
تصور هياكل بيانات الرسوم البيانية
قبل كتابة استعلامات الرسوم البيانية، يساعد في تصور كيفية تنظيم بيانات الرسوم البيانية. فكر في شبكة اجتماعية بسيطة حيث يعرف الناس بعضهم البعض ويشترون المنتجات:
في هذا النموذج:
- العقد (الصناديق) تمثل كيانات مثل الأشخاص والمنتجات
- تمثل الحواف (الأسهم) العلاقات بين العقد. اتجاه السهم يشير إلى اتجاه العلاقة (أليس تعرف بوب، وليس بالضرورة أن يعرف بوب أليس).
ملاحظة
يوضح هذا الرسم المفاهيمي للرسوم البيانية. تستخدم أمثلة الكود في هذه الوحدة بيانات مشابهة ولكن مبسطة للتركيز على ميزات محددة.
فهم قدرات الرسوم البيانية
توسع قدرات الرسم البياني النموذج العلائقي من خلال جداول مخصصة للعقد والحافة. تمثل العقد كيانات مثل الأشخاص، المنتجات، والمواقع. تمثل الحواف العلاقات بينها، مثل "يعرف"، "اشترى"، أو "يقع في".
الميزة الرئيسية لاستعلامات الرسوم البيانية هي مطابقة الأنماط. بدلا من كتابة الربط متعدد الاتجاهات المعقدة، تعبر عن النمط الذي تبحث عنه باستخدام بناء جملة بأسلوب ASCII:
-- 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);
ملاحظة
جداول الرسوم البيانية متوافقة تماما مع الميزات العلائقية الموجودة. يمكنك ربط جداول الرسوم البيانية بالجداول العادية، واستخدام الفهارس، وتطبيق جميع عمليات T-SQL القياسية.
إنشاء جداول عقد
تخزن جداول العقد الكيانات في الرسم البياني الخاص بك. أنشئها باستخدام CREATE TABLE الجملة AS NODE :
-- 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 عمودا $node_id تلقائيا إلى جداول العقد يحدد كل عقدة بشكل فريد. يستخدم النظام هذا العمود داخليا لعلاقات الرسوم البيانية.
المثال التالي يدرج أربعة أشخاص في جدول عقدة الشخص، ثم يستعلم الجدول لعرض كل من أعمدة الأعمال والأعمدة التي تولدها $node_idالأنظمة . لاحظ أن عبارة INSERT تستخدم فقط الأعمدة المعرفة من قبل المستخدم. يقوم SQL Server بإنشاء ال تلقائيا $node_id لكل صف:
-- 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;
إنشاء جداول الحافة
تمثل جداول الحواف العلاقات بين العقد. أنشئها باستخدام CREATE TABLE الجملة AS EDGE :
-- 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;
يضيف $edge_idSQL Server تلقائيا ، $from_idوأعمدة $to_id إلى جداول الحواف. يمكنك إدخال الحواف عن طريق تحديد قيم و $from_id$to_id من العقد المتصلة، مثل هذا:
-- 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;
نصيحة
يمكن لجداول الحافة تخزين خصائص تتعلق بالعلاقة نفسها، مثل التواريخ أو الأوزان أو الأنواع. هذا مفيد للتحليل الزمني أو خوارزميات الرسوم البيانية المرجحة.
رسوم بيانية للاستعلام باستخدام الجملة MATCH
تستخدم الجملة MATCH بناء جملة نمط لتحديد العلاقات التي تريد العثور عليها. يستخدم النمط الأساسي الأسهم لإظهار اتجاه العلاقة:
-- 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);
اتجاه السهم مهم:
-
(Node1)-(Edge)->(Node2): الحافة تنتقل من العقدة 1 إلى العقدة 2 -
(Node1)<-(Edge)-(Node2): الحافة تنتقل من العقدة 2 إلى العقدة 1
المثال التالي يجد جميع الأشخاص الذين يعرفون أليس:
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';
تجاوز العلاقات المتعددة
تجد استعلامات القفز الواحد الاتصالات المباشرة، لكن قواعد بيانات الرسوم البيانية تتفوق في التنقل متعدد القفزات. يمكنك ربط أنماط حواف متعددة في جملة واحدة MATCH لتتبع المسارات عبر عدة علاقات. تتيح لك هذه القدرة الإجابة على أسئلة مثل "من هم أصدقاء أصدقائي؟" أو "ما هي المنتجات التي اشترى زملائي؟" دون كتابة استفسارات فرعية معقدة متداخلة.
المثال التالي يجد أصدقاء الأصدقاء من خلال ربط علاقتين يعرفان . يبدأ النمط Person1-(k1)->Person2-(k2)->Person3 من الشخص 1، ويتبع حافة تعرف إلى الشخص 2، ثم يتبع حافة تعرف أخرى للوصول إلى الشخص 3:
-- 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
يمكنك أيضا دمج أنواع مختلفة من العلاقات في رحلة واحدة. المثال التالي يتقاطع بين KNOWSوDEALS ANIMALS لمعرفة المنتجات التي اشتراها أشخاص يعرفهم الشخص:
-- 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;
مهم
يمكن أن يظهر كل اسم مستعار لجدول الحافة مرة واحدة فقط في نمط واحد MATCH . لعبور نفس نوع الحافة عدة مرات، استخدم أسماء مستعارة منفصلة.
الاستخدام SHORTEST_PATH في التمريرات ذات الطول المتغير
يمكنك استخدامها SHORTEST_PATH للعثور على أقصر اتصال عبر عدد متغير من العلاقات.
FOR PATH العلامات المفتاحية هي جداول تشارك في مطابقة الطول المتغير، ومحددات مثل + (واحد أو أكثر) أو {1,3} (واحد إلى ثلاثة) تتحكم في عمق التنقل.
المثال التالي يجد جميع الأشخاص الذين يمكن الوصول إليهم من أليس خلال ثلاث قفزات ويعد المسافة لكل منها:
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';
اختر بين النهج البياني والعلاقاتي
الاستعلامات البيانية ليست دائما الخيار الأفضل. ضع في اعتبارك هذه الإرشادات عند اتخاذ قرار بين الرسم البياني والنهج العلائقي التقليدي:
استخدم استعلامات الرسوم البيانية عندما:
- العلاقات هي محور أسئلتك الأساسي
- تحتاج إلى عبور أعماق متغيرة أو مجهولة (أصدقاء أصدقاء أصدقاء أصدقاء)
- تشكل البيانات بشكل طبيعي شبكة (الرسوم البيانية الاجتماعية، التسلسلات الهرمية، المسارات)
- أنماط الاستعلام ستتطلب العديد من الانضمام الذاتي في SQL العلائقي
- أنت تقوم بتحليل تحديد المسار أو الاتصال
استخدم الاستعلامات العلائقية عندما:
- العلاقات بسيطة وذات عمق ثابت (والد-ابنهم بمستوى واحد)
- أنت تقوم بشكل أساسي بتصفية وتجميع سمات الكيانات
- نموذج البيانات في الغالب جدولي مع علاقات قليلة
- الأداء حاسم والمؤشرات على المفاتيح الأجنبية كافية
- فريقك أكثر دراية بأنماط SQL التقليدية
استكشاف المشكلات الشائعة في استعلام الرسوم البيانية
استفسارات الرسوم البيانية لها متطلبات نحوية فريدة قد تسبب أخطاء. الجدول التالي يصف التحديات الشائعة وكيفية حلها.
| التحدي | السبب | حل |
|---|---|---|
| الاستعلام لا يعيد نتائج | اتجاه السهم في MATCH النمط لا يتطابق مع كيفية إدخال الحواف |
تحقق من كيفية إدخال الحواف. إذا $from_id كان الموظف و $to_id هو المدير، يجب أن يشير السهم من الموظف إلى المدير. |
| خطأ في النحوية مع تكرار الحافة | نفس الاسم المستعار على الحافة يستخدم عدة مرات في نمط واحد MATCH |
أنشئ أسماء مستعارة منفصلة لكل عبور من نفس نوع الحافة. |
SHORTEST_PATH فشل الاستعلام |
جداول الحافة والعقد غير معلمة ب FOR PATH |
أضف FOR PATH الكلمات المفتاحية إلى جميع الجداول المشاركة في مطابقة الطول المتغير. |
| إشارات الحواف إلى عقد غير موجودة | أعمدة مفاتيح الأعمال المستخدمة بدلا من $node_id القيم |
استخدم الاستعلامات الفرعية للاختيار $node_id من جداول العقد عند إدخال الحواف. |
ملاحظة
الجداول البيانية والمشغل MATCH متوفران في SQL Server 2017 وما بعده، وقاعدة بيانات Azure SQL. تتطلب هذه SHORTEST_PATH الوظيفة SQL Server 2019 أو أحدث. تحقق من وثائق منصتك لمعرفة توفر الميزات المحددة.
لمزيد من المعلومات حول ميزات الرسوم البيانية، راجع معالجة الرسوم البيانية مع SQL Server و MATCH (Transact-SQL).