다음을 통해 공유


GQL 그래프 패턴

비고

이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며 프로덕션 워크로드에는 사용하지 않는 것이 좋습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

그래프 패턴은 GQL 쿼리의 핵심 구성 요소입니다. 직관적이고 시각적인 방식으로 노드와 가장자리를 사용하여 그래프에서 찾고 있는 구조를 설명합니다. 그래프 패턴을 쿼리 엔진이 그래프의 실제 데이터와 일치시키려고 시도하는 템플릿으로 간주합니다.

중요합니다

이 글은 오직 소셜 네트워크 예시 그래프 데이터셋만을 사용합니다.

단순 요소 패턴

간단한 요소 패턴을 사용하면 특정 요구 사항을 충족하는 그래프의 개별 노드 및 가장자리를 일치시킬 수 있습니다. 이러한 패턴은 더 복잡한 패턴 일치를 위한 토대를 형성합니다.

간단한 노드 패턴

노드 패턴은 노드가 일치해야 하는 레이블 및 속성을 지정합니다.

(:City { name: "New York" })

이 패턴은 레이블과 레이블이 PlaceCity 있고(연산자가 표시) & 속성이 name 같은 모든 노드와 일치합니다"New York". 필수 레이블 및 속성의 이 사양을 노드 패턴의 필러 라고 합니다.

주요 개념:

  • 레이블 일치: 여러 레이블을 요구하는 데 사용합니다 & .
  • 속성 필터링: 속성이 일치해야 하는 정확한 값을 지정합니다.
  • 유연한("공변성") 일치: 일치하는 노드는 지정된 레이블과 속성 외에 더 많은 레이블과 속성을 가질 수 있습니다.

비고

다중 요소 라벨을 가진 그래프 모델은 아직 지원되지 않습니다(알려진 문제).

간단한 에지 패턴

에지 패턴은 노드 패턴보다 더 복잡합니다. 필러를 지정할 뿐만 아니라 원본 노드 패턴을 대상 노드 패턴에 연결합니다. 에지 패턴은 에지 및 해당 엔드포인트 모두에 대한 요구 사항을 설명합니다.

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

화살표 방향은 원본 노드 패턴과 -[...]-> 대상 노드 패턴으로 결정 (:Person) 되는 중요한 방향 (:Comment) 입니다. 에지 방향을 이해하는 것은 그래프를 올바르게 쿼리하는 데 중요합니다.

해당하는 미러된 패턴:

화살표를 대칭 이동하고 노드 패턴을 교환하여 해당하는 미러된 에지 패턴을 만들 수 있습니다.

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

이 패턴은 동일한 관계를 찾지만 반대의 관점에서 찾습니다.

임의의 방향 에지 패턴

그래프 가장자리의 방향이 쿼리에 중요하지 않은 경우 임의의 방향 에지 패턴을 만들어 지정되지 않은 상태로 둘 수 있습니다.

(:Song)-[:inspired]-(:Movie)

이 패턴은 원본 노드와 (:Song)-[:inspired]->(:Movie) 대상 노드에 관계없이(이 예제는 소셜 네트워크 그래프 형식이 아님) 같은 가장자리와 결합된 가장자리 (:Movie)-[:inspired]->(:Song) 와 일치합니다.

그래프 에지 패턴 바로 가기

GQL은 일반적인 에지 패턴에 대한 편리한 바로 가기를 제공하여 쿼리를 보다 간결하게 만듭니다.

  • ()->() 는 (레이블이 있는 지시된 가장자리)를 의미 ()-[]->() 합니다.
  • ()<-() 은 (모든 레이블을 사용하여 역방향으로 방향이 지정된 가장자리)를 의미 ()<-[]-() 합니다.
  • ()-() 는 (임의의 레이블이 있는 임의의 가장자리)를 의미 ()-[]-() 합니다.

이러한 바로 가기는 연결에 관심이 있지만 특정 그래프 에지 형식은 신경 쓰지 않는 경우에 유용할 수 있습니다.

레이블 식

패턴은 일치하는 노드 및 에지의 레이블에 복잡한 요구 사항을 표현할 수 있습니다.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

이렇게 하면 노드 또는 isLocatedInPerson 노드(소셜 네트워크 스키마의 Organization 항상 Company 노드)UniversityCity 를 연결하거나 노드에 연결하는 Country 에지 수를 계산합니다.

Syntax:

Syntax Meaning
A&B 레이블은 A와 B를 모두 포함해야 합니다.
A|B 레이블에는 A 또는 B 중 하나 이상을 포함해야 합니다.
!A 레이블은 A를 제외해야 합니다.

또한 괄호를 사용하여 레이블 식 평가 순서를 제어합니다. 기본적으로 ! 우선 순위가 가장 높고 & 우선 순위가 .보다 |높습니다. 따라서 !A&B|C|!D .와 동일합니다 ((!A)&B)|C|(!D).

