openCypher 사용자를 위한 Spanner Graph 참조

이 문서에서는 다음과 같은 방식으로 openCypher와 Spanner Graph를 비교합니다.

  • 용어
  • 데이터 모델
  • 스키마
  • 쿼리
  • 변형

이 문서에서는 사용자가 openCypher v9에 익숙하다고 가정합니다.

시작하기 전에

Google Cloud 콘솔을 사용하여 Spanner Graph를 설정하고 쿼리합니다.

용어

openCypher Spanner Graph
노드 노드
관계 에지
노드 라벨 노드 라벨
관계 유형 가장자리 라벨
Spanner Graph에서는 전체 실행 단위에 statement라는 용어를 사용하고 문의 한정자에 clause를 사용합니다.

예를 들어 MATCH는 문이지만 WHERE는 절입니다.
관계 고유성

openCypher는 단일 일치에서 반복되는 에지가 있는 결과를 반환하지 않습니다.
TRAIL 경로

Spanner Graph에서 고유성을 원하는 경우 TRAIL 모드를 사용하여 단일 일치에서 고유한 에지를 반환합니다.

표준 준수

Spanner Graph는 ISO Graph Query Language(GQL) 및 SQL/속성 그래프 쿼리(SQL/PGQ) 표준을 채택합니다.

데이터 모델

Spanner Graph와 openCypher는 모두 속성 그래프 데이터 모델을 채택하지만 약간의 차이가 있습니다.

openCypher Spanner Graph
각 관계에는 정확히 하나의 관계 유형이 있습니다.
노드와 에지 모두 하나 이상의 라벨이 있습니다.

스키마

openCypher Spanner Graph
그래프에는 사전 정의된 스키마가 없습니다. 그래프 스키마는 CREATE PROPERTY GRAPH을 사용하여 명시적으로 정의해야 합니다.
라벨은 스키마에 정적으로 정의됩니다. 라벨을 업데이트하려면 스키마를 업데이트해야 합니다.
자세한 내용은 Spanner Graph 스키마 만들기, 업데이트 또는 삭제를 참조하세요.

쿼리

Spanner Graph 쿼리 기능은 openCypher와 유사합니다. Spanner Graph와 openCypher의 차이점은 이 섹션에 설명되어 있습니다.

그래프 지정

openCypher에는 기본 그래프가 하나 있으며 쿼리는 기본 그래프에서 작동합니다. Spanner Graph에서 그래프를 두 개 이상 정의할 수 있으며, 쿼리할 그래프를 지정하려면 쿼리가 GRAPH 절로 시작해야 합니다. 예를 들면 다음과 같습니다.

   GRAPH FinGraph
   MATCH (p:Person)
   RETURN p.name
   ORDER BY p.name
   LIMIT 1;

자세한 내용은 그래프 쿼리 문법을 참조하세요.

그래프 패턴 일치

Spanner Graph는 openCypher와 유사한 그래프 패턴 일치 기능을 지원합니다. 차이점은 다음 섹션에서 설명합니다.

관계 고유성 및 TRAIL 모드

openCypher는 단일 일치에서 반복되는 에지가 있는 결과를 반환하지 않습니다. 이를 openCypher에서는 관계 고유성이라고 합니다. Spanner Graph에서 기본적으로 반복 에지가 반환됩니다. 고유성을 원하는 경우 TRAIL 모드를 사용하여 단일 일치에 반복되는 에지가 없는지 확인합니다. TRAIL 및 기타 다양한 경로 모드의 세부 시맨틱은 경로 모드를 참고하세요.

다음 예는 TRAIL 모드에 따라 쿼리 결과가 어떻게 변경되는지 보여줍니다.

  • openCypher 및 Spanner Graph TRAIL 모드 쿼리는 가능한 유일한 경로가 t1을 두 번 반복하는 것이므로 빈 결과를 반환합니다.
  • 기본적으로 Spanner Graph 쿼리는 유효한 경로를 반환합니다.

그래프 예시

