GQL 그래프 패턴

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

이 문서에서는 GQL의 그래프 패턴에 대한 구문 및 컴퍼지션 규칙을 설명합니다.

중요합니다

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

단순 요소 패턴

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

간단한 노드 패턴

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

(:Place&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)

패턴은 노드를 찾 Person 은 x 후 서로를 알고 동시에 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.birthday < 19900101 AND p.gender = 'female')
      -[:workAt]->
      (c:Company WHERE c.name STARTS WITH 'A')

-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL

-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL

팁 (조언)

어떤 노드나 엣지가 매치에 참여할 수 있는지 설명할 때 술어를 패턴 내에 포함시키세요.

바인딩 경로 변수

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

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)

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

같은 MATCH 패턴들은 반드시 변수를 공유할 필요가 없습니다. 분리된 패턴들은 그들의 매칭에서 데카르트 곱을 형성합니다. 패턴이 동일한 그래프 요소를 바인딩해야 하고 결합된 조합만 남아야 할 변수를 재사용하세요.

제어 요소 재사용

GQL은 두 가지 수준에서 반복되는 노드와 엣지를 제어합니다:

  • 매칭 모드는 쉼표로 구분된 경로를 포함한 전체 그래프 패턴에 적용됩니다.
  • 경로 모드는 한 경로에 적용됩니다.

기본 매치 모드는 REPEATABLE ELEMENTS입니다. 이는 동일한 요소 바인딩이 각 경로의 경로 모드에 따라 그래프 패턴의 서로 다른 부분에서 발생할 수 있게 합니다. 명확하게 쓸 수 있습니다:

REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

전체 그래프 패턴 전반에 걸쳐 엣지 유일성을 요구하기 위해 또는 그 동의어 DIFFERENT RELATIONSHIPS 를 사용 DIFFERENT EDGES 하세요. 이 매칭 모드는 패턴 TRAIL 내 행동 WALK 경로도 변경합니다.

DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

다음 경로 모드는 각 경로 내 반복 요소를 제어합니다:

경로 모드 요소 재사용
WALK 노드와 엣지는 반복될 수 있습니다.
TRAIL 엣지는 반복할 수 없지만, 노드는 반복할 수 있습니다.
SIMPLE 노드는 반복할 수 없지만, 첫 번째와 마지막 노드는 동일할 수 있습니다. 가장자리는 반복될 수 없습니다.
ACYCLIC 첫 번째와 마지막 노드를 포함해 노드는 반복할 수 없습니다. 가장자리는 반복될 수 없습니다.

WALK 기본 경로 모드입니다. 더 엄격한 요소 유일성이 필요할 때 경로에 다른 모드로 접두어를 붙입니다:

와 ACYCLIC에 대해SIMPLE, 엣지 유일성은 노드의 유일성에서 따른다. 경로는 SIMPLE 첫 번째 노드로 돌아가 닫을 수 있지만, 여전히 엣지를 재사용할 수는 없습니다.

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

이 패턴은 TRAIL , , 가 e3 서로 다른 매칭e1e2만 생성한다. 노드는 여전히 반복될 수 있으므로, 경로는 엣지를 재사용하지 않고도 순환을 형성할 수 있습니다.

어떤 경로가 반환될지 제어하세요

경로 탐색 접두사는 경로 패턴이 반환하는 경로를 제어합니다. 기본 ALL 접두사는 경로 모드와 패턴에 맞는 모든 경로를 반환합니다. 명확히 이렇게 쓸 ALL 수 있습니다:

ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)

각 입력 행에서 각 출발지-목적지 쌍에 대해 최단 일치 경로 하나를 반환하는 데 사용 ANY SHORTEST 하세요:

