코드짜는 노인네

[Neo4j] 노드, 관계를 찾기 위한 Match 쿼리문 (Feat. Cypher) 본문

코딩 학습/Neo4j

[Neo4j] 노드, 관계를 찾기 위한 Match 쿼리문 (Feat. Cypher)

ikohong 2022. 9. 9. 18:16
728x90
반응형

[Neo4j] 노드, 관계를 찾기 위한 Match 쿼리문 (Feat. Cypher)


MySQL 쿼리문에는 Select가 있다면, Cypher 쿼리문에는 Match라는 쿼리문을 가지고 있습니다. 이 명령어는 다양한 용도로 사용하게 되는데요. 조회도 가능하지만, 다른 노드와 관계 매핑을 하기전에 필요로 하는 명령어가 될 수도 있습니다. 어떤 용도로 사용되는지 알아보겠습니다.


MATCH~ return ~


match (n) return n

가장 기본적이고, 아주 간단한 쿼리문입니다. 코드안의 'n'은 변수이지만, 그 변수에 무슨 레이블을 넣을지를 선택하지 않은것입니다. 그런데, 이렇게 하면, 개발자가 레이블을 지정하지 않았기 때문에, 모든 레이블이 이 변수안에 지정된다고 보면 됩니다. 그리고 return n을 하면, 현재 DB에 저장되어있는 모든 노드를 가지고 옵니다. 결과를 보면 다음과 같습니다.

사진을 보면, 다양한 레이블이 포함되어있는 노드들이 보이는걸 확인할 수 있습니다.

참고로 이것보다 많은 노드를 생성했는데, 노드다 전부 안보이는 경우가 있습니다. 아무래도 그래픽이다보니, 너무 많은 노드와 관계를 불러오면, 렉 걸리는 현생이 있어서 불러오는 갯수를 제한해놓았습니다.

노드를 더 불러오고 싶다면, 왼쪽 하단에 '톱니바퀴' 모양의 버튼을 눌러서 'Graph Visualization'에서 'Initial Node Display'의 숫자를 변경하면, 원하는 만큼의 노드를 볼 수 있습니다.
반응형

MATCH (변수:레이블) ~ return 변수


이번 코드는 노드와 노드간의 관계가 되어있는지 확인할 수 있는 방법입니다.

match (k:Keyword) return k

Keyword라는 레이블을 포함하고 있는 모든 노드를 가져옵니다. Graph를 보면, 노드간의 관계까지 보이지만, Text를 보면, 다르게 보일껍니다.

변수 k에는 Keyword 레이블의 노드들을 가져와서 보여주고 있는 모습입니다. 즉, 2개의 노드는 관계를 맺고있기 때문에, Graph에서는 관계까지 가져온거 같아보이지만, 결과는 노드만 가져온 모습을 볼 수 있습니다. 그렇다면, 모든 값을 가져오기 위한 코드는 어떻게 작성을 해야될까요?

match (k:Keyword)-[r:related]-(relK:Keyword) return k, r, relK

위의 코드와 같이, '(변수:레이블명)-[변수:관계타입]-(변수:레이블) return 변수,변수,변수' 형식으로 작성을 해주시면, 모든 결과를 가져올수 있습니다. 여기서 조금 자세히 들어가보겠습니다.

위의 노드의 생성 코드는 다음과 같습니다.

create (k:Keyword {value:"키워드"})-[r:related {weight:1}]->(relk:Keyword {value:"관계키워드"})

화살표 방향을 보면, '키워드'라는 속성을 가진 노드가 '관계키워드'라는 속성을 가진 노드의 방향으로 관계를 맺고 있습니다. 그런데, 위의 사진의 왼쪽을 보면 'Table'과 'Text'를 보면, 다음과 같이 나옵니다.

분명 Graph에서는 결과가 1개 나왔지만, Text에서는 결과가 2개 나온 모습을 확인할 수 있습니다. 다시 match 코드를 보면, create랑 다르게, 화살표가 코드에 없는 모습을 볼 수 있습니다. 그렇기 때문에, 'k'라는 변수에는 2개의 결과값을 가져올수 있다는걸 확인할 수 있습니다. 

match (k:Keyword)-[r:related]->(relK:Keyword) return k,r,relK

위의 코드와 같이 방향이 있을 경우에는 하나의 결과만을 받아오는걸 확인할 수 있습니다.


MATCH (변수:레이블 {속성:속성값}) ~ return 변수


모든 레이블을 다 가져올수는 없습니다. 레이블중에서도 특정값을 가져오고 싶은 경우가 있습니다. 이럴경우에는, 아래의 코드와 같이 작성을 해주시면 됩니다.

match (k:Keyword {value:"키워드"}) return k

'Keyword'라는 레이블에 속성인 'value'에 값인 '키워드'에 대한 노드만을 가져오게 됩니다. 특정 노드만을 가져오고 싶다면, 위의 코드같이 작성을 해주시면 되며, 키워드, 관계 관계노드 모두에 조건을 작성하여, 값을 가져올수도 있습니다.

match (k:Keyword {value:"키워드"})-[r:related {weight:1}]->(relk:Keyword {value:"관계키워드"}) return k,r,relk

참고로 아래의 코드같이 작성을 하면, 결과가 나오지 않게 됩니다.

match (k:Keyword {value:"관계키워드"})-[r:related {weight:1}]->(relk:Keyword {value:"키워드"}) return k,r,relk

노드를 생성할때, 반대 방향으로 매핑을 했기 때문에, 결과를 볼 수 없습니다. 단, 조회를 할 경우, 화살표를 적용하지 않는다면, 관계방향과 상관없이 결과가 나오게됩니다.

match (k:Keyword {value:"관계키워드"})-[r:related {weight:1}]-(relk:Keyword {value:"키워드"}) return k,r,relk

728x90
반응형
Comments