openCypher Spanner Graph(TRAIL 모드) Spanner Graph (기본 모드)
MATCH
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]->(dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
GRAPH FinGraph
MATCH TRAIL
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]->(dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]-> (dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
빈 결과. 빈 결과. 결과:
src_id dst_id
16 20

그래프 요소를 쿼리 결과로 반환

openCypher Spanner Graph
MATCH (account:Account)
WHERE account.id = 16;
RETURN account;
GRAPH FinGraph
MATCH (account:Account)
WHERE account.id = 16;
RETURN TO_JSON(account) AS account;

Spanner Graph에서 쿼리 결과는 그래프 요소를 반환하지 않습니다. TO_JSON 함수를 사용하여 그래프 요소를 JSON으로 반환합니다.

가변 길이 패턴 일치 및 패턴 정량화

openCypher의 가변 길이 패턴 일치를 Spanner Graph에서는 경로 정량화라고 합니다. 경로 정량화는 다음 예와 같이 다른 문법을 사용합니다. 자세한 내용은 수치화된 경로 패턴을 참고하세요.

openCypher Spanner Graph
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account)
WHERE src.id = 16
RETURN dst.id
ORDER BY dst.id;
     
GRAPH FinGraph
MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account)
WHERE src.id = 16
RETURN dst.id
ORDER BY dst.id;
      

가변 길이 패턴: 요소 목록

Spanner Graph를 사용하면 경로 정량화에 사용되는 변수에 직접 액세스할 수 있습니다. 다음 예시에서 Spanner Graph의 e는 openCypher의 edges(p)와 동일합니다.

openCypher Spanner Graph
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account)
WHERE src.id = 16
RETURN edges(p);
      
GRAPH FinGraph
MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account)
WHERE src.id = 16
RETURN TO_JSON(e) AS e;
     

최단 경로

openCypher에는 노드 간의 최단 경로를 찾는 두 가지 기본 제공 함수인 shortestPathallShortestPath가 있습니다.

  • shortestPath는 노드 간에 단일 최단 경로를 찾습니다.
  • allShortestPath는 노드 간의 모든 최단 경로를 찾습니다. 길이가 같은 경로가 여러 개 있을 수 있습니다.

Spanner Graph는 노드 간에 단일 최단 경로를 찾기 위해 다른 문법을 사용합니다. shortestPath.ANY SHORTEST를 사용합니다. allShortestPath 함수는 Spanner Graph에서 지원되지 않습니다.

openCypher Spanner Graph
MATCH
  (src:Account {id: 7}),
  (dst:Account {id: 20}),
  p = shortestPath((src)-[*1..10]->(dst))
RETURN length(p) AS path_length;
      
GRAPH FinGraph
MATCH ANY SHORTEST
  (src:Account {id: 7})-[e:Transfers]->{1, 3}
  (dst:Account {id: 20})
RETURN ARRAY_LENGTH(e) AS path_length;
      

문 및 절

다음 표에는 openCypher 절이 나와 있으며 Spanner Graph에서 지원되는지 여부가 표시됩니다.

openCypher Spanner Graph
MATCH 지원됨 자세한 내용은 그래프 패턴 일치를 참조하세요.
OPTIONAL MATCH 지원됨 자세한 내용은 그래프 패턴 일치를 참조하세요.
RETURN / WITH 지원됨 자세한 내용은 RETURN WITH을 참조하세요.
Spanner Graph에서는 복잡한 표현식에 명시적 별칭이 필요합니다.

지원됨
GRAPH FinGraph
MATCH (p:Person)
RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear;

지원되지 않음
GRAPH FinGraph
MATCH (p:Person)
RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing
WHERE 지원됨 자세한 내용은 그래프 패턴 정의를 참조하세요.
ORDER BY 지원됨 자세한 내용은 ORDER BY 문을 참조하세요.
SKIP / LIMIT 지원됨 자세한 내용은 SKIP LIMIT을 참조하세요.

Spanner Graph에는 오프셋과 한도에 상수 표현식이 필요합니다.

지원됨
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id
SKIP @offsetParameter
LIMIT 3;

지원되지 않음
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id
LIMIT VALUE {
  MATCH (m:Person)
  RETURN COUNT(*) AS count
} AS count; -- Not a constant expression
UNION 지원됨 자세한 내용은 복합 그래프 쿼리를 참조하세요.
UNION ALL 지원됨 자세한 내용은 복합 그래프 쿼리를 참조하세요.
UNWIND FOR에서 지원됩니다.
GRAPH FinGraph
LET arr = [1, 2, 3]
FOR num IN arr
RETURN num;
MANDATORY MATCH 지원되지 않음
CALL[YIELD...] 지원되지 않음
CREATE, DELETE, SET, REMOVE, MERGE 자세한 내용은 변형 섹션 및 Spanner Graph에 데이터 삽입, 업데이트 또는 삭제를 참조하세요.

데이터 유형

