기타/프로그래밍

[그래프 데이터베이스][무작정해보기] [3/30] 웹상의 CSV로 부터 Graph 생성하기

코드아키택트 2021. 1. 1. 18:53
반응형

예시데이터: 운송 그래프

 

데이터는 다음 위치에서 확인 할 수 있습니다.

https://resources.oreilly.com/examples/0636920233145/tree/master/data

 

data · master · examples / Graph Algorithms

O'Reilly Resources

resources.oreilly.com

github.com/neo4j-graph-analytics/book/tree/master/data

 

neo4j-graph-analytics/book

Contribute to neo4j-graph-analytics/book development by creating an account on GitHub.

github.com

 

둘다 같은 데이터를 사용하지만, 책의 예제에선 아래의 링크에서 데이터를 받아옵니다. 따라서 문제가 생길 시, 아래의 링크에 제대로된 파일이 있는지 확인해보는게 첫번째가 될 것입니다.



데이터 확인해보기

위 데이터는 Graph Algorithm을 구현하기 위해 쓰입니다. 아무것도 모르고 쓰면 정말 아무것도 모르니 간략히 데이터를 확인해 보겠습니다.

 

 transport-node.csv는 각 운송 지점의 데이터를 가지고 있습니다.

id,latitude,longitude,population
"Amsterdam",52.379189,4.899431,821752
"Utrecht",52.092876,5.104480,334176
"Den Haag",52.078663,4.288788,514861
"Immingham",53.61239,-0.22219,9642
"Doncaster",53.52285,-1.13116,302400
"Hoek van Holland",51.9775,4.13333,9382
"Felixstowe",51.96375,1.3511,23689
"Ipswich",52.05917,1.15545,133384
"Colchester",51.88921,0.90421,104390
"London",51.509865,-0.118092,8787892
"Rotterdam",51.9225,4.47917,623652
"Gouda",52.01667,4.70833,70939

위의 데이터 구조를 보면 id(지역명),latitude(위도), longitude(경도), population(인구수)로 이루어진 것을 볼 수 있습니다.

 암스테르담을 예로 들면

  • Amsterdam(id)
  • 52.379189(latitude)
  • 4.899431(longitude)
  • 821752 (population)

으로 이루어져 있습니다.

 

다음은 transport-relationships.csv입니다. 이름에서도 볼 수 있듯이, 관계를 표현하고 있습니다.

src,dst,relationship,cost 
"Amsterdam","Utrecht","EROAD",46 
"Amsterdam","Den Haag","EROAD",59 
"Den Haag","Rotterdam","EROAD",26 
"Amsterdam","Immingham","EROAD",369 
"Immingham","Doncaster","EROAD",74 
"Doncaster","London","EROAD",277 
"Hoek van Holland","Den Haag","EROAD",27 
"Felixstowe","Hoek van Holland","EROAD",207 
"Ipswich","Felixstowe","EROAD",22 
"Colchester","Ipswich","EROAD",32 
"London","Colchester","EROAD",106 
"Gouda","Rotterdam","EROAD",25 
"Gouda","Utrecht","EROAD",35 
"Den Haag","Gouda","EROAD",32 
"Hoek van Holland","Rotterdam","EROAD",33

이 데이터는 src(Source,시작점),dst(Destination,도착점),relationship(관계,유럽 도로망),cost(비용, 여기선거리)로 이루어져 있습니다. EROADEuropean road를 의미하며 유럽 도로망정도로 해석하면 되겠습니다1

 


데이터 베이스 실행하기

데이터 베이스 콘솔을 띄우기 까지 과정.

 Neo4j에서 데이터 베이스 콘솔을 띄우기 위해선 몇가지 단계를 거쳐야 합니다. 그리 어렵지 않습니다.

순서는

  1. 원하는 데이터베이스에서 Start를 누른다.
  2. 기다린다
  3. Open을 누른다.

이렇게 콘솔을 띄울 수 있습니다.


