AG Cypher_Query_[생성, 조회, WITH]

Ja L·2023년 3월 22일
0

GDB

목록 보기
2/2

Property
Vertices와 Edges 모두 Properties를 가질 수 있다. Property 값으로 사용가능한 데이터 타입은 아래와 같다
- Numeric 타입
- String 타입
- Boolean 타입
- List 타입 (집합객체)


Graph DDL

  • Create graph
CREATE GRAPH는 그래프를 생성하는 명령이다. 해당 명령과 함께 생성할 그래프의 이름을 함께 명시하여 사용한다. graph_path는 현재 다룰 그래프를 의미하는 변수이다. 다루고자 하는 그래프의 이름을 SET을 사용하여 설정한다.
CREATE GRAPH graphName;
Set graph_path = graphName;
  • Create Labels
CREATE VLABEL은 vlabel을, CREATE ELABEL은 elabel을 생성하는 명령이다. 각 명령은 생성할 vlabel 혹은 elabel의 이름을 함께 명시하여 사용한다. inherits ()는 다른 label을 상속하는 명령이다. Label을 생성할 때 자식 label 이름 뒤 에 해당 해당 키워드와 함께 부모label의 이름을 명시하면 다른 label을 상속할 수 있다. 상속의 대상으로 부모 label은 여러 개가 될 수 있다.

CREATE VLABEL vlabelName;
CREATE ELABEL elabelName;
CREATE VLABEL childVlabelName inherits (parentVlabelName);
CREATE ELABEL childElabelName inherits (parentElabelName1,parentElabelName2);

  • Create vertices and edges
CREATE절은 vertex와 edge를 생성하는 명령이다. 해당 명령은 생성할 vertex 혹은 edge를 pattern으로 올바르게 작성하여 사용한다.

CREATE (:person {name: 'Jack'});
CREATE (:person {name: 'Emily'})-[:knows]->(:person {name: 'Tom'});


Pattern

  • Path

    Pattern 내에서 vertex와 edge의 개수는 지속적으로 증가할 수 있다. Pattern 내 일련 경로의 단위를 path라고 한다.

    길이가 긴 path의 경우, 가독성을 높이고 작성의 편의성을 위해서 축약된 형태로 바꿔 작성할 수 있다. Vertex n개가 edge를 n-1번 거쳐서 간다면 대괄호 내에 별표(*)와 함께 n-1을 표기하면 된다.

    (a)-[]->( )-[]->(c) 
    (a)-[*2]->(c) 
    
    (a)-[]->( )-[]->( )-[]->(d) 
    (a)-[*3]->(d) 
    
    (a)-[]->( )-[]->( )-[]->( )-[]->(e) 
    (a)-[*4]->(e) 
  • Flexible Length
만약 path의 길이에 동적인 변화를 주고자 한다면 ..를 표기하면 된다. 아래 예제는 차례대로 edge의 개수를 2개 이상 지닌 path, 7개 이하 지닌 path, 3개 이상 5개 이하 지닌 path, 무한정 길이의 path를 뜻한다.
(a)-[*2..]->(b) 
(a)-[*..7]->(b) 
(a)-[*3..5]->(b) 
(a)-[*]->(b) 

General Clauses
1. RETURN

  • Vertex Return
    MATCH (j {name: 'Jack'})
    RETURN j ;

  • Edge Return
    MATCH (j {name: 'Jack'})-[k:Knows]->(e)
    RETURN k ;


  • Property Return
    MATCH (j {name: 'Jack'})
    RETURN j.age ;


  • All Return

    MATCH (j {name: 'Jack'})


  • Path Return

    MATCH p=(j {name: 'Jack'})-[k:knows]->(e)
    RETURN p;

WITH

첫 번째 질의는 Jack과 ’누군가’가 공통으로 알고있는 지인들이 몇명인지를 그 ’누군가’와 함께 반환한다. 두 번째 질의는 첫 번째 질의와 연관지어 생각하면 공통의 지인 수가 1명보다 많은 경우에 해당되는 ’누군가’를 반환하는 질의임을 알 수 있다. 두 번째 질의는 단독으로 실행될 수 없으며, 첫 번째 질의와 조합을 이루어야 두 번째 질의가 의미가 생기는데 두 질의를 이어주는 역할을 WITH절이 한다.

세 번째 질의는 첫 번째, 두 번째 질의를 연결시켜 주는 WITH절을 포함한 질의이다. 첫 번째 질의의 반환되는 결과들을 variable, alias 형태로 붙잡아두고 있다가 두 번째 질의로 그 결과들을 넘겨준다. 이러한 경우처럼 여러 질의들을 연결하고 선행 질의의 output이 후행 질의의 input으로 사용되는 때에는 WITH절로 연결시키면 된다. WITH절에서는 variable이나 alias형태로 붙잡고 있어야 한다.

  1. MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
    RETURN other, count(common);


  1. WHERE count(common) > 1
    RETURN other;


  1. MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
    WITH other, count(common) AS cnt
    WHERE cnt > 1
    RETURN other;
profile
DB Engineer

0개의 댓글