MATCH p = ANY SHORTEST
  (src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100

여러 경로가 가장 짧은 길이로 같으면 쿼리는 그 중 하나를 반환하지만, 어떤 묶인 경로가 반환되는지는 결정적이지 않습니다. 0의 하한은 소스 노드에서 자기 자신으로의 0홉 경로를 반환할 수 있습니다.

ALL SHORTEST ANY 경로 탐색도 지원되지 않습니다.

술어를 경로 선택 앞이나 후에 배치하세요

술어 배치는 조건이 경로 탐색 접두사가 선택한 경로 후 적격 경로를 정의하는지, 아니면 필터링하는지를 결정합니다:

  • 노드나 엣지 패턴의 인라인 WHERE 은 패턴의 일부입니다. 이 법은 어떤 경로가 적용 전이나 적용 전에 ALLANY SHORTEST 자격이 되는지 제한합니다.
  • 완전한 MATCH 패턴 이후의 문장 수준 WHERE 은 포스트필터입니다. 경로 탐색 접두사가 선택한 경로를 선택한 후 행을 필터링합니다.
  • 이후 FILTER 문장은 경로 선택 후 행도 필터링합니다.

이 구분은 특히 에서 중요합니다 ANY SHORTEST. 다음 패턴에서는, 쿼리가 최단 경로를 선택할 때 지정된 날짜 이후에 생성된 간선만 knows 자격이 있습니다:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connection:knows
    WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
RETURN p

엣지 조건을 포스트필터로 옮기면 의미가 달라집니다. 쿼리는 먼저 해당 조건이 없는 최단 경로를 선택합니다. 그 후 어떤 간선이 조건을 충족하지 못하면 선택한 경로를 제거합니다; 대신 더 긴 경로를 선택하지 않습니다:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connections:knows]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
           WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p

중요합니다

일부 ANY SHORTEST 쿼리 도형의 경우, 그래프는 현재 경로 선택 전에 문장 수준의 MATCH ... WHERE 조건을 적용할 수 있습니다. 이 제한이 해결될 때까지는 경로 적격성에 인라인 술어를, 선택 후 필터링을 위한 별도의 FILTER 문장을 사용하세요. 자세한 내용은 현재 제한 사항을 참조하세요.

가변 길이 패턴 사용

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

제한된 가변 길이 패턴

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

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

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

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

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

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

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

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

비고

하한은 0일 수도 있습니다. 제로 홉 매치는 간선이 없으며, 두 엔드포인트 노드 패턴이 동일한 노드와 일치해야 합니다.

Example:

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

이 패턴은 각 사람을 0홉에서 두 p2 사람 모두 p1 와 매칭하고, 연결된 쌍을 한 홉에서 매칭합니다.

에 {,n}하한이 지정되지 않으면 기본값은 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개에서 3 replyOf 개의 모서리 사슬로 연결된 메시지를 m 찾아냅니다.

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

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

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

자세한 내용은 집계 함수를 참조하세요.

바인딩되지 않은 가변 길이 패턴

최대 경로 길이가 알려지지 않을 때는 무한(unbounded quantifier)을 사용하세요:

-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)

와 + 단축키는 * 0회 이상 반복과 1회 이상의 반복을 지정합니다:

-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)

-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)

기본 ALL WALK 조합을 가진 무한한 패턴은 사이클이 무한히 많은 매칭 경로를 생성할 수 있기 때문에 거부됩니다. 경로의 엣지나 노드 유일성을 바운딩하기 위해 , , SIMPLEACYCLIC , 를 사용TRAIL하세요. 이 모드들은 종료를 보장하지만, 큰 그래프라도 많은 경로를 생성할 수 있습니다.

중요합니다

무한ANY SHORTEST WALK한 경로에 대해 지원되는 용도는 PATH_LENGTH(path) 와 그와 함께, 입니다. path IS NULL 그래프는 이 형태로 완전한 경로를 구현하지 않습니다. 유한 상한을 사용하거나 TRAIL, SIMPLE, 또는 ACYCLIC 경로를 반환하거나 다른 방식으로 사용한다.