Spanner Graph는 모든 GoogleSQL 데이터 유형을 지원합니다. 자세한 내용은 GoogleSQL의 데이터 유형을 참조하세요.

다음 섹션에서는 openCypher 데이터 유형과 Spanner Graph 데이터 유형을 비교합니다.

구조 유형

openCypher Spanner Graph
노드 노드
에지 Edge
경로 경로

속성 유형

openCypher Spanner Graph
INT INT64
FLOAT FLOAT64
STRING STRING
BOOLEAN BOOL
LIST
간단한 유형의 동종 목록입니다.
예: INT 목록, STRING 목록.
단일 목록에서 INTSTRING을 혼합할 수 없습니다.
ARRAY

복합 유형

openCypher Spanner Graph
LIST ARRAY 또는 JSON
MAP STRUCT 또는 JSON

Spanner Graph는 서로 다른 유형의 이기종 목록 또는 동적 키 목록의 맵 및 이기종 요소 값 유형을 지원하지 않습니다. 이러한 사용 사례에는 JSON을 사용하세요.

유형 변환

openCypher Spanner Graph
INT -> FLOAT 지원됨

유형 변환 규칙에 대한 자세한 내용은 GoogleSQL의 변환 규칙을 참조하세요.

함수 및 표현식

그래프 함수와 표현식 외에도 Spanner Graph는 모든 GoogleSQL 기본 제공 함수와 표현식을 지원합니다.

이 섹션에는 openCypher 함수 및 표현식과 Spanner Graph의 그에 해당하는 함수가 나와 있습니다.

구조 유형 함수 및 표현식

유형 openCypher
함수 또는 표현식
Spanner Graph
함수 또는 표현식

노드 및 에지
exists(n.prop) PROPERTY_EXISTS(n, prop)
id(정수 반환) 지원되지 않음
properties TO_JSON
keys
(속성 값이 아닌 속성 유형 이름)
PROPERTY_NAMES
labels LABELS
Edge endNode 지원되지 않음
startNode 지원되지 않음
type LABELS
경로 length 지원되지 않음
nodes 지원되지 않음
relationships 지원되지 않음
노드 및 에지 .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

지원되지 않음
표현식으로서의 패턴 size(pattern) 지원되지 않음 다음과 같이 하위 쿼리를 사용합니다.
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

속성 유형 함수 및 표현식

유형 openCypher
함수 또는 표현식
Spanner Graph
함수 또는 표현식
Scalar coalesce COALESCE
head ARRAY_FIRST
last ARRAY_LAST
size(list) ARRAY_LENGTH
size(string) LENGTH
timestamp UNIX_MILLIS(CURRENT_TIMESTAMP())
toBoolean/toFloat/toInteger CAST(expr AS type)
집계 avg AVG
collect ARRAY_AGG
count COUNT
max MAX
min MIN
percentileCont PERCENTILE_CONT
percentileDisc PERCENTILE_DISC
stDev STDDEV
stDevP 지원되지 않음
sum SUM
목록 range GENERATE_ARRAY
reverse ARRAY_REVERSE
tail Spanner Graph에서는 tail을 지원하지 않습니다.
대신 ARRAY_SLICEARRAY_LENGTH를 사용하세요.
수학 abs ABS
ceil CEIL
floor FLOOR
rand RAND
round ROUND
sign SIGN
e EXP(1)
exp EXP
log LOG
log10 LOG10
sqrt SQRT
acos ACOS
asin ASIN
atan ATAN
atan2 ATAN2
cos COS
cot COT
degrees r * 90 / ASIN(1)
pi ACOS(-1)
radians d * ASIN(1) / 90
sin SIN
tan TAN
문자열 left LEFT
ltrim LTRIM
replace REPLACE
reverse REVERSE
right RIGHT
rtrim RTRIM
split SPLIT
substring SUBSTR
tolower LOWER
tostring CAST(expr AS STRING)
toupper UPPER
trim TRIM
DISTINCT DISTINCT DISTINCT
수학 + +
- -
* *
/ /
% MOD
^ POW
비교 = =
<> <>
< <
> >
<= <=
>= >=
IS [NOT] NULL IS [NOT] NULL
비교 연쇄
a < b < c

Spanner Graph는 비교 연쇄를 지원하지 않습니다. 이는 AND와 연결되는 비교와 동일합니다.
예:

      a < b AND b < C
      

부울 AND AND
OR OR
XOR
Spanner Graph는 XOR을 지원하지 않습니다. <>를 사용하여 쿼리를 작성합니다.

