이 문서에서는 다음과 같은 방식으로 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; |
||||
빈 결과. | 빈 결과. | 결과:
|
그래프 요소를 쿼리 결과로 반환
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에는 노드 간의 최단 경로를 찾는 두 개의 기본 제공 함수(shortestPath
및 allShortestPath
)가 있습니다.
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 | Edge |
경로 | 지원되지 않음 |
속성 유형
openCypher | Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST 간단한 유형의 동종 목록입니다. 예: INT 목록, STRING 목록.단일 목록에서 INT 와 STRING 을 혼합할 수 없습니다. |
ARRAY |
복합 유형
openCypher | Spanner Graph |
---|---|
LIST |
ARRAY 또는 JSON |
MAP |
STRUCT 또는 JSON |
Spanner Graph는 서로 다른 유형의 이기종 목록 또는 동적 키 목록의 맵 및 이기종 요소 값 유형을 지원하지 않습니다. 이러한 사용 사례에는 JSON을 사용하세요.
유형 변환
openCypher | Spanner Graph |
---|---|
INT -> FLOAT |
지원됨 |
유형 변환 규칙에 대한 자세한 내용은 GoogleSQL의 변환 규칙을 참조하세요.
함수 및 표현식
그래프 함수와 표현식 외에도 Spanner Graph는 모든 GoogleSQL 기본 제공 함수와 표현식을 지원합니다.
함수 및 표현식의 전체 목록은 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 |
지원되지 않음 | ||
노드 및 에지 | .
|
. |
|
[]
|
지원되지 않음 | ||
표현식으로서의 패턴 | size(pattern) |
지원되지 않음 다음과 같이 하위 쿼리를 사용합니다.
|
속성 유형 함수 및 표현식
유형 | 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_SLICE 및 ARRAY_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 |
||
비교 연쇄
|
Spanner Graph는 비교 연쇄를 지원하지 않습니다. 이는 AND 와 연결되는 비교와 동일합니다. 예:
|
||
부울 | AND |
AND |
|
OR |
OR |
||
XOR |
Spanner Graph는 XOR 을 지원하지 않습니다. <> 를 사용하여 쿼리를 작성합니다.예를 들면 다음과 같습니다.
|
||
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_ARRAY 및 ARRAY_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}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
쿼리 결과로 노드 및 에지 만들기 |
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; |