그래프 쿼리를 사용하여 관계를 탐색

완료됨

팁 (조언)

자세한 내용은 텍스트 및 이미지 탭을 참조하세요.

일부 데이터 관계는 소셜 연결, 조직 계층 구조, 제품 권장 사항 및 사기 감지 패턴을 포함하여 네트워크로 자연스럽게 표현됩니다. 외세의 키와 조인을 사용하여 이러한 관계를 모델링할 수 있지만 연산자를 사용하는 MATCH 그래프 쿼리는 연결된 데이터를 트래버스하는 보다 직관적이고 종종 더 효율적인 방법을 제공합니다.

그래프 데이터 구조 시각화

그래프 쿼리를 작성하기 전에 그래프 데이터의 구성 방식을 시각화하는 데 도움이 됩니다. 사람들이 서로를 알고 제품을 구매하는 간단한 소셜 네트워크를 고려합니다.

KNOWS 및 PURCHASED 에지로 연결된 개인 및 제품 노드가 있는 그래프 데이터 모델을 보여 주는 다이어그램

이 모델에서는 다음을 수행합니다.

  • 노드 (상자)는 사용자 및 제품과 같은 엔터티를 나타냅니다.
  • 간선 (화살표)는 노드 간의 관계를 나타냅니다. 화살표 방향은 관계 방향을 나타냅니다(Alice는 Bob을 알고 있으며 Bob이 Alice를 반드시 아는 것은 아님).

비고

이 다이어그램은 그래프 개념을 보여 줍니다. 이 단원 전체의 코드 예제는 유사하지만 간소화된 데이터를 사용하여 특정 기능에 집중합니다.

그래프 기능 이해

그래프 기능은 전용 노드 및 에지 테이블을 사용하여 관계형 모델을 확장합니다. 노드는 사람, 제품 및 위치와 같은 엔터티를 나타냅니다. 엣지는 "알고 있음", "구매함", "위치함"과 같이 노드 간의 관계를 나타냅니다.

그래프 쿼리의 주요 이점은 패턴 일치입니다. 복잡한 다방향 조인을 작성하는 대신 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 TABLEAS 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 고유하게 식별하는 열을 노드 테이블에 자동으로 추가합니다. 시스템은 그래프 관계에 내부적으로 이 열을 사용합니다.

다음 예제에서는 Person 노드 테이블에 4명을 삽입한 다음 테이블을 쿼리하여 비즈니스 열과 시스템 생성 $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 TABLEAS 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;

SQL Server는 에지 테이블에 $edge_id, $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): Edge가 Node1에서 Node2로 이동합니다.
  • (Node1)<-(Edge)-(Node2): Edge가 Node2에서 Node1로 이동합니다.

다음 예제에서는 Alice를 아는 모든 사람을 찾습니다.

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 절에 연결하여 여러 관계를 통해 경로를 따를 수 있습니다. 이 기능을 사용하면 복잡한 중첩된 하위 쿼리를 작성하지 않고도 "내 친구의 친구는 누구인가?" 또는 "동료가 어떤 제품을 구입했나요?"와 같은 질문에 대답할 수 있습니다.

다음 예제에서는 두 개의 KNOWS 관계를 연결하여 친구의 친구를 찾습니다. 패턴 Person1-(k1)->Person2-(k2)->Person3 은 Person1에서 시작하고, 하나의 KNOWS 에지를 따라 Person2로 이동한 다음, 다른 KNOWS 에지를 따라 Person3에 도달합니다.

-- 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 에서 PURCHASED 에지로 교차하여 지정된 사람이 알고 있는 사용자가 구입한 제품을 찾습니다.

-- 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} (1~3개)와 같은 수량자는 순회 깊이를 제어합니다.

다음 예제에서는 3개의 홉 내에서 Alice로부터 접근 가능한 모든 사람을 찾아 각 사람까지의 거리를 계산합니다.

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 합니다.
Edge가 존재하지 않는 노드를 참조합니다. 비즈니스 키 열이 $node_id 값 대신 사용됨 하위 쿼리를 사용하여 가장자리를 삽입할 때 노드 테이블에서 선택합니다 $node_id .

비고

그래프 테이블 및 연산자는 MATCH SQL Server 2017 이상 및 Azure SQL Database에서 사용할 수 있습니다. 이 SHORTEST_PATH 함수에는 SQL Server 2019 이상이 필요합니다. 특정 기능 가용성에 대한 플랫폼 설명서를 확인합니다.

그래프 기능에 대한 자세한 내용은 SQL Server 및MATCH (Transact-SQL)를 사용한 그래프 처리를 참조하세요.