예를 들면 다음과 같습니다.
      boolean_1 <> boolean_2
      

NOT NOT
문자열 STARTS WITH STARTS_WITH
ENDS WITH ENDS_WITH
CONTAINS REGEXP_CONTAINS
+ CONCAT
목록 + ARRAY_CONCAT
IN ARRAY_INCLUDES
[] []

기타 표현식

openCypher Spanner Graph
Case expression 지원됨
Exists subquery 지원됨
Map projection 지원되지 않음
STRUCT 유형은 유사한 기능을 제공합니다.
List comprehension 지원되지 않음
GENERATE_ARRAYARRAY_TRANSFORM은 대부분의 사용 사례를 다룹니다.

쿼리 파라미터

다음 쿼리는 openCypher에서 파라미터를 사용하는 것과 Spanner Graph에서 파라미터를 사용하는 것의 차이를 보여줍니다.

openCypher Spanner Graph
매개변수
MATCH (n:Person)
WHERE n.id = $id
RETURN n.name;
GRAPH FinGraph
MATCH (n:Person)
WHERE n.id = @id
RETURN n.name;

변형

Spanner Graph는 GoogleSQL DML을 사용하여 노드 및 에지 입력 테이블을 변형합니다. 자세한 내용은 Spanner Graph 데이터 삽입, 업데이트 또는 삭제를 참조하세요.

노드 및 에지 만들기

openCypher Spanner Graph
노드 및 에지 만들기
CREATE (:Person {id: 100, name: 'John'});
CREATE (:Account {id: 1000, is_blocked: FALSE});

MATCH (p:Person {id: 100}), (a:Account {id: 1000}) CREATE (p)-[:Owns {create_time: timestamp()}]->(a);
INSERT INTO
Person (id, name)
VALUES (100, "John");

INSERT INTO Account (id, is_blocked) VALUES (1000, FALSE);
INSERT INTO PersonOwnAccount (id, account_id, create_time) VALUES (100, 1000, CURRENT_TIMESTAMP());
쿼리 결과로 노드 및 에지 만들기
MATCH (a:Account {id: 1}), (oa:Account)
WHERE oa <> a
CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa);
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount)
SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100
FROM GRAPH_TABLE(
  FinGraph
  MATCH
    (a:Account {id:1000}),
    (oa:Account)
  WHERE oa <> a
);

Spanner Graph에서는 CREATE PROPERTY GRAPH DDL 문에 따라 라벨이 정적으로 할당됩니다.

노드 및 에지 업데이트

openCypher Spanner Graph
속성 업데이트
MATCH (p:Person {id: 100})
SET p.country = 'United States';
UPDATE Person AS p
SET p.country = 'United States'
WHERE p.id = 100;

Spanner Graph 라벨을 업데이트하려면 Spanner Graph 스키마 만들기, 업데이트 또는 삭제를 참조하세요.

노드 및 에지 병합

openCypher Spanner Graph
새 요소 삽입 또는 속성 업데이트
MERGE (p:Person {id: 100, country: 'United States'});
INSERT OR UPDATE INTO Person
(id, country)
VALUES (100, 'United States');

노드 및 에지 삭제

에지를 삭제하는 것은 입력 테이블을 삭제하는 것과 같습니다.

openCypher Spanner Graph
노드 및 에지 삭제
MATCH (p:Person {id:100}), (a:Account {id:1000})
DELETE (p)-[:Owns]->(a);
DELETE PersonOwnAccount
WHERE id = 100 AND account_id = 1000;

노드를 삭제하려면 잠재적인 허상 에지 처리가 필요합니다. DELETE CASCADE가 지정되면 DELETE는 openCypher에서 DETACH DELETE와 같은 노드의 연결된 에지를 삭제합니다. 자세한 내용은 Spanner 스키마 개요를 참고하세요.

openCypher Spanner Graph
노드 및 연결된 에지 삭제
DETACH DELETE (:Account {id: 1000});
DELETE Account
WHERE id = 1000;

변형 결과 반환

openCypher Spanner Graph
삽입 또는 업데이트 후 결과 반환
MATCH (p:Person {id: 100})
SET p.country = 'United States'
RETURN p.id, p.name;
UPDATE Person AS p
SET p.country = 'United States'
WHERE p.id = 100
THEN RETURN id, name;
삭제 후 결과 반환
DELETE (p:Person {id: 100})
RETURN p.country;
DELETE FROM Person
WHERE id = 100
THEN RETURN country;

다음 단계