LOAD FROM#

보통 테이블이나 뷰를 Cypher 파이프라인으로 읽어 들이며, 테이블의 행 하나마다 작업 행 하나를 만듭니다.

개요#

LOAD FROM table_name AS alias

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

설명#

LOAD FROM은 관계형 데이터를 공급하는 절입니다. 테이블을 스캔해 각 행을 alias에 바인딩하고, 그 뒤 파이프라인의 어디서든 그 컬럼을 alias.column으로 읽을 수 있게 합니다. 그래프와 테이블이 같은 데이터베이스에 있으므로 가져오기 단계도, 외부 데이터 래퍼도 필요하지 않습니다.

  • 별칭의 컬럼은 자기 SQL 타입을 유지합니다. numeric(3,1) 컬럼에 대한 r.score는 numeric이므로, r.score > 8.5는 jsonb 비교가 아니라 numeric 비교입니다.

  • 별칭 자체는 행 값입니다. 그것을 투영하면 행이 jsonb 객체로 나오므로 CREATE (:label = to_jsonb(alias))는 행 전체를 적재하는 것이 됩니다.

  • LOAD FROM은 쿼리를 시작할 수도, 다른 절 뒤에 올 수도 있으며, 한 쿼리에 여러 개가 나올 수도 있습니다. 쿼리를 끝내지는 않습니다.

  • 이 절에는 자기 WHERE가 없습니다. 뒤따르는 MATCH의 WHERE, WITH의 WHERE, 또는 FILTER로 걸러 내십시오.

  • SELECT가 읽을 수 있는 것이면 무엇이든 됩니다. 테이블, 뷰, 스키마로 수식한 이름이 그렇습니다.

매개변수#

table_name

읽을 테이블이나 뷰의 이름이며, 스키마로 수식할 수도 있습니다. 존재하고 읽을 수 있어야 합니다. 알 수 없는 이름은 relation "..." does not exist를 냅니다.

alias

각 행에 바인딩되는 이름입니다. 컬럼은 alias.column으로, 행 전체는 alias로 읽습니다.

예제#

모든 예제는 예제 데이터셋에서 실행되며, 그 데이터셋에는 보통 테이블 rating이 포함돼 있습니다.

테이블 읽기#

LOAD FROM rating AS r
RETURN r.title AS title, r.source AS source, r.score AS score
ORDER BY title, source
LIMIT 4;
        title        |  source   | score
---------------------+-----------+-------
 "Avatar"            | "critics" | 7.9
 "Blade Runner"      | "critics" | 8.1
 "Blade Runner 2049" | "critics" | 8.0
 "Elysium"           | "critics" | 6.6
(4 rows)

값에 따옴표가 붙은 것은 컬럼이 jsonb이기 때문이 아니라, Cypher의 RETURN이 출력 컬럼을 jsonb로 감싸기 때문입니다. 그 SQL 타입은 그대로입니다:

LOAD FROM rating AS r RETURN pg_typeof(r.score) AS t LIMIT 1;
     t
-----------
 "numeric"
(1 row)

테이블을 그래프와 조인하기#

테이블을 적재하고 그것에 대해 일치시킵니다. 관계형 컬럼과 그래프 속성이 곧바로 비교됩니다:

LOAD FROM rating AS r
MATCH (m:movie {title: r.title})
WHERE r.source = 'critics' AND r.score > 8.5
RETURN m.title AS film, m.year AS year, r.score AS score
ORDER BY score DESC;
             film             | year | score
------------------------------+------+-------
 "Inception"                  | 2010 | 8.8
 "The Matrix"                 | 1999 | 8.7
 "Interstellar"               | 2014 | 8.7
 "Terminator 2: Judgment Day" | 1991 | 8.6
(4 rows)

행 전체 읽기#

별칭 자체를 투영하면 그 행을 맵으로 얻습니다:

LOAD FROM rating AS r RETURN r LIMIT 2;
                              r
-------------------------------------------------------------
 {"score": 8.7, "title": "The Matrix", "source": "critics"}
 {"score": 9.1, "title": "The Matrix", "source": "audience"}
(2 rows)

뷰 읽기#

SELECT가 읽을 수 있는 관계면 무엇이든 유효한 원천입니다:

CREATE VIEW critic AS SELECT title, score FROM rating WHERE source = 'critics';
CREATE VIEW
LOAD FROM critic AS c
RETURN c.title AS film, c.score AS score
ORDER BY score DESC
LIMIT 3;
      film      | score
----------------+-------
 "Inception"    | 8.8
 "Interstellar" | 8.7
 "The Matrix"   | 8.7
(3 rows)
DROP VIEW critic;
DROP VIEW

테이블 행으로 정점 만들기#

원하는 속성을 이름으로 적으십시오:

CREATE TABLE tmp_people (name text, born int);
INSERT INTO tmp_people VALUES ('Ana Lily Amirpour', 1980), ('Rian Johnson', 1973);
CREATE TABLE
INSERT 0 2
LOAD FROM tmp_people AS t
CREATE (:person {name: t.name, born: t.born});
UPDATE 2

또는 맵 리터럴 대신 = expression을 써서 행 전체를 속성 맵으로 삼으십시오:

LOAD FROM tmp_people AS t
CREATE (:person = to_jsonb(t));
UPDATE 2

두 적재를 되돌리고 그 테이블을 지웁니다:

MATCH (p:person) WHERE p.name IN ['Ana Lily Amirpour', 'Rian Johnson'] DETACH DELETE p;
UPDATE 4
DROP TABLE tmp_people;
DROP TABLE

참고#

LOAD FROM은 읽습니다. 자체 대량 적재 장치도, 병렬 기록기도, 오류 우회 경로도 없습니다. 그 뒤에 오는 CREATE가 그래프 쓰기 경로를 통해 행 단위로 삽입합니다. 큰 테이블을 적재하는 방법과 그것을 빠르게 만드는 인덱스·로깅 설정은 데이터 적재를 참고하십시오.

관련 항목#

  • CREATE — 적재한 행을 정점과 간선으로 바꾸는 절

  • MATCH — 적재한 행을 그래프와 조인하기

  • WITH — 적재한 행을 걸러 내고 집계하기

  • SQL과 Cypher 섞기 — 반대 방향, SQL 안의 Cypher 쿼리

  • 데이터 적재 — 실제 적재 가이드