이 문서에서는 Spanner Graph에서 속성 그래프를 쿼리하는 방법을 설명합니다. 이 섹션의 예시에서는 Spanner Graph 설정 및 쿼리에서 만든 그래프 스키마를 사용합니다. 다음 다이어그램을 참조하세요.
Spanner Graph 쿼리 실행
다음 방법으로 Spanner Graph 쿼리를 실행할 수 있습니다.
Google Cloud 콘솔
Spanner 스튜디오 페이지에서 쿼리를 제출합니다. Spanner 스튜디오 페이지에 액세스하려면 데이터베이스 개요 페이지 또는 테이블 개요 페이지에서 Spanner 스튜디오를 클릭합니다. Spanner 스튜디오 액세스에 대한 자세한 내용은 Google Cloud 콘솔을 사용하여 데이터 관리를 참조하세요.
gcloud spanner
명령줄 도구gcloud spanner databases execute-sql
명령어를 사용하여 명령어를 제출합니다.executeSql
및executeStreamingSql
REST APIExecuteSql
및ExecuteStreamingSql
RPC API
Spanner Graph 쿼리 구조
이 섹션에서는 각 쿼리 구성요소에 대해 자세히 설명합니다.
다음 예시는 Spanner Graph 쿼리의 기본 구조를 보여줍니다.
Spanner Graph를 사용하면 데이터베이스 내에서 여러 그래프를 만들 수 있습니다.
쿼리는 GRAPH
절을 사용해서 대상 그래프 FinGraph
를 지정하는 것으로 시작합니다.
그래프 패턴 일치
그래프 패턴 일치는 그래프 내에서 특정 패턴을 찾습니다. 가장 기본적인 패턴은 그래프 요소(각각 노드와 에지)와 일치하는 요소 패턴(노드 패턴과 에지 패턴)입니다. 요소 패턴은 경로 패턴과 보다 복잡한 패턴으로 구성될 수 있습니다.
노드 패턴
노드 패턴은 그래프의 노드와 일치하는 패턴입니다. 이 패턴은 그래프 패턴 변수, 라벨 표현식, 속성 필터가 선택적으로 포함될 수 있는 일치하는 괄호 쌍으로 구성됩니다.
모든 노드 찾기
다음 쿼리는 그래프의 모든 노드를 반환합니다. 그래프 패턴 변수라고 부르는 n
변수는 일치 노드에 바인딩됩니다. 여기에서 노드 패턴은 그래프의 모든 노드와 일치합니다.
GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;
결과
쿼리는 다음과 같이 label
및 id
를 반환합니다.
라벨 | id |
---|---|
계정 | 7 |
계정 | 16 |
계정 | 20 |
인물 | 1 |
인물 | 2 |
인물 | 3 |
특정 라벨이 있는 모든 노드 찾기
다음 쿼리는 그래프에서 Person
라벨이 있는 모든 노드를 찾습니다.
이 쿼리는 일치하는 노드의 label
및 id
, name
속성을 반환합니다.
GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;
결과
라벨 | id | name |
---|---|---|
인물 | 1 | Alex |
인물 | 2 | Dana |
인물 | 3 | Lee |
라벨 표현식과 일치하는 모든 노드 찾기
하나 이상의 논리 연산자로 라벨 표현식을 만들 수 있습니다.
다음 쿼리는 그래프에서 Person
또는 Account
라벨이 있는 모든 노드를 찾습니다. 그래프 패턴 변수 n
으로 노출되는 속성 집합은 Person
또는 Account
라벨이 있는 노드로 노출되는 속성의 상위 집합입니다.
GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
- 결과에서 모든 노드에는
id
속성이 포함됩니다. Account
라벨과 일치하는 노드에는create_time
속성이 포함되지만birthday
속성이 없습니다. 이러한 노드의birthday
속성에 대해NULL
이 반환됩니다.Person
라벨과 일치하는 노드에는birthday
속성이 포함되지만create_time
속성이 없습니다. 이러한 노드의create_time
속성에 대해NULL
이 반환됩니다.
결과
라벨 | id | 생일 | create_time |
---|---|---|---|
계정 | 7 | NULL | 2020-01-10T14:22:20.222Z |
계정 | 16 | NULL | 2020-01-28T01:55:09.206Z |
계정 | 20 | NULL | 2020-02-18T13:44:20.655Z |
인물 | 1 | 1991-12-21T08:00:00Z | NULL |
인물 | 2 | 1980-10-31T08:00:00Z | NULL |
인물 | 3 | 1986-12-07T08:00:00Z | NULL |
라벨 표현식 규칙에 대한 자세한 내용은 라벨 표현식을 참조하세요.
라벨 표현식과 속성 필터와 일치하는 모든 노드 찾기
다음 쿼리는 그래프에서 Person
라벨이 있고 id
속성이 1
과 동일한 모든 노드를 찾습니다.
GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;
결과
라벨 | id | name | 생일 |
---|---|---|---|
인물 | 1 | Alex | 1991-12-21T08:00:00Z |
WHERE
절을 사용해서 라벨 및 속성에 대해 보다 복잡한 필터링 조건을 형성할 수 있습니다.
다음 쿼리는 그래프에서 Person
라벨이 있고 birthday
속성이 1990-01-10
이전인 모든 노드를 찾습니다.
GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;
결과
라벨 | name | 생일 |
---|---|---|
인물 | Dana | 1980-10-31T08:00:00Z |
인물 | Lee | 1986-12-07T08:00:00Z |
에지 패턴
에지 패턴은 에지 또는 노드 간의 관계를 찾습니다. 에지 패턴은 방향을 나타내는 -
, ->
, <-
기호와 함께 대괄호 []
로 묶어서 표시됩니다.
노드 패턴과 비슷하게 그래프 패턴 변수는 일치하는 에지 요소에 바인딩하기 위해 사용됩니다.
일치하는 라벨이 있는 모든 에지 찾기
다음 쿼리는 그래프에서 Owns
라벨이 있는 모든 에지를 반환합니다.
그래프 패턴 변수 e
가 일치하는 에지에 바인딩됩니다.
GRAPH FinGraph
MATCH -[e:Owns]->
RETURN e.id AS owner_id, e.account_id;
결과
owner_id | account_id |
---|---|
1 | 7 |
3 | 16 |
2 | 20 |
라벨 표현식과 속성 필터와 일치하는 모든 에지 찾기
노드 패턴과 비슷하게 에지 패턴은 다음 쿼리에 표시된 것처럼 라벨 표현식, 속성 사양, WHERE
절을 사용할 수 있습니다. 이 쿼리는 Owns
라벨이 있고 지정된 기간에 create_time
속성을 포함하는 모든 에지를 찾습니다.
GRAPH FinGraph
MATCH -[e:Owns WHERE e.create_time > '2020-01-14'
AND e.create_time < '2020-05-14']->
RETURN e.id AS owner_id, e.create_time, e.account_id;
결과
owner_id | create_time | account_id |
---|---|---|
2 | 2020-01-28T01:55:09.206Z | 20 |
3 | 2020-02-18T13:44:20.655Z | 16 |
모든 방향 에지 패턴을 사용하여 모든 에지 찾기
Spanner Graph의 모든 에지에 방향이 있지만 그래프에서 any direction
에지 패턴 -[]-
를 사용해서 어느 방향으로든 일치하는 에지를 찾을 수 있습니다.
다음 쿼리는 차단된 계정이 포함된 모든 송금을 찾습니다.
GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account)
WHERE account.is_blocked
RETURN transfer.order_number, transfer.amount;
결과
order_number | 금액 |
---|---|
304330008004315 | 300 |
304120005529714 | 100 |
103650009791820 | 300 |
302290001255747 | 200 |
경로 패턴
경로 패턴은 대체 노드 및 에지 패턴으로부터 빌드됩니다.
경로 패턴을 사용하여 지정된 라벨과 속성 필터가 있는 노드로부터 모든 경로 찾기
다음 쿼리는 id
가 2
와 동일한 Person
이 소유하는 계정에서 시작된 모든 송금을 찾습니다.
일치하는 각 결과는 Owns
에지를 사용하는 연결된 Account
를 통한 Person
{id: 2}
부터 Transfers
에지를 사용하는 다른 Account
까지의 경로를 나타냅니다.
GRAPH FinGraph
MATCH
(p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
(to_account:Account)
RETURN
p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;
결과
sender_id | from_id | to_id |
---|---|---|
2 | 20 | 7 |
2 | 20 | 16 |
정량화된 경로 패턴
정량화된 패턴을 사용하면 지정된 범위 내에서 패턴을 반복할 수 있습니다.
정량화된 에지 패턴 찾기
다음 쿼리는 id
가 7
인 소스 Account
에서 1~3번 송금이 수행된 모든 대상 계정을 찾고, 소스 계정 자체는 제외합니다.
수량자 {1, 3}
이 뒤에 붙은 에지 패턴
GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;
결과
src_account_id | path_length | dst_account_id |
---|---|---|
7 | 1 | 16 |
7 | 1 | 16 |
7 | 1 | 16 |
7 | 3 | 16 |
7 | 3 | 16 |
7 | 2 | 20 |
7 | 2 | 20 |
이전 예시는 ARRAY_LENGTH
함수를 사용해서 group variable
e
에 액세스합니다. 자세한 내용은 액세스 그룹 변수를 참조하세요.
패턴과 일치하는 src
및 dst
계정의 동일 쌍 사이에 여러 경로가 있을 수 있기 때문에 예제 결과의 일부 행이 반복됩니다.
정량화된 경로 패턴 일치
다음 쿼리는 차단된 중간 계정을 통해 1~2개의 Transfers
에지가 있는 Account
노드 사이의 경로를 찾습니다.
괄호로 묶인 경로 패턴이 정량화되고 괄호 안에 WHERE
절을 사용해서 반복 패턴 조건을 지정합니다.
GRAPH FinGraph
MATCH
(src:Account)
((:Account)-[:Transfers]->(interm:Account) WHERE interm.is_blocked){1,2}
-[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;
결과
src_account_id | dst_account_id |
---|---|
7 | 20 |
7 | 20 |
20 | 20 |
그룹 변수
정량화된 패턴에 선언된 그래프 패턴은 정량화된 패턴 외부에서 액세스되었을 때 그룹 변수로 간주되고 일치하는 그래프 요소의 배열에 바인딩됩니다.
그룹 변수를 배열로 액세스할 수 있으며, 여기서 그래프 요소는 일치하는 경로를 따라 나타나는 순서로 유지됩니다. 가로 집계를 사용해서 그룹 변수를 집계할 수 있습니다.
그룹 변수 액세스
다음 예시에서 e
변수는 다음과 같이 액세스됩니다.
WHERE
절에서e.amount > 100
(정량화된 패턴 내) 조건을 가진 단일 에지에 바인딩된 그래프 패턴 변수RETURN
문(정량화된 패턴 외)에서ARRAY_LENGTH(e)
의 에지 요소 배열에 바인딩된 그룹 변수- 정량화된 패턴 외에서
SUM(e.amount)
로 집계된 에지 요소 배열에 바인딩된 그룹 변수 다음은 가로 집계 예시입니다.
GRAPH FinGraph
MATCH
(src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
(dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
total_amount, dst.id AS dst_account_id;
결과
src_account_id | path_length | total_amount | dst_account_id |
---|---|---|---|
7 | 1 | 300 | 16 |
7 | 2 | 600 | 20 |
Any 및 Any Shortest 경로
동일한 소스 및 대상 노드를 공유하는 각 경로 그룹에서 일치하는 패턴을 제한하려면 ANY
또는 ANY SHORTEST
경로 검색 프리픽스를 사용하면 됩니다.
이렇나 프리픽스는 전체 경로 패턴 앞에만 적용할 수 있고 괄호 안에 적용할 수 없습니다.
ANY를 사용하여 찾기
다음 쿼리는 지정된 Account
노드에서 한 번 또는 두 번의 Transfers
로 도달할 수 있는 모든 고유 계정을 찾습니다.
ANY
경로 검색 프리픽스는 src
및 dst
Account
노드의 고유 쌍 사이에 경로가 하나만 반환되도록 보장합니다. 다음 예시에서는 소스 Account
노드에서 {id: 16}
을 사용하여 Account
노드에 도달하는 2개의 다른 경로가 있지만 결과에 경로가 하나만 포함됩니다.
GRAPH FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY(SELECT e.to_id FROM UNNEST(e) AS e)
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;
결과
src_account_id | dst_account_id | ids_in_path |
---|---|---|
7 | 16 | 16 |
7 | 20 | 16,20 |
그래프 패턴
그래프 패턴은 쉼표 ,
로 구분된 하나 이상의 경로 패턴으로 구성됩니다.
그래프 패턴에는 WHERE
절을 포함할 수 있습니다. 이를 통해 경로 패턴에 있는 모든 그래프 패턴에 액세스하여 필터링 조건을 형성할 수 있습니다. 각 경로 패턴은 경로 컬렉션을 생성합니다.
그래프 패턴을 사용하여 찾기
다음 쿼리는 200을 초과하는 트랜잭션에 관련된 중개 계정과 그 소유자를 식별합니다. 자금은 소스 계정에서 차단된 계정으로 송금됩니다.
다음 경로 패턴은 그래프 패턴을 형성합니다.
- 첫 번째 패턴은 중간 계정을 사용해서 하나의 계정에서 차단된 계정으로 송금이 수행된 경로를 찾습니다.
- 두 번째 패턴은 한 계정에서 계정 소유 인물로의 경로를 찾습니다.
interm
변수는 두 경로 패턴 간의 공통 링크로 작동합니다. interm
은 두 경로 패턴에 있는 동일한 요소 노드를 참조해야 합니다. 이렇게 하면 interm
변수를 기반으로 등가 조인 작업이 생성됩니다.
GRAPH FinGraph
MATCH
(src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
(interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
src.id AS src_account_id, dst.id AS dst_account_id,
interm.id AS interm_account_id, p.id AS owner_id;
결과
src_account_id | dst_account_id | interm_account_id | owner_id |
---|---|---|---|
20 | 16 | 7 | 1 |
선형 쿼리 문
여러 그래프 문을 하나로 연결해서 선형 쿼리 문을 만들 수 있습니다. 문이 실행되는 순서는 쿼리에 표시된 순서와 동일합니다.
- 각 문은 이전 문의 출력을 입력으로 사용합니다. 첫 번째 문은 입력이 비어 있습니다.
- 마지막 문의 출력이 최종 결과입니다.
차단된 계정에 대한 최대 송금 찾기
다음 쿼리는 차단된 계정으로 나가는 송금액이 가장 큰 계정과 그 소유자를 찾습니다.
GRAPH FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account)
WHERE dst_account.is_blocked
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;
다음 표는 문을 따라 중간 결과가 전달되는 방법을 보여줍니다. 간단한 설명을 위해 중간 결과의 일부 속성만 표시됩니다.
명세서 | 중간 결과(축약됨) | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MATCH (src_account:Account) -[transfer:Transfers]-> (dst_account:Account) WHERE dst_account.is_blocked |
|
||||||||||||
ORDER BY transfer.amount DESC |
|
||||||||||||
LIMIT 1 |
|
||||||||||||
MATCH (src_account:Account) <-[owns:Owns]- (owner:Person) |
|
||||||||||||
RETURN src_account.id AS account_id, owner.name AS owner_name |
|
결과
account_id | owner_name |
---|---|
7 | Alex |
return 문
return 문은 일치하는 패턴에서 반환할 항목을 정의합니다. 이 문은 그래프 패턴 변수에 액세스하고 표현식과 ORDER_BY, GROUP_BY와 같은 절을 포함할 수 있습니다. RETURN
문을 참조하세요.
Spanner Graph는 그래프 요소를 쿼리 결과로 반환하는 것을 지원하지 않습니다. 전체 그래프 요소를 반환하려면 TO_JSON
함수를 사용하세요.
그래프 요소를 JSON으로 반환
GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
결과
n |
---|
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation Fund"}} |
NEXT 키워드로 더 큰 쿼리 작성
NEXT
키워드를 사용해서 여러 그래프 선형 쿼리 문을 하나로 연결할 수 있습니다. 첫 번째 선형 쿼리 문의 입력은 비어 있습니다. 각 선형 쿼리 문의 출력은 다음 선형 쿼리 문의 입력이 됩니다.
다음 예시에서는 여러 그래프 선형 문을 하나로 연결해서 들어오는 송금액이 가장 큰 계정의 소유자를 찾습니다. 이 예시에서는 동일한 account
변수를 사용해서 여러 선형 문 간의 동일한 그래프 요소를 참조할 수 있습니다.
GRAPH FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1
NEXT
MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;
결과
account_id | owner_name | num_incoming_transfers |
---|---|---|
16 | Lee | 3 |
함수 및 표현식
집계 함수 및 Spanner Graph 쿼리의 다른 스칼라 함수를 포함하여 GoogleSQL의 모든 함수, 연산자, 조건을 사용할 수 있습니다.
Spanner Graph는 또한 그래프 요소에 대한 기본 제공 함수와 연산자를 지원합니다.
기본 제공 함수 및 연산자
다음 함수 및 연산자는 GQL에서 일반적으로 사용됩니다.
PROPERTY_EXISTS(n, birthday)
:n
이birthday
속성을 노출하는지 여부를 반환합니다.LABELS(n)
:n
의 라벨을 그래프 스키마에 정의된 대로 반환합니다.PROPERTY_NAMES(n)
:n
의 속성 이름을 반환합니다.TO_JSON(n)
:n
을 JSON 형식으로 반환합니다. 자세한 내용은TO_JSON
함수를 참조하세요.
다음 쿼리는 PROPERTY_EXISTS
조건자, LABELS
함수, TO_JSON
함수는 물론 ARRAY_AGG
및 CONCAT
과 같은 다른 기본 제공 함수를 보여줍니다.
GRAPH FinGraph
MATCH (person:Person)-[:Owns]->(account:Account)
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person
NEXT
RETURN
LABELS(person) AS labels,
TO_JSON(person) AS person,
accounts,
CONCAT(person.city, ", ", person.country) AS location,
PROPERTY_EXISTS(person, is_blocked) AS is_blocked_property_exists,
PROPERTY_EXISTS(person, name) AS name_property_exists
LIMIT 1;
결과
is_blocked_property_exists | name_property_exists | 라벨 | 계정 | 위치 | 사람 |
---|---|---|---|---|---|
false | true | 인물 | ["Vacation Fund"] | Adelaide, Australia | {"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}} |
서브 쿼리
서브 쿼리는 다른 쿼리에 중첩된 쿼리입니다. 다음은 Spanner Graph 서브 쿼리 규칙을 보여줍니다.
- 서브 쿼리는 중괄호
{}
쌍으로 묶어서 표시합니다. - 서브 쿼리는 현재 그래프를 지정하기 위해 선행
GRAPH
절로 시작할 수 있습니다. 지정된 그래프는 외부 쿼리에 사용된 것과 동일할 필요가 없습니다. - 서브 쿼리에서
GRAPH
절을 생략하면 다음 결과가 발생합니다.- 현재 그래프가 가장 가까운 외부 쿼리 컨텍스트에서 유추됩니다.
- 서브 쿼리는
MATCH.
를 사용한 그래프 패턴 일치 문으로부터 시작해야 합니다.
- 서브 쿼리 범위 외부에 선언된 그래프 패턴 변수는 서브 쿼리 내에 다시 선언할 수 없지만 서브 쿼리 내부의 표현식 또는 함수에서 참조할 수 있습니다.
서브 쿼리를 사용하여 각 계정의 총 송금액 찾기
다음 쿼리는 VALUE
서브 쿼리 사용을 보여줍니다. 서브 쿼리는 VALUE
키워드를 프리픽스로 표시하고 중괄호 {}
로 묶어서 표시됩니다. 쿼리는 한 계정에서 시작된 총 송금액을 반환합니다.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
MATCH (a:Account)-[transfer:Transfers]->(:Account)
WHERE a = account
RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;
결과
name | account_id | total_transfer |
---|---|---|
Alex | 7 | 400 |
Dana | 20 | 700 |
Lee | 16 | 300 |
지원되는 서브 쿼리 표현식 목록은 Spanner Graph 서브 쿼리를 참조하세요.
쿼리 매개변수
매개변수를 사용해서 Spanner Graph를 쿼리할 수 있습니다. 자세한 내용은 구문을 참조하고 Spanner 클라이언트 라이브러리에서 매개변수를 사용한 데이터 쿼리 방법을 알아보세요.
다음 쿼리는 쿼리 매개변수 사용을 보여줍니다.
GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;
그래프 및 테이블 함께 쿼리
Graph 쿼리를 SQL과 함께 사용해서 단일 문으로 Graphs 및 Tables의 정보를 함께 액세스할 수 있습니다.
GRAPH_TABLE
GRAPH_TABLE
연산자는 선형 그래프 쿼리를 사용해서 SQL 쿼리로 원활하게 통합할 수 있는 테이블 형식으로 결과를 반환합니다. 이러한 상호 운용성 덕분에 비그래프 콘텐츠로 그래프 쿼리 결과를 향상시킬 수 있으며, 그 반대의 경우도 마찬가지입니다.
예를 들어 다음 예시에 표시된 것처럼 CreditReports
테이블을 만들고 몇 가지 신용 보고서를 삽입할 수 있습니다.
CREATE TABLE CreditReports (
person_id INT64 NOT NULL,
create_time TIMESTAMP NOT NULL,
score INT64 NOT NULL,
) PRIMARY KEY (person_id, create_time);
INSERT INTO CreditReports (person_id, create_time, score)
VALUES
(1,"2020-01-10 06:22:20.222", 700),
(2,"2020-02-10 06:22:20.222", 800),
(3,"2020-03-10 06:22:20.222", 750);
그런 후 GRAPH_TABLE
에서 일치하는 그래프 패턴을 통해 관심 인물을 식별하고 그래프 쿼리 결과를 CreditReports
테이블과 조인하여 신용 점수에 액세스할 수 있습니다.
SELECT
gt.person.id,
credit.score AS latest_credit_score
FROM GRAPH_TABLE(
FinGraph
MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account)
WHERE account.is_blocked
RETURN DISTINCT person
) AS gt
JOIN CreditReports AS credit
ON gt.person.id = credit.person_id
ORDER BY credit.create_time;
결과:
person_id | latest_credit_score |
---|---|
1 | 700 |
2 | 800 |
다음 단계
쿼리 조정을 위한 권장사항 알아보기