Neo4j는 데이터를 그래프 관계로 표현한다.
약 '19년부터 관심을 받기 시작했고 시간이 갈수록 증가하는 것 같다.
특이한 사실은 중국에서 유독 많이 찾는다는것.
시각화화면 Gephi처럼 화사한 경향이 있다.
마침 오래간만에 Gephi를 실행했는데 새버전이 올라왔다는 메시지가 나타났다.
기억상 새버전은 몇년만인거 같은데...
그래프데이터는 향후 딥러닝에 사용될 것이라고들 한다. 오래전부터 이러한 이야기가 있었는데 아직 변화속도는 느린듯 하다. 하지만 노드와 링크 방식이 데이터 전처리도 줄어들고 바로 학습에 투입하기 좋은것 만큼은 사실일것 같다.
과거에 농장들을 방문하는 차량데이터를 학습하는 모델을 설계할때 각 농장별로 잠복기 농장을 방문한 차량들의 방문횟수, 키우는 종 등의 데이터가 들어가야 했다. 이러한 데이터는 노드와 링크형태이면 별도의 가공이 필요하지 않게 된다.
Neo4j 프로그램은 다음 사이트에 있다.
https://neo4j.com/cloud/platform/aura-graph-database/?ref=neo4j-home-hero
Neo4j Aura - Fully Managed Cloud Solution
Build apps with highly connected data and lightning-fast query performance.
neo4j.com
desktop을 설치해도 되는데 설치과정에서 오류가 발생한다.
차라리 서버에 붙어서 작업하는게 낫다
상단 우측의 neo4j guides를 들어가면 데이터를 다운 받을 수 있다. csv형태의 데이터를 DB로 변환하는 것은 run import로 가능하다.
샘플데이터로 northwind를 불러들인다.
northwind traders는 가상의 회사라고 한다. 이 데이터는 예전에 sql server 사용하면서 많이 보았었다. 그런데 실제 회사 데이터가 아니라는건 오늘 검색하다가 우연히 알게 되었다.
Neo4j가 사용하는 언어는 cypher라고 한다.
초능력자나 커피가 떠오르지만 무관하다.
sql과는 매우 유사한 문법구조를 지녔기에 문법만 확인해보면 쉽게 사용할 수 있다.
select가 match로 변경된다.
예를 들어 select * from product는 match (n:Product) return n;
match를 select로 받아들이면 된다.
n:Product에서 n은 얼라이어스처럼 어떤 문자를 사용해도 상관없다. 단 return은 n이어야 한다.
where 조건은 {}를 사용한다. match (p:Product{productName:'Chai'}) return p;
집계함수는 return에서 사용한다. match (p:Product) return count(p) as productCount;
limit, top n 조건도 return에서 표현하면 된다. match (p:Product) return p limit 10;
order by 도 마찬가지로 활용가능하다. match (p:Product) return p.productName, p.unitPrice order by p.unitPrice desc limit 10;
in 조건은 where로 표현한다. match (p:Product) where p.productName in ['Chocolade', 'Chai'] return p.productName, p.unitPrice
like문은 starts with로... s를 빼먹으면 안된다. match (p:Product) where p.productName starts with 'C' and p.unitPrice > 100 return p.productName, p.unitPrice
방향성을 따지지 않는 경우 -[]-로 찾을 수 있다. match (s:Supplier)-[]-(p:Product) return s, p;
supplier와 관계가 있는 product 전체를 찾아준다.
return에서 p, o와 같이 얼라이어스를 사용하면 전체를 찾아준다. match (p:Product)-[]-(o:Order) return p, o;
collect도 사용할 수 있다. MATCH (s:Supplier)-->(:Product)-->(c:Category) RETURN s.companyName as Company, collect(distinct c.categoryName) as Categories;
노드간의 방향성에 포함되는 결과만을 선택할 수도 있다.
collect와 노드 방향성을 함께 고려할 수도 있다. match (s:Supplier) --> (:Product) --> (c:Category) return s.companyName, collect(distinct c.categoryName)
where 조건을 포함한 방향성을 고려하려면... match (c:Category{categoryName:'Produce'}) <-- (:Product) <--(s:Supplier) return distinct s.companyName
map이나 분석함수들이 어떻게 표현되는지는 확인해보지 않았으나 대부분의 sql을 대체하는 명령이 가능할 듯.
몇년전에 샀었던 교재에는 위의 예시보다 복잡한 명령들도 있었던 것 같다.