ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Neo4j Cypher 기본구문(Create, Match, Merge 절)
    Data & ML & AI/GraphDB(Neo4j) 2022. 6. 9. 21:06
    반응형

    Create a Node

    SQL에서는 테이블을 생성할 때 Create를 사용한다면
    Cyper에서는 노드를 생성할 때 Create를 사용합니다.

    Create (p:Person {name: 'John Doe'}) RETURN p
    Create (p:Person {name: 'John Doe'}) // 이 경우 return이 없으므로 결과를 보여주지 않음

     

    Finding Nodes

    Match를 통해 노드 및 관계를 찾으며, 이때 속성을 이용하거나 where을 활용해 조건을 설정할 수 있습니다.

    // 동일한 결과를 나타내는 두 쿼리
    Match (p:Person {name: 'Tom Hanks'}) RETURN p
    MATCH (p:Person) where p.name = "Tom Hanks" RETURN p
    
    이름이 "Tom Hanks"라는 사람노드만 return하라고 명령하였으니 노드 하나만 덜렁 나타났습니다.

     

    Merge Clause

    Merge 절은 다음의 두 경우에 주로 사용할 수 있습니다.

    • 이미 존재하는 노드를 match하여 그 결과와 bind할 때
    • 새로운 노드를 create하고 그 노드와 bind할 때
    MERGE (m:movie {title: 'Greyhound'})                              //1 
    ON MATCH SET m.lastUpdatedAt = timestamp()                        //2
    ON CREATE SET m.released = "2020", m.lastUpdatedAt = timestamp()  //3
    Return m                                                          //4
    
    1. "Greyhound"라는 제목을 가진 영화노드
    2. 그 노드를 match할 수 있다면 업데이트일자를 지금으로 수정
    3. 노드가 없다면 새로 create하고 개봉연도를 2020년으로, 업데이트일자를 지금으로 수정

     

    Create a Relationship

    SQL에서와 달리, Cypher에서는 Match절과 Create절을 연속적으로 사용할 수 있습니다.
    이 점을 이용해 원하는 노드에서만 관계를 쉽게 설정할 수 있습니다.

    MATCH (p:Person), (m:Movie)
    WHERE p.name = "Tom Hanks" and m.title = "Cloud Atlas"
    CREATE (p)-[w:WATCHED]->(m)
    RETURN type(w)

    관계가 잘 생성되었는지 확인해 보겠습니다.

    MATCH (p:Person)-[w:WATCHED]-(m:Movie)
    WHERE p.name = "Tom Hanks"
    RETURN p,m,w

    WATCHED 관계가 잘 만들어졌습니다.

     

    Advanced Cypher queries

    1) Finding who directed Cloud Atlas movie

    (m:"클라우드 아틀라스"영화) <- [d:를 감독한] - (p:사람)

    MATCH (m:Movie {title: "Cloud Atlas"})<-[d:DIRECTED]-(p:Person) return p.name

    p.name 대신 p를 return하면 그래프 노드가 출력됩니다.

     

    2) Finding all people who have co-acted with Tom Hanks in any movie

    (tom:"톰 행크스"가) - [:출연한] -> (m:영화에서) <- [:출연한] - (p:다른 사람들)

    MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p:Person) return p,m,tom

     

    3) Finding all people related to the movie Cloud Atlas in any way

    (p:사람들) - [어떻게든 연관된] - (m: "클라우드 아틀라스"영화와)

    MATCH (p:Person)-[relatedTo]-(m:Movie {title: "Cloud Atlas"}) return p.name, type(relatedTo) as related

    여기서 relatedTo는 어떤 글자로든 바꿀 수 있는 별칭입니다.

     

     

    4) Finding Movies and Actors that are 3 hops away from Kevin Bacon.

    (p:"케빈 베이컨"과) - [거리가 1~3인] - (모든 노드들)

    MATCH (p:Person {name: "Kevin Bacon"})-[*1..3]-(hollywood) return DISTINCT p, hollywood


    Distinct: Table 형식으로 볼 때 동일한 노드, 관계 등에 대한 중복출력 방지(그래프형식으로 볼 때는 똑같은 결과)

     

     

    참고

    https://sandbox.neo4j.com/  (Movies Project Tutorial을 진행해 볼 수 있습니다.)

    반응형

    댓글

Designed by Tistory.