이 페이지에서는 Spanner Graph에서 그래프 경로를 사용하는 방법을 설명합니다.
그래프 데이터베이스에서 그래프 경로 데이터 유형은 에지로 삽입된 노드의 시퀀스를 나타내며 이러한 노드와 에지의 관계를 보여줍니다. 경로 데이터 유형에 관한 자세한 내용은 그래프 경로 유형을 참고하세요.
Spanner Graph 언어 (GQL)를 사용하면 그래프 경로를 구성하고 이에 대해 쿼리를 실행할 수 있습니다. 이 문서의 예에서는 Spanner Graph 설정 및 쿼리 페이지에 있는 것과 동일한 Spanner Graph 스키마를 사용합니다.
그래프 경로 구성
그래프 패턴에서 또는 PATH
함수를 사용하여 경로 변수를 만들어 그래프 경로를 구성할 수 있습니다.
경로 변수를 사용하여 그래프 경로를 구성하는 것이 좋습니다. 경로 변수를 만드는 형식은 다음과 같습니다.
MATCH p = PATH_PATTERN
자세한 내용은 그래프 패턴을 참고하세요.
예시
다음 예에서는 쿼리가 FinGraph
내 계정 간의 송금 패턴을 찾습니다.
GRAPH FinGraph
MATCH p = (src:Account {id: 16})-[t1:Transfers]->(mid:Account)-[t2:Transfers]->
(dst:Account {id: 7})
RETURN TO_JSON(p) AS full_path;
결과
full_path |
---|
[{"identifier": ..., "properties": {"id": 16, ...}, ...}, {"identifier": ..., "properties": {"amount": 300.0, ...}, ...}, ...] |
이 결과는 쿼리가 데이터베이스에서 Account -> Transfers -> Account
패턴을 찾았음을 나타냅니다.
그래프 경로 쿼리
다음 경로별 함수를 사용하여 그래프 경로를 쿼리할 수 있습니다. Spanner Graph 쿼리에 관한 일반적인 정보는 쿼리 개요를 참고하세요.
EDGES
EDGES
함수는 그래프 경로의 모든 에지를 반환합니다. 자세한 시맨틱스는 EDGES
를 참고하세요.
예시
이 쿼리는 중간 계정을 통과하는 두 계정 간의 경로를 찾습니다.
경로에서 두 번째 Transfers
가장자리의 크기를 반환합니다. 이 크기는 src
과 mid
사이 또는 mid
과 dst
사이일 수 있습니다.
GRAPH FinGraph
MATCH p = (src:Account {id: 7})-[t1:Transfers]->{1,3}(mid:Account)-[t2:Transfers]->
{1,3}(dst:Account {id: 16})
LET second_edge = EDGES(p)[1]
RETURN DISTINCT src.id AS src, dst.id AS dst, second_edge.amount AS second_edge_amount;
결과
src | dst | second_edge_amount |
---|---|---|
7 | 16 | 300 |
NODES
NODES
함수는 그래프 경로의 모든 노드를 반환합니다. 자세한 시맨틱은 NODES
를 참고하세요.
예시
이 쿼리는 두 전송의 그래프 경로를 찾은 다음 경로를 나타내는 JSON 목록을 반환합니다.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN TO_JSON(NODES(p)) AS nodes;
결과
nodes |
---|
[{"identifier": "...", "properties": {"id": 16}, ...}, {"identifier": "...", "properties": {"id": 20, ...}, ...] |
... |
PATH_FIRST
PATH_FIRST
함수는 그래프 경로에서 첫 번째 노드를 찾습니다. 자세한 시맨틱은 PATH_FIRST
를 참고하세요.
예시
이 쿼리는 두 전송의 그래프 경로에서 첫 번째 노드를 찾습니다. Account
노드의 라벨과 계정의 닉네임을 반환합니다.
GRAPH FinGraph
MATCH p = -[:Transfers]->{1,3}(dst:Account{id: 7})
RETURN DISTINCT PATH_FIRST(p).id AS can_reach_target;
결과
can_reach_target |
---|
7 |
16 |
20 |
PATH_LAST
PATH_LAST
함수는 그래프 경로의 마지막 노드를 찾습니다. 자세한 시맨틱스는 PATH_LAST
를 참고하세요.
예시
이 쿼리는 두 전송의 그래프 경로에서 마지막 노드를 찾습니다. Account
노드의 라벨과 계정의 닉네임을 반환합니다.
GRAPH FinGraph
MATCH p =(start:Account{id: 7})-[:Transfers]->{1,3}
RETURN DISTINCT PATH_LAST(p).id as can_reach_target;
결과
can_reach_target |
---|
7 |
16 |
20 |
PATH_LENGTH
PATH_LENGTH
함수는 그래프 경로의 가장자리 수를 찾습니다. 자세한 시맨틱스는 PATH_LENGTH
를 참고하세요.
예시
이 쿼리는 1~3개의 전송이 포함된 그래프 경로의 에지 수를 찾습니다.
GRAPH FinGraph
MATCH p = (src:Account)-[e:Transfers]->{1,3}(dst:Account)
RETURN PATH_LENGTH(p) AS num_transfers, COUNT(*) AS num_paths;
결과
num_transfers | num_paths |
---|---|
1 | 5 |
2 | 7 |
3 | 11 |
IS_ACYCLIC
IS_ACYCLIC
함수는 그래프 경로에 반복 노드가 있는지 확인합니다. 반복이 발견되면 TRUE
를 반환하고, 그렇지 않으면 FALSE
를 반환합니다. 자세한 시맨틱은 IS_ACYCLIC
를 참고하세요.
예시
이 쿼리는 이 그래프 경로에 반복되는 노드가 있는지 확인합니다.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN IS_ACYCLIC(p) AS is_acyclic_path, src.id AS source_account_id,
mid.id AS mid_account_id, dst.id AS dst_account_id;
결과
is_acyclic_path | source_account_id | mid_account_id | dst_account_id |
---|---|---|---|
TRUE | 16 | 20 | 7 |
TRUE | 20 | 7 | 16 |
TRUE | 20 | 7 | 16 |
FALSE | 16 | 20 | 16 |
TRUE | 7 | 16 | 20 |
TRUE | 7 | 16 | 20 |
FALSE | 20 | 16 | 20 |
IS_TRAIL
IS_TRAIL
함수는 그래프 경로에 반복되는 가장자리가 있는지 확인합니다. 반복이 발견되면 TRUE
를 반환하고, 그렇지 않으면 FALSE
를 반환합니다. 자세한 시맨틱은 IS_TRAIL
를 참고하세요.
예시
이 쿼리는 이 그래프 경로에 반복되는 가장자리가 있는지 확인합니다.
GRAPH FinGraph
MATCH p = (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
WHERE src.id < dst.id
RETURN IS_TRAIL(p) AS is_trail_path, t1.id AS t1_id, t2.id AS t2_id, t3.id AS t3_id;
결과
is_trail_path | t1_id | t2_id | t3_id |
---|---|---|---|
FALSE | 16 | 20 | 16 |
TRUE | 7 | 16 | 20 |
TRUE | 7 | 16 | 20 |
경로 모드
Spanner Graph에서 기본적으로 반복 노드와 에지가 반환됩니다. 다음 경로 모드를 사용하여 지정된 모드에 따라 노드와 가장자리가 반복되는 경로를 포함하거나 제외할 수 있습니다. 자세한 시맨틱은 경로 모드를 참고하세요.
WALK
기본 WALK
경로 모드는 반복되는 노드와 가장자리가 있는 경로를 포함한 모든 경로를 유지합니다.
예시
다음 쿼리는 수치화되지 않은 경로 패턴에서 WALK
경로 모드를 사용하는 방법을 보여줍니다. 결과의 첫 번째 경로는 t1
와 t3
에 동일한 가장자리를 사용합니다.
GRAPH FinGraph
MATCH p = WALK (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
WHERE src.id < dst.id
RETURN t1.id AS transfer1_id, t2.id AS transfer2_id, t3.id AS transfer3_id;
결과
transfer1_id | transfer2_id | transfer3_id |
---|---|---|
16 | 20 | 16 |
7 | 16 | 20 |
7 | 16 | 20 |
TRAIL
기본 TRAIL
경로 모드는 반복되는 가장자리가 있는 경로를 필터링합니다.
예시
다음 쿼리는 수치화되지 않은 경로 패턴에서 TRAIL
경로 모드를 사용하는 방법을 보여줍니다. t1
및 t3
가장자리가 동일한 경로는 필터링됩니다.
GRAPH FinGraph
MATCH p = TRAIL (src:Account)-[t1:Transfers]->(mid1:Account)-[t2:Transfers]->
(mid2:Account)-[t3:Transfers]->(dst:Account)
RETURN
t1.id AS transfer1_id, t2.id AS transfer2_id, t3.id AS transfer3_id;
결과
transfer1_id | transfer2_id | transfer3_id |
---|---|---|
16 | 20 | 7 |
16 | 20 | 7 |
20 | 7 | 16 |
20 | 7 | 16 |
7 | 16 | 20 |
7 | 16 | 20 |
7 | 16 | 20 |
7 | 16 | 20 |
20 | 16 | 20 |
경로 검색 프리픽스
경로 검색 접두사를 사용하여 경로 패턴을 제한하여 각 데이터 파티션에서 가장 짧은 경로를 반환할 수 있습니다. 자세한 시맨틱스는 경로 검색 접두사를 참고하세요.
ANY SHORTEST
ANY SHORTEST
경로 검색 접두사는 각 데이터 파티션의 패턴과 일치하는 가장 짧은 경로 (가장 적은 수의 간선이 있는 경로)를 반환합니다. 파티션당 최단 경로가 두 개 이상인 경우 그중 하나를 반환합니다.
예시
다음 쿼리는 각 [a, b]
쌍 간의 모든 경로를 일치시킵니다.
GRAPH FinGraph
MATCH p = ANY SHORTEST (a:Account)-[t:Transfers]->{1,4}(b:Account)
WHERE a.is_blocked
LET total_amount = SUM(t.amount)
RETURN a.id AS account1_id, total_amount, b.id AS account2_id;
결과
account1_id | total_amount | account2_id |
---|---|---|
16 | 500 | 16 |
16 | 800 | 7 |
16 | 300 | 20 |
변환 규칙
자세한 내용은 GRAPH_PATH 변환 규칙을 참고하세요.