바인딩 변수

변수를 사용하면 쿼리의 다른 부분에서 일치하는 그래프 요소를 참조할 수 있습니다. 강력한 쿼리를 빌드하려면 변수를 바인딩하고 사용하는 방법을 이해해야 합니다.

바인딩 요소 변수

노드 패턴과 에지 패턴은 모두 일치하는 노드와 에지를 나중에 참조할 수 있도록 변수에 바인딩할 수 있습니다.

(p:Person)-[w:workAt]->(c:Company)

이 패턴에서는 일치하는 노드, pPerson 일치하는 w 에지 및 workAt 일치하는 cCompany 노드에 바인딩됩니다.

구조적 제약 조건에 대한 변수 재사용:

패턴에서 동일한 변수를 여러 번 다시 사용하는 것은 일치 항목의 구조에 대한 제한을 나타냅니다. 동일한 변수가 발생할 때마다 항상 유효한 일치 항목에서 동일한 그래프 요소에 바인딩해야 합니다. 변수 재사용은 복잡한 구조적 요구 사항을 표현하는 데 강력합니다.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

패턴은 노드를 찾 Personx 후 서로를 알고 동시에 y작동하며 변수Company에 바인딩됩니다.c 다시 사용하면 c 두 사람이 같은 회사에서 일할 수 있습니다.

요소 변수를 사용하는 패턴 조건자:

바인딩 요소 변수를 사용하면 노드 및 에지 패턴 조건자를 지정할 수 있습니다. 필러에 정확한 속성 값(예: { name: "New York, USA" })을 제공하는 대신, 필러는 각 후보 요소에 대해 평가되는 조건자를 지정할 수 있습니다. 이 패턴은 조건자가 다음으로 평가되는 TRUE경우에만 일치합니다.

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

에지 패턴은 정확한 일치가 아닌 유연한 조건을 사용하여 2000년 1월 1일 이후 서로를 알고 있는 사람들을 찾습니다.

비고

에지 패턴 변수는 가변 길이 패턴을 사용하는 경우에도 항상 에지 패턴 조건자의 개별 에지에 바인딩됩니다. 이렇게 하면 사후 필터를 수행하기 위해 에지 그룹 목록 변수를 수집 취소할 필요가 없습니다. 가변 길이 패턴 에지 변수 바인딩을 참조하세요.

고급 패턴 조건자 기술:

