이전에 다뤘던 주제인지 기억이 나지 않는다. 아무튼 일단 이야기해봐야지
데이터 구조 이해하기
https://github.com/neo4j-graph-analytics/book/tree/master/data
위의 링크로 들어가면 transport-nodes.csv 라는 파일과, transport-relationships.csv 라는 파일이 존재한다. 즉 node와 edge다. 여기서 유의할점은 node를 먼저 만든 후 edge(relation)을 만든다는 것이다.
neo4j에 오려면 정확한 uri가 필요하다. 이때 uri는 raw 데이터의 uri를 뜻한다. 따라서, csv를 클릭하고 다시 raw를 누를떄 나오는 uri를 가져오면 된다
2022.07.05 기준 위 데이터의 raw 데이터의 uri는 아래와 같다
https://raw.githubusercontent.com/neo4j-graph-analytics/book/master/data/transport-nodes.csv
마찬가지 방법으로 edge의 uri도 미리 적어 놓는다
https://raw.githubusercontent.com/neo4j-graph-analytics/book/master/data/transport-relationships.csv
Import Cypher문 구성
책에 나온 내용 그대로 적는다.
Node 만들기
WITH "https://raw.githubusercontent.com/neo4j-graph-analytics/book/master/data/" AS base WITH base + "transport-nodes.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MERGE (place:Place {id:row.id})
SET place.latitude = toFloat(row.latitude), place.longitude = toFloat(row.latitude), place.population = toInteger(row.population)
위에 나온것 중 짚어볼 만한 것들만 이야기해본다. 물론 나도 100%알지는 않지만
WITH ~ AS -
~에 해당하는 것을 - 으로 치환해서 취급하는 것. 일종의 변수를 지정하는것과 비슷하게 볼 수 있을 듯 하다
위에선 base를 만들고 거기에 해당하는 csv 이름을 붙여 uri를 구성할떄 쓰이고 있다(1번째줄)
LOAD CSV WITH HEADERS FROM uri AS row
~ 로 부터 CSV를 읽어 - 으로 표현한다로 보면 될 것 같다. 여기선 header가 있기 때문에 WITH HEADERS라는 이름이 붙었다. 파이썬 판다스로 본다면 데이터 프레임처럼 불러왔다고 보면 될것같다.
MERGE (place:Place {id:row.id})
node를 만드는 명령어는 두가지가 있다. MERGE의 경우 같은 id를 가진 노드가 있다면 중복 생성하지 않도록 하는 명령어다. 노드를 생성하고 다시 쓰이기 위해 place라는 변수에 Place(라벨)노드를 할당한게 첫단계다. 중괄호 안에는 노드의 id를 만드는 것으로, 원본 데이터의 id컬럼의 값을 읽어와 할당하고 있다.
SET place.latitude = toFloat(row.latitude),
place.longitude = toFloat(row.latitude),
place.population = toInteger(row.population)
앞에서 할당한 place를 뒤에서 사용하는 모습. merge를 이용해 생성하는 순간에는 id 만 생긴다. 여기 SET을 이용해 다른 속성정보들을 추가할 수 있다. 위는 각각 위도,경도, 인구를 추가하는 모습이다. 오른쪽에 toFloat 등을 볼 수 있다. 이건 csv에서 들어온 데이터의 속성을 좀더 확실하게 표시하기 위한 용도로 보인다. 즉 float을 이용해서 더 높은 자리수 표현이 가능한 것.
Edge 만들기
WITH "https://github.com/neo4j-graph-analytics/book/raw/master/data/" AS base WITH base + "transport-relationships.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MATCH (origin:Place {id: row.src})
MATCH (destination:Place {id: row.dst})
MERGE (origin)-[:EROAD {distance: toInteger(row.cost)}]->(destination)
MATCH (origin:Place {id: row.src})
MATCH (destination:Place {id: row.dst})
edge를 만들기 위해선 양끝단 노드가 필요하다. MATCH를 이용해서 csv를 기반으로 해당 node를 찾고 있다.
MERGE (origin)-[:EROAD {distance: toInteger(row.cost)}]->(destination)
node를 만들때와 마찬가지로 MERGE를 사용하고 있다. 그래프를 만드는 기본 패턴은 ()-[]->()가 되는데 여기에 각각 대응되는 값을 넣었다고 보면된다. 즉 첫 ()에 시작 노드 []에는 edge를 넣는다. 이떄 :EROAD에서 볼 수 있듯이 edge의 라벨도 만들 수 있다. 예제에서 EROAD의 뜻은 유럽 도로다.
결과
최종적으로 위와같은 그림을 보게 된다면 성공. 노드위에 다른 숫자가 써있을 수 있는데, Node labels라고 써있는 부분을 눌러서 변경할 수 있다.
끝!
'2022 > GraphDB(neo4j)' 카테고리의 다른 글
[neo4j] Minimum Spanning Tree 사용하기 (0) | 2022.07.06 |
---|