데이터 베이스 선택하기 및 새로 만들기

 우리는 이미 데이터 베이스 안에 있지만, 또다시 데이터 베이스를 만듭니다. 이렇게 시스템이 설계된 이유는 아직 모르겠습니다. 추후에 예제에서 서로간 연결하는게 나올 것 같습니다. 우선 데이터 베이스를 이동해보겠습니다.

데이터 베이스 이동은 커맨드 입력 또는 클릭으로 할 수 있습니다.

 데이터 베이스는 본인이 작업을 할 영역이라고 보면 될 것 같습니다. 기존 RDBMS로 본다면 테이블에 가까워 보입니다. 작업을 하기전에 반드시 데이터베이스를 제대로 선택했는지 확인하고 진행하도록 합시다. 데이터 베이스를 이동하는 방법은 크게 두가지로, 하나는 커맨드를 입력하는 방식이고, 나머지는 마우스를 선택하는 것입니다.

 커맨드 입력의 기본 구문은 아래와 같습니다.

:use 데이터베이스이름

데이터 베이스 만들기 및 이동

다음과 같이 입력해 줍시다.

CREATE DATABASE chapter4

명령어 입력 및 결과

위의 명령어를 입력하면 다음과 같이 새로운 데이터 베이스가 생성됩니다. 이제 이동해보도록 합시다

:use chapter4

 

이 과정을 거쳐 데이터 베이스를 생성 하였습니다.

 


데이터 가져오기

 

 데이터 가져오기는 두단계 입니다. 첫째로, Node 들의 데이터를 가져오고 그 후 Relation정보를 가져 옵니다. 데이터베이스 위치를 꼭 확인하도록 합시다.

 

노드 정보 가져오기

WITH "https://github.com/neo4j-graph-analytics/book/raw/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.longitude),
 place.population = toInteger(row.population);

다음과 같이 노드와 Key들이 추가된 것을 볼 수 있음.

데이터를 한번 확인해 봅시다.

 

왼쪽의 *을 클릭하면 모든 데이터를 볼 수 있음.

위의 transport-nodes.csv 에서 암스테르담에 대한 데이터 값은 다음과 같았습니다.

id,latitude,longitude,population 
"Amsterdam",52.379189,4.899431,821752 

둘을 비교해 봤을때 데이터 값이 같으므로 데이터가 잘 들어왔음을 알 수 있습니다. 앞장에서 설명이 나왔듯이, Graph란 관계입니다. 고로 우리는 관계 정보를 가져와 봅시다.

 

관계정보 가져오기.

코드는 아래와 같습니다.

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);

EROAD가 추가된 것을 볼 수 있음.

위의 코드가 정상적으로 실행됬다면, EROAD라는 관계가 추가되어야 합니다. 그리고 다시한번 데이터를 확인해 봅시다.

 

이미지를 최대화 한 후, 하나의 Relationship만 확인해봅니다.

 

역시나 앞의 데이터와 비교해보면 

src,dst,relationship,cost 
"Amsterdam","Utrecht","EROAD",46 

두 데이터가 일치하는 것을 볼 수 있습니다.

 

끝맺으며

오늘 해본내용은 CSV파일을 인터넷에서 가져와서 데이터베이스를 생성하기 위한 과정을 해보았습니다. 하면서 궁금해지는 점은 다음과 같은 것들이 있습니다.

  • 계속해서 업데이트 되는 CSV에 대해선 어떻게 할 수 있을까?
  • 다른 방식으로도 CSV파일을 가져오던데 그건 어떻게 할까?
  • DB 안에 DB가 또 있던데 이것은 어떻게 이해해야 하는가? RDBMS의 Table과 같은 개념으로 이해해야 하는가?

오늘은 여기까지 입니다. 좀더 잘 알아서 많은 내용을 공유했으면 좋겠는데 그렇지 못해 아쉽네요.

 


  1. International E-road Network ↩︎

반응형