패턴 조건자는 쿼리 가독성을 향상시킬 수 있는 강력한 인라인 필터링 기능을 제공합니다.

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
      -[:workAt]->
      (c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')

-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z') 
                              AND w.salary > 75000]-(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE

-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target

팁 (조언)

조건이 매우 선택적일 때 패턴 조건자를 사용하면 중간 결과의 크기를 줄일 수 있습니다.

바인딩 경로 변수

추가 처리를 위해 일치하는 경로를 경로 변수에 바인딩하거나 전체 경로 구조를 사용자에게 반환할 수도 있습니다.

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

p 여기서는 지정된 순서대로 모든 노드 및 에지에 대한 참조 값을 포함하여 일치하는 전체 경로 구조를 나타내는 경로 값에 바인딩됩니다.

바운드 경로는 사용자에게 반환되거나 다음과 같은 NODESEDGES함수를 사용하여 추가 처리될 수 있습니다:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

작성 패턴

실제 쿼리에는 간단한 노드 에지 노드 구조보다 더 복잡한 패턴이 필요한 경우가 많습니다. GQL은 정교한 그래프 순회를 위한 패턴을 작성하는 여러 가지 방법을 제공합니다.

경로 패턴 작성

경로 패턴은 단순 노드 및 에지 패턴을 연결하여 더 긴 순회를 만들어 구성할 수 있습니다.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

패턴은 동료의 회사가 있는 위치를 찾기 위해 사회적, 전문적인 연결을 통해 사람으로부터 트래버스됩니다.

조각 패턴 생성: 또한 경로 패턴을 더 증분 방식으로 빌드할 수 있으므로 복잡한 패턴을 읽고 이해하기 쉽게 만들 수 있습니다.

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

이 방법은 동일한 순회를 논리적 단계로 나누어 쉽게 이해하고 디버그할 수 있도록 합니다.

비선형 패턴 작성

패턴의 결과 셰이프는 선형 경로일 필요가 없습니다. 중앙 노드에서 방사되는 "별 모양" 패턴과 같은 더 복잡한 구조를 일치시킬 수 있습니다.

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

이 패턴은 교육, 고용 및 콘텐츠 기본 설정과 함께 한 번에 사람을 찾습니다( 포괄적인 프로필 쿼리).

트레일 일치

복잡한 패턴에서는 동일한 가장자리를 여러 번 트래버스하는 것이 바람직하지 않은 경우가 많습니다. 실제 그래프에 무한 또는 지나치게 긴 경로로 이어질 수 있는 주기가 포함된 경우 에지 재사용이 중요해집니다. 에지 재사용을 처리하기 위해 Microsoft Fabric의 그래프는 일치 모드를 TRAIL 지원합니다.

키워드 TRAIL 를 사용하여 경로 패턴을 접두사로 지정하면 동일한 가장자리를 여러 번 바인딩하는 모든 일치 항목이 삭제됩니다.

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

패턴을 사용하면 TRAIL모든 가장자리가 다른 일치 항목만 생성됩니다. 따라서 경로가 지정된 일치 c = a 항목에서 주기를 형성하더라도 e3 동일한 에지에 e1바인딩되지 않습니다.

TRAIL 모드는 무한 루프를 방지하고 쿼리가 유의미하고 유의미한 경로를 반환하도록 하는 데 필수적입니다.

가변 길이 패턴 사용

가변 길이 패턴은 반복적인 패턴 사양을 작성하지 않고도 다양한 길이의 경로를 찾을 수 있는 강력한 구문입니다. 최적의 경로 길이를 미리 알 수 없는 계층, 소셜 네트워크 및 기타 구조를 트래버스하는 데 필수적입니다.

제한된 가변 길이 패턴

중요합니다

제한된 가변 길이 패턴은 현재 최대 상한인 8만 지원합니다. 현재 제한 사항에 대한 문서를 참조하세요.

많은 일반적인 그래프 쿼리는 동일한 에지 패턴을 여러 번 반복해야 합니다. 다음과 같은 자세한 패턴을 작성하는 대신

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

보다 간결한 가변 길이 구문을 사용할 수 있습니다.

(:Person)-[:knows]->{3}(:Person)

{3} 지 패턴이 -[:knows]-> 정확히 세 번 반복되도록 지정합니다.

유연한 반복 범위: 더 많은 유연성을 위해 반복에 대한 하한과 상한을 모두 지정할 수 있습니다.

(:Person)-[:knows]->{1, 3}(:Person)

이 패턴은 단일 쿼리에서 직접 친구, 친구의 친구 및 친구의 친구를 모두 찾습니다.

비고

하한은 입니다 0. 이 경우 일치하는 가장자리가 없으며 두 엔드포인트 노드 패턴이 동일한 노드와 일치하는 경우에만 전체 패턴이 일치합니다.

예제:

(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)

이 패턴은 서로 아는 서로 다른 사람들의 쌍을 매칭 하지만, 같은 사람이 자신을 '알지 못하더라도' 두 사람 모두 p1p2 와 매칭합니다.

하한을 지정하지 않으면 일반적으로 기본값은 0입니다.

복소 가변 길이 합성: 가변 길이 패턴은 다음 쿼리와 같이 더 크고 복잡한 패턴의 일부가 될 수 있습니다:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

이 패턴은 서로를 아는 사람들이 서로 다른 댓글을 좋아하고, 이러한 댓글은 각각 1~5개 수준의 회신 체인을 통해 연결되는 댓글 쌍을 찾습니다.

가변 길이 패턴 에지 변수 바인딩

가변 길이 에지 패턴을 바인딩하면 에지 변수의 값과 형식이 참조 컨텍스트에 따라 변경됩니다. 이 동작을 이해하는 것은 가변 길이 일치를 올바르게 처리하는 데 중요합니다.

2도 참조:

  • 가변 길이 패턴 내부: 그래프 에지 변수는 일치하는 경로를 따라 각 개별 가장자리에 바인딩됩니다("단일 참조 수준"이라고도 함).
  • 가변 길이 패턴 외부: 그래프 에지 변수는 일치하는 경로를 따라 모든 가장자리의 시퀀스에 바인딩됩니다("그룹 참조 수준"이라고도 함).

두 컨텍스트를 모두 보여주는 예제:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

에지 변수 e 의 평가는 다음 두 컨텍스트에서 발생합니다.

  • MATCH 성명서에서 이 쿼리는 2000년부터 각 우정이 확립된 친구의 친구 체인을 찾습니다. 패턴 일치 중에 에지 패턴 조건자는 e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") 각 후보 에지에 대해 한 번 평가됩니다. 이 컨텍스트 e 에서 단일 에지 참조 값에 바인딩됩니다.

  • RETURN 문: 여기서 e 는 일치하는 체인에서 발생하는 순서대로 에지 참조 값의 (그룹) 목록에 바인딩됩니다. 결과는 일치하는 각 체인의 e[0] 첫 번째 에지 참조 값입니다.

수평 집계에서의 가변 길이 패턴 엣지 변수:

가변 길이 패턴 매칭으로 묶인 엣지 변수는 가변 길이 패턴 외부의 그룹 리스트이므로 수평 집계에 사용할 수 있습니다.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

자세한 내용은 수평 집계 섹션을 참조하세요.